Mercurial > pygame
annotate trackmod/module.py @ 3182:0c07af110477 docs-changes
Ignore Sphinx-generated files
| author | Thomas Kluyver <takowl@gmail.com> |
|---|---|
| date | Wed, 09 Jan 2013 22:35:43 +0000 |
| parents | 91a0d35ada2e |
| children |
| rev | line source |
|---|---|
|
1378
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
1 # module trackmod.module |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
2 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
3 """Implements a module usage tracker module type""" |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
4 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
5 import threading |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
6 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
7 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
8 ModuleType = type(threading) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
9 getattribute = ModuleType.__getattribute__ |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
10 accesses = set() |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
11 accesses_lock = threading.RLock() |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
12 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
13 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
14 class Module(ModuleType): |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
15 # A heap subtype of the module type. |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
16 # |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
17 # Allows __class__ to be changed. Otherwise it is just the same. |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
18 # To preserve the module docs this description is a comment. |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
19 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
20 pass |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
21 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
22 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
23 class TrackerModule(ModuleType): |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
24 # A heap subtype of the module type that tracks attribute gets. |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
25 # |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
26 # Allows __class__ to be changed. Otherwise it is just the same. |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
27 # To preserve the module docs this description is a comment. |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
28 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
29 # Attributes to ignore in reporting. The module name is the one |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
30 # attribute guarenteed to not be recorded. The class is used by |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
31 # the reporter. The path is just noise. |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
32 ignored_attributes = set(['__name__', '__class__', '__path__']) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
33 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
34 def __getattribute__(self, attr): |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
35 if attr in TrackerModule.ignored_attributes: |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
36 return getattribute(self, attr) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
37 report(self, attr) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
38 return getattribute(self, attr) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
39 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
40 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
41 def report_continuous(module, attr): |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
42 accesses_lock.acquire() |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
43 try: |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
44 # Safe: no recursive call on __name__ attribute. |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
45 accesses.add((module.__name__, attr)) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
46 finally: |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
47 accesses_lock.release() |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
48 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
49 def report_quit(module, attr): |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
50 module.__class__ = Module |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
51 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
52 def report_oneshot(module, attr): |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
53 report_continuous(module, attr) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
54 report_quit(module, attr) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
55 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
56 report = report_oneshot |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
57 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
58 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
59 def set_report_mode(mode=None): |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
60 """Set whether access checking is oneshot or continuous |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
61 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
62 if mode (default 'oneshot') is 'oneshot' or None then a TrackerModule |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
63 module will stop recording attribute accesses after the first non-trivial |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
64 access. If 'continuous' then all attribute accesses are recorded. If |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
65 'quit' then access recording stops and further calls to this function |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
66 have no effect. |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
67 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
68 """ |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
69 global report |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
70 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
71 if report is report_quit: |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
72 return |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
73 if mode is None: |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
74 mode = 'oneshot' |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
75 if mode == 'oneshot': |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
76 report = report_oneshot |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
77 elif mode == 'continuous': |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
78 report = report_continuous |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
79 elif mode == 'quit': |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
80 report = report_quit |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
81 else: |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
82 raise ValueError("Unknown mode %s" % mode) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
83 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
84 |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
85 def get_accesses(): |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
86 accesses_lock.acquire() |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
87 try: |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
88 return sorted(accesses) |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
89 finally: |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
90 accesses_lock.release() |
|
91a0d35ada2e
Add program to list Pygame modules accessed by a unit test module
Lenard Lindstrom <len-l@telus.net>
parents:
diff
changeset
|
91 |
