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

1import dataclasses 

2from typing import Dict, List, Tuple, Sequence, Any, Optional, Type 

3 

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 

22 

23 

24def _initialize_parser_generator() -> ParserGenerator: 

25 pg = ParserGenerator() 

26 

27 for path, ref_doc in SUPPORTED_DISPATCHABLE_OBJECT_PARSERS.items(): 

28 pg.add_object_parser(path, parser_documentation=ref_doc) 

29 

30 for rt, path in SUPPORTED_DISPATCHABLE_TABLE_PARSERS.items(): 

31 pg.add_table_parser(rt, path) 

32 

33 return pg 

34 

35 

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) 

71 

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) 

80 

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