Coverage for jsonschema_diff/core/config.py: 100%
15 statements
« prev ^ index » next coverage.py v7.10.5, created at 2025-08-25 07:00 +0000
« prev ^ index » next coverage.py v7.10.5, created at 2025-08-25 07:00 +0000
1from .custom_compare.list import CompareList
2from .custom_compare.range import CompareRange
3from .tools.combine import COMBINE_RULES_TYPE
4from .tools.compare import COMPARE_RULES_TYPE
5from .tools.context import CONTEXT_RULES_TYPE, PAIR_CONTEXT_RULES_TYPE
6from .tools.render import PATH_MAKER_IGNORE_RULES_TYPE
9class Config:
10 def __init__(
11 self,
12 tab: str = " ",
13 compare_rules: COMPARE_RULES_TYPE = {},
14 combine_rules: COMBINE_RULES_TYPE = [],
15 path_maker_ignore: PATH_MAKER_IGNORE_RULES_TYPE = ["properties", "items"],
16 pair_context_rules: PAIR_CONTEXT_RULES_TYPE = [],
17 context_rules: CONTEXT_RULES_TYPE = {},
18 ):
19 self.TAB = tab
21 self.COMPARE_RULES = compare_rules
23 self.COMBINE_RULES = combine_rules
25 self.PATH_MAKER_IGNORE = path_maker_ignore
27 self.PAIR_CONTEXT_RULES = pair_context_rules
28 self.CONTEXT_RULES = context_rules
31default_config = Config(
32 compare_rules={
33 list: CompareList,
34 # ЧИСЛА
35 "minimum": CompareRange,
36 "maximum": CompareRange,
37 "exclusiveMinimum": CompareRange,
38 "exclusiveMaximum": CompareRange,
39 # СТРОКИ (длины)
40 "minLength": CompareRange,
41 "maxLength": CompareRange,
42 # МАССИВЫ (число элементов)
43 "minItems": CompareRange,
44 "maxItems": CompareRange,
45 # ОБЪЕКТЫ (число свойств)
46 "minProperties": CompareRange,
47 "maxProperties": CompareRange,
48 },
49 combine_rules=[
50 ["minimum", "exclusiveMinimum", "maximum", "exclusiveMaximum"],
51 ["minLength", "maxLength"],
52 ["minItems", "maxItems"],
53 ["minProperties", "maxProperties"],
54 ],
55 pair_context_rules=[
56 ["type", "format"], # строковые форматы
57 ["contentEncoding", "contentMediaType"], # парные контент-атрибуты для строк
58 ["if", "then", "else"], # логический триплет показываем вместе
59 ["properties", "required"], # объект: список свойств и обязательность
60 ["items", "prefixItems"], # массив: позиционные/общие элементы
61 ["contains", "minContains", "maxContains"], # массив: contains и его пороги
62 ["dependentRequired", "dependentSchemas"], # объект: зависимости
63 ["readOnly", "writeOnly"], # метаданные доступа поля
64 ["$ref", "$defs"], # ссылка и её пространство имён
65 [
66 "additionalProperties",
67 "unevaluatedProperties",
68 ], # политика для «прочих» свойств
69 ["propertyNames", "patternProperties"], # правила по именам vs по паттернам
70 ["pattern", "format"], # для строк часто полезно показать оба
71 ],
72 context_rules={
73 # Строки
74 "pattern": ["type"], # есть паттерн — покажем, что это строка
75 "contentMediaType": ["type", "contentEncoding"],
76 "contentEncoding": ["type", "contentMediaType"],
77 "contentSchema": ["type", "contentMediaType"],
78 # Числа
79 "multipleOf": ["type"], # кратность имеет смысл для number/integer
80 # Массивы
81 "items": ["contains", "prefixItems", "uniqueItems", "unevaluatedItems"],
82 "prefixItems": ["items", "unevaluatedItems"],
83 "contains": ["minContains", "maxContains", "items"],
84 "uniqueItems": ["type", "items"],
85 # Объекты
86 "properties": ["required", "additionalProperties", "patternProperties"],
87 "required": ["properties"], # дублирует пару, но безвредно
88 "patternProperties": ["additionalProperties"],
89 "dependentSchemas": ["dependentRequired", "properties"],
90 "dependentRequired": ["properties"],
91 "propertyNames": ["type"],
92 # Комбинаторы
93 "oneOf": ["type"],
94 "anyOf": ["type"],
95 "allOf": ["type"],
96 "not": ["type"],
97 # Референсы/мета
98 "$ref": ["$defs"],
99 },
100)