#!/usr/bin/env python
# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A utility for generating builder classes for UKM entries.
It takes as input a ukm.xml file describing all of the entries and metrics,
and produces a c++ header and implementation file exposing builders for those
entries and metrics.
"""
import argparse
import sys
import ukm_model
import builders_template
import decode_template
parser = argparse.ArgumentParser(description='Generate UKM entry builders')
parser.add_argument('--input', help='Path to ukm.xml')
parser.add_argument('--output', help='Path to generated files.')
def main(argv):
args = parser.parse_args()
data = ReadFilteredData(args.input)
relpath = 'services/metrics/public/cpp/'
builders_template.WriteFiles(args.output, relpath, data)
decode_template.WriteFiles(args.output, relpath, data)
return 0
def ReadFilteredData(path):
"""Reads data from path and filters out any obsolete metrics.
Parses data from given path and removes all nodes that contain an
<obsolete> tag. First iterates through <event> nodes, then <metric>
nodes within them.
Args:
path: The path of the XML data source.
Returns:
A dict of the data not including any obsolete events or metrics.
"""
with open(path) as ukm_file:
data = ukm_model.UKM_XML_TYPE.Parse(ukm_file.read())
event_tag = ukm_model._EVENT_TYPE.tag
metric_tag = ukm_model._METRIC_TYPE.tag
data[event_tag] = list(filter(ukm_model.IsNotObsolete, data[event_tag]))
for event in data[event_tag]:
event[metric_tag] = list(
filter(ukm_model.IsNotObsolete, event[metric_tag]))
return data
if '__main__' == __name__:
sys.exit(main(sys.argv))