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

Unified Diff: third_party/google_input_tools/update.py

Issue 674153004: Add third_party/google-input-tools: Take 2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@google_input_tools
Patch Set: Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/google_input_tools/third_party/closure_library/third_party/closure/goog/mochikit/async/deferred.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/google_input_tools/update.py
diff --git a/third_party/google_input_tools/update.py b/third_party/google_input_tools/update.py
new file mode 100755
index 0000000000000000000000000000000000000000..ce0e79fdba8aaded71389da2bc582a61b62ffe4d
--- /dev/null
+++ b/third_party/google_input_tools/update.py
@@ -0,0 +1,243 @@
+#!/usr/bin/python
+# Copyright (c) 2014 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 logging
+import optparse
+import os
+import re
+import shutil
+import sys
+
+_BASE_REGEX_STRING = '^\s*goog\.%s\(\s*[\'"](.+)[\'"]\s*\)'
+require_regex = re.compile(_BASE_REGEX_STRING % 'require')
+provide_regex = re.compile(_BASE_REGEX_STRING % 'provide')
+
+# Entry-points required to build a virtual keyboard.
+namespaces = [
+ 'i18n.input.chrome.inputview.Controller',
+ 'i18n.input.chrome.inputview.content.compact.letter',
+ 'i18n.input.chrome.inputview.content.compact.util',
+ 'i18n.input.chrome.inputview.content.compact.symbol',
+ 'i18n.input.chrome.inputview.content.compact.more',
+ 'i18n.input.chrome.inputview.content.compact.numberpad',
+ 'i18n.input.chrome.inputview.content.ContextlayoutUtil',
+ 'i18n.input.chrome.inputview.content.util',
+ 'i18n.input.chrome.inputview.EmojiType',
+ 'i18n.input.chrome.inputview.layouts.CompactSpaceRow',
+ 'i18n.input.chrome.inputview.layouts.RowsOf101',
+ 'i18n.input.chrome.inputview.layouts.RowsOf102',
+ 'i18n.input.chrome.inputview.layouts.RowsOfCompact',
+ 'i18n.input.chrome.inputview.layouts.RowsOfJP',
+ 'i18n.input.chrome.inputview.layouts.SpaceRow',
+ 'i18n.input.chrome.inputview.layouts.util',
+ 'i18n.input.hwt.util']
+
+
+def ProcessFile(filename):
+ """Extracts provided and required namespaces.
+
+ Description:
+ Scans Javascript file for provied and required namespaces.
+
+ Args:
+ filename: name of the file to process.
+
+ Returns:
+ Pair of lists, where the first list contains namespaces provided by the file
+ and the second contains a list of requirements.
+ """
+ provides = []
+ requires = []
+ file_handle = open(filename, 'r')
+ try:
+ for line in file_handle:
+ if re.match(require_regex, line):
+ requires.append(re.search(require_regex, line).group(1))
+ if re.match(provide_regex, line):
+ provides.append(re.search(provide_regex, line).group(1))
+ finally:
+ file_handle.close()
+ return provides, requires
+
+
+def ExpandDirectories(refs):
+ """Expands any directory references into inputs.
+
+ Description:
+ Looks for any directories in the provided references. Found directories
+ are recursively searched for .js files.
+
+ Args:
+ refs: a list of directories.
+
+ Returns:
+ Pair of maps, where the first maps each namepace to the filename that
+ provides the namespace, and the second maps a filename to prerequisite
+ namespaces.
+ """
+ providers = {}
+ requirements = {}
+ for ref in refs:
+ if os.path.isdir(ref):
+ for (root, dirs, files) in os.walk(ref):
+ for name in files:
+ if name.endswith('js'):
+ filename = os.path.join(root, name)
+ provides, requires = ProcessFile(filename)
+ for p in provides:
+ providers[p] = filename
+ requirements[filename] = []
+ for r in requires:
+ requirements[filename].append(r)
+ return providers, requirements
+
+
+def ExtractDependencies(namespace, providers, requirements, dependencies):
+ """Recursively extracts all dependencies for a namespace.
+ Description:
+ Recursively extracts all dependencies for a namespace.
+
+ Args:
+ namespace: The namespace to process.
+ providers: Mapping of namespace to filename that provides the namespace.
+ requireemnts: Mapping of filename to a list of prerequisite namespaces.
+ Returns:
+ """
+ if namespace in providers:
+ filename = providers[namespace]
+ if not filename in dependencies:
+ for ns in requirements[filename]:
+ ExtractDependencies(ns, providers, requirements, dependencies)
+ dependencies.add(filename)
+
+
+def HomeDir():
+ """Resolves the user's home directory."""
+
+ return os.path.expanduser('~')
+
+
+def ExpandPathRelativeToHome(path):
+ """Resolves a path that is relative to the home directory.
+
+ Args:
+ path: Relative path.
+
+ Returns:
+ Resolved path.
+ """
+
+ return os.path.join(os.path.expanduser('~'), path)
+
+
+def GetGoogleInputToolsSandboxFromOptions(options):
+ """Generate the input-input-tools path from the --input flag.
+
+ Args:
+ options: Flags to update.py.
+ Returns:
+ Path to the google-input-tools sandbox.
+ """
+
+ path = options.input
+ if not path:
+ path = ExpandPathRelativeToHome('google-input-tools')
+ print 'Unspecified path for google-input-tools. Defaulting to %s' % path
+ return path
+
+
+def GetClosureLibrarySandboxFromOptions(options):
+ """Generate the closure-library path from the --input flag.
+
+ Args:
+ options: Flags to update.py.
+ Returns:
+ Path to the closure-library sandbox.
+ """
+
+ path = options.lib
+ if not path:
+ path = ExpandPathRelativeToHome('closure-library')
+ print 'Unspecified path for closure-library. Defaulting to %s' % path
+ return path
+
+
+def CopyFile(source, target):
+ """Copies a file from the source to the target location.
+
+ Args:
+ source: Path to the source file to copy.
+ target: Path to the target location to copy the file.
+ """
+ print '%s --> %s' % (source, target)
+ if not os.path.exists(os.path.dirname(target)):
+ os.makedirs(os.path.dirname(target))
+ shutil.copy(source, target)
+
+
+def UpdateFile(filename, input_source, closure_source):
+ """Updates files in third_party/google_input_tools.
+ Args:
+ filename: The file to update.
+ input_source: Root of the google_input_tools sandbox.
+ closure_source: Root of the closure_library sandbox.
+ """
+ target = ''
+ if filename.startswith(input_source):
+ target = os.path.join('src', filename[len(input_source)+1:])
+ elif filename.startswith(closure_source):
+ target = os.path.join('third_party/closure_library', \
+ filename[len(closure_source)+1:])
+ if len(target) > 0:
+ CopyFile(filename, target)
+
+
+def main():
+ """The entrypoint for this script."""
+
+ logging.basicConfig(format='update.py: %(message)s', level=logging.INFO)
+
+ usage = 'usage: %prog [options] arg'
+ parser = optparse.OptionParser(usage)
+ parser.add_option('-i',
+ '--input',
+ dest='input',
+ action='append',
+ help='Path to the google-input-tools sandbox.')
+ parser.add_option('-l',
+ '--lib',
+ dest='lib',
+ action='store',
+ help='Path to the closure-library sandbox.')
+
+ (options, args) = parser.parse_args()
+
+ input_path = GetGoogleInputToolsSandboxFromOptions(options)
+ closure_library_path = GetClosureLibrarySandboxFromOptions(options)
+
+ print 'iput_path = %s' % input_path
+ print 'closure_library_path = %s' % closure_library_path
+
+ if not os.path.isdir(input_path):
+ print 'Could not find google-input-tools sandbox.'
+ exit(1)
+ if not os.path.isdir(closure_library_path):
+ print 'Could not find closure-library sandbox.'
+ exit(1)
+
+ (providers, requirements) = \
+ ExpandDirectories([os.path.join(input_path, 'chrome'),
+ closure_library_path])
+
+ dependencies = set()
+
+ for name in namespaces:
+ ExtractDependencies(name, providers, requirements, dependencies)
+
+ for name in dependencies:
+ UpdateFile(name, input_path, closure_library_path)
+
+if __name__ == '__main__':
+ main()
« no previous file with comments | « third_party/google_input_tools/third_party/closure_library/third_party/closure/goog/mochikit/async/deferred.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698