1
|
|
|
from sacred.stflow.internal import ContextMethodDecorator |
2
|
|
|
|
3
|
|
|
|
4
|
|
|
def test_context_method_decorator(): |
5
|
|
|
" Ensure that ContextMethodDecorator can intercept method calls " |
6
|
|
|
class FooClass(): |
7
|
|
|
def __init__(self, x): |
8
|
|
|
self.x = x |
9
|
|
|
|
10
|
|
|
def do_foo(self, y, z): |
11
|
|
|
print("foo") |
12
|
|
|
print(y) |
13
|
|
|
print(z) |
14
|
|
|
return y * self.x + z |
15
|
|
|
|
16
|
|
|
def decorate_three_times(instance, original_method, original_args, |
17
|
|
|
original_kwargs): |
18
|
|
|
print("three_times") |
19
|
|
|
print(original_args) |
20
|
|
|
print(original_kwargs) |
21
|
|
|
return original_method(instance, *original_args, **original_kwargs) * 3 |
22
|
|
|
|
23
|
|
|
with ContextMethodDecorator(FooClass, "do_foo", decorate_three_times): |
24
|
|
|
foo = FooClass(10) |
25
|
|
|
assert foo.do_foo(5, 6) == (5 * 10 + 6) * 3 |
26
|
|
|
assert foo.do_foo(5, z=6) == (5 * 10 + 6) * 3 |
27
|
|
|
assert foo.do_foo(y=5, z=6) == (5 * 10 + 6) * 3 |
28
|
|
|
assert foo.do_foo(5, 6) == (5 * 10 + 6) |
29
|
|
|
assert foo.do_foo(5, z=6) == (5 * 10 + 6) |
30
|
|
|
assert foo.do_foo(y=5, z=6) == (5 * 10 + 6) |
31
|
|
|
|
32
|
|
|
def decorate_three_times_with_exception(instance, original_method, |
33
|
|
|
original_args, original_kwargs): |
34
|
|
|
raise RuntimeError("This should be caught") |
35
|
|
|
|
36
|
|
|
exception = False |
37
|
|
|
try: |
38
|
|
|
with ContextMethodDecorator(FooClass, "do_foo", |
39
|
|
|
decorate_three_times_with_exception): |
40
|
|
|
foo = FooClass(10) |
41
|
|
|
this_should_raise_exception = foo.do_foo(5, 6) |
42
|
|
|
except RuntimeError: |
43
|
|
|
exception = True |
44
|
|
|
assert foo.do_foo(5, 6) == (5 * 10 + 6) |
45
|
|
|
assert exception is True |
46
|
|
|
|