def get_plugin_info( attrs_to_dump: Optional[Iterable[str]] = None) -> List[Dict[str, Any]]: """ Dump plugins attributes :param attrs_to_dump: A list of plugin attributes to dump """ ensure_plugins_loaded() integrate_executor_plugins() integrate_macros_plugins() initialize_web_ui_plugins() initialize_extra_operators_links_plugins() if not attrs_to_dump: attrs_to_dump = PLUGINS_ATTRIBUTES_TO_DUMP plugins_info = [] if plugins: for plugin in plugins: info: Dict[str, Any] = {"name": plugin.name} for attr in attrs_to_dump: if attr in ('global_operator_extra_links', 'operator_extra_links'): info[attr] = [ f'<{as_importable_string(d.__class__)} object>' for d in getattr(plugin, attr) ] elif attr in ('macros', 'timetables', 'hooks', 'executors'): info[attr] = [ as_importable_string(d) for d in getattr(plugin, attr) ] elif attr == 'listeners': # listeners are always modules info[attr] = [d.__name__ for d in getattr(plugin, attr)] elif attr == 'appbuilder_views': info[attr] = [{ **d, 'view': as_importable_string(d['view'].__class__) if 'view' in d else None } for d in getattr(plugin, attr)] elif attr == 'flask_blueprints': info[attr] = [ (f"<{as_importable_string(d.__class__)}: " f"name={d.name!r} import_name={d.import_name!r}>") for d in getattr(plugin, attr) ] else: info[attr] = getattr(plugin, attr) plugins_info.append(info) return plugins_info
def initialize_extra_operators_links_plugins(): """Creates modules for loaded extension from extra operators links plugins""" global global_operator_extra_links global operator_extra_links global registered_operator_link_classes if ( global_operator_extra_links is not None and operator_extra_links is not None and registered_operator_link_classes is not None ): return ensure_plugins_loaded() if plugins is None: raise AirflowPluginException("Can't load plugins.") log.debug("Initialize extra operators links plugins") global_operator_extra_links = [] operator_extra_links = [] registered_operator_link_classes = {} for plugin in plugins: global_operator_extra_links.extend(plugin.global_operator_extra_links) operator_extra_links.extend(list(plugin.operator_extra_links)) registered_operator_link_classes.update( {as_importable_string(link.__class__): link.__class__ for link in plugin.operator_extra_links} )
def encode_timetable(var: Timetable) -> Dict[str, Any]: """Encode a timetable instance. This delegates most of the serialization work to the type, so the behavior can be completely controlled by a custom subclass. """ return {"type": as_importable_string(type(var)), "value": var.serialize()}
def _encode_timetable(var: Timetable) -> Dict[str, Any]: """Encode a timetable instance. This delegates most of the serialization work to the type, so the behavior can be completely controlled by a custom subclass. """ timetable_class = type(var) importable_string = as_importable_string(timetable_class) if _get_registered_timetable(importable_string) is None: raise _TimetableNotRegistered(importable_string) return {Encoding.TYPE: importable_string, Encoding.VAR: var.serialize()}
def initialize_timetables_plugins(): """Collect timetable classes registered by plugins.""" global timetable_classes if timetable_classes is not None: return ensure_plugins_loaded() if plugins is None: raise AirflowPluginException("Can't load plugins.") log.debug("Initialize extra timetables plugins") timetable_classes = { as_importable_string(timetable_class): timetable_class for plugin in plugins for timetable_class in plugin.timetables }
def initialize_ti_deps_plugins(): """Creates modules for loaded extension from custom task instance dependency rule plugins""" global registered_ti_dep_classes if registered_ti_dep_classes is not None: return ensure_plugins_loaded() if plugins is None: raise AirflowPluginException("Can't load plugins.") log.debug("Initialize custom taskinstance deps plugins") registered_ti_dep_classes = {} for plugin in plugins: registered_ti_dep_classes.update({ as_importable_string(ti_dep.__class__): ti_dep.__class__ for ti_dep in plugin.ti_deps })