grumpyhome / grumpy

Grumpy is a Python to Go source code transcompiler and runtime.
Apache License 2.0
420 stars 18 forks source link

Wrong exception AttributeError on `from foo import wrongmember` #109

Closed alanjds closed 5 years ago

alanjds commented 5 years ago

Conditional import code relies on ImportError being raised when the module have not the requested member, not AttributeError.

$ python -c 'from time import wrongmember'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: cannot import name wrongmember
$ grumpy -c 'from time import wrongmember'
Traceback (most recent call last):
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/__main__.py", line 1, in <module>
AttributeError: 'module' object has no attribute 'wrongmember'
exit status 1

And import wrongmodule fails on compile time, instead of raising an ImportError on run time:

$ python -c 'import inexistantmodule'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named inexistantmodule
$ grumpy -c 'import inexistantmodule'
Traceback (most recent call last):
  File "/Users/alanjds/.virtualenvs/gpy27/bin/grumpy", line 11, in <module>
    load_entry_point('grumpy-tools', 'console_scripts', 'grumpy')()
  File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 716, in __call__
    return self.main(*args, **kwargs)
  File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 696, in main
    rv = self.invoke(ctx)
  File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 1060, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 889, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/alanjds/.virtualenvs/gpy27/lib/python2.7/site-packages/click/core.py", line 534, in invoke
    return callback(*args, **kwargs)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/cli.py", line 84, in run
    result = grumprun.main(stream=stream, modname=modname, pep3147=pep3147, clean_tempfolder=(not keep_main))
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/grumprun.py", line 114, in main
    transpiled = grumpc.main(stream, modname=modname, pep3147=True, recursive=True)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/grumpc.py", line 153, in main
    deps, import_objects = _collect_deps(script, modname, pep3147_folders, from_cache=(not will_refresh))
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/grumpc.py", line 83, in _collect_deps
    with_imports=True,
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/pydeps.py", line 35, in main
    imports = imputil.collect_imports(modname, script, gopath, package_dir=package_dir)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/compiler/imputil.py", line 213, in collect_imports
    collector.visit(mod)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 41, in visit
    return self._visit_one(obj)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 34, in _visit_one
    return self.generic_visit(node)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 27, in generic_visit
    self.visit(getattr(node, field_name))
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 39, in visit
    return [self.visit(elt) for elt in obj]
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 41, in visit
    return self._visit_one(obj)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 32, in _visit_one
    return getattr(self, visit_attr)(node)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/compiler/imputil.py", line 195, in visit_Import
    self.imports.extend(self.importer.visit(node))
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 41, in visit
    return self._visit_one(obj)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/vendor/pythonparser/algorithm.py", line 32, in _visit_one
    return getattr(self, visit_attr)(node)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/compiler/imputil.py", line 101, in visit_Import
    imp = self._resolve_import(node, alias.name)
  File "/Users/alanjds/src/git/grumpy/grumpy-tools-src/grumpy_tools/compiler/imputil.py", line 167, in _resolve_import
    raise util.ImportError(node, 'no such module: {} (script: {})'.format(modname, self.script))
grumpy_tools.compiler.util.ImportError: line 1: no such module: inexistantmodule (script: /var/folders/50/nxn5kg1125g6mfml3sm2qgvh0000gn/T/tmpnvX_oz__pycache__/__main__.py)