aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/deprecate.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/deprecate.py')
-rwxr-xr-xlib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/deprecate.py534
1 files changed, 0 insertions, 534 deletions
diff --git a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/deprecate.py b/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/deprecate.py
deleted file mode 100755
index f4b31b47..00000000
--- a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/python/deprecate.py
+++ /dev/null
@@ -1,534 +0,0 @@
-# -*- test-case-name: twisted.python.test.test_deprecate -*-
-# Copyright (c) Twisted Matrix Laboratories.
-# See LICENSE for details.
-
-"""
-Deprecation framework for Twisted.
-
-To mark a method or function as being deprecated do this::
-
- from twisted.python.versions import Version
- from twisted.python.deprecate import deprecated
-
- @deprecated(Version("Twisted", 8, 0, 0))
- def badAPI(self, first, second):
- '''
- Docstring for badAPI.
- '''
- ...
-
-The newly-decorated badAPI will issue a warning when called. It will also have
-a deprecation notice appended to its docstring.
-
-To mark module-level attributes as being deprecated you can use::
-
- badAttribute = "someValue"
-
- ...
-
- deprecatedModuleAttribute(
- Version("Twisted", 8, 0, 0),
- "Use goodAttribute instead.",
- "your.full.module.name",
- "badAttribute")
-
-The deprecated attributes will issue a warning whenever they are accessed. If
-the attributes being deprecated are in the same module as the
-L{deprecatedModuleAttribute} call is being made from, the C{__name__} global
-can be used as the C{moduleName} parameter.
-
-See also L{Version}.
-
-@type DEPRECATION_WARNING_FORMAT: C{str}
-@var DEPRECATION_WARNING_FORMAT: The default deprecation warning string format
- to use when one is not provided by the user.
-"""
-
-
-__all__ = [
- 'deprecated',
- 'getDeprecationWarningString',
- 'getWarningMethod',
- 'setWarningMethod',
- 'deprecatedModuleAttribute',
- ]
-
-
-import sys, inspect
-from warnings import warn, warn_explicit
-from dis import findlinestarts
-
-from twisted.python.versions import getVersionString
-from twisted.python.util import mergeFunctionMetadata
-
-
-
-DEPRECATION_WARNING_FORMAT = '%(fqpn)s was deprecated in %(version)s'
-
-
-# Notionally, part of twisted.python.reflect, but defining it there causes a
-# cyclic dependency between this module and that module. Define it here,
-# instead, and let reflect import it to re-expose to the public.
-def _fullyQualifiedName(obj):
- """
- Return the fully qualified name of a module, class, method or function.
- Classes and functions need to be module level ones to be correctly
- qualified.
-
- @rtype: C{str}.
- """
- name = obj.__name__
- if inspect.isclass(obj) or inspect.isfunction(obj):
- moduleName = obj.__module__
- return "%s.%s" % (moduleName, name)
- elif inspect.ismethod(obj):
- className = _fullyQualifiedName(obj.im_class)
- return "%s.%s" % (className, name)
- return name
-# Try to keep it looking like something in twisted.python.reflect.
-_fullyQualifiedName.__module__ = 'twisted.python.reflect'
-_fullyQualifiedName.__name__ = 'fullyQualifiedName'
-
-
-
-def getWarningMethod():
- """
- Return the warning method currently used to record deprecation warnings.
- """
- return warn
-
-
-
-def setWarningMethod(newMethod):
- """
- Set the warning method to use to record deprecation warnings.
-
- The callable should take message, category and stacklevel. The return
- value is ignored.
- """
- global warn
- warn = newMethod
-
-
-
-def _getDeprecationDocstring(version, replacement=None):
- """
- Generate an addition to a deprecated object's docstring that explains its
- deprecation.
-
- @param version: the version it was deprecated.
- @type version: L{Version}
-
- @param replacement: The replacement, if specified.
- @type replacement: C{str} or callable
-
- @return: a string like "Deprecated in Twisted 27.2.0; please use
- twisted.timestream.tachyon.flux instead."
- """
- doc = "Deprecated in %s" % (getVersionString(version),)
- if replacement:
- doc = "%s; %s" % (doc, _getReplacementString(replacement))
- return doc + "."
-
-
-
-def _getReplacementString(replacement):
- """
- Surround a replacement for a deprecated API with some polite text exhorting
- the user to consider it as an alternative.
-
- @type replacement: C{str} or callable
-
- @return: a string like "please use twisted.python.modules.getModule
- instead".
- """
- if callable(replacement):
- replacement = _fullyQualifiedName(replacement)
- return "please use %s instead" % (replacement,)
-
-
-
-def _getDeprecationWarningString(fqpn, version, format=None, replacement=None):
- """
- Return a string indicating that the Python name was deprecated in the given
- version.
-
- @param fqpn: Fully qualified Python name of the thing being deprecated
- @type fqpn: C{str}
-
- @param version: Version that C{fqpn} was deprecated in.
- @type version: L{twisted.python.versions.Version}
-
- @param format: A user-provided format to interpolate warning values into, or
- L{DEPRECATION_WARNING_FORMAT
- <twisted.python.deprecate.DEPRECATION_WARNING_FORMAT>} if C{None} is
- given.
- @type format: C{str}
-
- @param replacement: what should be used in place of C{fqpn}. Either pass in
- a string, which will be inserted into the warning message, or a
- callable, which will be expanded to its full import path.
- @type replacement: C{str} or callable
-
- @return: A textual description of the deprecation
- @rtype: C{str}
- """
- if format is None:
- format = DEPRECATION_WARNING_FORMAT
- warningString = format % {
- 'fqpn': fqpn,
- 'version': getVersionString(version)}
- if replacement:
- warningString = "%s; %s" % (
- warningString, _getReplacementString(replacement))
- return warningString
-
-
-
-def getDeprecationWarningString(callableThing, version, format=None,
- replacement=None):
- """
- Return a string indicating that the callable was deprecated in the given
- version.
-
- @type callableThing: C{callable}
- @param callableThing: Callable object to be deprecated
-
- @type version: L{twisted.python.versions.Version}
- @param version: Version that C{callableThing} was deprecated in
-
- @type format: C{str}
- @param format: A user-provided format to interpolate warning values into,
- or L{DEPRECATION_WARNING_FORMAT
- <twisted.python.deprecate.DEPRECATION_WARNING_FORMAT>} if C{None} is
- given
-
- @param callableThing: A callable to be deprecated.
-
- @param version: The L{twisted.python.versions.Version} that the callable
- was deprecated in.
-
- @param replacement: what should be used in place of the callable. Either
- pass in a string, which will be inserted into the warning message,
- or a callable, which will be expanded to its full import path.
- @type replacement: C{str} or callable
-
- @return: A string describing the deprecation.
- @rtype: C{str}
- """
- return _getDeprecationWarningString(
- _fullyQualifiedName(callableThing), version, format, replacement)
-
-
-
-def deprecated(version, replacement=None):
- """
- Return a decorator that marks callables as deprecated.
-
- @type version: L{twisted.python.versions.Version}
- @param version: The version in which the callable will be marked as
- having been deprecated. The decorated function will be annotated
- with this version, having it set as its C{deprecatedVersion}
- attribute.
-
- @param version: the version that the callable was deprecated in.
- @type version: L{twisted.python.versions.Version}
-
- @param replacement: what should be used in place of the callable. Either
- pass in a string, which will be inserted into the warning message,
- or a callable, which will be expanded to its full import path.
- @type replacement: C{str} or callable
- """
- def deprecationDecorator(function):
- """
- Decorator that marks C{function} as deprecated.
- """
- warningString = getDeprecationWarningString(
- function, version, None, replacement)
-
- def deprecatedFunction(*args, **kwargs):
- warn(
- warningString,
- DeprecationWarning,
- stacklevel=2)
- return function(*args, **kwargs)
-
- deprecatedFunction = mergeFunctionMetadata(
- function, deprecatedFunction)
- _appendToDocstring(deprecatedFunction,
- _getDeprecationDocstring(version, replacement))
- deprecatedFunction.deprecatedVersion = version
- return deprecatedFunction
-
- return deprecationDecorator
-
-
-
-def _appendToDocstring(thingWithDoc, textToAppend):
- """
- Append the given text to the docstring of C{thingWithDoc}.
-
- If C{thingWithDoc} has no docstring, then the text just replaces the
- docstring. If it has a single-line docstring then it appends a blank line
- and the message text. If it has a multi-line docstring, then in appends a
- blank line a the message text, and also does the indentation correctly.
- """
- if thingWithDoc.__doc__:
- docstringLines = thingWithDoc.__doc__.splitlines()
- else:
- docstringLines = []
-
- if len(docstringLines) == 0:
- docstringLines.append(textToAppend)
- elif len(docstringLines) == 1:
- docstringLines.extend(['', textToAppend, ''])
- else:
- spaces = docstringLines.pop()
- docstringLines.extend(['',
- spaces + textToAppend,
- spaces])
- thingWithDoc.__doc__ = '\n'.join(docstringLines)
-
-
-
-class _InternalState(object):
- """
- An L{_InternalState} is a helper object for a L{_ModuleProxy}, so that it
- can easily access its own attributes, bypassing its logic for delegating to
- another object that it's proxying for.
-
- @ivar proxy: a L{ModuleProxy}
- """
- def __init__(self, proxy):
- object.__setattr__(self, 'proxy', proxy)
-
-
- def __getattribute__(self, name):
- return object.__getattribute__(object.__getattribute__(self, 'proxy'),
- name)
-
-
- def __setattr__(self, name, value):
- return object.__setattr__(object.__getattribute__(self, 'proxy'),
- name, value)
-
-
-
-class _ModuleProxy(object):
- """
- Python module wrapper to hook module-level attribute access.
-
- Access to deprecated attributes first checks
- L{_ModuleProxy._deprecatedAttributes}, if the attribute does not appear
- there then access falls through to L{_ModuleProxy._module}, the wrapped
- module object.
-
- @ivar _module: Module on which to hook attribute access.
- @type _module: C{module}
-
- @ivar _deprecatedAttributes: Mapping of attribute names to objects that
- retrieve the module attribute's original value.
- @type _deprecatedAttributes: C{dict} mapping C{str} to
- L{_DeprecatedAttribute}
-
- @ivar _lastWasPath: Heuristic guess as to whether warnings about this
- package should be ignored for the next call. If the last attribute
- access of this module was a C{getattr} of C{__path__}, we will assume
- that it was the import system doing it and we won't emit a warning for
- the next access, even if it is to a deprecated attribute. The CPython
- import system always tries to access C{__path__}, then the attribute
- itself, then the attribute itself again, in both successful and failed
- cases.
- @type _lastWasPath: C{bool}
- """
- def __init__(self, module):
- state = _InternalState(self)
- state._module = module
- state._deprecatedAttributes = {}
- state._lastWasPath = False
-
-
- def __repr__(self):
- """
- Get a string containing the type of the module proxy and a
- representation of the wrapped module object.
- """
- state = _InternalState(self)
- return '<%s module=%r>' % (type(self).__name__, state._module)
-
-
- def __setattr__(self, name, value):
- """
- Set an attribute on the wrapped module object.
- """
- state = _InternalState(self)
- state._lastWasPath = False
- setattr(state._module, name, value)
-
-
- def __getattribute__(self, name):
- """
- Get an attribute from the module object, possibly emitting a warning.
-
- If the specified name has been deprecated, then a warning is issued.
- (Unless certain obscure conditions are met; see
- L{_ModuleProxy._lastWasPath} for more information about what might quash
- such a warning.)
- """
- state = _InternalState(self)
- if state._lastWasPath:
- deprecatedAttribute = None
- else:
- deprecatedAttribute = state._deprecatedAttributes.get(name)
-
- if deprecatedAttribute is not None:
- # If we have a _DeprecatedAttribute object from the earlier lookup,
- # allow it to issue the warning.
- value = deprecatedAttribute.get()
- else:
- # Otherwise, just retrieve the underlying value directly; it's not
- # deprecated, there's no warning to issue.
- value = getattr(state._module, name)
- if name == '__path__':
- state._lastWasPath = True
- else:
- state._lastWasPath = False
- return value
-
-
-
-class _DeprecatedAttribute(object):
- """
- Wrapper for deprecated attributes.
-
- This is intended to be used by L{_ModuleProxy}. Calling
- L{_DeprecatedAttribute.get} will issue a warning and retrieve the
- underlying attribute's value.
-
- @type module: C{module}
- @ivar module: The original module instance containing this attribute
-
- @type fqpn: C{str}
- @ivar fqpn: Fully qualified Python name for the deprecated attribute
-
- @type version: L{twisted.python.versions.Version}
- @ivar version: Version that the attribute was deprecated in
-
- @type message: C{str}
- @ivar message: Deprecation message
- """
- def __init__(self, module, name, version, message):
- """
- Initialise a deprecated name wrapper.
- """
- self.module = module
- self.__name__ = name
- self.fqpn = module.__name__ + '.' + name
- self.version = version
- self.message = message
-
-
- def get(self):
- """
- Get the underlying attribute value and issue a deprecation warning.
- """
- # This might fail if the deprecated thing is a module inside a package.
- # In that case, don't emit the warning this time. The import system
- # will come back again when it's not an AttributeError and we can emit
- # the warning then.
- result = getattr(self.module, self.__name__)
- message = _getDeprecationWarningString(self.fqpn, self.version,
- DEPRECATION_WARNING_FORMAT + ': ' + self.message)
- warn(message, DeprecationWarning, stacklevel=3)
- return result
-
-
-
-def _deprecateAttribute(proxy, name, version, message):
- """
- Mark a module-level attribute as being deprecated.
-
- @type proxy: L{_ModuleProxy}
- @param proxy: The module proxy instance proxying the deprecated attributes
-
- @type name: C{str}
- @param name: Attribute name
-
- @type version: L{twisted.python.versions.Version}
- @param version: Version that the attribute was deprecated in
-
- @type message: C{str}
- @param message: Deprecation message
- """
- _module = object.__getattribute__(proxy, '_module')
- attr = _DeprecatedAttribute(_module, name, version, message)
- # Add a deprecated attribute marker for this module's attribute. When this
- # attribute is accessed via _ModuleProxy a warning is emitted.
- _deprecatedAttributes = object.__getattribute__(
- proxy, '_deprecatedAttributes')
- _deprecatedAttributes[name] = attr
-
-
-
-def deprecatedModuleAttribute(version, message, moduleName, name):
- """
- Declare a module-level attribute as being deprecated.
-
- @type version: L{twisted.python.versions.Version}
- @param version: Version that the attribute was deprecated in
-
- @type message: C{str}
- @param message: Deprecation message
-
- @type moduleName: C{str}
- @param moduleName: Fully-qualified Python name of the module containing
- the deprecated attribute; if called from the same module as the
- attributes are being deprecated in, using the C{__name__} global can
- be helpful
-
- @type name: C{str}
- @param name: Attribute name to deprecate
- """
- module = sys.modules[moduleName]
- if not isinstance(module, _ModuleProxy):
- module = _ModuleProxy(module)
- sys.modules[moduleName] = module
-
- _deprecateAttribute(module, name, version, message)
-
-
-def warnAboutFunction(offender, warningString):
- """
- Issue a warning string, identifying C{offender} as the responsible code.
-
- This function is used to deprecate some behavior of a function. It differs
- from L{warnings.warn} in that it is not limited to deprecating the behavior
- of a function currently on the call stack.
-
- @param function: The function that is being deprecated.
-
- @param warningString: The string that should be emitted by this warning.
- @type warningString: C{str}
-
- @since: 11.0
- """
- # inspect.getmodule() is attractive, but somewhat
- # broken in Python < 2.6. See Python bug 4845.
- offenderModule = sys.modules[offender.__module__]
- filename = inspect.getabsfile(offenderModule)
- lineStarts = list(findlinestarts(offender.func_code))
- lastLineNo = lineStarts[-1][1]
- globals = offender.func_globals
-
- kwargs = dict(
- category=DeprecationWarning,
- filename=filename,
- lineno=lastLineNo,
- module=offenderModule.__name__,
- registry=globals.setdefault("__warningregistry__", {}),
- module_globals=None)
-
- if sys.version_info[:2] < (2, 5):
- kwargs.pop('module_globals')
-
- warn_explicit(warningString, **kwargs)