Package Bio :: Package config :: Module _support
[hide private]
[frames] | no frames]

Source Code for Module Bio.config._support

  1  # Copyright 2002 by Jeffrey Chang, Andrew Dalke.  All rights reserved. 
  2  # This code is part of the Biopython distribution and governed by its 
  3  # license.  Please see the LICENSE file that should have been included 
  4  # as part of this package. 
  5   
  6  # This is based on some older code by Andrew Dalke. 
  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   
26 -def find_submodules(modulename):
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 # First, figure out where this module exists in the file system. 34 module = safe_load_module(modulename) 35 if not module: # This is not a valid python module or package. 36 return [] 37 filename = module.__file__ 38 39 # If this is an actual module (rather than a package), then 40 # there's no more submodules and we're done. 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 # Since it's a package, get a list of all the modules inside it 47 # and recurse on those. 48 dirname = os.path.dirname(filename) 49 submodulenames = {} # prevent duplicates 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 # ignore things that aren't valid modules (e.g. CVS) 68 else: 69 submodules.extend(x) 70 71 return submodules
72
73 -def load_module(modulename):
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
84 -def safe_load_module(modulename):
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
94 -class make_rate_limited_function:
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 """
101 - def __init__(self, function, delay):
102 self.fn = function 103 self.limiter = RequestLimiter(delay)
104 - def __call__(self, *args, **keywds):
105 self.limiter.wait() 106 return self.fn(*args, **keywds)
107 108 109 # Only caches parsers for make_parser, not iterators
110 -class make_cached_expression:
111 """make_cached_expression(expression) -> cached expression object"""
112 - def __init__(self, expression):
113 self.expression = expression 114 self._parsers = {} # debug_level -> parser
115 - def make_parser(self, debug_level=0):
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