from .custom_compare.list import CompareList
from .custom_compare.range import CompareRange
from .tools.combine import COMBINE_RULES_TYPE
from .tools.compare import COMPARE_RULES_TYPE
from .tools.context import CONTEXT_RULES_TYPE, PAIR_CONTEXT_RULES_TYPE
from .tools.render import PATH_MAKER_IGNORE_RULES_TYPE
[docs]
class Config:
def __init__(
self,
tab: str = " ",
compare_rules: COMPARE_RULES_TYPE = {},
combine_rules: COMBINE_RULES_TYPE = [],
path_maker_ignore: PATH_MAKER_IGNORE_RULES_TYPE = ["properties", "items"],
pair_context_rules: PAIR_CONTEXT_RULES_TYPE = [],
context_rules: CONTEXT_RULES_TYPE = {},
):
self.TAB = tab
self.COMPARE_RULES = compare_rules
self.COMBINE_RULES = combine_rules
self.PATH_MAKER_IGNORE = path_maker_ignore
self.PAIR_CONTEXT_RULES = pair_context_rules
self.CONTEXT_RULES = context_rules
[docs]
default_config = Config(
compare_rules={
list: CompareList,
# ЧИСЛА
"minimum": CompareRange,
"maximum": CompareRange,
"exclusiveMinimum": CompareRange,
"exclusiveMaximum": CompareRange,
# СТРОКИ (длины)
"minLength": CompareRange,
"maxLength": CompareRange,
# МАССИВЫ (число элементов)
"minItems": CompareRange,
"maxItems": CompareRange,
# ОБЪЕКТЫ (число свойств)
"minProperties": CompareRange,
"maxProperties": CompareRange,
},
combine_rules=[
["minimum", "exclusiveMinimum", "maximum", "exclusiveMaximum"],
["minLength", "maxLength"],
["minItems", "maxItems"],
["minProperties", "maxProperties"],
],
pair_context_rules=[
["type", "format"], # строковые форматы
["contentEncoding", "contentMediaType"], # парные контент-атрибуты для строк
["if", "then", "else"], # логический триплет показываем вместе
["properties", "required"], # объект: список свойств и обязательность
["items", "prefixItems"], # массив: позиционные/общие элементы
["contains", "minContains", "maxContains"], # массив: contains и его пороги
["dependentRequired", "dependentSchemas"], # объект: зависимости
["readOnly", "writeOnly"], # метаданные доступа поля
["$ref", "$defs"], # ссылка и её пространство имён
[
"additionalProperties",
"unevaluatedProperties",
], # политика для «прочих» свойств
["propertyNames", "patternProperties"], # правила по именам vs по паттернам
["pattern", "format"], # для строк часто полезно показать оба
],
context_rules={
# Строки
"pattern": ["type"], # есть паттерн — покажем, что это строка
"contentMediaType": ["type", "contentEncoding"],
"contentEncoding": ["type", "contentMediaType"],
"contentSchema": ["type", "contentMediaType"],
# Числа
"multipleOf": ["type"], # кратность имеет смысл для number/integer
# Массивы
"items": ["contains", "prefixItems", "uniqueItems", "unevaluatedItems"],
"prefixItems": ["items", "unevaluatedItems"],
"contains": ["minContains", "maxContains", "items"],
"uniqueItems": ["type", "items"],
# Объекты
"properties": ["required", "additionalProperties", "patternProperties"],
"required": ["properties"], # дублирует пару, но безвредно
"patternProperties": ["additionalProperties"],
"dependentSchemas": ["dependentRequired", "properties"],
"dependentRequired": ["properties"],
"propertyNames": ["type"],
# Комбинаторы
"oneOf": ["type"],
"anyOf": ["type"],
"allOf": ["type"],
"not": ["type"],
# Референсы/мета
"$ref": ["$defs"],
},
)