scripts/new_ping_metadata_table.py (26 lines of code) (raw):
#!/usr/bin/env python3
"""Format telemetry-ingestion metadata into a markdown table.
./scripts/new_ping_metadata_table.py > src/cookbooks/new_ping_metadata_table.md
"""
import json
import urllib.request
from typing import Any, Dict, List, Tuple
def transform(data: Dict[str, Any]) -> List[Tuple[str, str]]:
"""Transform a JSON Schema into a list of (path, description) pairs."""
# transform must start at a valid node in the schema
assert "properties" in data
# the result set
result = []
# state for breadth first traversal
queue = [([], data["properties"])]
while queue:
prefix, obj = queue.pop()
for key, sub in sorted(obj.items()):
path = prefix + [key]
if sub["type"] == "object":
queue += [(path, sub["properties"])]
else:
result += [(".".join(path), sub.get("description", "N/A"))]
return result
def printfmt(data: List[Tuple[str, str]]):
"""Print (path, description) pairs to stdout."""
print("field | description")
print("-|-")
for field, description in data:
print(f"`{field}` | {description}")
if __name__ == "__main__":
telemetry_metadata_uri = "https://raw.githubusercontent.com/mozilla-services/mozilla-pipeline-schemas/master/schemas/metadata/telemetry-ingestion/telemetry-ingestion.1.schema.json"
resp = urllib.request.urlopen(telemetry_metadata_uri)
data = json.load(resp)
printfmt(transform(data))