Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
verbose: bool,
include_apps: bool,
include_dependencies: bool,
force: bool,
):
if not venv_dir.exists() or not next(venv_dir.iterdir()):
raise PipxError(
textwrap.dedent(
f"""\
Can't inject {package!r} into nonexistent Virtual Environment {str(venv_dir)!r}.
Be sure to install the package first with pipx install {venv_dir.name!r}
before injecting into it."""
)
)
venv = Venv(venv_dir, verbose=verbose)
try:
venv.install_package(
package=package,
package_or_url=package_or_url,
pip_args=pip_args,
include_dependencies=include_dependencies,
include_apps=include_apps,
is_main_package=False,
)
except PackageInstallFailureError:
raise PipxError(
f"Could not inject package {package}. Is the name or spec correct?"
)
if include_apps:
_run_post_install_actions(
venv,
def uninstall(venv_dir: Path, package: str, local_bin_dir: Path, verbose: bool):
"""Uninstall entire venv_dir, including main package and all injected
packages.
"""
if not venv_dir.exists():
print(f"Nothing to uninstall for {package} 😴")
app = which(package)
if app:
print(
f"{hazard} Note: '{app}' still exists on your system and is on your PATH"
)
return
venv = Venv(venv_dir, verbose=verbose)
if venv.pipx_metadata.main_package is not None:
app_paths: List[Path] = []
for viewed_package in venv.package_metadata.values():
app_paths += viewed_package.app_paths
for dep_paths in viewed_package.app_paths_of_dependencies.values():
app_paths += dep_paths
else:
# fallback if not metadata from pipx_metadata.json
if venv.python_path.is_file():
# has a valid python interpreter and can get metadata about the package
metadata = venv.get_venv_metadata_for_package(package)
app_paths = metadata.app_paths
for dep_paths in metadata.app_paths_of_dependencies.values():
app_paths += dep_paths
else:
exists = venv_dir.exists() and next(venv_dir.iterdir())
except StopIteration:
exists = False
if exists:
if force:
print(f"Installing to existing directory {str(venv_dir)!r}")
else:
print(
f"{package!r} already seems to be installed. "
f"Not modifying existing installation in {str(venv_dir)!r}. "
"Pass '--force' to force installation."
)
return
venv = Venv(venv_dir, python=python, verbose=verbose)
try:
venv.create_venv(venv_args, pip_args)
try:
venv.install_package(
package=package,
package_or_url=package_or_url,
pip_args=pip_args,
include_dependencies=include_dependencies,
include_apps=True,
is_main_package=True,
)
except PackageInstallFailureError:
venv.remove_venv()
raise PipxError(
f"Could not install package {package}. Is the name or spec correct?"
)
def get_package_summary(
path: Path, *, package: str = None, new_install: bool = False
) -> str:
venv = Venv(path)
python_path = venv.python_path.resolve()
if package is None:
package = path.name
if not python_path.is_file():
return f" package {red(bold(package))} has invalid interpreter {str(python_path)}"
package_metadata = venv.package_metadata[package]
if package_metadata.package_version is None:
not_installed = red("is not installed")
return f" package {bold(package)} {not_installed} in the venv {str(path)}"
apps = package_metadata.apps + package_metadata.apps_of_dependencies
exposed_app_paths = _get_exposed_app_paths_for_package(
venv.bin_path, apps, constants.LOCAL_BIN_DIR
)
package: str,
pip_args: List[str],
verbose: bool,
*,
upgrading_all: bool,
force: bool,
) -> int:
"""Returns nonzero if package was upgraded, 0 if version did not change"""
if not venv_dir.is_dir():
raise PipxError(
f"Package is not installed. Expected to find {str(venv_dir)}, "
"but it does not exist."
)
venv = Venv(venv_dir, verbose=verbose)
package_metadata = venv.package_metadata[package]
if package_metadata.package_or_url is not None:
package_or_url = package_metadata.package_or_url
old_version = package_metadata.package_version
include_apps = package_metadata.include_apps
include_dependencies = package_metadata.include_dependencies
else:
# fallback if no metadata
package_or_url = package
old_version = ""
include_apps = True
include_dependencies = False
if package == "pipx":
package_or_url = "pipx"
def upgrade_all(
venv_container: VenvContainer, verbose: bool, *, skip: List[str], force: bool
):
packages_upgraded = 0
num_packages = 0
for venv_dir in venv_container.iter_venv_dirs():
num_packages += 1
package = venv_dir.name
venv = Venv(venv_dir, verbose=verbose)
if package in skip:
continue
try:
packages_upgraded += upgrade(
venv_dir,
package,
venv.pipx_metadata.main_package.pip_args,
verbose,
upgrading_all=True,
force=force,
)
except Exception:
logging.error(f"Error encountered when upgrading {package}")
if packages_upgraded == 0:
def run_pip(package: str, venv_dir: Path, pip_args: List[str], verbose: bool):
venv = Venv(venv_dir, verbose=verbose)
if not venv.python_path.exists():
raise PipxError(
f"venv for {package!r} was not found. Was {package!r} installed with pipx?"
)
venv.verbose = True
venv._run_pip(pip_args)