Index: tools/telemetry/refactor |
diff --git a/tools/telemetry/refactor b/tools/telemetry/refactor |
deleted file mode 100755 |
index d39164eccd8ba388e6a4cc0db626920e6df2e76d..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/refactor |
+++ /dev/null |
@@ -1,268 +0,0 @@ |
-#! /usr/bin/env python |
-# Copyright 2015 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 cStringIO |
-import functools |
-import imp |
-import inspect |
-import itertools |
-import operator |
-import os |
-import re |
-import sys |
- |
-sys.path.insert(1, os.path.abspath(os.path.join( |
- os.path.dirname(__file__), '..', '..', 'third_party', 'catapult', |
- 'catapult_base') |
-from catapult_base import refactor |
-from catapult_base.refactor_util import move |
- |
-from telemetry.internal.util import command_line |
-from telemetry.internal.util import path |
- |
- |
-_RELATIVE_BASE_DIRS = ( |
- ('chrome', 'test', 'telemetry'), |
- ('content', 'test', 'gpu'), |
- ('tools', 'bisect-manual-test.py'), |
- ('tools', 'chrome_proxy'), |
- ('tools', 'perf'), |
- ('tools', 'profile_chrome', 'perf_controller.py'), |
- ('tools', 'run-bisect-manual-test.py'), |
- ('third_party', 'skia', 'tools', 'skp', 'page_sets'), |
- ('third_party', 'trace-viewer'), |
-) |
-# All folders dependent on Telemetry, found using a code search. |
-# Note that this is not the same as the directory that imports are relative to. |
-BASE_DIRS = [path.GetTelemetryDir()] + [ |
- os.path.join(path.GetChromiumSrcDir(), *dir_path) |
- for dir_path in _RELATIVE_BASE_DIRS] |
- |
- |
-def SortImportGroups(module_path): |
- """Sort each group of imports in the given Python module. |
- |
- A group is a collection of adjacent import statements, with no non-import |
- lines in between. Groups are sorted according to the Google Python Style |
- Guide: "lexicographically, ignoring case, according to each module's full |
- package path." |
- """ |
- _TransformImportGroups(module_path, _SortImportGroup) |
- |
- |
-def _SortImportGroup(import_group): |
- def _ImportComparator(import1, import2): |
- _, root1, module1, _, _ = import1 |
- _, root2, module2, _, _ = import2 |
- full_module1 = (root1 + '.' + module1 if root1 else module1).lower() |
- full_module2 = (root2 + '.' + module2 if root2 else module2).lower() |
- return cmp(full_module1, full_module2) |
- return sorted(import_group, cmp=_ImportComparator) |
- |
- |
-def _TransformImportGroups(module_path, transformation): |
- """Apply a transformation to each group of imports in the given module. |
- |
- An import is a tuple of (indent, root, module, alias, suffix), |
- serialized as <indent>from <root> import <module> as <alias><suffix>. |
- |
- Args: |
- module_path: The module to apply transformations on. |
- transformation: A function that takes in an import group and returns a |
- modified import group. An import group is a list of import tuples. |
- |
- Returns: |
- True iff the module was modified, and False otherwise. |
- """ |
- def _WriteImports(output_stream, import_group): |
- for indent, root, module, alias, suffix in transformation(import_group): |
- output_stream.write(indent) |
- if root: |
- output_stream.write('from ') |
- output_stream.write(root) |
- output_stream.write(' ') |
- output_stream.write('import ') |
- output_stream.write(module) |
- if alias: |
- output_stream.write(' as ') |
- output_stream.write(alias) |
- output_stream.write(suffix) |
- output_stream.write('\n') |
- |
- # Read the file so we can diff it later to determine if we made any changes. |
- with open(module_path, 'r') as module_file: |
- original_file = module_file.read() |
- |
- # Locate imports using regex, group them, and transform each one. |
- # This regex produces a tuple of (indent, root, module, alias, suffix). |
- regex = (r'(\s*)(?:from ((?:[a-z0-9_]+\.)*[a-z0-9_]+) )?' |
- r'import ((?:[a-z0-9_]+\.)*[A-Za-z0-9_]+)(?: as ([A-Za-z0-9_]+))?(.*)') |
- pattern = re.compile(regex) |
- |
- updated_file = cStringIO.StringIO() |
- with open(module_path, 'r') as module_file: |
- import_group = [] |
- for line in module_file: |
- import_match = pattern.match(line) |
- if import_match: |
- import_group.append(list(import_match.groups())) |
- continue |
- |
- if not import_group: |
- updated_file.write(line) |
- continue |
- |
- _WriteImports(updated_file, import_group) |
- import_group = [] |
- |
- updated_file.write(line) |
- |
- if import_group: |
- _WriteImports(updated_file, import_group) |
- import_group = [] |
- |
- if original_file == updated_file.getvalue(): |
- return False |
- |
- with open(module_path, 'w') as module_file: |
- module_file.write(updated_file.getvalue()) |
- return True |
- |
- |
-def _CountInterfaces(module): |
- return (len(list(module.FindChildren(refactor.Class))) + |
- len(list(module.FindChildren(refactor.Function)))) |
- |
- |
-def _IsSourceDir(dir_name): |
- return dir_name[0] != '.' and dir_name != 'third_party' |
- |
- |
-def _IsPythonModule(file_name): |
- _, ext = os.path.splitext(file_name) |
- return ext == '.py' |
- |
- |
-class Count(command_line.Command): |
- """Print the number of public modules.""" |
- |
- @classmethod |
- def AddCommandLineArgs(cls, parser): |
- parser.add_argument('type', nargs='?', choices=('interfaces', 'modules'), |
- default='modules') |
- |
- def Run(self, args): |
- module_paths = path.ListFiles( |
- path.GetTelemetryDir(), self._IsPublicApiDir, self._IsPublicApiFile) |
- |
- if args.type == 'modules': |
- print len(module_paths) |
- elif args.type == 'interfaces': |
- print reduce(operator.add, refactor.Transform(_CountInterfaces, module_paths)) |
- |
- return 0 |
- |
- @staticmethod |
- def _IsPublicApiDir(dir_name): |
- return (dir_name[0] != '.' and dir_name[0] != '_' and |
- dir_name != 'internal' and dir_name != 'third_party') |
- |
- @staticmethod |
- def _IsPublicApiFile(file_name): |
- root, ext = os.path.splitext(file_name) |
- return (file_name[0] != '.' and |
- not root.endswith('_unittest') and ext == '.py') |
- |
- |
-def _TelemetryFiles(): |
- list_files = functools.partial(path.ListFiles, |
- should_include_dir=_IsSourceDir, |
- should_include_file=_IsPythonModule) |
- return sorted(itertools.chain(*map(list_files, BASE_DIRS))) |
- |
- |
-class Mv(command_line.Command): |
- """Move modules or packages.""" |
- |
- @classmethod |
- def AddCommandLineArgs(cls, parser): |
- parser.add_argument('source', nargs='+') |
- parser.add_argument('target') |
- |
- @classmethod |
- def ProcessCommandLineArgs(cls, parser, args): |
- # Check source file paths. |
- for source_path in args.source: |
- # Ensure source path exists. |
- if not os.path.exists(source_path): |
- parser.error('"%s" not found.' % source_path) |
- |
- # Ensure source path is in one of the BASE_DIRS. |
- for base_dir in BASE_DIRS: |
- if path.IsSubpath(source_path, base_dir): |
- break |
- else: |
- parser.error('"%s" is not in any of the base dirs.') |
- |
- # Ensure target directory exists. |
- if not (os.path.exists(args.target) or |
- os.path.exists(os.path.dirname(args.target))): |
- parser.error('"%s" not found.' % args.target) |
- |
- # Ensure target path is in one of the BASE_DIRS. |
- for base_dir in BASE_DIRS: |
- if path.IsSubpath(args.target, base_dir): |
- break |
- else: |
- parser.error('"%s" is not in any of the base dirs.') |
- |
- # If there are multiple source paths, ensure target is a directory. |
- if len(args.source) > 1 and not os.path.isdir(args.target): |
- parser.error('Target "%s" is not a directory.' % args.target) |
- |
- # Ensure target is not in any of the source paths. |
- for source_path in args.source: |
- if path.IsSubpath(args.target, source_path): |
- parser.error('Cannot move "%s" to a subdirectory of itself, "%s".' % |
- (source_path, args.target)) |
- |
- def Run(self, args): |
- move.Run(args.source, args.target, _TelemetryFiles()) |
- for module_path in _TelemetryFiles(): |
- SortImportGroups(module_path) |
- return 0 |
- |
- |
-class Sort(command_line.Command): |
- """Sort imports.""" |
- |
- @classmethod |
- def AddCommandLineArgs(cls, parser): |
- parser.add_argument('target', nargs='*') |
- |
- @classmethod |
- def ProcessCommandLineArgs(cls, parser, args): |
- for target in args.target: |
- if not os.path.exists(target): |
- parser.error('"%s" not found.' % target) |
- |
- def Run(self, args): |
- if args.target: |
- targets = args.target |
- else: |
- targets = BASE_DIRS |
- |
- for base_dir in targets: |
- for module_path in path.ListFiles(base_dir, _IsSourceDir, _IsPythonModule): |
- SortImportGroups(module_path) |
- return 0 |
- |
- |
-class RefactorCommand(command_line.SubcommandCommand): |
- commands = (Count, Mv, Sort,) |
- |
- |
-if __name__ == '__main__': |
- sys.exit(RefactorCommand.main()) |