Show More
@@ -186,6 +186,23 b' class NoBoolCall:' | |||||
186 | raise NotImplementedError('Must be implemented') |
|
186 | raise NotImplementedError('Must be implemented') | |
187 |
|
187 | |||
188 |
|
188 | |||
|
189 | class SerialLiar(object): | |||
|
190 | """Attribute accesses always get another copy of the same class. | |||
|
191 | ||||
|
192 | unittest.mock.call does something similar, but it's not ideal for testing | |||
|
193 | as the failure mode is to eat all your RAM. This gives up after 10k levels. | |||
|
194 | """ | |||
|
195 | def __init__(self, max_fibbing_twig, lies_told=0): | |||
|
196 | if lies_told > 10000: | |||
|
197 | raise RuntimeError('Nose too long, honesty is the best policy') | |||
|
198 | self.max_fibbing_twig = max_fibbing_twig | |||
|
199 | self.lies_told = lies_told | |||
|
200 | max_fibbing_twig[0] = max(max_fibbing_twig[0], lies_told) | |||
|
201 | ||||
|
202 | def __getattr__(self, item): | |||
|
203 | return SerialLiar(self.max_fibbing_twig, self.lies_told + 1) | |||
|
204 | ||||
|
205 | ||||
189 | def check_calltip(obj, name, call, docstring): |
|
206 | def check_calltip(obj, name, call, docstring): | |
190 | """Generic check pattern all calltip tests will use""" |
|
207 | """Generic check pattern all calltip tests will use""" | |
191 | info = inspector.info(obj, name) |
|
208 | info = inspector.info(obj, name) | |
@@ -297,6 +314,14 b' def test_info_awkward():' | |||||
297 | def test_bool_raise(): |
|
314 | def test_bool_raise(): | |
298 | inspector.info(NoBoolCall()) |
|
315 | inspector.info(NoBoolCall()) | |
299 |
|
316 | |||
|
317 | def test_info_serialliar(): | |||
|
318 | fib_tracker = [0] | |||
|
319 | i = inspector.info(SerialLiar(fib_tracker)) | |||
|
320 | ||||
|
321 | # Nested attribute access should be cut off at 100 levels deep to avoid | |||
|
322 | # infinite loops: https://github.com/ipython/ipython/issues/9122 | |||
|
323 | nt.assert_less(fib_tracker[0], 9000) | |||
|
324 | ||||
300 | def test_calldef_none(): |
|
325 | def test_calldef_none(): | |
301 | # We should ignore __call__ for all of these. |
|
326 | # We should ignore __call__ for all of these. | |
302 | for obj in [f, SimpleClass().method, any, str.upper]: |
|
327 | for obj in [f, SimpleClass().method, any, str.upper]: |
General Comments 0
You need to be logged in to leave comments.
Login now