genschema 0.1.0__py3-none-any.whl → 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
genschema/__init__.py CHANGED
@@ -2,4 +2,4 @@ from .pipeline import Converter
2
2
  from .pseudo_arrays import PseudoArrayHandler, PseudoArrayHandlerBase
3
3
 
4
4
  __all__ = ["Converter", "PseudoArrayHandler", "PseudoArrayHandlerBase"]
5
- __version__ = "0.1.0"
5
+ __version__ = "0.1.1"
genschema/cli.py CHANGED
@@ -11,6 +11,7 @@ from .comparators import (
11
11
  EmptyComparator,
12
12
  FormatComparator,
13
13
  RequiredComparator,
14
+ SchemaVersionComparator,
14
15
  )
15
16
 
16
17
  console = Console()
@@ -52,6 +53,11 @@ Examples:
52
53
  parser.add_argument("--no-format", action="store_true", help="Disable FormatComparator.")
53
54
  parser.add_argument("--no-required", action="store_true", help="Disable RequiredComparator.")
54
55
  parser.add_argument("--no-empty", action="store_true", help="Disable EmptyComparator.")
56
+ parser.add_argument(
57
+ "--no-schema-version",
58
+ action="store_true",
59
+ help="Disable SchemaVersionComparator.",
60
+ )
55
61
  parser.add_argument(
56
62
  "--no-delete-element", action="store_true", help="Disable DeleteElement comparators."
57
63
  )
@@ -108,6 +114,8 @@ Examples:
108
114
  # Register comparators conditionally
109
115
  if not args.no_format:
110
116
  conv.register(FormatComparator())
117
+ if not args.no_schema_version:
118
+ conv.register(SchemaVersionComparator())
111
119
  if not args.no_required:
112
120
  conv.register(RequiredComparator())
113
121
  if not args.no_empty:
@@ -4,6 +4,7 @@ from .flag import FlagMaker
4
4
  from .format import FormatComparator
5
5
  from .no_additional_prop import NoAdditionalProperties
6
6
  from .required import RequiredComparator
7
+ from .schema_version import SchemaVersionComparator
7
8
  from .type import TypeComparator
8
9
 
9
10
  __all__ = [
@@ -14,4 +15,5 @@ __all__ = [
14
15
  "EmptyComparator",
15
16
  "NoAdditionalProperties",
16
17
  "DeleteElement",
18
+ "SchemaVersionComparator",
17
19
  ]
@@ -20,18 +20,37 @@ class RequiredComparator(Comparator):
20
20
  )
21
21
 
22
22
  def process(self, ctx: ProcessingContext, env: str, node: dict) -> ComparatorResult:
23
- # собираем все ключи в JSON на этом уровне
24
- keys: set[str] = set()
25
- for j in ctx.jsons:
26
- if isinstance(j.content, dict):
27
- keys.update(j.content.keys())
28
-
29
- # определяем обязательные: ключи, которые есть во всех JSON
30
- required = [
31
- k
32
- for k in sorted(keys)
33
- if all(isinstance(j.content, dict) and k in j.content for j in ctx.jsons)
34
- ]
23
+ required_sets: list[set[str]] = []
24
+
25
+ # Если есть хотя бы один JSON, который не является объектом,
26
+ # мы не можем корректно определить обязательные ключи.
27
+ if ctx.jsons and any(not isinstance(j.content, dict) for j in ctx.jsons):
28
+ return None, None
29
+
30
+ # ---------- из json ----------
31
+ objects = [j.content for j in ctx.jsons if isinstance(j.content, dict)]
32
+ if objects:
33
+ keys: set[str] = set()
34
+ for obj in objects:
35
+ keys.update(obj.keys())
36
+
37
+ required_from_json = {k for k in keys if all(k in obj for obj in objects)}
38
+ required_sets.append(required_from_json)
39
+
40
+ # ---------- из схем ----------
41
+ for schema in ctx.schemas:
42
+ content = schema.content
43
+ if not isinstance(content, dict):
44
+ continue
45
+ req = content.get("required")
46
+ if isinstance(req, list):
47
+ required_sets.append(set(req))
48
+
49
+ if not required_sets:
50
+ return None, None
51
+
52
+ # ---------- минимальное пересечение ----------
53
+ required = sorted(set.intersection(*required_sets))
35
54
 
36
55
  if required:
37
56
  return {"required": required}, None
@@ -0,0 +1,18 @@
1
+ from .template import Comparator, ComparatorResult, ProcessingContext
2
+
3
+
4
+ class SchemaVersionComparator(Comparator):
5
+ """
6
+ Компаратор для установки версии JSON Schema на верхнем уровне.
7
+ """
8
+
9
+ name = "schema_version"
10
+
11
+ def __init__(self, version: str = "https://json-schema.org/draft/2020-12/schema"):
12
+ self._version = version
13
+
14
+ def can_process(self, ctx: ProcessingContext, env: str, prev_result: dict) -> bool:
15
+ return env == "/" and "$schema" not in prev_result
16
+
17
+ def process(self, ctx: ProcessingContext, env: str, prev_result: dict) -> ComparatorResult:
18
+ return {"$schema": self._version}, None
genschema/pipeline.py CHANGED
@@ -57,6 +57,11 @@ class Converter:
57
57
  self._jsons.append(Resource(str(self._id), "json", j))
58
58
  self._id += 1
59
59
 
60
+ def clear_data(self) -> None:
61
+ self._id = 0
62
+ self._jsons = []
63
+ self._schemas = []
64
+
60
65
  def register(self, c: Comparator) -> None:
61
66
  if isinstance(c, TypeComparator):
62
67
  raise UserWarning(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: genschema
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: A library for comparing JSON and schemas and generate new
5
5
  Author-email: Miskler <mail@miskler.ru>
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -1,21 +1,22 @@
1
- genschema/__init__.py,sha256=H7eaAUZ84m4YkaNoyShpLFrz9Q6SBiroapHkRXNY_zs,197
2
- genschema/cli.py,sha256=bY-Tz7HIDsbFNMmyZFG2RNmmySeyFbe51LVKUXW29cI,4839
1
+ genschema/__init__.py,sha256=Qvo40v51zgw2HepkC16dAn0hUJQEV8XSd8OqH0YrTv8,197
2
+ genschema/cli.py,sha256=DkQoIoS4k7TlADBrmrufqiRKyg8lDBge4eGeTP_zn_Q,5092
3
3
  genschema/node.py,sha256=gHyAk1tdN2vmRA5ajiWPdPKjxZf2Qo9ju9yHev5d2tA,348
4
- genschema/pipeline.py,sha256=EzmTT7dDistfkzNYvk-rhWTQI-8-T4Am0fkRG2nxDyo,10756
4
+ genschema/pipeline.py,sha256=SYYWQt_nN9xqYKNFgvW0lTsyxTh74dVCYZMouet5NTs,10864
5
5
  genschema/pseudo_arrays.py,sha256=IZzqxUFeomUM8Qum6pOyP2mJK_wUYMm7MbHqHA12qxw,618
6
6
  genschema/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- genschema/comparators/__init__.py,sha256=vngXaIcgXywvL05EnAMHpB67cx6ci3rGWUY3Vhxd_LM,449
7
+ genschema/comparators/__init__.py,sha256=nedNLZJtfc4iyXz-WC_4n9gHDbJYtUTnEqtaQMZrf60,532
8
8
  genschema/comparators/delete_element.py,sha256=U3VWam-1t98pUewAj9cISasEUGMq6HAtQzHp4cekt7o,773
9
9
  genschema/comparators/empty.py,sha256=sNTXMPbVEFJPgN02gyZg4dK_dY3IUKg8FIlTzFhmPSw,1982
10
10
  genschema/comparators/flag.py,sha256=9EWlcWSqmDSaekflSo7nQRY-VowFMO99s_n4TlbA-P0,539
11
11
  genschema/comparators/format.py,sha256=XDQ5jtAq2uTOhDDj2i728iKDPuIUIJ7WjDRJJ-H9S0E,3554
12
12
  genschema/comparators/no_additional_prop.py,sha256=9iD_Fm1WGxeZ4NJfVT4p9whY_U6dK1qeQxgW7--vvjc,1331
13
- genschema/comparators/required.py,sha256=fcC_aPysXd9pDlDYb1258PBcJ3hDq5d3QxMn2dZKhWU,1420
13
+ genschema/comparators/required.py,sha256=Yx8KqDQQiVUe4eFgxDB3vJCM61xuabMNEnjQEbmjau0,2197
14
+ genschema/comparators/schema_version.py,sha256=cp8S9-aAkBOQo1djmNk39M8bbAtwd9hY71ktKfMhiEA,683
14
15
  genschema/comparators/template.py,sha256=tAA0RZNL5j9_5JhaxcnqA7TikGOkGo5SP4nr7lMULls,753
15
16
  genschema/comparators/type.py,sha256=4KUQAHIVuXk3vh4JK_UO4XxGCaZrCMNQ74REz9czK68,2113
16
- genschema-0.1.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
17
- genschema-0.1.0.dist-info/METADATA,sha256=jx6J07thY0WvnH9tmkpH1dCgpIKmxkYMnl3AFXkp5FU,49422
18
- genschema-0.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
19
- genschema-0.1.0.dist-info/entry_points.txt,sha256=AAVGovHs-ANlz7GjTufSGXFcdq4BKOAmHDerlX74j_E,49
20
- genschema-0.1.0.dist-info/top_level.txt,sha256=4oD4zKc8OyD8n_g_3pjvk_KHVXEtnJ9Azdq33I5n6u8,10
21
- genschema-0.1.0.dist-info/RECORD,,
17
+ genschema-0.1.1.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
18
+ genschema-0.1.1.dist-info/METADATA,sha256=NsGZWeC4R2EXC4yF25GQB8stZ6SJfAKd4oQ_eg6Hf_E,49422
19
+ genschema-0.1.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
20
+ genschema-0.1.1.dist-info/entry_points.txt,sha256=AAVGovHs-ANlz7GjTufSGXFcdq4BKOAmHDerlX74j_E,49
21
+ genschema-0.1.1.dist-info/top_level.txt,sha256=4oD4zKc8OyD8n_g_3pjvk_KHVXEtnJ9Azdq33I5n6u8,10
22
+ genschema-0.1.1.dist-info/RECORD,,