Index: tools/telemetry/third_party/rope/rope/base/libutils.py |
diff --git a/tools/telemetry/third_party/rope/rope/base/libutils.py b/tools/telemetry/third_party/rope/rope/base/libutils.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4037f183f576c23876daf62eba8c9a4644c625f2 |
--- /dev/null |
+++ b/tools/telemetry/third_party/rope/rope/base/libutils.py |
@@ -0,0 +1,122 @@ |
+"""A few useful functions for using rope as a library""" |
+import os.path |
+ |
+import rope.base.project |
+import rope.base.pycore |
+from rope.base import pyobjectsdef |
+from rope.base import utils |
+from rope.base import taskhandle |
+ |
+ |
+def path_to_resource(project, path, type=None): |
+ """Get the resource at path |
+ |
+ You only need to specify `type` if `path` does not exist. It can |
+ be either 'file' or 'folder'. If the type is `None` it is assumed |
+ that the resource already exists. |
+ |
+ Note that this function uses `Project.get_resource()`, |
+ `Project.get_file()`, and `Project.get_folder()` methods. |
+ |
+ """ |
+ project_path = path_relative_to_project_root(project, path) |
+ if project_path is None: |
+ project_path = rope.base.project._realpath(path) |
+ project = rope.base.project.get_no_project() |
+ if type is None: |
+ return project.get_resource(project_path) |
+ if type == 'file': |
+ return project.get_file(project_path) |
+ if type == 'folder': |
+ return project.get_folder(project_path) |
+ return None |
+ |
+ |
+def path_relative_to_project_root(project, path): |
+ return relative(project.address, path) |
+ |
+@utils.deprecated() |
+def relative(root, path): |
+ root = rope.base.project._realpath(root).replace(os.path.sep, '/') |
+ path = rope.base.project._realpath(path).replace(os.path.sep, '/') |
+ if path == root: |
+ return '' |
+ if path.startswith(root + '/'): |
+ return path[len(root) + 1:] |
+ |
+ |
+def report_change(project, path, old_content): |
+ """Report that the contents of file at `path` was changed |
+ |
+ The new contents of file is retrieved by reading the file. |
+ |
+ """ |
+ resource = path_to_resource(project, path) |
+ if resource is None: |
+ return |
+ for observer in list(project.observers): |
+ observer.resource_changed(resource) |
+ if project.pycore.automatic_soa: |
+ rope.base.pycore.perform_soa_on_changed_scopes(project, resource, |
+ old_content) |
+ |
+ |
+def analyze_module(project, resource): |
+ """Perform static object analysis on a python file in the project |
+ |
+ Note that this might be really time consuming. |
+ """ |
+ project.pycore.analyze_module(resource) |
+ |
+ |
+def analyze_modules(project, task_handle=taskhandle.NullTaskHandle()): |
+ """Perform static object analysis on all python files in the project |
+ |
+ Note that this might be really time consuming. |
+ """ |
+ resources = project.get_python_files() |
+ job_set = task_handle.create_jobset('Analyzing Modules', len(resources)) |
+ for resource in resources: |
+ job_set.started_job(resource.path) |
+ analyze_module(project, resource) |
+ job_set.finished_job() |
+ |
+ |
+def get_string_module(project, code, resource=None, force_errors=False): |
+ """Returns a `PyObject` object for the given code |
+ |
+ If `force_errors` is `True`, `exceptions.ModuleSyntaxError` is |
+ raised if module has syntax errors. This overrides |
+ ``ignore_syntax_errors`` project config. |
+ |
+ """ |
+ return pyobjectsdef.PyModule(project.pycore, code, resource, |
+ force_errors=force_errors) |
+ |
+ |
+def get_string_scope(project, code, resource=None): |
+ """Returns a `Scope` object for the given code""" |
+ return get_string_module(project, code, resource).get_scope() |
+ |
+ |
+def is_python_file(project, resource): |
+ return project.pycore.is_python_file(resource) |
+ |
+ |
+def modname(resource): |
+ if resource.is_folder(): |
+ module_name = resource.name |
+ source_folder = resource.parent |
+ elif resource.name == '__init__.py': |
+ module_name = resource.parent.name |
+ source_folder = resource.parent.parent |
+ else: |
+ module_name = resource.name[:-3] |
+ source_folder = resource.parent |
+ |
+ while source_folder != source_folder.parent and \ |
+ source_folder.has_child('__init__.py'): |
+ module_name = source_folder.name + '.' + module_name |
+ source_folder = source_folder.parent |
+ |
+ return module_name |