From 01bfdd74bda2cb0f4a98c26403f41083b56e2584 Mon Sep 17 00:00:00 2001 From: Ethan Paul <24588726+enpaul@users.noreply.github.com> Date: Fri, 23 Oct 2020 00:43:11 -0400 Subject: [PATCH 1/2] Add missing documentation for internal functions/constants --- tox_poetry_installer.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tox_poetry_installer.py b/tox_poetry_installer.py index 00dea23..ff76c51 100644 --- a/tox_poetry_installer.py +++ b/tox_poetry_installer.py @@ -52,6 +52,7 @@ _REPORTER_PREFIX = f"[{__title__}]:" _MAGIC_SUFFIX_MARKER = "@poetry" +# Map of package names to the package object PackageMap = Dict[str, PoetryPackage] @@ -136,6 +137,11 @@ def _install_to_venv( :param venv: Tox virtual environment to install the packages to :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( env=PoetryVirtualEnv(path=Path(venv.envconfig.envdir)), io=PoetryNullIO(), @@ -191,6 +197,15 @@ def _find_transients(packages: PackageMap, dependency_name: str) -> Set[PoetryPa def _install_env_dependencies( 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) dependencies: List[PoetryPackage] = [] @@ -220,6 +235,14 @@ def _install_env_dependencies( def _install_package_dependencies( 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( f"{_REPORTER_PREFIX} performing installation of project dependencies" ) From de4c3515ecf9bf163d9a10e5b0f961c79bd852dd Mon Sep 17 00:00:00 2001 From: Ethan Paul <24588726+enpaul@users.noreply.github.com> Date: Fri, 23 Oct 2020 00:59:43 -0400 Subject: [PATCH 2/2] Refactor to maintain consistent terminology With a dozen different "dependency" types, consistent naming is critical --- tox_poetry_installer.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/tox_poetry_installer.py b/tox_poetry_installer.py index ff76c51..f13ce9c 100644 --- a/tox_poetry_installer.py +++ b/tox_poetry_installer.py @@ -1,9 +1,24 @@ """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 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. + +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 ``. +* "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 typing import Dict @@ -119,10 +134,10 @@ def _sort_env_deps(venv: ToxVirtualEnv) -> _SortedEnvDeps: unlocked_deps.append(dep) 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( - 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) @@ -172,7 +187,7 @@ def _find_transients(packages: PackageMap, dependency_name: str) -> Set[PoetryPa def find_deps_of_deps(name: str) -> List[PoetryPackage]: if name in PoetryProvider.UNSAFE_PACKAGES: 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 [] transients = [packages[name]] @@ -218,7 +233,7 @@ def _install_env_dependencies( raise err 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( @@ -232,7 +247,7 @@ def _install_env_dependencies( _install_to_venv(poetry, venv, dependencies) -def _install_package_dependencies( +def _install_project_dependencies( venv: ToxVirtualEnv, poetry: Poetry, packages: PackageMap ): """Install the dependencies of the project package @@ -271,7 +286,7 @@ def _install_package_dependencies( raise err 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( @@ -356,4 +371,4 @@ def tox_testenv_install_deps(venv: ToxVirtualEnv, action: ToxAction): ) return - _install_package_dependencies(venv, poetry, package_map) + _install_project_dependencies(venv, poetry, package_map)