~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/symbol_versioning.py

merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
"""
22
22
 
23
23
__all__ = ['deprecated_function',
 
24
           'deprecated_list',
24
25
           'deprecated_method',
25
26
           'DEPRECATED_PARAMETER',
26
27
           'deprecated_passed',
27
28
           'warn', 'set_warning_method', 'zero_seven',
28
29
           'zero_eight',
29
30
           'zero_nine',
 
31
           'zero_ten',
30
32
           ]
31
33
 
32
34
from warnings import warn
36
38
zero_seven = "%s was deprecated in version 0.7."
37
39
zero_eight = "%s was deprecated in version 0.8."
38
40
zero_nine = "%s was deprecated in version 0.9."
 
41
zero_ten = "%s was deprecated in version 0.10."
39
42
 
40
43
 
41
44
def set_warning_method(method):
145
148
    decorated_callable.__module__ = callable.__module__
146
149
    decorated_callable.__name__ = callable.__name__
147
150
    decorated_callable.is_deprecated = True
 
151
 
 
152
 
 
153
def deprecated_list(deprecation_version, variable_name,
 
154
                    initial_value, extra=None):
 
155
    """Create a list that warns when modified
 
156
 
 
157
    :param deprecation_version: something like zero_nine
 
158
    :param initial_value: The contents of the list
 
159
    :param variable_name: This allows better warnings to be printed
 
160
    :param extra: Extra info to print when printing a warning
 
161
    """
 
162
 
 
163
    subst_text = 'Modifying %s' % (variable_name,)
 
164
    msg = deprecation_version % (subst_text,)
 
165
    if extra:
 
166
        msg += ' ' + extra
 
167
 
 
168
    class _DeprecatedList(list):
 
169
        __doc__ = list.__doc__ + msg
 
170
 
 
171
        is_deprecated = True
 
172
 
 
173
        def _warn_deprecated(self, func, *args, **kwargs):
 
174
            warn(msg, DeprecationWarning, stacklevel=3)
 
175
            return func(self, *args, **kwargs)
 
176
            
 
177
        def append(self, obj):
 
178
            """appending to %s is deprecated""" % (variable_name,)
 
179
            return self._warn_deprecated(list.append, obj)
 
180
 
 
181
        def insert(self, index, obj):
 
182
            """inserting to %s is deprecated""" % (variable_name,)
 
183
            return self._warn_deprecated(list.insert, index, obj)
 
184
 
 
185
        def extend(self, iterable):
 
186
            """extending %s is deprecated""" % (variable_name,)
 
187
            return self._warn_deprecated(list.extend, iterable)
 
188
 
 
189
        def remove(self, value):
 
190
            """removing from %s is deprecated""" % (variable_name,)
 
191
            return self._warn_deprecated(list.remove, value)
 
192
 
 
193
        def pop(self, index=None):
 
194
            """pop'ing from from %s is deprecated""" % (variable_name,)
 
195
            if index:
 
196
                return self._warn_deprecated(list.pop, index)
 
197
            else:
 
198
                # Can't pass None
 
199
                return self._warn_deprecated(list.pop)
 
200
 
 
201
    return _DeprecatedList(initial_value)