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.
- {docassert-0.8.0/docassert.egg-info → docassert-0.8.1}/PKG-INFO +1 -1
- {docassert-0.8.0 → docassert-0.8.1}/docassert/__init__.py +1 -1
- {docassert-0.8.0 → docassert-0.8.1}/docassert/bridge/gh.py +5 -1
- {docassert-0.8.0 → docassert-0.8.1/docassert.egg-info}/PKG-INFO +1 -1
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_bridge.py +28 -3
- {docassert-0.8.0 → docassert-0.8.1}/LICENSE +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/NOTICE +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/README.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/__main__.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/consistency.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/adr.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/benefits-realization.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/brd.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/business-case.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/charter.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/data-migration-plan.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/frnfr.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/hypercare-plan.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/post-implementation-review.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/prd.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/project.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/qa-test-plan.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/raci-stakeholder.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/release-cutover-plan.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/risk-register.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/rollback-plan.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/runbook.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/status-report.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/test-cases.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/user-story.criteria.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/profiles/agile-delivery.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/profiles/lean-startup.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/profiles/regulated-industry.yaml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/adr.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/benefits-realization.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/brd.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/business-case.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/charter.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/data-migration-plan.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/frnfr.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/hypercare-plan.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/post-implementation-review.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/prd.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/project.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/qa-test-plan.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/raci-stakeholder.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/release-cutover-plan.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/risk-register.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/rollback-plan.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/runbook.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/status-report.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/test-cases.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/user-story.schema.json +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/skills/doc-to-pmo/SKILL.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/adr.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/benefits-realization.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/brd.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/business-case.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/charter.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/data-migration-plan.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/frnfr.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/hypercare-plan.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/post-implementation-review.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/prd.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/project.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/qa-test-plan.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/raci-stakeholder.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/release-cutover-plan.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/risk-register.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/rollback-plan.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/runbook.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/status-report.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/test-cases.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/user-story.template.md +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/bridge/__init__.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/bridge/ops.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/bridge/plan.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/cli.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/config.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/consistency.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/extract.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/graph.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/loader.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/models.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/profiles.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/projects.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/report.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/rtm.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/scaffold.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/semantic.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/status/__init__.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/status/derive.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/status/render.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert/structural.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/SOURCES.txt +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/dependency_links.txt +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/entry_points.txt +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/requires.txt +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/docassert.egg-info/top_level.txt +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/pyproject.toml +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/setup.cfg +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_badge.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_config.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_consistency.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_defects.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_draft_relaxation.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_extract.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_graph.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_json_report.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_kinds_delivery.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_kinds_governance.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_kinds_operate.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_kinds_reporting.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_profiles.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_projects.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_scaffold.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_status.py +0 -0
- {docassert-0.8.0 → docassert-0.8.1}/tests/test_structural.py +0 -0
|
@@ -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
|
-
|
|
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
|
|
@@ -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
|
|
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
|
{docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/benefits-realization.criteria.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/data-migration-plan.criteria.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{docassert-0.8.0 → docassert-0.8.1}/docassert/_data/criteria/release-cutover-plan.criteria.yaml
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{docassert-0.8.0 → docassert-0.8.1}/docassert/_data/schema/post-implementation-review.schema.json
RENAMED
|
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
|
{docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/benefits-realization.template.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/data-migration-plan.template.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/post-implementation-review.template.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{docassert-0.8.0 → docassert-0.8.1}/docassert/_data/templates/release-cutover-plan.template.md
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|