summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWolfgang Schnerring <wosc@wosc.de>2009-09-12 13:55:07 +0000
committerWolfgang Schnerring <wosc@wosc.de>2009-09-12 13:55:07 +0000
commit4c501947b4a00c66b2dd6985af86c4143eaed3df (patch)
tree48d83043c924216a902d40d4d45f445ad21b894b
parentdbb278181096682b723163ed928a514399a12a5c (diff)
downloadzope-interface-4c501947b4a00c66b2dd6985af86c4143eaed3df.tar.gz
revert accidental checkin that should have been on a branch
-rw-r--r--src/zope/interface/fixers/__init__.py0
-rw-r--r--src/zope/interface/fixers/base.py178
-rw-r--r--src/zope/interface/fixers/fix_class_provides.py23
-rw-r--r--src/zope/interface/fixers/fix_implements.py23
-rw-r--r--src/zope/interface/fixers/fix_implements_only.py23
-rw-r--r--src/zope/interface/fixers/tests.py436
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