Skip to content

Commit

Permalink
Merge pull request #2 from kalefranz/fix/package-not-found
Browse files Browse the repository at this point in the history
add package not found integration test
  • Loading branch information
goanpeca committed Mar 28, 2017
2 parents f3735d1 + e8643e6 commit 2f22237
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 19 deletions.
25 changes: 12 additions & 13 deletions conda/cli/install.py
Expand Up @@ -25,7 +25,8 @@
CondaIOError, CondaImportError, CondaOSError,
CondaRuntimeError, CondaSystemExit, CondaValueError,
DirectoryNotFoundError, DryRunExit, LockError, NoPackagesFoundError,
PackageNotFoundError, TooManyArgumentsError, UnsatisfiableError)
PackageNotFoundError, TooManyArgumentsError, UnsatisfiableError,
PackageNotInstalledError)
from ..misc import append_env, clone_env, explicit, touch_nonadmin
from ..models.channel import prioritize_channels
from ..plan import (display_actions, execute_actions, get_pinned_specs, install_actions_list,
Expand Down Expand Up @@ -151,8 +152,7 @@ def install(args, parser, command='install'):
for name in args.packages:
common.arg2spec(name, json=context.json, update=True)
if name not in linked_names and common.prefix_if_in_private_env(name) is None:
error_message = "Package '%s' is not installed in %s" % (name, prefix)
raise PackageNotFoundError(error_message)
raise PackageNotInstalledError(prefix, name)

if newenv and not args.no_default_packages:
default_packages = list(context.create_default_packages)
Expand Down Expand Up @@ -183,8 +183,8 @@ def install(args, parser, command='install'):
return
elif getattr(args, 'all', False):
if not linked_dists:
error_message = "There are no packages installed in the prefix %s" % prefix
raise PackageNotFoundError(error_message)
log.info("There are no packages installed in prefix %s", prefix)
return
specs.extend(d.quad[0] for d in linked_dists)
specs.extend(common.specs_from_args(args.packages, json=context.json))

Expand Down Expand Up @@ -286,16 +286,16 @@ def install(args, parser, command='install'):
error_message.append("\n\nClose matches found; did you mean one of these?\n")
error_message.append("\n %s: %s" % (pkg, ', '.join(close)))
nfound += 1
error_message.append('\n\nYou can search for packages on anaconda.org with')
error_message.append('\n\n anaconda search -t conda %s' % pkg)
# error_message.append('\n\nYou can search for packages on anaconda.org with')
# error_message.append('\n\n anaconda search -t conda %s' % pkg)
if len(e.pkgs) > 1:
# Note this currently only happens with dependencies not found
error_message.append('\n\n(and similarly for the other packages)')

if not find_executable('anaconda', include_others=False):
error_message.append('\n\nYou may need to install the anaconda-client')
error_message.append(' command line client with')
error_message.append('\n\n conda install anaconda-client')
# if not find_executable('anaconda', include_others=False):
# error_message.append('\n\nYou may need to install the anaconda-client')
# error_message.append(' command line client with')
# error_message.append('\n\n conda install anaconda-client')

pinned_specs = get_pinned_specs(prefix)
if pinned_specs:
Expand All @@ -304,8 +304,7 @@ def install(args, parser, command='install'):
error_message.append("\n\n %r" % pinned_specs)

error_message = ''.join(error_message)

raise PackageNotFoundError(error_message, package_name=pkg)
raise PackageNotFoundError(error_message)

except (UnsatisfiableError, SystemExit) as e:
# Unsatisfiable package specifications/no such revision/import error
Expand Down
19 changes: 14 additions & 5 deletions conda/exceptions.py
Expand Up @@ -305,11 +305,20 @@ def __init__(self, url, target_full_path, expected_md5sum, actual_md5sum):


class PackageNotFoundError(CondaError):
def __init__(self, message, package_name=None):
if package_name:
_message = "conda could not find package '%(package_name)s'\n\n"
message = _message + message
super(PackageNotFoundError, self).__init__(message, package_name=package_name)
def __init__(self, message, **kwargs):
super(PackageNotFoundError, self).__init__(message, **kwargs)


class PackageNotInstalledError(PackageNotFoundError):

def __init__(self, prefix, package_name):
message = dals("""
Package is not installed in prefix.
prefix: %(prefix)s
package name: %(package_name)s
""")
super(PackageNotInstalledError, self).__init__(message, prefix=prefix,
package_name=package_name)


class CondaHTTPError(CondaError):
Expand Down
13 changes: 12 additions & 1 deletion tests/test_create.py
Expand Up @@ -48,7 +48,8 @@
from conda.core.linked_data import get_python_version_for_prefix, \
linked as install_linked, linked_data, linked_data_
from conda.core.package_cache import PackageCache
from conda.exceptions import CondaHTTPError, DryRunExit, RemoveError, conda_exception_handler
from conda.exceptions import CondaHTTPError, DryRunExit, RemoveError, conda_exception_handler, \
PackageNotFoundError
from conda.gateways.disk.create import mkdir_p
from conda.gateways.disk.delete import rm_rf
from conda.gateways.disk.update import touch
Expand Down Expand Up @@ -744,6 +745,16 @@ def test_create_dry_run(self):
assert "python:" in stdout
assert join('another', 'place') in stdout

def test_packages_not_found(self):
with make_temp_env() as prefix:
with pytest.raises(PackageNotFoundError) as exc:
run_command(Commands.INSTALL, prefix, "not-a-real-package")
assert "not-a-real-package" in text_type(exc.value)

stdout, stderr = run_command(Commands.INSTALL, prefix, "not-a-real-package",
use_exception_handler=True)
assert "not-a-real-package" in stderr

@pytest.mark.skipif(on_win, reason="gawk is a windows only package")
def test_search_gawk_not_win(self):
with make_temp_env() as prefix:
Expand Down

0 comments on commit 2f22237

Please sign in to comment.