| 122 | return s |
| 123 | |
| 124 | class ModuleFinder: |
| 125 | |
| 126 | def __init__(self, path=None, debug=0, excludes=None, replace_paths=None): |
| 127 | if path is None: |
| 128 | path = sys.path |
| 129 | self.path = path |
| 130 | self.modules = {} |
| 131 | self.badmodules = {} |
| 132 | self.debug = debug |
| 133 | self.indent = 0 |
| 134 | self.excludes = excludes if excludes is not None else [] |
| 135 | self.replace_paths = replace_paths if replace_paths is not None else [] |
| 136 | self.processed_paths = [] # Used in debugging only |
| 137 | |
| 138 | def msg(self, level, str, *args): |
| 139 | if level <= self.debug: |
| 140 | for i in range(self.indent): |
| 141 | print(" ", end=' ') |
| 142 | print(str, end=' ') |
| 143 | for arg in args: |
| 144 | print(repr(arg), end=' ') |
| 145 | print() |
| 146 | |
| 147 | def msgin(self, *args): |
| 148 | level = args[0] |
| 149 | if level <= self.debug: |
| 150 | self.indent = self.indent + 1 |
| 151 | self.msg(*args) |
| 152 | |
| 153 | def msgout(self, *args): |
| 154 | level = args[0] |
| 155 | if level <= self.debug: |
| 156 | self.indent = self.indent - 1 |
| 157 | self.msg(*args) |
| 158 | |
| 159 | def run_script(self, pathname): |
| 160 | self.msg(2, "run_script", pathname) |
| 161 | with io.open_code(pathname) as fp: |
| 162 | stuff = ("", "rb", _PY_SOURCE) |
| 163 | self.load_module('__main__', fp, pathname, stuff) |
| 164 | |
| 165 | def load_file(self, pathname): |
| 166 | dir, name = os.path.split(pathname) |
| 167 | name, ext = os.path.splitext(name) |
| 168 | with io.open_code(pathname) as fp: |
| 169 | stuff = (ext, "rb", _PY_SOURCE) |
| 170 | self.load_module(name, fp, pathname, stuff) |
| 171 | |
| 172 | def import_hook(self, name, caller=None, fromlist=None, level=-1): |
| 173 | self.msg(3, "import_hook", name, caller, fromlist, level) |
| 174 | parent = self.determine_parent(caller, level=level) |
| 175 | q, tail = self.find_head_package(parent, name) |
| 176 | m = self.load_tail(q, tail) |
| 177 | if not fromlist: |
| 178 | return q |
| 179 | if m.__path__: |
| 180 | self.ensure_fromlist(m, fromlist) |
| 181 | return None |
no outgoing calls
no test coverage detected
searching dependent graphs…