Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(662)

Side by Side Diff: components/policy/tools/template_writers/template_formatter.py

Issue 2481183002: Generate ADMX template for Chrome OS policies (Closed)
Patch Set: Couple of fixes after testing Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2017 The Chromium Authors. All rights reserved. 2 # Copyright 2017 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 '''Takes translated policy_template.json files as input, applies template 6 '''Takes translated policy_template.json files as input, applies template
7 writers and emits various template and doc files (admx, html, json etc.). 7 writers and emits various template and doc files (admx, html, json etc.).
8 ''' 8 '''
9 9
10 import codecs 10 import codecs
11 import collections 11 import collections
12 import optparse 12 import optparse
13 import os 13 import os
14 import sys 14 import sys
15 15
16 import writer_configuration 16 import writer_configuration
17 import policy_template_generator 17 import policy_template_generator
18 18
19 from writers import adm_writer, adml_writer, admx_writer, \ 19 from writers import adm_writer, adml_writer, admx_writer, \
20 chromeos_admx_writer, chromeos_adml_writer, \
20 google_admx_writer, google_adml_writer, \ 21 google_admx_writer, google_adml_writer, \
21 android_policy_writer, reg_writer, doc_writer, \ 22 android_policy_writer, reg_writer, doc_writer, \
22 json_writer, plist_writer, plist_strings_writer 23 json_writer, plist_writer, plist_strings_writer
23 24
24 def MacLanguageMap(lang): 25 def MacLanguageMap(lang):
25 '''Handles slightly different path naming convention for Macs: 26 '''Handles slightly different path naming convention for Macs:
26 - 'en-US' -> 'en' 27 - 'en-US' -> 'en'
27 - '-' -> '_' 28 - '-' -> '_'
28 29
29 Args: 30 Args:
(...skipping 13 matching lines...) Expand all
43 WriterDesc = collections.namedtuple( 44 WriterDesc = collections.namedtuple(
44 'WriterDesc', ['type', 'is_per_language', 'encoding', 'language_map']) 45 'WriterDesc', ['type', 'is_per_language', 'encoding', 'language_map'])
45 46
46 47
47 _WRITER_DESCS = [ 48 _WRITER_DESCS = [
48 WriterDesc('adm', True, 'utf-16', None), 49 WriterDesc('adm', True, 'utf-16', None),
49 WriterDesc('adml', True, 'utf-16', None), 50 WriterDesc('adml', True, 'utf-16', None),
50 WriterDesc('admx', False, 'utf-16', None), 51 WriterDesc('admx', False, 'utf-16', None),
51 WriterDesc('google_adml', True, 'utf-8', None), 52 WriterDesc('google_adml', True, 'utf-8', None),
52 WriterDesc('google_admx', False, 'utf-8', None), 53 WriterDesc('google_admx', False, 'utf-8', None),
54 WriterDesc('chromeos_adml', True, 'utf-8', None),
55 WriterDesc('chromeos_admx', False, 'utf-8', None),
53 WriterDesc('android_policy', False, 'utf-8', None), 56 WriterDesc('android_policy', False, 'utf-8', None),
54 WriterDesc('reg', False, 'utf-16', None), 57 WriterDesc('reg', False, 'utf-16', None),
55 WriterDesc('doc', True, 'utf-8', None), 58 WriterDesc('doc', True, 'utf-8', None),
56 WriterDesc('json', False, 'utf-8', None), 59 WriterDesc('json', False, 'utf-8', None),
57 WriterDesc('plist', False, 'utf-8', None), 60 WriterDesc('plist', False, 'utf-8', None),
58 WriterDesc('plist_strings', True, 'utf-8', MacLanguageMap) 61 WriterDesc('plist_strings', True, 'utf-8', MacLanguageMap)
59 ] 62 ]
60 63
61 64
62 # Template writers that are not per-language use policy_templates.json from 65 # Template writers that are not per-language use policy_templates.json from
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 admx, google_admx, android_policy, reg, json, plist: Absolute path of the 113 admx, google_admx, android_policy, reg, json, plist: Absolute path of the
111 corresponding file types. Must NOT contain a ${lang} placeholder. There 114 corresponding file types. Must NOT contain a ${lang} placeholder. There
112 is only one output file, not one per language. 115 is only one output file, not one per language.
113 D: List of grit defines, used to assemble writer configuration. 116 D: List of grit defines, used to assemble writer configuration.
114 E, t: Grit environment variables and target platform. Unused, but 117 E, t: Grit environment variables and target platform. Unused, but
115 grit_rule.gni adds them, so OptionParser must handle them. 118 grit_rule.gni adds them, so OptionParser must handle them.
116 ''' 119 '''
117 parser = optparse.OptionParser() 120 parser = optparse.OptionParser()
118 parser.add_option('--translations', dest='translations') 121 parser.add_option('--translations', dest='translations')
119 parser.add_option('--languages', dest='languages') 122 parser.add_option('--languages', dest='languages')
120 parser.add_option('--adm', dest='adm') 123 parser.add_option('--adm', action='append', dest='adm')
121 parser.add_option('--adml', dest='adml') 124 parser.add_option('--adml', action='append', dest='adml')
122 parser.add_option('--admx', dest='admx') 125 parser.add_option('--admx', action='append', dest='admx')
123 parser.add_option('--google_adml', dest='google_adml') 126 parser.add_option('--chromeos_adml', action='append', dest='chromeos_adml')
124 parser.add_option('--google_admx', dest='google_admx') 127 parser.add_option('--chromeos_admx', action='append', dest='chromeos_admx')
125 parser.add_option('--reg', dest='reg') 128 parser.add_option('--google_adml', action='append', dest='google_adml')
126 parser.add_option('--doc', dest='doc') 129 parser.add_option('--google_admx', action='append', dest='google_admx')
127 parser.add_option('--json', dest='json') 130 parser.add_option('--reg', action='append', dest='reg')
128 parser.add_option('--plist', dest='plist') 131 parser.add_option('--doc', action='append', dest='doc')
129 parser.add_option('--plist_strings', dest='plist_strings') 132 parser.add_option('--json', action='append', dest='json')
130 parser.add_option('--android_policy', dest='android_policy') 133 parser.add_option('--plist', action='append', dest='plist')
131 parser.add_option('-D', action='append', dest='grit_defines', default=[]) 134 parser.add_option('--plist_strings', action='append', dest='plist_strings')
132 parser.add_option('-E', action='append', dest='grit_build_env', default=[]) 135 parser.add_option('--android_policy', action='append', dest='android_policy')
133 parser.add_option('-t', action='append', dest='grit_target', default=[]) 136 parser.add_option('-D', action='append', dest='grit_defines')
137 parser.add_option('-E', action='append', dest='grit_build_env')
138 parser.add_option('-t', action='append', dest='grit_target')
134 options, args = parser.parse_args(argv[1:]) 139 options, args = parser.parse_args(argv[1:])
135 140
136 _LANG_PLACEHOLDER = "${lang}"; 141 _LANG_PLACEHOLDER = "${lang}";
137 assert _LANG_PLACEHOLDER in options.translations 142 assert _LANG_PLACEHOLDER in options.translations
138 143
139 languages = filter(bool, options.languages.split(',')) 144 languages = filter(bool, options.languages.split(','))
140 assert _DEFAULT_LANGUAGE in languages 145 assert _DEFAULT_LANGUAGE in languages
141 146
142 config = _GetWriterConfiguration(options.grit_defines); 147 config = _GetWriterConfiguration(options.grit_defines);
143 148
144 # For each language, load policy data once and run all writers on it. 149 # For each language, load policy data once and run all writers on it.
145 for lang in languages: 150 for lang in languages:
146 # Load the policy data. 151 # Load the policy data.
147 policy_templates_json_path = \ 152 policy_templates_json_path = \
148 options.translations.replace(_LANG_PLACEHOLDER, lang) 153 options.translations.replace(_LANG_PLACEHOLDER, lang)
149 with codecs.open(policy_templates_json_path, 'r', 'utf-16') as policy_file: 154 with codecs.open(policy_templates_json_path, 'r', 'utf-16') as policy_file:
150 policy_data = eval(policy_file.read()) 155 policy_data = eval(policy_file.read())
151 156
152 # Preprocess the policy data. 157 # Preprocess the policy data.
153 policy_generator = \ 158 policy_generator = \
154 policy_template_generator.PolicyTemplateGenerator(config, policy_data) 159 policy_template_generator.PolicyTemplateGenerator(config, policy_data)
155 160
156 for writer_desc in _WRITER_DESCS: 161 for writer_desc in _WRITER_DESCS:
157 # For writer types that are not per language (e.g. admx), only do it once. 162 # For writer types that are not per language (e.g. admx), only do it once.
158 if (not writer_desc.is_per_language and lang != _DEFAULT_LANGUAGE): 163 if (not writer_desc.is_per_language and lang != _DEFAULT_LANGUAGE):
159 continue 164 continue
160 165
161 # Was the current writer type passed as argument, e.g. --admx <path>? 166 # Was the current writer type passed as argument, e.g. --admx <path>?
162 output_path = getattr(options, writer_desc.type, '') 167 # Note that all paths are arrays and we loop over all of them.
163 if (not output_path): 168 output_paths = getattr(options, writer_desc.type, '')
169 if (not output_paths):
164 continue 170 continue
171 for output_path in output_paths:
172 # Substitute language placeholder in output file.
173 if (writer_desc.is_per_language):
174 assert _LANG_PLACEHOLDER in output_path
175 mapped_lang = writer_desc.language_map(lang) \
176 if writer_desc.language_map else lang
177 output_path = output_path.replace(_LANG_PLACEHOLDER, mapped_lang)
178 else:
179 assert _LANG_PLACEHOLDER not in output_path
165 180
166 # Substitute language placeholder in output file. 181 # Run the template writer on th policy data.
167 if (writer_desc.is_per_language): 182 writer = GetWriter(writer_desc.type, config)
168 assert _LANG_PLACEHOLDER in output_path 183 output_data = policy_generator.GetTemplateText(writer)
169 mapped_lang = \
170 writer_desc.language_map(lang) if writer_desc.language_map else lang
171 output_path = output_path.replace(_LANG_PLACEHOLDER, mapped_lang)
172 else:
173 assert _LANG_PLACEHOLDER not in output_path
174 184
175 # Run the template writer on th policy data. 185 # Make output directory if it doesn't exist yet.
176 writer = GetWriter(writer_desc.type, config) 186 output_dir = os.path.split(output_path)[0]
177 output_data = policy_generator.GetTemplateText(writer) 187 if not os.path.exists(output_dir):
188 os.makedirs(output_dir)
178 189
179 # Make output directory if it doesn't exist yet. 190 # Write output file.
180 output_dir = os.path.split(output_path)[0] 191 with codecs.open(output_path, 'w', writer_desc.encoding) as output_file:
181 if not os.path.exists(output_dir): 192 output_file.write(output_data)
182 os.makedirs(output_dir)
183
184 # Write output file.
185 with codecs.open(output_path, 'w', writer_desc.encoding) as output_file:
186 output_file.write(output_data)
187 193
188 194
189 if '__main__' == __name__: 195 if '__main__' == __name__:
190 sys.exit(main(sys.argv)) 196 sys.exit(main(sys.argv))
OLDNEW
« no previous file with comments | « components/policy/resources/policy_templates.json ('k') | components/policy/tools/template_writers/test_suite_all.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698