예제 #1
0
def test_install_lib_fail(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args(package="requests")

    with pytest.raises(Exception):
        p.install(args)
예제 #2
0
def test_search_inexistant(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args(query="pipistache")
    p.install(args)
    search = p.search(args)

    assert search == f"Package '{args.query}' not found"
예제 #3
0
def test_venv_py_path(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args()
    venv_py = p._venv_py_path(args.package)

    assert isinstance(venv_py, str)
    assert venv_py.startswith(str(tmp_path))
예제 #4
0
def test_freeze(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args()
    p.install(args)
    freeze = p.freeze(args)

    assert freeze[0].startswith(f"{args.package}==")
예제 #5
0
def test_update(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args()
    p.update(args)
    venv_dir = p._venv_dir_path(args.package)
    package_bin = Path(venv_dir, "bin", args.package)

    assert package_bin.exists()
예제 #6
0
def test_search(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args()
    p.install(args)
    search = p.search(args)

    assert "not found" not in search
    assert args.query in search
예제 #7
0
def test_requirements_list(tmp_path):
    tmp_requirements_file = tmp_path / "requirements.txt"
    tmp_requirements_file.write_text("pipis\nansible\n# comment\n")

    p = Pipis()
    requirements = p._requirements_list(str(tmp_requirements_file))

    assert "pipis" in requirements
    assert "ansible" in requirements
    assert "# comment" not in requirements
예제 #8
0
def test_package_version(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args()
    p.install(args)
    version = p._package_version(args.package)

    assert isinstance(version, str)
    assert re.match(r"^\d+(?:\.\d+){1,3}", version)
예제 #9
0
def test_install_upgrade(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args(upgrade=True)
    p.install(args)
    venv_dir = p._venv_dir_path(args.package)
    package_bin = Path(venv_dir, "bin", args.package)

    assert package_bin.exists()
예제 #10
0
def test_create_venv(tmp_path):
    set_env(tmp_path)

    args = Args()
    p = Pipis()
    venv_dir = p._create_venv(package=args.package)

    assert Path(venv_dir).is_dir()
    assert Path(venv_dir, "bin", "python").exists()
    assert Path(venv_dir, "bin", "pip").exists()
예제 #11
0
def test_install_input_yes(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args(yes=False)
    with mock.patch("builtins.input", return_value="y"):
        p.install(args)
    venv_dir = p._venv_dir_path(args.package)
    package_bin = Path(venv_dir, "bin", args.package)

    assert package_bin.exists()
예제 #12
0
def test_install_dependency(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args(dependency="black")
    p.install(args)
    venv_dir = p._venv_dir_path(args.package)
    requirements = Path(venv_dir, "requirements.txt").read_text()
    dep_bin = Path(venv_dir, "bin", "black")

    assert requirements == "black"
    assert dep_bin.exists()
예제 #13
0
def test_uninstall(tmp_path, capsys):
    set_env(tmp_path)
    p = Pipis()
    args = Args()
    p.install(args)
    capsys.readouterr()  # reset capture

    sys.argv = ["pipis", "uninstall", "-y", args.package]
    main()
    captured = capsys.readouterr()

    assert captured.out == f"Successfully uninstalled {args.package}\n"
예제 #14
0
def test_search(tmp_path, capsys):
    set_env(tmp_path)
    p = Pipis()
    args = Args()
    p.install(args)

    package = "pipis"
    sys.argv = ["pipis", "search", package]
    main()
    captured = capsys.readouterr()

    assert "not found" not in captured.out
    assert package in captured.out
예제 #15
0
def test_package_scripts(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args()
    p.install(args)
    scripts = p._package_scripts(args.package)

    assert isinstance(scripts, list)
    for script in scripts:
        assert Path(script).is_file()
        assert os.access(script, os.X_OK)
        assert "bin" in script
예제 #16
0
def test_search_inexistant(tmp_path, capsys):
    set_env(tmp_path)
    p = Pipis()
    args = Args()
    p.install(args)
    capsys.readouterr()  # reset capture

    package = "pipistache"
    sys.argv = ["pipis", "search", package]
    main()
    captured = capsys.readouterr()

    assert captured.out == f"Package '{package}' not found\n"
예제 #17
0
def test_dist_info(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args()
    p.install(args)
    dist = p._dist_info(args.package)

    assert hasattr(dist, "location")
    assert hasattr(dist, "project_name")
    assert hasattr(dist, "version")
    assert hasattr(dist, "has_metadata")
    assert hasattr(dist, "get_metadata_lines")
    assert hasattr(dist, "get_entry_map")
예제 #18
0
def test_file_config(tmp_path):
    tmp_config_file = tmp_path / "config.cfg"
    tmp_config_file.write_text("[pipis]\nvenvs=hello\nbin=world\n")

    p = Pipis(config_paths=[str(tmp_config_file)])

    assert isinstance(p.config, dict)
    assert "venvs" in p.config.keys()
    assert "bin" in p.config.keys()
    assert p.config["venvs"] == "hello"
    assert p.config["bin"] == "world"
예제 #19
0
def test_env_config(tmp_path):
    set_env(tmp_path)
    envvars = {
        "venvs": os.environ["PIPIS_VENVS"],
        "bin": os.environ["PIPIS_BIN"]
    }

    p = Pipis()

    assert isinstance(p.config, dict)
    assert p.config == envvars
예제 #20
0
def test_windows_defaults_config():
    args = Args()
    base = os.getenv("APPDATA")
    path = Path(base, args.package, "data")
    default_venvs = str(Path(path, "venvs"))
    default_bin = str(Path(path, "bin"))
    defaults = {"venvs": default_venvs, "bin": default_bin}

    p = Pipis()

    assert isinstance(p.config, dict)
    assert p.config == defaults
예제 #21
0
def test_add_dependency(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args()
    p.install(args)
    p._add_dependency(args.package, "abc")
    req_file = p._add_dependency(args.package, "def")

    assert Path(req_file).is_file()
    assert Path(req_file).read_text() == "abc\ndef"
예제 #22
0
def test_linux_defaults_config_paths():
    args = Args()
    sys_base = "/etc"
    sys_path = str(Path(sys_base, args.package, f"{args.package}.cfg"))
    user_home = os.getenv("HOME", "")
    user_base = os.getenv("XDG_CONFIG_HOME", Path(user_home, ".config"))
    user_path = str(Path(user_base, args.package, f"{args.package}.cfg"))

    p = Pipis()

    assert isinstance(p.config_paths, list)
    assert p.config_paths[0] == sys_path
    assert p.config_paths[1] == user_path
예제 #23
0
def test_linux_defaults_config():
    args = Args()
    home = os.getenv("HOME", "")
    base = os.getenv("XDG_DATA_HOME", Path(home, ".local", "share"))
    path = Path(base, args.package)
    default_venvs = str(Path(path, "venvs"))
    default_bin = str(Path(path, "bin"))
    defaults = {"venvs": default_venvs, "bin": default_bin}

    p = Pipis()

    assert isinstance(p.config, dict)
    assert p.config == defaults
예제 #24
0
def test_uninstall(tmp_path):
    set_env(tmp_path)

    p = Pipis()
    args = Args()
    p.install(args)
    p.uninstall(args)
    venv_dir = p._venv_dir_path(args.package)
    package_bin = Path(venv_dir, "bin", args.package)

    assert not package_bin.exists()
예제 #25
0
def test_windows_defaults_config_paths():
    args = Args()
    sys_base = os.getenv("ProgramFiles")
    sys_path = str(
        Path(sys_base, args.package, "config", f"{args.package}.cfg"))
    user_base = user_base = os.getenv("APPDATA")
    user_path = str(
        Path(user_base, args.package, "config", f"{args.package}.cfg"))

    p = Pipis()

    assert isinstance(p.config_paths, list)
    assert p.config_paths[0] == sys_path
    assert p.config_paths[1] == user_path
예제 #26
0
def main():
    parser = argparse.ArgumentParser(prog="pipis", description=Pipis.__doc__)
    subparsers = parser.add_subparsers(title="available commands",
                                       dest="command")
    commands = Pipis()

    # globals arguments
    parser.add_argument("-v",
                        "--verbose",
                        action="store_true",
                        help="enable verbose ouput")

    # version command and arguments
    parser_version = subparsers.add_parser("version",
                                           help=commands.show_version.__doc__)
    parser_version.set_defaults(func=commands.show_version)

    # freeze command and arguments
    parser_freeze = subparsers.add_parser("freeze",
                                          help=commands.freeze.__doc__)
    parser_freeze.set_defaults(func=commands.freeze)

    # search command and arguments
    parser_search = subparsers.add_parser("search",
                                          help=commands.search.__doc__)
    parser_search.add_argument("query",
                               help="query name",
                               action="store",
                               type=str)
    parser_search.set_defaults(func=commands.search)

    # install command and arguments
    parser_install = subparsers.add_parser("install",
                                           help=commands.install.__doc__)
    parser_install.add_argument("package",
                                help="package name",
                                action="store",
                                type=str)
    parser_install.add_argument("-y",
                                "--yes",
                                action="store_true",
                                help="do not prompt for confirmation")
    parser_install.add_argument(
        "-d",
        "--dependency",
        help="add the specified package as dependency of the main package",
        metavar="package",
        action="store",
        type=str,
    )
    parser_install.add_argument(
        "-s",
        "--system",
        help=
        "give the virtual environment access to the system site-packages dir",
        action="store_true",
    )
    parser_install.add_argument(
        "-U",
        "--upgrade",
        help="upgrade package to the newest available version",
        action="store_true",
    )
    parser_install.add_argument(
        "-I",
        "--ignore-installed",
        help="ignore the installed packages (reinstalling instead)",
        action="store_true",
    )
    parser_install.set_defaults(func=commands.install)

    # update command and arguments
    parser_update = subparsers.add_parser("update",
                                          help=commands.update.__doc__)
    parser_update.add_argument("package",
                               help="package name",
                               action="store",
                               type=str)
    parser_update.add_argument("-y",
                               "--yes",
                               action="store_true",
                               help="do not prompt for confirmation")
    parser_update.set_defaults(func=commands.update)

    # uninstall command and arguments
    parser_uninstall = subparsers.add_parser("uninstall",
                                             help=commands.uninstall.__doc__)
    parser_uninstall.add_argument("package",
                                  help="package name",
                                  action="store",
                                  type=str)
    parser_uninstall.add_argument("-y",
                                  "--yes",
                                  action="store_true",
                                  help="do not prompt for confirmation")
    parser_uninstall.set_defaults(func=commands.uninstall)

    # parse and run
    args = parser.parse_args()
    args.func(args)
예제 #27
0
def test_show_version(tmp_path):
    p = Pipis()
    args = Args()
    message = p.show_version(args)

    assert message.startswith("pipis version: ")
예제 #28
0
def test_args_config():
    p = Pipis(config={"hello": 1, "world": 2})

    assert isinstance(p.config, dict)
    assert p.config["hello"] == 1
    assert p.config["world"] == 2
예제 #29
0
def test_args_config_paths():
    p = Pipis(config_paths=["hello", "world"])

    assert isinstance(p.config_paths, list)
    assert p.config_paths[0] == "hello"
    assert p.config_paths[1] == "world"