Release v0.1.16
This commit is contained in:
@@ -128,6 +128,13 @@ def main() -> int:
|
||||
manifest=manifest,
|
||||
)
|
||||
)
|
||||
errors.extend(
|
||||
_information_governance_evidence_errors(
|
||||
repository_name=repository_name,
|
||||
repository_root=repository_root,
|
||||
manifest=manifest,
|
||||
)
|
||||
)
|
||||
|
||||
manifests.append(manifest)
|
||||
|
||||
@@ -153,6 +160,20 @@ def main() -> int:
|
||||
f"Architecture declaration coverage: {declared}/{len(manifests)} modules "
|
||||
f"({(declared / len(manifests) * 100):.1f}%)."
|
||||
)
|
||||
governance_counts: dict[str, int] = {}
|
||||
for manifest in manifests:
|
||||
for dimension in manifest.information_governance.dimensions.values():
|
||||
governance_counts[dimension.adoption] = (
|
||||
governance_counts.get(dimension.adoption, 0) + 1
|
||||
)
|
||||
print(
|
||||
"Information-governance adoption: "
|
||||
+ ", ".join(
|
||||
f"{status}={count}"
|
||||
for status, count in sorted(governance_counts.items())
|
||||
)
|
||||
+ "."
|
||||
)
|
||||
return 0
|
||||
|
||||
|
||||
@@ -201,6 +222,39 @@ def _architecture_evidence_errors(
|
||||
return errors
|
||||
|
||||
|
||||
def _information_governance_evidence_errors(
|
||||
*,
|
||||
repository_name: str,
|
||||
repository_root: Path,
|
||||
manifest: object,
|
||||
) -> list[str]:
|
||||
declaration = getattr(manifest, "information_governance", None)
|
||||
if declaration is None:
|
||||
return [
|
||||
f"{repository_name}: module has no information-governance declaration"
|
||||
]
|
||||
errors: list[str] = []
|
||||
for dimension_name, dimension in declaration.dimensions.items():
|
||||
for reference in dimension.evidence:
|
||||
if not _looks_like_repository_reference(reference):
|
||||
continue
|
||||
candidate = (repository_root / reference).resolve()
|
||||
try:
|
||||
candidate.relative_to(repository_root.resolve())
|
||||
except ValueError:
|
||||
errors.append(
|
||||
f"{repository_name}: {dimension_name} evidence escapes the "
|
||||
f"repository: {reference!r}"
|
||||
)
|
||||
continue
|
||||
if not candidate.exists():
|
||||
errors.append(
|
||||
f"{repository_name}: {dimension_name} evidence does not exist: "
|
||||
f"{reference!r}"
|
||||
)
|
||||
return errors
|
||||
|
||||
|
||||
def _looks_like_repository_reference(reference: str) -> bool:
|
||||
normalized = reference.strip()
|
||||
if not normalized or "://" in normalized:
|
||||
|
||||
Reference in New Issue
Block a user