OLD | NEW |
| (Empty) |
1 # -*- test-case-name: twisted.test.test_monkey -*- | |
2 | |
3 # Copyright (c) 2007 Twisted Matrix Laboratories. | |
4 # See LICENSE for details. | |
5 | |
6 | |
7 class MonkeyPatcher(object): | |
8 """ | |
9 Cover up attributes with new objects. Neat for monkey-patching things for | |
10 unit-testing purposes. | |
11 """ | |
12 | |
13 def __init__(self, *patches): | |
14 # List of patches to apply in (obj, name, value). | |
15 self._patchesToApply = [] | |
16 # List of the original values for things that have been patched. | |
17 # (obj, name, value) format. | |
18 self._originals = [] | |
19 for patch in patches: | |
20 self.addPatch(*patch) | |
21 | |
22 | |
23 def addPatch(self, obj, name, value): | |
24 """ | |
25 Add a patch so that the attribute C{name} on C{obj} will be assigned to | |
26 C{value} when C{patch} is called or during C{runWithPatches}. | |
27 | |
28 You can restore the original values with a call to restore(). | |
29 """ | |
30 self._patchesToApply.append((obj, name, value)) | |
31 | |
32 | |
33 def _alreadyPatched(self, obj, name): | |
34 """ | |
35 Has the C{name} attribute of C{obj} already been patched by this | |
36 patcher? | |
37 """ | |
38 for o, n, v in self._originals: | |
39 if (o, n) == (obj, name): | |
40 return True | |
41 return False | |
42 | |
43 | |
44 def patch(self): | |
45 """ | |
46 Apply all of the patches that have been specified with L{addPatch}. | |
47 Reverse this operation using L{restore}. | |
48 """ | |
49 for obj, name, value in self._patchesToApply: | |
50 if not self._alreadyPatched(obj, name): | |
51 self._originals.append((obj, name, getattr(obj, name))) | |
52 setattr(obj, name, value) | |
53 | |
54 | |
55 def restore(self): | |
56 """ | |
57 Restore all original values to any patched objects. | |
58 """ | |
59 while self._originals: | |
60 obj, name, value = self._originals.pop() | |
61 setattr(obj, name, value) | |
62 | |
63 | |
64 def runWithPatches(self, f, *args, **kw): | |
65 """ | |
66 Apply each patch already specified. Then run the function f with the | |
67 given args and kwargs. Restore everything when done. | |
68 """ | |
69 self.patch() | |
70 try: | |
71 return f(*args, **kw) | |
72 finally: | |
73 self.restore() | |
OLD | NEW |