Merge "Use debtcollector library to replace internal utility"

This commit is contained in:
Jenkins 2015-03-03 16:45:39 +00:00 committed by Gerrit Code Review
commit 5777e9469b
8 changed files with 41 additions and 144 deletions

View File

@ -31,3 +31,6 @@ jsonschema>=2.0.0,<3.0.0
# For common utilities # For common utilities
oslo.utils>=1.2.0 # Apache-2.0 oslo.utils>=1.2.0 # Apache-2.0
oslo.serialization>=1.2.0 # Apache-2.0 oslo.serialization>=1.2.0 # Apache-2.0
# For deprecation of things
debtcollector>=0.2

View File

@ -25,3 +25,6 @@ jsonschema>=2.0.0,<3.0.0
# For common utilities # For common utilities
oslo.utils>=1.2.0 # Apache-2.0 oslo.utils>=1.2.0 # Apache-2.0
oslo.serialization>=1.2.0 # Apache-2.0 oslo.serialization>=1.2.0 # Apache-2.0
# For deprecation of things
debtcollector>=0.2

View File

@ -14,6 +14,8 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from debtcollector import moves
from taskflow.conductors.backends import impl_blocking from taskflow.conductors.backends import impl_blocking
from taskflow.utils import deprecation from taskflow.utils import deprecation
@ -23,6 +25,6 @@ deprecation.removed_module(__name__,
version="0.8", removal_version="?") version="0.8", removal_version="?")
# TODO(harlowja): remove this proxy/legacy class soon... # TODO(harlowja): remove this proxy/legacy class soon...
SingleThreadedConductor = deprecation.moved_inheritable_class( SingleThreadedConductor = moves.moved_class(
impl_blocking.BlockingConductor, 'SingleThreadedConductor', impl_blocking.BlockingConductor, 'SingleThreadedConductor',
__name__, version="0.8", removal_version="?") __name__, version="0.8", removal_version="?")

View File

@ -17,11 +17,11 @@
import abc import abc
from debtcollector import moves
import six import six
from taskflow import storage from taskflow import storage
from taskflow.types import notifier from taskflow.types import notifier
from taskflow.utils import deprecation
from taskflow.utils import misc from taskflow.utils import misc
@ -56,8 +56,8 @@ class Engine(object):
return self._notifier return self._notifier
@property @property
@deprecation.moved_property('atom_notifier', version="0.6", @moves.moved_property('atom_notifier', version="0.6",
removal_version="?") removal_version="?")
def task_notifier(self): def task_notifier(self):
"""The task notifier.""" """The task notifier."""
return self._atom_notifier return self._atom_notifier
@ -113,7 +113,5 @@ class Engine(object):
# TODO(harlowja): remove in 0.7 or later... # TODO(harlowja): remove in 0.7 or later...
EngineBase = deprecation.moved_inheritable_class(Engine, EngineBase = moves.moved_class(Engine, 'EngineBase', __name__,
'EngineBase', __name__, version="0.6", removal_version="?")
version="0.6",
removal_version="?")

View File

@ -18,6 +18,7 @@ import contextlib
import itertools import itertools
import traceback import traceback
from debtcollector import renames
from oslo_utils import importutils from oslo_utils import importutils
from oslo_utils import reflection from oslo_utils import reflection
import six import six
@ -26,7 +27,6 @@ import stevedore.driver
from taskflow import exceptions as exc from taskflow import exceptions as exc
from taskflow import logging from taskflow import logging
from taskflow.persistence import backends as p_backends from taskflow.persistence import backends as p_backends
from taskflow.utils import deprecation
from taskflow.utils import misc from taskflow.utils import misc
from taskflow.utils import persistence_utils as p_utils from taskflow.utils import persistence_utils as p_utils
@ -90,14 +90,14 @@ def _extract_engine(**kwargs):
lambda frame: frame[0] in _FILE_NAMES, lambda frame: frame[0] in _FILE_NAMES,
reversed(traceback.extract_stack(limit=3))) reversed(traceback.extract_stack(limit=3)))
stacklevel = sum(1 for _frame in finder) stacklevel = sum(1 for _frame in finder)
decorator = deprecation.renamed_kwarg('engine_conf', 'engine', decorator = renames.renamed_kwarg('engine_conf', 'engine',
version="0.6", version="0.6",
removal_version="?", removal_version="?",
# Three is added on since the # Three is added on since the
# decorator adds three of its own # decorator adds three of its own
# stack levels that we need to # stack levels that we need to
# hop out of... # hop out of...
stacklevel=stacklevel + 3) stacklevel=stacklevel + 3)
return decorator(_compat_extract)(**kwargs) return decorator(_compat_extract)(**kwargs)
else: else:
return _compat_extract(**kwargs) return _compat_extract(**kwargs)

View File

@ -18,6 +18,7 @@ from __future__ import absolute_import
import abc import abc
from debtcollector import moves
from oslo_utils import excutils from oslo_utils import excutils
import six import six
@ -25,7 +26,6 @@ from taskflow import logging
from taskflow import states from taskflow import states
from taskflow.types import failure from taskflow.types import failure
from taskflow.types import notifier from taskflow.types import notifier
from taskflow.utils import deprecation
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -165,10 +165,8 @@ class Listener(object):
# TODO(harlowja): remove in 0.7 or later... # TODO(harlowja): remove in 0.7 or later...
ListenerBase = deprecation.moved_inheritable_class(Listener, ListenerBase = moves.moved_class(Listener, 'ListenerBase', __name__,
'ListenerBase', __name__, version="0.6", removal_version="?")
version="0.6",
removal_version="?")
@six.add_metaclass(abc.ABCMeta) @six.add_metaclass(abc.ABCMeta)
@ -213,10 +211,9 @@ class DumpingListener(Listener):
# TODO(harlowja): remove in 0.7 or later... # TODO(harlowja): remove in 0.7 or later...
class LoggingBase(deprecation.moved_inheritable_class(DumpingListener, class LoggingBase(moves.moved_class(DumpingListener,
'LoggingBase', __name__, 'LoggingBase', __name__,
version="0.6", version="0.6", removal_version="?")):
removal_version="?")):
def _dump(self, message, *args, **kwargs): def _dump(self, message, *args, **kwargs):
self._log(message, *args, **kwargs) self._log(message, *args, **kwargs)

View File

@ -14,17 +14,11 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import functools
import warnings import warnings
from oslo_utils import reflection from oslo_utils import reflection
import six import six
_CLASS_MOVED_PREFIX_TPL = "Class '%s' has moved to '%s'"
_KIND_MOVED_PREFIX_TPL = "%s '%s' has moved to '%s'"
_KWARG_MOVED_POSTFIX_TPL = ", please use the '%s' argument instead"
_KWARG_MOVED_PREFIX_TPL = "Using the '%s' argument is deprecated"
def deprecation(message, stacklevel=None): def deprecation(message, stacklevel=None):
"""Warns about some type of deprecation that has been (or will be) made. """Warns about some type of deprecation that has been (or will be) made.
@ -137,34 +131,11 @@ def _generate_message(prefix, postfix=None, message=None,
return ''.join(message_components) return ''.join(message_components)
def renamed_kwarg(old_name, new_name, message=None,
version=None, removal_version=None, stacklevel=3):
"""Decorates a kwarg accepting function to deprecate a renamed kwarg."""
prefix = _KWARG_MOVED_PREFIX_TPL % old_name
postfix = _KWARG_MOVED_POSTFIX_TPL % new_name
out_message = _generate_message(prefix, postfix=postfix,
message=message, version=version,
removal_version=removal_version)
def decorator(f):
@six.wraps(f)
def wrapper(*args, **kwargs):
if old_name in kwargs:
deprecation(out_message, stacklevel=stacklevel)
return f(*args, **kwargs)
return wrapper
return decorator
def removed_kwarg(old_name, message=None, def removed_kwarg(old_name, message=None,
version=None, removal_version=None, stacklevel=3): version=None, removal_version=None, stacklevel=3):
"""Decorates a kwarg accepting function to deprecate a removed kwarg.""" """Decorates a kwarg accepting function to deprecate a removed kwarg."""
prefix = _KWARG_MOVED_PREFIX_TPL % old_name prefix = "Using the '%s' argument is deprecated" % old_name
out_message = _generate_message(prefix, postfix=None, out_message = _generate_message(prefix, postfix=None,
message=message, version=version, message=message, version=version,
removal_version=removal_version) removal_version=removal_version)
@ -182,41 +153,9 @@ def removed_kwarg(old_name, message=None,
return decorator return decorator
def _moved_decorator(kind, new_attribute_name, message=None,
version=None, removal_version=None,
stacklevel=3):
"""Decorates a method/property that was moved to another location."""
def decorator(f):
try:
old_attribute_name = f.__qualname__
fully_qualified = True
except AttributeError:
old_attribute_name = f.__name__
fully_qualified = False
@six.wraps(f)
def wrapper(self, *args, **kwargs):
base_name = reflection.get_class_name(self, fully_qualified=False)
if fully_qualified:
old_name = old_attribute_name
else:
old_name = ".".join((base_name, old_attribute_name))
new_name = ".".join((base_name, new_attribute_name))
prefix = _KIND_MOVED_PREFIX_TPL % (kind, old_name, new_name)
out_message = _generate_message(
prefix, message=message,
version=version, removal_version=removal_version)
deprecation(out_message, stacklevel=stacklevel)
return f(self, *args, **kwargs)
return wrapper
return decorator
def removed_module(module_name, replacement_name=None, message=None, def removed_module(module_name, replacement_name=None, message=None,
version=None, removal_version=None, stacklevel=4): version=None, removal_version=None, stacklevel=4):
"""Deprecates a module that will be removed/replaced in the future."""
prefix = "The '%s' module usage is deprecated" % module_name prefix = "The '%s' module usage is deprecated" % module_name
if replacement_name: if replacement_name:
postfix = ", please use %s instead" % replacement_name postfix = ", please use %s instead" % replacement_name
@ -229,56 +168,9 @@ def removed_module(module_name, replacement_name=None, message=None,
deprecation(out_message, stacklevel=stacklevel) deprecation(out_message, stacklevel=stacklevel)
def moved_property(new_attribute_name, message=None, def moved_proxy_class(new_class, old_class_name, old_module_name,
version=None, removal_version=None, stacklevel=3): message=None, version=None, removal_version=None,
"""Decorates a *instance* property that was moved to another location.""" stacklevel=3):
return _moved_decorator('Property', new_attribute_name, message=message,
version=version, removal_version=removal_version,
stacklevel=stacklevel)
def moved_inheritable_class(new_class, old_class_name, old_module_name,
message=None, version=None, removal_version=None):
"""Deprecates a class that was moved to another location.
NOTE(harlowja): this creates a new-old type that can be used for a
deprecation period that can be inherited from, the difference between this
and the ``moved_class`` deprecation function is that the proxy from that
function can not be inherited from (thus limiting its use for a more
particular usecase where inheritance is not needed).
This will emit warnings when the old locations class is initialized,
telling where the new and improved location for the old class now is.
"""
old_name = ".".join((old_module_name, old_class_name))
new_name = reflection.get_class_name(new_class)
prefix = _CLASS_MOVED_PREFIX_TPL % (old_name, new_name)
out_message = _generate_message(prefix,
message=message, version=version,
removal_version=removal_version)
def decorator(f):
# Use the older functools until the following is available:
#
# https://bitbucket.org/gutworth/six/issue/105
@functools.wraps(f, assigned=("__name__", "__doc__"))
def wrapper(self, *args, **kwargs):
deprecation(out_message, stacklevel=3)
return f(self, *args, **kwargs)
return wrapper
old_class = type(old_class_name, (new_class,), {})
old_class.__module__ = old_module_name
old_class.__init__ = decorator(old_class.__init__)
return old_class
def moved_class(new_class, old_class_name, old_module_name, message=None,
version=None, removal_version=None, stacklevel=3):
"""Deprecates a class that was moved to another location. """Deprecates a class that was moved to another location.
This will emit warnings when the old locations class is initialized, This will emit warnings when the old locations class is initialized,
@ -286,7 +178,7 @@ def moved_class(new_class, old_class_name, old_module_name, message=None,
""" """
old_name = ".".join((old_module_name, old_class_name)) old_name = ".".join((old_module_name, old_class_name))
new_name = reflection.get_class_name(new_class) new_name = reflection.get_class_name(new_class)
prefix = _CLASS_MOVED_PREFIX_TPL % (old_name, new_name) prefix = "Class '%s' has moved to '%s'" % (old_name, new_name)
out_message = _generate_message(prefix, out_message = _generate_message(prefix,
message=message, version=version, message=message, version=version,
removal_version=removal_version) removal_version=removal_version)

View File

@ -479,12 +479,14 @@ def ensure_tree(path):
raise raise
Failure = deprecation.moved_class(failure.Failure, 'Failure', __name__, Failure = deprecation.moved_proxy_class(failure.Failure,
version="0.6", removal_version="?") 'Failure', __name__,
version="0.6", removal_version="?")
Notifier = deprecation.moved_class(notifier.Notifier, 'Notifier', __name__, Notifier = deprecation.moved_proxy_class(notifier.Notifier,
version="0.6", removal_version="?") 'Notifier', __name__,
version="0.6", removal_version="?")
@contextlib.contextmanager @contextlib.contextmanager