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