Skip to content

Commit f15f53b

Browse files
committed
-
1 parent dbfbae9 commit f15f53b

File tree

2 files changed

+86
-4
lines changed

2 files changed

+86
-4
lines changed

source_py3/python_toolbox/context_management/functions.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,15 +196,14 @@ class _IdempotentContextManager(_ContextManagerWrapper):
196196

197197
def __enter__(self):
198198
if not self._entered:
199-
self._enter_value = self.__wrapped__.__enter__()
199+
self._enter_value = self._wrapped_enter()
200200
self._entered = True
201201
return self._enter_value
202202

203203

204204
def __exit__(self, exc_type=None, exc_value=None, exc_traceback=None):
205205
if self._entered:
206-
exit_value = self.__wrapped__.__exit__(exc_type, exc_value,
207-
exc_traceback)
206+
exit_value = self._wrapped_exit(exc_type, exc_value, exc_traceback)
208207
self._entered = False
209208
self._enter_value = None
210209
return exit_value

source_py3/test_python_toolbox/test_context_management/test_as_idempotent.py

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
import queue as queue_module
55

6-
from python_toolbox.context_management import as_idempotent, ContextManager
6+
from python_toolbox.context_management import (as_idempotent, ContextManager,
7+
ContextManagerType)
78
from python_toolbox import cute_testing
89

910

@@ -88,4 +89,86 @@ def test_as_idempotent():
8889

8990
with idempotent_context_manager:
9091
raise ZeroDivisionError
92+
93+
94+
def test_decorator_class():
95+
96+
@as_idempotent
97+
class Meow(ContextManager):
98+
n = 0
99+
100+
def manage_context(self):
101+
self.n += 1
102+
try:
103+
yield
104+
finally:
105+
self.n -= 1
106+
107+
108+
meow = Meow()
109+
assert meow.n == 0
110+
with meow:
111+
assert meow.n == 1
112+
with meow:
113+
assert meow.n == 1
114+
with meow:
115+
assert meow.n == 1
116+
assert meow.n == 0
117+
assert meow.n == 0
118+
assert meow.n == 0
119+
120+
def test_decorator_class_enter_exit():
121+
122+
@as_idempotent
123+
class Meow(ContextManager):
124+
n = 0
125+
126+
def __enter__(self):
127+
self.n += 1
128+
return self
129+
130+
def __exit__(self, exc_type, exc_value, exc_traceback):
131+
self.n -= 1
132+
133+
134+
meow = Meow()
135+
assert meow.n == 0
136+
with meow:
137+
assert meow.n == 1
138+
with meow:
139+
assert meow.n == 1
140+
with meow:
141+
assert meow.n == 1
142+
assert meow.n == 0
143+
assert meow.n == 0
144+
assert meow.n == 0
145+
146+
147+
def test_decorator_decorator():
148+
149+
counter = {'n': 0,}
150+
151+
@as_idempotent
152+
@ContextManagerType
153+
def Meow():
154+
counter['n'] += 1
155+
try:
156+
yield
157+
finally:
158+
counter['n'] -= 1
159+
160+
161+
meow = Meow()
162+
assert counter['n'] == 0
163+
with meow:
164+
assert counter['n'] == 1
165+
with meow:
166+
assert counter['n'] == 1
167+
with meow:
168+
assert counter['n'] == 1
169+
assert counter['n'] == 0
170+
assert counter['n'] == 0
171+
assert counter['n'] == 0
172+
173+
91174

0 commit comments

Comments
 (0)