File tree Expand file tree Collapse file tree 2 files changed +86
-4
lines changed
python_toolbox/context_management
test_python_toolbox/test_context_management Expand file tree Collapse file tree 2 files changed +86
-4
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change 33
44import 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 )
78from 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
You can’t perform that action at this time.
0 commit comments