docassert 0.8.0__tar.gz → 0.8.1__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 (118) hide show
  1. {docassert-0.8.0/docassert.egg-info → docassert-0.8.1}/PKG-INFO +1 -1
  2. {docassert-0.8.0 → docassert-0.8.1}/docassert/__init__.py +1 -1
  3. {docassert-0.8.0 → docassert-0.8.1}/docassert/bridge/gh.py +5 -1
  4. {docassert-0.8.0 → docassert-0.8.1/docassert.egg-info}/PKG-INFO +1 -1
  5. {docassert-0.8.0 → docassert-0.8.1}/tests/test_bridge.py +28 -3
  6. {docassert-0.8.0 → docassert-0.8.1}/LICENSE +0 -0
  7. {docassert-0.8.0 → docassert-0.8.1}/NOTICE +0 -0
  8. {docassert-0.8.0 → docassert-0.8.1}/README.md +0 -0
  9. {docassert-0.8.0 → docassert-0.8.1}/docassert/__main__.py +0 -0
  10. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/consistency.yaml +0 -0
  11. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/adr.criteria.yaml +0 -0
  12. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/benefits-realization.criteria.yaml +0 -0
  13. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/brd.criteria.yaml +0 -0
  14. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/business-case.criteria.yaml +0 -0
  15. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/charter.criteria.yaml +0 -0
  16. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/data-migration-plan.criteria.yaml +0 -0
  17. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/frnfr.criteria.yaml +0 -0
  18. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/hypercare-plan.criteria.yaml +0 -0
  19. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/post-implementation-review.criteria.yaml +0 -0
  20. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/prd.criteria.yaml +0 -0
  21. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/project.criteria.yaml +0 -0
  22. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/qa-test-plan.criteria.yaml +0 -0
  23. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/raci-stakeholder.criteria.yaml +0 -0
  24. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/release-cutover-plan.criteria.yaml +0 -0
  25. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/risk-register.criteria.yaml +0 -0
  26. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/rollback-plan.criteria.yaml +0 -0
  27. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/runbook.criteria.yaml +0 -0
  28. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/status-report.criteria.yaml +0 -0
  29. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/test-cases.criteria.yaml +0 -0
  30. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/user-story.criteria.yaml +0 -0
  31. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/profiles/agile-delivery.yaml +0 -0
  32. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/profiles/lean-startup.yaml +0 -0
  33. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/profiles/regulated-industry.yaml +0 -0
  34. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/adr.schema.json +0 -0
  35. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/benefits-realization.schema.json +0 -0
  36. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/brd.schema.json +0 -0
  37. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/business-case.schema.json +0 -0
  38. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/charter.schema.json +0 -0
  39. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/data-migration-plan.schema.json +0 -0
  40. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/frnfr.schema.json +0 -0
  41. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/hypercare-plan.schema.json +0 -0
  42. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/post-implementation-review.schema.json +0 -0
  43. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/prd.schema.json +0 -0
  44. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/project.schema.json +0 -0
  45. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/qa-test-plan.schema.json +0 -0
  46. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/raci-stakeholder.schema.json +0 -0
  47. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/release-cutover-plan.schema.json +0 -0
  48. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/risk-register.schema.json +0 -0
  49. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/rollback-plan.schema.json +0 -0
  50. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/runbook.schema.json +0 -0
  51. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/status-report.schema.json +0 -0
  52. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/test-cases.schema.json +0 -0
  53. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/user-story.schema.json +0 -0
  54. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/skills/doc-to-pmo/SKILL.md +0 -0
  55. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/adr.template.md +0 -0
  56. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/benefits-realization.template.md +0 -0
  57. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/brd.template.md +0 -0
  58. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/business-case.template.md +0 -0
  59. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/charter.template.md +0 -0
  60. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/data-migration-plan.template.md +0 -0
  61. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/frnfr.template.md +0 -0
  62. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/hypercare-plan.template.md +0 -0
  63. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/post-implementation-review.template.md +0 -0
  64. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/prd.template.md +0 -0
  65. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/project.template.md +0 -0
  66. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/qa-test-plan.template.md +0 -0
  67. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/raci-stakeholder.template.md +0 -0
  68. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/release-cutover-plan.template.md +0 -0
  69. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/risk-register.template.md +0 -0
  70. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/rollback-plan.template.md +0 -0
  71. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/runbook.template.md +0 -0
  72. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/status-report.template.md +0 -0
  73. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/test-cases.template.md +0 -0
  74. {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/user-story.template.md +0 -0
  75. {docassert-0.8.0 → docassert-0.8.1}/docassert/bridge/__init__.py +0 -0
  76. {docassert-0.8.0 → docassert-0.8.1}/docassert/bridge/ops.py +0 -0
  77. {docassert-0.8.0 → docassert-0.8.1}/docassert/bridge/plan.py +0 -0
  78. {docassert-0.8.0 → docassert-0.8.1}/docassert/cli.py +0 -0
  79. {docassert-0.8.0 → docassert-0.8.1}/docassert/config.py +0 -0
  80. {docassert-0.8.0 → docassert-0.8.1}/docassert/consistency.py +0 -0
  81. {docassert-0.8.0 → docassert-0.8.1}/docassert/extract.py +0 -0
  82. {docassert-0.8.0 → docassert-0.8.1}/docassert/graph.py +0 -0
  83. {docassert-0.8.0 → docassert-0.8.1}/docassert/loader.py +0 -0
  84. {docassert-0.8.0 → docassert-0.8.1}/docassert/models.py +0 -0
  85. {docassert-0.8.0 → docassert-0.8.1}/docassert/profiles.py +0 -0
  86. {docassert-0.8.0 → docassert-0.8.1}/docassert/projects.py +0 -0
  87. {docassert-0.8.0 → docassert-0.8.1}/docassert/report.py +0 -0
  88. {docassert-0.8.0 → docassert-0.8.1}/docassert/rtm.py +0 -0
  89. {docassert-0.8.0 → docassert-0.8.1}/docassert/scaffold.py +0 -0
  90. {docassert-0.8.0 → docassert-0.8.1}/docassert/semantic.py +0 -0
  91. {docassert-0.8.0 → docassert-0.8.1}/docassert/status/__init__.py +0 -0
  92. {docassert-0.8.0 → docassert-0.8.1}/docassert/status/derive.py +0 -0
  93. {docassert-0.8.0 → docassert-0.8.1}/docassert/status/render.py +0 -0
  94. {docassert-0.8.0 → docassert-0.8.1}/docassert/structural.py +0 -0
  95. {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/SOURCES.txt +0 -0
  96. {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/dependency_links.txt +0 -0
  97. {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/entry_points.txt +0 -0
  98. {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/requires.txt +0 -0
  99. {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/top_level.txt +0 -0
  100. {docassert-0.8.0 → docassert-0.8.1}/pyproject.toml +0 -0
  101. {docassert-0.8.0 → docassert-0.8.1}/setup.cfg +0 -0
  102. {docassert-0.8.0 → docassert-0.8.1}/tests/test_badge.py +0 -0
  103. {docassert-0.8.0 → docassert-0.8.1}/tests/test_config.py +0 -0
  104. {docassert-0.8.0 → docassert-0.8.1}/tests/test_consistency.py +0 -0
  105. {docassert-0.8.0 → docassert-0.8.1}/tests/test_defects.py +0 -0
  106. {docassert-0.8.0 → docassert-0.8.1}/tests/test_draft_relaxation.py +0 -0
  107. {docassert-0.8.0 → docassert-0.8.1}/tests/test_extract.py +0 -0
  108. {docassert-0.8.0 → docassert-0.8.1}/tests/test_graph.py +0 -0
  109. {docassert-0.8.0 → docassert-0.8.1}/tests/test_json_report.py +0 -0
  110. {docassert-0.8.0 → docassert-0.8.1}/tests/test_kinds_delivery.py +0 -0
  111. {docassert-0.8.0 → docassert-0.8.1}/tests/test_kinds_governance.py +0 -0
  112. {docassert-0.8.0 → docassert-0.8.1}/tests/test_kinds_operate.py +0 -0
  113. {docassert-0.8.0 → docassert-0.8.1}/tests/test_kinds_reporting.py +0 -0
  114. {docassert-0.8.0 → docassert-0.8.1}/tests/test_profiles.py +0 -0
  115. {docassert-0.8.0 → docassert-0.8.1}/tests/test_projects.py +0 -0
  116. {docassert-0.8.0 → docassert-0.8.1}/tests/test_scaffold.py +0 -0
  117. {docassert-0.8.0 → docassert-0.8.1}/tests/test_status.py +0 -0
  118. {docassert-0.8.0 → docassert-0.8.1}/tests/test_structural.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docassert
3
- Version: 0.8.0
3
+ Version: 0.8.1
4
4
  Summary: Unit testing for business documents — validate structured Markdown docs against a configurable audit standard.
5
5
  Author: C4G Enterprises Inc.
6
6
  License: Apache-2.0
@@ -5,4 +5,4 @@ standard: deterministic structural checks that gate a merge, plus optional
5
5
  AI-graded semantic checks that advise.
6
6
  """
7
7
 
8
- __version__ = "0.8.0"
8
+ __version__ = "0.8.1"
@@ -110,5 +110,9 @@ def add_sub_issue(gh: GhRunner, parent_node: str, child_node: str) -> None:
110
110
  try:
111
111
  gh.graphql(q, p=parent_node, c=child_node)
112
112
  except GhError as exc:
113
- if "already" not in str(exc).lower(): # re-link is fine
113
+ # An existing identical link is success, not failure. GitHub words it
114
+ # several ways ("duplicate sub-issues", "may only have one parent").
115
+ msg = str(exc).lower()
116
+ if not any(s in msg for s in ("already", "duplicate sub-issue",
117
+ "only have one parent")):
114
118
  raise
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docassert
3
- Version: 0.8.0
3
+ Version: 0.8.1
4
4
  Summary: Unit testing for business documents — validate structured Markdown docs against a configurable audit standard.
5
5
  Author: C4G Enterprises Inc.
6
6
  License: Apache-2.0
@@ -153,9 +153,7 @@ def test_scaffold_creates_then_is_idempotent(tmp_path):
153
153
  gh = FakeGh()
154
154
  actions = ops.scaffold(plan, gh, "o/r")
155
155
  assert sum(1 for a in actions if a.startswith("created")) == 5 # 2 feat + 3 stories
156
- # second run against the issues the first created
157
- issues = [_mk_issue(101, "TST-PR-001", feature_title(plan.features[0]))]
158
- # simulate full existing state: everything exists with correct title/body
156
+ # second run: simulate full existing state with correct titles/bodies
159
157
  existing = []
160
158
  for i, f in enumerate(plan.features):
161
159
  e = _mk_issue(200 + i, f.id, feature_title(f))
@@ -222,3 +220,30 @@ def test_status_counts_closed_stories(tmp_path):
222
220
  assert feats["TST-PR-001"]["stories_closed"] == 1
223
221
  assert feats["TST-PR-001"]["stories_total"] == 2
224
222
  assert "1/2" in ops.render_status(data)
223
+
224
+
225
+ def test_scaffold_tolerates_existing_sub_issue_link(tmp_path):
226
+ """GitHub's duplicate-link error (observed live 2026-07-02) is success."""
227
+ from docassert.bridge.gh import GhError
228
+
229
+ class LinkedGh(FakeGh):
230
+ def graphql(self, query, **vars_):
231
+ raise GhError("gh: Failed to add sub-issue #2 to parent #1. "
232
+ "Issue may not contain duplicate sub-issues and "
233
+ "Sub issue may only have one parent")
234
+
235
+ plan = build_bridge_plan(_tree(tmp_path))
236
+ gh = LinkedGh()
237
+ ops.scaffold(plan, gh, "o/r") # must not raise
238
+
239
+
240
+ def test_add_sub_issue_still_raises_on_real_errors(tmp_path):
241
+ from docassert.bridge.gh import GhError, add_sub_issue
242
+
243
+ class BoomGh(FakeGh):
244
+ def graphql(self, query, **vars_):
245
+ raise GhError("gh: Something else entirely")
246
+
247
+ import pytest
248
+ with pytest.raises(GhError):
249
+ add_sub_issue(BoomGh(), "N1", "N2")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes