blob: dcaed3ab412585a9f6701d541c2224023fa98f6c [file] [log] [blame]
#!/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:])