mirror of
				https://github.com/enpaul/tox-poetry-installer.git
				synced 2025-11-03 07:39:20 +00:00 
			
		
		
		
	Merge pull request #30 from enpaul/enp/cleanup
Misc fixes ahead of push to beta classification
This commit is contained in:
		
							
								
								
									
										72
									
								
								.github/scripts/setup-env.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										72
									
								
								.github/scripts/setup-env.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Environment setup script for the local project. Intended to be used with automation
 | 
				
			||||||
 | 
					# to create a repeatable local environment for tests to be run in. The python env
 | 
				
			||||||
 | 
					# this script creates can be accessed at the location defined by the CI_VENV variable
 | 
				
			||||||
 | 
					# below.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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_GET_POETRY="$CI_CACHE/get-poetry.py";
 | 
				
			||||||
 | 
					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";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					command -v python;
 | 
				
			||||||
 | 
					python --version;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ##### Install Poetry #####
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# 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 \
 | 
				
			||||||
 | 
					  --show-error \
 | 
				
			||||||
 | 
					  --location;
 | 
				
			||||||
 | 
					python "$CI_CACHE_GET_POETRY" --yes 1>/dev/null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					python "$CI_POETRY" --version --no-ansi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ##### 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 \
 | 
				
			||||||
 | 
					  --quiet \
 | 
				
			||||||
 | 
					  --no-ansi \
 | 
				
			||||||
 | 
					  &>/dev/null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ##### Print Debug Info #####
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Print the pip and tox versions (which will include registered plugins)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					$CI_VENV_PIP --version;
 | 
				
			||||||
 | 
					echo "tox $($CI_VENV_TOX --version)";
 | 
				
			||||||
							
								
								
									
										51
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							@@ -20,24 +20,51 @@ jobs:
 | 
				
			|||||||
          - version: 3.9
 | 
					          - version: 3.9
 | 
				
			||||||
            toxenv: py39
 | 
					            toxenv: py39
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					      - name: Checkout
 | 
				
			||||||
      - name: Set up Python ${{ matrix.python.version }}
 | 
					        uses: actions/checkout@v2
 | 
				
			||||||
 | 
					      - name: Setup: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: Install project
 | 
					      - name: Setup:cache
 | 
				
			||||||
        run: pip install .
 | 
					        uses: actions/cache@v2
 | 
				
			||||||
      - name: Run tests via ${{ matrix.python.toxenv }}
 | 
					        with:
 | 
				
			||||||
        run: tox -e ${{ matrix.python.toxenv }}
 | 
					          path: |
 | 
				
			||||||
 | 
					            ~/.cache/pip
 | 
				
			||||||
 | 
					            ~/.cache/pypoetry/cache
 | 
				
			||||||
 | 
					            ~/.poetry
 | 
				
			||||||
 | 
					          # Including the hashed poetry.lock in the cache slug ensures that the cache
 | 
				
			||||||
 | 
					          # will be invalidated, and thus all packages will be redownloaded, if the
 | 
				
			||||||
 | 
					          # lockfile is updated
 | 
				
			||||||
 | 
					          key: ${{ runner.os }}-${{ matrix.python.toxenv }}-${{ hashFiles('**/poetry.lock') }}
 | 
				
			||||||
 | 
					      - name: Setup:env
 | 
				
			||||||
 | 
					        run: .github/scripts/setup-env.sh
 | 
				
			||||||
 | 
					      - name: Run:${{ matrix.python.toxenv }}
 | 
				
			||||||
 | 
					        run: $HOME/ci/bin/tox -e ${{ matrix.python.toxenv }}
 | 
				
			||||||
  Check:
 | 
					  Check:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					      - name: Checkout
 | 
				
			||||||
      - name: Set up Python 3.8
 | 
					        uses: actions/checkout@v2
 | 
				
			||||||
 | 
					      - name: Setup:python3.8
 | 
				
			||||||
        uses: actions/setup-python@v1
 | 
					        uses: actions/setup-python@v1
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          python-version: 3.8
 | 
					          python-version: 3.8
 | 
				
			||||||
      - name: Install project
 | 
					      - name: Setup:cache
 | 
				
			||||||
        run: pip install .
 | 
					        uses: actions/cache@v2
 | 
				
			||||||
      - name: Run meta checks
 | 
					        with:
 | 
				
			||||||
        run: tox -e static -e static-tests -e security
 | 
					          path: |
 | 
				
			||||||
 | 
					            ~/.cache/pip
 | 
				
			||||||
 | 
					            ~/.cache/pypoetry/cache
 | 
				
			||||||
 | 
					            ~/.poetry
 | 
				
			||||||
 | 
					          # Hardcoded 'py38' slug here lets this cache piggyback on the 'py38' cache
 | 
				
			||||||
 | 
					          # that is generated for the tests above
 | 
				
			||||||
 | 
					          key: ${{ runner.os }}-py38-${{ hashFiles('**/poetry.lock') }}
 | 
				
			||||||
 | 
					      - name: Setup:env
 | 
				
			||||||
 | 
					        run: .github/scripts/setup-env.sh
 | 
				
			||||||
 | 
					      - name: Run:static
 | 
				
			||||||
 | 
					        run: $HOME/ci/bin/tox -e static
 | 
				
			||||||
 | 
					      - name: Run:static-tests
 | 
				
			||||||
 | 
					        run: $HOME/ci/bin/tox -e static-tests
 | 
				
			||||||
 | 
					      - name: Run:security
 | 
				
			||||||
 | 
					        run: $HOME/ci/bin/tox -e security
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							@@ -19,7 +19,7 @@ clean-py:
 | 
				
			|||||||
	rm --recursive --force ./dist
 | 
						rm --recursive --force ./dist
 | 
				
			||||||
	rm --recursive --force ./build
 | 
						rm --recursive --force ./build
 | 
				
			||||||
	rm --recursive --force ./*.egg-info
 | 
						rm --recursive --force ./*.egg-info
 | 
				
			||||||
	rm --recursive --force __pycache__/
 | 
						rm --recursive --force ./**/__pycache__/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean: clean-tox clean-py; ## Clean temp build/cache files and directories
 | 
					clean: clean-tox clean-py; ## Clean temp build/cache files and directories
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										106
									
								
								poetry.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										106
									
								
								poetry.lock
									
									
									
										generated
									
									
									
								
							@@ -8,8 +8,8 @@ python-versions = "*"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "appnope"
 | 
					name = "appnope"
 | 
				
			||||||
version = "0.1.0"
 | 
					version = "0.1.2"
 | 
				
			||||||
description = "Disable App Nap on OS X 10.9"
 | 
					description = "Disable App Nap on macOS >= 10.9"
 | 
				
			||||||
category = "dev"
 | 
					category = "dev"
 | 
				
			||||||
optional = false
 | 
					optional = false
 | 
				
			||||||
python-versions = "*"
 | 
					python-versions = "*"
 | 
				
			||||||
@@ -123,7 +123,7 @@ name = "cachecontrol"
 | 
				
			|||||||
version = "0.12.6"
 | 
					version = "0.12.6"
 | 
				
			||||||
description = "httplib2 caching for requests"
 | 
					description = "httplib2 caching for requests"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
					python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -148,7 +148,7 @@ name = "cachy"
 | 
				
			|||||||
version = "0.3.0"
 | 
					version = "0.3.0"
 | 
				
			||||||
description = "Cachy provides a simple yet effective caching library."
 | 
					description = "Cachy provides a simple yet effective caching library."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
					python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
@@ -169,7 +169,7 @@ name = "cffi"
 | 
				
			|||||||
version = "1.14.4"
 | 
					version = "1.14.4"
 | 
				
			||||||
description = "Foreign Function Interface for Python calling C code."
 | 
					description = "Foreign Function Interface for Python calling C code."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = "*"
 | 
					python-versions = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -196,7 +196,7 @@ name = "cleo"
 | 
				
			|||||||
version = "0.8.1"
 | 
					version = "0.8.1"
 | 
				
			||||||
description = "Cleo allows you to create beautiful and testable command-line interfaces."
 | 
					description = "Cleo allows you to create beautiful and testable command-line interfaces."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
					python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -215,7 +215,7 @@ name = "clikit"
 | 
				
			|||||||
version = "0.6.2"
 | 
					version = "0.6.2"
 | 
				
			||||||
description = "CliKit is a group of utilities to build beautiful and testable command line interfaces."
 | 
					description = "CliKit is a group of utilities to build beautiful and testable command line interfaces."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
					python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -247,7 +247,7 @@ name = "crashtest"
 | 
				
			|||||||
version = "0.3.1"
 | 
					version = "0.3.1"
 | 
				
			||||||
description = "Manage Python errors with ease"
 | 
					description = "Manage Python errors with ease"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=3.6,<4.0"
 | 
					python-versions = ">=3.6,<4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -255,7 +255,7 @@ name = "cryptography"
 | 
				
			|||||||
version = "3.2.1"
 | 
					version = "3.2.1"
 | 
				
			||||||
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
 | 
					description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
 | 
					python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -263,11 +263,11 @@ cffi = ">=1.8,<1.11.3 || >1.11.3"
 | 
				
			|||||||
six = ">=1.4.1"
 | 
					six = ">=1.4.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0,<3.1.0 || >3.1.0,<3.1.1 || >3.1.1)", "sphinx-rtd-theme"]
 | 
					docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
 | 
				
			||||||
docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
 | 
					docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
 | 
				
			||||||
pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
 | 
					pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
 | 
				
			||||||
ssh = ["bcrypt (>=3.1.5)"]
 | 
					ssh = ["bcrypt (>=3.1.5)"]
 | 
				
			||||||
test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"]
 | 
					test = ["pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "dataclasses"
 | 
					name = "dataclasses"
 | 
				
			||||||
@@ -344,7 +344,7 @@ name = "html5lib"
 | 
				
			|||||||
version = "1.1"
 | 
					version = "1.1"
 | 
				
			||||||
description = "HTML parser based on the WHATWG HTML specification"
 | 
					description = "HTML parser based on the WHATWG HTML specification"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
					python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -477,7 +477,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
				
			|||||||
parso = ">=0.7.0,<0.8.0"
 | 
					parso = ">=0.7.0,<0.8.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
qa = ["flake8 (3.7.9)"]
 | 
					qa = ["flake8 (==3.7.9)"]
 | 
				
			||||||
testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"]
 | 
					testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -485,7 +485,7 @@ name = "jeepney"
 | 
				
			|||||||
version = "0.6.0"
 | 
					version = "0.6.0"
 | 
				
			||||||
description = "Low-level, pure Python DBus protocol wrapper."
 | 
					description = "Low-level, pure Python DBus protocol wrapper."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=3.6"
 | 
					python-versions = ">=3.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
@@ -496,7 +496,7 @@ name = "keyring"
 | 
				
			|||||||
version = "21.5.0"
 | 
					version = "21.5.0"
 | 
				
			||||||
description = "Store and access your passwords safely."
 | 
					description = "Store and access your passwords safely."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=3.6"
 | 
					python-versions = ">=3.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -507,7 +507,7 @@ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
 | 
					docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
 | 
				
			||||||
testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"]
 | 
					testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "lazy-object-proxy"
 | 
					name = "lazy-object-proxy"
 | 
				
			||||||
@@ -522,7 +522,7 @@ name = "lockfile"
 | 
				
			|||||||
version = "0.12.2"
 | 
					version = "0.12.2"
 | 
				
			||||||
description = "Platform-independent file locking module"
 | 
					description = "Platform-independent file locking module"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = "*"
 | 
					python-versions = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -538,7 +538,7 @@ name = "msgpack"
 | 
				
			|||||||
version = "1.0.0"
 | 
					version = "1.0.0"
 | 
				
			||||||
description = "MessagePack (de)serializer."
 | 
					description = "MessagePack (de)serializer."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = "*"
 | 
					python-versions = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -575,7 +575,7 @@ python-versions = "*"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "packaging"
 | 
					name = "packaging"
 | 
				
			||||||
version = "20.4"
 | 
					version = "20.7"
 | 
				
			||||||
description = "Core utilities for Python packages"
 | 
					description = "Core utilities for Python packages"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = false
 | 
				
			||||||
@@ -583,7 +583,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
pyparsing = ">=2.0.2"
 | 
					pyparsing = ">=2.0.2"
 | 
				
			||||||
six = "*"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "parso"
 | 
					name = "parso"
 | 
				
			||||||
@@ -601,7 +600,7 @@ name = "pastel"
 | 
				
			|||||||
version = "0.2.1"
 | 
					version = "0.2.1"
 | 
				
			||||||
description = "Bring colors to your terminal."
 | 
					description = "Bring colors to your terminal."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
					python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -644,7 +643,7 @@ name = "pkginfo"
 | 
				
			|||||||
version = "1.6.1"
 | 
					version = "1.6.1"
 | 
				
			||||||
description = "Query metadatdata from sdists / bdists / installed packages."
 | 
					description = "Query metadatdata from sdists / bdists / installed packages."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = "*"
 | 
					python-versions = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
@@ -669,7 +668,7 @@ name = "poetry"
 | 
				
			|||||||
version = "1.1.4"
 | 
					version = "1.1.4"
 | 
				
			||||||
description = "Python dependency management and packaging made easy."
 | 
					description = "Python dependency management and packaging made easy."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
					python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -764,7 +763,7 @@ name = "pycparser"
 | 
				
			|||||||
version = "2.20"
 | 
					version = "2.20"
 | 
				
			||||||
description = "C parser in Python"
 | 
					description = "C parser in Python"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
					python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -780,7 +779,7 @@ name = "pylev"
 | 
				
			|||||||
version = "1.3.0"
 | 
					version = "1.3.0"
 | 
				
			||||||
description = "A pure Python Levenshtein implementation that's not freaking GPL'd."
 | 
					description = "A pure Python Levenshtein implementation that's not freaking GPL'd."
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = "*"
 | 
					python-versions = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -826,7 +825,7 @@ py = ">=1.8.2"
 | 
				
			|||||||
toml = "*"
 | 
					toml = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
checkqa_mypy = ["mypy (0.780)"]
 | 
					checkqa_mypy = ["mypy (==0.780)"]
 | 
				
			||||||
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
 | 
					testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -842,14 +841,14 @@ coverage = ">=4.4"
 | 
				
			|||||||
pytest = ">=4.6"
 | 
					pytest = ">=4.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"]
 | 
					testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist", "virtualenv"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "pywin32-ctypes"
 | 
					name = "pywin32-ctypes"
 | 
				
			||||||
version = "0.2.0"
 | 
					version = "0.2.0"
 | 
				
			||||||
description = ""
 | 
					description = ""
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = "*"
 | 
					python-versions = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -895,14 +894,14 @@ urllib3 = ">=1.21.1,<1.27"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
 | 
					security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
 | 
				
			||||||
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
 | 
					socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "requests-toolbelt"
 | 
					name = "requests-toolbelt"
 | 
				
			||||||
version = "0.9.1"
 | 
					version = "0.9.1"
 | 
				
			||||||
description = "A utility belt for advanced users of python-requests"
 | 
					description = "A utility belt for advanced users of python-requests"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = "*"
 | 
					python-versions = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -950,7 +949,7 @@ name = "secretstorage"
 | 
				
			|||||||
version = "3.3.0"
 | 
					version = "3.3.0"
 | 
				
			||||||
description = "Python bindings to FreeDesktop.org Secret Service API"
 | 
					description = "Python bindings to FreeDesktop.org Secret Service API"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=3.6"
 | 
					python-versions = ">=3.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[package.dependencies]
 | 
					[package.dependencies]
 | 
				
			||||||
@@ -962,7 +961,7 @@ name = "shellingham"
 | 
				
			|||||||
version = "1.3.2"
 | 
					version = "1.3.2"
 | 
				
			||||||
description = "Tool to Detect Surrounding Shell"
 | 
					description = "Tool to Detect Surrounding Shell"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6"
 | 
					python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -983,7 +982,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "stevedore"
 | 
					name = "stevedore"
 | 
				
			||||||
version = "3.2.2"
 | 
					version = "3.3.0"
 | 
				
			||||||
description = "Manage dynamic plugins for Python applications"
 | 
					description = "Manage dynamic plugins for Python applications"
 | 
				
			||||||
category = "dev"
 | 
					category = "dev"
 | 
				
			||||||
optional = false
 | 
					optional = false
 | 
				
			||||||
@@ -1006,7 +1005,7 @@ name = "tomlkit"
 | 
				
			|||||||
version = "0.7.0"
 | 
					version = "0.7.0"
 | 
				
			||||||
description = "Style preserving TOML library"
 | 
					description = "Style preserving TOML library"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
					python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -1073,7 +1072,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 | 
				
			|||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
brotli = ["brotlipy (>=0.6.0)"]
 | 
					brotli = ["brotlipy (>=0.6.0)"]
 | 
				
			||||||
secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
 | 
					secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
 | 
				
			||||||
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]
 | 
					socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "virtualenv"
 | 
					name = "virtualenv"
 | 
				
			||||||
@@ -1108,7 +1107,7 @@ name = "webencodings"
 | 
				
			|||||||
version = "0.5.1"
 | 
					version = "0.5.1"
 | 
				
			||||||
description = "Character encoding aliases for legacy web content"
 | 
					description = "Character encoding aliases for legacy web content"
 | 
				
			||||||
category = "main"
 | 
					category = "main"
 | 
				
			||||||
optional = false
 | 
					optional = true
 | 
				
			||||||
python-versions = "*"
 | 
					python-versions = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@@ -1129,12 +1128,15 @@ python-versions = ">=3.6"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[package.extras]
 | 
					[package.extras]
 | 
				
			||||||
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
 | 
					docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
 | 
				
			||||||
testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
 | 
					testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[extras]
 | 
				
			||||||
 | 
					poetry = ["poetry"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[metadata]
 | 
					[metadata]
 | 
				
			||||||
lock-version = "1.1"
 | 
					lock-version = "1.1"
 | 
				
			||||||
python-versions = "^3.6.1"
 | 
					python-versions = "^3.6.1"
 | 
				
			||||||
content-hash = "8eea42cb6c60df03376bb264b444ccd0a63a211122edc6625284d57204295273"
 | 
					content-hash = "a5ba6181fc3728d85a60b2e089b9afe2d5bf75f361526e6972d48a42e5075c32"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[metadata.files]
 | 
					[metadata.files]
 | 
				
			||||||
appdirs = [
 | 
					appdirs = [
 | 
				
			||||||
@@ -1142,8 +1144,8 @@ appdirs = [
 | 
				
			|||||||
    {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
 | 
					    {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
appnope = [
 | 
					appnope = [
 | 
				
			||||||
    {file = "appnope-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0"},
 | 
					    {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"},
 | 
				
			||||||
    {file = "appnope-0.1.0.tar.gz", hash = "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"},
 | 
					    {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"},
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
"aspy.refactor-imports" = [
 | 
					"aspy.refactor-imports" = [
 | 
				
			||||||
    {file = "aspy.refactor_imports-2.1.1-py2.py3-none-any.whl", hash = "sha256:9df76bf19ef81620068b785a386740ab3c8939fcbdcebf20c4a4e0057230d782"},
 | 
					    {file = "aspy.refactor_imports-2.1.1-py2.py3-none-any.whl", hash = "sha256:9df76bf19ef81620068b785a386740ab3c8939fcbdcebf20c4a4e0057230d782"},
 | 
				
			||||||
@@ -1468,8 +1470,8 @@ nodeenv = [
 | 
				
			|||||||
    {file = "nodeenv-1.5.0.tar.gz", hash = "sha256:ab45090ae383b716c4ef89e690c41ff8c2b257b85b309f01f3654df3d084bd7c"},
 | 
					    {file = "nodeenv-1.5.0.tar.gz", hash = "sha256:ab45090ae383b716c4ef89e690c41ff8c2b257b85b309f01f3654df3d084bd7c"},
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
packaging = [
 | 
					packaging = [
 | 
				
			||||||
    {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"},
 | 
					    {file = "packaging-20.7-py2.py3-none-any.whl", hash = "sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376"},
 | 
				
			||||||
    {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"},
 | 
					    {file = "packaging-20.7.tar.gz", hash = "sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236"},
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
parso = [
 | 
					parso = [
 | 
				
			||||||
    {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"},
 | 
					    {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"},
 | 
				
			||||||
@@ -1643,29 +1645,22 @@ requests-toolbelt = [
 | 
				
			|||||||
    {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1236df55e0f73cd138c0eca074ee086136c3f16a97c2ac719032c050f7e0622f"},
 | 
					 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2fd336a5c6415c82e2deb40d08c222087febe0aebe520f4d21910629018ab0f3"},
 | 
					 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:75f0ee6839532e52a3a53f80ce64925ed4aed697dd3fa890c4c918f3304bd4f4"},
 | 
					 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8be05be57dc5c7b4a0b24edcaa2f7275866d9c907725226cdde46da09367d923"},
 | 
					 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6ac7e45367b1317e56f1461719c853fd6825226f45b835df7436bb04031fd8a"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6ac7e45367b1317e56f1461719c853fd6825226f45b835df7436bb04031fd8a"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b4b0d31f2052b3f9f9b5327024dc629a253a83d8649d4734ca7f35b60ec3e9e5"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b4b0d31f2052b3f9f9b5327024dc629a253a83d8649d4734ca7f35b60ec3e9e5"},
 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1f8c0a4577c0e6c99d208de5c4d3fd8aceed9574bb154d7a2b21c16bb924154c"},
 | 
					 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-win32.whl", hash = "sha256:46d6d20815064e8bb023ea8628cfb7402c0f0e83de2c2227a88097e239a7dffd"},
 | 
					 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6c0a5dc52fc74eb87c67374a4e554d4761fd42a4d01390b7e868b30d21f4b8bb"},
 | 
					 | 
				
			||||||
    {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"},
 | 
					    {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"},
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
safety = [
 | 
					safety = [
 | 
				
			||||||
@@ -1689,8 +1684,8 @@ smmap = [
 | 
				
			|||||||
    {file = "smmap-3.0.4.tar.gz", hash = "sha256:9c98bbd1f9786d22f14b3d4126894d56befb835ec90cef151af566c7e19b5d24"},
 | 
					    {file = "smmap-3.0.4.tar.gz", hash = "sha256:9c98bbd1f9786d22f14b3d4126894d56befb835ec90cef151af566c7e19b5d24"},
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
stevedore = [
 | 
					stevedore = [
 | 
				
			||||||
    {file = "stevedore-3.2.2-py3-none-any.whl", hash = "sha256:5e1ab03eaae06ef6ce23859402de785f08d97780ed774948ef16c4652c41bc62"},
 | 
					    {file = "stevedore-3.3.0-py3-none-any.whl", hash = "sha256:50d7b78fbaf0d04cd62411188fa7eedcb03eb7f4c4b37005615ceebe582aa82a"},
 | 
				
			||||||
    {file = "stevedore-3.2.2.tar.gz", hash = "sha256:f845868b3a3a77a2489d226568abe7328b5c2d4f6a011cc759dfa99144a521f0"},
 | 
					    {file = "stevedore-3.3.0.tar.gz", hash = "sha256:3a5bbd0652bf552748871eaa73a4a8dc2899786bc497a2aa1fcb4dcdb0debeee"},
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
toml = [
 | 
					toml = [
 | 
				
			||||||
    {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
 | 
					    {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
 | 
				
			||||||
@@ -1716,19 +1711,28 @@ typed-ast = [
 | 
				
			|||||||
    {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"},
 | 
					    {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"},
 | 
					    {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"},
 | 
					    {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"},
 | 
				
			||||||
 | 
					    {file = "typed_ast-1.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fcf135e17cc74dbfbc05894ebca928ffeb23d9790b3167a674921db19082401f"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"},
 | 
					    {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"},
 | 
					    {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"},
 | 
					    {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"},
 | 
					    {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"},
 | 
					    {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"},
 | 
				
			||||||
 | 
					    {file = "typed_ast-1.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f208eb7aff048f6bea9586e61af041ddf7f9ade7caed625742af423f6bae3298"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"},
 | 
					    {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"},
 | 
					    {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"},
 | 
					    {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"},
 | 
					    {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"},
 | 
					    {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"},
 | 
				
			||||||
 | 
					    {file = "typed_ast-1.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7e4c9d7658aaa1fc80018593abdf8598bf91325af6af5cce4ce7c73bc45ea53d"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"},
 | 
					    {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"},
 | 
					    {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"},
 | 
					    {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"},
 | 
				
			||||||
 | 
					    {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92c325624e304ebf0e025d1224b77dd4e6393f18aab8d829b5b7e04afe9b7a2c"},
 | 
				
			||||||
 | 
					    {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d648b8e3bf2fe648745c8ffcee3db3ff903d0817a01a12dd6a6ea7a8f4889072"},
 | 
				
			||||||
 | 
					    {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fac11badff8313e23717f3dada86a15389d0708275bddf766cca67a84ead3e91"},
 | 
				
			||||||
 | 
					    {file = "typed_ast-1.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0d8110d78a5736e16e26213114a38ca35cb15b6515d535413b090bd50951556d"},
 | 
				
			||||||
 | 
					    {file = "typed_ast-1.4.1-cp39-cp39-win32.whl", hash = "sha256:b52ccf7cfe4ce2a1064b18594381bccf4179c2ecf7f513134ec2f993dd4ab395"},
 | 
				
			||||||
 | 
					    {file = "typed_ast-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:3742b32cf1c6ef124d57f95be609c473d7ec4c14d0090e5a5e05a15269fb4d0c"},
 | 
				
			||||||
    {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"},
 | 
					    {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"},
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
typing-extensions = [
 | 
					typing-extensions = [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
[tool.poetry]
 | 
					[tool.poetry]
 | 
				
			||||||
name = "tox-poetry-installer"
 | 
					name = "tox-poetry-installer"
 | 
				
			||||||
version = "0.5.2"
 | 
					version = "0.6.0"
 | 
				
			||||||
license = "MIT"
 | 
					license = "MIT"
 | 
				
			||||||
authors = ["Ethan Paul <24588726+enpaul@users.noreply.github.com>"]
 | 
					authors = ["Ethan Paul <24588726+enpaul@users.noreply.github.com>"]
 | 
				
			||||||
description = "Tox plugin to install Tox environment dependencies using the Poetry backend and lockfile"
 | 
					description = "Tox plugin to install Tox environment dependencies using the Poetry backend and lockfile"
 | 
				
			||||||
@@ -32,11 +32,14 @@ classifiers = [
 | 
				
			|||||||
[tool.poetry.plugins.tox]
 | 
					[tool.poetry.plugins.tox]
 | 
				
			||||||
poetry_installer = "tox_poetry_installer"
 | 
					poetry_installer = "tox_poetry_installer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[tool.poetry.extras]
 | 
				
			||||||
 | 
					poetry = ["poetry"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[tool.poetry.dependencies]
 | 
					[tool.poetry.dependencies]
 | 
				
			||||||
python = "^3.6.1"
 | 
					python = "^3.6.1"
 | 
				
			||||||
poetry = "^1.0.0"
 | 
					poetry = {version = "^1.0.0", optional = true}
 | 
				
			||||||
poetry-core = "^1.0.0"
 | 
					poetry-core = "^1.0.0"
 | 
				
			||||||
tox = "^2.3.0 || ^3.0.0"
 | 
					tox = "^3.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[tool.poetry.dev-dependencies]
 | 
					[tool.poetry.dev-dependencies]
 | 
				
			||||||
bandit = "^1.6.2"
 | 
					bandit = "^1.6.2"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								tox.ini
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								tox.ini
									
									
									
									
									
								
							@@ -6,6 +6,8 @@ skip_missing_interpreters = true
 | 
				
			|||||||
[testenv]
 | 
					[testenv]
 | 
				
			||||||
description = Run the tests
 | 
					description = Run the tests
 | 
				
			||||||
require_locked_deps = true
 | 
					require_locked_deps = true
 | 
				
			||||||
 | 
					extras =
 | 
				
			||||||
 | 
					    poetry
 | 
				
			||||||
locked_deps =
 | 
					locked_deps =
 | 
				
			||||||
    pytest
 | 
					    pytest
 | 
				
			||||||
    pytest-cov
 | 
					    pytest-cov
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
# pylint: disable=missing-docstring
 | 
					# pylint: disable=missing-docstring
 | 
				
			||||||
__title__ = "tox-poetry-installer"
 | 
					__title__ = "tox-poetry-installer"
 | 
				
			||||||
__summary__ = "Tox plugin to install Tox environment dependencies using the Poetry backend and lockfile"
 | 
					__summary__ = "Tox plugin to install Tox environment dependencies using the Poetry backend and lockfile"
 | 
				
			||||||
__version__ = "0.5.2"
 | 
					__version__ = "0.6.0"
 | 
				
			||||||
__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>"]
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								tox_poetry_installer/_poetry.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								tox_poetry_installer/_poetry.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					"""You've heard of vendoirization, now get ready for internal namespace shadowing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Poetry is an optional dependency of this package explicitly to support the use case of having the
 | 
				
			||||||
 | 
					plugin and the `poetry` package installed to the same python environment; this is most common in
 | 
				
			||||||
 | 
					containers and/or CI. In this case there are two potential problems that can arise in this case:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* The installation of the plugin overwrites the installed version of Poetry resulting in
 | 
				
			||||||
 | 
					  compatibility issues.
 | 
				
			||||||
 | 
					* Running `poetry install --no-dev`, when this plugin is in the dev-deps, results in poetry being
 | 
				
			||||||
 | 
					  uninstalled from the environment.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To support these edge cases, and more broadly to support not messing with a system package manager,
 | 
				
			||||||
 | 
					the `poetry` package dependency is listed as optional dependency. This allows the plugin to be
 | 
				
			||||||
 | 
					installed to the same environment as Poetry and import that same Poetry installation here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					However, simply importing Poetry on the assumption that it is installed breaks another valid use
 | 
				
			||||||
 | 
					case: having this plugin installed alongside Tox when not using a Poetry-based project. To account
 | 
				
			||||||
 | 
					for this the imports in this module are isolated and the resultant import error that would result
 | 
				
			||||||
 | 
					is converted to an internal error that can be caught by callers. Rather than importing this module
 | 
				
			||||||
 | 
					at the module scope it is imported into function scope wherever Poetry components are needed. This
 | 
				
			||||||
 | 
					moves import errors from load time to runtime which allows the plugin to be skipped if Poetry isn't
 | 
				
			||||||
 | 
					installed and/or a more helpful error be raised within the Tox framework.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					# pylint: disable=unused-import
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from tox_poetry_installer import exceptions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					try:
 | 
				
			||||||
 | 
					    from poetry.factory import Factory
 | 
				
			||||||
 | 
					    from poetry.installation.pip_installer import PipInstaller
 | 
				
			||||||
 | 
					    from poetry.io.null_io import NullIO
 | 
				
			||||||
 | 
					    from poetry.poetry import Poetry
 | 
				
			||||||
 | 
					    from poetry.puzzle.provider import Provider
 | 
				
			||||||
 | 
					    from poetry.utils.env import VirtualEnv
 | 
				
			||||||
 | 
					except ImportError:
 | 
				
			||||||
 | 
					    raise exceptions.PoetryNotInstalledError(
 | 
				
			||||||
 | 
					        f"No version of Poetry could be imported under the current environment for '{sys.executable}'",
 | 
				
			||||||
 | 
					        sys.path,
 | 
				
			||||||
 | 
					    ) from None
 | 
				
			||||||
@@ -5,8 +5,11 @@ in this module.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
All constants should be type hinted.
 | 
					All constants should be type hinted.
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
from typing import Tuple
 | 
					from typing import Tuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from poetry.core.semver.version import Version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from tox_poetry_installer import __about__
 | 
					from tox_poetry_installer import __about__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -16,4 +19,13 @@ PEP508_VERSION_DELIMITERS: Tuple[str, ...] = ("~=", "==", "!=", ">", "<")
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Prefix all reporter messages should include to indicate that they came from this module in the
 | 
					# Prefix all reporter messages should include to indicate that they came from this module in the
 | 
				
			||||||
# console output.
 | 
					# console output.
 | 
				
			||||||
REPORTER_PREFIX = f"[{__about__.__title__}]:"
 | 
					REPORTER_PREFIX: str = f"[{__about__.__title__}]:"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Semver compatible version of the current python platform version. Used for checking
 | 
				
			||||||
 | 
					# whether a package is compatible with the current python system version
 | 
				
			||||||
 | 
					PLATFORM_VERSION: Version = Version(
 | 
				
			||||||
 | 
					    major=sys.version_info.major,
 | 
				
			||||||
 | 
					    minor=sys.version_info.minor,
 | 
				
			||||||
 | 
					    patch=sys.version_info.micro,
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@ All exceptions should inherit from the common base exception :exc:`ToxPoetryInst
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  ToxPoetryInstallerException
 | 
					  ToxPoetryInstallerException
 | 
				
			||||||
   +-- SkipEnvironment
 | 
					   +-- SkipEnvironment
 | 
				
			||||||
 | 
					   |    +-- PoetryNotInstalledError
 | 
				
			||||||
   +-- LockedDepVersionConflictError
 | 
					   +-- LockedDepVersionConflictError
 | 
				
			||||||
   +-- LockedDepNotFoundError
 | 
					   +-- LockedDepNotFoundError
 | 
				
			||||||
   +-- ExtraNotFoundError
 | 
					   +-- ExtraNotFoundError
 | 
				
			||||||
@@ -22,6 +23,10 @@ class SkipEnvironment(ToxPoetryInstallerException):
 | 
				
			|||||||
    """Current environment does not meet preconditions and should be skipped by the plugin"""
 | 
					    """Current environment does not meet preconditions and should be skipped by the plugin"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class PoetryNotInstalledError(SkipEnvironment):
 | 
				
			||||||
 | 
					    """No version of Poetry could be imported from the current Python environment"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class LockedDepVersionConflictError(ToxPoetryInstallerException):
 | 
					class LockedDepVersionConflictError(ToxPoetryInstallerException):
 | 
				
			||||||
    """Locked dependencies cannot specify an alternate version for installation"""
 | 
					    """Locked dependencies cannot specify an alternate version for installation"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,13 +8,13 @@ from typing import List
 | 
				
			|||||||
from typing import Optional
 | 
					from typing import Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from poetry.core.packages import Package as PoetryPackage
 | 
					from poetry.core.packages import Package as PoetryPackage
 | 
				
			||||||
from poetry.poetry import Poetry
 | 
					 | 
				
			||||||
from tox import hookimpl
 | 
					from tox import hookimpl
 | 
				
			||||||
from tox import reporter
 | 
					from tox import reporter
 | 
				
			||||||
from tox.action import Action as ToxAction
 | 
					from tox.action import Action as ToxAction
 | 
				
			||||||
from tox.config import Parser as ToxParser
 | 
					from tox.config import Parser as ToxParser
 | 
				
			||||||
from tox.venv import VirtualEnv as ToxVirtualEnv
 | 
					from tox.venv import VirtualEnv as ToxVirtualEnv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from tox_poetry_installer import __about__
 | 
				
			||||||
from tox_poetry_installer import constants
 | 
					from tox_poetry_installer import constants
 | 
				
			||||||
from tox_poetry_installer import exceptions
 | 
					from tox_poetry_installer import exceptions
 | 
				
			||||||
from tox_poetry_installer import utilities
 | 
					from tox_poetry_installer import utilities
 | 
				
			||||||
@@ -72,30 +72,30 @@ def tox_testenv_install_deps(venv: ToxVirtualEnv, action: ToxAction) -> Optional
 | 
				
			|||||||
        f"{constants.REPORTER_PREFIX} Loaded project pyproject.toml from {poetry.file}"
 | 
					        f"{constants.REPORTER_PREFIX} Loaded project pyproject.toml from {poetry.file}"
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if venv.envconfig.require_locked_deps and venv.envconfig.deps:
 | 
					    try:
 | 
				
			||||||
        raise exceptions.LockedDepsRequiredError(
 | 
					        if venv.envconfig.require_locked_deps and venv.envconfig.deps:
 | 
				
			||||||
            f"Unlocked dependencies '{venv.envconfig.deps}' specified for environment '{venv.name}' which requires locked dependencies"
 | 
					            raise exceptions.LockedDepsRequiredError(
 | 
				
			||||||
 | 
					                f"Unlocked dependencies '{venv.envconfig.deps}' specified for environment '{venv.name}' which requires locked dependencies"
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        package_map: PackageMap = {
 | 
				
			||||||
 | 
					            package.name: package
 | 
				
			||||||
 | 
					            for package in poetry.locker.locked_repository(True).packages
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if venv.envconfig.install_dev_deps:
 | 
				
			||||||
 | 
					            dev_deps: List[PoetryPackage] = [
 | 
				
			||||||
 | 
					                dep
 | 
				
			||||||
 | 
					                for dep in package_map.values()
 | 
				
			||||||
 | 
					                if dep not in poetry.locker.locked_repository(False).packages
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            dev_deps = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        reporter.verbosity1(
 | 
				
			||||||
 | 
					            f"{constants.REPORTER_PREFIX} Identified {len(dev_deps)} development dependencies to install to env"
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    package_map: PackageMap = {
 | 
					 | 
				
			||||||
        package.name: package
 | 
					 | 
				
			||||||
        for package in poetry.locker.locked_repository(True).packages
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if venv.envconfig.install_dev_deps:
 | 
					 | 
				
			||||||
        dev_deps: List[PoetryPackage] = [
 | 
					 | 
				
			||||||
            dep
 | 
					 | 
				
			||||||
            for dep in package_map.values()
 | 
					 | 
				
			||||||
            if dep not in poetry.locker.locked_repository(False).packages
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        dev_deps = []
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    reporter.verbosity1(
 | 
					 | 
				
			||||||
        f"{constants.REPORTER_PREFIX} Identified {len(dev_deps)} development dependencies to install to env"
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    try:
 | 
					 | 
				
			||||||
        env_deps: List[PoetryPackage] = []
 | 
					        env_deps: List[PoetryPackage] = []
 | 
				
			||||||
        for dep in venv.envconfig.locked_deps:
 | 
					        for dep in venv.envconfig.locked_deps:
 | 
				
			||||||
            env_deps += utilities.find_transients(package_map, dep.lower())
 | 
					            env_deps += utilities.find_transients(package_map, dep.lower())
 | 
				
			||||||
@@ -104,7 +104,7 @@ def tox_testenv_install_deps(venv: ToxVirtualEnv, action: ToxAction) -> Optional
 | 
				
			|||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if not venv.envconfig.skip_install and not venv.envconfig.config.skipsdist:
 | 
					        if not venv.envconfig.skip_install and not venv.envconfig.config.skipsdist:
 | 
				
			||||||
            project_deps: List[PoetryPackage] = _find_project_dependencies(
 | 
					            project_deps: List[PoetryPackage] = utilities.find_project_dependencies(
 | 
				
			||||||
                venv, poetry, package_map
 | 
					                venv, poetry, package_map
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
@@ -116,50 +116,19 @@ def tox_testenv_install_deps(venv: ToxVirtualEnv, action: ToxAction) -> Optional
 | 
				
			|||||||
            f"{constants.REPORTER_PREFIX} Identified {len(project_deps)} project dependencies to install to env"
 | 
					            f"{constants.REPORTER_PREFIX} Identified {len(project_deps)} project dependencies to install to env"
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    except exceptions.ToxPoetryInstallerException as err:
 | 
					    except exceptions.ToxPoetryInstallerException as err:
 | 
				
			||||||
        venv.status = "lockfile installation failed"
 | 
					        venv.status = err.__class__.__name__
 | 
				
			||||||
        reporter.error(f"{constants.REPORTER_PREFIX} {err}")
 | 
					        reporter.error(f"{constants.REPORTER_PREFIX} {err}")
 | 
				
			||||||
 | 
					        return False
 | 
				
			||||||
 | 
					    except Exception as err:
 | 
				
			||||||
 | 
					        venv.status = "InternalError"
 | 
				
			||||||
 | 
					        reporter.error(f"{constants.REPORTER_PREFIX} Internal plugin error: {err}")
 | 
				
			||||||
        raise err
 | 
					        raise err
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dependencies = list(set(dev_deps + env_deps + project_deps))
 | 
					    dependencies = list(set(dev_deps + env_deps + project_deps))
 | 
				
			||||||
    reporter.verbosity0(
 | 
					    action.setactivity(
 | 
				
			||||||
        f"{constants.REPORTER_PREFIX} Installing {len(dependencies)} dependencies to env '{action.name}'"
 | 
					        __about__.__title__,
 | 
				
			||||||
 | 
					        f"Installing {len(dependencies)} dependencies from Poetry lock file",
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    utilities.install_to_venv(poetry, venv, dependencies)
 | 
					    utilities.install_to_venv(poetry, venv, dependencies)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return venv.envconfig.require_locked_deps or None
 | 
					    return venv.envconfig.require_locked_deps or None
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def _find_project_dependencies(
 | 
					 | 
				
			||||||
    venv: ToxVirtualEnv, poetry: Poetry, packages: PackageMap
 | 
					 | 
				
			||||||
) -> List[PoetryPackage]:
 | 
					 | 
				
			||||||
    """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
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    base_dependencies: List[PoetryPackage] = [
 | 
					 | 
				
			||||||
        packages[item.name]
 | 
					 | 
				
			||||||
        for item in poetry.package.requires
 | 
					 | 
				
			||||||
        if not item.is_optional()
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    extra_dependencies: List[PoetryPackage] = []
 | 
					 | 
				
			||||||
    for extra in venv.envconfig.extras:
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            extra_dependencies += [
 | 
					 | 
				
			||||||
                packages[item.name] for item in poetry.package.extras[extra]
 | 
					 | 
				
			||||||
            ]
 | 
					 | 
				
			||||||
        except KeyError:
 | 
					 | 
				
			||||||
            raise exceptions.ExtraNotFoundError(
 | 
					 | 
				
			||||||
                f"Environment '{venv.name}' specifies project extra '{extra}' which was not found in the lockfile"
 | 
					 | 
				
			||||||
            ) from None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dependencies: List[PoetryPackage] = []
 | 
					 | 
				
			||||||
    for dep in base_dependencies + extra_dependencies:
 | 
					 | 
				
			||||||
        dependencies += utilities.find_transients(packages, dep.name.lower())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return dependencies
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,17 +1,15 @@
 | 
				
			|||||||
"""Helper utility functions, usually bridging Tox and Poetry functionality"""
 | 
					"""Helper utility functions, usually bridging Tox and Poetry functionality"""
 | 
				
			||||||
 | 
					# Silence this one globally to support the internal function imports for the proxied poetry module.
 | 
				
			||||||
 | 
					# See the docstring in 'tox_poetry_installer._poetry' for more context.
 | 
				
			||||||
 | 
					# pylint: disable=import-outside-toplevel
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
 | 
					import typing
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					from typing import List
 | 
				
			||||||
from typing import Sequence
 | 
					from typing import Sequence
 | 
				
			||||||
from typing import Set
 | 
					from typing import Set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from poetry.core.packages import Package as PoetryPackage
 | 
					from poetry.core.packages import Package as PoetryPackage
 | 
				
			||||||
from poetry.core.semver.version import Version
 | 
					 | 
				
			||||||
from poetry.factory import Factory as PoetryFactory
 | 
					 | 
				
			||||||
from poetry.installation.pip_installer import PipInstaller as PoetryPipInstaller
 | 
					 | 
				
			||||||
from poetry.io.null_io import NullIO as PoetryNullIO
 | 
					 | 
				
			||||||
from poetry.poetry import Poetry
 | 
					 | 
				
			||||||
from poetry.puzzle.provider import Provider as PoetryProvider
 | 
					 | 
				
			||||||
from poetry.utils.env import VirtualEnv as PoetryVirtualEnv
 | 
					 | 
				
			||||||
from tox import reporter
 | 
					from tox import reporter
 | 
				
			||||||
from tox.action import Action as ToxAction
 | 
					from tox.action import Action as ToxAction
 | 
				
			||||||
from tox.venv import VirtualEnv as ToxVirtualEnv
 | 
					from tox.venv import VirtualEnv as ToxVirtualEnv
 | 
				
			||||||
@@ -20,9 +18,12 @@ from tox_poetry_installer import constants
 | 
				
			|||||||
from tox_poetry_installer import exceptions
 | 
					from tox_poetry_installer import exceptions
 | 
				
			||||||
from tox_poetry_installer.datatypes import PackageMap
 | 
					from tox_poetry_installer.datatypes import PackageMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if typing.TYPE_CHECKING:
 | 
				
			||||||
 | 
					    from tox_poetry_installer import _poetry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def install_to_venv(
 | 
					def install_to_venv(
 | 
				
			||||||
    poetry: Poetry, venv: ToxVirtualEnv, packages: Sequence[PoetryPackage]
 | 
					    poetry: "_poetry.Poetry", venv: ToxVirtualEnv, packages: Sequence[PoetryPackage]
 | 
				
			||||||
):
 | 
					):
 | 
				
			||||||
    """Install a bunch of packages to a virtualenv
 | 
					    """Install a bunch of packages to a virtualenv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -30,14 +31,15 @@ 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
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					    from tox_poetry_installer import _poetry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    reporter.verbosity1(
 | 
					    reporter.verbosity1(
 | 
				
			||||||
        f"{constants.REPORTER_PREFIX} Installing {len(packages)} packages to environment at {venv.envconfig.envdir}"
 | 
					        f"{constants.REPORTER_PREFIX} Installing {len(packages)} packages to environment at {venv.envconfig.envdir}"
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    installer = PoetryPipInstaller(
 | 
					    installer = _poetry.PipInstaller(
 | 
				
			||||||
        env=PoetryVirtualEnv(path=Path(venv.envconfig.envdir)),
 | 
					        env=_poetry.VirtualEnv(path=Path(venv.envconfig.envdir)),
 | 
				
			||||||
        io=PoetryNullIO(),
 | 
					        io=_poetry.NullIO(),
 | 
				
			||||||
        pool=poetry.pool,
 | 
					        pool=poetry.pool,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -58,29 +60,25 @@ def find_transients(packages: PackageMap, dependency_name: str) -> Set[PoetryPac
 | 
				
			|||||||
    .. note:: The package corresponding to the dependency named by ``dependency_name`` is included
 | 
					    .. note:: The package corresponding to the dependency named by ``dependency_name`` is included
 | 
				
			||||||
              in the list of returned packages.
 | 
					              in the list of returned packages.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					    from tox_poetry_installer import _poetry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def find_deps_of_deps(name: str, searched: Set[str]) -> PackageMap:
 | 
					        def find_deps_of_deps(name: str, searched: Set[str]) -> PackageMap:
 | 
				
			||||||
            package = packages[name]
 | 
					            package = packages[name]
 | 
				
			||||||
            local_version = Version(
 | 
					 | 
				
			||||||
                major=sys.version_info.major,
 | 
					 | 
				
			||||||
                minor=sys.version_info.minor,
 | 
					 | 
				
			||||||
                patch=sys.version_info.micro,
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            transients: PackageMap = {}
 | 
					            transients: PackageMap = {}
 | 
				
			||||||
            searched.update([name])
 | 
					            searched.update([name])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if name in PoetryProvider.UNSAFE_PACKAGES:
 | 
					            if name in _poetry.Provider.UNSAFE_PACKAGES:
 | 
				
			||||||
                reporter.warning(
 | 
					                reporter.warning(
 | 
				
			||||||
                    f"{constants.REPORTER_PREFIX} Installing package '{name}' using Poetry is not supported; skipping installation of package '{name}'"
 | 
					                    f"{constants.REPORTER_PREFIX} Installing package '{name}' using Poetry is not supported; skipping installation of package '{name}'"
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                reporter.verbosity2(
 | 
					                reporter.verbosity2(
 | 
				
			||||||
                    f"{constants.REPORTER_PREFIX} Skip {package}: designated unsafe by Poetry"
 | 
					                    f"{constants.REPORTER_PREFIX} Skip {package}: designated unsafe by Poetry"
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            elif not package.python_constraint.allows(local_version):
 | 
					            elif not package.python_constraint.allows(constants.PLATFORM_VERSION):
 | 
				
			||||||
                reporter.verbosity2(
 | 
					                reporter.verbosity2(
 | 
				
			||||||
                    f"{constants.REPORTER_PREFIX} Skip {package}: incompatible Python requirement '{package.python_constraint}' for current version '{local_version}'"
 | 
					                    f"{constants.REPORTER_PREFIX} Skip {package}: incompatible Python requirement '{package.python_constraint}' for current version '{constants.PLATFORM_VERSION}'"
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            elif package.platform is not None and package.platform != sys.platform:
 | 
					            elif package.platform is not None and package.platform != sys.platform:
 | 
				
			||||||
                reporter.verbosity2(
 | 
					                reporter.verbosity2(
 | 
				
			||||||
@@ -114,8 +112,10 @@ def find_transients(packages: PackageMap, dependency_name: str) -> Set[PoetryPac
 | 
				
			|||||||
        ) from None
 | 
					        ) from None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def check_preconditions(venv: ToxVirtualEnv, action: ToxAction) -> Poetry:
 | 
					def check_preconditions(venv: ToxVirtualEnv, action: ToxAction) -> "_poetry.Poetry":
 | 
				
			||||||
    """Check that the local project environment meets expectations"""
 | 
					    """Check that the local project environment meets expectations"""
 | 
				
			||||||
 | 
					    from tox_poetry_installer import _poetry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Skip running the plugin for the packaging environment. PEP-517 front ends can handle
 | 
					    # Skip running the plugin for the packaging environment. PEP-517 front ends can handle
 | 
				
			||||||
    # that better than we can, so let them do their thing. More to the point: if you're having
 | 
					    # that better than we can, so let them do their thing. More to the point: if you're having
 | 
				
			||||||
    # problems in the packaging env that this plugin would solve, god help you.
 | 
					    # problems in the packaging env that this plugin would solve, god help you.
 | 
				
			||||||
@@ -125,7 +125,7 @@ def check_preconditions(venv: ToxVirtualEnv, action: ToxAction) -> Poetry:
 | 
				
			|||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        return PoetryFactory().create_poetry(venv.envconfig.config.toxinidir)
 | 
					        return _poetry.Factory().create_poetry(venv.envconfig.config.toxinidir)
 | 
				
			||||||
    # Support running the plugin when the current tox project does not use Poetry for its
 | 
					    # Support running the plugin when the current tox project does not use Poetry for its
 | 
				
			||||||
    # environment/dependency management.
 | 
					    # environment/dependency management.
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
@@ -135,3 +135,42 @@ def check_preconditions(venv: ToxVirtualEnv, action: ToxAction) -> Poetry:
 | 
				
			|||||||
        raise exceptions.SkipEnvironment(
 | 
					        raise exceptions.SkipEnvironment(
 | 
				
			||||||
            "Project does not use Poetry for env management, skipping installation of locked dependencies"
 | 
					            "Project does not use Poetry for env management, skipping installation of locked dependencies"
 | 
				
			||||||
        ) from None
 | 
					        ) from None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def find_project_dependencies(
 | 
				
			||||||
 | 
					    venv: ToxVirtualEnv, poetry: "_poetry.Poetry", packages: PackageMap
 | 
				
			||||||
 | 
					) -> List[PoetryPackage]:
 | 
				
			||||||
 | 
					    """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
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    base_dependencies: List[PoetryPackage] = [
 | 
				
			||||||
 | 
					        packages[item.name]
 | 
				
			||||||
 | 
					        for item in poetry.package.requires
 | 
				
			||||||
 | 
					        if not item.is_optional()
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    extra_dependencies: List[PoetryPackage] = []
 | 
				
			||||||
 | 
					    for extra in venv.envconfig.extras:
 | 
				
			||||||
 | 
					        reporter.verbosity1(
 | 
				
			||||||
 | 
					            f"{constants.REPORTER_PREFIX} Processing project extra '{extra}'"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            extra_dependencies += [
 | 
				
			||||||
 | 
					                packages[item.name] for item in poetry.package.extras[extra]
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        except KeyError:
 | 
				
			||||||
 | 
					            raise exceptions.ExtraNotFoundError(
 | 
				
			||||||
 | 
					                f"Environment '{venv.name}' specifies project extra '{extra}' which was not found in the lockfile"
 | 
				
			||||||
 | 
					            ) from None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dependencies: List[PoetryPackage] = []
 | 
				
			||||||
 | 
					    for dep in base_dependencies + extra_dependencies:
 | 
				
			||||||
 | 
					        dependencies += find_transients(packages, dep.name.lower())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return dependencies
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user