#!/usr/bin/env python # Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import json import os.path import sys import optparse _script_path = os.path.realpath(__file__) sys.path.insert(0, os.path.normpath(_script_path + "/../../json_comment_eater")) try: import json_comment_eater finally: sys.path.pop(0) sys.path.insert(0, os.path.normpath(_script_path + "/../../json_to_struct")) try: import json_to_struct finally: sys.path.pop(0) def _Load(filename): """Loads a JSON file into a Python object and return this object. """ with open(filename, 'r') as handle: result = json.loads(json_comment_eater.Nom(handle.read())) return result def _LoadFieldTrialConfig(filename): """Loads a field trial config JSON and converts it into a format that can be used by json_to_struct. """ return _FieldTrialConfigToDescription(_Load(filename)) def _FieldTrialConfigToDescription(config): element = {'groups': []} for study in sorted(config.keys()): group_data = config[study][0] group = { 'study': study, 'group_name': group_data['group_name'] } params_data = group_data.get('params') if (params_data): params = [] for param in sorted(params_data.keys()): params.append({'key': param, 'value': params_data[param]}) group['params'] = params enable_features_data = group_data.get('enable_features') if enable_features_data: group['enable_features'] = enable_features_data disable_features_data = group_data.get('disable_features') if disable_features_data: group['disable_features'] = disable_features_data element['groups'].append(group) return {'elements': {'kFieldTrialConfig': element}} def main(arguments): parser = optparse.OptionParser( description='Generates an C++ array of struct from a JSON description.', usage='usage: %prog [option] -s schema description') parser.add_option('-b', '--destbase', help='base directory of generated files.') parser.add_option('-d', '--destdir', help='directory to output generated files, relative to destbase.') parser.add_option('-n', '--namespace', help='C++ namespace for generated files. e.g search_providers.') parser.add_option('-s', '--schema', help='path to the schema file, ' 'mandatory.') parser.add_option('-o', '--output', help='output filename, ' 'mandatory.') parser.add_option('-y', '--year', help='year to put in the copy-right.') (opts, args) = parser.parse_args(args=arguments) if not opts.schema: parser.error('You must specify a --schema.') description_filename = os.path.normpath(args[0]) shortroot = opts.output if opts.destdir: output_root = os.path.join(os.path.normpath(opts.destdir), shortroot) else: output_root = shortroot if opts.destbase: basepath = os.path.normpath(opts.destbase) else: basepath = '' schema = _Load(opts.schema) description = _LoadFieldTrialConfig(description_filename) json_to_struct.GenerateStruct( basepath, output_root, opts.namespace, schema, description, os.path.split(description_filename)[1], os.path.split(opts.schema)[1], opts.year) if __name__ == '__main__': main(sys.argv[1:])