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

Unified Diff: tools/telemetry/telemetry/internal/util/find_dependencies.py

Issue 1254173003: [telemetry] Add Python dynamic analysis find_dependencies. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Do both checks. Allow user to specify a directory. Created 5 years, 5 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/telemetry/telemetry/internal/util/find_dependencies.py
diff --git a/tools/telemetry/telemetry/internal/util/find_dependencies.py b/tools/telemetry/telemetry/internal/util/find_dependencies.py
index 2082565ea83ad0671204fac62240b4fc6b4a82d6..6e652ac708094c5d76c0f95ad660d207dc1efa60 100644
--- a/tools/telemetry/telemetry/internal/util/find_dependencies.py
+++ b/tools/telemetry/telemetry/internal/util/find_dependencies.py
@@ -22,6 +22,12 @@ from telemetry.internal.util import path_set
DEPS_FILE = 'bootstrap_deps'
+def _LoadModules(module_paths):
+ for module_path in module_paths:
+ imp.load_source(
+ os.path.splitext(os.path.basename(module_path))[0], module_path)
+
+
def FindBootstrapDependencies(base_dir):
deps_file = os.path.join(base_dir, DEPS_FILE)
if not os.path.exists(deps_file):
@@ -32,18 +38,49 @@ def FindBootstrapDependencies(base_dir):
for deps_path in deps_paths)
-def FindPythonDependencies(module_path):
+def FindDynamicAnalysisDependencies(module_paths):
nednguyen 2015/08/04 22:22:02 the method name is ambiguous.
+ logging.info('Finding Python dependencies of %s' % module_paths)
+
+ # Load the modules to inherit their sys.path modifications and imports.
+ _LoadModules(module_paths)
nednguyen 2015/08/04 22:22:01 Wouldn't this includes module imported by this fil
+
+ # Analyze the imports.
+ for module in sys.modules.itervalues():
nednguyen 2015/08/04 22:22:02 So I guess the difference between this and other m
+ if not module:
+ continue
+ if not hasattr(module, '__file__'):
+ continue
+
+ module_path = os.path.realpath(module.__file__)
+
+ # If it's a .pyc, change it to .py instead.
+ root, ext = os.path.splitext(module_path)
+ if ext == '.pyc':
+ module_path = root + '.py'
+ if not os.path.exists(module_path):
+ continue
+
+ # If it's an __init__.py, use the package's folder.
+ if module_path.endswith('__init__.py'):
+ module_path = os.path.split(module_path)[0]
+
+ # Filter for only imports in Chromium.
+ if not path.IsSubpath(module_path, path.GetChromiumSrcDir()):
+ continue
+
+ yield module_path
+
+
+def FindStaticAnalysisDependencies(module_path):
nednguyen 2015/08/04 22:22:01 ditto
logging.info('Finding Python dependencies of %s' % module_path)
# Load the module to inherit its sys.path modifications.
- imp.load_source(
- os.path.splitext(os.path.basename(module_path))[0], module_path)
+ _LoadModules([module_path])
nednguyen 2015/08/04 22:22:01 Doesn't modulefinder also execute the sys.path mod
# Analyze the module for its imports.
finder = modulefinder.ModuleFinder()
finder.run_script(module_path)
- # Filter for only imports in Chromium.
for module in finder.modules.itervalues():
# If it's an __init__.py, module.__path__ gives the package's folder.
module_path = module.__path__[0] if module.__path__ else module.__file__
@@ -51,6 +88,8 @@ def FindPythonDependencies(module_path):
continue
module_path = os.path.realpath(module_path)
+
+ # Filter for only imports in Chromium.
if not path.IsSubpath(module_path, path.GetChromiumSrcDir()):
continue
@@ -126,23 +165,38 @@ def FindDependencies(target_paths, options):
dependencies = path_set.PathSet()
+ # Bootstrap deps.
+ dependencies |= FindBootstrapDependencies(path.GetTelemetryDir())
+
+ # Deps for Telemetry files.
+ def IsSourceDir(dir_name):
+ return dir_name not in ('experimental', 'image_processing', 'third_party')
+ def IsPythonModule(file_name):
+ return os.path.splitext(file_name)[1] == '.py'
+ dependencies |= FindDynamicAnalysisDependencies(
+ path.ListFiles(path.GetTelemetryDir(), IsSourceDir, IsPythonModule))
+
# Including Telemetry's major entry points will (hopefully) include Telemetry
# and all its dependencies. If the user doesn't pass any arguments, we just
# have Telemetry.
- dependencies |= FindPythonDependencies(os.path.realpath(
+ dependencies |= FindStaticAnalysisDependencies(os.path.realpath(
os.path.join(path.GetTelemetryDir(), 'telemetry', 'benchmark_runner.py')))
- dependencies |= FindPythonDependencies(os.path.realpath(
+ dependencies |= FindStaticAnalysisDependencies(os.path.realpath(
os.path.join(path.GetTelemetryDir(),
'telemetry', 'testing', 'run_tests.py')))
- dependencies |= FindBootstrapDependencies(path.GetTelemetryDir())
# Add dependencies.
for target_path in target_paths:
- base_dir = os.path.dirname(os.path.realpath(target_path))
+ target_path = os.path.realpath(target_path)
+ if os.path.isdir(target_path):
+ base_dir = target_path
+ else:
+ dependencies |= FindStaticAnalysisDependencies(target_path)
+ base_dir = os.path.dirname(os.path.realpath(target_path))
dependencies.add(base_dir)
dependencies |= FindBootstrapDependencies(base_dir)
- dependencies |= FindPythonDependencies(target_path)
+ dependencies |= FindDynamicAnalysisDependencies(base_dir)
if options.include_page_set_data:
dependencies |= FindPageSetDependencies(base_dir)
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698