1
2
3
4
5
6
7
8 """Support code for dealing with registries.
9
10 Functions:
11 find_submodules Find all the modules in a package.
12 load_module Load a module and return it. Raise ImportError if not found.
13 safe_load_module Like load_module, but returns None if not found.
14
15 make_rate_limited_function Limit the rate at which a function can run.
16
17 make_cached_expression Caches the make_parser method of expressions.
18
19 """
20 import sys
21 import os
22 import time
23
24 from Bio.WWW import RequestLimiter
25
27 """find_submodules(modulename) -> list of module names
28
29 Look inside a package or module and recursively find all the
30 modules that exist within it.
31
32 """
33
34 module = safe_load_module(modulename)
35 if not module:
36 return []
37 filename = module.__file__
38
39
40
41 if not filename.endswith("__init__.py") and \
42 not filename.endswith("__init__.pyc") and \
43 not filename.endswith("__init__.pyo"):
44 return [modulename]
45
46
47
48 dirname = os.path.dirname(filename)
49 submodulenames = {}
50 for filename in os.listdir(dirname):
51 filename = os.path.splitext(filename)[0]
52 if filename == '__init__':
53 continue
54 elif not filename:
55 continue
56 name = "%s.%s" % (modulename, filename)
57 submodulenames[name] = 1
58 submodulenames = submodulenames.keys()
59 submodulenames.sort()
60
61 submodules = []
62 for name in submodulenames:
63 try:
64 x = find_submodules(name)
65 except ImportError, x:
66 raise
67 pass
68 else:
69 submodules.extend(x)
70
71 return submodules
72
74 """load_module(modulename) -> module"""
75 try:
76 module = __import__(modulename, {}, {}, modulename.split(".")[:-1])
77 except SyntaxError, exc:
78 raise
79 except ImportError, exc:
80 raise ImportError("%s during import of %r" % (exc, modulename)), \
81 None, sys.exc_info()[2]
82 return module
83
85 """safe_load_module(modulename) -> module or None"""
86 try:
87 module = load_module(modulename)
88 except ImportError, x:
89 if str(x).find("during import of") == -1:
90 raise
91 module = None
92 return module
93
95 """make_rate_limited_function(function, delay) -> callable object
96
97 Create a version of function that does not run more often than
98 once every delay seconds.
99
100 """
105 self.limiter.wait()
106 return self.fn(*args, **keywds)
107
108
109
111 """make_cached_expression(expression) -> cached expression object"""
113 self.expression = expression
114 self._parsers = {}
116 if self._parsers.get(debug_level) is None:
117 parser = self.expression.make_parser(debug_level=debug_level)
118 self._parsers[debug_level] = parser
119 return self._parsers[debug_level].copy()
120