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