pytest-jsonschema-snapshot 0.2.5__tar.gz → 0.2.6__tar.gz

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.
Files changed (73) hide show
  1. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/PKG-INFO +1 -1
  2. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/pytest_jsonschema_snapshot/__init__.py +1 -1
  3. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/pytest_jsonschema_snapshot/core.py +48 -24
  4. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.flake8 +0 -0
  5. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  6. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  7. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.github/ISSUE_TEMPLATE/documentation_issue.yml +0 -0
  8. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  9. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.github/PULL_REQUEST_TEMPLATE/general.md +0 -0
  10. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.github/actions/build-docs/action.yml +0 -0
  11. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.github/workflows/release.yml +0 -0
  12. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.github/workflows/reusable-test.yml +0 -0
  13. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.github/workflows/test.yml +0 -0
  14. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/.gitignore +0 -0
  15. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/LICENSE +0 -0
  16. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/Makefile +0 -0
  17. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/README.md +0 -0
  18. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/assets/logo.png +0 -0
  19. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/docs/source/_static/logo_day.png +0 -0
  20. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/docs/source/_static/logo_night.png +0 -0
  21. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/docs/source/basic/quick_start.rst +0 -0
  22. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/docs/source/conf.py +0 -0
  23. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/docs/source/index.rst +0 -0
  24. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/pyproject.toml +0 -0
  25. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/pytest_jsonschema_snapshot/plugin.py +0 -0
  26. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/pytest_jsonschema_snapshot/py.typed +0 -0
  27. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/pytest_jsonschema_snapshot/stats.py +0 -0
  28. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/pytest_jsonschema_snapshot/tools/__init__.py +0 -0
  29. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/pytest_jsonschema_snapshot/tools/name_maker.py +0 -0
  30. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/reinstall_plugin.sh +0 -0
  31. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/requirements.txt +0 -0
  32. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/test_stats.py +0 -0
  33. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/tools/test_name_maker.py +0 -0
  34. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/TestDataClass.get_data.first.json +0 -0
  35. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/TestDataClass.get_data.first.schema.json +0 -0
  36. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/TestDataClass.get_data.json +0 -0
  37. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/TestDataClass.get_data.schema.json +0 -0
  38. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/array_formats_test.json +0 -0
  39. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/array_formats_test.schema.json +0 -0
  40. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/date_test.json +0 -0
  41. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/date_test.schema.json +0 -0
  42. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/datetime_test.json +0 -0
  43. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/datetime_test.schema.json +0 -0
  44. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/email_test.json +0 -0
  45. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/email_test.schema.json +0 -0
  46. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/get_data.first.json +0 -0
  47. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/get_data.first.schema.json +0 -0
  48. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/get_data.json +0 -0
  49. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/get_data.schema.json +0 -0
  50. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/ipv4_test.json +0 -0
  51. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/ipv4_test.schema.json +0 -0
  52. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/mixed_formats_test.json +0 -0
  53. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/mixed_formats_test.schema.json +0 -0
  54. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/multi_schema_one.json +0 -0
  55. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/multi_schema_three.json +0 -0
  56. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/multi_schema_two.json +0 -0
  57. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/regular_strings_test.json +0 -0
  58. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/regular_strings_test.schema.json +0 -0
  59. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/some_schema.json +0 -0
  60. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/some_schema.schema.json +0 -0
  61. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/strict_email_validation_test.json +0 -0
  62. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/strict_email_validation_test.schema.json +0 -0
  63. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/uri_test.json +0 -0
  64. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/uri_test.schema.json +0 -0
  65. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/uuid_test.json +0 -0
  66. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/__snapshots__/uuid_test.schema.json +0 -0
  67. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/test_base.py +0 -0
  68. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/test_base_name_callable.py +0 -0
  69. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/test_format_detection.py +0 -0
  70. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/test_format_validation.py +0 -0
  71. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tests/usage/test_multiple_schema_creation.py +0 -0
  72. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/tt.py +0 -0
  73. {pytest_jsonschema_snapshot-0.2.5 → pytest_jsonschema_snapshot-0.2.6}/yy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytest-jsonschema-snapshot
3
- Version: 0.2.5
3
+ Version: 0.2.6
4
4
  Summary: Pytest plugin for automatic JSON Schema generation and validation from examples
5
5
  Project-URL: Homepage, https://miskler.github.io/pytest-jsonschema-snapshot/basic/quick_start.html
6
6
  Project-URL: Repository, https://github.com/Miskler/pytest-jsonschema-snapshot
@@ -8,5 +8,5 @@ pytest-typed-schema-shot
8
8
 
9
9
  from .core import SchemaShot
10
10
 
11
- __version__ = "0.2.5"
11
+ __version__ = "0.2.6"
12
12
  __all__ = ["SchemaShot"]
@@ -5,7 +5,7 @@ Core logic of the plugin.
5
5
  import json
6
6
  import logging
7
7
  from pathlib import Path
8
- from typing import TYPE_CHECKING, Any, Callable, Optional, Set
8
+ from typing import TYPE_CHECKING, Any, Callable, Literal, Optional
9
9
 
10
10
  import pathvalidate
11
11
 
@@ -59,7 +59,7 @@ class SchemaShot:
59
59
  self.save_original: bool = save_original
60
60
  self.debug_mode: bool = debug_mode
61
61
  self.snapshot_dir: Path = root_dir / snapshot_dir_name
62
- self.used_schemas: Set[str] = set()
62
+ self.used_schemas: set[str] = set()
63
63
 
64
64
  self.conv = Converter(
65
65
  pseudo_handler=PseudoArrayHandler(),
@@ -162,11 +162,7 @@ class SchemaShot:
162
162
 
163
163
  real_name = self._process_name(name)
164
164
 
165
- self.conv.clear_data()
166
- self.conv.add_schema(data)
167
- current_schema = self.conv.run()
168
-
169
- real_name, status = self._base_match(data, current_schema, real_name)
165
+ real_name, status = self._base_match(data, data, "json", real_name)
170
166
 
171
167
  if self.update_mode or self.reset_mode:
172
168
  self._save_process_original(real_name=real_name, status=status, data=data)
@@ -191,7 +187,7 @@ class SchemaShot:
191
187
 
192
188
  real_name = self._process_name(name)
193
189
 
194
- real_name, status = self._base_match(data, schema, real_name)
190
+ real_name, status = self._base_match(data, schema, "schema", real_name)
195
191
 
196
192
  if self.update_mode and data is not None:
197
193
  self._save_process_original(real_name=real_name, status=status, data=data)
@@ -201,7 +197,8 @@ class SchemaShot:
201
197
  def _base_match(
202
198
  self,
203
199
  data: Optional[dict],
204
- current_schema: dict,
200
+ current_data: dict,
201
+ type_data: Literal["json", "schema"],
205
202
  name: str,
206
203
  ) -> tuple[str, Optional[bool]]:
207
204
  """
@@ -224,6 +221,16 @@ class SchemaShot:
224
221
  # --- состояние ДО проверки ---
225
222
  schema_exists_before = schema_path.exists()
226
223
 
224
+ def make_schema(value: dict | list, type: Literal["json", "schema"]) -> dict:
225
+ if type_data == "schema":
226
+ return current_data
227
+ elif type_data == "json":
228
+ self.conv.clear_data()
229
+ self.conv.add_json(current_data)
230
+ return self.conv.run()
231
+ else:
232
+ raise ValueError("Not correct type argument")
233
+
227
234
  # --- когда схемы ещё нет ---
228
235
  if not schema_exists_before:
229
236
  if not self.update_mode and not self.reset_mode:
@@ -236,6 +243,8 @@ class SchemaShot:
236
243
  f"Schema `{name}` not found and adding new schemas is disabled."
237
244
  )
238
245
 
246
+ current_schema = make_schema(current_data, type_data)
247
+
239
248
  with open(schema_path, "w", encoding="utf-8") as f:
240
249
  json.dump(current_schema, f, indent=2, ensure_ascii=False)
241
250
 
@@ -249,44 +258,59 @@ class SchemaShot:
249
258
  # --- схема уже была: сравнение и валидация --------------------------------
250
259
  schema_updated = False
251
260
 
252
- def merge_schemas(old: dict, new: dict) -> dict:
261
+ def merge_schemas(
262
+ old: dict, new: dict | list, type_data: Literal["json", "schema"]
263
+ ) -> dict:
253
264
  self.conv.clear_data()
254
265
  self.conv.add_schema(old)
255
- self.conv.add_schema(new)
266
+ if type_data == "schema":
267
+ self.conv.add_schema(dict(new))
268
+ elif type_data == "json":
269
+ self.conv.add_json(new)
270
+ else:
271
+ raise ValueError("Not correct type argument")
256
272
  result = self.conv.run()
257
273
  return result
258
274
 
259
- if existing_schema != current_schema: # есть отличия
275
+ if (
276
+ type_data == "json" or existing_schema != current_data
277
+ ): # есть отличия или могут быть
260
278
  if (self.update_mode or self.reset_mode) and self.update_actions.get("update"):
261
279
  # обновляем файл
262
280
  if self.reset_mode and not self.update_mode:
281
+ current_schema = make_schema(current_data, type_data)
282
+
263
283
  differences = self.differ.compare(
264
284
  dict(existing_schema), current_schema
265
285
  ).render()
266
- GLOBAL_STATS.add_updated(schema_path.name, differences)
286
+ diff_count = self.differ.property.calc_diff()
287
+ if any(diff_count[key] > 0 for key in diff_count if key != "UNKNOWN"):
288
+ GLOBAL_STATS.add_updated(schema_path.name, differences)
267
289
 
268
- with open(schema_path, "w", encoding="utf-8") as f:
269
- json.dump(current_schema, f, indent=2, ensure_ascii=False)
270
- self.logger.warning(f"Schema `{name}` updated (reset).\n\n{differences}")
290
+ with open(schema_path, "w", encoding="utf-8") as f:
291
+ json.dump(current_schema, f, indent=2, ensure_ascii=False)
292
+ self.logger.warning(f"Schema `{name}` reseted.\n\n{differences}")
271
293
  elif self.update_mode and not self.reset_mode:
272
- merged_schema = merge_schemas(existing_schema, current_schema)
294
+ merged_schema = merge_schemas(existing_schema, current_data, type_data)
273
295
 
274
296
  differences = self.differ.compare(
275
297
  dict(existing_schema), merged_schema
276
298
  ).render()
277
- GLOBAL_STATS.add_updated(schema_path.name, differences)
299
+ diff_count = self.differ.property.calc_diff()
300
+ if any(diff_count[key] > 0 for key in diff_count if key != "UNKNOWN"):
301
+ GLOBAL_STATS.add_updated(schema_path.name, differences)
278
302
 
279
- with open(schema_path, "w", encoding="utf-8") as f:
280
- json.dump(merged_schema, f, indent=2, ensure_ascii=False)
303
+ with open(schema_path, "w", encoding="utf-8") as f:
304
+ json.dump(merged_schema, f, indent=2, ensure_ascii=False)
281
305
 
282
- self.logger.warning(f"Schema `{name}` updated (update).\n\n{differences}")
306
+ self.logger.warning(f"Schema `{name}` updated.\n\n{differences}")
283
307
  else: # both update_mode and reset_mode are True
284
308
  raise ValueError(
285
309
  "Both update_mode and reset_mode cannot be True at the same time."
286
310
  )
287
311
  schema_updated = True
288
312
  elif data is not None:
289
- merged_schema = merge_schemas(existing_schema, current_schema)
313
+ merged_schema = merge_schemas(existing_schema, current_data, type_data)
290
314
 
291
315
  differences = self.differ.compare(dict(existing_schema), merged_schema).render()
292
316
  GLOBAL_STATS.add_uncommitted(schema_path.name, differences)
@@ -302,7 +326,7 @@ class SchemaShot:
302
326
  pytest.fail(
303
327
  f"\n\n{differences}\n\nValidation error in `{name}`: {e.message}"
304
328
  )
305
- elif data is not None:
329
+ elif data is not None and type_data == "schema":
306
330
  # схемы совпали – всё равно валидируем на случай формальных ошибок
307
331
  try:
308
332
  validate(
@@ -311,7 +335,7 @@ class SchemaShot:
311
335
  format_checker=FormatChecker(),
312
336
  )
313
337
  except ValidationError as e:
314
- merged_schema = merge_schemas(existing_schema, current_schema)
338
+ merged_schema = merge_schemas(existing_schema, current_data, type_data)
315
339
 
316
340
  differences = self.differ.compare(dict(existing_schema), merged_schema).render()
317
341
  pytest.fail(f"\n\n{differences}\n\nValidation error in `{name}`: {e.message}")