Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: build.py

Issue 29336281: Issue 2109 - Allow for translation of app independent repositories (Closed)
Patch Set: Addressed some further feedback from Wladimir Created Feb. 12, 2016, 7:39 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | localeTools.py » ('j') | localeTools.py » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # coding: utf-8 1 # coding: utf-8
2 2
3 # This Source Code Form is subject to the terms of the Mozilla Public 3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this 4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 6
7 import os, sys, re, subprocess, shutil, buildtools 7 import os, sys, re, subprocess, shutil, buildtools
8 from getopt import getopt, GetoptError 8 from getopt import getopt, GetoptError
9 from StringIO import StringIO 9 from StringIO import StringIO
10 from zipfile import ZipFile 10 from zipfile import ZipFile
11 11
12 knownTypes = ('gecko', 'chrome', 'opera', 'safari') 12 knownTypes = ('gecko', 'chrome', 'opera', 'safari', 'generic')
13 13
14 class Command(object): 14 class Command(object):
15 name = property(lambda self: self._name) 15 name = property(lambda self: self._name)
16 shortDescription = property(lambda self: self._shortDescription, 16 shortDescription = property(lambda self: self._shortDescription,
17 lambda self, value: self.__dict__.update({'_shortDescription': value})) 17 lambda self, value: self.__dict__.update({'_shortDescription': value}))
18 description = property(lambda self: self._description, 18 description = property(lambda self: self._description,
19 lambda self, value: self.__dict__.update({'_description': value})) 19 lambda self, value: self.__dict__.update({'_description': value}))
20 params = property(lambda self: self._params, 20 params = property(lambda self: self._params,
21 lambda self, value: self.__dict__.update({'_params': value})) 21 lambda self, value: self.__dict__.update({'_params': value}))
22 supportedTypes = property(lambda self: self._supportedTypes, 22 supportedTypes = property(lambda self: self._supportedTypes,
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 from buildtools.packager import getDevEnvPath 229 from buildtools.packager import getDevEnvPath
230 devenv_dir = getDevEnvPath(baseDir, type) 230 devenv_dir = getDevEnvPath(baseDir, type)
231 231
232 shutil.rmtree(devenv_dir, ignore_errors=True) 232 shutil.rmtree(devenv_dir, ignore_errors=True)
233 233
234 file.seek(0) 234 file.seek(0)
235 with ZipFile(file, 'r') as zip_file: 235 with ZipFile(file, 'r') as zip_file:
236 zip_file.extractall(devenv_dir) 236 zip_file.extractall(devenv_dir)
237 237
238 238
239 def readLocaleConfig(baseDir, type, metadata, includeIncomplete=False):
240 if type == 'gecko':
241 import buildtools.packagerGecko as packager
242 localeDir = packager.getLocalesDir(baseDir)
243 localeConfig = {
244 'name_format': 'BCP-47',
245 'file_format': 'gecko-dtd',
246 'target_platforms': {'gecko'},
247 'default_locale': packager.defaultLocale
248 }
249 elif type == 'chrome' or type == 'opera':
250 import buildtools.packagerChrome as packager
251 localeDir = os.path.join(baseDir, '_locales')
252 localeConfig = {
253 'name_format': 'ISO-15897',
254 'file_format': 'chrome-json',
255 'target_platforms': {'chrome'},
256 'default_locale': packager.defaultLocale,
257 }
258 else:
259 localeDir = os.path.join(baseDir,
260 *metadata.get('locales', 'base_path').split('/'))
261 localeConfig = {
262 'name_format': metadata.get('locales', 'name_format'),
263 'file_format': metadata.get('locales', 'file_format'),
264 'target_platforms': set(metadata.get('locales',
265 'target_platforms').split()),
266 'default_locale': metadata.get('locales', 'default_locale')
267 }
268
269 localeConfig['base_path'] = localeDir
270
271 locales = [(locale, os.path.join(localeDir, locale))
272 for locale in os.listdir(localeDir)]
Wladimir Palant 2016/02/12 19:49:34 This is actually fine for the use cases so far, bu
kzar 2016/02/12 20:05:36 Done but I omitted this parameter accidentally, ar
273 if localeConfig['name_format'] == 'ISO-15897':
274 locales = [(locale.replace('_', '-'), localePath)
275 for locale, localePath in locales]
276 localeConfig['locales'] = dict(locales)
277
278 return localeConfig
279
239 def setupTranslations(baseDir, scriptName, opts, args, type): 280 def setupTranslations(baseDir, scriptName, opts, args, type):
240 if len(args) < 1: 281 if len(args) < 1:
241 print 'Project key is required to update translation master files.' 282 print 'Project key is required to update translation master files.'
242 usage(scriptName, type, 'setuptrans') 283 usage(scriptName, type, 'setuptrans')
243 return 284 return
244 285
245 key = args[0] 286 key = args[0]
246 287
247 from buildtools.packager import readMetadata 288 from buildtools.packager import readMetadata
248 metadata = readMetadata(baseDir, type) 289 metadata = readMetadata(baseDir, type)
290
249 basename = metadata.get('general', 'basename') 291 basename = metadata.get('general', 'basename')
250 292 localeConfig = readLocaleConfig(baseDir, type, metadata, True)
251 if type == 'chrome' or type == 'opera':
252 import buildtools.packagerChrome as packager
253 locales = os.listdir(os.path.join(baseDir, '_locales'))
254 locales = map(lambda locale: locale.replace('_', '-'), locales)
255 else:
256 import buildtools.packagerGecko as packager
257 locales = packager.getLocales(baseDir, True)
258 293
259 import buildtools.localeTools as localeTools 294 import buildtools.localeTools as localeTools
260 localeTools.setupTranslations(type, locales, basename, key) 295 localeTools.setupTranslations(localeConfig, basename, key)
261 296
262 297
263 def updateTranslationMaster(baseDir, scriptName, opts, args, type): 298 def updateTranslationMaster(baseDir, scriptName, opts, args, type):
264 if len(args) < 1: 299 if len(args) < 1:
265 print 'Project key is required to update translation master files.' 300 print 'Project key is required to update translation master files.'
266 usage(scriptName, type, 'translate') 301 usage(scriptName, type, 'translate')
267 return 302 return
268 303
269 key = args[0] 304 key = args[0]
270 305
271 from buildtools.packager import readMetadata 306 from buildtools.packager import readMetadata
272 metadata = readMetadata(baseDir, type) 307 metadata = readMetadata(baseDir, type)
308
273 basename = metadata.get('general', 'basename') 309 basename = metadata.get('general', 'basename')
310 localeConfig = readLocaleConfig(baseDir, type, metadata)
274 311
275 if type == 'chrome' or type == 'opera': 312 defaultLocaleDir = os.path.join(localeConfig['base_path'],
276 import buildtools.packagerChrome as packager 313 localeConfig['default_locale'])
277 defaultLocaleDir = os.path.join(baseDir, '_locales', packager.defaultLocale)
278 else:
279 import buildtools.packagerGecko as packager
280 defaultLocaleDir = os.path.join(packager.getLocalesDir(baseDir), packager.de faultLocale)
281 314
282 import buildtools.localeTools as localeTools 315 import buildtools.localeTools as localeTools
283 localeTools.updateTranslationMaster(type, metadata, defaultLocaleDir, basename , key) 316 localeTools.updateTranslationMaster(localeConfig, metadata, defaultLocaleDir,
317 basename, key)
284 318
285 319
286 def uploadTranslations(baseDir, scriptName, opts, args, type): 320 def uploadTranslations(baseDir, scriptName, opts, args, type):
287 if len(args) < 1: 321 if len(args) < 1:
288 print 'Project key is required to upload existing translations.' 322 print 'Project key is required to upload existing translations.'
289 usage(scriptName, type, 'uploadtrans') 323 usage(scriptName, type, 'uploadtrans')
290 return 324 return
291 325
292 key = args[0] 326 key = args[0]
293 327
294 from buildtools.packager import readMetadata 328 from buildtools.packager import readMetadata
295 metadata = readMetadata(baseDir, type) 329 metadata = readMetadata(baseDir, type)
330
296 basename = metadata.get('general', 'basename') 331 basename = metadata.get('general', 'basename')
297 332 localeConfig = readLocaleConfig(baseDir, type, metadata, True)
298 if type == 'chrome' or type == 'opera':
299 import buildtools.packagerChrome as packager
300 localesDir = os.path.join(baseDir, '_locales')
301 locales = os.listdir(localesDir)
302 locales = map(lambda locale: (locale.replace('_', '-'), os.path.join(locales Dir, locale)), locales)
303 else:
304 import buildtools.packagerGecko as packager
305 localesDir = packager.getLocalesDir(baseDir)
306 locales = packager.getLocales(baseDir, True)
307 locales = map(lambda locale: (locale, os.path.join(localesDir, locale)), loc ales)
308 333
309 import buildtools.localeTools as localeTools 334 import buildtools.localeTools as localeTools
310 for locale, localeDir in locales: 335 for locale, localeDir in localeConfig['locales'].iteritems():
311 if locale != packager.defaultLocale: 336 if locale != localeConfig['default_locale']:
312 localeTools.uploadTranslations(type, metadata, localeDir, locale, basename , key) 337 localeTools.uploadTranslations(localeConfig, metadata, localeDir, locale,
338 basename, key)
313 339
314 340
315 def getTranslations(baseDir, scriptName, opts, args, type): 341 def getTranslations(baseDir, scriptName, opts, args, type):
316 if len(args) < 1: 342 if len(args) < 1:
317 print 'Project key is required to update translation master files.' 343 print 'Project key is required to update translation master files.'
318 usage(scriptName, type, 'translate') 344 usage(scriptName, type, 'translate')
319 return 345 return
320 346
347 key = args[0]
348
321 from buildtools.packager import readMetadata 349 from buildtools.packager import readMetadata
322 metadata = readMetadata(baseDir, type) 350 metadata = readMetadata(baseDir, type)
351
323 basename = metadata.get('general', 'basename') 352 basename = metadata.get('general', 'basename')
324 353 localeConfig = readLocaleConfig(baseDir, type, metadata)
325 key = args[0]
326 if type == 'chrome' or type == 'opera':
327 import buildtools.packagerChrome as packager
328 localesDir = os.path.join(baseDir, '_locales')
329 else:
330 import buildtools.packagerGecko as packager
331 localesDir = packager.getLocalesDir(baseDir)
332 354
333 import buildtools.localeTools as localeTools 355 import buildtools.localeTools as localeTools
334 localeTools.getTranslations(type, localesDir, packager.defaultLocale.replace(' _', '-'), basename, key) 356 localeTools.getTranslations(localeConfig, basename, key)
335 357
336 358
337 def showDescriptions(baseDir, scriptName, opts, args, type): 359 def showDescriptions(baseDir, scriptName, opts, args, type):
338 locales = None 360 locales = None
339 for option, value in opts: 361 for option, value in opts:
340 if option in ('-l', '--locales'): 362 if option in ('-l', '--locales'):
341 locales = value.split(',') 363 locales = value.split(',')
342 364
343 import buildtools.packagerGecko as packager 365 import buildtools.packagerGecko as packager
344 if locales == None: 366 if locales == None:
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 474
453 with addCommand(createDevEnv, 'devenv') as command: 475 with addCommand(createDevEnv, 'devenv') as command:
454 command.shortDescription = 'Set up a development environment' 476 command.shortDescription = 'Set up a development environment'
455 command.description = 'Will set up or update the devenv folder as an unpacked extension folder for development.' 477 command.description = 'Will set up or update the devenv folder as an unpacked extension folder for development.'
456 command.supportedTypes = ('chrome', 'opera', 'safari') 478 command.supportedTypes = ('chrome', 'opera', 'safari')
457 479
458 with addCommand(setupTranslations, 'setuptrans') as command: 480 with addCommand(setupTranslations, 'setuptrans') as command:
459 command.shortDescription = 'Sets up translation languages' 481 command.shortDescription = 'Sets up translation languages'
460 command.description = 'Sets up translation languages for the project on crowdi n.net.' 482 command.description = 'Sets up translation languages for the project on crowdi n.net.'
461 command.params = '[options] project-key' 483 command.params = '[options] project-key'
462 command.supportedTypes = ('gecko', 'chrome', 'opera') 484 command.supportedTypes = ('gecko', 'chrome', 'opera', 'generic')
463 485
464 with addCommand(updateTranslationMaster, 'translate') as command: 486 with addCommand(updateTranslationMaster, 'translate') as command:
465 command.shortDescription = 'Updates translation master files' 487 command.shortDescription = 'Updates translation master files'
466 command.description = 'Updates the translation master files in the project on crowdin.net.' 488 command.description = 'Updates the translation master files in the project on crowdin.net.'
467 command.params = '[options] project-key' 489 command.params = '[options] project-key'
468 command.supportedTypes = ('gecko', 'chrome', 'opera') 490 command.supportedTypes = ('gecko', 'chrome', 'opera', 'generic')
469 491
470 with addCommand(uploadTranslations, 'uploadtrans') as command: 492 with addCommand(uploadTranslations, 'uploadtrans') as command:
471 command.shortDescription = 'Uploads existing translations' 493 command.shortDescription = 'Uploads existing translations'
472 command.description = 'Uploads already existing translations to the project on crowdin.net.' 494 command.description = 'Uploads already existing translations to the project on crowdin.net.'
473 command.params = '[options] project-key' 495 command.params = '[options] project-key'
474 command.supportedTypes = ('gecko', 'chrome', 'opera') 496 command.supportedTypes = ('gecko', 'chrome', 'opera', 'generic')
475 497
476 with addCommand(getTranslations, 'gettranslations') as command: 498 with addCommand(getTranslations, 'gettranslations') as command:
477 command.shortDescription = 'Downloads translation updates' 499 command.shortDescription = 'Downloads translation updates'
478 command.description = 'Downloads updated translations from crowdin.net.' 500 command.description = 'Downloads updated translations from crowdin.net.'
479 command.params = '[options] project-key' 501 command.params = '[options] project-key'
480 command.supportedTypes = ('gecko', 'chrome', 'opera') 502 command.supportedTypes = ('gecko', 'chrome', 'opera', 'generic')
481 503
482 with addCommand(showDescriptions, 'showdesc') as command: 504 with addCommand(showDescriptions, 'showdesc') as command:
483 command.shortDescription = 'Print description strings for all locales' 505 command.shortDescription = 'Print description strings for all locales'
484 command.description = 'Display description strings for all locales as specifie d in the corresponding meta.properties files.' 506 command.description = 'Display description strings for all locales as specifie d in the corresponding meta.properties files.'
485 command.addOption('Only include the given locales', short='l', long='locales', value='l1,l2,l3') 507 command.addOption('Only include the given locales', short='l', long='locales', value='l1,l2,l3')
486 command.params = '[options]' 508 command.params = '[options]'
487 command.supportedTypes = ('gecko') 509 command.supportedTypes = ('gecko')
488 510
489 with addCommand(generateDocs, 'docs') as command: 511 with addCommand(generateDocs, 'docs') as command:
490 command.shortDescription = 'Generate documentation (requires node.js)' 512 command.shortDescription = 'Generate documentation (requires node.js)'
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 if option in ('-h', '--help'): 595 if option in ('-h', '--help'):
574 usage(scriptName, type, command) 596 usage(scriptName, type, command)
575 sys.exit() 597 sys.exit()
576 commands[command](baseDir, scriptName, opts, args, type) 598 commands[command](baseDir, scriptName, opts, args, type)
577 else: 599 else:
578 print 'Command %s is not supported for this application type' % command 600 print 'Command %s is not supported for this application type' % command
579 usage(scriptName, type) 601 usage(scriptName, type)
580 else: 602 else:
581 print 'Command %s is unrecognized' % command 603 print 'Command %s is unrecognized' % command
582 usage(scriptName, type) 604 usage(scriptName, type)
OLDNEW
« no previous file with comments | « no previous file | localeTools.py » ('j') | localeTools.py » ('J')

Powered by Google App Engine
This is Rietveld