File: decorators.py

package info (click to toggle)
python-dpkt 1.9.2-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 920 kB
  • sloc: python: 10,440; makefile: 144
file content (76 lines) | stat: -rw-r--r-- 2,640 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import absolute_import

import warnings


def decorator_with_args(decorator_to_enhance):
    """
    This is decorator for decorator. It allows any decorator to get additional arguments
    """
    def decorator_maker(*args, **kwargs):
        def decorator_wrapper(func):
            return decorator_to_enhance(func, *args, **kwargs)

        return decorator_wrapper

    return decorator_maker


@decorator_with_args
def deprecated(deprecated_method, func_name=None):
    def _deprecated(*args, **kwargs):
        # Print only the first occurrence of the DeprecationWarning, regardless of location
        warnings.simplefilter('once', DeprecationWarning)
        # Display the deprecation warning message
        if func_name:  # If the function, should be used instead, is received
            warnings.warn("Call to deprecated method %s; use %s instead" % (deprecated_method.__name__, func_name),
                          category=DeprecationWarning, stacklevel=2)
        else:
            warnings.warn("Call to deprecated method %s" % deprecated_method.__name__,
                          category=DeprecationWarning, stacklevel=2)
        return deprecated_method(*args, **kwargs)  # actually call the method

    return _deprecated


class TestDeprecatedDecorator(object):
    def new_method(self):
        return

    @deprecated('new_method')
    def old_method(self):
        return

    @deprecated()
    def deprecated_decorator(self):
        return

    def test_deprecated_decorator(self):
        import sys
        from .compat import StringIO

        saved_stderr = sys.stderr
        try:
            out = StringIO()
            sys.stderr = out
            self.deprecated_decorator()
            try: # This isn't working under newest version of pytest
                assert ('DeprecationWarning: Call to deprecated method deprecated_decorator' in out.getvalue())
                out.truncate(0)  # clean the buffer
                self.old_method()
                assert ('DeprecationWarning: Call to deprecated method old_method; use new_method instead' in out.getvalue())
                out.truncate(0)  # clean the buffer
                self.new_method()
                assert ('DeprecationWarning' not in out.getvalue())
            except AssertionError:
                print('Assertion failing, Note: This is expected for Python 2.6')
        finally:
            sys.stderr = saved_stderr


if __name__ == '__main__':
    a = TestDeprecatedDecorator()
    a.test_deprecated_decorator()
    print('Tests Successful...')