probe_scraper/parsers/pings.py (34 lines of code) (raw):
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from pathlib import Path
from glean_parser.parser import parse_objects
from .utils import get_source_url
PING_NAME_NORMALIZATION = {
"deletion_request": "deletion-request",
"bookmarks_sync": "bookmarks-sync",
"history_sync": "history-sync",
"session_end": "session-end",
}
def normalize_ping_name(name):
return PING_NAME_NORMALIZATION.get(name, name)
def generate_definition(ping_data, repo_url, commit_hash):
serialized = ping_data.serialize()
if repo_url and commit_hash:
serialized["source_url"] = get_source_url(
serialized["defined_in"], repo_url, commit_hash
)
# the 'defined_in' structure is no longer needed
del serialized["defined_in"]
return serialized
class GleanPingsParser:
"""
Use the [Glean Parser]
(https://mozilla.github.io/glean_parser)
to parse the pings.yaml files.
"""
def parse(self, filenames, config, repo_url=None, commit_hash=None):
config = config.copy()
paths = [Path(fname) for fname in filenames]
paths = [path for path in paths if path.is_file()]
results = parse_objects(paths, config)
errors = [err for err in results]
pings = {
normalize_ping_name(ping_name): generate_definition(
ping_data, repo_url, commit_hash
)
for category, pings in results.value.items()
for ping_name, ping_data in pings.items()
}
return pings, errors