diff options
Diffstat (limited to 'catapult/telemetry/third_party/modulegraph/modulegraph/util.py')
-rw-r--r-- | catapult/telemetry/third_party/modulegraph/modulegraph/util.py | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/catapult/telemetry/third_party/modulegraph/modulegraph/util.py b/catapult/telemetry/third_party/modulegraph/modulegraph/util.py new file mode 100644 index 00000000..acf6bc13 --- /dev/null +++ b/catapult/telemetry/third_party/modulegraph/modulegraph/util.py @@ -0,0 +1,119 @@ +from __future__ import absolute_import + +import os +import imp +import sys +import re +import marshal +import warnings + +try: + unicode +except NameError: + unicode = str + + +if sys.version_info[0] == 2: + from StringIO import StringIO as BytesIO + from StringIO import StringIO + +else: + from io import BytesIO, StringIO + + + +def imp_find_module(name, path=None): + """ + same as imp.find_module, but handles dotted names + """ + names = name.split('.') + if path is not None: + if isinstance(path, (str, unicode)): + path = [os.path.realpath(path)] + for name in names: + result = imp.find_module(name, path) + if result[0] is not None: + result[0].close() + path = [result[1]] + return result + +def _check_importer_for_path(name, path_item): + try: + importer = sys.path_importer_cache[path_item] + except KeyError: + for path_hook in sys.path_hooks: + try: + importer = path_hook(path_item) + break + except ImportError: + pass + else: + importer = None + sys.path_importer_cache.setdefault(path_item, importer) + + + if importer is None: + try: + return imp.find_module(name, [path_item]) + except ImportError: + return None + return importer.find_module(name) + +def imp_walk(name): + """ + yields namepart, tuple_or_importer for each path item + + raise ImportError if a name can not be found. + """ + warnings.warn("imp_walk will be removed in a future version", DeprecationWarning) + + if name in sys.builtin_module_names: + yield name, (None, None, ("", "", imp.C_BUILTIN)) + return + paths = sys.path + res = None + for namepart in name.split('.'): + for path_item in paths: + res = _check_importer_for_path(namepart, path_item) + if hasattr(res, 'load_module'): + if res.path.endswith('.py') or res.path.endswith('.pyw'): + fp = StringIO(res.get_source(namepart)) + res = (fp, res.path, ('.py', 'rU', imp.PY_SOURCE)) + elif res.path.endswith('.pyc') or res.path.endswith('.pyo'): + co = res.get_code(namepart) + fp = BytesIO(imp.get_magic() + b'\0\0\0\0' + marshal.dumps(co)) + res = (fp, res.path, ('.pyc', 'rb', imp.PY_COMPILED)) + + else: + res = (None, loader.path, (os.path.splitext(loader.path)[-1], 'rb', imp.C_EXTENSION)) + + break + elif isinstance(res, tuple): + break + else: + break + + yield namepart, res + paths = [os.path.join(path_item, namepart)] + else: + return + + raise ImportError('No module named %s' % (name,)) + + +cookie_re = re.compile(b"coding[:=]\s*([-\w.]+)") +if sys.version_info[0] == 2: + default_encoding = 'ascii' +else: + default_encoding = 'utf-8' + +def guess_encoding(fp): + + for i in range(2): + ln = fp.readline() + + m = cookie_re.search(ln) + if m is not None: + return m.group(1).decode('ascii') + + return default_encoding |