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

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 

7 

8 

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 

20 

21 self.COMPARE_RULES = compare_rules 

22 

23 self.COMBINE_RULES = combine_rules 

24 

25 self.PATH_MAKER_IGNORE = path_maker_ignore 

26 

27 self.PAIR_CONTEXT_RULES = pair_context_rules 

28 self.CONTEXT_RULES = context_rules 

29 

30 

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)