24 Commits
0.8.1 ... 0.8.3

Author SHA1 Message Date
7400d1e3cd Update copyright for the new year 2022-01-05 02:20:46 -05:00
a7e5020d5f Update changelog with 0.8.3 2022-01-05 02:20:17 -05:00
015915adf7 Bump patch version for 3.10 classifier 2022-01-05 02:18:53 -05:00
a457cb99d2 Merge pull request #67 from enpaul/enp/ci
Update CI
2022-01-05 02:17:28 -05:00
1004a247b1 Remove tox version test requirement from stable feature list 2022-01-05 02:12:02 -05:00
f1f7a63774 Add toml typing stubs
Fix typing errors with new version of mypy
2022-01-05 02:12:02 -05:00
087db95c43 Update toxfile
Wrap long lines to improve readability
Update safety command to use --json flag instead of --bare flag
Update security env to skip package install
2022-01-05 02:12:02 -05:00
bb0db0fa1d Add python 3.10 classifier 2022-01-05 02:12:02 -05:00
6ac16a5c4d Update CI structure
Use new install-poetry script
Set path to include poetry directory
Use native poetry env management
2022-01-05 02:12:02 -05:00
7f8d27709a Update black to latest beta 2022-01-05 01:00:34 -05:00
17a2e5af64 Fix usage of installed poetry version in CI 2021-12-04 12:49:15 -05:00
c05187f2e6 Update CI poetry installation to use new install-poetry script 2021-12-04 11:57:29 -05:00
5ccc56956b Fix misinterpreted 3.10 version string as float 2021-12-04 11:45:16 -05:00
dae91a3a69 Update lockfile 2021-12-04 11:38:30 -05:00
2f35d83363 Add python3.10 to CI tests 2021-12-04 11:34:36 -05:00
bba0c54b70 Fix outdated documentation
Remove reference to deprecated --require-poetry option
Update developer docs to note that py3.7 or later is required
2021-12-04 11:33:24 -05:00
9d4e6d76fd Update changelog with bugfix for #65 2021-10-28 20:24:20 -04:00
68af3a1075 Update license for new year
Update formatting
2021-10-28 20:21:41 -04:00
6384f289aa Update docs with new error 2021-10-28 20:21:03 -04:00
1f6550e77c Fix error when package under test depends directly on unsafe dependencies
Fixes #65
2021-10-28 20:09:56 -04:00
c322e68371 Merge pull request #63 from 9999years/more-install-logging
Add logging for package installation completion
2021-10-28 19:53:20 -04:00
Rebecca Turner
603cca6fd9 Update version to 0.8.2 2021-10-18 16:26:56 -04:00
Rebecca Turner
1478e35c0b Add logging for package installation completion
Currently, tox-poetry-installer logs when it submits a dependency to the
(possibly-parallel) executor for installation, but not when the
installation is finished; this commit adds a log message when the
installation actually starts (in contrast with when the job is queued)
and a log message when the installation completes, along with the wall
time it took.

Rationale: I've noticed in some cases when running under Python 3.10
packages take much longer to install -- this logging should help
pinpoint culprits.
2021-07-07 15:27:46 -04:00
3c0b76a30f Update changelog with 0.8.1 2021-06-16 22:47:19 -04:00
13 changed files with 806 additions and 684 deletions

View File

@@ -7,66 +7,29 @@
set -e; set -e;
# ##### Prereqs #####
#
# Set global vars for usage in the script, create the cache directory so we can rely
# on that existing, then dump some diagnostic info for later reference.
#
CI_VENV=$HOME/ci;
CI_CACHE=$HOME/.cache; CI_CACHE=$HOME/.cache;
CI_CACHE_GET_POETRY="$CI_CACHE/get-poetry.py"; POETRY_VERSION=1.1.12;
CI_POETRY=$HOME/.poetry/bin/poetry;
CI_VENV_PIP="$CI_VENV/bin/pip";
CI_VENV_PIP_VERSION=19.3.1;
CI_VENV_TOX="$CI_VENV/bin/tox";
mkdir --parents "$CI_CACHE"; mkdir --parents "$CI_CACHE";
command -v python; command -v python;
python --version; python --version;
# ##### Install Poetry ##### curl --location https://install.python-poetry.org \
# --output "$CI_CACHE/install-poetry.py" \
# Download the poetry install script to the cache directory and then install poetry.
# After dump the poetry version for later reference.
#
curl https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py \
--output "$CI_CACHE_GET_POETRY" \
--silent \ --silent \
--show-error \ --show-error;
--location; python "$CI_CACHE/install-poetry.py" \
python "$CI_CACHE_GET_POETRY" --yes 1>/dev/null; --version "$POETRY_VERSION" \
--yes;
poetry --version --no-ansi;
poetry run pip --version;
python "$CI_POETRY" --version --no-ansi; poetry install \
# ##### Setup Runtime Venv #####
#
# Create a virtual environment for poetry to use, upgrade pip in that venv to a pinned
# version, then install the current project to the venv.
#
# Note 1: Poetry, Tox, and this project plugin all use pip under the hood for package
# installation. This means that even though we are creating up to eight venvs
# during a given CI run they all share the same download cache.
# Note 2: The "VIRTUAL_ENV=$CI_VENV" prefix on the poetry commands below sets the venv
# that poetry will use for operations. There is no CLI flag for poetry that
# directs it to use a given environment, but if it finds itself in an existing
# environment it will use it and skip environment creation.
#
python -m venv "$CI_VENV";
$CI_VENV_PIP install "pip==$CI_VENV_PIP_VERSION" \
--upgrade \
--quiet;
VIRTUAL_ENV=$CI_VENV "$CI_POETRY" install \
--extras poetry \ --extras poetry \
--quiet \ --quiet \
--no-ansi \ --remove-untracked \
&>/dev/null; --no-ansi;
# ##### Print Debug Info ##### poetry env info;
# poetry run tox --version;
# Print the pip and tox versions (which will include registered plugins)
#
$CI_VENV_PIP --version;
echo "tox $($CI_VENV_TOX --version)";

View File

@@ -11,22 +11,24 @@ jobs:
strategy: strategy:
matrix: matrix:
python: python:
- version: 3.6 - version: "3.6"
toxenv: py36 toxenv: py36
- version: 3.7 - version: "3.7"
toxenv: py37 toxenv: py37
- version: 3.8 - version: "3.8"
toxenv: py38 toxenv: py38
- version: 3.9 - version: "3.9"
toxenv: py39 toxenv: py39
- version: "3.10"
toxenv: py310
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup:python${{ matrix.python.version }} - name: Install Python ${{ matrix.python.version }}
uses: actions/setup-python@v1 uses: actions/setup-python@v1
with: with:
python-version: ${{ matrix.python.version }} python-version: ${{ matrix.python.version }}
- name: Setup:cache - name: Configure Job Cache
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: | path: |
@@ -37,20 +39,22 @@ jobs:
# will be invalidated, and thus all packages will be redownloaded, if the # will be invalidated, and thus all packages will be redownloaded, if the
# lockfile is updated # lockfile is updated
key: ${{ runner.os }}-${{ matrix.python.toxenv }}-${{ hashFiles('**/poetry.lock') }} key: ${{ runner.os }}-${{ matrix.python.toxenv }}-${{ hashFiles('**/poetry.lock') }}
- name: Setup:env - name: Configure Path
run: echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Configure Environment
run: .github/scripts/setup-env.sh run: .github/scripts/setup-env.sh
- name: Run:${{ matrix.python.toxenv }} - name: Run Toxenv ${{ matrix.python.toxenv }}
run: $HOME/ci/bin/tox -e ${{ matrix.python.toxenv }} run: poetry run tox -e ${{ matrix.python.toxenv }}
Check: Check:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup:python3.8 - name: Install Python 3.8
uses: actions/setup-python@v1 uses: actions/setup-python@v1
with: with:
python-version: 3.8 python-version: 3.8
- name: Setup:cache - name: Configure Job Cache
uses: actions/cache@v2 uses: actions/cache@v2
with: with:
path: | path: |
@@ -60,11 +64,13 @@ jobs:
# Hardcoded 'py38' slug here lets this cache piggyback on the 'py38' cache # Hardcoded 'py38' slug here lets this cache piggyback on the 'py38' cache
# that is generated for the tests above # that is generated for the tests above
key: ${{ runner.os }}-py38-${{ hashFiles('**/poetry.lock') }} key: ${{ runner.os }}-py38-${{ hashFiles('**/poetry.lock') }}
- name: Setup:env - name: Configure Path
run: echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Configure Environment
run: .github/scripts/setup-env.sh run: .github/scripts/setup-env.sh
- name: Run:static - name: Run Static Analysis Checks
run: $HOME/ci/bin/tox -e static run: poetry run tox -e static
- name: Run:static-tests - name: Run Static Analysis Checks (Tests)
run: $HOME/ci/bin/tox -e static-tests run: poetry run tox -e static-tests
- name: Run:security - name: Run Security Checks
run: $HOME/ci/bin/tox -e security run: poetry run tox -e security

View File

@@ -2,6 +2,34 @@
See also: [Github Release Page](https://github.com/enpaul/tox-poetry-installer/releases). See also: [Github Release Page](https://github.com/enpaul/tox-poetry-installer/releases).
## Version 0.8.3
View this release on:
[Github](https://github.com/enpaul/tox-poetry-installer/releases/tag/0.8.3),
[PyPI](https://pypi.org/project/tox-poetry-installer/0.8.3/)
- Add PyPI classifier for Python 3.10 compatibility
## Version 0.8.2
View this release on:
[Github](https://github.com/enpaul/tox-poetry-installer/releases/tag/0.8.2),
[PyPI](https://pypi.org/project/tox-poetry-installer/0.8.2/)
- Improve debug-level logging for package installation, and time how long installing each
package takes. Contributed by [Rebecca
Turner](https://github.com/9999years).
- Fix crash caused by the package-under-test depending on Poetry's unsafe dependencies ([#65](https://github.com/enpaul/tox-poetry-installer/issues/65))
## Version 0.8.1
View this release on:
[Github](https://github.com/enpaul/tox-poetry-installer/releases/tag/0.8.1),
[PyPI](https://pypi.org/project/tox-poetry-installer/0.8.1/)
- Fix unintuitive behavior of the `install_project_deps` option by ensuring the specified
value always causes the implied action
## Version 0.8.0 ## Version 0.8.0
View this release on: View this release on:

View File

@@ -1,4 +1,4 @@
## Copyright 2020 Ethan Paul ## Copyright 2020, 2022 Ethan Paul
Permission is hereby granted, free of charge, to any person obtaining a copy of this Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software software and associated documentation files (the "Software"), to deal in the Software
@@ -9,4 +9,9 @@ to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software. substantial portions of the Software.
**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View File

@@ -231,6 +231,7 @@ error will be set to one of the "Status" values below to indicate what the error
| `LockedDepNotFoundError` | Indicates that an item specified in the `locked_deps` config option does not match the name of a package in the Poetry lockfile. | | `LockedDepNotFoundError` | Indicates that an item specified in the `locked_deps` config option does not match the name of a package in the Poetry lockfile. |
| `LockedDepsRequiredError` | Indicates that a test environment with the `require_locked_deps` config option set to `true` also specified unlocked dependencies using the [`deps`](https://tox.readthedocs.io/en/latest/config.html#conf-deps) config option. | | `LockedDepsRequiredError` | Indicates that a test environment with the `require_locked_deps` config option set to `true` also specified unlocked dependencies using the [`deps`](https://tox.readthedocs.io/en/latest/config.html#conf-deps) config option. |
| `PoetryNotInstalledError` | Indicates that the `poetry` module could not be imported under the current runtime environment, and the `--require-poetry` flag was provided. | | `PoetryNotInstalledError` | Indicates that the `poetry` module could not be imported under the current runtime environment, and the `--require-poetry` flag was provided. |
| `RequiresUnsafeDepError` | Indicates that the package-under-test depends on a package that Poetry has classified as unsafe and cannot be installed. |
> **Note:** One or more of these errors can be caused by the `pyproject.toml` being out of > **Note:** One or more of these errors can be caused by the `pyproject.toml` being out of
> sync with the Poetry lockfile. If this is the case, than a warning will be logged when Tox > sync with the Poetry lockfile. If this is the case, than a warning will be logged when Tox
@@ -329,9 +330,9 @@ python -c '\
' '
``` ```
> **Note:** To force Tox to fail if Poetry is not installed, run the `tox` command with the > **Note:** To force Tox to fail if Poetry is not installed, add the `require_poetry = true`
> `--require-poetry` option. See the [Runtime Options](#runtime-options) for more > option to the tox `[testenv]` configuration. See the
> information. > [Config Options](#configuration-options) for more information.
## Developer Documentation ## Developer Documentation
@@ -351,8 +352,8 @@ are tracked on [Github](https://github.com/enpaul/tox-poetry-installer/releases)
[fork the repository](https://docs.github.com/en/enterprise/2.20/user/github/getting-started-with-github/fork-a-repo) [fork the repository](https://docs.github.com/en/enterprise/2.20/user/github/getting-started-with-github/fork-a-repo)
and [open a pull request](https://github.com/enpaul/tox-poetry-installer/compare). and [open a pull request](https://github.com/enpaul/tox-poetry-installer/compare).
Developing this project requires at least [Python 3.6](https://www.python.org/downloads/) Developing this project requires [Python 3.7+](https://www.python.org/downloads/) and
and at least [Poetry 1.0](https://python-poetry.org/docs/#installation). GNU Make can [Poetry 1.0](https://python-poetry.org/docs/#installation) or later. GNU Make can
optionally be used to quickly setup a local development environment, but this is not optionally be used to quickly setup a local development environment, but this is not
required. required.
@@ -425,6 +426,6 @@ Everything in Beta plus...
- [ ] Fully replace dependency on `poetry` with dependency on `poetry-core` ([#2](https://github.com/enpaul/tox-poetry-installer/issues/2)) - [ ] Fully replace dependency on `poetry` with dependency on `poetry-core` ([#2](https://github.com/enpaul/tox-poetry-installer/issues/2))
- [x] Add comprehensive unit tests - [x] Add comprehensive unit tests
- [ ] Add tests for each feature version of Tox between 3.8 and 3.20 - [ ] ~Add tests for each feature version of Tox between 3.8 and 3.20~
- [x] Add tests for Python-3.6, 3.7, 3.8, and 3.9 - [x] Add tests for Python-3.6, 3.7, 3.8, and 3.9
- [x] Add Github Actions based CI - [x] Add Github Actions based CI

1238
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "tox-poetry-installer" name = "tox-poetry-installer"
version = "0.8.1" version = "0.8.3"
license = "MIT" license = "MIT"
authors = ["Ethan Paul <24588726+enpaul@users.noreply.github.com>"] authors = ["Ethan Paul <24588726+enpaul@users.noreply.github.com>"]
description = "A plugin for Tox that lets you install test environment dependencies from the Poetry lockfile" description = "A plugin for Tox that lets you install test environment dependencies from the Poetry lockfile"
@@ -27,6 +27,7 @@ classifiers = [
"Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: CPython",
] ]
@@ -44,10 +45,12 @@ tox = "^3.8.0"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
bandit = "^1.6.2" bandit = "^1.6.2"
black = { version = "^20.8b1", allow-prereleases = true } black = {version = "^21.12b0", allow-prereleases = true, python = "^3.7"}
blacken-docs = "^1.8.0" blacken-docs = "^1.8.0"
ipython = { version = "^7.18.1", python = "^3.7" } ipython = { version = "^7.18.1", python = "^3.7" }
mypy = "^0.782" mdformat = "^0.6"
mdformat-gfm = "^0.2"
mypy = "^0.930"
pre-commit = "^2.7.1" pre-commit = "^2.7.1"
pre-commit-hooks = "^3.3.0" pre-commit-hooks = "^3.3.0"
pylint = "^2.4.4" pylint = "^2.4.4"
@@ -57,8 +60,7 @@ reorder-python-imports = "^2.3.5"
safety = "^1.9.0" safety = "^1.9.0"
toml = "^0.10.1" toml = "^0.10.1"
tox = "^3.20.0" tox = "^3.20.0"
mdformat = "^0.6.4" types-toml = "^0.10.1"
mdformat-gfm = "^0.2"
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["poetry-core>=1.0.0"]

View File

@@ -20,19 +20,16 @@ def test_exclude_unsafe():
assert Provider.UNSAFE_PACKAGES == constants.UNSAFE_PACKAGES assert Provider.UNSAFE_PACKAGES == constants.UNSAFE_PACKAGES
for dep in constants.UNSAFE_PACKAGES: for dep in constants.UNSAFE_PACKAGES:
assert utilities.identify_transients(dep, dict(), None) == [] assert not utilities.identify_transients(dep, {}, None)
def test_allow_missing(): def test_allow_missing():
"""Test that the ``allow_missing`` parameter works as expected""" """Test that the ``allow_missing`` parameter works as expected"""
with pytest.raises(exceptions.LockedDepNotFoundError): with pytest.raises(exceptions.LockedDepNotFoundError):
utilities.identify_transients("luke-skywalker", dict(), None) utilities.identify_transients("luke-skywalker", {}, None)
assert ( assert not utilities.identify_transients(
utilities.identify_transients( "darth-vader", {}, None, allow_missing=["darth-vader"]
"darth-vader", dict(), None, allow_missing=["darth-vader"]
)
== []
) )
@@ -51,7 +48,7 @@ def test_exclude_pep508():
"=>foo", "=>foo",
]: ]:
with pytest.raises(exceptions.LockedDepVersionConflictError): with pytest.raises(exceptions.LockedDepVersionConflictError):
utilities.identify_transients(version, dict(), None) utilities.identify_transients(version, {}, None)
def test_functional(mock_poetry_factory, mock_venv): def test_functional(mock_poetry_factory, mock_venv):

46
tox.ini
View File

@@ -1,5 +1,5 @@
[tox] [tox]
envlist = py36, py37, py38, py39, static, static-tests, security envlist = py36, py37, py38, py39, py310, static, static-tests, security
isolated_build = true isolated_build = true
skip_missing_interpreters = true skip_missing_interpreters = true
@@ -14,7 +14,10 @@ locked_deps =
pytest-cov pytest-cov
toml toml
commands = commands =
pytest --cov {toxinidir}/tox_poetry_installer --cov-config {toxinidir}/.coveragerc --cov-report term-missing {toxinidir}/tests/ pytest {toxinidir}/tests/ \
--cov {toxinidir}/tox_poetry_installer \
--cov-config {toxinidir}/.coveragerc \
--cov-report term-missing
[testenv:static] [testenv:static]
description = Static formatting and quality enforcement description = Static formatting and quality enforcement
@@ -31,10 +34,15 @@ locked_deps =
pre-commit pre-commit
pre-commit-hooks pre-commit-hooks
pylint pylint
types-toml
commands = commands =
pre-commit run --all-files pre-commit run \
pylint --rcfile {toxinidir}/.pylintrc {toxinidir}/tox_poetry_installer/ --all-files
mypy --ignore-missing-imports --no-strict-optional {toxinidir}/tox_poetry_installer/ pylint {toxinidir}/tox_poetry_installer/ \
--rcfile {toxinidir}/.pylintrc
mypy {toxinidir}/tox_poetry_installer/ \
--ignore-missing-imports \
--no-strict-optional
[testenv:static-tests] [testenv:static-tests]
description = Static formatting and quality enforcement for the tests description = Static formatting and quality enforcement for the tests
@@ -45,21 +53,37 @@ locked_deps =
pylint pylint
pytest pytest
mypy mypy
types-toml
commands = commands =
pylint --rcfile {toxinidir}/.pylintrc {toxinidir}/tests/ pylint {toxinidir}/tests/ \
mypy --ignore-missing-imports --no-strict-optional {toxinidir}/tests/ --rcfile {toxinidir}/.pylintrc
mypy {toxinidir}/tests/ \
--ignore-missing-imports \
--no-strict-optional
[testenv:security] [testenv:security]
description = Security checks description = Security checks
basepython = python3.8 basepython = python3.8
platform = linux platform = linux
ignore_errors = true ignore_errors = true
skip_install = true
locked_deps = locked_deps =
bandit bandit
safety safety
poetry poetry
commands = commands =
bandit --recursive --quiet {toxinidir}/tox_poetry_installer/ bandit {toxinidir}/tox_poetry_installer/ \
bandit --recursive --quiet --skip B101 {toxinidir}/tests/ --recursive \
poetry export --format requirements.txt --output {envtmpdir}/requirements.txt --without-hashes --dev --quiet
safety check --bare --file {envtmpdir}/requirements.txt bandit {toxinidir}/tests/ \
--recursive \
--quiet \
--skip B101
poetry export \
--format requirements.txt \
--output {envtmpdir}/requirements.txt \
--without-hashes \
--dev
safety check \
--file {envtmpdir}/requirements.txt \
--json

View File

@@ -1,7 +1,7 @@
# pylint: disable=missing-docstring # pylint: disable=missing-docstring
__title__ = "tox-poetry-installer" __title__ = "tox-poetry-installer"
__summary__ = "A plugin for Tox that lets you install test environment dependencies from the Poetry lockfile" __summary__ = "A plugin for Tox that lets you install test environment dependencies from the Poetry lockfile"
__version__ = "0.8.1" __version__ = "0.8.3"
__url__ = "https://github.com/enpaul/tox-poetry-installer/" __url__ = "https://github.com/enpaul/tox-poetry-installer/"
__license__ = "MIT" __license__ = "MIT"
__authors__ = ["Ethan Paul <24588726+enpaul@users.noreply.github.com>"] __authors__ = ["Ethan Paul <24588726+enpaul@users.noreply.github.com>"]

View File

@@ -11,6 +11,7 @@ All exceptions should inherit from the common base exception :exc:`ToxPoetryInst
+-- LockedDepNotFoundError +-- LockedDepNotFoundError
+-- ExtraNotFoundError +-- ExtraNotFoundError
+-- LockedDepsRequiredError +-- LockedDepsRequiredError
+-- RequiresUnsafeDepError
""" """
@@ -41,3 +42,7 @@ class ExtraNotFoundError(ToxPoetryInstallerException):
class LockedDepsRequiredError(ToxPoetryInstallerException): class LockedDepsRequiredError(ToxPoetryInstallerException):
"""Environment cannot specify unlocked dependencies when locked dependencies are required""" """Environment cannot specify unlocked dependencies when locked dependencies are required"""
class RequiresUnsafeDepError(ToxPoetryInstallerException):
"""Package under test depends on an unsafe dependency and cannot be installed"""

View File

@@ -5,6 +5,7 @@
import concurrent.futures import concurrent.futures
import contextlib import contextlib
import typing import typing
from datetime import datetime
from typing import Sequence from typing import Sequence
from typing import Set from typing import Set
@@ -46,6 +47,13 @@ def install(
installed: Set[PoetryPackage] = set() installed: Set[PoetryPackage] = set()
def logged_install(dependency: PoetryPackage) -> None:
start = datetime.now()
logger.debug(f"Installing {dependency}")
pip.install(dependency)
end = datetime.now()
logger.debug(f"Finished installing {dependency} in {end - start}")
@contextlib.contextmanager @contextlib.contextmanager
def _optional_parallelize(): def _optional_parallelize():
"""A bit of cheat, really """A bit of cheat, really
@@ -66,8 +74,8 @@ def install(
for dependency in packages: for dependency in packages:
if dependency not in installed: if dependency not in installed:
installed.add(dependency) installed.add(dependency)
logger.debug(f"Installing {dependency}") logger.debug(f"Queuing {dependency}")
executor(pip.install, dependency) executor(logged_install, dependency)
else: else:
logger.debug(f"Skipping {dependency}, already installed") logger.debug(f"Skipping {dependency}, already installed")
logger.debug("Waiting for installs to finish...") logger.debug("Waiting for installs to finish...")

View File

@@ -166,6 +166,11 @@ def find_project_deps(
:param extras: Sequence of extra names to include the dependencies of :param extras: Sequence of extra names to include the dependencies of
""" """
if any(dep.name in constants.UNSAFE_PACKAGES for dep in poetry.package.requires):
raise exceptions.RequiresUnsafeDepError(
f"Project package requires one or more unsafe dependencies ({', '.join(constants.UNSAFE_PACKAGES)}) which cannot be installed with Poetry"
)
base_deps: List[PoetryPackage] = [ base_deps: List[PoetryPackage] = [
packages[item.name] packages[item.name]
for item in poetry.package.requires for item in poetry.package.requires