Source code for flexget.plugins.operate.include
from pathlib import Path
import yaml
from loguru import logger
from flexget import plugin
from flexget.config_schema import one_or_more, process_config
from flexget.event import event
from flexget.utils.tools import MergeException
plugin_name = 'include'
logger = logger.bind(name=plugin_name)
[docs]
class PluginInclude:
"""Include configuration from another yaml file.
Example::
include: series.yml
File content must be valid for a task configuration
"""
schema = one_or_more({'type': 'string'})
[docs]
@plugin.priority(256)
def on_task_prepare(self, task, config):
if not config:
return
files = config
if isinstance(config, str):
files = [config]
for file_name in files:
file = Path(file_name).expanduser()
if not file.is_absolute():
file = task.manager.config_base / file
with file.open(encoding='utf-8') as inc_file:
include = yaml.safe_load(inc_file)
inc_file.flush()
errors = process_config(include, plugin.plugin_schemas(interface='task'))
if errors:
logger.error('Included file {} has invalid config:', file)
for error in errors:
logger.error('[{}] {}', error.json_pointer, error.message)
task.abort(f'Invalid config in included file {file}')
logger.debug('Merging {} into task {}', file, task.name)
# merge
try:
task.merge_config(include)
except MergeException:
raise plugin.PluginError(
f'Failed to merge include file to task {task.name}, incompatible datatypes'
)
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(PluginInclude, 'include', api_ver=2, builtin=True)