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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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