Merge pull request #15 from enpaul/enp/housekeeping

Some housekeeping changes
This commit is contained in:
Ethan Paul 2020-10-23 10:02:45 -04:00 committed by GitHub
commit 653622fd35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,9 +1,24 @@
"""Tox plugin for installing environments using Poetry """Tox plugin for installing environments using Poetry
This plugin makes use of the ``tox_testenv_install_deps`` Tox plugin hook to replace the default This plugin makes use of the ``tox_testenv_install_deps`` Tox plugin hook to augment the default
installation functionality to install dependencies from the Poetry lockfile for the project. It installation functionality to install dependencies from the Poetry lockfile for the project. It
does this by using ``poetry`` to read in the lockfile, identify necessary dependencies, and then does this by using ``poetry`` to read in the lockfile, identify necessary dependencies, and then
use Poetry's ``PipInstaller`` class to install those packages into the Tox environment. use Poetry's ``PipInstaller`` class to install those packages into the Tox environment.
Quick definition of terminology:
* "project package" - the package that Tox is testing, usually the one the current project is
is developing; definitionally, this is the package that is built by Tox in the ``.package`` env.
* "project package dependency" or "project dependency" - a dependency required by the project
package for installation; i.e. a package that would be installed when running
``pip install <project package>``.
* "environment dependency" - a dependency specified for a given testenv in the Tox configuration.
* "locked dependency" - a package that is present in the Poetry lockfile and will be installed
according to the metadata in the lockfile.
* "unlocked dependency" - a package that is either not present in the Poetry lockfile or is not
specified to be installed according to the metadata in the lockfile.
* "transiety dependency" - a package not explicitly specified for installation, but required by a
package that is explicitly specified.
""" """
from pathlib import Path from pathlib import Path
from typing import Dict from typing import Dict
@ -52,6 +67,7 @@ _REPORTER_PREFIX = f"[{__title__}]:"
_MAGIC_SUFFIX_MARKER = "@poetry" _MAGIC_SUFFIX_MARKER = "@poetry"
# Map of package names to the package object
PackageMap = Dict[str, PoetryPackage] PackageMap = Dict[str, PoetryPackage]
@ -118,10 +134,10 @@ def _sort_env_deps(venv: ToxVirtualEnv) -> _SortedEnvDeps:
unlocked_deps.append(dep) unlocked_deps.append(dep)
reporter.verbosity1( reporter.verbosity1(
f"{_REPORTER_PREFIX} identified {len(locked_deps)} locked env dependencies for installation from poetry lockfile: {[item.name for item in locked_deps]}" f"{_REPORTER_PREFIX} identified {len(locked_deps)} locked env dependencies: {[item.name for item in locked_deps]}"
) )
reporter.verbosity1( reporter.verbosity1(
f"{_REPORTER_PREFIX} identified {len(unlocked_deps)} unlocked env dependencies for installation using default backend: {[item.name for item in unlocked_deps]}" f"{_REPORTER_PREFIX} identified {len(unlocked_deps)} unlocked env dependencies: {[item.name for item in unlocked_deps]}"
) )
return _SortedEnvDeps(locked_deps=locked_deps, unlocked_deps=unlocked_deps) return _SortedEnvDeps(locked_deps=locked_deps, unlocked_deps=unlocked_deps)
@ -136,6 +152,11 @@ def _install_to_venv(
:param venv: Tox virtual environment to install the packages to :param venv: Tox virtual environment to install the packages to
:param packages: List of packages to install to the virtual environment :param packages: List of packages to install to the virtual environment
""" """
reporter.verbosity1(
f"{_REPORTER_PREFIX} Installing {len(packages)} packages to environment at {venv.envconfig.envdir}"
)
installer = PoetryPipInstaller( installer = PoetryPipInstaller(
env=PoetryVirtualEnv(path=Path(venv.envconfig.envdir)), env=PoetryVirtualEnv(path=Path(venv.envconfig.envdir)),
io=PoetryNullIO(), io=PoetryNullIO(),
@ -166,7 +187,7 @@ def _find_transients(packages: PackageMap, dependency_name: str) -> Set[PoetryPa
def find_deps_of_deps(name: str) -> List[PoetryPackage]: def find_deps_of_deps(name: str) -> List[PoetryPackage]:
if name in PoetryProvider.UNSAFE_PACKAGES: if name in PoetryProvider.UNSAFE_PACKAGES:
reporter.warning( reporter.warning(
f"{_REPORTER_PREFIX} installing '{name}' using Poetry is not supported; skipping" f"{_REPORTER_PREFIX} installing package '{name}' using Poetry is not supported; skipping installation of package '{name}'"
) )
return [] return []
transients = [packages[name]] transients = [packages[name]]
@ -191,6 +212,15 @@ def _find_transients(packages: PackageMap, dependency_name: str) -> Set[PoetryPa
def _install_env_dependencies( def _install_env_dependencies(
venv: ToxVirtualEnv, poetry: Poetry, packages: PackageMap venv: ToxVirtualEnv, poetry: Poetry, packages: PackageMap
): ):
"""Install the packages for a specified testenv
Processes the tox environment config, identifies any locked environment dependencies, pulls
them from the lockfile, and installs them to the virtual environment.
:param venv: Tox virtual environment to install the packages to
:param poetry: Poetry object the packages were sourced from
:param packages: Mapping of package names to the corresponding package object
"""
env_deps = _sort_env_deps(venv) env_deps = _sort_env_deps(venv)
dependencies: List[PoetryPackage] = [] dependencies: List[PoetryPackage] = []
@ -203,7 +233,7 @@ def _install_env_dependencies(
raise err raise err
reporter.verbosity1( reporter.verbosity1(
f"{_REPORTER_PREFIX} identified {len(dependencies)} actual dependencies from {len(venv.envconfig.deps)} specified env dependencies" f"{_REPORTER_PREFIX} identified {len(dependencies)} total dependencies from {len(venv.envconfig.deps)} env dependencies"
) )
reporter.verbosity1( reporter.verbosity1(
@ -217,9 +247,17 @@ def _install_env_dependencies(
_install_to_venv(poetry, venv, dependencies) _install_to_venv(poetry, venv, dependencies)
def _install_package_dependencies( def _install_project_dependencies(
venv: ToxVirtualEnv, poetry: Poetry, packages: PackageMap venv: ToxVirtualEnv, poetry: Poetry, packages: PackageMap
): ):
"""Install the dependencies of the project package
Install all primary dependencies of the project package.
:param venv: Tox virtual environment to install the packages to
:param poetry: Poetry object the packages were sourced from
:param packages: Mapping of package names to the corresponding package object
"""
reporter.verbosity1( reporter.verbosity1(
f"{_REPORTER_PREFIX} performing installation of project dependencies" f"{_REPORTER_PREFIX} performing installation of project dependencies"
) )
@ -248,7 +286,7 @@ def _install_package_dependencies(
raise err raise err
reporter.verbosity1( reporter.verbosity1(
f"{_REPORTER_PREFIX} identified {len(dependencies)} dependencies of project '{poetry.package.name}'" f"{_REPORTER_PREFIX} identified {len(dependencies)} total dependencies from {len(poetry.package.requires)} project dependencies"
) )
reporter.verbosity0( reporter.verbosity0(
@ -333,4 +371,4 @@ def tox_testenv_install_deps(venv: ToxVirtualEnv, action: ToxAction):
) )
return return
_install_package_dependencies(venv, poetry, package_map) _install_project_dependencies(venv, poetry, package_map)