Skip to content

Commit

Permalink
fix(cli): Handle and Report Invalid Package Name Error
Browse files Browse the repository at this point in the history
Fixes #85
  • Loading branch information
BradenM committed Dec 13, 2019
1 parent b8d5ca6 commit d8b2b06
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 30 deletions.
4 changes: 2 additions & 2 deletions micropy/cli.py
Expand Up @@ -167,9 +167,9 @@ def install(mpy, packages, dev=False, path=None):
for pkg in packages:
try:
project.add_package(pkg, dev=dev)
except exc.RequirementNotFound as e:
except exc.RequirementException as e:
pkg_name = str(e.package)
mpy.log.error((f"Could not find {pkg_name}!"
mpy.log.error((f"Failed to install {pkg_name}!"
" Is it available on PyPi?"), exception=e)
raise click.Abort()

Expand Down
4 changes: 2 additions & 2 deletions micropy/packages/source_package.py
Expand Up @@ -33,15 +33,15 @@ def __init__(self, package: Package,
raise RequirementNotFound(
f"{self.source_url} is not a valid url!", package=self.package)
self._meta: dict = utils.get_package_meta(
str(self.package),
self.package.name,
self.source_url,
self.package.pretty_specs
)
self.format_desc = format_desc or (lambda n: n)

@property
def source_url(self) -> str:
_url = self.repo.format(name=str(self.package))
_url = self.repo.format(name=self.package.name)
return _url

@property
Expand Down
3 changes: 2 additions & 1 deletion micropy/utils/helpers.py
Expand Up @@ -259,10 +259,11 @@ def iter_requirements(path):
yield req


def get_package_meta(name, url=, spec=None):
def get_package_meta(name, url, spec=None):
"""Retrieve package metadata from PyPi.
Args:
name (str): Name of package.
url (str): Url to package.
spec (str, optional): Optional version spec.
Defaults to None. If none, returns latest.
Expand Down
2 changes: 2 additions & 0 deletions tests/conftest.py
Expand Up @@ -194,6 +194,8 @@ def mock_pkg(mocker, tmp_path):
tmp_pkg.mkdir()
(tmp_pkg / 'module.py').touch()
(tmp_pkg / 'file.py').touch()
mocker.patch.object(
packages.source_package.utils, 'is_downloadable', return_value=True)
mock_tarbytes = mocker.patch.object(
packages.source_package.utils, 'extract_tarbytes')
mock_meta = mocker.patch.object(
Expand Down
49 changes: 30 additions & 19 deletions tests/test_cli.py
Expand Up @@ -7,6 +7,7 @@
from click.testing import CliRunner

from micropy import cli
from micropy.exceptions import RequirementException


@pytest.fixture
Expand Down Expand Up @@ -154,22 +155,32 @@ def test_cli_stubs_search(mock_mpy, runner):
assert result.exit_code == 0


def test_cli_install(mocker, runner, mock_mpy):
"""should install packages"""
mock_project = mocker.patch.object(cli, 'Project')
mock_proj = mock_project.return_value
mock_mpy.project = mock_proj
# Test Normal
result = runner.invoke(cli.install, ["package", "--dev"])
assert result.exit_code == 0
mock_proj.add_package.assert_called_once_with("package", dev=True)
# Test from requirements
result = runner.invoke(cli.install, "")
assert result.exit_code == 0
mock_proj.add_from_file.return_value = None
result = runner.invoke(cli.install, "")
assert result.exit_code == 1
# Test no project found
mock_mpy.project = None
result = runner.invoke(cli.install, ["package"])
assert result.exit_code == 1
class TestInstall:

@pytest.fixture
def mock_proj(self, mocker, mock_mpy):
mock_project = mocker.patch.object(cli, 'Project')
mock_proj = mock_project.return_value
mock_mpy.project = mock_proj
return mock_proj

def test_normal(self, runner, mock_proj):
result = runner.invoke(cli.install, ["package", "--dev"])
assert result.exit_code == 0
mock_proj.add_package.assert_called_once_with("package", dev=True)

def test_from_requirements(self, runner, mock_proj):
result = runner.invoke(cli.install, "")
assert result.exit_code == 0
mock_proj.add_from_file.return_value = None
result = runner.invoke(cli.install, "")

def test_no_project_found(self, runner):
result = runner.invoke(cli.install, ["package"])
assert result.exit_code == 1

def test_bad_package_name(self, runner, mock_proj):
mock_proj.add_package.side_effect = [RequirementException]
result = runner.invoke(cli.install, ["badpackage"])
assert result.exit_code == 1
assert "Aborted!" in result.output
10 changes: 4 additions & 6 deletions tests/test_utils.py
Expand Up @@ -133,9 +133,8 @@ def test_generate_stub(shared_datadir, tmp_path, mocker):
assert print_mock.call_count >= 1


def test_get_package_meta(mocker):
def test_get_package_meta(mocker, requests_mock):
"""should get package meta"""
mock_req = mocker.patch.object(utils.helpers, 'requests')
mock_data = {
"releases": {
"0.0.0": [
Expand All @@ -153,13 +152,12 @@ def test_get_package_meta(mocker):
],
}
}
mock_req.get.return_value.json.return_value = mock_data
result = utils.get_package_meta("foobar")
requests_mock.get("https://pypi.org/pypi/foobar/json", json=mock_data)
result = utils.get_package_meta("foobar", "https://pypi.org/pypi/foobar/json")
assert result == {
"url": "return-me.tar.gz"
}
mock_req.get.assert_called_once_with("https://pypi.org/pypi/foobar/json")
result = utils.get_package_meta("foobar", spec="==0.0.0")
result = utils.get_package_meta("foobar", "https://pypi.org/pypi/foobar/json", spec="==0.0.0")
assert result == {
"url": "early-version.tar.gz"
}
Expand Down

0 comments on commit d8b2b06

Please sign in to comment.