Source code for mypythontools_cicd.deploy.deploy_internal
"""Module with functions for 'deploy' subpackage."""
from __future__ import annotations
import os
from typing_extensions import Literal
from mypythontools.paths import validate_path, PathLike
from mypythontools.misc import delete_files, print_progress
from mypythontools.system import check_script_is_available, terminal_do_command, PYTHON
from mypythontools_cicd.project_paths import PROJECT_PATHS
from mypythontools_cicd.venvs import Venv
[docs]def deploy_to_pypi(
setup_path: None | PathLike = None,
clean: bool = True,
verbosity: Literal[0, 1, 2] = 1,
pep517: bool = False,
venv: None | Venv = Venv("venv"),
) -> None:
"""Publish python library to PyPi.
Username and password are set with env vars `TWINE_USERNAME` and `TWINE_PASSWORD`.
Note:
You need working `setup.py` file. If you want to see example, try the one from project-starter on
https://github.com/Malachov/mypythontools/blob/master/content/project-starter/setup.py
Args:
setup_path (None | PathLike, optional): Function suppose, that there is a setup.py somewhere in cwd.
If not, path will be inferred. Build and dist folders will be created in same directory.
Defaults to None.
clean (bool, optional): Whether delete created build and dist folders.
verbosity (Literal[0, 1, 2], optional): If 0, prints nothing, if 1, then one line description of what
happened is printed. If 3, all the results from terminal are printed. Defaults to 1.
pep517 (bool, optional): Whether using PEP 517, that use pyproject.toml to build distribution. Without
it it's faster, but with it, pyproject.TOML can be used. Defaults to False.
venv (None | Venv): Venv used for building distribution. Defaults to Venv("venv").
"""
print_progress("Deploying to PyPi", verbosity > 0)
verbose = verbosity == 2
usr = os.environ.get("TWINE_USERNAME")
password = os.environ.get("TWINE_PASSWORD")
if not usr or not password:
raise KeyError("Setup env vars TWINE_USERNAME and TWINE_PASSWORD to use deploy.")
check_script_is_available("twine", "twine")
setup_path = (
validate_path(setup_path, "Deploy with `deploy_to_pypi` failed", "setup.py")
if setup_path
else PROJECT_PATHS.root / "setup.py"
)
setup_dir_path = setup_path.parent
dist_path = setup_dir_path / "dist"
build_path = setup_dir_path / "build"
delete_files(dist_path)
delete_files(build_path)
activate_prefix_command = "" if not venv else venv.activate_prefix_command
if pep517:
build_command = f"{activate_prefix_command} {PYTHON} -m build --wheel --sdist"
else:
build_command = f"{activate_prefix_command} {PYTHON} setup.py sdist bdist_wheel"
terminal_do_command(
build_command,
cwd=setup_dir_path.as_posix(),
verbose=verbose,
error_header=(
"Build python distribution for PyPi deployment failed. Change of 'pep517' parameter may help."
),
)
command = "twine upload dist/*"
terminal_do_command(
command,
cwd=setup_dir_path.as_posix(),
verbose=verbose,
error_header="Deploying to PyPi failed.",
)
if clean:
delete_files(dist_path)
delete_files(build_path)