scripts/create-api.py (64 lines of code) (raw):

#!/usr/bin/env python import copy import json import os import re import sys from collections import defaultdict import frontmatter import yaml from constants import ANNOTATIONS_DIR STMO_QUERIES_RE = [ re.compile("(https://sql.telemetry.mozilla.org/queries/([0-9]+)[^\s\.]*)"), re.compile("(https://sql.telemetry.mozilla.org/dashboard/([A-z\-]+)[^\s\.]*)"), ] data = defaultdict(lambda: defaultdict(lambda: {})) apps = os.listdir(ANNOTATIONS_DIR) def linkify(text): """ Gives bare URLs and additional context This saves effort when writing annotations. Currently only handles STMO URLs """ for stmo_pattern in STMO_QUERIES_RE: text = stmo_pattern.sub( r"[STMO#\2](\1)🔒", text, ) return text def read_annotation(filename, annotation_type, valid_tags=None): annotation_md = frontmatter.load(filename) # use everything in the YAML frontmatter annotation = copy.copy(annotation_md.metadata) # only specify commentary if we actually have some if annotation_md.content.strip(): annotation["commentary"] = linkify(annotation_md.content) tags = annotation_md.get("tags") if tags and annotation_type != "app": invalid_tags = [tag for tag in tags if tag not in valid_tags] if invalid_tags: sys.stderr.write( f"Invalid tags found in {filename}: {invalid_tags}; " f" if these should be accepted values, update annotations/{app}/metadata.yaml" ) sys.exit(1) return annotation for app in apps: try: data[app]["app"] = read_annotation( os.path.join(ANNOTATIONS_DIR, app, "README.md"), "app" ) except FileNotFoundError: # no top-level annotation for this application pass app_dir = os.path.join(ANNOTATIONS_DIR, app) valid_tags = [] try: metadata = yaml.load(open(os.path.join(app_dir, "metadata.yaml"))) data[app].update(metadata) valid_tags = metadata.get("tags", []).keys() except: pass for annotation_type in ("metrics", "pings"): annotation_dir = os.path.join(app_dir, annotation_type) if not os.path.isdir(annotation_dir): # for some apps, we may have annotations for one annotation type # but not another continue annotation_ids = os.listdir(annotation_dir) for annotation_id in annotation_ids: data[app][annotation_type][annotation_id] = read_annotation( os.path.join(annotation_dir, annotation_id, "README.md"), annotation_type, valid_tags, ) print(json.dumps(data))