diff --git a/createreadmes.py b/createreadmes.py
index 97268ed..2c7115a 100644
--- a/createreadmes.py
+++ b/createreadmes.py
@@ -4,7 +4,7 @@ import json
import itertools
import yaml
import jsonschema
-from typing import Any, List, NotRequired, Optional, TypedDict
+from typing import Any, Dict, List, Literal, NotRequired, Optional, TypedDict
import requests
try:
from yachalk import chalk
@@ -220,8 +220,10 @@ class Artifact(TypedDict):
lines: NotRequired[list[int]]
repository: NotRequired[str]
+RuleStatus = Literal["disregarded", "observed", "not applicable", "unknown"]
+
class SecurityRule(TypedDict):
- status: str
+ status: RuleStatus
argument: str | list[str]
artifacts: NotRequired[list[Artifact]]
@@ -322,7 +324,7 @@ def rule_to_string(info: ModelInformation, id: int, rule: SecurityRule | None):
return ""
argument = rule['argument']
argument = argument if isinstance(argument, str) else "".join(f"\n1. {arg}" for arg in argument)
- text = f"""#### Rule {id}: {rule_names[id]}
+ text = f"""#### Rule {id}: {rule_names[id]} {{#rule{id:02}}}
This rule is {rule['status']}: {argument}"""
artifacts = rule.get("artifacts", [])
@@ -334,8 +336,18 @@ Artifacts:
return text
def write_security_rules(info: ModelInformation, security_rules: dict[int, SecurityRule]):
+ icons: Dict[RuleStatus | str, str] = {
+ 'disregarded': '',
+ 'observed': '',
+ 'not applicable': '',
+ 'unknown': '',
+ }
return f"""## Security Rules
+{" | ".join(f"R{i}" for i in range(1, 19))}
+{" | ".join("--" for _ in range(1, 19))}
+{" | ".join(f'{icons[security_rules.get(i, {"status": "unknown"})["status"]]}' for i in range(1, 19))}
+
### Authentication / Authorization
{(chr(10)*2).join(rule_to_string(info, i, security_rules.get(i)) for i in range(1, 7))}