Rev 4931: Add a _CompatibilityThunkFeature. in http://bazaar.launchpad.net/~jameinel/bzr/2.1.0rc1-module-available
John Arbash Meinel
john at arbash-meinel.com
Tue Dec 22 15:37:37 GMT 2009
At http://bazaar.launchpad.net/~jameinel/bzr/2.1.0rc1-module-available
------------------------------------------------------------
revno: 4931
revision-id: john at arbash-meinel.com-20091222153723-p4ksbawgnb5z1u2x
parent: john at arbash-meinel.com-20091221195526-00dyphqwkjsblrb1
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.1.0rc1-module-available
timestamp: Tue 2009-12-22 09:37:23 -0600
message:
Add a _CompatibilityThunkFeature.
It sends a DeprecationWarning, and then thunks over to the real feature.
This should make it easier to rename features and move them into
bzrlib.tests.features without breaking plugins, etc.
-------------- next part --------------
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py 2009-12-21 19:52:56 +0000
+++ b/bzrlib/tests/__init__.py 2009-12-22 15:37:23 +0000
@@ -88,6 +88,7 @@
from bzrlib.symbol_versioning import (
DEPRECATED_PARAMETER,
deprecated_function,
+ deprecated_in,
deprecated_method,
deprecated_passed,
)
@@ -4248,6 +4249,34 @@
UnicodeFilenameFeature = _UnicodeFilenameFeature()
+class _CompatabilityThunkFeature(Feature):
+ """This feature is just a thunk to another feature.
+
+ It issues a deprecation warning if it is accessed, to let you know that you
+ should really use a different feature.
+ """
+
+ def __init__(self, module, name, this_name, dep_version):
+ super(_CompatabilityThunkFeature, self).__init__()
+ self._module = module
+ self._name = name
+ self._this_name = this_name
+ self._dep_version = dep_version
+ self._feature = None
+
+ def _ensure(self):
+ if self._feature is None:
+ msg = (self._dep_version % self._this_name) + (
+ ' Use %s.%s instead.' % (self._module, self._name))
+ symbol_versioning.warn(msg, DeprecationWarning)
+ mod = __import__(self._module, {}, {}, [self._name])
+ self._feature = getattr(mod, self._name)
+
+ def _probe(self):
+ self._ensure()
+ return self._feature._probe()
+
+
class ModuleAvailableFeature(Feature):
"""This is a feature than describes a module we want to be available.
@@ -4280,8 +4309,8 @@
# This is kept here for compatibility, it is recommended to use
# 'bzrlib.tests.feature.paramiko' instead
-ParamikoFeature = ModuleAvailableFeature('paramiko')
-
+ParamikoFeature = _CompatabilityThunkFeature('bzrlib.tests.features',
+ 'paramiko', 'bzrlib.tests.ParamikoFeature', deprecated_in((2,1,0)))
def probe_unicode_in_user_encoding():
@@ -4448,7 +4477,9 @@
CaseInsensitiveFilesystemFeature = _CaseInsensitiveFilesystemFeature()
-SubUnitFeature = ModuleAvailableFeature('subunit')
+# Kept for compatibility, use bzrlib.tests.features.subunit instead
+SubUnitFeature = _CompatabilityThunkFeature('bzrlib.tests.features', 'subunit',
+ 'bzrlib.tests.SubUnitFeature', deprecated_in((2,1,0)))
# Only define SubUnitBzrRunner if subunit is available.
try:
from subunit import TestProtocolClient
=== modified file 'bzrlib/tests/blackbox/test_selftest.py'
--- a/bzrlib/tests/blackbox/test_selftest.py 2009-12-21 19:52:56 +0000
+++ b/bzrlib/tests/blackbox/test_selftest.py 2009-12-22 15:37:23 +0000
@@ -24,7 +24,6 @@
from bzrlib.errors import ParamikoNotPresent
from bzrlib.tests import (
features,
- SubUnitFeature,
TestCase,
TestCaseInTempDir,
TestSkipped,
@@ -114,7 +113,7 @@
self.assertEqual(['foo', 'bar'], params[1]['starting_with'])
def test_subunit(self):
- self.requireFeature(SubUnitFeature)
+ self.requireFeature(features.subunit)
params = self.get_params_passed_to_core('selftest --subunit')
self.assertEqual(tests.SubUnitBzrRunner, params[1]['runner_class'])
=== modified file 'bzrlib/tests/features.py'
--- a/bzrlib/tests/features.py 2009-12-21 19:52:56 +0000
+++ b/bzrlib/tests/features.py 2009-12-22 15:37:23 +0000
@@ -19,5 +19,6 @@
ApportFeature = tests.ModuleAvailableFeature('apport')
-paramiko = tests.ParamikoFeature
+paramiko = tests.ModuleAvailableFeature('paramiko')
pycurl = tests.ModuleAvailableFeature('pycurl')
+subunit = tests.ModuleAvailableFeature('subunit')
=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py 2009-12-21 19:55:26 +0000
+++ b/bzrlib/tests/test_selftest.py 2009-12-22 15:37:23 +0000
@@ -53,7 +53,6 @@
)
from bzrlib.tests import (
features,
- SubUnitFeature,
test_lsprof,
test_sftp_transport,
TestUtil,
@@ -1983,7 +1982,7 @@
self.assertEqual(expected.getvalue(), repeated.getvalue())
def test_runner_class(self):
- self.requireFeature(SubUnitFeature)
+ self.requireFeature(features.subunit)
from subunit import ProtocolTestCase
stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
test_suite_factory=self.factory)
@@ -2495,6 +2494,21 @@
self.assertIs(feature, exception.args[0])
+simple_thunk_feature = tests._CompatabilityThunkFeature(
+ 'bzrlib.tests', 'UnicodeFilename',
+ 'bzrlib.tests.test_selftest.simple_thunk_feature',
+ deprecated_in((2,1,0)))
+
+class Test_CompatibilityFeature(tests.TestCase):
+
+ def test_does_thunk(self):
+ res = self.callDeprecated(
+ ['bzrlib.tests.test_selftest.simple_thunk_feature was deprecated'
+ ' in version 2.1.0. Use bzrlib.tests.UnicodeFilename instead.'],
+ simple_thunk_feature.available)
+ self.assertEqual(tests.UnicodeFilename.available(), res)
+
+
class TestModuleAvailableFeature(tests.TestCase):
def test_available_module(self):
More information about the bazaar-commits
mailing list