Coverage for jsonschema_diff/core/config.py: 100%

23 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-09-15 18:01 +0000

1from typing import TypeAlias 

2 

3from .custom_compare.list import CompareList 

4from .custom_compare.range import CompareRange 

5from .tools.combine import COMBINE_RULES_TYPE 

6from .tools.compare import COMPARE_RULES_TYPE 

7from .tools.context import CONTEXT_RULES_TYPE, PAIR_CONTEXT_RULES_TYPE 

8from .tools.render import PATH_MAKER_IGNORE_RULES_TYPE 

9 

10COMPARE_CONFIG_TYPE: TypeAlias = dict[type, dict] 

11 

12PROPERTY_KEY_GROUPS_TYPE: TypeAlias = dict[type, list[str]] 

13 

14 

15class Config: 

16 def __init__( 

17 self, 

18 tab: str = " ", 

19 all_for_rendering: bool = False, 

20 crop_path: bool = True, 

21 compare_rules: COMPARE_RULES_TYPE = {}, 

22 combine_rules: COMBINE_RULES_TYPE = [], 

23 path_maker_ignore: PATH_MAKER_IGNORE_RULES_TYPE = ["properties", "items"], 

24 pair_context_rules: PAIR_CONTEXT_RULES_TYPE = [], 

25 context_rules: CONTEXT_RULES_TYPE = {}, 

26 compare_config: COMPARE_CONFIG_TYPE = {}, 

27 property_key_groups: PROPERTY_KEY_GROUPS_TYPE = { 

28 dict: ["properties", "$defs"], 

29 list: ["prefixItems", "items"], # , "oneOf", "allOf", "anyOf"], 

30 }, 

31 ): 

32 self.TAB: str = tab 

33 

34 self.ALL_FOR_RENDERING = all_for_rendering 

35 self.CROP_PATH = crop_path 

36 

37 self.COMPARE_RULES: COMPARE_RULES_TYPE = compare_rules 

38 

39 self.COMBINE_RULES: COMBINE_RULES_TYPE = combine_rules 

40 

41 self.PATH_MAKER_IGNORE: PATH_MAKER_IGNORE_RULES_TYPE = path_maker_ignore 

42 

43 self.PAIR_CONTEXT_RULES: PAIR_CONTEXT_RULES_TYPE = pair_context_rules 

44 self.CONTEXT_RULES: CONTEXT_RULES_TYPE = context_rules 

45 

46 self.COMPARE_CONFIG: COMPARE_CONFIG_TYPE = compare_config 

47 """Configs for comparators. 

48 Can be obtained from Compare.my_config (content can be anything)""" 

49 

50 self.PROPERTY_KEY_GROUPS: PROPERTY_KEY_GROUPS_TYPE = property_key_groups 

51 

52 

53default_config = Config( 

54 compare_rules={ 

55 list: CompareList, 

56 # ЧИСЛА 

57 "minimum": CompareRange, 

58 "maximum": CompareRange, 

59 "exclusiveMinimum": CompareRange, 

60 "exclusiveMaximum": CompareRange, 

61 # СТРОКИ (длины) 

62 "minLength": CompareRange, 

63 "maxLength": CompareRange, 

64 # МАССИВЫ (число элементов) 

65 "minItems": CompareRange, 

66 "maxItems": CompareRange, 

67 # ОБЪЕКТЫ (число свойств) 

68 "minProperties": CompareRange, 

69 "maxProperties": CompareRange, 

70 }, 

71 combine_rules=[ 

72 ["minimum", "exclusiveMinimum", "maximum", "exclusiveMaximum"], 

73 ["minLength", "maxLength"], 

74 ["minItems", "maxItems"], 

75 ["minProperties", "maxProperties"], 

76 ], 

77 pair_context_rules=[ 

78 ["type", "format"], # строковые форматы 

79 ["contentEncoding", "contentMediaType"], # парные контент-атрибуты для строк 

80 ["if", "then", "else"], # логический триплет показываем вместе 

81 ["properties", "required"], # объект: список свойств и обязательность 

82 ["items", "prefixItems"], # массив: позиционные/общие элементы 

83 ["contains", "minContains", "maxContains"], # массив: contains и его пороги 

84 ["dependentRequired", "dependentSchemas"], # объект: зависимости 

85 ["readOnly", "writeOnly"], # метаданные доступа поля 

86 ["$ref", "$defs"], # ссылка и её пространство имён 

87 [ 

88 "additionalProperties", 

89 "unevaluatedProperties", 

90 ], # политика для «прочих» свойств 

91 ["propertyNames", "patternProperties"], # правила по именам vs по паттернам 

92 ["pattern", "format"], # для строк часто полезно показать оба 

93 ], 

94 context_rules={ 

95 # Строки 

96 "pattern": ["type"], # есть паттерн — покажем, что это строка 

97 "contentMediaType": ["type", "contentEncoding"], 

98 "contentEncoding": ["type", "contentMediaType"], 

99 "contentSchema": ["type", "contentMediaType"], 

100 # Числа 

101 "multipleOf": ["type"], # кратность имеет смысл для number/integer 

102 # Массивы 

103 "items": ["contains", "prefixItems", "uniqueItems", "unevaluatedItems"], 

104 "prefixItems": ["items", "unevaluatedItems"], 

105 "contains": ["minContains", "maxContains", "items"], 

106 "uniqueItems": ["type", "items"], 

107 # Объекты 

108 "properties": ["required", "additionalProperties", "patternProperties"], 

109 "required": ["properties"], # дублирует пару, но безвредно 

110 "patternProperties": ["additionalProperties"], 

111 "dependentSchemas": ["dependentRequired", "properties"], 

112 "dependentRequired": ["properties"], 

113 "propertyNames": ["type"], 

114 # Комбинаторы 

115 "oneOf": ["type"], 

116 "anyOf": ["type"], 

117 "allOf": ["type"], 

118 "not": ["type"], 

119 # Референсы/мета 

120 "$ref": ["$defs"], 

121 }, 

122)