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

Unified Diff: tools/telemetry/third_party/rope/rope/refactor/importutils/importinfo.py

Issue 1132103009: Example of refactoring using rope library. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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
Index: tools/telemetry/third_party/rope/rope/refactor/importutils/importinfo.py
diff --git a/tools/telemetry/third_party/rope/rope/refactor/importutils/importinfo.py b/tools/telemetry/third_party/rope/rope/refactor/importutils/importinfo.py
new file mode 100644
index 0000000000000000000000000000000000000000..114080aac486abddf7e14025bc97733e7177ab70
--- /dev/null
+++ b/tools/telemetry/third_party/rope/rope/refactor/importutils/importinfo.py
@@ -0,0 +1,201 @@
+class ImportStatement(object):
+ """Represent an import in a module
+
+ `readonly` attribute controls whether this import can be changed
+ by import actions or not.
+
+ """
+
+ def __init__(self, import_info, start_line, end_line,
+ main_statement=None, blank_lines=0):
+ self.start_line = start_line
+ self.end_line = end_line
+ self.readonly = False
+ self.main_statement = main_statement
+ self._import_info = None
+ self.import_info = import_info
+ self._is_changed = False
+ self.new_start = None
+ self.blank_lines = blank_lines
+
+ def _get_import_info(self):
+ return self._import_info
+
+ def _set_import_info(self, new_import):
+ if not self.readonly and \
+ new_import is not None and not new_import == self._import_info:
+ self._is_changed = True
+ self._import_info = new_import
+
+ import_info = property(_get_import_info, _set_import_info)
+
+ def get_import_statement(self):
+ if self._is_changed or self.main_statement is None:
+ return self.import_info.get_import_statement()
+ else:
+ return self.main_statement
+
+ def empty_import(self):
+ self.import_info = ImportInfo.get_empty_import()
+
+ def move(self, lineno, blank_lines=0):
+ self.new_start = lineno
+ self.blank_lines = blank_lines
+
+ def get_old_location(self):
+ return self.start_line, self.end_line
+
+ def get_new_start(self):
+ return self.new_start
+
+ def is_changed(self):
+ return self._is_changed or (self.new_start is not None or
+ self.new_start != self.start_line)
+
+ def accept(self, visitor):
+ return visitor.dispatch(self)
+
+
+class ImportInfo(object):
+
+ def get_imported_primaries(self, context):
+ pass
+
+ def get_imported_names(self, context):
+ return [primary.split('.')[0]
+ for primary in self.get_imported_primaries(context)]
+
+ def get_import_statement(self):
+ pass
+
+ def is_empty(self):
+ pass
+
+ def __hash__(self):
+ return hash(self.get_import_statement())
+
+ def _are_name_and_alias_lists_equal(self, list1, list2):
+ if len(list1) != len(list2):
+ return False
+ for pair1, pair2 in zip(list1, list2):
+ if pair1 != pair2:
+ return False
+ return True
+
+ def __eq__(self, obj):
+ return isinstance(obj, self.__class__) and \
+ self.get_import_statement() == obj.get_import_statement()
+
+ def __ne__(self, obj):
+ return not self.__eq__(obj)
+
+ @staticmethod
+ def get_empty_import():
+ return EmptyImport()
+
+
+class NormalImport(ImportInfo):
+
+ def __init__(self, names_and_aliases):
+ self.names_and_aliases = names_and_aliases
+
+ def get_imported_primaries(self, context):
+ result = []
+ for name, alias in self.names_and_aliases:
+ if alias:
+ result.append(alias)
+ else:
+ result.append(name)
+ return result
+
+ def get_import_statement(self):
+ result = 'import '
+ for name, alias in self.names_and_aliases:
+ result += name
+ if alias:
+ result += ' as ' + alias
+ result += ', '
+ return result[:-2]
+
+ def is_empty(self):
+ return len(self.names_and_aliases) == 0
+
+
+class FromImport(ImportInfo):
+
+ def __init__(self, module_name, level, names_and_aliases):
+ self.module_name = module_name
+ self.level = level
+ self.names_and_aliases = names_and_aliases
+
+ def get_imported_primaries(self, context):
+ if self.names_and_aliases[0][0] == '*':
+ module = self.get_imported_module(context)
+ return [name for name in module
+ if not name.startswith('_')]
+ result = []
+ for name, alias in self.names_and_aliases:
+ if alias:
+ result.append(alias)
+ else:
+ result.append(name)
+ return result
+
+ def get_imported_resource(self, context):
+ """Get the imported resource
+
+ Returns `None` if module was not found.
+ """
+ if self.level == 0:
+ return context.project.find_module(
+ self.module_name, folder=context.folder)
+ else:
+ return context.project.find_relative_module(
+ self.module_name, context.folder, self.level)
+
+ def get_imported_module(self, context):
+ """Get the imported `PyModule`
+
+ Raises `rope.base.exceptions.ModuleNotFoundError` if module
+ could not be found.
+ """
+ if self.level == 0:
+ return context.project.get_module(
+ self.module_name, context.folder)
+ else:
+ return context.project.get_relative_module(
+ self.module_name, context.folder, self.level)
+
+ def get_import_statement(self):
+ result = 'from ' + '.' * self.level + self.module_name + ' import '
+ for name, alias in self.names_and_aliases:
+ result += name
+ if alias:
+ result += ' as ' + alias
+ result += ', '
+ return result[:-2]
+
+ def is_empty(self):
+ return len(self.names_and_aliases) == 0
+
+ def is_star_import(self):
+ return len(self.names_and_aliases) > 0 and \
+ self.names_and_aliases[0][0] == '*'
+
+
+class EmptyImport(ImportInfo):
+
+ names_and_aliases = []
+
+ def is_empty(self):
+ return True
+
+ def get_imported_primaries(self, context):
+ return []
+
+
+class ImportContext(object):
+
+ def __init__(self, project, folder):
+ self.project = project
+ self.folder = folder

Powered by Google App Engine
This is Rietveld 408576698