summaryrefslogtreecommitdiffstats
path: root/external_libs/python/dpkt-1.8.6.2/dpkt/decorators.py
diff options
context:
space:
mode:
Diffstat (limited to 'external_libs/python/dpkt-1.8.6.2/dpkt/decorators.py')
-rw-r--r--external_libs/python/dpkt-1.8.6.2/dpkt/decorators.py91
1 files changed, 91 insertions, 0 deletions
diff --git a/external_libs/python/dpkt-1.8.6.2/dpkt/decorators.py b/external_libs/python/dpkt-1.8.6.2/dpkt/decorators.py
new file mode 100644
index 00000000..08f78161
--- /dev/null
+++ b/external_libs/python/dpkt-1.8.6.2/dpkt/decorators.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+import warnings
+from timeit import Timer
+from test import pystone
+from time import sleep
+
+
+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
+
+
+def deprecated(deprecated_method):
+ def _deprecated(*args, **kwargs):
+ # Print only the first occurrence of the DeprecationWarning, regardless of location
+ warnings.simplefilter('once', DeprecationWarning)
+ # Display the deprecation warning message
+ 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
+
+
+@decorator_with_args
+def duration(function, repeat=10000):
+ def _duration(*args, **kwargs):
+ time = 0
+ try:
+ time = Timer(lambda: function(*args, **kwargs)).timeit(repeat)
+ finally:
+ benchtime, pystones = pystone.pystones()
+ kstones = (pystones * time) / 1000
+ print '%s : time = %f kstones = %f' % (function.__name__, time, kstones)
+ return function(*args, **kwargs)
+
+ return _duration
+
+
+class TestDeprecatedDecorator(object):
+ @deprecated
+ def deprecated_decorator(self):
+ return
+
+ def test_deprecated_decorator(self):
+ import sys
+ from StringIO import StringIO
+
+ saved_stderr = sys.stderr
+ try:
+ out = StringIO()
+ sys.stderr = out
+ self.deprecated_decorator()
+ assert ('DeprecationWarning: Call to deprecated method deprecated_decorator' in out.getvalue())
+ # 'in' because message contains the filename, line, etc
+ finally:
+ sys.stderr = saved_stderr
+
+
+class TestDurationDecorator(object):
+ @duration(1)
+ def duration_decorator(self):
+ sleep(0.05)
+ return
+
+ def test_duration_decorator(self):
+ import sys
+ import re
+ from StringIO import StringIO
+
+ saved_stdout = sys.stdout
+ try:
+ out = StringIO()
+ sys.stdout = out
+ self.duration_decorator()
+ assert (re.match('((.+?[0-9]+\.[0-9]+)\s?){2}', out.getvalue()))
+ finally:
+ sys.stdout = saved_stdout
+
+if __name__ == '__main__':
+ a = TestDeprecatedDecorator()
+ a.test_deprecated_decorator()
+ a = TestDurationDecorator()
+ a.test_duration_decorator()
+ print 'Tests Successful...' \ No newline at end of file