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

1import dataclasses 

2import textwrap 

3from typing import Dict, List, Tuple, Sequence, Any 

4 

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) 

27 

28 

29def _initialize_parser_generator() -> ParserGenerator: 

30 pg = ParserGenerator() 

31 

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

33 pg.add_object_parser(path, parser_documentation=ref_doc) 

34 

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

36 pg.add_table_parser(rt, path) 

37 

38 return pg 

39 

40 

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 ) 

73 

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) 

82 

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