Exemplo n.º 1
0
def test_pip_remove(setup_pip_env, mocker):
    env = setup_pip_env["env"]
    env_io = setup_pip_env["env_io"]

    mocker.patch("conda_env_tracker.pip.pip_remove")
    PipHandler(env=env).remove(packages=Packages.from_specs("pytest"),
                               yes=True)

    actual = env_io.get_history()

    assert actual.logs[-1] == "pip uninstall pytest"
    assert actual.actions[-1] == "pip uninstall pytest"
    assert actual.packages["pip"] == {
        "pandas":
        Package(name="pandas",
                spec="git+ssh://[email protected]/pandas-dev/pandas")
    }

    PipHandler(env=env).remove(packages=Packages.from_specs("pandas"),
                               yes=True)

    actual = env_io.get_history()
    assert actual.logs[-1] == "pip uninstall pandas"
    assert actual.actions[-1] == "pip uninstall pandas"
    assert "pip" not in actual.packages
Exemplo n.º 2
0
def test_extract_packages_from_logs(spec):
    """Test parsing the packges from action item"""
    log = Logs(f"conda install --name test {spec}")
    packages = log.extract_packages(index=0,
                                    packages=Packages.from_specs(spec))

    assert packages[0] == Package.from_spec(spec)
Exemplo n.º 3
0
    def _update_history(
        self,
        get_command: Callable,
        packages: Packages,
        channels: ListLike,
        strict_channel_priority: bool = True,
    ):
        self.env.update_dependencies()
        self.env.history.update_packages(packages=packages,
                                         dependencies=self.env.dependencies)

        self.env.validate_packages(packages)

        log = get_command(name=self.env.name, packages=packages)
        if channels:
            log = log + " " + Channels.format_channels(channels)

        specs = self.env.history.actions.get_package_specs(
            packages=packages, dependencies=self.env.dependencies["conda"])

        channel_string = self.env.history.channels.create_channel_command(
            preferred_channels=channels,
            strict_channel_priority=strict_channel_priority)
        command_with_specs = get_command(name=self.env.name,
                                         packages=Packages.from_specs(specs))
        action = f"{command_with_specs} {channel_string}"

        self.env.history.append(log=log, action=action)
Exemplo n.º 4
0
def test_remove_custom_channels(setup_env, channels, mocker):
    env = setup_env["env"]
    env_io = setup_env["env_io"]
    expected = setup_env["expected"]

    mocker.patch("conda_env_tracker.conda.conda_remove")

    packages = Packages.from_specs("pandas")
    CondaHandler(env=env).remove(packages=packages, channels=channels)

    history = env_io.get_history()
    assert history.channels == expected["channels"]
    assert history.packages == {}
    assert history.logs == expected["logs"] + [
        f"conda remove --name {env.name} pandas "
        + " ".join(["--channel " + channel for channel in channels])
    ]

    computed_channels = channels.copy()
    for channel in expected["channels"]:
        if channel not in computed_channels:
            computed_channels.append(channel)

    remove_channel_string = "--override-channels " + " ".join(
        [f"--channel " + channel for channel in computed_channels]
    )

    assert history.actions == expected["actions"] + [
        f"conda remove --name {env.name} pandas {remove_channel_string}"
    ]
Exemplo n.º 5
0
def test_infer_environment_package_does_not_exist(mocker):
    env_name = "infer-test"
    dependencies = {
        "conda": {
            "pandas": Package("pandas", "pandas", "0.23", "py_36")
        }
    }
    mocker.patch(
        "conda_env_tracker.history.debug.get_pip_version",
        mocker.Mock(return_value="18.1"),
    )
    mocker.patch("conda_env_tracker.env.get_all_existing_environment",
                 return_value=[env_name])
    mocker.patch("conda_env_tracker.env.get_dependencies",
                 mocker.Mock(return_value=dependencies))
    mocker.patch("conda_env_tracker.env.get_r_dependencies")

    with pytest.raises(Exception) as err:
        Environment.infer(
            name=env_name,
            packages=Packages.from_specs("pytest"),
            channels=["conda-forge", "main"],
        )
    assert str(
        err.value) == "Environment infer-test does not have pytest installed"
Exemplo n.º 6
0
 def extract_packages(self, index: int) -> Packages:
     """Return the packages for the action item"""
     if self._is_r_action(index):
         packages, _ = self.extract_r_packages(index)
         return packages
     package_expression = re.compile("([a-z0-9-_.]+=[a-z0-9_=.]+)")
     return Packages.from_specs(
         [spec for spec in package_expression.findall(self[index])])
Exemplo n.º 7
0
def r_remove(name: str, specs=ListLike, yes: bool = False) -> Environment:
    """R remove spec"""
    env = Environment.read(name=name)
    check_r_base_package(env=env)
    packages = Packages.from_specs(specs)
    RHandler(env=env).remove(packages=packages)
    _ask_user_to_sync(name=name, yes=yes)
    return env
Exemplo n.º 8
0
def test_package_name_error():
    name = os.environ.get("CONDA_DEFAULT_ENV")
    with pytest.raises(PipInstallError):
        pip.pip_install(
            name=name,
            packages=Packages.from_specs(
                ["thereisnowaysomeonewouldnameapackagethisway"]
            ),
        )
Exemplo n.º 9
0
def setup_r_tests(mocker):
    """Set up for pull function with R packages"""
    remote_packages = Packages.from_specs("r-base")
    remote_logs = ["conda create --name pull_testing_environment r-base"]
    remote_actions = [
        "conda create --name pull_testing_environment r-base=3.5.1=h351"
    ]
    remote_history = History(
        name=ENV_NAME,
        channels=CHANNELS,
        packages=HistoryPackages.create(remote_packages),
        logs=Logs([log for log in remote_logs]),
        actions=Actions(remote_actions),
        debug=Debug(),
    )

    mocker.patch("conda_env_tracker.conda.conda_install")
    mocker.patch("conda_env_tracker.pip.pip_install")
    mocker.patch("conda_env_tracker.history.get_pip_version")

    run_mock = mocker.patch("conda_env_tracker.gateways.r.run_command")
    run_mock.configure_mock(**{"return_value.failed": False})

    mocker.patch(
        "conda_env_tracker.env.get_dependencies",
        return_value={"conda": {
            "r-base": "3.5.1"
        }},
    )
    get_r_dependencies = mocker.patch(
        "conda_env_tracker.env.get_r_dependencies")
    overwrite_mock = mocker.patch(
        "conda_env_tracker.pull.EnvIO.overwrite_local")
    mocker.patch("conda_env_tracker.pull.EnvIO.get_remote_dir",
                 return_value="~/path/to/remote")
    mocker.patch("conda_env_tracker.pull.EnvIO.get_history",
                 return_value=remote_history)
    mocker.patch("conda_env_tracker.pull.prompt_yes_no", return_value=True)
    mocker.patch("conda_env_tracker.pull.update_conda_environment")
    mocker.patch("conda_env_tracker.pull.update_r_environment")
    mocker.patch("conda_env_tracker.pull.Environment.export")
    mocker.patch("conda_env_tracker.pull.Environment.validate")

    yield {
        "get_r_dependencies": get_r_dependencies,
        "overwrite_mock": overwrite_mock,
        "remote_history": remote_history,
    }

    env_dir = USER_ENVS_DIR / ENV_NAME
    if env_dir.exists():
        shutil.rmtree(env_dir)
Exemplo n.º 10
0
def test_replace_existing_env_success(mocker):
    mocker.patch("conda_env_tracker.env.delete_conda_environment")
    mocker.patch("conda_env_tracker.env.prompt_yes_no").return_value = True
    env_name = "conda_env_tracker-test-create-history"
    create_cmd = f"conda create --name {env_name} pandas"
    channels = ["conda-forge", "main"]
    packages = Packages.from_specs("pandas")
    action = "pandas=0.23=py_36"

    mocker.patch(
        "conda_env_tracker.env.get_all_existing_environment").return_value = [
            env_name
        ]
    mocker.patch("conda_env_tracker.env.conda_create",
                 mocker.Mock(return_value=create_cmd))
    mocker.patch(
        "conda_env_tracker.env.get_dependencies",
        mocker.Mock(return_value={
            "conda": {
                "pandas": Package("pandas", "*", "0.23=py_36")
            },
            "pip": {},
        }),
    )
    mocker.patch(
        "conda_env_tracker.history.debug.get_pip_version",
        mocker.Mock(return_value="18.1"),
    )
    mocker.patch("conda_env_tracker.env.get_conda_channels",
                 mocker.Mock(return_value=channels))
    Environment.create(name=env_name, packages=packages)

    writer = EnvIO(env_directory=USER_ENVS_DIR / env_name)
    history = writer.get_history()
    channel_string = "--override-channels --strict-channel-priority " + " ".join(
        "--channel " + channel for channel in channels)
    assert history.actions == [
        f"conda create --name {env_name} {action} {channel_string}"
    ]
    assert history.packages == {
        "conda": {
            "pandas": Package.from_spec("pandas")
        }
    }
    assert history.channels == channels
    assert history.logs == [create_cmd]

    env_dir = Path(USER_ENVS_DIR) / env_name
    shutil.rmtree(env_dir)
Exemplo n.º 11
0
def test_package_install_with_custom_channel(setup_env, channels, mocker):
    """The user can specify a list of channels that will override the channel precedence order or
    they can specify a custom channel that is not previously in the environment's channel list"""
    env = setup_env["env"]
    env_io = setup_env["env_io"]
    expected = setup_env["expected"]

    get_package_mock = setup_env["get_package_mock"]
    get_package_mock.configure_mock(
        return_value={
            "conda": {
                "pyspark": Package("pyspark", "pyspark", "0.21", "py_36"),
                "pandas": Package("pandas", "pandas", "0.23", "py_36"),
            }
        }
    )

    mocker.patch("conda_env_tracker.conda.conda_install")

    CondaHandler(env=env).install(
        packages=Packages.from_specs("pyspark"), channels=channels
    )

    history = env_io.get_history()

    expected_log = expected["logs"].copy()
    expected_action = expected["actions"].copy()
    expected_packages = copy.deepcopy(expected["packages"])

    expected_packages["conda"]["pyspark"] = Package.from_spec("pyspark")
    channel_log_string = " ".join(["--channel " + channel for channel in channels])
    expected_log.append(f"conda install --name {env.name} pyspark {channel_log_string}")

    computed_channels = channels.copy()
    for channel in expected["channels"]:
        if not channel in computed_channels:
            computed_channels.append(channel)

    install_channel_string = (
        "--override-channels --strict-channel-priority "
        + " ".join([f"--channel " + channel for channel in computed_channels])
    )

    assert history.packages == expected_packages
    expected_action.append(
        f"conda install --name {env.name} pyspark=0.21=py_36 {install_channel_string}"
    )
    assert history.actions == expected_action
    assert history.logs == expected_log
Exemplo n.º 12
0
def test_infer_environment_with_pip_package_success(mocker):
    env_name = "infer-test"
    dependencies = {
        "conda": {
            "pandas": Package("pandas", "pandas", "0.23", "py_36")
        },
        "pip": {
            "pytest": Package("pytest", "pytest", "0.11")
        },
    }
    mocker.patch(
        "conda_env_tracker.history.debug.get_pip_version",
        mocker.Mock(return_value="18.1"),
    )
    mocker.patch("conda_env_tracker.env.get_all_existing_environment",
                 return_value=[env_name])
    mocker.patch("conda_env_tracker.env.get_dependencies",
                 mocker.Mock(return_value=dependencies))
    mocker.patch("conda_env_tracker.env.get_r_dependencies")

    env = Environment.infer(
        name=env_name,
        packages=Packages.from_specs(["pandas", "pytest"]),
        channels=["conda-forge", "main"],
    )
    assert env.history.packages == {
        "conda": {
            "pandas": Package("pandas", "pandas", "0.23", "py_36")
        },
        "pip": {
            "pytest": Package("pytest", "pytest", "0.11")
        },
    }
    assert env.history.channels == ["conda-forge", "main"]
    assert env.history.logs == [
        f"conda create --name {env_name} pandas --override-channels --strict-channel-priority "
        "--channel conda-forge "
        "--channel main",
        "pip install pytest --index-url https://pypi.org/simple",
    ]
    assert env.history.actions == [
        f"conda create --name {env_name} pandas=0.23=py_36 "
        "--override-channels --strict-channel-priority "
        "--channel conda-forge "
        "--channel main",
        "pip install pytest==0.11 --index-url"
        " https://pypi.org/simple",
    ]
Exemplo n.º 13
0
def test_infer_environment_does_not_exist(mocker):
    env_name = "infer-test"
    mocker.patch("conda_env_tracker.history.get_pip_version",
                 mocker.Mock(return_value="18.1"))
    mocker.patch(
        "conda_env_tracker.env.get_all_existing_environment",
        return_value=["env-not-exist"],
    )
    with pytest.raises(Exception) as err:
        Environment.infer(
            name=env_name,
            packages=Packages.from_specs("pandas"),
            channels=["conda-forge", "main"],
        )
    assert (str(err.value) ==
            f"Environment {env_name} can not be inferred, does not exist")
Exemplo n.º 14
0
def test_name_cleaning(mocker):
    create_mock = mocker.patch("conda_env_tracker.main.Environment.create")
    mocker.patch("conda_env_tracker.main.Environment.export")
    mocker.patch("conda_env_tracker.main.jupyter_kernel_install_query")
    mocker.patch("conda_env_tracker.main.prompt_yes_no",
                 mocker.Mock(return_value=False))

    create(name="test", specs=["one", "TWO", "thRee=1.0"])

    create_mock.assert_called_once_with(
        name="test",
        packages=Packages.from_specs(["one", "two", "three=1.0"]),
        channels=None,
        yes=False,
        strict_channel_priority=True,
    )
Exemplo n.º 15
0
def test_strict_channel_priority_update_all(setup_env, use_package, mocker):
    env = setup_env["env"]
    env_io = setup_env["env_io"]
    expected = setup_env["expected"]

    get_package_mock = setup_env["get_package_mock"]
    get_package_mock.configure_mock(
        return_value={
            "conda": {
                "pyspark": Package("pyspark", "pyspark", "0.21", "py_36"),
                "pandas": Package("pandas", "pandas", "0.23", "py_36"),
            }
        }
    )

    mocker.patch("conda_env_tracker.conda.conda_update_all")

    expected_packages = copy.deepcopy(expected["packages"])

    update_all_channel_string = "--override-channels " + " ".join(
        f"--channel {channel}" for channel in expected["channels"]
    )

    if use_package:
        CondaHandler(env=env).update_all(
            packages=Packages.from_specs("pyspark"), strict_channel_priority=False
        )
        expected_packages["conda"]["pyspark"] = Package.from_spec("pyspark")
        log = f"conda update --all --name {env.name} pyspark"
        action = f"conda update --all --name {env.name} pyspark=0.21=py_36 {update_all_channel_string}"
    else:
        CondaHandler(env=env).update_all(strict_channel_priority=False)
        log = f"conda update --all --name {env.name}"
        action = f"conda update --all --name {env.name} {update_all_channel_string}"

    history = env_io.get_history()

    expected_logs = expected["logs"].copy()
    expected_logs.append(log)

    expected_actions = expected["actions"].copy()
    expected_actions.append(action)

    assert history.packages == expected_packages
    assert history.actions == expected_actions
    assert history.logs == expected_logs
Exemplo n.º 16
0
def test_install_upgrade_version_success(setup_env, mocker):
    env = setup_env["env"]
    env_io = setup_env["env_io"]
    expected = setup_env["expected"]

    get_package_mock = setup_env["get_package_mock"]
    get_package_mock.configure_mock(
        return_value={
            "conda": {
                "numpy": Package("numpy", "numpy", "1.1", "py_36"),
                "pandas": Package("pandas", "pandas", "0.24", "py_36"),
            }
        }
    )

    mocker.patch("conda_env_tracker.conda.conda_install")

    packages = Packages.from_specs("numpy")
    CondaHandler(env=env).install(packages=packages)

    history = env_io.get_history()

    channel_string = "--override-channels --strict-channel-priority " + " ".join(
        [f"--channel " + channel for channel in expected["channels"]]
    )
    expected_log = expected["logs"].copy()
    expected_log.append(f"conda install --name {env.name} numpy")

    expected_action = expected["actions"].copy()

    expected_packages = copy.deepcopy(expected["packages"])
    expected_packages["conda"]["numpy"] = Package.from_spec("numpy")
    if expected_packages["conda"]["pandas"].spec_is_name():
        expected_action.append(
            f"conda install --name {env.name} numpy=1.1=py_36 {channel_string}"
        )
    else:
        expected_packages["conda"]["pandas"] = Package.from_spec("pandas=0.24=py_36")
        expected_action.append(
            f"conda install --name {env.name} numpy=1.1=py_36 pandas=0.24=py_36 {channel_string}"
        )

    assert history.packages == expected_packages
    assert history.logs == expected_log
    assert history.actions == expected_action
Exemplo n.º 17
0
    def extra_removed_packages(self, index: int) -> Packages:
        """Extract packages from a remove command.

        The package names always occur after the --name, but we have to drop the environment name
        """
        log = self[index]
        if (not log.startswith("conda remove")
                and not log.startswith("pip uninstall") and
                not (log.startswith(R_COMMAND) and "remove.packages" in log)):
            raise CondaEnvTrackerParseHistoryError(
                f"The log at index {index} is not a remove statement: {self[index]}."
            )
        if log.startswith("conda remove"):
            package_names = self._extract_conda_remove_package_names(log)
        elif log.startswith("pip uninstall"):
            package_names = log.replace("pip uninstall ", "").split()
        else:
            package_names = self._extract_r_remove_package_names(log)
        return Packages.from_specs(package_names)
Exemplo n.º 18
0
def test_update_history_conda_remove(setup_env):
    env = setup_env["env"]
    expected = setup_env["expected"]
    channels = expected["channels"]

    packages = Packages.from_specs("pandas")
    CondaHandler(env=env).update_history_remove(packages=packages)

    history = env.history

    log = f"conda remove --name {env.name} pandas"
    action = f"conda remove --name {env.name} pandas --override-channels " + " ".join(
        "--channel " + channel for channel in channels)
    expected_logs = expected["logs"].copy()
    expected_actions = expected["actions"].copy()
    expected_logs.append(log)
    expected_actions.append(action)

    assert history.logs == expected_logs
    assert history.actions == expected_actions
Exemplo n.º 19
0
    def update_history_install(
        self,
        packages: Packages,
        index_url: Union[str, ListLike] = PIP_DEFAULT_INDEX_URL,
    ):
        """Update history for pip install."""
        self.env.update_dependencies()
        self.env.history.packages.update_packages(packages, source="pip")
        self.env.validate_installed_packages(packages)

        log = get_pip_install_command(packages=packages, index=index_url)

        specs = self.env.history.actions.get_package_specs(
            packages=packages,
            dependencies=self.env.dependencies["pip"],
            version_separator="==",
        )
        action = get_pip_install_command(packages=Packages.from_specs(specs),
                                         index=index_url)

        self.env.history.append(log=log, action=action)
Exemplo n.º 20
0
def test_remove_package(setup_env, mocker):
    env = setup_env["env"]
    env_io = setup_env["env_io"]
    expected = setup_env["expected"]

    mocker.patch("conda_env_tracker.conda.conda_remove")

    packages = Packages.from_specs("pandas")
    CondaHandler(env=env).remove(packages=packages)

    history = env_io.get_history()
    assert history.channels == expected["channels"]
    assert history.packages == {}
    assert history.logs == expected["logs"] + [f"conda remove --name {env.name} pandas"]
    channel_string = "--override-channels --strict-channel-priority " + " ".join(
        [f"--channel " + channel for channel in expected["channels"]]
    )
    remove_channel_string = channel_string.replace("--strict-channel-priority ", "")
    assert history.actions == expected["actions"] + [
        f"conda remove --name {env.name} pandas {remove_channel_string}"
    ]
Exemplo n.º 21
0
def test_remove_dependency(setup_env, mocker):
    """Test removing a dependency 'numpy' which will cause the package 'pandas' to be removed."""
    env = setup_env["env"]
    env_io = setup_env["env_io"]
    expected = setup_env["expected"]
    logger_mock = mocker.patch("conda_env_tracker.env.logger.warning")

    get_package_mock = setup_env["get_package_mock"]
    get_package_mock.configure_mock(
        return_value={"conda": {"numpy": Package("numpy", "numpy", "1.1", "py_36")}}
    )
    env.dependencies["conda"]["numpy"] = "1.1=py_36"

    mocker.patch("conda_env_tracker.conda.conda_remove")

    packages = Packages.from_specs("numpy")
    CondaHandler(env=env).remove(packages=packages)

    history = env_io.get_history()

    channel_string = "--override-channels --strict-channel-priority " + " ".join(
        [f"--channel " + channel for channel in expected["channels"]]
    )
    remove_channel_string = channel_string.replace("--strict-channel-priority ", "")
    expected_log = expected["logs"].copy()
    expected_log.append(f"conda remove --name {env.name} numpy")

    expected_action = expected["actions"].copy()
    expected_action.append(
        f"conda remove --name {env.name} numpy {remove_channel_string}"
    )

    expected_packages = {}
    assert history.packages == expected_packages
    assert history.logs == expected_log
    assert history.actions == expected_action
    logger_mock.assert_called_once_with(
        'Package "pandas" was removed during the last command.'
    )
Exemplo n.º 22
0
def test_install_with_default_version_and_yes_success(setup_env, mocker):
    env = setup_env["env"]
    env_io = setup_env["env_io"]
    expected = setup_env["expected"]
    initial_conda_packages = setup_env["initial_conda_packages"]

    get_package_mock = setup_env["get_package_mock"]
    get_package_mock.configure_mock(
        return_value={
            "conda": {
                **initial_conda_packages,
                "pyspark": Package("pyspark", "pyspark", "0.21", "py_36"),
            }
        }
    )

    mocker.patch("conda_env_tracker.conda.conda_install")

    packages = Packages.from_specs("pyspark")
    CondaHandler(env=env).install(packages=packages)

    history = env_io.get_history()

    expected_log = expected["logs"].copy()
    expected_action = expected["actions"].copy()
    expected_packages = copy.deepcopy(expected["packages"])

    expected_packages["conda"]["pyspark"] = Package.from_spec("pyspark")
    expected_log.append(f"conda install --name {env.name} pyspark")

    assert history.packages == expected_packages
    channel_string = "--override-channels --strict-channel-priority " + " ".join(
        [f"--channel " + channel for channel in expected["channels"]]
    )
    expected_action.append(
        f"conda install --name {env.name} pyspark=0.21=py_36 {channel_string}"
    )
    assert history.actions == expected_action
    assert history.logs == expected_log
Exemplo n.º 23
0
def test_install_unexpectedly_removes_package(setup_env, mocker):
    """Simulating that installing python=3.8 uninstalls pandas and
    there is no version of pandas available for python 3.8
    """
    env = setup_env["env"]
    env_io = setup_env["env_io"]
    expected = setup_env["expected"]
    logger_mock = mocker.patch("conda_env_tracker.env.logger.warning")

    get_package_mock = setup_env["get_package_mock"]
    get_package_mock.configure_mock(
        return_value={"conda": {"python": Package("python", "python", "3.8", "py_38")}}
    )

    mocker.patch("conda_env_tracker.conda.conda_install")

    CondaHandler(env=env).install(packages=Packages.from_specs("python=3.8"))

    history = env_io.get_history()

    channel_string = "--override-channels --strict-channel-priority " + " ".join(
        [f"--channel " + channel for channel in expected["channels"]]
    )
    expected_log = expected["logs"].copy()
    expected_log.append(f"conda install --name {env.name} python=3.8")

    expected_action = expected["actions"].copy()
    expected_action.append(
        f"conda install --name {env.name} python=3.8=py_38 {channel_string}"
    )

    expected_packages = {"conda": {"python": Package.from_spec("python=3.8")}}
    assert history.packages == expected_packages
    assert history.logs == expected_log
    assert history.actions == expected_action
    logger_mock.assert_called_once_with(
        'Package "pandas" was removed during the last command.'
    )
Exemplo n.º 24
0
def expected_update(mocker):
    """Set up for update function"""
    packages = Packages.from_specs("pandas")
    channel = "conda-forge"
    create_cmd = "conda install pandas"
    name = "test-update"
    mocker.patch("conda_env_tracker.gateways.io.Path.mkdir")
    mocker.patch("conda_env_tracker.gateways.io.Path.write_text")
    mocker.patch("conda_env_tracker.gateways.io.Path.iterdir")
    mocker.patch("conda_env_tracker.history.debug.get_pip_version",
                 return_value=None)
    dependencies = {
        "conda": {
            "pandas": Package("pandas", "pandas", "0.23", "py36"),
            "pytest": Package("pytest", "pytest", "0.1", "py36"),
        },
        "pip": {},
    }
    mocker.patch("conda_env_tracker.env.get_dependencies",
                 return_value=dependencies)
    mocker.patch("conda_env_tracker.env.EnvIO.export_packages")
    history = History.create(
        name=name,
        channels=Channels([channel]),
        packages=PackageRevision.create(packages, dependencies=dependencies),
        logs=Logs(create_cmd),
        actions=Actions.create(name="test-update",
                               specs=["pandas"],
                               channels=Channels([channel])),
        diff=Diff.create(packages, dependencies=dependencies),
        debug=Debug(),
    )
    mocker.patch(
        "conda_env_tracker.main.Environment.read",
        return_value=Environment(name=name, history=history),
    )
    return history
Exemplo n.º 25
0
def test_infer_environment_with_spec_success(mocker):
    env_name = "infer-test"
    dependencies = {
        "conda": {
            "pandas": Package("pandas", "pandas", "0.23", "py_36")
        }
    }
    mocker.patch("conda_env_tracker.history.get_pip_version",
                 mocker.Mock(return_value="18.1"))
    mocker.patch("conda_env_tracker.env.get_all_existing_environment",
                 return_value=[env_name])
    mocker.patch("conda_env_tracker.env.get_dependencies",
                 mocker.Mock(return_value=dependencies))
    mocker.patch("conda_env_tracker.env.get_r_dependencies")

    env = Environment.infer(
        name=env_name,
        packages=Packages.from_specs("pandas=0.23"),
        channels=["conda-forge", "main"],
    )
    assert env.history.packages == {
        "conda": {
            "pandas": Package("pandas", "pandas=0.23", "0.23", "py_36")
        }
    }
    assert env.history.channels == ["conda-forge", "main"]
    assert env.history.logs == [
        f"conda create --name {env_name} pandas=0.23 --override-channels --strict-channel-priority "
        "--channel conda-forge "
        "--channel main"
    ]
    assert env.history.actions == [
        f"conda create --name {env_name} pandas=0.23=py_36 "
        "--override-channels --strict-channel-priority "
        "--channel conda-forge "
        "--channel main"
    ]
Exemplo n.º 26
0
def setup_pip_env(setup_env, mocker):
    """Set up for pip remove"""
    pip_package_url = "git+ssh://[email protected]/pandas-dev/pandas"
    pip_dependencies = {
        "pandas": Package("pandas", pip_package_url),
        "pytest": Package("pytest", "pytest", "4.0.0"),
    }
    env = setup_env["env"]
    mocker.patch("conda_env_tracker.pip.pip_install")
    mocker.patch("conda_env_tracker.pip.pip_custom_install")
    get_package_mock = setup_env["get_package_mock"]
    initial_conda_packages = setup_env["initial_conda_packages"]
    get_package_mock.configure_mock(**{
        "return_value": {
            "conda": initial_conda_packages,
            "pip": pip_dependencies
        }
    })
    PipHandler(env=env).install(packages=Packages.from_specs("pytest"))

    custom_package = Package("pandas", pip_package_url)
    PipHandler(env=env).custom_install(package=custom_package)

    return setup_env
Exemplo n.º 27
0
def test_pip_remove_package_missing_from_env(setup_pip_env):
    env = setup_pip_env["env"]

    packages = Packages.from_specs("this_is_a_nonexistant_package")
    with pytest.raises(PipRemoveError):
        PipHandler(env=env).remove(packages=packages)
Exemplo n.º 28
0
@pytest.mark.parametrize("spec",
                         ["numpy", "pytest=0.26", "num-py=0.1=hbdcb_4"])
def test_extract_packages_from_logs(spec):
    """Test parsing the packges from action item"""
    log = Logs(f"conda install --name test {spec}")
    packages = log.extract_packages(index=0,
                                    packages=Packages.from_specs(spec))

    assert packages[0] == Package.from_spec(spec)


@pytest.mark.parametrize(
    "log, expected",
    [
        ("conda remove --name test python", Packages.from_specs("python")),
        (
            "conda remove --name test2 python pandas",
            Packages.from_specs(["python", "pandas"]),
        ),
        ("pip uninstall pandas", Packages.from_specs("pandas")),
        ("pip uninstall pandas numpy", Packages.from_specs(["pandas", "numpy"
                                                            ])),
        (
            f"{R_COMMAND} -e 'remove.packages(c(\"dplyr\"))'",
            Packages.from_specs("dplyr"),
        ),
        (
            f'{R_COMMAND} -e \'remove.packages(c("dplyr","testthat"))\'',
            Packages.from_specs(["dplyr", "testthat"]),
        ),
from conda_env_tracker.channels import Channels
from conda_env_tracker.gateways.io import USER_ENVS_DIR
from conda_env_tracker.history import Debug, Diff, History, Logs, PackageRevision
from conda_env_tracker.env import Environment
from conda_env_tracker.errors import CondaEnvTrackerPushError, PUSH_ERROR_STR
from conda_env_tracker.packages import Package, Packages
from conda_env_tracker.push import push


@pytest.fixture(
    params=[
        {
            "env_name": "test-push-success",
            "push_should_fail": False,
            "local_packages": Packages.from_specs(["pandas", "pytest"]),
            "local_logs": [
                "conda create --name test-push-success pandas",
                "conda install --name test-push-success pytest",
            ],
            "local_actions": [
                "conda create --name test-push-success pandas=0.23.0=py36",
                "conda install --name test-push-success pytest=4.0.0=py36",
            ],
            "remote_packages": Packages.from_specs(["pandas", "pylint"]),
            "remote_logs": ["conda create --name test-push-success pandas"],
            "remote_actions": [
                "conda create --name test-push-success pandas=0.23.0=py36"
            ],
        },
        {
Exemplo n.º 30
0
"""Test PipHandler"""
# pylint: disable=redefined-outer-name
import copy

import pytest

from conda_env_tracker.packages import Package, Packages
from conda_env_tracker.pip import PipHandler, PIP_DEFAULT_INDEX_URL


@pytest.mark.parametrize(
    "packages, pip_dependencies",
    [
        (
            Packages.from_specs("pytest"),
            {
                "pytest": Package("pytest", "pytest", "4.0.0")
            },
        ),
        (
            Packages.from_specs("pytest==4.0.0"),
            {
                "pytest": Package("pytest", "pytest==4.0.0", "4.0.0")
            },
        ),
        (
            Packages.from_specs(["pytest", "colorama"]),
            {
                "pytest": Package("pytest", "pytest", "4.0.0"),
                "colorama": Package("colorama", "colorama", "1.0.0"),
            },