def get_new_class(self, name): body = sourceutils.fix_indentation( self._get_body(), sourceutils.get_indent(self.pycore) * 2) return 'class %s(object):\n\n%s%sdef __call__(self):\n%s' % \ (name, self._get_init(), ' ' * sourceutils.get_indent(self.pycore), body)
def get_new_class(self, name): body = sourceutils.fix_indentation( self._get_body(), sourceutils.get_indent(self.project) * 2) return "class %s(object):\n\n%s%sdef __call__(self):\n%s" % ( name, self._get_init(), " " * sourceutils.get_indent(self.project), body, )
def _get_factory_method(self, lines, class_scope, factory_name, global_): unit_indents = ' ' * sourceutils.get_indent(self.pycore) if global_: if self._get_scope_indents(lines, class_scope) > 0: raise rope.base.exceptions.RefactoringError( 'Cannot make global factory method for nested classes.') return ('\ndef %s(*args, **kwds):\n%sreturn %s(*args, **kwds)\n' % (factory_name, unit_indents, self.old_name)) unindented_factory = \ ('@staticmethod\ndef %s(*args, **kwds):\n' % factory_name + '%sreturn %s(*args, **kwds)\n' % (unit_indents, self.old_name)) indents = self._get_scope_indents(lines, class_scope) + \ sourceutils.get_indent(self.pycore) return '\n' + sourceutils.indent_lines(unindented_factory, indents)
def get_changes(self, classname=None, new_class_name=None): if new_class_name is not None: warnings.warn( "new_class_name parameter is deprecated; use classname", DeprecationWarning, stacklevel=2, ) classname = new_class_name collector = codeanalyze.ChangeCollector(self.pymodule.source_code) start, end = sourceutils.get_body_region(self.pyfunction) indents = sourceutils.get_indents( self.pymodule.lines, self.pyfunction.get_scope().get_start()) + sourceutils.get_indent( self.project) new_contents = " " * indents + "return %s(%s)()\n" % ( classname, ", ".join(self._get_parameter_names()), ) collector.add_change(start, end, new_contents) insertion = self._get_class_insertion_point() collector.add_change(insertion, insertion, "\n\n" + self.get_new_class(classname)) changes = change.ChangeSet( "Replace method with method object refactoring") changes.add_change( change.ChangeContents(self.resource, collector.get_changed())) return changes
def _get_factory_method(self, lines, class_scope, factory_name, global_): unit_indents = " " * sourceutils.get_indent(self.project) if global_: if self._get_scope_indents(lines, class_scope) > 0: raise rope.base.exceptions.RefactoringError( "Cannot make global factory method for nested classes.") return "\ndef %s(*args, **kwds):\n%sreturn %s(*args, **kwds)\n" % ( factory_name, unit_indents, self.old_name, ) unindented_factory = ( "@staticmethod\ndef %s(*args, **kwds):\n" % factory_name + "%sreturn %s(*args, **kwds)\n" % (unit_indents, self.old_name)) indents = self._get_scope_indents( lines, class_scope) + sourceutils.get_indent(self.project) return "\n" + sourceutils.indent_lines(unindented_factory, indents)
def _get_init(self): params = self._get_parameter_names() indents = ' ' * sourceutils.get_indent(self.pycore) if not params: return '' header = indents + 'def __init__(self' body = '' for arg in params: new_name = arg if arg == 'self': new_name = 'host' header += ', %s' % new_name body += indents * 2 + 'self.%s = %s\n' % (arg, new_name) header += '):' return '%s\n%s\n' % (header, body)
def _get_init(self): params = self._get_parameter_names() indents = " " * sourceutils.get_indent(self.project) if not params: return "" header = indents + "def __init__(self" body = "" for arg in params: new_name = arg if arg == "self": new_name = "host" header += ", %s" % new_name body += indents * 2 + "self.%s = %s\n" % (arg, new_name) header += "):" return "%s\n%s\n" % (header, body)
def _get_function_definition(self): args = self._find_function_arguments() returns = self._find_function_returns() result = [] if self.info.method and not self.info.make_global and \ _get_function_kind(self.info.scope) != 'method': result.append('@staticmethod\n') result.append('def %s:\n' % self._get_function_signature(args)) unindented_body = self._get_unindented_function_body(returns) indents = sourceutils.get_indent(self.info.project) function_body = sourceutils.indent_lines(unindented_body, indents) result.append(function_body) definition = ''.join(result) return definition + '\n'
def _change_holding_module(self, changes, renamer, getter, setter): pymodule = self.pycore.resource_to_pyobject(self.resource) class_scope = self._get_defining_class_scope() defining_object = self._get_defining_scope().pyobject start, end = sourceutils.get_body_region(defining_object) new_source = renamer.get_changed_module(pymodule=pymodule, skip_start=start, skip_end=end) if new_source is not None: pymodule = self.pycore.get_string_module(new_source, self.resource) class_scope = pymodule.get_scope().\ get_inner_scope_for_line(class_scope.get_start()) indents = sourceutils.get_indent(self.pycore) * ' ' getter = 'def %s(self):\n%sreturn self.%s' % \ (getter, indents, self.name) setter = 'def %s(self, value):\n%sself.%s = value' % \ (setter, indents, self.name) new_source = sourceutils.add_methods(pymodule, class_scope, [getter, setter]) return new_source
def get_changes(self, classname=None, new_class_name=None): if new_class_name is not None: warnings.warn( 'new_class_name parameter is deprecated; use classname', DeprecationWarning, stacklevel=2) classname = new_class_name collector = codeanalyze.ChangeCollector(self.pymodule.source_code) start, end = sourceutils.get_body_region(self.pyfunction) indents = sourceutils.get_indents( self.pymodule.lines, self.pyfunction.get_scope().get_start()) + \ sourceutils.get_indent(self.pycore) new_contents = ' ' * indents + 'return %s(%s)()\n' % \ (classname, ', '.join(self._get_parameter_names())) collector.add_change(start, end, new_contents) insertion = self._get_class_insertion_point() collector.add_change(insertion, insertion, '\n\n' + self.get_new_class(classname)) changes = change.ChangeSet('Replace method with method object refactoring') changes.add_change(change.ChangeContents(self.resource, collector.get_changed())) return changes
def get_new_method(self, name): return '%s\n%s' % ( self._get_new_header(name), sourceutils.fix_indentation(self._get_body(), sourceutils.get_indent(self.pycore)))
def get_new_method(self, name): return '%s\n%s' % (self._get_new_header(name), sourceutils.fix_indentation( self._get_body(), sourceutils.get_indent(self.project)))
def _get_scope_indents(self, pyobject): pymodule = pyobject.get_module() return sourceutils.get_indents( pymodule.lines, pyobject.get_scope().get_start()) + \ sourceutils.get_indent(self.project)
def get_new_method(self, name): return "%s\n%s" % ( self._get_new_header(name), sourceutils.fix_indentation(self._get_body(), sourceutils.get_indent(self.project)), )
def _get_scope_indents(self, pyobject): pymodule = pyobject.get_module() return sourceutils.get_indents(pymodule.lines, pyobject.get_scope().get_start()) + sourceutils.get_indent( self.project )