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
« prev ^ index » next coverage.py v7.10.6, created at 2025-09-15 18:01 +0000
1from typing import TypeAlias
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
10COMPARE_CONFIG_TYPE: TypeAlias = dict[type, dict]
12PROPERTY_KEY_GROUPS_TYPE: TypeAlias = dict[type, list[str]]
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
34 self.ALL_FOR_RENDERING = all_for_rendering
35 self.CROP_PATH = crop_path
37 self.COMPARE_RULES: COMPARE_RULES_TYPE = compare_rules
39 self.COMBINE_RULES: COMBINE_RULES_TYPE = combine_rules
41 self.PATH_MAKER_IGNORE: PATH_MAKER_IGNORE_RULES_TYPE = path_maker_ignore
43 self.PAIR_CONTEXT_RULES: PAIR_CONTEXT_RULES_TYPE = pair_context_rules
44 self.CONTEXT_RULES: CONTEXT_RULES_TYPE = context_rules
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)"""
50 self.PROPERTY_KEY_GROUPS: PROPERTY_KEY_GROUPS_TYPE = property_key_groups
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)