1
# Copyright (C) 2006-2010 Canonical Ltd
1
# Copyright (C) 2006, 2007, 2008, 2009 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
49
44
'%s was deprecated in version 1.4.0.'
51
46
return ("%%s was deprecated in version %s."
52
% breezy._format_version_tuple(version_tuple))
47
% bzrlib._format_version_tuple(version_tuple))
55
50
def set_warning_method(method):
71
66
"""Generate an automatic deprecation string for a_callable.
73
68
:param a_callable: The callable to substitute into deprecation_version.
74
:param deprecation_version: A deprecation format warning string. This
75
should have a single %s operator in it. a_callable will be turned into
76
a nice python symbol and then substituted into deprecation_version.
69
:param deprecation_version: A deprecation format warning string. This should
70
have a single %s operator in it. a_callable will be turned into a nice
71
python symbol and then substituted into deprecation_version.
78
if getattr(a_callable, '__self__', None) is not None:
79
symbol = "%s.%s.%s" % (a_callable.__self__.__class__.__module__,
80
a_callable.__self__.__class__.__name__,
82
elif getattr(a_callable, '__qualname__', None) is not None and '<' not in a_callable.__qualname__:
83
symbol = "%s.%s" % (a_callable.__module__,
84
a_callable.__qualname__)
73
# We also want to handle old-style classes, in particular exception, and
74
# they don't have an im_class attribute.
75
if getattr(a_callable, 'im_class', None) is None:
86
76
symbol = "%s.%s" % (a_callable.__module__,
87
77
a_callable.__name__)
79
symbol = "%s.%s.%s" % (a_callable.im_class.__module__,
80
a_callable.im_class.__name__,
88
83
return deprecation_version % symbol
97
92
def decorated_function(*args, **kwargs):
98
93
"""This is the decorated function."""
94
from bzrlib import trace
100
95
trace.mutter_callsite(4, "Deprecated function called")
101
96
warn(deprecation_string(callable, deprecation_version),
102
DeprecationWarning, stacklevel=2)
97
DeprecationWarning, stacklevel=2)
103
98
return callable(*args, **kwargs)
104
99
_populate_decorated(callable, deprecation_version, "function",
105
100
decorated_function)
125
120
def decorated_method(self, *args, **kwargs):
126
121
"""This is the decorated method."""
122
from bzrlib import trace
128
123
if callable.__name__ == '__init__':
129
124
symbol = "%s.%s" % (self.__class__.__module__,
130
125
self.__class__.__name__,
135
130
callable.__name__
137
132
trace.mutter_callsite(4, "Deprecated method called")
138
warn(deprecation_version %
139
symbol, DeprecationWarning, stacklevel=2)
133
warn(deprecation_version % symbol, DeprecationWarning, stacklevel=2)
140
134
return callable(self, *args, **kwargs)
141
135
_populate_decorated(callable, deprecation_version, "method",
142
136
decorated_method)
160
154
# def __init__(self, bad, other)
161
155
# def __init__(self, **kwargs)
163
return parameter_value is not DEPRECATED_PARAMETER
157
return not parameter_value is DEPRECATED_PARAMETER
166
160
def _decorate_docstring(callable, deprecation_version, label,
172
166
if len(docstring_lines) == 0:
173
167
decorated_callable.__doc__ = deprecation_version % ("This " + label)
174
168
elif len(docstring_lines) == 1:
175
decorated_callable.__doc__ = (
176
callable.__doc__ + "\n" + "\n" +
177
deprecation_version % ("This " + label) + "\n")
169
decorated_callable.__doc__ = (callable.__doc__
172
+ deprecation_version % ("This " + label)
179
175
spaces = len(docstring_lines[-1])
180
176
new_doc = callable.__doc__
300
296
:param error_only: Only match an 'error' filter
301
297
:return: True if a filter is found, False otherwise
303
300
for filter in warnings.filters:
304
301
if issubclass(DeprecationWarning, filter[2]):
305
302
# This filter will effect DeprecationWarning
311
def _remove_filter_callable(filter):
312
"""Build and returns a callable removing filter from the warnings.
314
:param filter: The filter to remove (can be None).
316
:return: A callable that will remove filter from warnings.filters.
321
warnings.filters.remove(filter)
322
except (ValueError, IndexError):
327
308
def suppress_deprecation_warnings(override=True):
328
309
"""Call this function to suppress all deprecation warnings.
334
315
:param override: If True, always set the ignore, if False, only set the
335
316
ignore if there isn't already a filter.
337
:return: A callable to remove the new warnings this added.
339
319
if not override and _check_for_filter(error_only=False):
340
320
# If there is already a filter effecting suppress_deprecation_warnings,
344
warnings.filterwarnings('ignore', category=DeprecationWarning)
345
filter = warnings.filters[0]
346
return _remove_filter_callable(filter)
323
warnings.filterwarnings('ignore', category=DeprecationWarning)
349
326
def activate_deprecation_warnings(override=True):
360
337
:param override: If False, only add a filter if there isn't an error filter
361
338
already. (This slightly differs from suppress_deprecation_warnings, in
362
339
because it always overrides everything but -Werror).
364
:return: A callable to remove the new warnings this added.
366
342
if not override and _check_for_filter(error_only=True):
367
343
# DeprecationWarnings are already turned into errors, don't downgrade
368
344
# them to 'default'.
371
warnings.filterwarnings('default', category=DeprecationWarning)
372
filter = warnings.filters[0]
373
return _remove_filter_callable(filter)
346
warnings.filterwarnings('default', category=DeprecationWarning)