OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 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 """Creates a directory with with the unpacked contents of the remoting webapp. | 6 """Creates a directory with with the unpacked contents of the remoting webapp. |
7 | 7 |
8 The directory will contain a copy-of or a link-to to all remoting webapp | 8 The directory will contain a copy-of or a link-to to all remoting webapp |
9 resources. This includes HTML/JS and any plugin binaries. The script also | 9 resources. This includes HTML/JS and any plugin binaries. The script also |
10 massages resulting files appropriately with host plugin data. Finally, | 10 massages resulting files appropriately with host plugin data. Finally, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
68 '../../../third_party/jinja2')) | 68 '../../../third_party/jinja2')) |
69 sys.path.append(os.path.split(jinja2_path)[0]) | 69 sys.path.append(os.path.split(jinja2_path)[0]) |
70 import jinja2 | 70 import jinja2 |
71 (template_path, template_name) = os.path.split(input_file) | 71 (template_path, template_name) = os.path.split(input_file) |
72 include_paths = [template_path] + include_paths | 72 include_paths = [template_path] + include_paths |
73 env = jinja2.Environment(loader=jinja2.FileSystemLoader(include_paths)) | 73 env = jinja2.Environment(loader=jinja2.FileSystemLoader(include_paths)) |
74 template = env.get_template(template_name) | 74 template = env.get_template(template_name) |
75 rendered = template.render(context) | 75 rendered = template.render(context) |
76 io.open(output_file, 'w', encoding='utf-8').write(rendered) | 76 io.open(output_file, 'w', encoding='utf-8').write(rendered) |
77 | 77 |
78 | 78 |
Jamie
2015/02/03 18:06:24
I think this blank line should stay, because it se
| |
79 def buildWebApp(buildtype, version, destination, zip_path, | 79 def buildWebApp(buildtype, version, destination, zip_path, |
80 manifest_template, webapp_type, app_id, app_name, | 80 manifest_template, webapp_type, app_id, app_name, |
81 app_description, files, locales, jinja_paths, | 81 app_description, app_features, files, locales, jinja_paths, |
82 service_environment): | 82 service_environment): |
83 """Does the main work of building the webapp directory and zipfile. | 83 """Does the main work of building the webapp directory and zipfile. |
84 | 84 |
85 Args: | 85 Args: |
86 buildtype: the type of build ("Official", "Release" or "Dev"). | 86 buildtype: the type of build ("Official", "Release" or "Dev"). |
87 destination: A string with path to directory where the webapp will be | 87 destination: A string with path to directory where the webapp will be |
88 written. | 88 written. |
89 zipfile: A string with path to the zipfile to create containing the | 89 zipfile: A string with path to the zipfile to create containing the |
90 contents of |destination|. | 90 contents of |destination|. |
91 manifest_template: jinja2 template file for manifest. | 91 manifest_template: jinja2 template file for manifest. |
92 webapp_type: webapp type ("v1", "v2", "v2_pnacl" or "app_remoting"). | 92 webapp_type: webapp type ("v1", "v2", "v2_pnacl" or "app_remoting"). |
93 app_id: A string with the Remoting Application Id (only used for app | 93 app_id: A string with the Remoting Application Id (only used for app |
94 remoting webapps). If supplied, it defaults to using the | 94 remoting webapps). If supplied, it defaults to using the |
95 test API server. | 95 test API server. |
96 app_name: A string with the name of the application. | 96 app_name: A string with the name of the application. |
97 app_description: A string with the description of the application. | 97 app_description: A string with the description of the application. |
98 app_features: A set of strings naming the features that should be enabled | |
99 for this application. | |
98 files: An array of strings listing the paths for resources to include | 100 files: An array of strings listing the paths for resources to include |
99 in this webapp. | 101 in this webapp. |
100 locales: An array of strings listing locales, which are copied, along | 102 locales: An array of strings listing locales, which are copied, along |
101 with their directory structure from the _locales directory down. | 103 with their directory structure from the _locales directory down. |
102 jinja_paths: An array of paths to search for {%include} directives in | 104 jinja_paths: An array of paths to search for {%include} directives in |
103 addition to the directory containing the manifest template. | 105 addition to the directory containing the manifest template. |
104 service_environment: Used to point the webApp to one of the | 106 service_environment: Used to point the webApp to one of the |
105 dev/test/staging/prod environments | 107 dev/test/staging/prod environments |
106 """ | 108 """ |
107 # Ensure a fresh directory. | 109 # Ensure a fresh directory. |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
211 # If an Application ID was set (either from service_environment variable or | 213 # If an Application ID was set (either from service_environment variable or |
212 # from a command line argument), hardcode it, otherwise get it at runtime. | 214 # from a command line argument), hardcode it, otherwise get it at runtime. |
213 effectiveAppId = appRemotingApplicationId or app_id | 215 effectiveAppId = appRemotingApplicationId or app_id |
214 if effectiveAppId: | 216 if effectiveAppId: |
215 appRemotingApplicationId = "'" + effectiveAppId + "'" | 217 appRemotingApplicationId = "'" + effectiveAppId + "'" |
216 else: | 218 else: |
217 appRemotingApplicationId = "chrome.i18n.getMessage('@@extension_id')" | 219 appRemotingApplicationId = "chrome.i18n.getMessage('@@extension_id')" |
218 findAndReplace(os.path.join(destination, 'plugin_settings.js'), | 220 findAndReplace(os.path.join(destination, 'plugin_settings.js'), |
219 "'APP_REMOTING_APPLICATION_ID'", appRemotingApplicationId) | 221 "'APP_REMOTING_APPLICATION_ID'", appRemotingApplicationId) |
220 | 222 |
223 | |
Jamie
2015/02/02 22:57:47
No need for an extra blank line here (IIRC, that c
garykac
2015/02/03 01:50:21
I fixed this locally but forgot to upload. grr.
| |
221 oauth2BaseUrl = oauth2AccountsHost + '/o/oauth2' | 224 oauth2BaseUrl = oauth2AccountsHost + '/o/oauth2' |
222 oauth2ApiBaseUrl = oauth2ApiHost + '/oauth2' | 225 oauth2ApiBaseUrl = oauth2ApiHost + '/oauth2' |
223 directoryApiBaseUrl = directoryApiHost + '/chromoting/v1' | 226 directoryApiBaseUrl = directoryApiHost + '/chromoting/v1' |
224 | 227 |
225 if webapp_type == 'app_remoting': | 228 if webapp_type == 'app_remoting': |
226 # Set the apiary endpoint and then set the endpoint version | 229 # Set the apiary endpoint and then set the endpoint version |
227 if not appRemotingApiHost: | 230 if not appRemotingApiHost: |
228 if service_environment == 'prod': | 231 if service_environment == 'prod': |
229 appRemotingApiHost = 'https://www.googleapis.com' | 232 appRemotingApiHost = 'https://www.googleapis.com' |
230 else: | 233 else: |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
309 | 312 |
310 # Set the correct API keys. | 313 # Set the correct API keys. |
311 # For overriding the client ID/secret via env vars, see google_api_keys.py. | 314 # For overriding the client ID/secret via env vars, see google_api_keys.py. |
312 apiClientId = google_api_keys.GetClientID('REMOTING') | 315 apiClientId = google_api_keys.GetClientID('REMOTING') |
313 apiClientSecret = google_api_keys.GetClientSecret('REMOTING') | 316 apiClientSecret = google_api_keys.GetClientSecret('REMOTING') |
314 apiClientIdV2 = google_api_keys.GetClientID('REMOTING_IDENTITY_API') | 317 apiClientIdV2 = google_api_keys.GetClientID('REMOTING_IDENTITY_API') |
315 | 318 |
316 replaceString(destination, 'API_CLIENT_ID', apiClientId) | 319 replaceString(destination, 'API_CLIENT_ID', apiClientId) |
317 replaceString(destination, 'API_CLIENT_SECRET', apiClientSecret) | 320 replaceString(destination, 'API_CLIENT_SECRET', apiClientSecret) |
318 | 321 |
322 # Write the application features. | |
323 appFeatures = ''.join(["'" + x + "'" for x in app_features]) | |
324 findAndReplace(os.path.join(destination, 'app_features.js'), | |
325 "'APPLICATION_FEATURES'", appFeatures) | |
326 | |
319 # Use a consistent extension id for dev builds. | 327 # Use a consistent extension id for dev builds. |
320 # AppRemoting builds always use the dev app id - the correct app id gets | 328 # AppRemoting builds always use the dev app id - the correct app id gets |
321 # written into the manifest later. | 329 # written into the manifest later. |
322 if buildtype != 'Official' or webapp_type == 'app_remoting': | 330 if buildtype != 'Official' or webapp_type == 'app_remoting': |
323 manifestKey = '"key": "remotingdevbuild",' | 331 manifestKey = '"key": "remotingdevbuild",' |
324 else: | 332 else: |
325 manifestKey = '' | 333 manifestKey = '' |
326 | 334 |
327 # Generate manifest. | 335 # Generate manifest. |
328 if manifest_template: | 336 if manifest_template: |
329 context = { | 337 context = { |
330 'webapp_type': webapp_type, | 338 'webapp_type': webapp_type, |
331 'FULL_APP_VERSION': version, | 339 'FULL_APP_VERSION': version, |
332 'MANIFEST_KEY_FOR_UNOFFICIAL_BUILD': manifestKey, | 340 'MANIFEST_KEY_FOR_UNOFFICIAL_BUILD': manifestKey, |
333 'OAUTH2_REDIRECT_URL': oauth2RedirectUrlJson, | 341 'OAUTH2_REDIRECT_URL': oauth2RedirectUrlJson, |
334 'TALK_GADGET_HOST': talkGadgetHostJson, | 342 'TALK_GADGET_HOST': talkGadgetHostJson, |
335 'THIRD_PARTY_AUTH_REDIRECT_URL': thirdPartyAuthUrlJson, | 343 'THIRD_PARTY_AUTH_REDIRECT_URL': thirdPartyAuthUrlJson, |
336 'REMOTING_IDENTITY_API_CLIENT_ID': apiClientIdV2, | 344 'REMOTING_IDENTITY_API_CLIENT_ID': apiClientIdV2, |
337 'OAUTH2_BASE_URL': oauth2BaseUrl, | 345 'OAUTH2_BASE_URL': oauth2BaseUrl, |
338 'OAUTH2_API_BASE_URL': oauth2ApiBaseUrl, | 346 'OAUTH2_API_BASE_URL': oauth2ApiBaseUrl, |
339 'DIRECTORY_API_BASE_URL': directoryApiBaseUrl, | 347 'DIRECTORY_API_BASE_URL': directoryApiBaseUrl, |
340 'APP_REMOTING_API_BASE_URL': appRemotingApiBaseUrl, | 348 'APP_REMOTING_API_BASE_URL': appRemotingApiBaseUrl, |
341 'OAUTH2_ACCOUNTS_HOST': oauth2AccountsHost, | 349 'OAUTH2_ACCOUNTS_HOST': oauth2AccountsHost, |
342 'GOOGLE_API_HOSTS': googleApiHosts, | 350 'GOOGLE_API_HOSTS': googleApiHosts, |
343 'APP_NAME': app_name, | 351 'APP_NAME': app_name, |
344 'APP_DESCRIPTION': app_description, | 352 'APP_DESCRIPTION': app_description, |
353 'OAUTH_GDRIVE_SCOPE': '', | |
345 } | 354 } |
355 if 'gdrive' in app_features: | |
356 context['OAUTH_GDRIVE_SCOPE'] = ('https://docs.google.com/feeds/ ' | |
357 'https://www.googleapis.com/auth/drive') | |
346 processJinjaTemplate(manifest_template, | 358 processJinjaTemplate(manifest_template, |
347 jinja_paths, | 359 jinja_paths, |
348 os.path.join(destination, 'manifest.json'), | 360 os.path.join(destination, 'manifest.json'), |
349 context) | 361 context) |
350 | 362 |
351 # Make the zipfile. | 363 # Make the zipfile. |
352 createZip(zip_path, destination) | 364 createZip(zip_path, destination) |
353 | 365 |
354 return 0 | 366 return 0 |
355 | 367 |
356 | 368 |
357 def main(): | 369 def main(): |
370 valid_app_features = ['cast', 'gdrive'] | |
Jamie
2015/02/02 22:57:47
If you use an enumerated type, you can get rid of
garykac
2015/02/03 01:50:21
Done.
| |
371 | |
358 if len(sys.argv) < 6: | 372 if len(sys.argv) < 6: |
359 print ('Usage: build-webapp.py ' | 373 print ('Usage: build-webapp.py ' |
360 '<build-type> <version> <dst> <zip-path> <manifest_template> ' | 374 '<build-type> <version> <dst> <zip-path> <manifest_template> ' |
361 '<webapp_type> <other files...> ' | 375 '<webapp_type> <other files...> ' |
362 '--app_name <name> ' | 376 '--app_name <name> ' |
363 '--app_description <description> ' | 377 '--app_description <description> ' |
378 '--app_features <features...> ' | |
364 '[--appid <appid>] ' | 379 '[--appid <appid>] ' |
365 '[--locales <locales...>] ' | 380 '[--locales <locales...>] ' |
366 '[--jinja_paths <paths...>] ' | 381 '[--jinja_paths <paths...>] ' |
367 '[--service_environment <service_environment>]') | 382 '[--service_environment <service_environment>]') |
383 print 'Where <features> are', valid_app_features | |
368 return 1 | 384 return 1 |
369 | 385 |
370 arg_type = '' | 386 arg_type = '' |
371 files = [] | 387 files = [] |
372 locales = [] | 388 locales = [] |
373 jinja_paths = [] | 389 jinja_paths = [] |
374 app_id = None | 390 app_id = None |
375 app_name = None | 391 app_name = None |
376 app_description = None | 392 app_description = None |
393 app_features = set([]) | |
377 service_environment = '' | 394 service_environment = '' |
378 | 395 |
379 for arg in sys.argv[7:]: | 396 for arg in sys.argv[7:]: |
380 if arg in ['--locales', | 397 if arg in ['--locales', |
381 '--jinja_paths', | 398 '--jinja_paths', |
382 '--appid', | 399 '--appid', |
383 '--app_name', | 400 '--app_name', |
384 '--app_description', | 401 '--app_description', |
402 '--app_features', | |
385 '--service_environment']: | 403 '--service_environment']: |
386 arg_type = arg | 404 arg_type = arg |
387 elif arg_type == '--locales': | 405 elif arg_type == '--locales': |
388 locales.append(arg) | 406 locales.append(arg) |
389 elif arg_type == '--jinja_paths': | 407 elif arg_type == '--jinja_paths': |
390 jinja_paths.append(arg) | 408 jinja_paths.append(arg) |
391 elif arg_type == '--appid': | 409 elif arg_type == '--appid': |
392 app_id = arg | 410 app_id = arg |
393 arg_type = '' | 411 arg_type = '' |
394 elif arg_type == '--app_name': | 412 elif arg_type == '--app_name': |
395 app_name = arg | 413 app_name = arg |
396 arg_type = '' | 414 arg_type = '' |
397 elif arg_type == '--app_description': | 415 elif arg_type == '--app_description': |
398 app_description = arg | 416 app_description = arg |
399 arg_type = '' | 417 arg_type = '' |
418 elif arg_type == '--app_features': | |
419 if arg in valid_app_features: | |
420 app_features.add(arg) | |
421 else: | |
422 raise Exception('Invalid app_feature: ' + arg) | |
400 elif arg_type == '--service_environment': | 423 elif arg_type == '--service_environment': |
401 service_environment = arg | 424 service_environment = arg |
402 arg_type = '' | 425 arg_type = '' |
403 else: | 426 else: |
404 files.append(arg) | 427 files.append(arg) |
405 | 428 |
406 return buildWebApp(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], | 429 return buildWebApp(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], |
407 sys.argv[5], sys.argv[6], app_id, app_name, | 430 sys.argv[5], sys.argv[6], app_id, app_name, |
408 app_description, files, locales, jinja_paths, | 431 app_description, app_features, files, locales, |
409 service_environment) | 432 jinja_paths, service_environment) |
410 | 433 |
411 | 434 |
412 if __name__ == '__main__': | 435 if __name__ == '__main__': |
413 sys.exit(main()) | 436 sys.exit(main()) |
OLD | NEW |