Coverage for src/debputy/plugin/api/feature_set.py: 73%
35 statements
« prev ^ index » next coverage.py v7.2.7, created at 2024-04-07 12:14 +0200
« prev ^ index » next coverage.py v7.2.7, created at 2024-04-07 12:14 +0200
1import dataclasses
2import textwrap
3from typing import Dict, List, Tuple, Sequence, Any
5from debputy import DEBPUTY_DOC_ROOT_DIR
6from debputy.manifest_parser.declarative_parser import ParserGenerator
7from debputy.plugin.api import reference_documentation
8from debputy.plugin.api.impl_types import (
9 DebputyPluginMetadata,
10 PackagerProvidedFileClassSpec,
11 MetadataOrMaintscriptDetector,
12 TTP,
13 DispatchingTableParser,
14 TP,
15 SUPPORTED_DISPATCHABLE_TABLE_PARSERS,
16 DispatchingObjectParser,
17 SUPPORTED_DISPATCHABLE_OBJECT_PARSERS,
18 PluginProvidedManifestVariable,
19 PluginProvidedPackageProcessor,
20 PluginProvidedDiscardRule,
21 ServiceManagerDetails,
22 PluginProvidedKnownPackagingFile,
23 PluginProvidedTypeMapping,
24 OPARSER_PACKAGES,
25 OPARSER_PACKAGES_ROOT,
26)
29def _initialize_parser_generator() -> ParserGenerator:
30 pg = ParserGenerator()
32 for path, ref_doc in SUPPORTED_DISPATCHABLE_OBJECT_PARSERS.items():
33 pg.add_object_parser(path, parser_documentation=ref_doc)
35 for rt, path in SUPPORTED_DISPATCHABLE_TABLE_PARSERS.items():
36 pg.add_table_parser(rt, path)
38 return pg
41@dataclasses.dataclass(slots=True)
42class PluginProvidedFeatureSet:
43 plugin_data: Dict[str, DebputyPluginMetadata] = dataclasses.field(
44 default_factory=dict
45 )
46 packager_provided_files: Dict[str, PackagerProvidedFileClassSpec] = (
47 dataclasses.field(default_factory=dict)
48 )
49 metadata_maintscript_detectors: Dict[str, List[MetadataOrMaintscriptDetector]] = (
50 dataclasses.field(default_factory=dict)
51 )
52 manifest_variables: Dict[str, PluginProvidedManifestVariable] = dataclasses.field(
53 default_factory=dict
54 )
55 all_package_processors: Dict[Tuple[str, str], PluginProvidedPackageProcessor] = (
56 dataclasses.field(default_factory=dict)
57 )
58 auto_discard_rules: Dict[str, PluginProvidedDiscardRule] = dataclasses.field(
59 default_factory=dict
60 )
61 service_managers: Dict[str, ServiceManagerDetails] = dataclasses.field(
62 default_factory=dict
63 )
64 known_packaging_files: Dict[str, PluginProvidedKnownPackagingFile] = (
65 dataclasses.field(default_factory=dict)
66 )
67 mapped_types: Dict[Any, PluginProvidedTypeMapping] = dataclasses.field(
68 default_factory=dict
69 )
70 manifest_parser_generator: ParserGenerator = dataclasses.field(
71 default_factory=_initialize_parser_generator
72 )
74 def package_processors_in_order(self) -> Sequence[PluginProvidedPackageProcessor]:
75 order = []
76 delayed = []
77 for plugin_processor in self.all_package_processors.values():
78 if not plugin_processor.dependencies:
79 order.append(plugin_processor)
80 else:
81 delayed.append(plugin_processor)
83 # At the time of writing, insert order will work as a plugin cannot declare
84 # dependencies out of order in the current version. However, we want to
85 # ensure dependencies are taken a bit seriously, so we ensure that processors
86 # without dependencies are run first. This should weed out anything that
87 # needs dependencies but do not add them.
88 #
89 # It is still far from as any dependency issues will be hidden if you just
90 # add a single dependency.
91 order.extend(delayed)
92 return order