ssot-core 0.2.17.dev1__tar.gz → 0.2.17.dev2__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 (114) hide show
  1. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/PKG-INFO +3 -3
  2. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/pyproject.toml +3 -3
  3. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_core.egg-info/PKG-INFO +3 -3
  4. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_core.egg-info/requires.txt +2 -2
  5. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/documents.py +11 -1
  6. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/util/document_io.py +8 -4
  7. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/README.md +0 -0
  8. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/setup.cfg +0 -0
  9. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_core.egg-info/SOURCES.txt +0 -0
  10. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_core.egg-info/dependency_links.txt +0 -0
  11. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_core.egg-info/top_level.txt +0 -0
  12. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/__init__.py +0 -0
  13. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/__main__.py +0 -0
  14. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/__init__.py +0 -0
  15. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/boundary.py +0 -0
  16. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/claims.py +0 -0
  17. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/entity_ops.py +0 -0
  18. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/evidence.py +0 -0
  19. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/graph.py +0 -0
  20. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/init.py +0 -0
  21. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/lifecycle.py +0 -0
  22. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/load.py +0 -0
  23. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/plan.py +0 -0
  24. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/profile_eval.py +0 -0
  25. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/profile_resolution.py +0 -0
  26. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/registry.py +0 -0
  27. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/release.py +0 -0
  28. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/save.py +0 -0
  29. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/status_sync.py +0 -0
  30. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/test_execution.py +0 -0
  31. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/upgrade.py +0 -0
  32. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/api/validate.py +0 -0
  33. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/__init__.py +0 -0
  34. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/adr_cmd.py +0 -0
  35. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/boundary_cmd.py +0 -0
  36. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/claim_cmd.py +0 -0
  37. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/common.py +0 -0
  38. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/evidence_cmd.py +0 -0
  39. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/feature_cmd.py +0 -0
  40. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/graph_cmd.py +0 -0
  41. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/init_cmd.py +0 -0
  42. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/issue_cmd.py +0 -0
  43. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/main.py +0 -0
  44. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/profile_cmd.py +0 -0
  45. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/registry_cmd.py +0 -0
  46. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/release_cmd.py +0 -0
  47. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/risk_cmd.py +0 -0
  48. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/spec_cmd.py +0 -0
  49. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/test_cmd.py +0 -0
  50. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/upgrade_cmd.py +0 -0
  51. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/cli/validate_cmd.py +0 -0
  52. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/graph/__init__.py +0 -0
  53. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/graph/export_dot.py +0 -0
  54. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/graph/export_json.py +0 -0
  55. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/__init__.py +0 -0
  56. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/certification.py +0 -0
  57. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/claim_closure.py +0 -0
  58. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/document_lifecycle.py +0 -0
  59. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/document_supersession.py +0 -0
  60. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/feature_claims.py +0 -0
  61. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/feature_requirements.py +0 -0
  62. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/lifecycle.py +0 -0
  63. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/profile_requirements.py +0 -0
  64. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/promotion.py +0 -0
  65. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/guards/publication.py +0 -0
  66. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/__init__.py +0 -0
  67. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/boundary.py +0 -0
  68. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/claim.py +0 -0
  69. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/document.py +0 -0
  70. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/enums.py +0 -0
  71. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/evidence.py +0 -0
  72. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/feature.py +0 -0
  73. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/ids.py +0 -0
  74. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/issue.py +0 -0
  75. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/profile.py +0 -0
  76. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/registry.py +0 -0
  77. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/release.py +0 -0
  78. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/risk.py +0 -0
  79. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/schema_version.py +0 -0
  80. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/model/test.py +0 -0
  81. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/reports/__init__.py +0 -0
  82. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/reports/certification_report.py +0 -0
  83. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/reports/summary.py +0 -0
  84. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/reports/validation_report.py +0 -0
  85. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/snapshots/__init__.py +0 -0
  86. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/snapshots/boundary_snapshot.py +0 -0
  87. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/snapshots/hashing.py +0 -0
  88. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/snapshots/published_snapshot.py +0 -0
  89. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/snapshots/release_snapshot.py +0 -0
  90. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/templates/__init__.py +0 -0
  91. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/templates/registry.full.json +0 -0
  92. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/templates/registry.minimal.json +0 -0
  93. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/util/__init__.py +0 -0
  94. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/util/errors.py +0 -0
  95. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/util/formatting.py +0 -0
  96. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/util/fs.py +0 -0
  97. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/util/jcs.py +0 -0
  98. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/util/jsonio.py +0 -0
  99. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/util/registry_lock.py +0 -0
  100. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/util/time.py +0 -0
  101. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/__init__.py +0 -0
  102. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/bidirectional.py +0 -0
  103. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/bounds.py +0 -0
  104. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/coverage.py +0 -0
  105. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/documents.py +0 -0
  106. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/filesystem.py +0 -0
  107. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/identity.py +0 -0
  108. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/lifecycle.py +0 -0
  109. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/promotion.py +0 -0
  110. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/references.py +0 -0
  111. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/reservations.py +0 -0
  112. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/structure.py +0 -0
  113. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/validators/tiers.py +0 -0
  114. {ssot_core-0.2.17.dev1 → ssot_core-0.2.17.dev2}/src/ssot_registry/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ssot-core
3
- Version: 0.2.17.dev1
3
+ Version: 0.2.17.dev2
4
4
  Summary: Core Python runtime, registry model, validation, and release workflow APIs for SSOT.
5
5
  Author-email: Jacob Stewart <jacob@swarmauri.com>
6
6
  License-Expression: Apache-2.0
@@ -35,8 +35,8 @@ Classifier: Topic :: Utilities
35
35
  Requires-Python: <3.14,>=3.10
36
36
  Description-Content-Type: text/markdown
37
37
  Requires-Dist: orjson<4.0,>=3.10
38
- Requires-Dist: ssot-contracts==0.2.17.dev1
39
- Requires-Dist: ssot-views==0.2.17.dev1
38
+ Requires-Dist: ssot-contracts==0.2.17.dev2
39
+ Requires-Dist: ssot-views==0.2.17.dev2
40
40
  Requires-Dist: tomli>=2.0.1; python_version < "3.11"
41
41
 
42
42
  <div align="center">
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ssot-core"
7
- version = "0.2.17.dev1"
7
+ version = "0.2.17.dev2"
8
8
  description = "Core Python runtime, registry model, validation, and release workflow APIs for SSOT."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10,<3.14"
@@ -12,8 +12,8 @@ license = "Apache-2.0"
12
12
  authors = [{ name = "Jacob Stewart", email = "jacob@swarmauri.com" }]
13
13
  dependencies = [
14
14
  "orjson>=3.10,<4.0",
15
- "ssot-contracts==0.2.17.dev1",
16
- "ssot-views==0.2.17.dev1",
15
+ "ssot-contracts==0.2.17.dev2",
16
+ "ssot-views==0.2.17.dev2",
17
17
  "tomli>=2.0.1; python_version < '3.11'",
18
18
  ]
19
19
  keywords = ["ssot", "core", "registry", "validation", "release-management", "governance", "compliance"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ssot-core
3
- Version: 0.2.17.dev1
3
+ Version: 0.2.17.dev2
4
4
  Summary: Core Python runtime, registry model, validation, and release workflow APIs for SSOT.
5
5
  Author-email: Jacob Stewart <jacob@swarmauri.com>
6
6
  License-Expression: Apache-2.0
@@ -35,8 +35,8 @@ Classifier: Topic :: Utilities
35
35
  Requires-Python: <3.14,>=3.10
36
36
  Description-Content-Type: text/markdown
37
37
  Requires-Dist: orjson<4.0,>=3.10
38
- Requires-Dist: ssot-contracts==0.2.17.dev1
39
- Requires-Dist: ssot-views==0.2.17.dev1
38
+ Requires-Dist: ssot-contracts==0.2.17.dev2
39
+ Requires-Dist: ssot-views==0.2.17.dev2
40
40
  Requires-Dist: tomli>=2.0.1; python_version < "3.11"
41
41
 
42
42
  <div align="center">
@@ -1,6 +1,6 @@
1
1
  orjson<4.0,>=3.10
2
- ssot-contracts==0.2.17.dev1
3
- ssot-views==0.2.17.dev1
2
+ ssot-contracts==0.2.17.dev2
3
+ ssot-views==0.2.17.dev2
4
4
 
5
5
  [:python_version < "3.11"]
6
6
  tomli>=2.0.1
@@ -33,6 +33,7 @@ from ssot_registry.util.document_io import (
33
33
  build_document_payload,
34
34
  document_body_from_payload,
35
35
  dump_document_text,
36
+ load_document_text,
36
37
  load_document_yaml,
37
38
  normalize_document_payload,
38
39
  validate_document_payload,
@@ -686,7 +687,16 @@ def _sync_manifest_document(
686
687
  or (kind == "spec" and current.get("adr_ids") != expected_row["adr_ids"])
687
688
  )
688
689
  if needs_write:
689
- target.write_bytes(payload)
690
+ authored_payload = normalize_document_payload(
691
+ kind,
692
+ load_document_text(payload.decode("utf-8-sig"), source=f"packaged:{manifest_entry['filename']}"),
693
+ )
694
+ rendered = dump_document_text(
695
+ build_document_payload(kind, expected_row, document_body_from_payload(kind, authored_payload)),
696
+ target,
697
+ )
698
+ target.write_text(rendered, encoding="utf-8", newline="\n")
699
+ expected_row["content_sha256"] = sha256_normalized_text_path(target)
690
700
  current.clear()
691
701
  current.update(expected_row)
692
702
  return "updated", document_id
@@ -408,8 +408,7 @@ class _YamlSubsetParser:
408
408
  return value_text
409
409
 
410
410
 
411
- def load_document_yaml(path: Path) -> dict[str, Any]:
412
- text = path.read_text(encoding="utf-8")
411
+ def load_document_text(text: str, *, source: str) -> dict[str, Any]:
413
412
  stripped = text.lstrip("\ufeff").strip()
414
413
  try:
415
414
  if stripped.startswith(("{", "[")):
@@ -417,12 +416,17 @@ def load_document_yaml(path: Path) -> dict[str, Any]:
417
416
  else:
418
417
  payload = _YamlSubsetParser(text).parse()
419
418
  except (ValidationError, json.JSONDecodeError, ValueError) as exc:
420
- raise ValidationError(f"Document is not valid YAML/JSON content: {path.as_posix()}") from exc
419
+ raise ValidationError(f"Document is not valid YAML/JSON content: {source}") from exc
421
420
  if not isinstance(payload, dict):
422
- raise ValidationError(f"Document payload must be an object: {path.as_posix()}")
421
+ raise ValidationError(f"Document payload must be an object: {source}")
423
422
  return payload
424
423
 
425
424
 
425
+ def load_document_yaml(path: Path) -> dict[str, Any]:
426
+ text = path.read_text(encoding="utf-8-sig")
427
+ return load_document_text(text, source=path.as_posix())
428
+
429
+
426
430
  def _load_document_schema(kind: str) -> dict[str, Any]:
427
431
  if kind not in _DOCUMENT_SCHEMA_CACHE:
428
432
  schema_name = "adr.schema.json" if kind == "adr" else "spec.schema.json"