BradenM / micropy-cli

Micropython Project Management Tool with VSCode support, Linting, Intellisense, Dependency Management, and more!
https://micropy-cli.readthedocs.io
MIT License
314 stars 25 forks source link

Nonexisting packages throw error #85

Closed MathijsNL closed 4 years ago

MathijsNL commented 4 years ago

Commit: ae3b811

Steps to reproduce:

micropy init testproject
micropy install nonexistingpackage

This gives some errors, leading back to utils/helpers.py in function: def get_package_meta(name, spec=None):

279 url = f"https://pypi.org/pypi/{name}/json"
280 resp = requests.get(url)

I don't know what the right moment would be to check if the package exists.

Log:

[2019-12-10 12:21:51] INFO: micropy: Installing Packages
[2019-12-10 12:21:51] DEBUG: testproject: Hook Resolved: add_package -> HookProxy(add_package)
[2019-12-10 12:21:51] DEBUG: hookproxy(add_package): add_package proxied to [_hook__add_package__dev_False@<micropy.project.modules.packages.PackagesModule object at 0x00000283D07ABF60>]
[2019-12-10 12:21:51] DEBUG: testproject: adding new dependency: nonexistingpackage
[2019-12-10 12:21:51] DEBUG: <packagedependencysource nonexistingpackage>: Starting new HTTPS connection (1): pypi.org:443
[2019-12-10 12:21:51] DEBUG: <packagedependencysource nonexistingpackage>: https://pypi.org:443 "GET /pypi/nonexistingpackage/json HTTP/1.1" 301 227
[2019-12-10 12:21:52] DEBUG: <packagedependencysource nonexistingpackage>: https://pypi.org:443 "GET /pypi/nonexistingpackage/json/ HTTP/1.1" 404 1839

Traceback:

Traceback (most recent call last):
  File "c:\users\user\appdata\local\programs\python\python37\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\users\user\appdata\local\programs\python\python37\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\Scripts\micropy.exe\__main__.py", line 7, in <module>
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 717, in main
    rv = self.invoke(ctx)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\click\decorators.py", line 64, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\micropy\cli.py", line 168, in install
    project.add_package(pkg, dev=dev)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\micropy\project\modules\modules.py", line 147, in __call__
    return getattr(*proxy)(*args, **kwargs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\micropy\project\modules\modules.py", line 96, in wrapper
    return func(*args, **kwargs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\micropy\project\modules\packages.py", line 136, in add_package
    source = create_dependency_source(package, **kwargs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\micropy\packages\__init__.py", line 43, in create_dependency_source
    return PackageDependencySource(pkg, **kwargs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\micropy\packages\source_package.py", line 30, in __init__
    self._meta: dict = utils.get_package_meta(str(self.package), self.package.pretty_specs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\micropy\utils\helpers.py", line 283, in get_package_meta
    data = resp.json()
  File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\requests\models.py", line 897, in json
    return complexjson.loads(self.text, **kwargs)
  File "c:\users\user\appdata\local\programs\python\python37\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "c:\users\user\appdata\local\programs\python\python37\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "c:\users\user\appdata\local\programs\python\python37\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 7 column 1 (char 6)
BradenM commented 4 years ago

Thanks!

Looks like I forgot to validate the package url. Best move would probably be using utils.is_downloadable in utils.get_package_meta to raise an exception that can be caught and handled in the cli module.