docassert 0.16.0__tar.gz → 0.17.0__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 (125) hide show
  1. {docassert-0.16.0/docassert.egg-info → docassert-0.17.0}/PKG-INFO +3 -1
  2. {docassert-0.16.0 → docassert-0.17.0}/README.md +2 -0
  3. {docassert-0.16.0 → docassert-0.17.0}/docassert/__init__.py +1 -1
  4. {docassert-0.16.0 → docassert-0.17.0/docassert.egg-info}/PKG-INFO +3 -1
  5. {docassert-0.16.0 → docassert-0.17.0}/docassert.egg-info/SOURCES.txt +1 -0
  6. {docassert-0.16.0 → docassert-0.17.0}/pyproject.toml +1 -1
  7. docassert-0.17.0/tests/test_report_extract.py +70 -0
  8. {docassert-0.16.0 → docassert-0.17.0}/LICENSE +0 -0
  9. {docassert-0.16.0 → docassert-0.17.0}/NOTICE +0 -0
  10. {docassert-0.16.0 → docassert-0.17.0}/docassert/__main__.py +0 -0
  11. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/consistency.yaml +0 -0
  12. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/adr.criteria.yaml +0 -0
  13. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/benefits-realization.criteria.yaml +0 -0
  14. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/brd.criteria.yaml +0 -0
  15. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/business-case.criteria.yaml +0 -0
  16. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/charter.criteria.yaml +0 -0
  17. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/data-migration-plan.criteria.yaml +0 -0
  18. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/frnfr.criteria.yaml +0 -0
  19. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/hypercare-plan.criteria.yaml +0 -0
  20. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/operations.criteria.yaml +0 -0
  21. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/post-implementation-review.criteria.yaml +0 -0
  22. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/prd.criteria.yaml +0 -0
  23. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/project.criteria.yaml +0 -0
  24. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/qa-test-plan.criteria.yaml +0 -0
  25. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/raci-stakeholder.criteria.yaml +0 -0
  26. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/release-cutover-plan.criteria.yaml +0 -0
  27. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/risk-register.criteria.yaml +0 -0
  28. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/rollback-plan.criteria.yaml +0 -0
  29. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/runbook.criteria.yaml +0 -0
  30. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/status-report.criteria.yaml +0 -0
  31. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/test-cases.criteria.yaml +0 -0
  32. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/criteria/user-story.criteria.yaml +0 -0
  33. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/profiles/agile-delivery.yaml +0 -0
  34. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/profiles/lean-startup.yaml +0 -0
  35. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/profiles/operations.yaml +0 -0
  36. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/profiles/regulated-industry.yaml +0 -0
  37. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/adr.schema.json +0 -0
  38. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/benefits-realization.schema.json +0 -0
  39. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/brd.schema.json +0 -0
  40. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/business-case.schema.json +0 -0
  41. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/charter.schema.json +0 -0
  42. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/data-migration-plan.schema.json +0 -0
  43. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/frnfr.schema.json +0 -0
  44. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/hypercare-plan.schema.json +0 -0
  45. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/operations.schema.json +0 -0
  46. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/post-implementation-review.schema.json +0 -0
  47. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/prd.schema.json +0 -0
  48. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/project.schema.json +0 -0
  49. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/qa-test-plan.schema.json +0 -0
  50. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/raci-stakeholder.schema.json +0 -0
  51. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/release-cutover-plan.schema.json +0 -0
  52. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/risk-register.schema.json +0 -0
  53. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/rollback-plan.schema.json +0 -0
  54. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/runbook.schema.json +0 -0
  55. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/status-report.schema.json +0 -0
  56. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/test-cases.schema.json +0 -0
  57. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/schema/user-story.schema.json +0 -0
  58. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/skills/doc-to-pmo/SKILL.md +0 -0
  59. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/adr.template.md +0 -0
  60. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/benefits-realization.template.md +0 -0
  61. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/brd.template.md +0 -0
  62. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/business-case.template.md +0 -0
  63. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/charter.template.md +0 -0
  64. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/data-migration-plan.template.md +0 -0
  65. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/frnfr.template.md +0 -0
  66. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/hypercare-plan.template.md +0 -0
  67. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/operations.template.md +0 -0
  68. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/post-implementation-review.template.md +0 -0
  69. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/prd.template.md +0 -0
  70. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/project.template.md +0 -0
  71. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/qa-test-plan.template.md +0 -0
  72. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/raci-stakeholder.template.md +0 -0
  73. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/release-cutover-plan.template.md +0 -0
  74. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/risk-register.template.md +0 -0
  75. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/rollback-plan.template.md +0 -0
  76. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/runbook.template.md +0 -0
  77. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/status-report.template.md +0 -0
  78. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/test-cases.template.md +0 -0
  79. {docassert-0.16.0 → docassert-0.17.0}/docassert/_data/templates/user-story.template.md +0 -0
  80. {docassert-0.16.0 → docassert-0.17.0}/docassert/bridge/__init__.py +0 -0
  81. {docassert-0.16.0 → docassert-0.17.0}/docassert/bridge/board.py +0 -0
  82. {docassert-0.16.0 → docassert-0.17.0}/docassert/bridge/gh.py +0 -0
  83. {docassert-0.16.0 → docassert-0.17.0}/docassert/bridge/ops.py +0 -0
  84. {docassert-0.16.0 → docassert-0.17.0}/docassert/bridge/plan.py +0 -0
  85. {docassert-0.16.0 → docassert-0.17.0}/docassert/cli.py +0 -0
  86. {docassert-0.16.0 → docassert-0.17.0}/docassert/config.py +0 -0
  87. {docassert-0.16.0 → docassert-0.17.0}/docassert/consistency.py +0 -0
  88. {docassert-0.16.0 → docassert-0.17.0}/docassert/extract.py +0 -0
  89. {docassert-0.16.0 → docassert-0.17.0}/docassert/graph.py +0 -0
  90. {docassert-0.16.0 → docassert-0.17.0}/docassert/loader.py +0 -0
  91. {docassert-0.16.0 → docassert-0.17.0}/docassert/models.py +0 -0
  92. {docassert-0.16.0 → docassert-0.17.0}/docassert/profiles.py +0 -0
  93. {docassert-0.16.0 → docassert-0.17.0}/docassert/projects.py +0 -0
  94. {docassert-0.16.0 → docassert-0.17.0}/docassert/report.py +0 -0
  95. {docassert-0.16.0 → docassert-0.17.0}/docassert/rtm.py +0 -0
  96. {docassert-0.16.0 → docassert-0.17.0}/docassert/scaffold.py +0 -0
  97. {docassert-0.16.0 → docassert-0.17.0}/docassert/semantic.py +0 -0
  98. {docassert-0.16.0 → docassert-0.17.0}/docassert/status/__init__.py +0 -0
  99. {docassert-0.16.0 → docassert-0.17.0}/docassert/status/derive.py +0 -0
  100. {docassert-0.16.0 → docassert-0.17.0}/docassert/status/render.py +0 -0
  101. {docassert-0.16.0 → docassert-0.17.0}/docassert/structural.py +0 -0
  102. {docassert-0.16.0 → docassert-0.17.0}/docassert.egg-info/dependency_links.txt +0 -0
  103. {docassert-0.16.0 → docassert-0.17.0}/docassert.egg-info/entry_points.txt +0 -0
  104. {docassert-0.16.0 → docassert-0.17.0}/docassert.egg-info/requires.txt +0 -0
  105. {docassert-0.16.0 → docassert-0.17.0}/docassert.egg-info/top_level.txt +0 -0
  106. {docassert-0.16.0 → docassert-0.17.0}/setup.cfg +0 -0
  107. {docassert-0.16.0 → docassert-0.17.0}/tests/test_badge.py +0 -0
  108. {docassert-0.16.0 → docassert-0.17.0}/tests/test_bridge.py +0 -0
  109. {docassert-0.16.0 → docassert-0.17.0}/tests/test_config.py +0 -0
  110. {docassert-0.16.0 → docassert-0.17.0}/tests/test_consistency.py +0 -0
  111. {docassert-0.16.0 → docassert-0.17.0}/tests/test_defects.py +0 -0
  112. {docassert-0.16.0 → docassert-0.17.0}/tests/test_draft_relaxation.py +0 -0
  113. {docassert-0.16.0 → docassert-0.17.0}/tests/test_extract.py +0 -0
  114. {docassert-0.16.0 → docassert-0.17.0}/tests/test_graph.py +0 -0
  115. {docassert-0.16.0 → docassert-0.17.0}/tests/test_json_report.py +0 -0
  116. {docassert-0.16.0 → docassert-0.17.0}/tests/test_kinds_delivery.py +0 -0
  117. {docassert-0.16.0 → docassert-0.17.0}/tests/test_kinds_governance.py +0 -0
  118. {docassert-0.16.0 → docassert-0.17.0}/tests/test_kinds_operate.py +0 -0
  119. {docassert-0.16.0 → docassert-0.17.0}/tests/test_kinds_reporting.py +0 -0
  120. {docassert-0.16.0 → docassert-0.17.0}/tests/test_profiles.py +0 -0
  121. {docassert-0.16.0 → docassert-0.17.0}/tests/test_projects.py +0 -0
  122. {docassert-0.16.0 → docassert-0.17.0}/tests/test_scaffold.py +0 -0
  123. {docassert-0.16.0 → docassert-0.17.0}/tests/test_semantic.py +0 -0
  124. {docassert-0.16.0 → docassert-0.17.0}/tests/test_status.py +0 -0
  125. {docassert-0.16.0 → docassert-0.17.0}/tests/test_structural.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docassert
3
- Version: 0.16.0
3
+ Version: 0.17.0
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
@@ -102,6 +102,8 @@ flagged as TODOs, never invented). The skill's source is
102
102
  | `docassert extract <file>` | Extract plain text from a source `.docx` / `.pdf` / `.md` / `.txt` (the first step of doc-to-pmo conversion). Needs the `convert` extra: `pip install "docassert[convert]"`. |
103
103
 
104
104
  Every document-reading command accepts `--documents-dir` (default `documents/`).
105
+ The full flag-by-flag reference, and what 1.x does and does not promise to
106
+ keep stable, live in [STABILITY.md](STABILITY.md).
105
107
  AI alignment grades at most `alignment_limit` links per run (default 25; set it
106
108
  in `consistency.yaml`, `0` = no cap) so API cost stays bounded on large graphs.
107
109
 
@@ -62,6 +62,8 @@ flagged as TODOs, never invented). The skill's source is
62
62
  | `docassert extract <file>` | Extract plain text from a source `.docx` / `.pdf` / `.md` / `.txt` (the first step of doc-to-pmo conversion). Needs the `convert` extra: `pip install "docassert[convert]"`. |
63
63
 
64
64
  Every document-reading command accepts `--documents-dir` (default `documents/`).
65
+ The full flag-by-flag reference, and what 1.x does and does not promise to
66
+ keep stable, live in [STABILITY.md](STABILITY.md).
65
67
  AI alignment grades at most `alignment_limit` links per run (default 25; set it
66
68
  in `consistency.yaml`, `0` = no cap) so API cost stays bounded on large graphs.
67
69
 
@@ -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.16.0"
8
+ __version__ = "0.17.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docassert
3
- Version: 0.16.0
3
+ Version: 0.17.0
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
@@ -102,6 +102,8 @@ flagged as TODOs, never invented). The skill's source is
102
102
  | `docassert extract <file>` | Extract plain text from a source `.docx` / `.pdf` / `.md` / `.txt` (the first step of doc-to-pmo conversion). Needs the `convert` extra: `pip install "docassert[convert]"`. |
103
103
 
104
104
  Every document-reading command accepts `--documents-dir` (default `documents/`).
105
+ The full flag-by-flag reference, and what 1.x does and does not promise to
106
+ keep stable, live in [STABILITY.md](STABILITY.md).
105
107
  AI alignment grades at most `alignment_limit` links per run (default 25; set it
106
108
  in `consistency.yaml`, `0` = no cap) so API cost stays bounded on large graphs.
107
109
 
@@ -116,6 +116,7 @@ tests/test_kinds_operate.py
116
116
  tests/test_kinds_reporting.py
117
117
  tests/test_profiles.py
118
118
  tests/test_projects.py
119
+ tests/test_report_extract.py
119
120
  tests/test_scaffold.py
120
121
  tests/test_semantic.py
121
122
  tests/test_status.py
@@ -85,4 +85,4 @@ source = ["docassert"]
85
85
 
86
86
  [tool.coverage.report]
87
87
  # Keep the gate honest: fail CI if coverage drops below the floor.
88
- fail_under = 80
88
+ fail_under = 85
@@ -0,0 +1,70 @@
1
+ """Coverage for the report renderers, extraction text paths, and the module
2
+ entry point — the last stretch to the 85% floor (ENG-US-009)."""
3
+ import runpy
4
+
5
+ import pytest
6
+
7
+ from docassert import report
8
+ from docassert.extract import extract
9
+ from docassert.models import CheckResult
10
+
11
+
12
+ def _results():
13
+ return {
14
+ "documents/a.md": [
15
+ CheckResult("frontmatter-schema", True, True, "ok"),
16
+ CheckResult("required-sections", False, True, "missing: Scope"),
17
+ CheckResult("alignment", False, False, "weak link", kind="semantic",
18
+ score=0.4),
19
+ ],
20
+ "documents/b.md": [CheckResult("unique-id", True, True, "unique")],
21
+ }
22
+
23
+
24
+ def test_markdown_report_carries_verdicts():
25
+ md = report.markdown(_results())
26
+ assert "a.md" in md and "required-sections" in md
27
+ assert "🔴" in md and "🟢" in md and "⚪" not in md.split("alignment")[0]
28
+
29
+
30
+ def test_junit_report_is_valid_xml_with_failures():
31
+ import xml.etree.ElementTree as ET
32
+ xml = report.junit(_results())
33
+ root = ET.fromstring(xml)
34
+ assert root.tag in {"testsuite", "testsuites"}
35
+ assert int(root.get("failures", root.get("errors", "0"))) >= 1 or \
36
+ any(int(s.get("failures", "0")) >= 1 for s in root.iter("testsuite"))
37
+
38
+
39
+ def test_json_console_and_summary_agree_on_failure():
40
+ res = _results()
41
+ assert "1 blocking failure" in report.summary_line(res) \
42
+ or "blocking" in report.summary_line(res)
43
+ assert "required-sections" in report.console(res)
44
+ assert '"passed": false' in report.json_report(res)
45
+
46
+
47
+ def test_extract_reads_md_and_txt(tmp_path):
48
+ md = tmp_path / "s.md"
49
+ md.write_text("# hello", encoding="utf-8")
50
+ txt = tmp_path / "s.txt"
51
+ txt.write_text("plain", encoding="utf-8")
52
+ assert extract(md) == "# hello"
53
+ assert extract(txt) == "plain"
54
+
55
+
56
+ def test_extract_rejects_unknown_and_missing(tmp_path):
57
+ odd = tmp_path / "s.xyz"
58
+ odd.write_text("x", encoding="utf-8")
59
+ with pytest.raises(ValueError):
60
+ extract(odd)
61
+ with pytest.raises(FileNotFoundError):
62
+ extract(tmp_path / "absent.md")
63
+
64
+
65
+ def test_module_entry_point_reports_version(capsys, monkeypatch):
66
+ monkeypatch.setattr("sys.argv", ["docassert", "--version"])
67
+ with pytest.raises(SystemExit) as exc:
68
+ runpy.run_module("docassert.__main__", run_name="__main__")
69
+ assert exc.value.code == 0
70
+ assert "docassert" in capsys.readouterr().out
File without changes
File without changes
File without changes
File without changes
File without changes