Commit dbe13102 by Sébastien Eustace

Merge branch 'master' into develop

# Conflicts:
#	CHANGELOG.md
#	poetry.lock
#	poetry/__version__.py
#	pyproject.toml
#	tests/packages/test_locker.py
parents 3c26c8d0 3dd09c2c
...@@ -24,6 +24,19 @@ ...@@ -24,6 +24,19 @@
- Fixed transitive extra dependencies being removed when updating a specific dependency. - Fixed transitive extra dependencies being removed when updating a specific dependency.
## [0.12.11] - 2019-01-13
### Fixed
- Fixed the way packages information are retrieved for legacy repositories.
- Fixed an error when adding packages with invalid versions.
- Fixed an error when resolving directory dependencies with no sub dependencies.
- Fixed an error when locking packages with no description.
- Fixed path resolution for transitive file dependencies.
- Fixed multiple constraints handling for the root package.
- Fixed exclude functionality on case sensitive systems.
## [0.12.10] - 2018-11-22 ## [0.12.10] - 2018-11-22
### Fixed ### Fixed
...@@ -630,7 +643,8 @@ Initial release ...@@ -630,7 +643,8 @@ Initial release
[Unreleased]: https://github.com/sdispater/poetry/compare/0.12.10...master [Unreleased]: https://github.com/sdispater/poetry/compare/0.12.11...develop
[0.12.11]: https://github.com/sdispater/poetry/releases/tag/0.12.11
[0.12.10]: https://github.com/sdispater/poetry/releases/tag/0.12.10 [0.12.10]: https://github.com/sdispater/poetry/releases/tag/0.12.10
[0.12.9]: https://github.com/sdispater/poetry/releases/tag/0.12.9 [0.12.9]: https://github.com/sdispater/poetry/releases/tag/0.12.9
[0.12.8]: https://github.com/sdispater/poetry/releases/tag/0.12.8 [0.12.8]: https://github.com/sdispater/poetry/releases/tag/0.12.8
......
...@@ -95,7 +95,7 @@ Now, you will need to install the required dependency for Poetry and be sure tha ...@@ -95,7 +95,7 @@ Now, you will need to install the required dependency for Poetry and be sure tha
tests are passing on your machine: tests are passing on your machine:
```bash ```bash
$ poetry develop $ poetry install
$ poetry run pytest tests/ $ poetry run pytest tests/
``` ```
......
# Poetry: Dependency Management for Python # Poetry: Dependency Management for Python
![Poetry build status](https://travis-ci.org/sdispater/poetry.svg)
Poetry helps you declare, manage and install dependencies of Python projects, Poetry helps you declare, manage and install dependencies of Python projects,
ensuring you have the right stack everywhere. ensuring you have the right stack everywhere.
...@@ -9,6 +7,9 @@ ensuring you have the right stack everywhere. ...@@ -9,6 +7,9 @@ ensuring you have the right stack everywhere.
It supports Python 2.7 and 3.4+. It supports Python 2.7 and 3.4+.
[![Unix Build Status](https://img.shields.io/travis/sdispater/poetry.svg?label=Unix)](https://travis-ci.org/sdispater/poetry)
[![Windows Build Status](https://img.shields.io/appveyor/ci/sdispater/poetry.svg?label=Windows)](https://ci.appveyor.com/project/sdispater/poetry)
## Installation ## Installation
Poetry provides a custom installer that will install `poetry` isolated Poetry provides a custom installer that will install `poetry` isolated
......
...@@ -61,7 +61,7 @@ Also, instead of modifying the `pyproject.toml` file by hand, you can use the `a ...@@ -61,7 +61,7 @@ Also, instead of modifying the `pyproject.toml` file by hand, you can use the `a
$ poetry add pendulum $ poetry add pendulum
``` ```
It will automatically find a suitable version constraint. It will automatically find a suitable version constraint **and install** the package and subdependencies.
### Version constraints ### Version constraints
......
...@@ -148,6 +148,11 @@ poetry completions fish > ~/.config/fish/completions/poetry.fish ...@@ -148,6 +148,11 @@ poetry completions fish > ~/.config/fish/completions/poetry.fish
# Zsh # Zsh
poetry completions zsh > ~/.zfunc/_poetry poetry completions zsh > ~/.zfunc/_poetry
# Oh-My-Zsh
mkdir $ZSH/plugins/poetry
poetry completions zsh > $ZSH/plugins/poetry/_poetry
``` ```
!!! note !!! note
...@@ -159,3 +164,12 @@ For `zsh`, you must then add the following line in your `~/.zshrc` before `compi ...@@ -159,3 +164,12 @@ For `zsh`, you must then add the following line in your `~/.zshrc` before `compi
```bash ```bash
fpath+=~/.zfunc fpath+=~/.zfunc
``` ```
For `oh-my-zsh`, you must then enable poetry in your `~/.zshrc` plugins
```
plugins(
poetry
...
)
```
...@@ -35,9 +35,9 @@ python-versions = "*" ...@@ -35,9 +35,9 @@ python-versions = "*"
version = "18.2.0" version = "18.2.0"
[package.extras] [package.extras]
dev = ["pre-commit", "zope.interface", "sphinx", "zope.interface", "six", "pytest", "pympler", "hypothesis", "coverage"] dev = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface", "sphinx", "zope.interface", "pre-commit"]
docs = ["zope.interface", "sphinx"] docs = ["sphinx", "zope.interface"]
tests = ["zope.interface", "six", "pytest", "pympler", "hypothesis", "coverage"] tests = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface"]
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -78,14 +78,6 @@ filecache = ["lockfile (>=0.9)"] ...@@ -78,14 +78,6 @@ filecache = ["lockfile (>=0.9)"]
redis = ["redis (>=2.10.5)"] redis = ["redis (>=2.10.5)"]
[[package]] [[package]]
category = "dev"
description = "A decorator for caching properties in classes."
name = "cached-property"
optional = false
python-versions = "*"
version = "1.5.1"
[[package]]
category = "main" category = "main"
description = "Cachy provides a simple yet effective caching library." description = "Cachy provides a simple yet effective caching library."
name = "cachy" name = "cachy"
...@@ -104,7 +96,7 @@ description = "Python package for providing Mozilla's CA Bundle." ...@@ -104,7 +96,7 @@ description = "Python package for providing Mozilla's CA Bundle."
name = "certifi" name = "certifi"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "2018.10.15" version = "2018.11.29"
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -112,7 +104,7 @@ description = "Validate configuration and produce human readable error messages. ...@@ -112,7 +104,7 @@ description = "Validate configuration and produce human readable error messages.
name = "cfgv" name = "cfgv"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "1.1.0" version = "1.4.0"
[package.dependencies] [package.dependencies]
six = "*" six = "*"
...@@ -153,7 +145,7 @@ description = "CliKit is a group of utilities to build beautiful and testable co ...@@ -153,7 +145,7 @@ description = "CliKit is a group of utilities to build beautiful and testable co
name = "clikit" name = "clikit"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "0.2.2" version = "0.2.3"
[package.dependencies] [package.dependencies]
pastel = ">=0.1.0,<0.2.0" pastel = ">=0.1.0,<0.2.0"
...@@ -174,7 +166,16 @@ marker = "sys_platform == \"win32\"" ...@@ -174,7 +166,16 @@ marker = "sys_platform == \"win32\""
name = "colorama" name = "colorama"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "0.4.0" version = "0.4.1"
[[package]]
category = "dev"
description = "This library brings the updated configparser from Python 3.5 to Python 2.6-3.5."
marker = "python_version < \"3\""
name = "configparser"
optional = false
python-versions = "*"
version = "3.5.0"
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -229,6 +230,24 @@ python-versions = "*" ...@@ -229,6 +230,24 @@ python-versions = "*"
version = "3.2.3-2" version = "3.2.3-2"
[[package]] [[package]]
category = "dev"
description = "Backport of the concurrent.futures package from Python 3.2"
marker = "python_version < \"3.2\""
name = "futures"
optional = false
python-versions = "*"
version = "3.1.1"
[[package]]
category = "main"
description = "Version of the glob module that can capture patterns and supports recursive wildcards"
marker = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.4\" and python_version < \"3.5\""
name = "glob2"
optional = false
python-versions = "*"
version = "0.6"
[[package]]
category = "main" category = "main"
description = "HTML parser based on the WHATWG HTML specification" description = "HTML parser based on the WHATWG HTML specification"
name = "html5lib" name = "html5lib"
...@@ -253,15 +272,15 @@ description = "File identification library for Python" ...@@ -253,15 +272,15 @@ description = "File identification library for Python"
name = "identify" name = "identify"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "1.1.7" version = "1.1.8"
[[package]] [[package]]
category = "main" category = "main"
description = "Internationalized Domain Names in Applications (IDNA)" description = "Internationalized Domain Names in Applications (IDNA)"
name = "idna" name = "idna"
optional = false optional = false
python-versions = "*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.7" version = "2.8"
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -269,9 +288,15 @@ description = "Read metadata from Python packages" ...@@ -269,9 +288,15 @@ description = "Read metadata from Python packages"
name = "importlib-metadata" name = "importlib-metadata"
optional = false optional = false
python-versions = ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3" python-versions = ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3"
version = "0.6" version = "0.8"
[package.dependencies] [package.dependencies]
zipp = ">=0.3.2"
[package.dependencies.configparser]
python = "<3"
version = "*"
[package.dependencies.contextlib2] [package.dependencies.contextlib2]
python = "<3" python = "<3"
version = "*" version = "*"
...@@ -319,11 +344,12 @@ description = "An implementation of JSON Schema validation for Python" ...@@ -319,11 +344,12 @@ description = "An implementation of JSON Schema validation for Python"
name = "jsonschema" name = "jsonschema"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "3.0.0a3" version = "3.0.0a4"
[package.dependencies] [package.dependencies]
attrs = ">=17.4.0" attrs = ">=17.4.0"
pyrsistent = ">=0.14.0" pyrsistent = ">=0.14.0"
setuptools = "*"
six = ">=1.11.0" six = ">=1.11.0"
[package.dependencies.functools32] [package.dependencies.functools32]
...@@ -331,7 +357,7 @@ python = "<3" ...@@ -331,7 +357,7 @@ python = "<3"
version = "*" version = "*"
[package.extras] [package.extras]
format = ["jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"]
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -340,7 +366,7 @@ marker = "python_version >= \"2.7.9\" and python_version < \"2.8.0\" or python_v ...@@ -340,7 +366,7 @@ marker = "python_version >= \"2.7.9\" and python_version < \"2.8.0\" or python_v
name = "livereload" name = "livereload"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "2.5.2" version = "2.6.0"
[package.dependencies] [package.dependencies]
six = "*" six = "*"
...@@ -416,7 +442,7 @@ description = "More routines for operating on iterables, beyond itertools" ...@@ -416,7 +442,7 @@ description = "More routines for operating on iterables, beyond itertools"
name = "more-itertools" name = "more-itertools"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "4.3.0" version = "5.0.0"
[package.dependencies] [package.dependencies]
six = ">=1.0.0,<2.0.0" six = ">=1.0.0,<2.0.0"
...@@ -427,7 +453,7 @@ description = "MessagePack (de)serializer." ...@@ -427,7 +453,7 @@ description = "MessagePack (de)serializer."
name = "msgpack" name = "msgpack"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "0.5.6" version = "0.6.0"
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -464,7 +490,7 @@ marker = "python_version >= \"2.7\" and python_version < \"2.8\" or python_versi ...@@ -464,7 +490,7 @@ marker = "python_version >= \"2.7\" and python_version < \"2.8\" or python_versi
name = "pathlib2" name = "pathlib2"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "2.3.2" version = "2.3.3"
[package.dependencies] [package.dependencies]
six = "*" six = "*"
...@@ -488,7 +514,7 @@ description = "Query metadatdata from sdists / bdists / installed packages." ...@@ -488,7 +514,7 @@ description = "Query metadatdata from sdists / bdists / installed packages."
name = "pkginfo" name = "pkginfo"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "1.4.2" version = "1.5.0.1"
[package.extras] [package.extras]
testing = ["nose", "coverage"] testing = ["nose", "coverage"]
...@@ -499,10 +525,10 @@ description = "plugin and hook calling mechanisms for python" ...@@ -499,10 +525,10 @@ description = "plugin and hook calling mechanisms for python"
name = "pluggy" name = "pluggy"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "0.8.0" version = "0.8.1"
[package.extras] [package.extras]
dev = ["tox", "pre-commit"] dev = ["pre-commit", "tox"]
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -510,12 +536,11 @@ description = "A framework for managing and maintaining multi-language pre-commi ...@@ -510,12 +536,11 @@ description = "A framework for managing and maintaining multi-language pre-commi
name = "pre-commit" name = "pre-commit"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "1.12.0" version = "1.14.2"
[package.dependencies] [package.dependencies]
"aspy.yaml" = "*" "aspy.yaml" = "*"
cached-property = "*" cfgv = ">=1.4.0"
cfgv = ">=1.0.0"
identify = ">=1.0.0" identify = ">=1.0.0"
importlib-metadata = "*" importlib-metadata = "*"
nodeenv = ">=0.11.1" nodeenv = ">=0.11.1"
...@@ -524,6 +549,10 @@ six = "*" ...@@ -524,6 +549,10 @@ six = "*"
toml = "*" toml = "*"
virtualenv = "*" virtualenv = "*"
[package.dependencies.futures]
python = "<3.2"
version = "*"
[package.dependencies.importlib-resources] [package.dependencies.importlib-resources]
python = "<3.7" python = "<3.7"
version = "*" version = "*"
...@@ -542,7 +571,7 @@ description = "Pygments is a syntax highlighting package written in Python." ...@@ -542,7 +571,7 @@ description = "Pygments is a syntax highlighting package written in Python."
name = "pygments" name = "pygments"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "2.2.0" version = "2.3.1"
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -579,8 +608,8 @@ category = "main" ...@@ -579,8 +608,8 @@ category = "main"
description = "Python parsing module" description = "Python parsing module"
name = "pyparsing" name = "pyparsing"
optional = false optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" python-versions = "*"
version = "2.3.0" version = "2.3.1"
[[package]] [[package]]
category = "main" category = "main"
...@@ -588,7 +617,7 @@ description = "Persistent/Functional/Immutable data structures" ...@@ -588,7 +617,7 @@ description = "Persistent/Functional/Immutable data structures"
name = "pyrsistent" name = "pyrsistent"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "0.14.6" version = "0.14.9"
[package.dependencies] [package.dependencies]
six = "*" six = "*"
...@@ -599,7 +628,7 @@ description = "pytest: simple powerful testing with Python" ...@@ -599,7 +628,7 @@ description = "pytest: simple powerful testing with Python"
name = "pytest" name = "pytest"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "3.10.1" version = "4.1.1"
[package.dependencies] [package.dependencies]
atomicwrites = ">=1.0" atomicwrites = ">=1.0"
...@@ -619,17 +648,20 @@ version = "*" ...@@ -619,17 +648,20 @@ version = "*"
python = "<3.6" python = "<3.6"
version = ">=2.2.0" version = ">=2.2.0"
[package.extras]
testing = ["hypothesis (>=3.56)", "nose", "requests", "mock"]
[[package]] [[package]]
category = "dev" category = "dev"
description = "Pytest plugin for measuring coverage." description = "Pytest plugin for measuring coverage."
name = "pytest-cov" name = "pytest-cov"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.6.0" version = "2.6.1"
[package.dependencies] [package.dependencies]
coverage = ">=4.4" coverage = ">=4.4"
pytest = ">=2.9" pytest = ">=3.6"
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -673,17 +705,17 @@ description = "Python HTTP for Humans." ...@@ -673,17 +705,17 @@ description = "Python HTTP for Humans."
name = "requests" name = "requests"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.20.1" version = "2.21.0"
[package.dependencies] [package.dependencies]
certifi = ">=2017.4.17" certifi = ">=2017.4.17"
chardet = ">=3.0.2,<3.1.0" chardet = ">=3.0.2,<3.1.0"
idna = ">=2.5,<2.8" idna = ">=2.5,<2.9"
urllib3 = ">=1.21.1,<1.25" urllib3 = ">=1.21.1,<1.25"
[package.extras] [package.extras]
security = ["idna (>=2.0.0)", "cryptography (>=1.3.4)", "pyOpenSSL (>=0.14)"] security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"]
socks = ["win-inet-pton", "PySocks (>=1.5.6,<1.5.7 || >1.5.7)"] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
[[package]] [[package]]
category = "main" category = "main"
...@@ -711,15 +743,15 @@ description = "Tool to Detect Surrounding Shell" ...@@ -711,15 +743,15 @@ description = "Tool to Detect Surrounding Shell"
name = "shellingham" name = "shellingham"
optional = false optional = false
python-versions = ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3" python-versions = ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3"
version = "1.2.7" version = "1.2.8"
[[package]] [[package]]
category = "main" category = "main"
description = "Python 2 and 3 compatibility utilities" description = "Python 2 and 3 compatibility utilities"
name = "six" name = "six"
optional = false optional = false
python-versions = "*" python-versions = ">=2.6, !=3.0.*, !=3.1.*"
version = "1.11.0" version = "1.12.0"
[[package]] [[package]]
category = "dev" category = "dev"
...@@ -773,7 +805,7 @@ description = "virtualenv-based automation of test activities" ...@@ -773,7 +805,7 @@ description = "virtualenv-based automation of test activities"
name = "tox" name = "tox"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "3.5.3" version = "3.7.0"
[package.dependencies] [package.dependencies]
filelock = ">=3.0.0,<4" filelock = ">=3.0.0,<4"
...@@ -785,8 +817,8 @@ toml = ">=0.9.4" ...@@ -785,8 +817,8 @@ toml = ">=0.9.4"
virtualenv = ">=1.11.2" virtualenv = ">=1.11.2"
[package.extras] [package.extras]
docs = ["sphinxcontrib-autoprogram (>=0.1.5)", "pygments-github-lexers (>=0.0.5)", "towncrier (>=18.5.0)", "sphinx (>=1.8.0,<2)"] docs = ["sphinx (>=1.8.0,<2)", "towncrier (>=18.5.0)", "pygments-github-lexers (>=0.0.5)", "sphinxcontrib-autoprogram (>=0.1.5)"]
testing = ["pytest-randomly (>=1.2.3,<2)", "pytest-xdist (>=1.22.2,<2)", "pytest-timeout (>=1.3.0,<2)", "pytest-mock (>=1.10.0,<2)", "pytest-cov (>=2.5.1,<3)", "pytest (>=3.0.0,<4)"] testing = ["freezegun (>=0.3.11)", "pytest (>=3.0.0,<4)", "pytest-cov (>=2.5.1,<3)", "pytest-mock (>=1.10.0,<2)", "pytest-timeout (>=1.3.0,<2)", "pytest-xdist (>=1.22.2,<2)", "pytest-randomly (>=1.2.3,<2)"]
[[package]] [[package]]
category = "main" category = "main"
...@@ -806,7 +838,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" ...@@ -806,7 +838,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4"
version = "1.24.1" version = "1.24.1"
[package.extras] [package.extras]
secure = ["ipaddress", "certifi", "idna (>=2.0.0)", "cryptography (>=1.3.4)", "pyOpenSSL (>=0.14)"] 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 || >1.5.7,<2.0)"]
[[package]] [[package]]
...@@ -814,12 +846,15 @@ category = "main" ...@@ -814,12 +846,15 @@ category = "main"
description = "Virtual Python Environment builder" description = "Virtual Python Environment builder"
name = "virtualenv" name = "virtualenv"
optional = false optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "16.1.0" version = "16.2.0"
[package.dependencies]
setuptools = ">=18.0.0"
[package.extras] [package.extras]
docs = ["sphinx (>=1.8.0,<2)"] docs = ["sphinx (>=1.8.0,<2)", "towncrier (>=18.5.0)", "sphinx-rtd-theme (>=0.4.2,<1)"]
testing = ["mock", "pytest-timeout (>=1.3.0,<2)", "coverage (>=4.5.0,<5)", "pytest (>=3.0.0,<4)"] testing = ["pytest (>=4.0.0,<5)", "coverage (>=4.5.0,<5)", "six (>=1.10.0,<2)", "pytest-timeout (>=1.3.0,<2)", "pytest-xdist", "mock", "xonsh"]
[[package]] [[package]]
category = "main" category = "main"
...@@ -829,8 +864,20 @@ optional = false ...@@ -829,8 +864,20 @@ optional = false
python-versions = "*" python-versions = "*"
version = "0.5.1" version = "0.5.1"
[[package]]
category = "dev"
description = "Pathlib-compatible object wrapper for zip files"
name = "zipp"
optional = false
python-versions = ">=2.7"
version = "0.3.3"
[package.extras]
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs", "pytest-flake8", "pathlib2"]
[metadata] [metadata]
content-hash = "8618ec2332b366abaf70c871e9afd0f52d410e0cf17c9715525b9157c8874161" content-hash = "0d0969aacd81c55841c170dd6107cfa332670e32e5cfce2779a796e895273ee5"
python-versions = "~2.7 || ^3.4" python-versions = "~2.7 || ^3.4"
[metadata.hashes] [metadata.hashes]
...@@ -840,67 +887,70 @@ atomicwrites = ["0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c ...@@ -840,67 +887,70 @@ atomicwrites = ["0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c
attrs = ["10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", "ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb"] attrs = ["10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", "ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb"]
black = ["817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", "e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5"] black = ["817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", "e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5"]
cachecontrol = ["cef77effdf51b43178f6a2d3b787e3734f98ade253fa3187f3bb7315aaa42ff7"] cachecontrol = ["cef77effdf51b43178f6a2d3b787e3734f98ade253fa3187f3bb7315aaa42ff7"]
cached-property = ["3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f", "9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504"]
cachy = ["b71513e5a38ce90c1280c02b7d8d6bb3fdf64666c9cc0584f2479afea097d56c", "b71e8e7ddb5b386e23e81befdfac8a93885406139b8681bedc17b3444fcb8fca"] cachy = ["b71513e5a38ce90c1280c02b7d8d6bb3fdf64666c9cc0584f2479afea097d56c", "b71e8e7ddb5b386e23e81befdfac8a93885406139b8681bedc17b3444fcb8fca"]
certifi = ["339dc09518b07e2fa7eda5450740925974815557727d6bd35d319c1524a04a4c", "6d58c986d22b038c8c0df30d639f23a3e6d172a05c3583e766f4c0b785c0986a"] certifi = ["47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", "993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033"]
cfgv = ["73f48a752bd7aab103c4b882d6596c6360b7aa63b34073dd2c35c7b4b8f93010", "d1791caa9ff5c0c7bce80e7ecc1921752a2eb7c2463a08ed9b6c96b85a2f75aa"] cfgv = ["39d9055c47e3932908fe25abd5807e21dc002630db01c7a5f05738d027e2b706", "41d22dd864c474f919ecb88900000d2410d640315f75bdb79b3abf9347089641"]
chardet = ["84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", "fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"] chardet = ["84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", "fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"]
cleo = ["7a5000de616de42fd78f968192651b9174bf333a9079fc9d68ccc672ddfd3624", "a39fa806fd3f64ff0ae4e3a55bb80c8ce60ca73634e13619731d63a04a63be69"] cleo = ["7a5000de616de42fd78f968192651b9174bf333a9079fc9d68ccc672ddfd3624", "a39fa806fd3f64ff0ae4e3a55bb80c8ce60ca73634e13619731d63a04a63be69"]
click = ["2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"] click = ["2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"]
clikit = ["9dbdb3a0f3ddcd2e1851f11b13dc5173d8a4333d627be24e46ddbbc0d83a84e8", "b65cecedfabc2c73865454a57faeca8696408130fc5c2c74df0770335c787bec"] clikit = ["7bbd38fcb912058c689a03f487a66f8d1eb1f486bc5cf68d4a5798093bd0217f", "e23ac911afb7079ae0e4d89af73ee0d31c8952c64ef4fcf76bcd46bfde9aabaa"]
colorama = ["a3d89af5db9e9806a779a50296b5fdb466e281147c2c235e8225ecc6dbf7bbf3", "c9b54bebe91a6a803e0772c8561d53f2926bfeb17cd141fbabcb08424086595c"] colorama = ["05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", "f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48"]
configparser = ["5308b47021bc2340965c371f0f058cc6971a04502638d4244225c49d80db273a"]
contextlib2 = ["509f9419ee91cdd00ba34443217d5ca51f5a364a404e1dce9e8979cea969ca48", "f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00"] contextlib2 = ["509f9419ee91cdd00ba34443217d5ca51f5a364a404e1dce9e8979cea969ca48", "f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00"]
coverage = ["06123b58a1410873e22134ca2d88bd36680479fe354955b3579fb8ff150e4d27", "09e47c529ff77bf042ecfe858fb55c3e3eb97aac2c87f0349ab5a7efd6b3939f", "0a1f9b0eb3aa15c990c328535655847b3420231af299386cfe5efc98f9c250fe", "0cc941b37b8c2ececfed341444a456912e740ecf515d560de58b9a76562d966d", "0d34245f824cc3140150ab7848d08b7e2ba67ada959d77619c986f2062e1f0e8", "10e8af18d1315de936d67775d3a814cc81d0747a1a0312d84e27ae5610e313b0", "1b4276550b86caa60606bd3572b52769860a81a70754a54acc8ba789ce74d607", "1e8a2627c48266c7b813975335cfdea58c706fe36f607c97d9392e61502dc79d", "258b21c5cafb0c3768861a6df3ab0cfb4d8b495eee5ec660e16f928bf7385390", "2b224052bfd801beb7478b03e8a66f3f25ea56ea488922e98903914ac9ac930b", "3ad59c84c502cd134b0088ca9038d100e8fb5081bbd5ccca4863f3804d81f61d", "447c450a093766744ab53bf1e7063ec82866f27bcb4f4c907da25ad293bba7e3", "46101fc20c6f6568561cdd15a54018bb42980954b79aa46da8ae6f008066a30e", "4710dc676bb4b779c4361b54eb308bc84d64a2fa3d78e5f7228921eccce5d815", "510986f9a280cd05189b42eee2b69fecdf5bf9651d4cd315ea21d24a964a3c36", "5535dda5739257effef56e49a1c51c71f1d37a6e5607bb25a5eee507c59580d1", "5a7524042014642b39b1fcae85fb37556c200e64ec90824ae9ecf7b667ccfc14", "5f55028169ef85e1fa8e4b8b1b91c0b3b0fa3297c4fb22990d46ff01d22c2d6c", "6694d5573e7790a0e8d3d177d7a416ca5f5c150742ee703f3c18df76260de794", "6831e1ac20ac52634da606b658b0b2712d26984999c9d93f0c6e59fe62ca741b", "71afc1f5cd72ab97330126b566bbf4e8661aab7449f08895d21a5d08c6b051ff", "7349c27128334f787ae63ab49d90bf6d47c7288c63a0a5dfaa319d4b4541dd2c", "77f0d9fa5e10d03aa4528436e33423bfa3718b86c646615f04616294c935f840", "828ad813c7cdc2e71dcf141912c685bfe4b548c0e6d9540db6418b807c345ddd", "859714036274a75e6e57c7bab0c47a4602d2a8cfaaa33bbdb68c8359b2ed4f5c", "85a06c61598b14b015d4df233d249cd5abfa61084ef5b9f64a48e997fd829a82", "869ef4a19f6e4c6987e18b315721b8b971f7048e6eaea29c066854242b4e98d9", "8cb4febad0f0b26c6f62e1628f2053954ad2c555d67660f28dfb1b0496711952", "977e2d9a646773cc7428cdd9a34b069d6ee254fadfb4d09b3f430e95472f3cf3", "99bd767c49c775b79fdcd2eabff405f1063d9d959039c0bdd720527a7738748a", "a5c58664b23b248b16b96253880b2868fb34358911400a7ba39d7f6399935389", "aaa0f296e503cda4bc07566f592cd7a28779d433f3a23c48082af425d6d5a78f", "ab235d9fe64833f12d1334d29b558aacedfbca2356dfb9691f2d0d38a8a7bfb4", "b3b0c8f660fae65eac74fbf003f3103769b90012ae7a460863010539bb7a80da", "bab8e6d510d2ea0f1d14f12642e3f35cefa47a9b2e4c7cea1852b52bc9c49647", "c45297bbdbc8bb79b02cf41417d63352b70bcb76f1bbb1ee7d47b3e89e42f95d", "d19bca47c8a01b92640c614a9147b081a1974f69168ecd494687c827109e8f42", "d64b4340a0c488a9e79b66ec9f9d77d02b99b772c8b8afd46c1294c1d39ca478", "da969da069a82bbb5300b59161d8d7c8d423bc4ccd3b410a9b4d8932aeefc14b", "ed02c7539705696ecb7dc9d476d861f3904a8d2b7e894bd418994920935d36bb", "ee5b8abc35b549012e03a7b1e86c09491457dba6c94112a2482b18589cc2bdb9"] coverage = ["06123b58a1410873e22134ca2d88bd36680479fe354955b3579fb8ff150e4d27", "09e47c529ff77bf042ecfe858fb55c3e3eb97aac2c87f0349ab5a7efd6b3939f", "0a1f9b0eb3aa15c990c328535655847b3420231af299386cfe5efc98f9c250fe", "0cc941b37b8c2ececfed341444a456912e740ecf515d560de58b9a76562d966d", "0d34245f824cc3140150ab7848d08b7e2ba67ada959d77619c986f2062e1f0e8", "10e8af18d1315de936d67775d3a814cc81d0747a1a0312d84e27ae5610e313b0", "1b4276550b86caa60606bd3572b52769860a81a70754a54acc8ba789ce74d607", "1e8a2627c48266c7b813975335cfdea58c706fe36f607c97d9392e61502dc79d", "258b21c5cafb0c3768861a6df3ab0cfb4d8b495eee5ec660e16f928bf7385390", "2b224052bfd801beb7478b03e8a66f3f25ea56ea488922e98903914ac9ac930b", "3ad59c84c502cd134b0088ca9038d100e8fb5081bbd5ccca4863f3804d81f61d", "447c450a093766744ab53bf1e7063ec82866f27bcb4f4c907da25ad293bba7e3", "46101fc20c6f6568561cdd15a54018bb42980954b79aa46da8ae6f008066a30e", "4710dc676bb4b779c4361b54eb308bc84d64a2fa3d78e5f7228921eccce5d815", "510986f9a280cd05189b42eee2b69fecdf5bf9651d4cd315ea21d24a964a3c36", "5535dda5739257effef56e49a1c51c71f1d37a6e5607bb25a5eee507c59580d1", "5a7524042014642b39b1fcae85fb37556c200e64ec90824ae9ecf7b667ccfc14", "5f55028169ef85e1fa8e4b8b1b91c0b3b0fa3297c4fb22990d46ff01d22c2d6c", "6694d5573e7790a0e8d3d177d7a416ca5f5c150742ee703f3c18df76260de794", "6831e1ac20ac52634da606b658b0b2712d26984999c9d93f0c6e59fe62ca741b", "71afc1f5cd72ab97330126b566bbf4e8661aab7449f08895d21a5d08c6b051ff", "7349c27128334f787ae63ab49d90bf6d47c7288c63a0a5dfaa319d4b4541dd2c", "77f0d9fa5e10d03aa4528436e33423bfa3718b86c646615f04616294c935f840", "828ad813c7cdc2e71dcf141912c685bfe4b548c0e6d9540db6418b807c345ddd", "859714036274a75e6e57c7bab0c47a4602d2a8cfaaa33bbdb68c8359b2ed4f5c", "85a06c61598b14b015d4df233d249cd5abfa61084ef5b9f64a48e997fd829a82", "869ef4a19f6e4c6987e18b315721b8b971f7048e6eaea29c066854242b4e98d9", "8cb4febad0f0b26c6f62e1628f2053954ad2c555d67660f28dfb1b0496711952", "977e2d9a646773cc7428cdd9a34b069d6ee254fadfb4d09b3f430e95472f3cf3", "99bd767c49c775b79fdcd2eabff405f1063d9d959039c0bdd720527a7738748a", "a5c58664b23b248b16b96253880b2868fb34358911400a7ba39d7f6399935389", "aaa0f296e503cda4bc07566f592cd7a28779d433f3a23c48082af425d6d5a78f", "ab235d9fe64833f12d1334d29b558aacedfbca2356dfb9691f2d0d38a8a7bfb4", "b3b0c8f660fae65eac74fbf003f3103769b90012ae7a460863010539bb7a80da", "bab8e6d510d2ea0f1d14f12642e3f35cefa47a9b2e4c7cea1852b52bc9c49647", "c45297bbdbc8bb79b02cf41417d63352b70bcb76f1bbb1ee7d47b3e89e42f95d", "d19bca47c8a01b92640c614a9147b081a1974f69168ecd494687c827109e8f42", "d64b4340a0c488a9e79b66ec9f9d77d02b99b772c8b8afd46c1294c1d39ca478", "da969da069a82bbb5300b59161d8d7c8d423bc4ccd3b410a9b4d8932aeefc14b", "ed02c7539705696ecb7dc9d476d861f3904a8d2b7e894bd418994920935d36bb", "ee5b8abc35b549012e03a7b1e86c09491457dba6c94112a2482b18589cc2bdb9"]
enum34 = ["2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850", "644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a", "6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79", "8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1"] enum34 = ["2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850", "644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a", "6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79", "8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1"]
filelock = ["b8d5ca5ca1c815e1574aee746650ea7301de63d87935b3463d26368b76e31633", "d610c1bb404daf85976d7a82eb2ada120f04671007266b708606565dd03b5be6"] filelock = ["b8d5ca5ca1c815e1574aee746650ea7301de63d87935b3463d26368b76e31633", "d610c1bb404daf85976d7a82eb2ada120f04671007266b708606565dd03b5be6"]
funcsigs = ["330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca", "a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"] funcsigs = ["330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca", "a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"]
functools32 = ["89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0", "f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d"] functools32 = ["89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0", "f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d"]
futures = ["51ecb45f0add83c806c68e4b06106f90db260585b25ef2abfcda0bd95c0132fd", "c4884a65654a7c45435063e14ae85280eb1f111d94e542396717ba9828c4337f"]
glob2 = ["f5b0a686ff21f820c4d3f0c4edd216704cea59d79d00fa337e244a2f2ff83ed6"]
html5lib = ["20b159aa3badc9d5ee8f5c647e5efd02ed2a66ab8d354930bd9ff139fc1dc0a3", "66cb0dcfdbbc4f9c3ba1a63fdb511ffdbd4f513b2b6d81b80cd26ce6b3fb3736"] html5lib = ["20b159aa3badc9d5ee8f5c647e5efd02ed2a66ab8d354930bd9ff139fc1dc0a3", "66cb0dcfdbbc4f9c3ba1a63fdb511ffdbd4f513b2b6d81b80cd26ce6b3fb3736"]
identify = ["5e956558a9a1e3b3891d7c6609fc9709657a11878af288ace484d1a46a93922b", "623086059219cc7b86c77a3891f3700cb175d4ce02b8fb8802b047301d71e783"] identify = ["08826e68e39e7de53cc2ddd8f6228a4e463b4bacb20565e5301c3ec690e68d27", "2364e24a7699fea0dc910e90740adbab43eef3746eeea4e016029c34123ce66d"]
idna = ["156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", "684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16"] idna = ["c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", "ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"]
importlib-metadata = ["36b02c84f9001adf65209fefdf951be8e9014a95eab9938c0779ad5670359b1c", "60b6481a72908c93ccb707abeb926fb5a15319b9e6f0b76639a718837ee12de0"] importlib-metadata = ["a17ce1a8c7bff1e8674cb12c992375d8d0800c9190177ecf0ad93e0097224095", "b50191ead8c70adfa12495fba19ce6d75f2e0275c14c5a7beb653d6799b512bd"]
importlib-resources = ["6e2783b2538bd5a14678284a3962b0660c715e5a0f10243fd5e00a4b5974f50b", "d3279fd0f6f847cced9f7acc19bd3e5df54d34f93a2e7bb5f238f81545787078"] importlib-resources = ["6e2783b2538bd5a14678284a3962b0660c715e5a0f10243fd5e00a4b5974f50b", "d3279fd0f6f847cced9f7acc19bd3e5df54d34f93a2e7bb5f238f81545787078"]
jinja2 = ["74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", "f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4"] jinja2 = ["74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", "f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4"]
jsonschema = ["3ae8afd6f4ca6417f14bf43ef61341311598f14234cdb4174fe43d42b236a3c8", "dfd8426040892c8d0ef6da574085f282569f189cb24b70091a66c21c12d6705e"] jsonschema = ["5695bc362157eab16513b27d5ec221048220ceacbceaf35ec235b5993deb9090", "8937b03883c17c999a45a1ec70c46690ef454181f09ebcbcb21694153b9e39c8"]
livereload = ["583179dc8d49b040a9da79bd33de59e160d2a8802b939e304eb359a4419f6498", "dd4469a8f5a6833576e9f5433f1439c306de15dbbfeceabd32479b1123380fa5"] livereload = ["29cadfabcedd12eed792e0131991235b9d4764d4474bed75cf525f57109ec0a2", "e632a6cd1d349155c1d7f13a65be873b38f43ef02961804a1bba8d817fa649a7"]
lockfile = ["6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799", "6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"] lockfile = ["6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799", "6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"]
markdown = ["c00429bd503a47ec88d5e30a751e147dcb4c6889663cd3e2ba0afe858e009baa", "d02e0f9b04c500cde6637c11ad7c72671f359b87b9fe924b2383649d8841db7c"] markdown = ["c00429bd503a47ec88d5e30a751e147dcb4c6889663cd3e2ba0afe858e009baa", "d02e0f9b04c500cde6637c11ad7c72671f359b87b9fe924b2383649d8841db7c"]
markupsafe = ["048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", "130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b", "19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9", "1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af", "1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834", "1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd", "1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d", "31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7", "3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b", "4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3", "525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c", "52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2", "52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7", "5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36", "5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1", "5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e", "7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1", "83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c", "857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856", "98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550", "bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492", "d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672", "e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401", "edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6", "efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6", "f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c", "f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd", "fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1"] markupsafe = ["048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", "130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b", "19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9", "1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af", "1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834", "1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd", "1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d", "31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7", "3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b", "4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3", "525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c", "52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2", "52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7", "5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36", "5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1", "5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e", "7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1", "83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c", "857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856", "98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550", "bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492", "d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672", "e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401", "edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6", "efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6", "f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c", "f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd", "fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1"]
mkdocs = ["17d34329aad75d5de604b9ed4e31df3a4d235afefdc46ce7b1964fddb2e1e939", "8cc8b38325456b9e942c981a209eaeb1e9f3f77b493ad755bfef889b9c8d356a"] mkdocs = ["17d34329aad75d5de604b9ed4e31df3a4d235afefdc46ce7b1964fddb2e1e939", "8cc8b38325456b9e942c981a209eaeb1e9f3f77b493ad755bfef889b9c8d356a"]
mock = ["5ce3c71c5545b472da17b72268978914d0252980348636840bd34a00b5cc96c1", "b158b6df76edd239b8208d481dc46b6afd45a846b7812ff0ce58971cf5bc8bba"] mock = ["5ce3c71c5545b472da17b72268978914d0252980348636840bd34a00b5cc96c1", "b158b6df76edd239b8208d481dc46b6afd45a846b7812ff0ce58971cf5bc8bba"]
more-itertools = ["c187a73da93e7a8acc0001572aebc7e3c69daf7bf6881a2cea10650bd4420092", "c476b5d3a34e12d40130bc2f935028b5f636df8f372dc2c1c01dc19681b2039e", "fcbfeaea0be121980e15bc97b3817b5202ca73d0eae185b4550cbfce2a3ebb3d"] more-itertools = ["38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", "c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc", "fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9"]
msgpack = ["0b3b1773d2693c70598585a34ca2715873ba899565f0a7c9a1545baef7e7fbdc", "0bae5d1538c5c6a75642f75a1781f3ac2275d744a92af1a453c150da3446138b", "0ee8c8c85aa651be3aa0cd005b5931769eaa658c948ce79428766f1bd46ae2c3", "1369f9edba9500c7a6489b70fdfac773e925342f4531f1e3d4c20ac3173b1ae0", "22d9c929d1d539f37da3d1b0e16270fa9d46107beab8c0d4d2bddffffe895cee", "2ff43e3247a1e11d544017bb26f580a68306cec7a6257d8818893c1fda665f42", "31a98047355d34d047fcdb55b09cb19f633cf214c705a765bd745456c142130c", "8767eb0032732c3a0da92cbec5ac186ef89a3258c6edca09161472ca0206c45f", "8acc8910218555044e23826980b950e96685dc48124a290c86f6f41a296ea172", "ab189a6365be1860a5ecf8159c248f12d33f79ea799ae9695fa6a29896dcf1d4", "cfd6535feb0f1cf1c7cdb25773e965cc9f92928244a8c3ef6f8f8a8e1f7ae5c4", "e274cd4480d8c76ec467a85a9c6635bbf2258f0649040560382ab58cabb44bcf", "f86642d60dca13e93260187d56c2bef2487aa4d574a669e8ceefcf9f4c26fd00", "f8a57cbda46a94ed0db55b73e6ab0c15e78b4ede8690fa491a0e55128d552bb0", "fcea97a352416afcbccd7af9625159d80704a25c519c251c734527329bb20d0e"] msgpack = ["102802a9433dcf36f939b632cce9dea87310b2f163bb37ffc8bc343677726e88", "3055c44f39833b6edb27fd48028dc7822d1fd75bfeef8a2434caed8d62bb24ee", "3b7fd45c8e9e537640f541d3699b1773cf5cb9345d4a75f93baa8f055084e59c", "64abc6bf3a2ac301702f5760f4e6e227d0fd4d84d9014ef9a40faa9d43365259", "6e962c4adc7970af5a3d6a4f9bb87c617b1bd041fd9ab42355a263d421017ed9", "72259661a83f8b08ef6ee83927ce4937f841226735824af5b10a536d886eeb36", "78e297c3996fd9f35090fbddd1c148c2a71e0d6024500bcf3af90a4b9698bc19", "85f1342b9d7549dd3daf494100d47a3dc7daae703cdbfc2c9ee7bbdc8a492cba", "8ce9f88b6cb75d74eda2a5522e5c2e5ec0f17fd78605d6502abb61f46b306865", "8d0af8d64198e4b4f942a15ea9cb0dd9c4a0bd3e4e2ba57425e108bdbd4c3a0f", "9936ce3a530ca78db60b6631003b5f4ba383cfb1d9830a27d1b5c61857226e2f", "b688721df31c4bad6f508fb262719eb7e4a3532024c66d3c44ad6a4704519dda", "c28478328e9cd868ce54e8465eae9fa3605790450c66cc7e8bc416526917ef6e", "cb4e228f3d93779a1d77a1e9d72759b79dfa2975c1a5bd2a090eaa98239fa4b1", "d03d0b6e4adf5bd1cbf7a81a20a56c883351947a57b7b85235181b057adf1120", "d2b179faebd278e5f4e255a6bbc7ccb467f02ed5c4c00c8a68dc926002223a20", "f1a8f7bd84be103979a73da57be3cb929d702a656162ee466597b816fa9eec97"]
nodeenv = ["ad8259494cf1c9034539f6cced78a1da4840a4b157e23640bc4a0c0546b0cb7a"] nodeenv = ["ad8259494cf1c9034539f6cced78a1da4840a4b157e23640bc4a0c0546b0cb7a"]
packaging = ["0886227f54515e592aaa2e5a553332c73962917f2831f1b0f9b9f4380a4b9807", "f95a1e147590f204328170981833854229bb2912ac3d5f89e2a8ccd2834800c9"] packaging = ["0886227f54515e592aaa2e5a553332c73962917f2831f1b0f9b9f4380a4b9807", "f95a1e147590f204328170981833854229bb2912ac3d5f89e2a8ccd2834800c9"]
pastel = ["3108af417ec0fa6d0a620e676ec4f02c839ca13e10611586e5d2174b46aa0bc3", "d1fee8079534f99f1805a044fef946d23eee6d6a7cd34292c30e6c16be9a80b9"] pastel = ["3108af417ec0fa6d0a620e676ec4f02c839ca13e10611586e5d2174b46aa0bc3", "d1fee8079534f99f1805a044fef946d23eee6d6a7cd34292c30e6c16be9a80b9"]
pathlib2 = ["8eb170f8d0d61825e09a95b38be068299ddeda82f35e96c3301a8a5e7604cb83", "d1aa2a11ba7b8f7b21ab852b1fb5afb277e1bb99d5dfc663380b5015c0d80c5a"] pathlib2 = ["25199318e8cc3c25dcb45cbe084cc061051336d5a9ea2a12448d3d8cb748f742", "5887121d7f7df3603bca2f710e7219f3eca0eb69e0b7cc6e0a022e155ac931a7"]
pbr = ["f59d71442f9ece3dffc17bc36575768e1ee9967756e6b6535f0ee1f0054c3d68", "f6d5b23f226a2ba58e14e49aa3b1bfaf814d0199144b95d78458212444de1387"] pbr = ["f59d71442f9ece3dffc17bc36575768e1ee9967756e6b6535f0ee1f0054c3d68", "f6d5b23f226a2ba58e14e49aa3b1bfaf814d0199144b95d78458212444de1387"]
pkginfo = ["5878d542a4b3f237e359926384f1dde4e099c9f5525d236b1840cf704fa8d474", "a39076cb3eb34c333a0dd390b568e9e1e881c7bf2cc0aee12120636816f55aee"] pkginfo = ["7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb", "a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32"]
pluggy = ["447ba94990e8014ee25ec853339faf7b0fc8050cdc3289d4d71f7f410fb90095", "bde19360a8ec4dfd8a20dcb811780a30998101f078fc7ded6162f0076f50508f"] pluggy = ["8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616", "980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a"]
pre-commit = ["7542bd8ae1c58745175ea0a9295964ee82a10f7e18c4344f5e4c02bd85d02561", "87f687da6a2651d5067cfec95b854b004e95b70143cbf2369604bb3acbce25ec"] pre-commit = ["2cb7a588fdc78e4ec4e624932765e65d285159f4b3425121106cbd9060e40e04", "74ee5779a17ef540efdf9a832911fe9057b1bb57d5d0152eace6534a228a863b"]
py = ["bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694", "e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6"] py = ["bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694", "e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6"]
pygments = ["78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", "dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc"] pygments = ["5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", "e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d"]
pygments-github-lexers = ["0f9e9fb607d351c127a1e55e82a6eb491ed1fc11b2d6a0444ba217dc6d1f82c1", "aaca57e77cd6fcfce8d6ee97a998962eebf7fbb810519a8ebde427c62823e133"] pygments-github-lexers = ["0f9e9fb607d351c127a1e55e82a6eb491ed1fc11b2d6a0444ba217dc6d1f82c1", "aaca57e77cd6fcfce8d6ee97a998962eebf7fbb810519a8ebde427c62823e133"]
pylev = ["063910098161199b81e453025653ec53556c1be7165a9b7c50be2f4d57eae1c3", "1d29a87beb45ebe1e821e7a3b10da2b6b2f4c79b43f482c2df1a1f748a6e114e"] pylev = ["063910098161199b81e453025653ec53556c1be7165a9b7c50be2f4d57eae1c3", "1d29a87beb45ebe1e821e7a3b10da2b6b2f4c79b43f482c2df1a1f748a6e114e"]
pymdown-extensions = ["25b0a7967fa697b5035e23340a48594e3e93acb10b06d74574218ace3347d1df", "6cf0cf36b5a03b291ace22dc2f320f4789ce56fbdb6635a3be5fadbf5d7694dd"] pymdown-extensions = ["25b0a7967fa697b5035e23340a48594e3e93acb10b06d74574218ace3347d1df", "6cf0cf36b5a03b291ace22dc2f320f4789ce56fbdb6635a3be5fadbf5d7694dd"]
pyparsing = ["40856e74d4987de5d01761a22d1621ae1c7f8774585acae358aa5c5936c6c90b", "f353aab21fd474459d97b709e527b5571314ee5f067441dc9f88e33eecd96592"] pyparsing = ["66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", "f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3"]
pyrsistent = ["5a31f6b093da3401fefdeb53a0980e3145bb9d2bf852b579cc7b39c7f0016c87"] pyrsistent = ["5a3827d57ad3e46820e5ee4ed5b9e0ee7bc4686df6634a7368bc1863a5c48a77"]
pytest = ["3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec", "e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"] pytest = ["41568ea7ecb4a68d7f63837cf65b92ce8d0105e43196ff2b26622995bb3dc4b2", "c3c573a29d7c9547fb90217ece8a8843aa0c1328a797e200290dc3d0b4b823be"]
pytest-cov = ["513c425e931a0344944f84ea47f3956be0e416d95acbd897a44970c8d926d5d7", "e360f048b7dae3f2f2a9a4d067b2dd6b6a015d384d1577c994a43f3f7cbad762"] pytest-cov = ["0ab664b25c6aa9716cbf203b17ddb301932383046082c081b9848a0edf5add33", "230ef817450ab0699c6cc3c9c8f7a829c34674456f2ed8df1fe1d39780f7c87f"]
pytest-mock = ["53801e621223d34724926a5c98bd90e8e417ce35264365d39d6c896388dcc928", "d89a8209d722b8307b5e351496830d5cc5e192336003a485443ae9adeb7dd4c0"] pytest-mock = ["53801e621223d34724926a5c98bd90e8e417ce35264365d39d6c896388dcc928", "d89a8209d722b8307b5e351496830d5cc5e192336003a485443ae9adeb7dd4c0"]
pytest-sugar = ["26cf8289fe10880cbbc130bd77398c4e6a8b936d8393b116a5c16121d95ab283", "fcd87a74b2bce5386d244b49ad60549bfbc4602527797fac167da147983f58ab"] pytest-sugar = ["26cf8289fe10880cbbc130bd77398c4e6a8b936d8393b116a5c16121d95ab283", "fcd87a74b2bce5386d244b49ad60549bfbc4602527797fac167da147983f58ab"]
pyyaml = ["3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", "3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", "40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", "558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", "a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", "aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", "bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", "d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", "d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", "e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", "e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531"] pyyaml = ["3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", "3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", "40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", "558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", "a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", "aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", "bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", "d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", "d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", "e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", "e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531"]
requests = ["65b3a120e4329e33c9889db89c80976c5272f56ea92d3e74da8a463992e3ff54", "ea881206e59f41dbd0bd445437d792e43906703fff75ca8ff43ccdb11f33f263"] requests = ["502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", "7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b"]
requests-toolbelt = ["42c9c170abc2cacb78b8ab23ac957945c7716249206f90874651971a4acff237", "f6a531936c6fa4c6cfce1b9c10d5c4f498d16528d2a54a22ca00011205a187b5"] requests-toolbelt = ["42c9c170abc2cacb78b8ab23ac957945c7716249206f90874651971a4acff237", "f6a531936c6fa4c6cfce1b9c10d5c4f498d16528d2a54a22ca00011205a187b5"]
scandir = ["04b8adb105f2ed313a7c2ef0f1cf7aff4871aa7a1883fa4d8c44b5551ab052d6", "1444134990356c81d12f30e4b311379acfbbcd03e0bab591de2696a3b126d58e", "1b5c314e39f596875e5a95dd81af03730b338c277c54a454226978d5ba95dbb6", "346619f72eb0ddc4cf355ceffd225fa52506c92a2ff05318cfabd02a144e7c4e", "44975e209c4827fc18a3486f257154d34ec6eaec0f90fef0cca1caa482db7064", "61859fd7e40b8c71e609c202db5b0c1dbec0d5c7f1449dec2245575bdc866792", "a5e232a0bf188362fa00123cc0bb842d363a292de7126126df5527b6a369586a", "c14701409f311e7a9b7ec8e337f0815baf7ac95776cc78b419a1e6d49889a383", "c7708f29d843fc2764310732e41f0ce27feadde453261859ec0fca7865dfc41b", "c9009c527929f6e25604aec39b0a43c3f831d2947d89d6caaab22f057b7055c8", "f5c71e29b4e2af7ccdc03a020c626ede51da471173b4a6ad1e904f2b2e04b4bd"] scandir = ["04b8adb105f2ed313a7c2ef0f1cf7aff4871aa7a1883fa4d8c44b5551ab052d6", "1444134990356c81d12f30e4b311379acfbbcd03e0bab591de2696a3b126d58e", "1b5c314e39f596875e5a95dd81af03730b338c277c54a454226978d5ba95dbb6", "346619f72eb0ddc4cf355ceffd225fa52506c92a2ff05318cfabd02a144e7c4e", "44975e209c4827fc18a3486f257154d34ec6eaec0f90fef0cca1caa482db7064", "61859fd7e40b8c71e609c202db5b0c1dbec0d5c7f1449dec2245575bdc866792", "a5e232a0bf188362fa00123cc0bb842d363a292de7126126df5527b6a369586a", "c14701409f311e7a9b7ec8e337f0815baf7ac95776cc78b419a1e6d49889a383", "c7708f29d843fc2764310732e41f0ce27feadde453261859ec0fca7865dfc41b", "c9009c527929f6e25604aec39b0a43c3f831d2947d89d6caaab22f057b7055c8", "f5c71e29b4e2af7ccdc03a020c626ede51da471173b4a6ad1e904f2b2e04b4bd"]
shellingham = ["c9fd71508d4363e8a3dadf405e681021461dca9ca9a2b48c9461fdfbfceaebff", "f56b5547ed84296318c21162ce345d83dd5e4755a0e4f57daee1948479f47119"] shellingham = ["56e6c7f043661a82b276c241c8e62da62cdf710437164cdef75b3f3ac50fb384", "f24a5a01e6c81d04e252fa2ebaa37710af27e7ec9b54692bcddb9303f899101b"]
six = ["70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", "832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"] six = ["3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", "d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"]
termcolor = ["1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"] termcolor = ["1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"]
toml = ["229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", "235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e", "f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"] toml = ["229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", "235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e", "f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"]
tomlkit = ["d6506342615d051bc961f70bfcfa3d29b6616cc08a3ddfd4bc24196f16fd4ec2", "f077456d35303e7908cc233b340f71e0bec96f63429997f38ca9272b7d64029e"] tomlkit = ["d6506342615d051bc961f70bfcfa3d29b6616cc08a3ddfd4bc24196f16fd4ec2", "f077456d35303e7908cc233b340f71e0bec96f63429997f38ca9272b7d64029e"]
tornado = ["0662d28b1ca9f67108c7e3b77afabfb9c7e87bde174fbda78186ecedc2499a9d", "4e5158d97583502a7e2739951553cbd88a72076f152b4b11b64b9a10c4c49409", "732e836008c708de2e89a31cb2fa6c0e5a70cb60492bee6f1ea1047500feaf7f", "8154ec22c450df4e06b35f131adc4f2f3a12ec85981a203301d310abf580500f", "8e9d728c4579682e837c92fdd98036bd5cdefa1da2aaf6acf26947e6dd0c01c5", "d4b3e5329f572f055b587efc57d29bd051589fb5a43ec8898c77a47ec2fa2bbb", "e5f2585afccbff22390cddac29849df463b252b711aa2ce7c5f3f342a5b3b444"] tornado = ["0662d28b1ca9f67108c7e3b77afabfb9c7e87bde174fbda78186ecedc2499a9d", "4e5158d97583502a7e2739951553cbd88a72076f152b4b11b64b9a10c4c49409", "732e836008c708de2e89a31cb2fa6c0e5a70cb60492bee6f1ea1047500feaf7f", "8154ec22c450df4e06b35f131adc4f2f3a12ec85981a203301d310abf580500f", "8e9d728c4579682e837c92fdd98036bd5cdefa1da2aaf6acf26947e6dd0c01c5", "d4b3e5329f572f055b587efc57d29bd051589fb5a43ec8898c77a47ec2fa2bbb", "e5f2585afccbff22390cddac29849df463b252b711aa2ce7c5f3f342a5b3b444"]
tox = ["513e32fdf2f9e2d583c2f248f47ba9886428c949f068ac54a0469cac55df5862", "75fa30e8329b41b664585f5fb837e23ce1d7e6fa1f7811f2be571c990f9d911b"] tox = ["04f8f1aa05de8e76d7a266ccd14e0d665d429977cd42123bc38efa9b59964e9e", "25ef928babe88c71e3ed3af0c464d1160b01fca2dd1870a5bb26c2dea61a17fc"]
typing = ["4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", "57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4", "a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a"] typing = ["4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", "57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4", "a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a"]
urllib3 = ["61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", "de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22"] urllib3 = ["61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", "de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22"]
virtualenv = ["686176c23a538ecc56d27ed9d5217abd34644823d6391cbeb232f42bf722baad", "f899fafcd92e1150f40c8215328be38ff24b519cd95357fa6e78e006c7638208"] virtualenv = ["34b9ae3742abed2f95d3970acf4d80533261d6061b51160b197f84e5b4c98b4c", "fa736831a7b18bd2bfeef746beb622a92509e9733d645952da136b0639cd40cd"]
webencodings = ["a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"] webencodings = ["a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"]
zipp = ["55ca87266c38af6658b84db8cfb7343cdb0bf275f93c7afaea0d8e7a209c7478", "682b3e1c62b7026afe24eadf6be579fb45fec54c07ea218bded8092af07a68c4"]
...@@ -15,7 +15,7 @@ class SearchCommand(Command): ...@@ -15,7 +15,7 @@ class SearchCommand(Command):
flags = PyPiRepository.SEARCH_FULLTEXT flags = PyPiRepository.SEARCH_FULLTEXT
if self.option("only-name"): if self.option("only-name"):
flags = PyPiRepository.SEARCH_FULLTEXT flags = PyPiRepository.SEARCH_NAME
results = PyPiRepository().search(self.argument("tokens"), flags) results = PyPiRepository().search(self.argument("tokens"), flags)
......
...@@ -110,7 +110,7 @@ class PipInstaller(BaseInstaller): ...@@ -110,7 +110,7 @@ class PipInstaller(BaseInstaller):
raise raise
def run(self, *args, **kwargs): # type: (...) -> str def run(self, *args, **kwargs): # type: (...) -> str
return self._env.run("pip", *args, **kwargs) return self._env.run("python", "-m", "pip", *args, **kwargs)
def requirement(self, package, formatted=False): def requirement(self, package, formatted=False):
if formatted and not package.source_type: if formatted and not package.source_type:
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os
import re import re
import shutil import shutil
import tempfile import tempfile
...@@ -12,6 +13,7 @@ from clikit.api.io.flags import VERY_VERBOSE ...@@ -12,6 +13,7 @@ from clikit.api.io.flags import VERY_VERBOSE
from poetry.utils._compat import Path from poetry.utils._compat import Path
from poetry.utils._compat import basestring from poetry.utils._compat import basestring
from poetry.utils._compat import glob
from poetry.utils._compat import lru_cache from poetry.utils._compat import lru_cache
from poetry.vcs import get_vcs from poetry.vcs import get_vcs
...@@ -55,8 +57,12 @@ class Builder(object): ...@@ -55,8 +57,12 @@ class Builder(object):
explicitely_excluded = set() explicitely_excluded = set()
for excluded_glob in self._package.exclude: for excluded_glob in self._package.exclude:
for excluded in self._path.glob(str(excluded_glob)): for excluded in glob(
explicitely_excluded.add(excluded.relative_to(self._path).as_posix()) os.path.join(self._path.as_posix(), str(excluded_glob)), recursive=True
):
explicitely_excluded.add(
Path(excluded).relative_to(self._path).as_posix()
)
ignored = vcs_ignored_files | explicitely_excluded ignored = vcs_ignored_files | explicitely_excluded
result = set() result = set()
......
...@@ -374,7 +374,6 @@ class VersionSolver: ...@@ -374,7 +374,6 @@ class VersionSolver:
return dependency.name return dependency.name
if not version.is_root():
version = self._provider.complete_package(version) version = self._provider.complete_package(version)
conflict = False conflict = False
......
...@@ -11,6 +11,9 @@ class DependencyPackage(object): ...@@ -11,6 +11,9 @@ class DependencyPackage(object):
def package(self): def package(self):
return self._package return self._package
def clone(self): # type: () -> DependencyPackage
return self.__class__(self._dependency, self._package.clone())
def __getattr__(self, name): def __getattr__(self, name):
return getattr(self._package, name) return getattr(self._package, name)
......
...@@ -238,7 +238,7 @@ class Locker(object): ...@@ -238,7 +238,7 @@ class Locker(object):
data = { data = {
"name": package.pretty_name, "name": package.pretty_name,
"version": package.pretty_version, "version": package.pretty_version,
"description": package.description, "description": package.description or "",
"category": package.category, "category": package.category,
"optional": package.optional, "optional": package.optional,
"python-versions": package.python_versions, "python-versions": package.python_versions,
......
...@@ -369,6 +369,9 @@ class Package(object): ...@@ -369,6 +369,9 @@ class Package(object):
for dep in self.requires: for dep in self.requires:
clone.requires.append(dep) clone.requires.append(dep)
for dep in self.dev_requires:
clone.dev_requires.append(dep)
return clone return clone
def __hash__(self): def __hash__(self):
......
...@@ -43,3 +43,13 @@ class ProjectPackage(Package): ...@@ -43,3 +43,13 @@ class ProjectPackage(Package):
self._python_marker = parse_marker( self._python_marker = parse_marker(
create_nested_marker("python_version", self._python_constraint) create_nested_marker("python_version", self._python_constraint)
) )
def clone(self): # type: () -> ProjectPackage
package = super(ProjectPackage, self).clone()
package.build = self.build
package.packages = self.packages[:]
package.include = self.include[:]
package.exclude = self.exclude[:]
return package
...@@ -28,6 +28,7 @@ from poetry.repositories import Pool ...@@ -28,6 +28,7 @@ from poetry.repositories import Pool
from poetry.utils._compat import PY35 from poetry.utils._compat import PY35
from poetry.utils._compat import Path from poetry.utils._compat import Path
from poetry.utils._compat import OrderedDict
from poetry.utils.helpers import parse_requires from poetry.utils.helpers import parse_requires
from poetry.utils.helpers import safe_rmtree from poetry.utils.helpers import safe_rmtree
from poetry.utils.env import EnvManager from poetry.utils.env import EnvManager
...@@ -438,9 +439,13 @@ class Provider: ...@@ -438,9 +439,13 @@ class Provider:
self, package self, package
): # type: (DependencyPackage) -> DependencyPackage ): # type: (DependencyPackage) -> DependencyPackage
if package.is_root(): if package.is_root():
return package package = package.clone()
if package.source_type not in {"directory", "file", "git"}: if not package.is_root() and package.source_type not in {
"directory",
"file",
"git",
}:
package = DependencyPackage( package = DependencyPackage(
package.dependency, package.dependency,
self._pool.package( self._pool.package(
...@@ -472,8 +477,7 @@ class Provider: ...@@ -472,8 +477,7 @@ class Provider:
# An example of this is: # An example of this is:
# - pypiwin32 (220); sys_platform == "win32" and python_version >= "3.6" # - pypiwin32 (220); sys_platform == "win32" and python_version >= "3.6"
# - pypiwin32 (219); sys_platform == "win32" and python_version < "3.6" # - pypiwin32 (219); sys_platform == "win32" and python_version < "3.6"
if not package.is_root(): duplicates = OrderedDict()
duplicates = {}
for dep in dependencies: for dep in dependencies:
if dep.name not in duplicates: if dep.name not in duplicates:
duplicates[dep.name] = [] duplicates[dep.name] = []
...@@ -486,12 +490,10 @@ class Provider: ...@@ -486,12 +490,10 @@ class Provider:
dependencies.append(deps[0]) dependencies.append(deps[0])
continue continue
self.debug( self.debug("<debug>Duplicate dependencies for {}</debug>".format(dep_name))
"<debug>Duplicate dependencies for {}</debug>".format(dep_name)
)
# Regrouping by constraint # Regrouping by constraint
by_constraint = {} by_constraint = OrderedDict()
for dep in deps: for dep in deps:
if dep.constraint not in by_constraint: if dep.constraint not in by_constraint:
by_constraint[dep.constraint] = [] by_constraint[dep.constraint] = []
...@@ -535,9 +537,7 @@ class Provider: ...@@ -535,9 +537,7 @@ class Provider:
if len(by_constraint) == 1: if len(by_constraint) == 1:
self.debug( self.debug(
"<debug>Merging requirements for {}</debug>".format( "<debug>Merging requirements for {}</debug>".format(str(deps[0]))
str(deps[0])
)
) )
dependencies.append(list(by_constraint.values())[0][0]) dependencies.append(list(by_constraint.values())[0][0])
continue continue
...@@ -595,7 +595,9 @@ class Provider: ...@@ -595,7 +595,9 @@ class Provider:
) )
) )
if package.dependency.is_directory() and dep.is_directory(): if (package.dependency.is_directory() or package.dependency.is_file()) and (
dep.is_directory() or dep.is_file()
):
if dep.path.as_posix().startswith(package.source_url): if dep.path.as_posix().startswith(package.source_url):
relative = (Path(package.source_url) / dep.path).relative_to( relative = (Path(package.source_url) / dep.path).relative_to(
package.source_url package.source_url
......
...@@ -349,11 +349,11 @@ class LegacyRepository(PyPiRepository): ...@@ -349,11 +349,11 @@ class LegacyRepository(PyPiRepository):
default_link = links[0] default_link = links[0]
for link in links: for link in links:
if link.is_wheel: if link.is_wheel:
m = wheel_file_re.match(default_link.filename) m = wheel_file_re.match(link.filename)
python = m.group("pyver") python = m.group("pyver")
platform = m.group("plat") platform = m.group("plat")
if python == "py2.py3" and platform == "any": if python == "py2.py3" and platform == "any":
urls["bdist_wheel"] = default_link.url urls["bdist_wheel"] = link.url
elif link.filename.endswith(".tar.gz"): elif link.filename.endswith(".tar.gz"):
urls["sdist"] = link.url urls["sdist"] = link.url
elif ( elif (
......
...@@ -34,6 +34,7 @@ from poetry.packages import Package ...@@ -34,6 +34,7 @@ from poetry.packages import Package
from poetry.semver import parse_constraint from poetry.semver import parse_constraint
from poetry.semver import VersionConstraint from poetry.semver import VersionConstraint
from poetry.semver import VersionRange from poetry.semver import VersionRange
from poetry.semver.exceptions import ParseVersionError
from poetry.utils._compat import Path from poetry.utils._compat import Path
from poetry.utils._compat import to_str from poetry.utils._compat import to_str
from poetry.utils.helpers import parse_requires from poetry.utils.helpers import parse_requires
...@@ -116,7 +117,16 @@ class PyPiRepository(Repository): ...@@ -116,7 +117,16 @@ class PyPiRepository(Repository):
) )
continue continue
try:
package = Package(name, version) package = Package(name, version)
except ParseVersionError:
self._log(
'Unable to parse version "{}" for the {} package, skipping'.format(
version, name
),
level="debug",
)
continue
if package.is_prerelease() and not allow_prereleases: if package.is_prerelease() and not allow_prereleases:
continue continue
......
class ParseVersionError(ValueError):
pass
...@@ -4,6 +4,7 @@ from typing import List ...@@ -4,6 +4,7 @@ from typing import List
from typing import Union from typing import Union
from .empty_constraint import EmptyConstraint from .empty_constraint import EmptyConstraint
from .exceptions import ParseVersionError
from .patterns import COMPLETE_VERSION from .patterns import COMPLETE_VERSION
from .version_constraint import VersionConstraint from .version_constraint import VersionConstraint
from .version_range import VersionRange from .version_range import VersionRange
...@@ -197,7 +198,7 @@ class Version(VersionRange): ...@@ -197,7 +198,7 @@ class Version(VersionRange):
def parse(cls, text): # type: (str) -> Version def parse(cls, text): # type: (str) -> Version
match = COMPLETE_VERSION.match(text) match = COMPLETE_VERSION.match(text)
if match is None: if match is None:
raise ValueError('Unable to parse "{}".'.format(text)) raise ParseVersionError('Unable to parse "{}".'.format(text))
text = text.rstrip(".") text = text.rstrip(".")
......
import subprocess
import sys import sys
try: try:
...@@ -7,6 +6,11 @@ except ImportError: ...@@ -7,6 +6,11 @@ except ImportError:
from functools import lru_cache from functools import lru_cache
try: try:
from glob2 import glob
except ImportError:
from glob import glob
try:
import urllib.parse as urlparse import urllib.parse as urlparse
except ImportError: except ImportError:
import urlparse import urlparse
...@@ -43,6 +47,12 @@ else: ...@@ -43,6 +47,12 @@ else:
from pathlib2 import Path from pathlib2 import Path
if not PY36:
from collections import OrderedDict
else:
OrderedDict = dict
def decode(string, encodings=None): def decode(string, encodings=None):
if not PY2 and not isinstance(string, bytes): if not PY2 and not isinstance(string, bytes):
return string return string
......
...@@ -5,6 +5,7 @@ import stat ...@@ -5,6 +5,7 @@ import stat
import tempfile import tempfile
from contextlib import contextmanager from contextlib import contextmanager
from typing import List
from typing import Optional from typing import Optional
from typing import Union from typing import Union
...@@ -41,7 +42,7 @@ def temporary_directory(*args, **kwargs): ...@@ -41,7 +42,7 @@ def temporary_directory(*args, **kwargs):
shutil.rmtree(name) shutil.rmtree(name)
def parse_requires(requires): # type: (str) -> Union[list, None] def parse_requires(requires): # type: (str) -> List[str]
lines = requires.split("\n") lines = requires.split("\n")
requires_dist = [] requires_dist = []
...@@ -79,7 +80,6 @@ def parse_requires(requires): # type: (str) -> Union[list, None] ...@@ -79,7 +80,6 @@ def parse_requires(requires): # type: (str) -> Union[list, None]
requires_dist.append(line) requires_dist.append(line)
if requires_dist:
return requires_dist return requires_dist
......
...@@ -41,13 +41,15 @@ typing = { version = "^3.6", python = "~2.7 || ~3.4" } ...@@ -41,13 +41,15 @@ typing = { version = "^3.6", python = "~2.7 || ~3.4" }
# Use pathlib2 for Python 2.7 and 3.4 # Use pathlib2 for Python 2.7 and 3.4
pathlib2 = { version = "^2.3", python = "~2.7 || ~3.4" } pathlib2 = { version = "^2.3", python = "~2.7 || ~3.4" }
# Use glob2 for Python 2.7 and 3.4
glob2 = { version = "^0.6", python = "~2.7 || ~3.4" }
# Use virtualenv for Python 2.7 since venv does not exist # Use virtualenv for Python 2.7 since venv does not exist
virtualenv = { version = "^16.0", python = "~2.7" } virtualenv = { version = "^16.0", python = "~2.7" }
# functools32 is needed for Python 2.7 # functools32 is needed for Python 2.7
functools32 = { version = "^3.2.3", python = "~2.7" } functools32 = { version = "^3.2.3", python = "~2.7" }
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
pytest = "^3.4" pytest = "^4.1"
pytest-cov = "^2.5" pytest-cov = "^2.5"
mkdocs = { version = "^1.0", python = "~2.7.9 || ^3.4" } mkdocs = { version = "^1.0", python = "~2.7.9 || ^3.4" }
pymdown-extensions = "^6.0" pymdown-extensions = "^6.0"
......
...@@ -37,8 +37,9 @@ class MakeReleaseCommand(Command): ...@@ -37,8 +37,9 @@ class MakeReleaseCommand(Command):
for python in self.option("python"): for python in self.option("python"):
parts = python.split(":", 1) parts = python.split(":", 1)
if len(parts) == 1: if len(parts) == 1:
pythons[parts[0]] = self.PYTHON[parts[0]] python = self.PYTHON[parts[0]]
version = parts[0]
else:
version, python = parts version, python = parts
pythons[version] = python pythons[version] = python
......
import pytest import pytest
from cleo.testers import CommandTester from cleo.testers import CommandTester
from clikit.formatter.ansi_formatter import AnsiFormatter
from tests.helpers import get_package from tests.helpers import get_package
...@@ -174,7 +176,8 @@ def test_show_basic_with_not_installed_packages_decorated(app, poetry, installed ...@@ -174,7 +176,8 @@ def test_show_basic_with_not_installed_packages_decorated(app, poetry, installed
} }
) )
tester.execute(decorated=True) tester.io.set_formatter(AnsiFormatter(forced=True))
tester.execute()
expected = """\ expected = """\
\033[32mcachy \033[0m \033[36m0.1.0\033[0m Cachy package \033[32mcachy \033[0m \033[36m0.1.0\033[0m Cachy package
...@@ -304,7 +307,8 @@ def test_show_latest_decorated(app, poetry, installed, repo): ...@@ -304,7 +307,8 @@ def test_show_latest_decorated(app, poetry, installed, repo):
} }
) )
tester.execute("--latest", decorated=True) tester.io.set_formatter(AnsiFormatter(forced=True))
tester.execute("--latest")
expected = """\ expected = """\
\033[32mcachy \033[0m \033[36m0.1.0\033[0m \033[33m0.2.0\033[0m Cachy package \033[32mcachy \033[0m \033[36m0.1.0\033[0m \033[33m0.2.0\033[0m Cachy package
......
[tool.poetry]
name = "project-with-transitive-file-dependencies"
version = "1.2.3"
description = "This is a description"
authors = ["Your Name <you@example.com>"]
license = "MIT"
[tool.poetry.dependencies]
python = "*"
demo = {path = "../../distributions/demo-0.1.0-py2.py3-none-any.whl"}
[tool.poetry.dev-dependencies]
# -*- coding: utf-8 -*-
from distutils.core import setup
packages = ["project_with_extras"]
package_data = {"": ["*"]}
extras_require = {"extras_a": ["pendulum>=1.4.4"], "extras_b": ["cachy>=0.2.0"]}
setup_kwargs = {
"name": "project-with-extras",
"version": "1.2.3",
"description": "This is a description",
"long_description": None,
"author": "Your Name",
"author_email": "you@example.com",
"url": None,
"packages": packages,
"package_data": package_data,
"extras_require": extras_require,
}
setup(**setup_kwargs)
# -*- coding: utf-8 -*-
from setuptools import setup
kwargs = dict(
name="demo",
license="MIT",
version="0.1.2",
description="Demo project.",
author="Sébastien Eustace",
author_email="sebastien@eustace.io",
url="https://github.com/demo/demo",
packages=["demo"],
)
setup(**kwargs)
[[package]]
category = "main"
description = ""
name = "demo"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "0.1.0"
[package.dependencies]
pendulum = ">=1.4.4"
[package.extras]
bar = ["tomlkit"]
foo = ["cleo"]
[package.source]
reference = ""
type = "file"
url = "tests/fixtures/directory/project_with_transitive_file_dependencies/../../distributions/demo-0.1.0-py2.py3-none-any.whl"
[[package]]
category = "main"
description = ""
name = "pendulum"
optional = false
python-versions = "*"
version = "1.4.4"
[[package]]
category = "main"
description = ""
name = "project-with-transitive-file-dependencies"
optional = false
python-versions = "*"
version = "1.2.3"
[package.dependencies]
demo = "*"
[package.source]
reference = ""
type = "directory"
url = "tests/fixtures/directory/project_with_transitive_file_dependencies"
[metadata]
content-hash = "123456789"
python-versions = "*"
[metadata.hashes]
demo = ["70e704135718fffbcbf61ed1fc45933cfd86951a744b681000eaaa75da31f17a"]
pendulum = []
project-with-transitive-file-dependencies = []
...@@ -710,6 +710,28 @@ def test_run_installs_with_local_poetry_directory_transitive( ...@@ -710,6 +710,28 @@ def test_run_installs_with_local_poetry_directory_transitive(
assert len(installer.installer.installs) == 2 assert len(installer.installer.installs) == 2
def test_run_installs_with_local_poetry_file_transitive(
installer, locker, repo, package, tmpdir
):
file_path = Path(
"tests/fixtures/directory/project_with_transitive_file_dependencies/"
)
package.add_dependency(
"project-with-transitive-file-dependencies", {"path": str(file_path)}
)
repo.add_package(get_package("pendulum", "1.4.4"))
repo.add_package(get_package("cachy", "0.2.0"))
installer.run()
expected = fixture("with-file-dependency-transitive")
assert locker.written_data == expected
assert len(installer.installer.installs) == 3
def test_run_installs_with_local_setuptools_directory( def test_run_installs_with_local_setuptools_directory(
installer, locker, repo, package, tmpdir installer, locker, repo, package, tmpdir
): ):
......
Copyright (c) 2018 Sébastien Eustace
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 without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons 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 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.
[tool.poetry]
name = "my-package"
version = "1.2.3"
description = "Some description."
authors = [
"Sébastien Eustace <sebastien@eustace.io>"
]
license = "MIT"
readme = "README.rst"
homepage = "https://poetry.eustace.io/"
repository = "https://github.com/sdispater/poetry"
documentation = "https://poetry.eustace.io/docs"
keywords = ["packaging", "dependency", "poetry"]
classifiers = [
"Topic :: Software Development :: Build Tools",
"Topic :: Software Development :: Libraries :: Python Modules"
]
exclude = [
"**/SecondBar.py",
"my_package/FooBar/*",
"my_package/Foo/Bar.py",
"my_package/Foo/lowercasebar.py",
"my_package/bar/foo.py",
"my_package/bar/CapitalFoo.py"
]
# Requirements
[tool.poetry.dependencies]
python = "^3.6"
cleo = "^0.6"
cachy = { version = "^0.2.0", extras = ["msgpack"] }
pendulum = { version = "^1.4", optional = true }
[tool.poetry.dev-dependencies]
pytest = "~3.4"
[tool.poetry.extras]
time = ["pendulum"]
[tool.poetry.scripts]
my-script = "my_package:main"
my-2nd-script = "my_package:main2"
extra-script = {callable = "my_package.extra:main", extras = ["time"]}
Copyright (c) 2018 Sébastien Eustace
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 without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons 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 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.
[tool.poetry]
name = "my-package"
version = "1.2.3"
description = "Some description."
authors = [
"Sébastien Eustace <sebastien@eustace.io>"
]
license = "MIT"
readme = "README.rst"
homepage = "https://poetry.eustace.io/"
repository = "https://github.com/sdispater/poetry"
documentation = "https://poetry.eustace.io/docs"
keywords = ["packaging", "dependency", "poetry"]
classifiers = [
"Topic :: Software Development :: Build Tools",
"Topic :: Software Development :: Libraries :: Python Modules"
]
exclude = [
"my_package/Bar/*/bar/*.py"
]
# Requirements
[tool.poetry.dependencies]
python = "^3.6"
cleo = "^0.6"
cachy = { version = "^0.2.0", extras = ["msgpack"] }
pendulum = { version = "^1.4", optional = true }
[tool.poetry.dev-dependencies]
pytest = "~3.4"
[tool.poetry.extras]
time = ["pendulum"]
[tool.poetry.scripts]
my-script = "my_package:main"
my-2nd-script = "my_package:main2"
extra-script = {callable = "my_package.extra:main", extras = ["time"]}
...@@ -17,3 +17,39 @@ def test_builder_find_excluded_files(mocker): ...@@ -17,3 +17,39 @@ def test_builder_find_excluded_files(mocker):
) )
assert builder.find_excluded_files() == {"my_package/sub_pkg1/extra_file.xml"} assert builder.find_excluded_files() == {"my_package/sub_pkg1/extra_file.xml"}
def test_builder_find_case_sensitive_excluded_files(mocker):
p = mocker.patch("poetry.vcs.git.Git.get_ignored_files")
p.return_value = []
builder = Builder(
Poetry.create(Path(__file__).parent / "fixtures" / "case_sensitive_exclusions"),
NullEnv(),
NullIO(),
)
assert builder.find_excluded_files() == {
"my_package/FooBar/Bar.py",
"my_package/FooBar/lowercasebar.py",
"my_package/Foo/SecondBar.py",
"my_package/Foo/Bar.py",
"my_package/Foo/lowercasebar.py",
"my_package/bar/foo.py",
"my_package/bar/CapitalFoo.py",
}
def test_builder_find_invalid_case_sensitive_excluded_files(mocker):
p = mocker.patch("poetry.vcs.git.Git.get_ignored_files")
p.return_value = []
builder = Builder(
Poetry.create(
Path(__file__).parent / "fixtures" / "invalid_case_sensitive_exclusions"
),
NullEnv(),
NullIO(),
)
assert {"my_package/Bar/foo/bar/Foo.py"} == builder.find_excluded_files()
import pytest
pytest.register_assert_rewrite("tests.mixology.helpers")
...@@ -107,3 +107,31 @@ cachecontrol = [] ...@@ -107,3 +107,31 @@ cachecontrol = []
lockfile_dep = package.extras["filecache"][0] lockfile_dep = package.extras["filecache"][0]
assert lockfile_dep.name == "lockfile" assert lockfile_dep.name == "lockfile"
def test_lock_packages_with_null_description(locker, root):
package_a = get_package("A", "1.0.0")
package_a.description = None
locker.set_lock_data(root, [package_a])
with locker.lock.open(encoding="utf-8") as f:
content = f.read()
expected = """[[package]]
category = "main"
description = ""
name = "A"
optional = false
python-versions = "*"
version = "1.0.0"
[metadata]
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
python-versions = "*"
[metadata.hashes]
A = []
"""
assert expected == content
...@@ -228,6 +228,28 @@ def test_search_for_directory_setup_read_setup_with_extras(provider, mocker): ...@@ -228,6 +228,28 @@ def test_search_for_directory_setup_read_setup_with_extras(provider, mocker):
} }
@pytest.mark.skipif(not PY35, reason="AST parsing does not work for Python <3.4")
def test_search_for_directory_setup_read_setup_with_no_dependencies(provider, mocker):
mocker.patch("poetry.utils.env.EnvManager.get", return_value=MockEnv())
dependency = DirectoryDependency(
"demo",
Path(__file__).parent.parent
/ "fixtures"
/ "git"
/ "github.com"
/ "demo"
/ "no-dependencies",
)
package = provider.search_for_directory(dependency)[0]
assert package.name == "demo"
assert package.version.text == "0.1.2"
assert package.requires == []
assert package.extras == {}
def test_search_for_directory_poetry(provider): def test_search_for_directory_poetry(provider):
dependency = DirectoryDependency( dependency = DirectoryDependency(
"demo", Path(__file__).parent.parent / "fixtures" / "project_with_extras" "demo", Path(__file__).parent.parent / "fixtures" / "project_with_extras"
......
...@@ -17,6 +17,7 @@ from tests.helpers import get_package ...@@ -17,6 +17,7 @@ from tests.helpers import get_package
from tests.repositories.test_legacy_repository import ( from tests.repositories.test_legacy_repository import (
MockRepository as MockLegacyRepository, MockRepository as MockLegacyRepository,
) )
from tests.repositories.test_pypi_repository import MockRepository as MockPyPIRepository
@pytest.fixture() @pytest.fixture()
...@@ -1533,3 +1534,38 @@ def test_solver_can_solve_with_legacy_repository_using_proper_python_compatible_ ...@@ -1533,3 +1534,38 @@ def test_solver_can_solve_with_legacy_repository_using_proper_python_compatible_
check_solver_result( check_solver_result(
ops, [{"job": "install", "package": get_package("isort", "4.3.4")}] ops, [{"job": "install", "package": get_package("isort", "4.3.4")}]
) )
def test_solver_skips_invalid_versions(package, installed, locked, io):
package.python_versions = "^3.7"
repo = MockPyPIRepository()
pool = Pool([repo])
solver = Solver(package, pool, installed, locked, io)
package.add_dependency("trackpy", "^0.4")
ops = solver.solve()
check_solver_result(
ops, [{"job": "install", "package": get_package("trackpy", "0.4.1")}]
)
def test_multiple_constraints_on_root(package, solver, repo):
package.add_dependency("foo", {"version": "^1.0", "python": "^2.7"})
package.add_dependency("foo", {"version": "^2.0", "python": "^3.7"})
foo15 = get_package("foo", "1.5.0")
foo25 = get_package("foo", "2.5.0")
repo.add_package(foo15)
repo.add_package(foo25)
ops = solver.solve()
check_solver_result(
ops,
[{"job": "install", "package": foo15}, {"job": "install", "package": foo25}],
)
{
"info": {
"author": "Trackpy Contributors",
"author_email": "daniel.b.allan@gmail.com",
"bugtrack_url": null,
"classifiers": [],
"description": "",
"description_content_type": "",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/soft-matter/trackpy",
"keywords": "",
"license": "",
"maintainer": "",
"maintainer_email": "",
"name": "trackpy",
"package_url": "https://pypi.org/project/trackpy/",
"platform": "",
"project_url": "https://pypi.org/project/trackpy/",
"project_urls": {
"Homepage": "https://github.com/soft-matter/trackpy"
},
"release_url": "https://pypi.org/project/trackpy/0.4.1/",
"requires_dist": null,
"requires_python": "",
"summary": "particle-tracking toolkit",
"version": "0.4.1"
},
"last_serial": 3786947,
"releases": {
"0.4.1": [
{
"comment_text": "",
"digests": {
"md5": "4c92e8b74840f57c6047f56a4a4412c4",
"sha256": "f682f75e99f6c29c65e8531899b957c67d9d5a027b28b44258fa2c4a18e851cd"
},
"downloads": -1,
"filename": "trackpy-0.4.1.tar.gz",
"has_sig": false,
"md5_digest": "4c92e8b74840f57c6047f56a4a4412c4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 121998,
"upload_time": "2018-04-21T09:59:50",
"url": "https://files.pythonhosted.org/packages/62/31/797febf2ea8ea316c345c1d0f10503c3901f3fca5c3ffdc6e92717efdcad/trackpy-0.4.1.tar.gz"
}
],
"unknown": [
{
"comment_text": "",
"digests": {
"md5": "6a879fe7871bd5c62d41b5a2ed84a5cd",
"sha256": "88fedb53b03451a56422d4ecb393ea6bb043e821b3ee1e6518485b303e3bddf5"
},
"downloads": -1,
"filename": "trackpy-unknown.tar.gz",
"has_sig": false,
"md5_digest": "6a879fe7871bd5c62d41b5a2ed84a5cd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 63292,
"upload_time": "2014-10-13T17:33:16",
"url": "https://files.pythonhosted.org/packages/35/23/3b6422d3c006251e2ad857f5fe520b193d473154f88d1f27de50798f2c6c/trackpy-unknown.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "4c92e8b74840f57c6047f56a4a4412c4",
"sha256": "f682f75e99f6c29c65e8531899b957c67d9d5a027b28b44258fa2c4a18e851cd"
},
"downloads": -1,
"filename": "trackpy-0.4.1.tar.gz",
"has_sig": false,
"md5_digest": "4c92e8b74840f57c6047f56a4a4412c4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 121998,
"upload_time": "2018-04-21T09:59:50",
"url": "https://files.pythonhosted.org/packages/62/31/797febf2ea8ea316c345c1d0f10503c3901f3fca5c3ffdc6e92717efdcad/trackpy-0.4.1.tar.gz"
}
]
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment