[Checkins] SVN: zope.deprecation/trunk/ merge svn+ssh://svn.zope.org/repos/main/zope.deprecation/branches/chrism-unittesting
Chris McDonough
chrism at plope.com
Mon Sep 5 05:43:54 EST 2011
Log message for revision 122727:
merge svn+ssh://svn.zope.org/repos/main/zope.deprecation/branches/chrism-unittesting
Changed:
_U zope.deprecation/trunk/
U zope.deprecation/trunk/CHANGES.txt
U zope.deprecation/trunk/README.txt
U zope.deprecation/trunk/setup.py
_U zope.deprecation/trunk/src/zope/
D zope.deprecation/trunk/src/zope/deprecation/README.txt
U zope.deprecation/trunk/src/zope/deprecation/deprecation.py
A zope.deprecation/trunk/src/zope/deprecation/fixture.py
U zope.deprecation/trunk/src/zope/deprecation/tests.py
A zope.deprecation/trunk/tox.ini
-=-
Property changes on: zope.deprecation/trunk
___________________________________________________________________
Modified: svn:ignore
- bin
build
dist
lib
develop-eggs
eggs
parts
.installed.cfg
+ bin
build
dist
lib
develop-eggs
eggs
parts
.installed.cfg
.tox
Modified: zope.deprecation/trunk/CHANGES.txt
===================================================================
--- zope.deprecation/trunk/CHANGES.txt 2011-09-05 08:44:29 UTC (rev 122726)
+++ zope.deprecation/trunk/CHANGES.txt 2011-09-05 10:43:53 UTC (rev 122727)
@@ -2,12 +2,14 @@
CHANGES
=======
-3.4.2 (unreleased)
-------------------
+3.5 (unreleased)
+----------------
-- Nothing changed yet.
+- Replaced doctesting with unit testing.
+- Python 3 compatibility.
+
3.4.1 (2011-06-07)
------------------
Modified: zope.deprecation/trunk/README.txt
===================================================================
--- zope.deprecation/trunk/README.txt 2011-09-05 08:44:29 UTC (rev 122726)
+++ zope.deprecation/trunk/README.txt 2011-09-05 10:43:53 UTC (rev 122727)
@@ -1,2 +1,362 @@
This package provides a simple function called ``deprecated(names, reason)`` to
mark deprecated modules, classes, functions, methods and properties.
+
+.. contents::
+
+===============
+Deprecation API
+===============
+
+Deprecating objects inside a module
+-----------------------------------
+
+Let's start with a demonstration of deprecating any name inside a module. To
+demonstrate the functionality, I have placed the following code inside the
+``tests.py`` file of this package::
+
+ from zope.deprecation import deprecated
+ demo1 = 1
+ deprecated('demo1', 'demo1 is no more.')
+
+ demo2 = 2
+ deprecated('demo2', 'demo2 is no more.')
+
+ demo3 = 3
+ deprecated('demo3', 'demo3 is no more.')
+
+The first argument to the ``deprecated()`` function is a list of names that
+should be declared deprecated. If the first argument is a string, it is
+interpreted as one name. The second argument is the reason the particular name
+has been deprecated. It is good practice to also list the version in which the
+name will be removed completely.
+
+Let's now see how the deprecation warnings are displayed.
+
+ >>> from zope.deprecation import tests
+ >>> tests.demo1
+ From tests.py's showwarning():
+ ...README.txt:1: DeprecationWarning: demo1: demo1 is no more.
+ ...
+ 1
+
+ >>> import zope.deprecation.tests
+ >>> zope.deprecation.tests.demo2
+ From tests.py's showwarning():
+ ...README.txt:1: DeprecationWarning: demo2: demo2 is no more.
+ ...
+ 2
+
+You can see that merely importing the affected module or one of its parents
+does not cause a deprecation warning. Only when we try to access the name in
+the module, we get a deprecation warning. On the other hand, if we import the
+name directly, the deprecation warning will be raised immediately.
+
+ >>> from zope.deprecation.tests import demo3
+ From tests.py's showwarning():
+ ...README.txt:1: DeprecationWarning: demo3: demo3 is no more.
+ ...
+
+Deprecation can also happen inside a function. When we first access
+``demo4``, it can be accessed without problems, then we call a
+function that sets the deprecation message and we get the message upon
+the next access:
+
+ >>> tests.demo4
+ 4
+ >>> tests.deprecatedemo4()
+ >>> tests.demo4
+ From tests.py's showwarning():
+ ...README.txt:1: DeprecationWarning: demo4: demo4 is no more.
+ ...
+ 4
+
+Deprecating methods and properties
+----------------------------------
+
+New let's see how properties and methods can be deprecated. We are going to
+use the same function as before, except that this time, we do not pass in names
+as first argument, but the method or attribute itself. The function then
+returns a wrapper that sends out a deprecation warning when the attribute or
+method is accessed.
+
+ >>> from zope.deprecation import deprecation
+ >>> class MyComponent(object):
+ ... foo = property(lambda self: 1)
+ ... foo = deprecation.deprecated(foo, 'foo is no more.')
+ ...
+ ... bar = 2
+ ...
+ ... def blah(self):
+ ... return 3
+ ... blah = deprecation.deprecated(blah, 'blah() is no more.')
+ ...
+ ... def splat(self):
+ ... return 4
+ ...
+ ... @deprecation.deprecate("clap() is no more.")
+ ... def clap(self):
+ ... return 5
+
+And here is the result:
+
+ >>> my = MyComponent()
+ >>> my.foo
+ From tests.py's showwarning():
+ ...README.txt:1: DeprecationWarning: foo is no more.
+ ...
+ 1
+ >>> my.bar
+ 2
+ >>> my.blah()
+ From tests.py's showwarning():
+ ...README.txt:1: DeprecationWarning: blah() is no more.
+ ...
+ 3
+ >>> my.splat()
+ 4
+ >>> my.clap()
+ From tests.py's showwarning():
+ ...README.txt:1: DeprecationWarning: clap() is no more.
+ ...
+ 5
+
+Deprecating modules
+-------------------
+
+It is also possible to deprecate whole modules. This is useful when
+creating module aliases for backward compatibility. Let's imagine,
+the ``zope.deprecation`` module used to be called ``zope.wanda`` and
+we'd like to retain backward compatibility:
+
+ >>> import zope.deprecation
+ >>> import sys
+ >>> sys.modules['zope.wanda'] = deprecation.deprecated(
+ ... zope.deprecation, 'A module called Wanda is now zope.deprecation.')
+
+Now we can import ``wanda``, but when accessing things from it, we get
+our deprecation message as expected:
+
+ >>> from zope.wanda import deprecated
+ From tests.py's showwarning():
+ ...README.txt:1: DeprecationWarning: A module called Wanda is now zope.deprecation.
+ ...
+
+Before we move on, we should clean up:
+
+ >>> del deprecated
+ >>> del sys.modules['zope.wanda']
+
+Moving modules
+--------------
+
+When a module is moved, you often want to support importing from the
+old location for a while, generating a deprecation warning when
+someone uses the old location. This can be done using the moved
+function.
+
+To see how this works, we'll use a helper function to create two fake
+modules in the zope.deprecation package. First will create a module
+in the "old" location that used the moved function to indicate the a
+module on the new location should be used:
+
+ >>> create_module(old_location=
+ ... '''
+ ... import zope.deprecation
+ ... zope.deprecation.moved('zope.deprecation.new_location', 'version 2')
+ ... ''')
+
+and we define the module in the new location:
+
+ >>> create_module(new_location=
+ ... '''\
+ ... print "new module imported"
+ ... x = 42
+ ... ''')
+
+Now, if we import the old location, we'll see the output of importing
+the old location:
+
+ >>> import zope.deprecation.old_location
+ ... # doctest: +NORMALIZE_WHITESPACE
+ From tests.py's showwarning():
+ ...zope/deprecation/README.txt:1:
+ DeprecationWarning: zope.deprecation.old_location has moved to
+ zope.deprecation.new_location.
+ Import of zope.deprecation.old_location will become unsupported
+ in version 2
+ ===============
+ new module imported
+
+ >>> zope.deprecation.old_location.x
+ 42
+
+Moving packages
+---------------
+
+When moving packages, you need to leave placeholders for each
+module. Let's look at an example:
+
+ >>> create_module({
+ ... 'new_package.__init__': '''\
+ ... print __name__, 'imported'
+ ... x=0
+ ... ''',
+ ... 'new_package.m1': '''\
+ ... print __name__, 'imported'
+ ... x=1
+ ... ''',
+ ... 'new_package.m2': '''\
+ ... print __name__, 'imported'
+ ... def x():
+ ... pass
+ ... ''',
+ ... 'new_package.m3': '''\
+ ... print __name__, 'imported'
+ ... x=3
+ ... ''',
+ ... 'old_package.__init__': '''\
+ ... import zope.deprecation
+ ... zope.deprecation.moved('zope.deprecation.new_package', 'version 2')
+ ... ''',
+ ... 'old_package.m1': '''\
+ ... import zope.deprecation
+ ... zope.deprecation.moved('zope.deprecation.new_package.m1', 'version 2')
+ ... ''',
+ ... 'old_package.m2': '''\
+ ... import zope.deprecation
+ ... zope.deprecation.moved('zope.deprecation.new_package.m2', 'version 2')
+ ... ''',
+ ... })
+
+
+
+Now, if we import the old modules, we'll get warnings:
+
+ >>> import zope.deprecation.old_package
+ ... # doctest: +NORMALIZE_WHITESPACE
+ From tests.py's showwarning():
+ ...zope/deprecation/README.txt:1: DeprecationWarning:
+ zope.deprecation.old_package has moved to zope.deprecation.new_package.
+ Import of zope.deprecation.old_package will become unsupported in version 2
+ ===============
+ zope.deprecation.new_package imported
+
+ >>> zope.deprecation.old_package.x
+ 0
+
+ >>> import zope.deprecation.old_package.m1
+ ... # doctest: +NORMALIZE_WHITESPACE
+ From tests.py's showwarning():
+ ...zope/deprecation/README.txt:1: DeprecationWarning:
+ zope.deprecation.old_package.m1 has moved to zope.deprecation.new_package.m1.
+ Import of zope.deprecation.old_package.m1 will become unsupported in
+ version 2
+ ===============
+ zope.deprecation.new_package.m1 imported
+
+ >>> zope.deprecation.old_package.m1.x
+ 1
+
+ >>> import zope.deprecation.old_package.m2
+ ... # doctest: +NORMALIZE_WHITESPACE
+ From tests.py's showwarning():
+ ...zope/deprecation/README.txt:1: DeprecationWarning:
+ zope.deprecation.old_package.m2 has moved to zope.deprecation.new_package.m2.
+ Import of zope.deprecation.old_package.m2 will become unsupported in
+ version 2
+ ===============
+ zope.deprecation.new_package.m2 imported
+
+ >>> zope.deprecation.old_package.m2.x is zope.deprecation.new_package.m2.x
+ True
+
+ >>> (zope.deprecation.old_package.m2.x.func_globals
+ ... is zope.deprecation.new_package.m2.__dict__)
+ True
+
+ >>> zope.deprecation.old_package.m2.x.__module__
+ 'zope.deprecation.new_package.m2'
+
+We'll get an error if we try to import m3, because we didn't create a
+placeholder for it:
+
+ >>> import zope.deprecation.old_package.m3
+ Traceback (most recent call last):
+ ...
+ ImportError: No module named m3
+
+
+
+Temporarily turning off deprecation warnings
+--------------------------------------------
+
+In some cases it is desireable to turn off the deprecation warnings for a
+short time. To support such a feature, the ``zope.deprecation`` package
+provides an attribute called ``__show__``. One can ask for its status by
+calling it:
+
+ >>> from zope.deprecation import __show__
+ >>> __show__()
+ True
+
+ >>> class Foo(object):
+ ... bar = property(lambda self: 1)
+ ... bar = deprecation.deprecated(bar, 'bar is no more.')
+ ... blah = property(lambda self: 1)
+ ... blah = deprecation.deprecated(blah, 'blah is no more.')
+ >>> foo = Foo()
+
+ >>> foo.bar
+ From tests.py's showwarning():
+ ...README.txt:1: DeprecationWarning: bar is no more.
+ ...
+ 1
+
+You can turn off the depraction warnings using
+
+ >>> __show__.off()
+ >>> __show__()
+ False
+
+ >>> foo.blah
+ 1
+
+Now, you can also nest several turn-offs, so that calling ``off()`` multiple
+times is meaningful:
+
+ >>> __show__.stack
+ [False]
+
+ >>> __show__.off()
+ >>> __show__.stack
+ [False, False]
+
+ >>> __show__.on()
+ >>> __show__.stack
+ [False]
+ >>> __show__()
+ False
+
+ >>> __show__.on()
+ >>> __show__.stack
+ []
+ >>> __show__()
+ True
+
+You can also reset ``__show__`` to ``True``:
+
+ >>> __show__.off()
+ >>> __show__.off()
+ >>> __show__()
+ False
+
+ >>> __show__.reset()
+ >>> __show__()
+ True
+
+Finally, you cannot call ``on()`` without having called ``off()`` before:
+
+ >>> __show__.on()
+ Traceback (most recent call last):
+ ...
+ IndexError: pop from empty list
Modified: zope.deprecation/trunk/setup.py
===================================================================
--- zope.deprecation/trunk/setup.py 2011-09-05 08:44:29 UTC (rev 122726)
+++ zope.deprecation/trunk/setup.py 2011-09-05 10:43:53 UTC (rev 122727)
@@ -27,7 +27,7 @@
setup(
name='zope.deprecation',
- version='3.4.2dev',
+ version='3.5dev',
url='http://pypi.python.org/pypi/zope.deprecation',
license='ZPL 2.1',
description='Zope Deprecation Infrastructure',
@@ -36,12 +36,13 @@
long_description=(
read('README.txt')
+ '\n\n' +
- '.. contents::\n'
- + '\n\n' +
- read('src', 'zope', 'deprecation', 'README.txt')
- + '\n\n' +
read('CHANGES.txt')
),
+ classifiers=[
+ "Intended Audience :: Developers",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ ],
package_dir = {'': 'src'},
packages=find_packages('src'),
namespace_packages=['zope',],
@@ -49,4 +50,5 @@
extras_require = dict(test=['zope.testing']),
include_package_data = True,
zip_safe = False,
+ test_suite='zope.deprecation',
)
Property changes on: zope.deprecation/trunk/src/zope
___________________________________________________________________
Added: svn:ignore
+ __pycache__
Deleted: zope.deprecation/trunk/src/zope/deprecation/README.txt
===================================================================
--- zope.deprecation/trunk/src/zope/deprecation/README.txt 2011-09-05 08:44:29 UTC (rev 122726)
+++ zope.deprecation/trunk/src/zope/deprecation/README.txt 2011-09-05 10:43:53 UTC (rev 122727)
@@ -1,357 +0,0 @@
-===============
-Deprecation API
-===============
-
-Deprecating objects inside a module
------------------------------------
-
-Let's start with a demonstration of deprecating any name inside a module. To
-demonstrate the functionality, I have placed the following code inside the
-``tests.py`` file of this package::
-
- from zope.deprecation import deprecated
- demo1 = 1
- deprecated('demo1', 'demo1 is no more.')
-
- demo2 = 2
- deprecated('demo2', 'demo2 is no more.')
-
- demo3 = 3
- deprecated('demo3', 'demo3 is no more.')
-
-The first argument to the ``deprecated()`` function is a list of names that
-should be declared deprecated. If the first argument is a string, it is
-interpreted as one name. The second argument is the reason the particular name
-has been deprecated. It is good practice to also list the version in which the
-name will be removed completely.
-
-Let's now see how the deprecation warnings are displayed.
-
- >>> from zope.deprecation import tests
- >>> tests.demo1
- From tests.py's showwarning():
- ...README.txt:1: DeprecationWarning: demo1: demo1 is no more.
- ...
- 1
-
- >>> import zope.deprecation.tests
- >>> zope.deprecation.tests.demo2
- From tests.py's showwarning():
- ...README.txt:1: DeprecationWarning: demo2: demo2 is no more.
- ...
- 2
-
-You can see that merely importing the affected module or one of its parents
-does not cause a deprecation warning. Only when we try to access the name in
-the module, we get a deprecation warning. On the other hand, if we import the
-name directly, the deprecation warning will be raised immediately.
-
- >>> from zope.deprecation.tests import demo3
- From tests.py's showwarning():
- ...README.txt:1: DeprecationWarning: demo3: demo3 is no more.
- ...
-
-Deprecation can also happen inside a function. When we first access
-``demo4``, it can be accessed without problems, then we call a
-function that sets the deprecation message and we get the message upon
-the next access:
-
- >>> tests.demo4
- 4
- >>> tests.deprecatedemo4()
- >>> tests.demo4
- From tests.py's showwarning():
- ...README.txt:1: DeprecationWarning: demo4: demo4 is no more.
- ...
- 4
-
-Deprecating methods and properties
-----------------------------------
-
-New let's see how properties and methods can be deprecated. We are going to
-use the same function as before, except that this time, we do not pass in names
-as first argument, but the method or attribute itself. The function then
-returns a wrapper that sends out a deprecation warning when the attribute or
-method is accessed.
-
- >>> from zope.deprecation import deprecation
- >>> class MyComponent(object):
- ... foo = property(lambda self: 1)
- ... foo = deprecation.deprecated(foo, 'foo is no more.')
- ...
- ... bar = 2
- ...
- ... def blah(self):
- ... return 3
- ... blah = deprecation.deprecated(blah, 'blah() is no more.')
- ...
- ... def splat(self):
- ... return 4
- ...
- ... @deprecation.deprecate("clap() is no more.")
- ... def clap(self):
- ... return 5
-
-And here is the result:
-
- >>> my = MyComponent()
- >>> my.foo
- From tests.py's showwarning():
- ...README.txt:1: DeprecationWarning: foo is no more.
- ...
- 1
- >>> my.bar
- 2
- >>> my.blah()
- From tests.py's showwarning():
- ...README.txt:1: DeprecationWarning: blah() is no more.
- ...
- 3
- >>> my.splat()
- 4
- >>> my.clap()
- From tests.py's showwarning():
- ...README.txt:1: DeprecationWarning: clap() is no more.
- ...
- 5
-
-Deprecating modules
--------------------
-
-It is also possible to deprecate whole modules. This is useful when
-creating module aliases for backward compatibility. Let's imagine,
-the ``zope.deprecation`` module used to be called ``zope.wanda`` and
-we'd like to retain backward compatibility:
-
- >>> import zope.deprecation
- >>> import sys
- >>> sys.modules['zope.wanda'] = deprecation.deprecated(
- ... zope.deprecation, 'A module called Wanda is now zope.deprecation.')
-
-Now we can import ``wanda``, but when accessing things from it, we get
-our deprecation message as expected:
-
- >>> from zope.wanda import deprecated
- From tests.py's showwarning():
- ...README.txt:1: DeprecationWarning: A module called Wanda is now zope.deprecation.
- ...
-
-Before we move on, we should clean up:
-
- >>> del deprecated
- >>> del sys.modules['zope.wanda']
-
-Moving modules
---------------
-
-When a module is moved, you often want to support importing from the
-old location for a while, generating a deprecation warning when
-someone uses the old location. This can be done using the moved
-function.
-
-To see how this works, we'll use a helper function to create two fake
-modules in the zope.deprecation package. First will create a module
-in the "old" location that used the moved function to indicate the a
-module on the new location should be used:
-
- >>> create_module(old_location=
- ... '''
- ... import zope.deprecation
- ... zope.deprecation.moved('zope.deprecation.new_location', 'version 2')
- ... ''')
-
-and we define the module in the new location:
-
- >>> create_module(new_location=
- ... '''\
- ... print "new module imported"
- ... x = 42
- ... ''')
-
-Now, if we import the old location, we'll see the output of importing
-the old location:
-
- >>> import zope.deprecation.old_location
- ... # doctest: +NORMALIZE_WHITESPACE
- From tests.py's showwarning():
- ...zope/deprecation/README.txt:1:
- DeprecationWarning: zope.deprecation.old_location has moved to
- zope.deprecation.new_location.
- Import of zope.deprecation.old_location will become unsupported
- in version 2
- ===============
- new module imported
-
- >>> zope.deprecation.old_location.x
- 42
-
-Moving packages
----------------
-
-When moving packages, you need to leave placeholders for each
-module. Let's look at an example:
-
- >>> create_module({
- ... 'new_package.__init__': '''\
- ... print __name__, 'imported'
- ... x=0
- ... ''',
- ... 'new_package.m1': '''\
- ... print __name__, 'imported'
- ... x=1
- ... ''',
- ... 'new_package.m2': '''\
- ... print __name__, 'imported'
- ... def x():
- ... pass
- ... ''',
- ... 'new_package.m3': '''\
- ... print __name__, 'imported'
- ... x=3
- ... ''',
- ... 'old_package.__init__': '''\
- ... import zope.deprecation
- ... zope.deprecation.moved('zope.deprecation.new_package', 'version 2')
- ... ''',
- ... 'old_package.m1': '''\
- ... import zope.deprecation
- ... zope.deprecation.moved('zope.deprecation.new_package.m1', 'version 2')
- ... ''',
- ... 'old_package.m2': '''\
- ... import zope.deprecation
- ... zope.deprecation.moved('zope.deprecation.new_package.m2', 'version 2')
- ... ''',
- ... })
-
-
-
-Now, if we import the old modules, we'll get warnings:
-
- >>> import zope.deprecation.old_package
- ... # doctest: +NORMALIZE_WHITESPACE
- From tests.py's showwarning():
- ...zope/deprecation/README.txt:1: DeprecationWarning:
- zope.deprecation.old_package has moved to zope.deprecation.new_package.
- Import of zope.deprecation.old_package will become unsupported in version 2
- ===============
- zope.deprecation.new_package imported
-
- >>> zope.deprecation.old_package.x
- 0
-
- >>> import zope.deprecation.old_package.m1
- ... # doctest: +NORMALIZE_WHITESPACE
- From tests.py's showwarning():
- ...zope/deprecation/README.txt:1: DeprecationWarning:
- zope.deprecation.old_package.m1 has moved to zope.deprecation.new_package.m1.
- Import of zope.deprecation.old_package.m1 will become unsupported in
- version 2
- ===============
- zope.deprecation.new_package.m1 imported
-
- >>> zope.deprecation.old_package.m1.x
- 1
-
- >>> import zope.deprecation.old_package.m2
- ... # doctest: +NORMALIZE_WHITESPACE
- From tests.py's showwarning():
- ...zope/deprecation/README.txt:1: DeprecationWarning:
- zope.deprecation.old_package.m2 has moved to zope.deprecation.new_package.m2.
- Import of zope.deprecation.old_package.m2 will become unsupported in
- version 2
- ===============
- zope.deprecation.new_package.m2 imported
-
- >>> zope.deprecation.old_package.m2.x is zope.deprecation.new_package.m2.x
- True
-
- >>> (zope.deprecation.old_package.m2.x.func_globals
- ... is zope.deprecation.new_package.m2.__dict__)
- True
-
- >>> zope.deprecation.old_package.m2.x.__module__
- 'zope.deprecation.new_package.m2'
-
-We'll get an error if we try to import m3, because we didn't create a
-placeholder for it:
-
- >>> import zope.deprecation.old_package.m3
- Traceback (most recent call last):
- ...
- ImportError: No module named m3
-
-
-
-Temporarily turning off deprecation warnings
---------------------------------------------
-
-In some cases it is desireable to turn off the deprecation warnings for a
-short time. To support such a feature, the ``zope.deprecation`` package
-provides an attribute called ``__show__``. One can ask for its status by
-calling it:
-
- >>> from zope.deprecation import __show__
- >>> __show__()
- True
-
- >>> class Foo(object):
- ... bar = property(lambda self: 1)
- ... bar = deprecation.deprecated(bar, 'bar is no more.')
- ... blah = property(lambda self: 1)
- ... blah = deprecation.deprecated(blah, 'blah is no more.')
- >>> foo = Foo()
-
- >>> foo.bar
- From tests.py's showwarning():
- ...README.txt:1: DeprecationWarning: bar is no more.
- ...
- 1
-
-You can turn off the depraction warnings using
-
- >>> __show__.off()
- >>> __show__()
- False
-
- >>> foo.blah
- 1
-
-Now, you can also nest several turn-offs, so that calling ``off()`` multiple
-times is meaningful:
-
- >>> __show__.stack
- [False]
-
- >>> __show__.off()
- >>> __show__.stack
- [False, False]
-
- >>> __show__.on()
- >>> __show__.stack
- [False]
- >>> __show__()
- False
-
- >>> __show__.on()
- >>> __show__.stack
- []
- >>> __show__()
- True
-
-You can also reset ``__show__`` to ``True``:
-
- >>> __show__.off()
- >>> __show__.off()
- >>> __show__()
- False
-
- >>> __show__.reset()
- >>> __show__()
- True
-
-Finally, you cannot call ``on()`` without having called ``off()`` before:
-
- >>> __show__.on()
- Traceback (most recent call last):
- ...
- IndexError: pop from empty list
Modified: zope.deprecation/trunk/src/zope/deprecation/deprecation.py
===================================================================
--- zope.deprecation/trunk/src/zope/deprecation/deprecation.py 2011-09-05 08:44:29 UTC (rev 122726)
+++ zope.deprecation/trunk/src/zope/deprecation/deprecation.py 2011-09-05 10:43:53 UTC (rev 122727)
@@ -21,6 +21,13 @@
import types
import warnings
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+ str_and_sequence_types = (str, list, tuple)
+else:
+ str_and_sequence_types = (basestring, list, tuple)
+
class ShowSwitch(object):
"""Simple stack-based switch."""
@@ -153,14 +160,13 @@
return deprecated_method
-
def deprecated(specifier, message):
"""Deprecate the given names."""
# A string specifier (or list of strings) means we're called
# top-level in a module and are to deprecate things inside this
# module
- if isinstance(specifier, (str, unicode, list, tuple)):
+ if isinstance(specifier, str_and_sequence_types):
globals = sys._getframe(1).f_globals
modname = globals['__name__']
@@ -208,7 +214,7 @@
tomod = sys.modules[old]
tomod.__doc__ = message
- for name, v in fromdict.iteritems():
+ for name, v in fromdict.items():
if name not in tomod.__dict__:
setattr(tomod, name, v)
Copied: zope.deprecation/trunk/src/zope/deprecation/fixture.py (from rev 122726, zope.deprecation/branches/chrism-unittesting/src/zope/deprecation/fixture.py)
===================================================================
--- zope.deprecation/trunk/src/zope/deprecation/fixture.py (rev 0)
+++ zope.deprecation/trunk/src/zope/deprecation/fixture.py 2011-09-05 10:43:53 UTC (rev 122727)
@@ -0,0 +1,3 @@
+# used by tests
+
+abc = 1
Modified: zope.deprecation/trunk/src/zope/deprecation/tests.py
===================================================================
--- zope.deprecation/trunk/src/zope/deprecation/tests.py 2011-09-05 08:44:29 UTC (rev 122726)
+++ zope.deprecation/trunk/src/zope/deprecation/tests.py 2011-09-05 10:43:53 UTC (rev 122727)
@@ -1,118 +1,493 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Foundation 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.
-#
-##############################################################################
-"""Tests for zope.deprecation
-"""
-
-import doctest
-from zope.testing import renormalizing
-import os
-import re
-import shutil
import sys
-import tempfile
+import types
import unittest
-import warnings
-import zope.deprecation
-# Used in doctests
-from deprecation import deprecated
-demo1 = 1
-deprecated('demo1', 'demo1 is no more.')
+class TestShowSwitch(unittest.TestCase):
+ def _makeOne(self):
+ from zope.deprecation import ShowSwitch
+ return ShowSwitch()
-demo2 = 2
-deprecated('demo2', 'demo2 is no more.')
+ def test_on(self):
+ switch = self._makeOne()
+ switch.stack.append(False)
+ switch.on()
+ self.assertEqual(switch.stack, [])
-demo3 = 3
-deprecated('demo3', 'demo3 is no more.')
+ def test_off(self):
+ switch = self._makeOne()
+ switch.off()
+ self.assertEqual(switch.stack, [False])
+
+ def test_reset(self):
+ switch = self._makeOne()
+ switch.stack.append(False)
+ switch.reset()
+ self.assertEqual(switch.stack, [])
+
+ def test_call_true(self):
+ switch = self._makeOne()
+ self.assertEqual(switch(), True)
-demo4 = 4
-def deprecatedemo4():
- """Demonstrate that deprecate() also works in a local scope."""
- deprecated('demo4', 'demo4 is no more.')
+ def test_call_false(self):
+ switch = self._makeOne()
+ switch.stack.append(False)
+ self.assertEqual(switch(), False)
-def warn(message, category=None, stacklevel=1):
- print "From tests.py's showwarning():"
+ def test_repr_on(self):
+ switch = self._makeOne()
+ self.assertEqual(repr(switch), '<ShowSwitch on>')
+
+ def test_repr_off(self):
+ switch = self._makeOne()
+ switch.stack.append(False)
+ self.assertEqual(repr(switch), '<ShowSwitch off>')
- frame = sys._getframe(stacklevel)
- path = frame.f_globals['__file__']
- file = open(path)
- if path.endswith('.pyc') or path.endswith('.pyo'):
- path = path[:-1]
+ def test___show__global(self):
+ from zope.deprecation import __show__
+ self.assertEqual(self._makeOne().__class__, __show__.__class__)
- lineno = frame.f_lineno
- for i in range(lineno):
- line = file.readline()
+class WarningsSetupBase(object):
+ def setUp(self):
+ from zope.deprecation import deprecation
+ self.oldwarnings = deprecation.warnings
+ self.oldshow = deprecation.__show__
+ self.warnings = DummyWarningsModule()
+ self.show = DummyShow()
+ deprecation.warnings = self.warnings
+ deprecation.__show__ = self.show
- print "%s:%s: %s: %s\n %s" % (
- path,
- frame.f_lineno,
- category.__name__,
- message,
- line.strip(),
- )
+ def tearDown(self):
+ from zope.deprecation import deprecation
+ deprecation.warnings = self.oldwarnings
+ deprecation.__show__ = self.oldshow
+class TestDeprecationProxy(WarningsSetupBase, unittest.TestCase):
+ def _getTargetClass(self):
+ from zope.deprecation.deprecation import DeprecationProxy
+ return DeprecationProxy
+
+ def _makeOne(self, module):
+ cls = self._getTargetClass()
+ return cls(module)
-def setUpCreateModule(test):
- d = test.globs['tmp_d'] = tempfile.mkdtemp('deprecation')
+ def test_deprecate_and__getattribute__string(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ proxy.deprecate('ClassFixture', 'hello')
+ self.assertEqual(proxy.ClassFixture, ClassFixture)
+ self.assertEqual(
+ self.warnings.w,
+ [('ClassFixture: hello', DeprecationWarning, 2)])
- def create_module(modules=(), **kw):
- modules = dict(modules)
- modules.update(kw)
- for name, src in modules.iteritems():
- pname = name.split('.')
- if pname[-1] == '__init__':
- os.mkdir(os.path.join(d, *pname[:-1]))
- name = '.'.join(pname[:-1])
- open(os.path.join(d, *pname)+'.py', 'w').write(src)
- test.globs['created_modules'].append(name)
+ def test_deprecate_and__getattribute__sequence(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ proxy.deprecate(('ClassFixture', 'ClassFixture2'), 'hello')
+ self.assertEqual(proxy.ClassFixture, ClassFixture)
+ self.assertEqual(proxy.ClassFixture2, ClassFixture2)
+ self.assertEqual(
+ self.warnings.w,
+ [('ClassFixture: hello', DeprecationWarning, 2),
+ ('ClassFixture2: hello', DeprecationWarning, 2)]
+ )
+ def test_deprecate_and__getattribute__noshow(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ proxy.deprecate('ClassFixture', 'hello')
+ self.show.on = False
+ self.assertEqual(proxy.ClassFixture, ClassFixture)
+ self.assertEqual(
+ self.warnings.w, [])
- test.globs['created_modules'] = []
- test.globs['create_module'] = create_module
+ def test___getattribute____class__(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ self.assertEqual(proxy.__class__, types.ModuleType)
- zope.deprecation.__path__.append(d)
+ def test___getattribute___deprecate(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ self.assertEqual(type(proxy.deprecate), types.MethodType)
-def tearDownCreateModule(test):
- zope.deprecation.__path__.pop()
- shutil.rmtree(test.globs['tmp_d'])
- for name in test.globs['created_modules']:
- sys.modules.pop(name, None)
+ def test___getattribute__missing(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ self.assertRaises(AttributeError, getattr, proxy, 'wontbethere')
-def setUp(test):
- test.globs['saved_warn'] = warnings.warn
- warnings.warn = warn
- setUpCreateModule(test)
+ def test___setattr__owned(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ proxy._DeprecationProxy__deprecated = {'foo':'bar'}
+ self.assertEqual(proxy._DeprecationProxy__deprecated, {'foo':'bar'})
-def tearDown(test):
- tearDownCreateModule(test)
- warnings.warn = test.globs['saved_warn']
- del object.__getattribute__(sys.modules['zope.deprecation.tests'],
- '_DeprecationProxy__deprecated')['demo4']
+ def test___setattr__notowned(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ try:
+ proxy.foo = 'bar'
+ self.assertEqual(tests.foo, 'bar')
+ finally:
+ del tests.foo
-def test_suite():
- checker = renormalizing.RENormalizing([
- (re.compile('\\\\'), '/'), # convert Windows paths to Unix paths
- ])
- testfile = os.path.join(os.path.dirname(__file__), 'README.txt')
+ def test___delattr__owned(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ del proxy._DeprecationProxy__deprecated
+ self.assertRaises(AttributeError, getattr, proxy,
+ '_DeprecationProxy__deprecated')
- return unittest.TestSuite((
- doctest.DocFileSuite('README.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.ELLIPSIS,
- checker=checker,
- globs={'__file__': testfile}, # py2.4 compat
- ),
- ))
+ def test___delattr__notowned(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests)
+ tests.foo = 'bar'
+ del proxy.foo
+ self.assertRaises(AttributeError, getattr, tests, 'foo')
-if __name__ == "__main__":
- unittest.main(defaultTest='test_suite')
+class TestDeprecatedModule(WarningsSetupBase, unittest.TestCase):
+ def _getTargetClass(self):
+ from zope.deprecation.deprecation import DeprecatedModule
+ return DeprecatedModule
+
+ def _makeOne(self, module, msg):
+ cls = self._getTargetClass()
+ return cls(module, msg)
+
+ def test___getattribute____class__(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests, 'hello')
+ self.assertEqual(proxy.__class__, types.ModuleType)
+
+ def test___getattribute____owned__(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests, 'hello')
+ self.assertEqual(proxy._DeprecatedModule__msg, 'hello')
+
+ def test___getattribute___deprecated(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests, 'hello')
+ self.assertEqual(proxy.ClassFixture, ClassFixture)
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)]
+ )
+
+ def test___getattribute__missing(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests, 'hello')
+ self.assertRaises(AttributeError, getattr, proxy, 'wontbethere')
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)]
+ )
+
+ def test___getattribute___noshow(self):
+ tests = _getTestsModule()
+ self.show.on = False
+ proxy = self._makeOne(tests, 'hello')
+ self.assertEqual(proxy.ClassFixture, ClassFixture)
+ self.assertEqual(
+ self.warnings.w, [])
+
+ def test___setattr__owned(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests, 'hello')
+ proxy._DeprecatedModule__msg = 'foo'
+ self.assertEqual(proxy._DeprecatedModule__msg, 'foo')
+
+ def test___setattr__notowned(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests, 'hello')
+ try:
+ proxy.foo = 'bar'
+ self.assertEqual(tests.foo, 'bar')
+ finally:
+ del tests.foo
+
+ def test___delattr__owned(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests, 'hello')
+ del proxy._DeprecatedModule__msg
+ self.assertRaises(AttributeError, getattr, proxy,
+ '_DeprecatedModule__msg')
+
+ def test___delattr__notowned(self):
+ tests = _getTestsModule()
+ proxy = self._makeOne(tests, 'hello')
+ tests.foo = 'bar'
+ del proxy.foo
+ self.assertRaises(AttributeError, getattr, tests, 'foo')
+
+class TestDeprecatedGetProperty(WarningsSetupBase, unittest.TestCase):
+ def _getTargetClass(self):
+ from zope.deprecation.deprecation import DeprecatedGetProperty
+ return DeprecatedGetProperty
+
+ def _makeOne(self, prop, msg):
+ cls = self._getTargetClass()
+ return cls(prop, msg)
+
+ def test___get__(self):
+ prop = DummyProperty()
+ proxy = self._makeOne(prop, 'hello')
+ self.assertEqual(proxy.__get__('inst', 'cls'), None)
+ self.assertEqual(prop.inst, 'inst')
+ self.assertEqual(prop.cls, 'cls')
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)]
+ )
+
+ def test___get__noshow(self):
+ prop = DummyProperty()
+ self.show.on = False
+ proxy = self._makeOne(prop, 'hello')
+ self.assertEqual(proxy.__get__('inst', 'cls'), None)
+ self.assertEqual(prop.inst, 'inst')
+ self.assertEqual(prop.cls, 'cls')
+ self.assertEqual(self.warnings.w, [])
+
+class TestDeprecatedGetSetProperty(TestDeprecatedGetProperty):
+ def _getTargetClass(self):
+ from zope.deprecation.deprecation import DeprecatedGetSetProperty
+ return DeprecatedGetSetProperty
+
+ def test___set__(self):
+ prop = DummyProperty()
+ proxy = self._makeOne(prop, 'hello')
+ self.assertEqual(proxy.__set__('inst', 'prop'), None)
+ self.assertEqual(prop.inst, 'inst')
+ self.assertEqual(prop.prop, 'prop')
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)]
+ )
+
+ def test___set__noshow(self):
+ prop = DummyProperty()
+ self.show.on = False
+ proxy = self._makeOne(prop, 'hello')
+ self.assertEqual(proxy.__set__('inst', 'prop'), None)
+ self.assertEqual(prop.inst, 'inst')
+ self.assertEqual(prop.prop, 'prop')
+ self.assertEqual(self.warnings.w, [])
+
+class TestDeprecatedSetGetDeleteProperty(TestDeprecatedGetSetProperty):
+ def _getTargetClass(self):
+ from zope.deprecation.deprecation import DeprecatedGetSetDeleteProperty
+ return DeprecatedGetSetDeleteProperty
+
+ def test___delete__(self):
+ prop = DummyProperty()
+ proxy = self._makeOne(prop, 'hello')
+ self.assertEqual(proxy.__delete__('inst'), None)
+ self.assertEqual(prop.inst, 'inst')
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)]
+ )
+
+ def test___delete__noshow(self):
+ prop = DummyProperty()
+ proxy = self._makeOne(prop, 'hello')
+ self.assertEqual(proxy.__delete__('inst'), None)
+ self.assertEqual(prop.inst, 'inst')
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)]
+ )
+
+class TestDeprecatedMethod(WarningsSetupBase, unittest.TestCase):
+ def _callFUT(self, method, message):
+ from zope.deprecation.deprecation import DeprecatedMethod
+ return DeprecatedMethod(method, message)
+
+ def fixture(self, a, b, c=1):
+ return 'fixture'
+
+ def test_it(self):
+ result = self._callFUT(self.fixture, 'hello')
+ self.assertEqual(result('a', 'b', c=2), 'fixture')
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)]
+ )
+
+ def test_it_noshow(self):
+ result = self._callFUT(self.fixture, 'hello')
+ self.show.on = False
+ self.assertEqual(result('a', 'b', c=2), 'fixture')
+ self.assertEqual(self.warnings.w, [])
+
+class Test_deprecated(WarningsSetupBase, unittest.TestCase):
+ def setUp(self):
+ super(Test_deprecated, self).setUp()
+ self.mod = _getTestsModule()
+
+ def tearDown(self):
+ super(Test_deprecated, self).tearDown()
+ sys.modules['zope.deprecation.tests'] = self.mod
+
+ def _callFUT(self, spec, message):
+ from zope.deprecation.deprecation import deprecated
+ return deprecated(spec, message)
+
+ def test_string_specifier(self):
+ self._callFUT('ClassFixture', 'hello')
+ mod = _getTestsModule()
+ self.assertNotEqual(mod, self.mod)
+ self.assertEqual(mod.ClassFixture, ClassFixture)
+ self.assertEqual(
+ self.warnings.w,
+ [('ClassFixture: hello', DeprecationWarning, 2)])
+
+ def test_string_specifier_sys_modules_already_mutated(self):
+ from zope.deprecation.deprecation import DeprecationProxy
+ mod = _getTestsModule()
+ new = sys.modules['zope.deprecation.tests'] = DeprecationProxy(mod)
+ self._callFUT('ClassFixture', 'hello')
+ self.assertEqual(new.ClassFixture, ClassFixture)
+ self.assertEqual(
+ self.warnings.w,
+ [('ClassFixture: hello', DeprecationWarning, 2)])
+
+ def test_function_specifier(self):
+ result = self._callFUT(functionfixture, 'hello')
+ self.assertNotEqual(result, functionfixture)
+ self.assertEqual(self.warnings.w, [])
+ result(self)
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)])
+
+ def test_module_specifier(self):
+ mod = _getTestsModule()
+ result = self._callFUT(mod, 'hello')
+ self.assertEqual(self.warnings.w, [])
+ self.assertEqual(result.ClassFixture, ClassFixture)
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)])
+
+ def test_getproperty_specifier(self):
+ prop = DummyGetProperty()
+ result = self._callFUT(prop, 'hello')
+ self.assertEqual(self.warnings.w, [])
+ self.assertEqual(result.__get__('inst', 'cls'), None)
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)])
+
+ def test_getsetproperty_specifier(self):
+ prop = DummyGetSetProperty()
+ result = self._callFUT(prop, 'hello')
+ self.assertEqual(self.warnings.w, [])
+ self.assertEqual(result.__set__('inst', 'prop'), None)
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)])
+
+ def test_getsetdeleteproperty_specifier(self):
+ prop = DummyGetSetDeleteProperty()
+ result = self._callFUT(prop, 'hello')
+ self.assertEqual(self.warnings.w, [])
+ self.assertEqual(result.__delete__('inst'), None)
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)])
+
+class Test_deprecate(WarningsSetupBase, unittest.TestCase):
+ def _getTargetClass(self):
+ from zope.deprecation.deprecation import deprecate
+ return deprecate
+
+ def _makeOne(self, msg):
+ cls = self._getTargetClass()
+ return cls(msg)
+
+ def fixture(self):
+ return 'fixture'
+
+ def test___call__(self):
+ proxy = self._makeOne('hello')
+ result = proxy(functionfixture)
+ self.assertEqual(result(self), None)
+ self.assertEqual(
+ self.warnings.w,
+ [('hello', DeprecationWarning, 2)])
+
+class Test_moved(WarningsSetupBase, unittest.TestCase):
+ def setUp(self):
+ super(Test_moved, self).setUp()
+
+ def tearDown(self):
+ super(Test_moved, self).tearDown()
+ del _getTestsModule().__dict__['abc']
+
+ def _callFUT(self, to_location, unsupported_in):
+ from zope.deprecation.deprecation import moved
+ return moved(to_location, unsupported_in)
+
+ def test_unsupported_None(self):
+ self._callFUT('zope.deprecation.fixture', None)
+ self.assertEqual(
+ self.warnings.w,
+ [('zope.deprecation.tests has moved to zope.deprecation.fixture.',
+ DeprecationWarning, 3)])
+
+ def test_unsupported_not_None(self):
+ self._callFUT('zope.deprecation.fixture', '1.3')
+ self.assertEqual(
+ self.warnings.w,
+ [('zope.deprecation.tests has moved to zope.deprecation.fixture. '
+ 'Import of zope.deprecation.tests will become unsupported in 1.3',
+ DeprecationWarning, 3)])
+
+class Test_import_aliases(unittest.TestCase):
+ def test_it(self):
+ for name in ('deprecated', 'deprecate', 'moved', 'ShowSwitch',
+ '__show__'):
+ real = getattr(sys.modules['zope.deprecation.deprecation'], name)
+ alias = getattr(sys.modules['zope.deprecation'], name)
+ self.assertEqual(real, alias, (real, alias))
+
+class DummyWarningsModule(object):
+ def __init__(self):
+ self.w = []
+
+ def warn(self, msg, type, stacklevel):
+ self.w.append((msg, type, stacklevel))
+
+class DummyGetProperty(object):
+ def __get__(self, inst, cls):
+ self.inst = inst
+ self.cls = cls
+
+class DummyGetSetProperty(DummyGetProperty):
+ def __set__(self, inst, prop):
+ self.inst = inst
+ self.prop = prop
+
+class DummyGetSetDeleteProperty(DummyGetSetProperty):
+ def __delete__(self, inst):
+ self.inst = inst
+
+DummyProperty = DummyGetSetDeleteProperty
+
+def _getTestsModule():
+ __import__('zope.deprecation.tests')
+ return sys.modules['zope.deprecation.tests']
+
+class DummyShow(object):
+ def __init__(self):
+ self.on = True
+
+ def __call__(self):
+ if self.on:
+ return True
+ return False
+
+class ClassFixture(object): pass
+
+class ClassFixture2(object): pass
+
+def functionfixture(self): pass
Copied: zope.deprecation/trunk/tox.ini (from rev 122726, zope.deprecation/branches/chrism-unittesting/tox.ini)
===================================================================
--- zope.deprecation/trunk/tox.ini (rev 0)
+++ zope.deprecation/trunk/tox.ini 2011-09-05 10:43:53 UTC (rev 122727)
@@ -0,0 +1,14 @@
+[tox]
+envlist =
+ py25,py26,py27,py32,jython,pypy
+
+[testenv]
+commands =
+ python setup.py test -q
+deps =
+ virtualenv
+
+[jython]
+commands =
+ jython setup.py test -q
+
More information about the checkins
mailing list