feat(consent-tester): Phase B — named CMP library + plugin architecture
cmp_extractor.py refactored to thin coordinator (123 LOC, was 223). Discovers all CMP modules via cmp_library/_registry.py:load_all() at import time. Restart consent-tester to pick up new modules. New cmp_library/ folder: - _registry.py: auto-discovers all modules with MATCHER + reconstruct() - epaas.py: BMW Group ePaaS (extracted from cmp_extractor) - onetrust.py: cdn.cookielaw.org Groups/Cookies schema - cookiebot.py: consent.cookiebot.com Categories schema - usercentrics.py: api.usercentrics.eu services schema - didomi.py: sdk.privacy-center.org notice + vendors + purposes - trustarc.py: consent.trustarc.com categories + vendors Each module: - MATCHER: re.Pattern matching the CMP JSON endpoint URL - reconstruct(d: dict) -> str: builds German Markdown cookie-policy text Phase E (self-improving) will write auto_*.py files into the same folder; _registry already picks those up via pkgutil.iter_modules.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
"""Didomi CMP.
|
||||
|
||||
URLs:
|
||||
- sdk.privacy-center.org/<id>/notice/<lang>.json
|
||||
- api.privacy-center.org/v1/notices/...
|
||||
Schema: app.vendors[], app.purposes[], notice texts
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
MATCHER = re.compile(
|
||||
r"(?:sdk|api)\.privacy-center\.org/.+/notice[s]?/.*\.json(?:\?|$)", re.I,
|
||||
)
|
||||
|
||||
|
||||
def reconstruct(d: dict) -> str:
|
||||
parts: list[str] = ["# Cookie-Richtlinie (Didomi)"]
|
||||
|
||||
app = d.get("app", d) or {}
|
||||
notice = d.get("notice", {}) or app.get("notice", {}) or {}
|
||||
for key in ("content", "title", "subtitle"):
|
||||
v = notice.get(key)
|
||||
if v:
|
||||
parts.append("")
|
||||
parts.append(str(v))
|
||||
|
||||
purposes = app.get("purposes") or d.get("purposes") or []
|
||||
if purposes:
|
||||
parts.append("")
|
||||
parts.append("## Zwecke")
|
||||
for p in purposes:
|
||||
name = p.get("name") or p.get("id") or ""
|
||||
desc = p.get("description") or ""
|
||||
parts.append(f"- {name}: {desc[:200]}")
|
||||
|
||||
vendors = app.get("vendors") or d.get("vendors") or []
|
||||
if vendors:
|
||||
parts.append("")
|
||||
parts.append(f"## Anbieter ({len(vendors)})")
|
||||
for v in vendors[:80]:
|
||||
name = v.get("name") or ""
|
||||
country = v.get("country") or ""
|
||||
policy = v.get("policyUrl") or ""
|
||||
line = f"- {name}"
|
||||
if country:
|
||||
line += f" — Sitz: {country}"
|
||||
if policy:
|
||||
line += f" — Datenschutz: {policy}"
|
||||
parts.append(line)
|
||||
|
||||
return "\n".join(parts)
|
||||
Reference in New Issue
Block a user