Index: tools/variations/fieldtrial_to_struct.py |
diff --git a/tools/variations/fieldtrial_to_struct.py b/tools/variations/fieldtrial_to_struct.py |
index 946ca61cab2c34c3d127c2662dffda9095292047..1671bc08d4e99323ed0f8cd2623ffcae503b99da 100755 |
--- a/tools/variations/fieldtrial_to_struct.py |
+++ b/tools/variations/fieldtrial_to_struct.py |
@@ -3,6 +3,7 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
+import itertools |
import json |
import os.path |
import sys |
@@ -28,11 +29,11 @@ def _Load(filename): |
result = json.loads(json_comment_eater.Nom(handle.read())) |
return result |
-def _LoadFieldTrialConfig(filename): |
+def _LoadFieldTrialConfig(filename, platform): |
"""Loads a field trial config JSON and converts it into a format that can be |
used by json_to_struct. |
""" |
- return _FieldTrialConfigToDescription(_Load(filename)) |
+ return _FieldTrialConfigToDescription(_Load(filename), platform) |
def _CreateGroup(group_data): |
group = {'name': group_data['group_name']} |
@@ -48,18 +49,26 @@ def _CreateGroup(group_data): |
group['disable_features'] = disable_features_data |
return group |
-def _CreateTrial(trial_name, groups): |
+def _CreateTrial(trial_name, group_configs, platform): |
Alexei Svitkine (slow)
2016/08/31 20:17:27
Please add a comment to this function now that it'
robliao
2016/09/01 21:49:07
Done.
|
+ platform_group_lists = [config['groups'] for config in group_configs |
+ if platform in config['platforms']] |
+ platform_groups = list(itertools.chain.from_iterable(platform_group_lists)) |
return { |
'name': trial_name, |
- 'groups': [_CreateGroup(group) for group in groups], |
+ 'groups': [_CreateGroup(group) for group in platform_groups], |
} |
-def _FieldTrialConfigToDescription(config): |
+def _GenerateTrials(config, platform): |
+ for trial_name in sorted(config.keys()): |
+ trial = _CreateTrial(trial_name, config[trial_name], platform) |
+ if trial['groups']: |
+ yield trial |
+ |
+def _FieldTrialConfigToDescription(config, platform): |
return { |
'elements': { |
'kFieldTrialConfig': { |
- 'trials': [_CreateTrial(trial_name, config[trial_name]) |
- for trial_name in sorted(config.keys())] |
+ 'trials': [trial for trial in _GenerateTrials(config, platform)] |
} |
} |
} |
@@ -67,13 +76,15 @@ def _FieldTrialConfigToDescription(config): |
def main(arguments): |
parser = optparse.OptionParser( |
description='Generates a struct from a JSON description.', |
- usage='usage: %prog [option] -s schema description') |
+ usage='usage: %prog [option] -s schema -p platform 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('-p', '--platform', |
+ help='target platform for the field trial, mandatory.') |
parser.add_option('-s', '--schema', help='path to the schema file, ' |
'mandatory.') |
parser.add_option('-o', '--output', help='output filename, ' |
@@ -85,6 +96,14 @@ def main(arguments): |
if not opts.schema: |
parser.error('You must specify a --schema.') |
+ if not opts.platform: |
+ parser.error('You must specify a --platform.') |
+ |
+ supported_platforms = ['android', 'chromeos', 'ios', 'linux', 'mac', 'win'] |
+ if opts.platform not in supported_platforms: |
+ parser.error('\'%s\' is an unknown platform. Supported platforms: %s' % |
+ (opts.platform, supported_platforms)) |
+ |
description_filename = os.path.normpath(args[0]) |
shortroot = opts.output |
if opts.destdir: |
@@ -98,7 +117,7 @@ def main(arguments): |
basepath = '' |
schema = _Load(opts.schema) |
- description = _LoadFieldTrialConfig(description_filename) |
+ description = _LoadFieldTrialConfig(description_filename, opts.platform) |
json_to_struct.GenerateStruct( |
basepath, output_root, opts.namespace, schema, description, |
os.path.split(description_filename)[1], os.path.split(opts.schema)[1], |