1
# Copyright (C) 2006, 2007 Canonical Ltd
2
# Authors: Robert Collins <robert.collins@canonical.com> and others
1
# Copyright (C) 2006 by Canonical Ltd
2
# Authors: Robert Collins <robert.collins@canonical.com>
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
45
39
zero_eight = "%s was deprecated in version 0.8."
46
40
zero_nine = "%s was deprecated in version 0.9."
47
41
zero_ten = "%s was deprecated in version 0.10."
48
zero_eleven = "%s was deprecated in version 0.11."
49
zero_twelve = "%s was deprecated in version 0.12."
50
zero_thirteen = "%s was deprecated in version 0.13."
51
zero_fourteen = "%s was deprecated in version 0.14."
52
zero_fifteen = "%s was deprecated in version 0.15."
53
zero_sixteen = "%s was deprecated in version 0.16."
56
44
def set_warning_method(method):
67
55
# add that on top of the primitives, once we have all three written
71
def deprecation_string(a_callable, deprecation_version):
72
"""Generate an automatic deprecation string for a_callable.
74
:param a_callable: The callable to substitute into deprecation_version.
75
:param deprecation_version: A deprecation format warning string. This should
76
have a single %s operator in it. a_callable will be turned into a nice
77
python symbol and then substituted into deprecation_version.
79
if getattr(a_callable, 'im_class', None) is None:
80
symbol = "%s.%s" % (a_callable.__module__,
83
symbol = "%s.%s.%s" % (a_callable.im_class.__module__,
84
a_callable.im_class.__name__,
87
return deprecation_version % symbol
90
58
def deprecated_function(deprecation_version):
91
59
"""Decorate a function so that use of it will trigger a warning."""
96
64
def decorated_function(*args, **kwargs):
97
65
"""This is the decorated function."""
98
warn(deprecation_string(callable, deprecation_version),
99
DeprecationWarning, stacklevel=2)
66
symbol = "%s.%s" % (callable.__module__,
69
warn(deprecation_version % symbol, DeprecationWarning, stacklevel=2)
100
70
return callable(*args, **kwargs)
101
71
_populate_decorated(callable, deprecation_version, "function",
102
72
decorated_function)
116
86
def decorated_method(self, *args, **kwargs):
117
87
"""This is the decorated method."""
118
symbol = "%s.%s.%s" % (self.__class__.__module__,
88
symbol = "%s.%s.%s" % (self.__class__.__module__,
119
89
self.__class__.__name__,
180
150
decorated_callable.is_deprecated = True
183
def _dict_deprecation_wrapper(wrapped_method):
184
"""Returns a closure that emits a warning and calls the superclass"""
185
def cb(dep_dict, *args, **kwargs):
186
msg = 'access to %s' % (dep_dict._variable_name, )
187
msg = dep_dict._deprecation_version % (msg,)
189
msg += ' ' + dep_dict._advice
190
warn(msg, DeprecationWarning, stacklevel=2)
191
return wrapped_method(dep_dict, *args, **kwargs)
195
class DeprecatedDict(dict):
196
"""A dictionary that complains when read or written."""
206
"""Create a dict that warns when read or modified.
208
:param deprecation_version: something like zero_nine
209
:param initial_value: The contents of the dict
210
:param variable_name: This allows better warnings to be printed
211
:param advice: String of advice on what callers should do instead
212
of using this variable.
214
self._deprecation_version = deprecation_version
215
self._variable_name = variable_name
216
self._advice = advice
217
dict.__init__(self, initial_value)
219
# This isn't every possible method but it should trap anyone using the
220
# dict -- add more if desired
221
__len__ = _dict_deprecation_wrapper(dict.__len__)
222
__getitem__ = _dict_deprecation_wrapper(dict.__getitem__)
223
__setitem__ = _dict_deprecation_wrapper(dict.__setitem__)
224
__delitem__ = _dict_deprecation_wrapper(dict.__delitem__)
225
keys = _dict_deprecation_wrapper(dict.keys)
226
__contains__ = _dict_deprecation_wrapper(dict.__contains__)
229
153
def deprecated_list(deprecation_version, variable_name,
230
154
initial_value, extra=None):
231
155
"""Create a list that warns when modified