flexget.plugins.module_include
Covered: 17 lines
Missed: 24 lines
Skipped 16 lines
Percent: 41 %
 1
import logging
 2
from flexget.plugin import *
 4
log = logging.getLogger('include')
 7
class PluginInclude(object):
 8
    """
 9
    Include configuration from another yaml file.
11
    Example:
13
    include: series.yml
15
    File content must be valid for a feed configuration
16
    """
18
    def validator(self):
19
        from flexget import validator
20
        root = validator.factory()
21
        root.accept('text') # TODO: file
22
        bundle = root.accept('list')
23
        bundle.accept('text')
24
        return root
26
    def get_config(self, feed):
27
        config = feed.config.get('include', None)
29
        if isinstance(config, basestring):
30
            config = [config]
31
        return config
33
    @priority(254)
34
    def on_process_start(self, feed):
35
        if not 'include' in feed.config:
36
            return
38
        import yaml
39
        import os
41
        files = self.get_config(feed)
43
        for name in files:
44
            name = os.path.expanduser(name)
45
            if not os.path.isabs(name):
46
                name = os.path.join(feed.manager.config_base, name)
47
            include = yaml.load(file(name))
48
            log.debug('Merging %s into feed %s' % (name, feed.name))
50
            from flexget.utils.tools import MergeException, merge_dict_from_to
51
            try:
52
                merge_dict_from_to(include, feed.config)
53
            except MergeException:
54
                raise PluginError('Failed to merge include file to feed %s, incompatible datatypes' % (feed.name))
56
register_plugin(PluginInclude, 'include', builtin=True)