diff options
| author | Wolfgang Schnerring <wosc@wosc.de> | 2009-09-12 13:55:07 +0000 |
|---|---|---|
| committer | Wolfgang Schnerring <wosc@wosc.de> | 2009-09-12 13:55:07 +0000 |
| commit | 4c501947b4a00c66b2dd6985af86c4143eaed3df (patch) | |
| tree | 48d83043c924216a902d40d4d45f445ad21b894b | |
| parent | dbb278181096682b723163ed928a514399a12a5c (diff) | |
| download | zope-interface-4c501947b4a00c66b2dd6985af86c4143eaed3df.tar.gz | |
revert accidental checkin that should have been on a branch
| -rw-r--r-- | src/zope/interface/fixers/__init__.py | 0 | ||||
| -rw-r--r-- | src/zope/interface/fixers/base.py | 178 | ||||
| -rw-r--r-- | src/zope/interface/fixers/fix_class_provides.py | 23 | ||||
| -rw-r--r-- | src/zope/interface/fixers/fix_implements.py | 23 | ||||
| -rw-r--r-- | src/zope/interface/fixers/fix_implements_only.py | 23 | ||||
| -rw-r--r-- | src/zope/interface/fixers/tests.py | 436 |
6 files changed, 0 insertions, 683 deletions
diff --git a/src/zope/interface/fixers/__init__.py b/src/zope/interface/fixers/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/src/zope/interface/fixers/__init__.py +++ /dev/null diff --git a/src/zope/interface/fixers/base.py b/src/zope/interface/fixers/base.py deleted file mode 100644 index 796bc91..0000000 --- a/src/zope/interface/fixers/base.py +++ /dev/null @@ -1,178 +0,0 @@ -############################################################################## -# -# Copyright (c) 2009 Zope Corporation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Fixer for class interface declarations to class decorators - -$Id$ -""" - -# Local imports -from lib2to3.fixer_base import BaseFix -from lib2to3.patcomp import PatternCompiler -from lib2to3.fixer_util import syms, Name -from lib2to3.fixer_util import Node, Leaf - -class Function2DecoratorBase(BaseFix): - - IMPORT_PATTERN = """ - import_from< 'from' dotted_name< 'zope' '.' 'interface' > 'import' import_as_names< any* (name='%(function_name)s') any* > > - | - import_from< 'from' dotted_name< 'zope' '.' 'interface' > 'import' name='%(function_name)s' any* > - | - import_from< 'from' dotted_name< 'zope' > 'import' name='interface' any* > - | - import_from< 'from' dotted_name< 'zope' '.' 'interface' > 'import' import_as_name< name='%(function_name)s' 'as' rename=(any) any*> > - | - import_from< 'from' dotted_name< 'zope' > 'import' import_as_name< name='interface' 'as' rename=(any) any*> > - | - import_from< 'from' 'zope' 'import' import_as_name< 'interface' 'as' interface_rename=(any) > > - """ - - CLASS_PATTERN = """ - decorated< decorator <any* > classdef< 'class' any* ':' suite< any* simple_stmt< power< statement=(%(match)s) trailer < '(' interface=any ')' > any* > any* > any* > > > - | - classdef< 'class' any* ':' suite< any* simple_stmt< power< statement=(%(match)s) trailer < '(' interface=any ')' > any* > any* > any* > > - """ - - FUNCTION_PATTERN = """ - simple_stmt< power< old_statement=(%s) trailer < '(' any* ')' > > any* > - """ - - def should_skip(self, node): - module = str(node) - return not ('zope' in module and 'interface' in module) - - def compile_pattern(self): - # Compile the import pattern. - self.named_import_pattern = PatternCompiler().compile_pattern( - self.IMPORT_PATTERN % {'function_name': self.FUNCTION_NAME}) - - def start_tree(self, tree, filename): - # Compile the basic class/function matches. This is done per tree, - # as further matches (based on what imports there are) also are done - # per tree. - self.class_patterns = [] - self.function_patterns = [] - self.fixups = [] - - self._add_pattern("'%s'" % self.FUNCTION_NAME) - self._add_pattern("'interface' trailer< '.' '%s' >" % self.FUNCTION_NAME) - self._add_pattern("'zope' trailer< '.' 'interface' > trailer< '.' '%s' >" % self.FUNCTION_NAME) - - def _add_pattern(self, match): - self.class_patterns.append(PatternCompiler().compile_pattern( - self.CLASS_PATTERN % {'match': match})) - self.function_patterns.append(PatternCompiler().compile_pattern( - self.FUNCTION_PATTERN % match)) - - def match(self, node): - # Matches up the imports - results = {"node": node} - if self.named_import_pattern.match(node, results): - return results - - # Now match classes on all import variants found: - for pattern in self.class_patterns: - if pattern.match(node, results): - return results - - def transform(self, node, results): - if 'name' in results: - # This matched an import statement. Fix that up: - name = results["name"] - name.replace(Name(self.DECORATOR_NAME, prefix=name.prefix)) - if 'rename' in results: - # The import statement use import as - self._add_pattern("'%s'" % results['rename'].value) - if 'interface_rename' in results: - self._add_pattern("'%s' trailer< '.' '%s' > " % ( - results['interface_rename'].value, self.FUNCTION_NAME)) - if 'statement' in results: - # This matched a class that has an <FUNCTION_NAME>(IFoo) statement. - # We must convert that statement to a class decorator - # and put it before the class definition. - - statement = results['statement'] - if not isinstance(statement, list): - statement = [statement] - # Make a copy for insertion before the class: - statement = [x.clone() for x in statement] - # Get rid of leading whitespace: - statement[0].prefix = '' - # Rename function to decorator: - if statement[-1].children: - func = statement[-1].children[-1] - else: - func = statement[-1] - if func.value == self.FUNCTION_NAME: - func.value = self.DECORATOR_NAME - - interface = results['interface'] - if not isinstance(interface, list): - interface = [interface] - interface = [x.clone() for x in interface] - - # Create the decorator: - decorator = Node(syms.decorator, [Leaf(50, '@'),] + statement + - [Leaf(7, '(')] + interface + [Leaf(8, ')')]) - - # Take the current class constructor prefix, and stick it into - # the decorator, to set the decorators indentation. - nodeprefix = node.prefix - decorator.prefix = nodeprefix - # Preserve only the indent: - if '\n' in nodeprefix: - nodeprefix = nodeprefix[nodeprefix.rfind('\n')+1:] - - # Then find the last line of the previous node and use that as - # indentation, and add that to the class constructors prefix. - - previous = node.prev_sibling - if previous is None: - prefix = '' - else: - prefix = str(previous) - if '\n' in prefix: - prefix = prefix[prefix.rfind('\n')+1:] - prefix = prefix + nodeprefix - - if not prefix or prefix[0] != '\n': - prefix = '\n' + prefix - node.prefix = prefix - new_node = Node(syms.decorated, [decorator, node.clone()]) - # Look for the actual function calls in the new node and remove it. - for node in new_node.post_order(): - for pattern in self.function_patterns: - if pattern.match(node, results): - parent = node.parent - previous = node.prev_sibling - # Remove the node - node.remove() - if not str(parent).strip(): - # This is an empty class. Stick in a pass - if (len(parent.children) < 3 or - ' ' in parent.children[2].value): - # This class had no body whitespace. - parent.insert_child(2, Leaf(0, ' pass')) - else: - # This class had body whitespace already. - parent.insert_child(2, Leaf(0, 'pass')) - parent.insert_child(3, Leaf(0, '\n')) - elif (prefix and isinstance(previous, Leaf) and - '\n' not in previous.value and - previous.value.strip() == ''): - # This is just whitespace, remove it: - previous.remove() - - return new_node - diff --git a/src/zope/interface/fixers/fix_class_provides.py b/src/zope/interface/fixers/fix_class_provides.py deleted file mode 100644 index 224782d..0000000 --- a/src/zope/interface/fixers/fix_class_provides.py +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################## -# -# Copyright (c) 2009 Zope Corporation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Fixer for implements(IX) -> @implementer(IX). - -$Id$ -""" - -from .base import Function2DecoratorBase - -class FixClassProvides(Function2DecoratorBase): - FUNCTION_NAME = 'classProvides' - DECORATOR_NAME = 'provider' diff --git a/src/zope/interface/fixers/fix_implements.py b/src/zope/interface/fixers/fix_implements.py deleted file mode 100644 index 6e1c24b..0000000 --- a/src/zope/interface/fixers/fix_implements.py +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################## -# -# Copyright (c) 2009 Zope Corporation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Fixer for implements(IX) -> @implementer(IX). - -$Id$ -""" - -from .base import Function2DecoratorBase - -class FixImplements(Function2DecoratorBase): - FUNCTION_NAME = 'implements' - DECORATOR_NAME = 'implementer' diff --git a/src/zope/interface/fixers/fix_implements_only.py b/src/zope/interface/fixers/fix_implements_only.py deleted file mode 100644 index 6a832dc..0000000 --- a/src/zope/interface/fixers/fix_implements_only.py +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################## -# -# Copyright (c) 2009 Zope Corporation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Fixer for implements(IX) -> @implementer(IX). - -$Id$ -""" - -from .base import Function2DecoratorBase - -class FixImplementsOnly(Function2DecoratorBase): - FUNCTION_NAME = 'implementsOnly' - DECORATOR_NAME = 'implementer_only' diff --git a/src/zope/interface/fixers/tests.py b/src/zope/interface/fixers/tests.py deleted file mode 100644 index 814be43..0000000 --- a/src/zope/interface/fixers/tests.py +++ /dev/null @@ -1,436 +0,0 @@ -import unittest -from lib2to3.refactor import RefactoringTool - -# Check that various import syntaxes get renamed properly. -imports_source = """ -from zope.interface import Interface, implements, providedBy -from zope.interface import providedBy, implements, Interface -from zope.interface import providedBy, implements -from zope.interface import implements, Interface -from zope.interface import implements -from zope.interface import implements as renamed -""" - -imports_target = """ -from zope.interface import Interface, implementer, providedBy -from zope.interface import providedBy, implementer, Interface -from zope.interface import providedBy, implementer -from zope.interface import implementer, Interface -from zope.interface import implementer -from zope.interface import implementer as renamed -""" - -# Test a simple case. -simple_source = """ -from zope.interface import implements - -class IFoo(Interface): - pass - -class Foo: - "An IFoo class" - - implements(IFoo) -""" - -simple_target = """ -from zope.interface import implementer - -class IFoo(Interface): - pass - -@implementer(IFoo) -class Foo: - "An IFoo class" -""" - -# Multiple interfaces: -multi_source = """ -from zope.interface import implements - -class IFoo(Interface): - pass - -class IBar(Interface): - pass - -class Foo: - "An IFoo class" - - implements(IFoo, IBar) -""" - -multi_target = """ -from zope.interface import implementer - -class IFoo(Interface): - pass - -class IBar(Interface): - pass - -@implementer(IFoo, IBar) -class Foo: - "An IFoo class" -""" - -# Make sure it works even if implements gets renamed. -renamed_source = """ -from zope.interface import implements as renamed - -class IBar(Interface): - pass - -class Bar: - "An IBar class" - - renamed(IBar) -""" - -renamed_target = """ -from zope.interface import implementer as renamed - -class IBar(Interface): - pass - -@renamed(IBar) -class Bar: - "An IBar class" -""" - -# Often only the module gets imported. -module_import_source = """ -from zope import interface - -class IFoo(Interface): - pass - -class Foo: - "An IFoo class" - - interface.implements(IFoo) -""" - -module_import_target = """ -from zope import interface - -class IFoo(Interface): - pass - -@interface.implementer(IFoo) -class Foo: - "An IFoo class" -""" - -# Interface can get renamed. It's unusual, but should be supported. -module_renamed_source = """ -from zope import interface as zopeinterface - -class IFoo(Interface): - pass - -class Foo: - "An IFoo class" - - zopeinterface.implements(IFoo) -""" - -module_renamed_target = """ -from zope import interface as zopeinterface - -class IFoo(Interface): - pass - -@zopeinterface.implementer(IFoo) -class Foo: - "An IFoo class" -""" - -# Many always uses the full module name. -full_import_source = """ -import zope.interface - -class IFoo(Interface): - pass - -class Foo: - "An IFoo class" - - zope.interface.implements(IFoo) -""" - -full_import_target = """ -import zope.interface - -class IFoo(Interface): - pass - -@zope.interface.implementer(IFoo) -class Foo: - "An IFoo class" -""" - -# Empty classes: -empty_class_source = """ -import zope.interface - -class IFoo(Interface): - pass - -class Foo: - zope.interface.implements(IFoo) - -""" - -empty_class_target = """ -import zope.interface - -class IFoo(Interface): - pass - -@zope.interface.implementer(IFoo) -class Foo: - pass - -""" - -# Classes with indentation: -indented_class_source = """ -import zope.interface - -class IFoo(Interface): - pass - -def forceindent(): - class Foo: - zope.interface.implements(IFoo) - - class Bar: - zope.interface.implements(IFoo) - -""" - -indented_class_target = """ -import zope.interface - -class IFoo(Interface): - pass - -def forceindent(): - @zope.interface.implementer(IFoo) - class Foo: - pass - - @zope.interface.implementer(IFoo) - class Bar: - pass - -""" - -# Edge cases I've encountered. -edge_cases_source = """ -class Test(unittest.TestCase): - - # Note that most of the tests are in the doc strings of the - # declarations module. - - def test_builtins(self): - # Setup - - intspec = implementedBy(int) - olddeclared = intspec.declared - - classImplements(int, I1) - class myint(int): - implements(I2) - - def test_implementedBy(self): - class I2(I1): pass - - class C1(Odd): - implements(I2) - - class C2(C1): - implements(I3) - -""" - -edge_cases_target = """ -class Test(unittest.TestCase): - - # Note that most of the tests are in the doc strings of the - # declarations module. - - def test_builtins(self): - # Setup - - intspec = implementedBy(int) - olddeclared = intspec.declared - - classImplements(int, I1) - @implementer(I2) - class myint(int): - pass - - def test_implementedBy(self): - class I2(I1): pass - - @implementer(I2) - class C1(Odd): - pass - - @implementer(I3) - class C2(C1): - pass - -""" - -class FixerTest(unittest.TestCase): - - def _test(self, source, target): - refactored = str(self.refactor(source, 'zope.fixer.test')) - if refactored != target: - match = '' - for i in range(min(len(refactored), len(target))): - if refactored[i] == target[i]: - match += refactored[i] - else: - break - msg = "\nResult:\n" + refactored - msg += "\nFailed:\n" + refactored[i:] - msg += "\nTarget:\n" + target[i:] - # Make spaces and tabs visible: - msg = msg.replace(' ', '°') - msg = msg.replace('\t', '------->') - msg = ("Test failed at character %i" % i) + msg - self.fail(msg) - -class ImplementsFixerTest(FixerTest): - - def setUp(self): - self.refactor = RefactoringTool(['zope.fixers.fix_implements']).refactor_string - - def test_imports(self): - self._test(imports_source, imports_target) - - def test_simple(self): - self._test(simple_source, simple_target) - - def test_multi(self): - self._test(multi_source, multi_target) - - def test_renamed(self): - self._test(renamed_source, renamed_target) - - def test_module_import(self): - self._test(module_import_source, module_import_target) - - def test_module_renamed(self): - self._test(module_renamed_source, module_renamed_target) - - def test_full_import(self): - self._test(full_import_source, full_import_target) - - def test_empty_class(self): - self._test(empty_class_source, empty_class_target) - - def test_indented_class(self): - self._test(indented_class_source, indented_class_target) - - def test_edge_cases(self): - self._test(edge_cases_source, edge_cases_target) - - -implements_only_source = """ -from zope.interface import implementsOnly - -class IFoo(Interface): - pass - -class Foo: - "An IFoo class" - - implementsOnly(IFoo) -""" - -implements_only_target = """ -from zope.interface import implementer_only - -class IFoo(Interface): - pass - -@implementer_only(IFoo) -class Foo: - "An IFoo class" -""" - -class ImplementsOnlyFixerTest(FixerTest): - - def setUp(self): - self.refactor = RefactoringTool(['zope.fixers.fix_implements_only']).refactor_string - - - def test_implements_only(self): - self._test(implements_only_source, implements_only_target) - -doctest_source = """ - >>> class A(object): - ... implements(I1) - - >>> class B(object): - ... implements(I2) - - >>> class Foo(object): - ... implements(IFoo) - ... x = 1 - ... def __init__(self): - ... self.y = 2 -""" - -doctest_target = """ - >>> @implementer(I1) - ... class A(object): - ... pass - - >>> @implementer(I2) - ... class B(object): - ... pass - - >>> @implementer(IFoo) - ... class Foo(object): - ... x = 1 - ... def __init__(self): - ... self.y = 2 -""" - -class DoctestFixerTest(FixerTest): - - def setUp(self): - self.refactor = RefactoringTool(['zope.fixers.fix_implements']).refactor_docstring - - def test_doctest(self): - self._test(doctest_source, doctest_target) - -dual_fixes_source = """ - >>> class C(object): - ... implements(IFoo) - ... classProvides(IFooFactory) -""" - -dual_fixes_target = """ - >>> @provider(IFooFactory) - ... @implementer(IFoo) - ... class C(object): - ... pass -""" - -class DualFixersTest(FixerTest): - - def setUp(self): - self.refactor = RefactoringTool(['zope.fixers.fix_implements', - 'zope.fixers.fix_class_provides'] - ).refactor_docstring - - def test_dualfixers(self): - self._test(dual_fixes_source, dual_fixes_target) -
\ No newline at end of file |
