Giter Site home page Giter Site logo

pradyunsg / zazo Goto Github PK

View Code? Open in Web Editor NEW
80.0 14.0 7.0 196 KB

Pure Python Dependency Resolution (see https://github.com/sarugaku/resolvelib/ instead)

License: MIT License

Python 98.82% Shell 1.18%
python dependency-resolution pip package-management

zazo's Introduction

zazo

Build Status Checked with mypy

An extensible Dependency Resolver, written in Python. Intended for bringing dependency resolution to pip.

Motivation

The motivation for this project is to make it feasible and easy for user-facing package managers written in Python to do proper dependency resolution.

This project has grown out of a GSoC Project, which aimed to bring proper dependency resolution to pip. Once this package is ready, work will be done to make pip use this instead of its home-grown solution.

Development

This project uses nox extensively.

  • Documentation is built with nox -s docs.
  • Linting and MyPy checking can be done using nox -s lint
  • Tests are run with nox -s test.

Currently, the documentation of this project is non-existent but this shall be rectified once the actual internal details of the package stabilize.

Relationship with PyPA

This project (or the equivalent resolvelib) will move into the PyPA Umberella once it matures.

zazo's People

Contributors

pradyunsg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zazo's Issues

pip install records[pandas]==0.5.3 doesn't install pandas

The records[pandas]==0.5.3 depends on tablib>=0.11.4(via install_requirements) and tablib[pandas](via extras_require=pandas). The tablib[pandas] depends on pandas(via extras_require=pandas). So pip install records[pandas]==0.5.3 should install pandas, but it doesn't install it:

$ pip --version
pip 19.2.2 from /Users/albert/Projects/pip-tools/.venv/lib/python3.7/site-packages/pip (python 3.7)

$ pip install records[pandas]==0.5.3
Collecting records[pandas]
  Using cached https://files.pythonhosted.org/packages/ef/93/2467c761ea3729713ab97842a46cc125ad09d14a0a174cb637bee4983911/records-0.5.3-py2.py3-none-any.whl
Collecting SQLAlchemy; python_version >= "3.0" (from records[pandas])
  Downloading https://files.pythonhosted.org/packages/c2/75/6217c626fa22ad56ae5ccb1a36e7c4f17f5ca31543887e00179468d10464/SQLAlchemy-1.3.7.tar.gz (5.9MB)
     |████████████████████████████████| 5.9MB 4.1MB/s
Collecting docopt (from records[pandas])
  Using cached https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz
Collecting tablib>=0.11.4 (from records[pandas])
  Downloading https://files.pythonhosted.org/packages/7b/c7/cb74031b330cd94f3580926dc707d148b4ba9138449fc9f433cb79e640d8/tablib-0.13.0-py3-none-any.whl (75kB)
     |████████████████████████████████| 81kB 4.5MB/s
Collecting openpyxl<2.5.0 (from records[pandas])
  Using cached https://files.pythonhosted.org/packages/77/26/0bd1a39776f53b4f28e5bb1d26b3fcd99068584a7e1ddca4e09c0d5fd592/openpyxl-2.4.11.tar.gz
Collecting backports.csv (from tablib>=0.11.4->records[pandas])
  Using cached https://files.pythonhosted.org/packages/8e/26/a6bd68f13e0f38fbb643d6e497fc3462be83a0b6c4d43425c78bb51a7291/backports.csv-1.0.7-py2.py3-none-any.whl
Collecting xlrd (from tablib>=0.11.4->records[pandas])
  Using cached https://files.pythonhosted.org/packages/b0/16/63576a1a001752e34bf8ea62e367997530dc553b689356b9879339cf45a4/xlrd-1.2.0-py2.py3-none-any.whl
Collecting xlwt (from tablib>=0.11.4->records[pandas])
  Using cached https://files.pythonhosted.org/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl
Collecting pyyaml (from tablib>=0.11.4->records[pandas])
Collecting odfpy (from tablib>=0.11.4->records[pandas])
  Using cached https://files.pythonhosted.org/packages/85/7d/8f6d1f2a4683be362b101c00232b4c3839e4e4a90e0945d8d43ec6aa671d/odfpy-1.4.0.tar.gz
Collecting jdcal (from openpyxl<2.5.0->records[pandas])
  Using cached https://files.pythonhosted.org/packages/f0/da/572cbc0bc582390480bbd7c4e93d14dc46079778ed915b505dc494b37c57/jdcal-1.4.1-py2.py3-none-any.whl
Collecting et_xmlfile (from openpyxl<2.5.0->records[pandas])
  Using cached https://files.pythonhosted.org/packages/22/28/a99c42aea746e18382ad9fb36f64c1c1f04216f41797f2f0fa567da11388/et_xmlfile-1.0.1.tar.gz
Collecting defusedxml (from odfpy->tablib>=0.11.4->records[pandas])
  Using cached https://files.pythonhosted.org/packages/06/74/9b387472866358ebc08732de3da6dc48e44b0aacd2ddaa5cb85ab7e986a2/defusedxml-0.6.0-py2.py3-none-any.whl
Building wheels for collected packages: SQLAlchemy, docopt, openpyxl, odfpy, et-xmlfile
  Building wheel for SQLAlchemy (setup.py) ... done
  Created wheel for SQLAlchemy: filename=SQLAlchemy-1.3.7-cp37-cp37m-macosx_10_14_x86_64.whl size=1145604 sha256=5397c866669ee8461c23ce93e38c11eaa3783f08e835c961d1663bfb374cef4f
  Stored in directory: /Users/albert/Library/Caches/pip/wheels/80/e0/68/3d11cc7209b5bd2c7d55cbb56c6bda843cc82f77c8387468ea
  Building wheel for docopt (setup.py) ... done
  Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13704 sha256=97b55e96cd59a303ecd1b5c514f1c9953c4d92085e57d8feeaa7382f955c0da2
  Stored in directory: /Users/albert/Library/Caches/pip/wheels/9b/04/dd/7daf4150b6d9b12949298737de9431a324d4b797ffd63f526e
  Building wheel for openpyxl (setup.py) ... done
  Created wheel for openpyxl: filename=openpyxl-2.4.11-py2.py3-none-any.whl size=222820 sha256=98c8b31114291ed8ab8fc6e2f95173fec10993b41733296a19aed0ef76dce57d
  Stored in directory: /Users/albert/Library/Caches/pip/wheels/59/44/27/63b211425501ad51d197ff8ed00e9e469e38b9e516cb69b1c2
  Building wheel for odfpy (setup.py) ... done
  Created wheel for odfpy: filename=odfpy-1.4.0-py2.py3-none-any.whl size=137219 sha256=a423bce5e06e8dca85dfb13d4f3ec22dbb02004f4e2cf438d661a9c026b18f5c
  Stored in directory: /Users/albert/Library/Caches/pip/wheels/06/2d/19/f5a4eed468fecff295ff8ac49e5dd5fb22d7ffc7ff072deabf
  Building wheel for et-xmlfile (setup.py) ... done
  Created wheel for et-xmlfile: filename=et_xmlfile-1.0.1-cp37-none-any.whl size=8914 sha256=9308fef4af95b86f18f79ac5ddf4e859bb9193aee7048373ec345f0374772e6b
  Stored in directory: /Users/albert/Library/Caches/pip/wheels/2a/77/35/0da0965a057698121fc7d8c5a7a9955cdbfb3cc4e2423cad39
Successfully built SQLAlchemy docopt openpyxl odfpy et-xmlfile
Installing collected packages: SQLAlchemy, docopt, backports.csv, xlrd, jdcal, et-xmlfile, openpyxl, xlwt, pyyaml, defusedxml, odfpy, tablib, records
Successfully installed SQLAlchemy-1.3.7 backports.csv-1.0.7 defusedxml-0.6.0 docopt-0.6.2 et-xmlfile-1.0.1 jdcal-1.4.1 odfpy-1.4.0 openpyxl-2.4.11 pyyaml-5.1.2 records-0.5.3 tablib-0.13.0 xlrd-1.2.0 xlwt-1.3.0

Hope it helps someday.

pip9 dependency failure: tornado + sprockets.http

This fails because sprockets.http pins tornado to a version earlier than the generally available version. This will fail without specifying any version or explicitly with pip install tornado==5.0 sprockets.http==1.5.0.

% pip uninstall -qy tornado sprockets.http
% pip install tornado sprockets.http
Collecting tornado
  Using cached tornado-5.0.tar.gz
Collecting sprockets.http
  Using cached sprockets.http-1.5.0-py2.py3-none-any.whl
Installing collected packages: tornado, sprockets.http
  Running setup.py install for tornado ... done
Successfully installed sprockets.http-1.5.0 tornado-5.0
% pip check
sprockets.http 1.5.0 has requirement tornado<5,>=3.1, but you have tornado 5.0.

Tricky case: pyrax==1.9.8 -- pip._vendor.resolvelib.resolvers.ResolutionTooDeep: 100

  • pip 20.0.2-601-g97f63905
  • python 3.8.2
  • platform linux x86_64
$ pip install --unstable-feature=resolver 'pyrax==1.9.8'
<snip (downloads many versions of dependencies)>
ERROR: Exception:
Traceback (most recent call last):
  File "/home/andy/.local/share/venvs/2afbbd2099b62f67e7705a9c91295494/venv/lib/python3.8/site-packages/pip/_internal/cli/base_command.py", line 199, in _main
    status = self.run(options, args)
  File "/home/andy/.local/share/venvs/2afbbd2099b62f67e7705a9c91295494/venv/lib/python3.8/site-packages/pip/_internal/cli/req_command.py", line 185, in wrapper
    return func(self, options, args)
  File "/home/andy/.local/share/venvs/2afbbd2099b62f67e7705a9c91295494/venv/lib/python3.8/site-packages/pip/_internal/commands/install.py", line 332, in run
    requirement_set = resolver.resolve(
  File "/home/andy/.local/share/venvs/2afbbd2099b62f67e7705a9c91295494/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/resolver.py", line 80, in resolve
    self._result = resolver.resolve(requirements)
  File "/home/andy/.local/share/venvs/2afbbd2099b62f67e7705a9c91295494/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/resolvers.py", line 413, in resolve
    state = resolution.resolve(requirements, max_rounds=max_rounds)
  File "/home/andy/.local/share/venvs/2afbbd2099b62f67e7705a9c91295494/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/resolvers.py", line 323, in resolve
    raise ResolutionTooDeep(max_rounds)
pip._vendor.resolvelib.resolvers.ResolutionTooDeep: 100

poetry 1.0.5

pyproject.toml:

[tool.poetry]
name = "fake-for-pyrax"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]

[tool.poetry.dependencies]
python = "^3.8"
pyrax = "1.9.8"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
$ poetry lock
Updating dependencies
Resolving dependencies... (10.5s)

Writing lock file

poetry.lock:

[[package]]
category = "main"
description = "Python command-line parsing library"
name = "argparse"
optional = false
python-versions = "*"
version = "1.4.0"

[[package]]
category = "main"
description = "Internationalization utilities"
name = "babel"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.8.0"

[package.dependencies]
pytz = ">=2015.7"

[[package]]
category = "main"
description = "Python package for providing Mozilla's CA Bundle."
name = "certifi"
optional = false
python-versions = "*"
version = "2020.4.5.1"

[[package]]
category = "main"
description = "Foreign Function Interface for Python calling C code."
marker = "sys_platform == \"linux\""
name = "cffi"
optional = false
python-versions = "*"
version = "1.14.0"

[package.dependencies]
pycparser = "*"

[[package]]
category = "main"
description = "Universal encoding detector for Python 2 and 3"
name = "chardet"
optional = false
python-versions = "*"
version = "3.0.4"

[[package]]
category = "main"
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
marker = "sys_platform == \"linux\""
name = "cryptography"
optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
version = "2.9"

[package.dependencies]
cffi = ">=1.8,<1.11.3 || >1.11.3"
six = ">=1.4.1"

[package.extras]
docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0)", "sphinx-rtd-theme"]
docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
idna = ["idna (>=2.1)"]
pep8test = ["flake8", "flake8-import-order", "pep8-naming"]
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)"]

[[package]]
category = "main"
description = "A collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner."
name = "debtcollector"
optional = false
python-versions = "*"
version = "1.11.0"

[package.dependencies]
pbr = ">=1.8"
six = ">=1.9.0"
wrapt = ">=1.7.0"

[[package]]
category = "main"
description = "Internationalized Domain Names in Applications (IDNA)"
name = "idna"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.9"

[[package]]
category = "main"
description = "Adds Rackspace ip_associations support to python-novaclient"
name = "ip-associations-python-novaclient-ext"
optional = false
python-versions = "*"
version = "0.2"

[package.dependencies]
python-novaclient = "*"

[[package]]
category = "main"
description = "Simple module to parse ISO 8601 dates"
name = "iso8601"
optional = false
python-versions = "*"
version = "0.1.12"

[[package]]
category = "main"
description = "Low-level, pure Python DBus protocol wrapper."
marker = "sys_platform == \"linux\""
name = "jeepney"
optional = false
python-versions = ">=3.5"
version = "0.4.3"

[package.extras]
dev = ["testpath"]

[[package]]
category = "main"
description = "Store and access your passwords safely."
name = "keyring"
optional = false
python-versions = ">=3.6"
version = "21.2.0"

[package.dependencies]
SecretStorage = ">=3"
jeepney = ">=0.4.2"
pywin32-ctypes = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1"

[package.extras]
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-black-multipy", "pytest-cov"]

[[package]]
category = "main"
description = "Authentication Library for OpenStack Identity"
name = "keystoneauth1"
optional = false
python-versions = "*"
version = "2.18.0"

[package.dependencies]
iso8601 = ">=0.1.11"
pbr = ">=1.8"
positional = ">=1.1.1"
requests = ">=2.10.0,<2.12.2 || >2.12.2"
six = ">=1.9.0"
stevedore = ">=1.17.1"

[package.extras]
betamax = ["betamax (>=0.7.0)", "fixtures (>=3.0.0)", "mock (>=2.0)"]
kerberos = ["requests-kerberos (>=0.6)"]
oauth1 = ["oauthlib (>=0.6)"]
saml2 = ["lxml (>=2.3,<3.7.0 || >3.7.0)"]

[[package]]
category = "main"
description = "Rolling backport of unittest.mock for all Pythons"
name = "mock"
optional = false
python-versions = ">=3.6"
version = "4.0.2"

[package.extras]
build = ["twine", "wheel", "blurb"]
docs = ["sphinx"]
test = ["pytest", "pytest-cov"]

[[package]]
category = "main"
description = "An implementation of time.monotonic() for Python 2 & < 3.3"
name = "monotonic"
optional = false
python-versions = "*"
version = "1.5"

[[package]]
category = "main"
description = "MessagePack (de)serializer."
name = "msgpack-python"
optional = false
python-versions = "*"
version = "0.5.6"

[[package]]
category = "main"
description = "A network address manipulation library for Python"
name = "netaddr"
optional = false
python-versions = "*"
version = "0.7.19"

[[package]]
category = "main"
description = "Portable network interface information."
name = "netifaces"
optional = false
python-versions = "*"
version = "0.10.9"

[[package]]
category = "main"
description = "Disk Config extension for python-novaclient"
name = "os-diskconfig-python-novaclient-ext"
optional = false
python-versions = "*"
version = "0.1.3"

[package.dependencies]
python-novaclient = "*"

[[package]]
category = "main"
description = "Adds rackspace networks support to python-novaclient"
name = "os-networksv2-python-novaclient-ext"
optional = false
python-versions = "*"
version = "0.26"

[package.dependencies]
python-novaclient = "*"

[[package]]
category = "main"
description = "Adds Virtual Interfaces support to python-novaclient"
name = "os-virtual-interfacesv2-python-novaclient-ext"
optional = false
python-versions = "*"
version = "0.20"

[package.dependencies]
python-novaclient = "*"

[[package]]
category = "main"
description = "Oslo Configuration API"
name = "oslo.config"
optional = false
python-versions = "*"
version = "4.12.0"

[package.dependencies]
PyYAML = ">=3.10"
debtcollector = ">=1.2.0"
netaddr = ">=0.7.13,<0.7.16 || >0.7.16"
"oslo.i18n" = ">=2.1.0,<3.15.2 || >3.15.2"
rfc3986 = ">=0.3.1"
six = ">=1.9.0"
stevedore = ">=1.20.0"

[[package]]
category = "main"
description = "Oslo i18n library"
name = "oslo.i18n"
optional = false
python-versions = "*"
version = "3.12.0"

[package.dependencies]
Babel = ">=2.3.4"
pbr = ">=1.8"
six = ">=1.9.0"

[[package]]
category = "main"
description = "Oslo Serialization library"
name = "oslo.serialization"
optional = false
python-versions = "*"
version = "2.16.1"

[package.dependencies]
msgpack-python = ">=0.4.0"
"oslo.utils" = ">=3.18.0"
pbr = ">=1.8"
pytz = ">=2013.6"
six = ">=1.9.0"

[[package]]
category = "main"
description = "Oslo Utility library"
name = "oslo.utils"
optional = false
python-versions = "*"
version = "3.22.3"

[package.dependencies]
debtcollector = ">=1.2.0"
iso8601 = ">=0.1.11"
monotonic = ">=0.6"
netaddr = ">=0.7.13,<0.7.16 || >0.7.16"
netifaces = ">=0.10.4"
"oslo.i18n" = ">=2.1.0"
pbr = ">=1.8"
pyparsing = ">=2.1.0"
pytz = ">=2013.6"
six = ">=1.9.0"

[[package]]
category = "main"
description = "Python Build Reasonableness"
name = "pbr"
optional = false
python-versions = "*"
version = "1.10.0"

[[package]]
category = "main"
description = "Library to enforce positional or key-word arguments (deprecated/unmaintained)"
name = "positional"
optional = false
python-versions = "*"
version = "1.2.1"

[package.dependencies]
pbr = ">=1.8"
wrapt = "*"

[[package]]
category = "main"
description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format."
name = "prettytable"
optional = false
python-versions = "*"
version = "0.7.2"

[[package]]
category = "main"
description = "C parser in Python"
marker = "sys_platform == \"linux\""
name = "pycparser"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.20"

[[package]]
category = "main"
description = "Python parsing module"
name = "pyparsing"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
version = "2.4.7"

[[package]]
category = "main"
description = "Python language bindings for OpenStack Clouds."
name = "pyrax"
optional = false
python-versions = "*"
version = "1.9.8"

[package.dependencies]
keyring = "*"
mock = "*"
python-novaclient = "2.27.0"
rackspace-novaclient = "*"
requests = ">=2.2.1,<3"
six = ">=1.9.0,<2"

[[package]]
category = "main"
description = "Client Library for OpenStack Identity"
name = "python-keystoneclient"
optional = false
python-versions = "*"
version = "3.10.0"

[package.dependencies]
debtcollector = ">=1.2.0"
keystoneauth1 = ">=2.18.0"
"oslo.config" = ">=3.14.0,<3.18.0 || >3.18.0"
"oslo.i18n" = ">=2.1.0"
"oslo.serialization" = ">=1.10.0"
"oslo.utils" = ">=3.18.0"
pbr = ">=1.8"
positional = ">=1.1.1"
requests = ">=2.10.0,<2.12.2 || >2.12.2"
six = ">=1.9.0"
stevedore = ">=1.17.1"

[[package]]
category = "main"
description = "Client library for OpenStack Compute API"
name = "python-novaclient"
optional = false
python-versions = "*"
version = "2.27.0"

[package.dependencies]
Babel = ">=1.3"
PrettyTable = ">=0.7,<0.8"
argparse = "*"
iso8601 = ">=0.1.9"
"oslo.i18n" = ">=1.5.0"
"oslo.serialization" = ">=1.4.0"
"oslo.utils" = ">=2.0.0"
pbr = ">=1.6,<2.0"
python-keystoneclient = ">=1.6.0"
requests = ">=2.5.2"
simplejson = ">=2.2.0"
six = ">=1.9.0"

[[package]]
category = "main"
description = "World timezone definitions, modern and historical"
name = "pytz"
optional = false
python-versions = "*"
version = "2019.3"

[[package]]
category = "main"
description = ""
marker = "sys_platform == \"win32\""
name = "pywin32-ctypes"
optional = false
python-versions = "*"
version = "0.2.0"

[[package]]
category = "main"
description = "YAML parser and emitter for Python"
name = "pyyaml"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "5.3.1"

[[package]]
category = "main"
description = "Rackspace Auth Plugin for OpenStack Clients."
name = "rackspace-auth-openstack"
optional = false
python-versions = "*"
version = "1.3"

[package.dependencies]
python-novaclient = "*"

[[package]]
category = "main"
description = "Metapackage to install python-novaclient and Rackspace extensions"
name = "rackspace-novaclient"
optional = false
python-versions = "*"
version = "2.1"

[package.dependencies]
ip_associations_python_novaclient_ext = "*"
os_diskconfig_python_novaclient_ext = "*"
os_networksv2_python_novaclient_ext = "*"
os_virtual_interfacesv2_python_novaclient_ext = "*"
python-novaclient = "*"
rackspace-auth-openstack = "*"
rax_default_network_flags_python_novaclient_ext = "*"
rax_scheduled_images_python_novaclient_ext = "*"

[[package]]
category = "main"
description = "Novaclient Extension for Instance Default Network Flags"
name = "rax-default-network-flags-python-novaclient-ext"
optional = false
python-versions = "*"
version = "0.4.0"

[package.dependencies]
python-novaclient = "*"

[[package]]
category = "main"
description = "Extends python-novaclient to use RAX-SI, the Rackspace Nova API Scheduled Images extension"
name = "rax-scheduled-images-python-novaclient-ext"
optional = false
python-versions = "*"
version = "0.3.1"

[package.dependencies]
python-novaclient = "*"

[[package]]
category = "main"
description = "Python HTTP for Humans."
name = "requests"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "2.23.0"

[package.dependencies]
certifi = ">=2017.4.17"
chardet = ">=3.0.2,<4"
idna = ">=2.5,<3"
urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"

[package.extras]
security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]

[[package]]
category = "main"
description = "Validating URI References per RFC 3986"
name = "rfc3986"
optional = false
python-versions = "*"
version = "1.4.0"

[package.extras]
idna2008 = ["idna"]

[[package]]
category = "main"
description = "Python bindings to FreeDesktop.org Secret Service API"
marker = "sys_platform == \"linux\""
name = "secretstorage"
optional = false
python-versions = ">=3.5"
version = "3.1.2"

[package.dependencies]
cryptography = "*"
jeepney = ">=0.4.2"

[[package]]
category = "main"
description = "Simple, fast, extensible JSON encoder/decoder for Python"
name = "simplejson"
optional = false
python-versions = ">=2.5, !=3.0.*, !=3.1.*, !=3.2.*"
version = "3.17.0"

[[package]]
category = "main"
description = "Python 2 and 3 compatibility utilities"
name = "six"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
version = "1.14.0"

[[package]]
category = "main"
description = "Manage dynamic plugins for Python applications"
name = "stevedore"
optional = false
python-versions = "*"
version = "1.20.1"

[package.dependencies]
pbr = ">=1.8"
six = ">=1.9.0"

[[package]]
category = "main"
description = "HTTP library with thread-safe connection pooling, file post, and more."
name = "urllib3"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
version = "1.25.9"

[package.extras]
brotli = ["brotlipy (>=0.6.0)"]
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"]
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]

[[package]]
category = "main"
description = "Module for decorators, wrappers and monkey patching."
name = "wrapt"
optional = false
python-versions = "*"
version = "1.12.1"

[metadata]
content-hash = "511fbbcba3231d762b9adbcd92ee995ca6a1d55aebb5f68d9897fd2265c5cc79"
python-versions = "^3.8"

[metadata.files]
argparse = [
    {file = "argparse-1.4.0-py2.py3-none-any.whl", hash = "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314"},
    {file = "argparse-1.4.0.tar.gz", hash = "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4"},
]
babel = [
    {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"},
    {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"},
]
certifi = [
    {file = "certifi-2020.4.5.1-py2.py3-none-any.whl", hash = "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304"},
    {file = "certifi-2020.4.5.1.tar.gz", hash = "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519"},
]
cffi = [
    {file = "cffi-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384"},
    {file = "cffi-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30"},
    {file = "cffi-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c"},
    {file = "cffi-1.14.0-cp27-cp27m-win32.whl", hash = "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78"},
    {file = "cffi-1.14.0-cp27-cp27m-win_amd64.whl", hash = "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793"},
    {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e"},
    {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a"},
    {file = "cffi-1.14.0-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff"},
    {file = "cffi-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f"},
    {file = "cffi-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa"},
    {file = "cffi-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5"},
    {file = "cffi-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4"},
    {file = "cffi-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d"},
    {file = "cffi-1.14.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc"},
    {file = "cffi-1.14.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac"},
    {file = "cffi-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f"},
    {file = "cffi-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b"},
    {file = "cffi-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3"},
    {file = "cffi-1.14.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66"},
    {file = "cffi-1.14.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0"},
    {file = "cffi-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f"},
    {file = "cffi-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26"},
    {file = "cffi-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd"},
    {file = "cffi-1.14.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55"},
    {file = "cffi-1.14.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2"},
    {file = "cffi-1.14.0-cp38-cp38-win32.whl", hash = "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8"},
    {file = "cffi-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b"},
    {file = "cffi-1.14.0.tar.gz", hash = "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6"},
]
chardet = [
    {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
    {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
]
cryptography = [
    {file = "cryptography-2.9-cp27-cp27m-macosx_10_9_intel.whl", hash = "sha256:ef9a55013676907df6c9d7dd943eb1770d014f68beaa7e73250fb43c759f4585"},
    {file = "cryptography-2.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2a2ad24d43398d89f92209289f15265107928f22a8d10385f70def7a698d6a02"},
    {file = "cryptography-2.9-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:95e1296e0157361fe2f5f0ed307fd31f94b0ca13372e3673fa95095a627636a1"},
    {file = "cryptography-2.9-cp27-cp27m-win32.whl", hash = "sha256:192ca04a36852a994ef21df13cca4d822adbbdc9d5009c0f96f1d2929e375d4f"},
    {file = "cryptography-2.9-cp27-cp27m-win_amd64.whl", hash = "sha256:ed1d0760c7e46436ec90834d6f10477ff09475c692ed1695329d324b2c5cd547"},
    {file = "cryptography-2.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:19ae795137682a9778892fb4390c07811828b173741bce91e30f899424b3934d"},
    {file = "cryptography-2.9-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d1bf5a1a0d60c7f9a78e448adcb99aa101f3f9588b16708044638881be15d6bc"},
    {file = "cryptography-2.9-cp35-abi3-macosx_10_9_intel.whl", hash = "sha256:1b9b535d6b55936a79dbe4990b64bb16048f48747c76c29713fea8c50eca2acf"},
    {file = "cryptography-2.9-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:7a279f33a081d436e90e91d1a7c338553c04e464de1c9302311a5e7e4b746088"},
    {file = "cryptography-2.9-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:49870684da168b90110bbaf86140d4681032c5e6a2461adc7afdd93be5634216"},
    {file = "cryptography-2.9-cp35-cp35m-win32.whl", hash = "sha256:6b91cab3841b4c7cb70e4db1697c69f036c8bc0a253edc0baa6783154f1301e4"},
    {file = "cryptography-2.9-cp35-cp35m-win_amd64.whl", hash = "sha256:587f98ce27ac4547177a0c6fe0986b8736058daffe9160dcf5f1bd411b7fbaa1"},
    {file = "cryptography-2.9-cp36-cp36m-win32.whl", hash = "sha256:cc20316e3f5a6b582fc3b029d8dc03aabeb645acfcb7fc1d9848841a33265748"},
    {file = "cryptography-2.9-cp36-cp36m-win_amd64.whl", hash = "sha256:3be7a5722d5bfe69894d3f7bbed15547b17619f3a88a318aab2e37f457524164"},
    {file = "cryptography-2.9-cp37-cp37m-win32.whl", hash = "sha256:7598974f6879a338c785c513e7c5a4329fbc58b9f6b9a6305035fca5b1076552"},
    {file = "cryptography-2.9-cp37-cp37m-win_amd64.whl", hash = "sha256:5aca6f00b2f42546b9bdf11a69f248d1881212ce5b9e2618b04935b87f6f82a1"},
    {file = "cryptography-2.9-cp38-cp38-win32.whl", hash = "sha256:9fc9da390e98cb6975eadf251b6e5fa088820141061bf041cd5c72deba1dc526"},
    {file = "cryptography-2.9-cp38-cp38-win_amd64.whl", hash = "sha256:6b744039b55988519cc183149cceb573189b3e46e16ccf6f8c46798bb767c9dc"},
    {file = "cryptography-2.9.tar.gz", hash = "sha256:0cacd3ef5c604b8e5f59bf2582c076c98a37fe206b31430d0cd08138aff0986e"},
]
debtcollector = [
    {file = "debtcollector-1.11.0-py2.py3-none-any.whl", hash = "sha256:a339dd5c5d0516c9d42ff764d41565d5dcc408c9afcaac6f5d277a768f01d2a5"},
    {file = "debtcollector-1.11.0.tar.gz", hash = "sha256:733afa881c844a40ef4623ab73ce1862e505bc4655635da3a91d8f3482677785"},
]
idna = [
    {file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"},
    {file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"},
]
ip-associations-python-novaclient-ext = [
    {file = "ip_associations_python_novaclient_ext-0.2.tar.gz", hash = "sha256:e4576c3ee149bcca7e034507ad9c698cb07dd9fa10f90056756aea0fa59bae37"},
]
iso8601 = [
    {file = "iso8601-0.1.12-py2.py3-none-any.whl", hash = "sha256:210e0134677cc0d02f6028087fee1df1e1d76d372ee1db0bf30bf66c5c1c89a3"},
    {file = "iso8601-0.1.12-py3-none-any.whl", hash = "sha256:bbbae5fb4a7abfe71d4688fd64bff70b91bbd74ef6a99d964bab18f7fdf286dd"},
    {file = "iso8601-0.1.12.tar.gz", hash = "sha256:49c4b20e1f38aa5cf109ddcd39647ac419f928512c869dc01d5c7098eddede82"},
]
jeepney = [
    {file = "jeepney-0.4.3-py3-none-any.whl", hash = "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf"},
    {file = "jeepney-0.4.3.tar.gz", hash = "sha256:3479b861cc2b6407de5188695fa1a8d57e5072d7059322469b62628869b8e36e"},
]
keyring = [
    {file = "keyring-21.2.0-py3-none-any.whl", hash = "sha256:8179b1cdcdcbc221456b5b74e6b7cfa06f8dd9f239eb81892166d9223d82c5ba"},
    {file = "keyring-21.2.0.tar.gz", hash = "sha256:197fd5903901030ef7b82fe247f43cfed2c157a28e7747d1cfcf4bc5e699dd03"},
]
keystoneauth1 = [
    {file = "keystoneauth1-2.18.0-py2.py3-none-any.whl", hash = "sha256:ad292a0f78fb88052fd91ab5d59297c24926994f916d0d261bf131800a925e8d"},
    {file = "keystoneauth1-2.18.0.tar.gz", hash = "sha256:075a9ca7a8877c5885fa2487699015e45260c4e6be119683effe0ad2ab1255d2"},
]
mock = [
    {file = "mock-4.0.2-py3-none-any.whl", hash = "sha256:3f9b2c0196c60d21838f307f5825a7b86b678cedc58ab9e50a8988187b4d81e0"},
    {file = "mock-4.0.2.tar.gz", hash = "sha256:dd33eb70232b6118298d516bbcecd26704689c386594f0f3c4f13867b2c56f72"},
]
monotonic = [
    {file = "monotonic-1.5-py2.py3-none-any.whl", hash = "sha256:552a91f381532e33cbd07c6a2655a21908088962bb8fa7239ecbcc6ad1140cc7"},
    {file = "monotonic-1.5.tar.gz", hash = "sha256:23953d55076df038541e648a53676fb24980f7a1be290cdda21300b3bc21dfb0"},
]
msgpack-python = [
    {file = "msgpack-python-0.5.6.tar.gz", hash = "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b"},
]
netaddr = [
    {file = "netaddr-0.7.19-py2.py3-none-any.whl", hash = "sha256:56b3558bd71f3f6999e4c52e349f38660e54a7a8a9943335f73dfc96883e08ca"},
    {file = "netaddr-0.7.19.tar.gz", hash = "sha256:38aeec7cdd035081d3a4c306394b19d677623bf76fa0913f6695127c7753aefd"},
]
netifaces = [
    {file = "netifaces-0.10.9-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:b2ff3a0a4f991d2da5376efd3365064a43909877e9fabfa801df970771161d29"},
    {file = "netifaces-0.10.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:0c4304c6d5b33fbd9b20fdc369f3a2fef1a8bbacfb6fd05b9708db01333e9e7b"},
    {file = "netifaces-0.10.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:7a25a8e28281504f0e23e181d7a9ed699c72f061ca6bdfcd96c423c2a89e75fc"},
    {file = "netifaces-0.10.9-cp27-cp27m-win32.whl", hash = "sha256:6d84e50ec28e5d766c9911dce945412dc5b1ce760757c224c71e1a9759fa80c2"},
    {file = "netifaces-0.10.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f911b7f0083d445c8d24cfa5b42ad4996e33250400492080f5018a28c026db2b"},
    {file = "netifaces-0.10.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4921ed406386246b84465950d15a4f63480c1458b0979c272364054b29d73084"},
    {file = "netifaces-0.10.9-cp33-cp33m-manylinux1_i686.whl", hash = "sha256:5b3167f923f67924b356c1338eb9ba275b2ba8d64c7c2c47cf5b5db49d574994"},
    {file = "netifaces-0.10.9-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:db881478f1170c6dd524175ba1c83b99d3a6f992a35eca756de0ddc4690a1940"},
    {file = "netifaces-0.10.9-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:f0427755c68571df37dc58835e53a4307884a48dec76f3c01e33eb0d4a3a81d7"},
    {file = "netifaces-0.10.9-cp34-cp34m-win32.whl", hash = "sha256:7cc6fd1eca65be588f001005446a47981cbe0b2909f5be8feafef3bf351a4e24"},
    {file = "netifaces-0.10.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b47e8f9ff6846756be3dc3fb242ca8e86752cd35a08e06d54ffc2e2a2aca70ea"},
    {file = "netifaces-0.10.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f8885cc48c8c7ad51f36c175e462840f163cb4687eeb6c6d7dfaf7197308e36b"},
    {file = "netifaces-0.10.9-cp35-cp35m-win32.whl", hash = "sha256:755050799b5d5aedb1396046f270abfc4befca9ccba3074f3dbbb3cb34f13aae"},
    {file = "netifaces-0.10.9-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:ad10acab2ef691eb29a1cc52c3be5ad1423700e993cc035066049fa72999d0dc"},
    {file = "netifaces-0.10.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:563a1a366ee0fb3d96caab79b7ac7abd2c0a0577b157cc5a40301373a0501f89"},
    {file = "netifaces-0.10.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:30ed89ab8aff715caf9a9d827aa69cd02ad9f6b1896fd3fb4beb998466ed9a3c"},
    {file = "netifaces-0.10.9-cp36-cp36m-win32.whl", hash = "sha256:75d3a4ec5035db7478520ac547f7c176e9fd438269e795819b67223c486e5cbe"},
    {file = "netifaces-0.10.9-cp36-cp36m-win_amd64.whl", hash = "sha256:078986caf4d6a602a4257d3686afe4544ea74362b8928e9f4389b5cd262bc215"},
    {file = "netifaces-0.10.9-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:3095218b66d359092b82f07c5422293c2f6559cf8d36b96b379cc4cdc26eeffa"},
    {file = "netifaces-0.10.9-cp37-cp37m-win32.whl", hash = "sha256:da298241d87bcf468aa0f0705ba14572ad296f24c4fda5055d6988701d6fd8e1"},
    {file = "netifaces-0.10.9-cp37-cp37m-win_amd64.whl", hash = "sha256:86b8a140e891bb23c8b9cb1804f1475eb13eea3dbbebef01fcbbf10fbafbee42"},
    {file = "netifaces-0.10.9.tar.gz", hash = "sha256:2dee9ffdd16292878336a58d04a20f0ffe95555465fee7c9bd23b3490ef2abf3"},
]
os-diskconfig-python-novaclient-ext = [
    {file = "os_diskconfig_python_novaclient_ext-0.1.3-py2-none-any.whl", hash = "sha256:f668665a5765648ec47fbd80f9a8e5f37498b6ea3fb2d0d570b7da7d96146be9"},
    {file = "os_diskconfig_python_novaclient_ext-0.1.3.tar.gz", hash = "sha256:e7d19233a7b73c70244d2527d162d8176555698e7c621b41f689be496df15e75"},
]
os-networksv2-python-novaclient-ext = [
    {file = "os_networksv2_python_novaclient_ext-0.26.tar.gz", hash = "sha256:613a75216d98d3ce6bb413f717323e622386c24fc9cc66148507539e7dc5bf19"},
]
os-virtual-interfacesv2-python-novaclient-ext = [
    {file = "os_virtual_interfacesv2_python_novaclient_ext-0.20.tar.gz", hash = "sha256:6d39ff4174496a0f795d11f20240805a16bbf452091cf8eb9bd1d5ae2fca449d"},
]
"oslo.config" = [
    {file = "oslo.config-4.12.0-py2.py3-none-any.whl", hash = "sha256:8e5c30d0982ed3adb179374405318909f088cbb66baca80879932d53db6a4691"},
    {file = "oslo.config-4.12.0.tar.gz", hash = "sha256:bd8d03c4b28f1aa115e6b094651fc51adbca686f22f45ed721d837a5a5a249dd"},
]
"oslo.i18n" = [
    {file = "oslo.i18n-3.12.0-py2.py3-none-any.whl", hash = "sha256:b01f56d99347bfef6681a0e23b3394e8fc1cf2102b5d85504b898b22273cd0af"},
    {file = "oslo.i18n-3.12.0.tar.gz", hash = "sha256:6add28cbbe8254838f7f131de0cf0f3761786d57e5fe5716a488260b725f58d3"},
]
"oslo.serialization" = [
    {file = "oslo.serialization-2.16.1-py2.py3-none-any.whl", hash = "sha256:f68d1f2c2a7af50ce2b68845400c5a7b4ea9c46eca34eaeb63513c0c49524ad0"},
    {file = "oslo.serialization-2.16.1.tar.gz", hash = "sha256:306d9982eae272fff05db7637971fd07d2b9b818306c9e3af87aea7f452b4844"},
]
"oslo.utils" = [
    {file = "oslo.utils-3.22.3-py2.py3-none-any.whl", hash = "sha256:104f0804304a226721c42c1d34fd2bc12e3a7d790fbd0eb0ce8b0ec5594b2e6e"},
    {file = "oslo.utils-3.22.3.tar.gz", hash = "sha256:70473be975412407d43ef04b0de34c4d21c567bdcab608caeb8f0fcd4138f4f2"},
]
pbr = [
    {file = "pbr-1.10.0-py2.py3-none-any.whl", hash = "sha256:f5cf7265a80636ecff66806d13494cbf9d77a3758a65fd8b4d4d4bee81b0c375"},
    {file = "pbr-1.10.0.tar.gz", hash = "sha256:186428c270309e6fdfe2d5ab0949ab21ae5f7dea831eab96701b86bd666af39c"},
]
positional = [
    {file = "positional-1.2.1.tar.gz", hash = "sha256:cf48ea169f6c39486d5efa0ce7126a97bed979a52af6261cf255a41f9a74453a"},
]
prettytable = [
    {file = "prettytable-0.7.2.tar.bz2", hash = "sha256:853c116513625c738dc3ce1aee148b5b5757a86727e67eff6502c7ca59d43c36"},
    {file = "prettytable-0.7.2.tar.gz", hash = "sha256:2d5460dc9db74a32bcc8f9f67de68b2c4f4d2f01fa3bd518764c69156d9cacd9"},
    {file = "prettytable-0.7.2.zip", hash = "sha256:a53da3b43d7a5c229b5e3ca2892ef982c46b7923b51e98f0db49956531211c4f"},
]
pycparser = [
    {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"},
    {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"},
]
pyparsing = [
    {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
    {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
]
pyrax = [
    {file = "pyrax-1.9.8-py2.py3-none-any.whl", hash = "sha256:23873829b286183b56fdb94b515118e3332bfcb12b7532dc0582e78bd002c0ae"},
    {file = "pyrax-1.9.8.tar.gz", hash = "sha256:e9db943447fdf2690046d7f98466fc4743497b74578efe6e400a6edbfd9728f5"},
]
python-keystoneclient = [
    {file = "python-keystoneclient-3.10.0.tar.gz", hash = "sha256:c65fa56791ec02dc942ad08e5c3634b8dca98eda76ee3c2549018b6767e67918"},
    {file = "python_keystoneclient-3.10.0-py2.py3-none-any.whl", hash = "sha256:f30dd06d03f1f85af0cfa18c270e23d2ffd9e776c11c1b534f6ea503e4f31d80"},
]
python-novaclient = [
    {file = "python-novaclient-2.27.0.tar.gz", hash = "sha256:d1279d5c2857cf8c56cb953639b36225bc1fec7fa30ee632940823506a7638ef"},
    {file = "python_novaclient-2.27.0-py2.py3-none-any.whl", hash = "sha256:6406a8ced973d6e73115fde9fa4c09e01046415701afd98aaf6f0295ba0bad86"},
]
pytz = [
    {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"},
    {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"},
]
pywin32-ctypes = [
    {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"},
    {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"},
]
pyyaml = [
    {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"},
    {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"},
    {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"},
    {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"},
    {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"},
    {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"},
    {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"},
    {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"},
    {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"},
    {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"},
    {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"},
]
rackspace-auth-openstack = [
    {file = "rackspace-auth-openstack-1.3.tar.gz", hash = "sha256:c4c069eeb1924ea492c50144d8a4f5f1eb0ece945e0c0d60157cabcadff651cd"},
]
rackspace-novaclient = [
    {file = "rackspace-novaclient-2.1.tar.gz", hash = "sha256:22fc44f623bae0feb32986ec4630abee904e4c96fba5849386a87e88c450eae7"},
]
rax-default-network-flags-python-novaclient-ext = [
    {file = "rax_default_network_flags_python_novaclient_ext-0.4.0.tar.gz", hash = "sha256:852bf49d90e7a1bc16aa0b25b46a45ba5654069f7321a363c8d94c5496666001"},
]
rax-scheduled-images-python-novaclient-ext = [
    {file = "rax_scheduled_images_python_novaclient_ext-0.3.1.tar.gz", hash = "sha256:f170cf97b20bdc8a1784cc0b85b70df5eb9b88c3230dab8e68e1863bf3937cdb"},
]
requests = [
    {file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"},
    {file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"},
]
rfc3986 = [
    {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"},
    {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"},
]
secretstorage = [
    {file = "SecretStorage-3.1.2-py3-none-any.whl", hash = "sha256:b5ec909dde94d4ae2fa26af7c089036997030f0cf0a5cb372b4cccabd81c143b"},
    {file = "SecretStorage-3.1.2.tar.gz", hash = "sha256:15da8a989b65498e29be338b3b279965f1b8f09b9668bd8010da183024c8bff6"},
]
simplejson = [
    {file = "simplejson-3.17.0-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:87d349517b572964350cc1adc5a31b493bbcee284505e81637d0174b2758ba17"},
    {file = "simplejson-3.17.0-cp27-cp27m-win32.whl", hash = "sha256:1d1e929cdd15151f3c0b2efe953b3281b2fd5ad5f234f77aca725f28486466f6"},
    {file = "simplejson-3.17.0-cp27-cp27m-win_amd64.whl", hash = "sha256:1ea59f570b9d4916ae5540a9181f9c978e16863383738b69a70363bc5e63c4cb"},
    {file = "simplejson-3.17.0-cp33-cp33m-win32.whl", hash = "sha256:8027bd5f1e633eb61b8239994e6fc3aba0346e76294beac22a892eb8faa92ba1"},
    {file = "simplejson-3.17.0-cp33-cp33m-win_amd64.whl", hash = "sha256:22a7acb81968a7c64eba7526af2cf566e7e2ded1cb5c83f0906b17ff1540f866"},
    {file = "simplejson-3.17.0-cp34-cp34m-win32.whl", hash = "sha256:17163e643dbf125bb552de17c826b0161c68c970335d270e174363d19e7ea882"},
    {file = "simplejson-3.17.0-cp34-cp34m-win_amd64.whl", hash = "sha256:0fe3994207485efb63d8f10a833ff31236ed27e3b23dadd0bf51c9900313f8f2"},
    {file = "simplejson-3.17.0-cp35-cp35m-win32.whl", hash = "sha256:4cf91aab51b02b3327c9d51897960c554f00891f9b31abd8a2f50fd4a0071ce8"},
    {file = "simplejson-3.17.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fc9051d249dd5512e541f20330a74592f7a65b2d62e18122ca89bf71f94db748"},
    {file = "simplejson-3.17.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:86afc5b5cbd42d706efd33f280fec7bd7e2772ef54e3f34cf6b30777cd19a614"},
    {file = "simplejson-3.17.0-cp36-cp36m-win32.whl", hash = "sha256:926bcbef9eb60e798eabda9cd0bbcb0fca70d2779aa0aa56845749d973eb7ad5"},
    {file = "simplejson-3.17.0-cp36-cp36m-win_amd64.whl", hash = "sha256:daaf4d11db982791be74b23ff4729af2c7da79316de0bebf880fa2d60bcc8c5a"},
    {file = "simplejson-3.17.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:9a126c3a91df5b1403e965ba63b304a50b53d8efc908a8c71545ed72535374a3"},
    {file = "simplejson-3.17.0-cp37-cp37m-win32.whl", hash = "sha256:fc046afda0ed8f5295212068266c92991ab1f4a50c6a7144b69364bdee4a0159"},
    {file = "simplejson-3.17.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7cce4bac7e0d66f3a080b80212c2238e063211fe327f98d764c6acbc214497fc"},
    {file = "simplejson-3.17.0.tar.gz", hash = "sha256:2b4b2b738b3b99819a17feaf118265d0753d5536049ea570b3c43b51c4701e81"},
    {file = "simplejson-3.17.0.win-amd64-py2.7.exe", hash = "sha256:1d346c2c1d7dd79c118f0cc7ec5a1c4127e0c8ffc83e7b13fc5709ff78c9bb84"},
    {file = "simplejson-3.17.0.win-amd64-py3.3.exe", hash = "sha256:5cfd495527f8b85ce21db806567de52d98f5078a8e9427b18e251c68bd573a26"},
    {file = "simplejson-3.17.0.win-amd64-py3.4.exe", hash = "sha256:8de378d589eccbc75941e480b4d5b4db66f22e4232f87543b136b1f093fff342"},
    {file = "simplejson-3.17.0.win-amd64-py3.5.exe", hash = "sha256:f4b64a1031acf33e281fd9052336d6dad4d35eee3404c95431c8c6bc7a9c0588"},
    {file = "simplejson-3.17.0.win-amd64-py3.6.exe", hash = "sha256:ad8dd3454d0c65c0f92945ac86f7b9efb67fa2040ba1b0189540e984df904378"},
    {file = "simplejson-3.17.0.win-amd64-py3.7.exe", hash = "sha256:229edb079d5dd81bf12da952d4d825bd68d1241381b37d3acf961b384c9934de"},
    {file = "simplejson-3.17.0.win32-py2.7.exe", hash = "sha256:4fd5f79590694ebff8dc980708e1c182d41ce1fda599a12189f0ca96bf41ad70"},
    {file = "simplejson-3.17.0.win32-py3.3.exe", hash = "sha256:d140e9376e7f73c1f9e0a8e3836caf5eec57bbafd99259d56979da05a6356388"},
    {file = "simplejson-3.17.0.win32-py3.4.exe", hash = "sha256:da00675e5e483ead345429d4f1374ab8b949fba4429d60e71ee9d030ced64037"},
    {file = "simplejson-3.17.0.win32-py3.5.exe", hash = "sha256:7739940d68b200877a15a5ff5149e1599737d6dd55e302625650629350466418"},
    {file = "simplejson-3.17.0.win32-py3.6.exe", hash = "sha256:60aad424e47c5803276e332b2a861ed7a0d46560e8af53790c4c4fb3420c26c2"},
    {file = "simplejson-3.17.0.win32-py3.7.exe", hash = "sha256:1fbba86098bbfc1f85c5b69dc9a6d009055104354e0d9880bb00b692e30e0078"},
]
six = [
    {file = "six-1.14.0-py2.py3-none-any.whl", hash = "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"},
    {file = "six-1.14.0.tar.gz", hash = "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a"},
]
stevedore = [
    {file = "stevedore-1.20.1-py2.py3-none-any.whl", hash = "sha256:edc26850d33770ce0b961b10b4a20c0b366bf89e316bbc9fa200dfd7ca2b5e57"},
    {file = "stevedore-1.20.1.tar.gz", hash = "sha256:046200a915780b58bf1c84436e86701b741d664893aefa84d8aceadd15ed4734"},
]
urllib3 = [
    {file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"},
    {file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"},
]
wrapt = [
    {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"},
]

Does this resolve environment markers?

Or do dependencies need to resolve markers to decide whether it is needed on the way in? I’m looking into the possibility of building a environment-independent dependency resolver, and is intrigued to learn that pip has plans to build one itself. Due to pip’s nature (it only needs to know how to work out dependencies on the platform it is currently running on), I’m wondering if this fits my need, or if I need to look elsewhere.

pip10 dependency failure: flake8-import-order pytest-flake8

pip install flake8-import-order==0.17.1 pytest-flake8==1.0.0
  • Order doesn't matter.
flake8 3.5.0 has requirement pycodestyle<2.4.0,>=2.0.0, but you'll have pycodestyle 2.4.0 which is incompatible.
Installing collected packages: pycodestyle, flake8-import-order, pyflakes, mccabe, flake8, six, more-itertools, attrs, pluggy, py, pytest, pytest-flake8
Successfully installed attrs-17.4.0 flake8-3.5.0 flake8-import-order-0.17.1 mccabe-0.6.1 more-itertools-4.1.0 pluggy-0.6.0 py-1.5.3 pycodestyle-2.4.0 pyflakes-1.6.0 pytest-3.5.0 pytest-flake8-1.0.0 six-1.11.0

edit: This is actually with pip 10.0.1.

dependency failure: hacking, flake8, pycodestyle

$ virtualenv venv --python python3.7 venv
$ source venv/bin/activate
$ cat requirements-new.txt 
hacking>=1.1.0,<1.2.0 # Apache-2.0
pycodestyle>=2.0.0 # MIT License

$ pip install -r requirements-new.txt 
Collecting hacking<1.2.0,>=1.1.0
  Using cached https://files.pythonhosted.org/packages/71/05/ae66ec5a58e5c973ea09adcd4eac1a63e370579b768a2fd875172b8cc82e/hacking-1.1.0-py2.py3-none-any.whl
Collecting pycodestyle>=2.0.0
  Using cached https://files.pythonhosted.org/packages/0e/0c/04a353e104d2f324f8ee5f4b32012618c1c86dd79e52a433b64fceed511b/pycodestyle-2.5.0-py2.py3-none-any.whl
Collecting six>=1.10.0
  Using cached https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Collecting flake8<2.7.0,>=2.6.0
  Using cached https://files.pythonhosted.org/packages/70/a9/9b66f22d038de51e05f92d5e677fd89d8f9c980db0b8a130621baad052f5/flake8-2.6.2-py2.py3-none-any.whl
Collecting pbr!=2.1.0,>=2.0.0
  Using cached https://files.pythonhosted.org/packages/46/a4/d5c83831a3452713e4b4f126149bc4fbda170f7cb16a86a00ce57ce0e9ad/pbr-5.4.3-py2.py3-none-any.whl
Collecting mccabe<0.6,>=0.2.1
  Using cached https://files.pythonhosted.org/packages/69/be/9c322ed286263a93e5ee0ff575662d0709fc73ee906522e7cfa72b08b946/mccabe-0.5.3-py2.py3-none-any.whl
Collecting pyflakes!=1.2.0,!=1.2.1,!=1.2.2,<1.3,>=0.8.1
  Using cached https://files.pythonhosted.org/packages/74/55/98f59358be6d7240ba546b8a74813cc21841a9145a0c1a3a7998f50acbe7/pyflakes-1.2.3-py2.py3-none-any.whl
ERROR: flake8 2.6.2 has requirement pycodestyle<2.1,>=2.0, but you'll have pycodestyle 2.5.0 which is incompatible.
Installing collected packages: six, pycodestyle, mccabe, pyflakes, flake8, pbr, hacking
Successfully installed flake8-2.6.2 hacking-1.1.0 mccabe-0.5.3 pbr-5.4.3 pycodestyle-2.5.0 pyflakes-1.2.3 six-1.12.0

The resolver needs to be able to cope with currently-broken installations

Something that occurred to me when looking at pypa/pip#5196 was that when the new resolver is added to pip, we will likely have a number of cases where the user's current installation might be inconsistent - not with the requirements being installed, but within the existing requirements. It's going to be important that the resolver handles this sort of situation gracefully.

I don't have any specific suggestions here at the moment, but I wanted to record the point while it was fresh in my mind, so it doesn't get forgotten.

Package conflicts detection in large compound projects

In our project we install dependencies from 2 large subprojects. Installation command looks like:

pip install -r requirements.txt
pip install -r subproject/requirements.txt

or in CI builds it looks like:

pip install -r requirements.txt subproject/requirements.txt

Will this new package resolver be able to handle conflicts in such conditions (when it installs them from multiple requirements) ?

Currently, we have made our own checker (run with py.test) which manually reads requirements.txt and subproject/requirements.txt using pip.req.parse_requirements() and compares them.
And all our deps with transitive deps are freezed (using "==").
Also, we have freezed deps in many our internal pip packages. But eventually this makes upgrading one small dependency to hell. So we don't like our solution and treat it rather as a workaround.

Recently pip (in version 10+) made req an internal package. So it's kind of hiding this hole from us :-(

elasticsearch 7.0.0 and requests 2.21.0

This creates issues while installing elasticsearch and requests together.

Output:

$ pip3 install elasticsearch==7.0.0 requests==2.21.0
Collecting elasticsearch==7.0.0
  Using cached https://files.pythonhosted.org/packages/a8/27/d3a9ecd9f8f972d99da98672d4766b9f62ef64c323c40bb5e2557e538ea3/elasticsearch-7.0.0-py2.py3-none-any.whl
Collecting requests==2.21.0
  Using cached https://files.pythonhosted.org/packages/7d/e3/20f3d364d6c8e5d2353c72a67778eb189176f08e873c9900e10c0287b84b/requests-2.21.0-py2.py3-none-any.whl
Collecting urllib3>=1.21.1 (from elasticsearch==7.0.0)
  Using cached https://files.pythonhosted.org/packages/39/ec/d93dfc69617a028915df914339ef66936ea976ef24fa62940fd86ba0326e/urllib3-1.25.2-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests==2.21.0)
  Using cached https://files.pythonhosted.org/packages/60/75/f692a584e85b7eaba0e03827b3d51f45f571c2e793dd731e598828d380aa/certifi-2019.3.9-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests==2.21.0)
  Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Collecting idna<2.9,>=2.5 (from requests==2.21.0)
  Using cached https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl
requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25.2 which is incompatible.
Installing collected packages: urllib3, elasticsearch, certifi, chardet, idna, requests
Successfully installed certifi-2019.3.9 chardet-3.0.4 elasticsearch-7.0.0 idna-2.8 requests-2.21.0 urllib3-1.25.2

The output above has this warning:

requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25.2 which is incompatible.

The installed version of urllib3 (urllib3 1.25.2) violates the requirement specifier for urllib3 specified by requests 2.21.0? The required dependencies are:

  • elasticsearch==7.0.0 requires urllib3>=1.21.1 (source)
  • requests==2.21.0 requires urllib3>=1.21.1,<1.25 (source)

Both dependency specifiers could have been easily satisfied by installing urllib3 1.24.3. But pip3 then installed urllib3 1.25.2 instead which violates the second specifier.

See this Stack Overflow thread for related discussion: https://stackoverflow.com/q/56096643/1175080.

Originally posted by @lonelearner in pypa/pip#988 (comment)

Pip 20.2.2 with use-feature=2020-resolver is not able to find a conflict in an hour

Pip loops itself after invoking pip install -r requirements.txt --use-feature=2020-resolver (more than 1 hour):

…
Requirement already satisfied: six>=1.4.1 in /usr/local/lib/python3.7/site-packages (from cryptography==3.0->-r requirements.txt (line 4)) (1.15.0)
Requirement already satisfied: internal-lib3<5dev,>=4.0.1 in /usr/local/lib/python3.7/site-packages (from internal-lib5>=0.13.2->internal-lib2==6.0.1->-r requirements.txt (line 29)) (4.3)
Requirement already satisfied: internal-lib1>=0.4.7 in /usr/local/lib/python3.7/site-packages (from internal-lib5>=0.13.2->internal-lib2==6.0.1->-r requirements.txt (line 29)) (0.4.10)

Same loop with -v flag (pip install -r requirements.txt --use-feature=2020-resolver -v):

…
Requirement already satisfied: six>=1.4.1 in environment/lib/python3.6/site-packages (from cryptography==3.0->-r requirements.txt (line 4)) (1.14.0)
1 location(s) to search for versions of six:
* https://self-hosted-devpi/+simple/six/
Fetching project page and analyzing links: https://self-hosted-devpi/+simple/six/
Getting page https://self-hosted-devpi/+simple/six/
Looking up "https://self-hosted-devpi/+simple/six/" in the cache
Request header has "max_age" as 0, cache bypassed
https://devpi.yougov.net:443 "GET /+simple/six/ HTTP/1.1" 200 16235
Updating cache with response from "https://self-hosted-devpi/+simple/six/"
  Found link https://self-hosted-devpi/%2Bf/306/39c035cdb2353/six-1.15.0.tar.gz#sha256=30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259 (from https://self-hosted-devpi/+simple/six/) (requires-python:>=2.7, !=3.0.*, !=3.1.*, !=3.2.*), version: 1.15.0
  …
  Found link https://self-hosted-devpi/%2Bf/14f/d1ed3dd0e1a46/six-0.9.0.tar.gz#sha256=14fd1ed3dd0e1a46cc53b8fc890b5a3b11737515aeb7f42c3af9f38e8d8975d7 (from https://self-hosted-devpi/+simple/six/), version: 0.9.0
Given no hashes to check 12 links for project 'six': discarding no candidates
Requirement already satisfied: internal-lib1>=0.4.7 in environment/lib/python3.6/site-packages (from internal-lib5>=0.13.2->internal-lib2==6.0.1->-r requirements.txt (line 29)) (0.4.10)
1 location(s) to search for versions of internal-lib1:
* https://self-hosted-devpi/+simple/internal-lib1/
Fetching project page and analyzing links: https://self-hosted-devpi/+simple/internal-lib1/
Getting page https://self-hosted-devpi/+simple/internal-lib1/
Looking up "https://self-hosted-devpi/+simple/internal-lib1/" in the cache
Request header has "max_age" as 0, cache bypassed
https://devpi.yougov.net:443 "GET /+simple/internal-lib1/ HTTP/1.1" 200 13870
Updating cache with response from "https://self-hosted-devpi/+simple/internal-lib1/"
  Found link https://self-hosted-devpi/%2Bf/674/b54a83be61d7e/internal-lib1-0.4.4-py2.py3-none-any.whl#sha256=674b54a83be61d7e5488edf33ac4846d4eb19b54eb662b37a1a3dcbe146d3f71 (from https://self-hosted-devpi/+simple/internal-lib1/), version: 0.4.4
  …
  Found link https://self-hosted-devpi/%2Bf/5db/e47a27ce7d29e/internal-lib1-0.3.1.tar.gz#sha256=5dbe47a27ce7d29ee0321b9252f4d00232a17042ad160861f2fc449928328d53 (from https://self-hosted-devpi/+simple/internal-lib1/), version: 0.3.1
Given no hashes to check 8 links for project 'internal-lib1': discarding no candidates
Requirement already satisfied: internal-lib3<5dev,>=4.0.1 in environment/lib/python3.6/site-packages (from internal-lib5>=0.13.2->internal-lib2==6.0.1->-r requirements.txt (line 29)) (4.3)
1 location(s) to search for versions of internal-lib1:
* https://self-hosted-devpi/+simple/internal-lib1/
Fetching project page and analyzing links: https://self-hosted-devpi/+simple/internal-lib1/
Getting page https://self-hosted-devpi/+simple/internal-lib1/
Looking up "https://self-hosted-devpi/+simple/internal-lib1/" in the cache
Request header has "max_age" as 0, cache bypassed
https://devpi.yougov.net:443 "GET /+simple/internal-lib1/ HTTP/1.1" 200 9900
Updating cache with response from "https://self-hosted-devpi/+simple/internal-lib1/"
  Found link https://self-hosted-devpi/%2Bf/ad9/b1e001e1b51f2/internal-lib3-4.1.tar.gz#sha256=ad9b1e001e1b51f2305275717e451e6d8b81b54fa621030284b7c49f11a8ace4 (from https://self-hosted-devpi/+simple/internal-lib1/), version: 4.1
  …
  Found link https://self-hosted-devpi/%2Bf/11c/81413452f331c/internal-lib3-3.3.tar.gz#sha256=11c81413452f331cc75e09c0b1c424d1574a1f9d7c2c63d70cc60e66871839aa (from https://self-hosted-devpi/+simple/internal-lib1/), version: 3.3
Given no hashes to check 9 links for project 'internal-lib1': discarding no candidates
1 location(s) to search for versions of marshmallow:
* https://self-hosted-devpi/+simple/marshmallow/
Fetching project page and analyzing links: https://self-hosted-devpi/+simple/marshmallow/
Getting page https://self-hosted-devpi/+simple/marshmallow/
Looking up "https://self-hosted-devpi/+simple/marshmallow/" in the cache
Request header has "max_age" as 0, cache bypassed
https://devpi.yougov.net:443 "GET /+simple/marshmallow/ HTTP/1.1" 200 70169
Updating cache with response from "https://self-hosted-devpi/+simple/marshmallow/"
  Found link https://self-hosted-devpi/%2Bf/a2a/5eefb4b75a3b4/marshmallow-3.7.1.tar.gz#sha256=a2a5eefb4b75a3b43f05be1cca0b6686adf56af7465c3ca629e5ad8d1e1fe13d (from https://self-hosted-devpi/+simple/marshmallow/) (requires-python:>=3.5), version: 3.7.1
  …
  Found link https://devpi.yougov.net/root/pypi/%2Bf/b2a/6f1df3c475cd9/marshmallow-0.1.0-py2.py3-none-any.whl#sha256=b2a6f1df3c475cd9c1ae29d9ef46ab1f24110bf7721d4e91c8ee90e2eaf604e8 (from https://devpi.yougov.net/+simple/marshmallow/), version: 0.1.0
Given no hashes to check 0 links for project 'marshmallow': discarding no candidates
Collecting marshmallow-oneofschema<3.0.0,>=2.0.0.post0
  Created temporary directory: /private/var/folders/22/_y1ydpt97v70hqfj5f7wvy740000gp/T/pip-unpack-q1p0op6g
  Looking up "https://self-hosted-devpi/%2Bf/296/73bcc415f4a20/marshmallow_oneofschema-2.0.1-py2.py3-none-any.whl" in the cache
  Current age based on date: 2114
  Ignoring unknown cache-control directive: immutable
  Freshness lifetime from max-age: 365000000
  The response is "fresh", returning cached response
  365000000 > 2114
  Using cached https://self-hosted-devpi/%2Bf/296/73bcc415f4a20/marshmallow_oneofschema-2.0.1-py2.py3-none-any.whl (5.7 kB)
  Added marshmallow-oneofschema<3.0.0,>=2.0.0.post0 from https://self-hosted-devpi/%2Bf/296/73bcc415f4a20/marshmallow_oneofschema-2.0.1-py2.py3-none-any.whl#sha256=29673bcc415f4a2098e273bf3c8229bc1a33e91378885eac90b06943bd626110 (from internal-lib4==0.15.0->-r requirements.txt (line 30)) to build tracker '/private/var/folders/22/_y1ydpt97v70hqfj5f7wvy740000gp/T/pip-req-tracker-ojo8i3cq'
  Removed marshmallow-oneofschema<3.0.0,>=2.0.0.post0 from https://self-hosted-devpi/%2Bf/296/73bcc415f4a20/marshmallow_oneofschema-2.0.1-py2.py3-none-any.whl#sha256=29673bcc415f4a2098e273bf3c8229bc1a33e91378885eac90b06943bd626110 (from internal-lib4==0.15.0->-r requirements.txt (line 30)) from build tracker '/private/var/folders/22/_y1ydpt97v70hqfj5f7wvy740000gp/T/pip-req-tracker-ojo8i3cq'
1 location(s) to search for versions of marshmallow:
* https://self-hosted-devpi/+simple/marshmallow/
Fetching project page and analyzing links: https://self-hosted-devpi/+simple/marshmallow/
Getting page https://self-hosted-devpi/+simple/marshmallow/
Looking up "https://self-hosted-devpi/+simple/marshmallow/" in the cache
Request header has "max_age" as 0, cache bypassed
https://devpi.yougov.net:443 "GET /+simple/marshmallow/ HTTP/1.1" 200 70169
Updating cache with response from "https://self-hosted-devpi/+simple/marshmallow/"
  Found link https://self-hosted-devpi/%2Bf/a2a/5eefb4b75a3b4/marshmallow-3.7.1.tar.gz#sha256=a2a5eefb4b75a3b43f05be1cca0b6686adf56af7465c3ca629e5ad8d1e1fe13d (from https://self-hosted-devpi/+simple/marshmallow/) (requires-python:>=3.5), version: 3.7.1
Given no hashes to check 0 links for project 'marshmallow': discarding no candidates
Collecting internal-lib5>=0.13.2
  Created temporary directory: /private/var/folders/22/_y1ydpt97v70hqfj5f7wvy740000gp/T/pip-unpack-ffx_i25r
  Looking up "https://self-hosted-devpi/%2Bf/f5d/75b9548e314c7/internal-lib5-0.13.3-py2.py3-none-any.whl" in the cache
  Current age based on date: 2114
  Ignoring unknown cache-control directive: immutable
  Freshness lifetime from max-age: 365000000
  The response is "fresh", returning cached response
  365000000 > 2114
  Using cached https://self-hosted-devpi/%2Bf/f5d/75b9548e314c7/internal-lib5-0.13.3-py2.py3-none-any.whl (13 kB)
  Added internal-lib5>=0.13.2 from https://self-hosted-devpi/%2Bf/f5d/75b9548e314c7/internal-lib5-0.13.3-py2.py3-none-any.whl#sha256=f5d75b9548e314c7a47301cae5daecb1c1167165f3f249dbef3779d81d5a7875 (from internal-lib2==6.0.1->-r requirements.txt (line 29)) to build tracker '/private/var/folders/22/_y1ydpt97v70hqfj5f7wvy740000gp/T/pip-req-tracker-ojo8i3cq'
  Removed internal-lib5>=0.13.2 from https://self-hosted-devpi/%2Bf/f5d/75b9548e314c7/internal-lib5-0.13.3-py2.py3-none-any.whl#sha256=f5d75b9548e314c7a47301cae5daecb1c1167165f3f249dbef3779d81d5a7875 (from internal-lib2==6.0.1->-r requirements.txt (line 29)) from build tracker '/private/var/folders/22/_y1ydpt97v70hqfj5f7wvy740000gp/T/pip-req-tracker-ojo8i3cq'
Requirement already satisfied: six>=1.4.1 in environment/lib/python3.6/site-packages (from cryptography==3.0->-r requirements.txt (line 4)) (1.14.0)
… [looped]

On the other hand minimal reproducible example finds conflict quickly:

ERROR: Cannot install marshmallow==3.0.0b12, internal-lib4 0.15.0, marshmallow-oneofschema 2.0.1, marshmallow==3.0.0b12, internal-lib4 0.15.0 and internal-lib4 because these package versions have conflicting dependencies.

The conflict is caused by:
    The user requested marshmallow==3.0.0b12
    internal-lib4 0.15.0 depends on marshmallow<=3.0.0rc6 and >=3.0.0b12
    marshmallow-oneofschema 2.0.1 depends on marshmallow<4.0.0 and >=3.0.0rc6
    The user requested marshmallow==3.0.0b12
    internal-lib4 0.15.0 depends on marshmallow<=3.0.0rc6 and >=3.0.0b12
    marshmallow-oneofschema 2.0.0.post0 depends on marshmallow<4.0.0 and >=3.0.0rc6

To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict

ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies

Minimal requirements with conflict:

cryptography==3.0
internal-lib2==6.0.1
internal-lib4==0.15.0
marshmallow==3.0.0b12

Where:

  • internal-lib2 depends on internal-lib5
  • internal-lib5 depends on internal-lib1 and internal-lib3
  • internal-lib4 0.15.0 depends on "marshmallow<=3.0.0rc6,>=3.0.0b12" and on "marshmallow-oneofschema>=2.0.0.post0,<3.0.0" which causes conflict with "marshmallow==3.0.0b12" from requirements.txt

By the way, thank you for your work on pip!

pip9 dependency failure: boto3, bravado

@sijis and I found another conflict and we're filing according to pypa/pip#988.

[I]  d518a0cf58ee803  ⚓  ~  pip install bravado boto3
Collecting bravado
  Downloading bravado-9.2.2-py2.py3-none-any.whl
Collecting boto3
  Downloading boto3-1.6.8-py2.py3-none-any.whl (128kB)
    100% |████████████████████████████████| 133kB 9.6MB/s 
Collecting requests>=2 (from bravado)
Collecting bravado-core>=4.11.0 (from bravado)
  Downloading bravado_core-4.13.1-py2.py3-none-any.whl (52kB)
    100% |████████████████████████████████| 61kB 40.6MB/s 
Collecting pyyaml (from bravado)
Collecting six (from bravado)
Collecting msgpack-python (from bravado)
  Downloading msgpack-python-0.5.6.tar.gz (138kB)
    100% |████████████████████████████████| 143kB 22.0MB/s 
Collecting python-dateutil (from bravado)
Collecting jmespath<1.0.0,>=0.7.1 (from boto3)
Collecting botocore<1.10.0,>=1.9.8 (from boto3)
  Downloading botocore-1.9.8-py2.py3-none-any.whl (4.1MB)
    100% |████████████████████████████████| 4.1MB 100.8MB/s 
Collecting s3transfer<0.2.0,>=0.1.10 (from boto3)
Collecting certifi>=2017.4.17 (from requests>=2->bravado)
Collecting urllib3<1.23,>=1.21.1 (from requests>=2->bravado)
Collecting idna<2.7,>=2.5 (from requests>=2->bravado)
Collecting chardet<3.1.0,>=3.0.2 (from requests>=2->bravado)
Collecting jsonschema[format]>=2.5.1 (from bravado-core>=4.11.0->bravado)
Collecting simplejson (from bravado-core>=4.11.0->bravado)
Collecting pytz (from bravado-core>=4.11.0->bravado)
Collecting jsonref (from bravado-core>=4.11.0->bravado)
  Downloading jsonref-0.1.tar.gz
Collecting swagger-spec-validator>=2.0.1 (from bravado-core>=4.11.0->bravado)
Collecting docutils>=0.10 (from botocore<1.10.0,>=1.9.8->boto3)
Collecting rfc3987; extra == "format" (from jsonschema[format]>=2.5.1->bravado-core>=4.11.0->bravado)
Collecting strict-rfc3339; extra == "format" (from jsonschema[format]>=2.5.1->bravado-core>=4.11.0->bravado)
Collecting webcolors; extra == "format" (from jsonschema[format]>=2.5.1->bravado-core>=4.11.0->bravado)
  Downloading webcolors-1.8.1-py2.py3-none-any.whl
Installing collected packages: certifi, urllib3, idna, chardet, requests, rfc3987, strict-rfc3339, webcolors, jsonschema, simplejson, pytz, pyyaml, six, jsonref, swagger-spec-validator, msgpack-python, python-dateutil, bravado-core, bravado, jmespath, docutils, botocore, s3transfer, boto3
  Running setup.py install for jsonref ... done
  Running setup.py install for msgpack-python ... done
Successfully installed boto3-1.6.8 botocore-1.9.8 bravado-9.2.2 bravado-core-4.13.1 certifi-2018.1.18 chardet-3.0.4 docutils-0.14 idna-2.6 jmespath-0.9.3 jsonref-0.1 jsonschema-2.6.0 msgpack-python-0.5.6 python-dateutil-2.7.0 pytz-2018.3 pyyaml-3.12 requests-2.18.4 rfc3987-1.3.7 s3transfer-0.1.13 simplejson-3.13.2 six-1.11.0 strict-rfc3339-0.7 swagger-spec-validator-2.1.0 urllib3-1.22 webcolors-1.8.1
[I]  d518a0cf58ee803  ⚓  ~  pip check
botocore 1.9.8 has requirement python-dateutil<2.7.0,>=2.1, but you have python-dateutil 2.7.0.

Provide a programming API for the resolver

The fact that this is being developed as a standalone project may mean this is obvious, but it would be good to consider if the resolver could have a documented/supported API. One of the big areas where people currently importing pip have very few alternative options is when looking at "what would pip install given this set of requirements?" Having pip's resolver available as a standalone library would potentially be a useful option for such people.

Note - I understand how much work maintaining such an API could be, so I'm completely OK with the resolver being designed solely as a component of pip, if that's easier to do. But it's probably worth considering the possibility.

`ResolutionTooDeep: 100` with all pinned dependencies, even when they are already satisfied

I was testing --unstable-feature=resolver in the new pip 20.1b1 (thanks ❤️) and found pip._vendor.resolvelib.resolvers.ResolutionTooDeep: 100 in the middle of the collection step. The requirements.txt file is 164 lines long, but all the versions are pinned (it's an output of pip-tools) so I guess the solver shouldn't do any real work.

In fact, testing in an environment that already has all those dependencies, pip correctly checks that they are all already satisfied and right after checking the last one, it fails:

$ tail requirements.txt 
traittypes==0.2.1         # via ipyleaflet
urllib3==1.25.7           # via requests
vine==1.2.0               # via -r requirements.in, amqp
wcwidth==0.1.8            # via prompt-toolkit
webencodings==0.5.1       # via bleach
widgetsnbextension==3.5.1  # via ipywidgets
xarray==0.14.1            # via ipyleaflet

# The following packages are considered to be unsafe in a requirements file:
# setuptools
$ pip install --no-cache-dir -r requirements.txt --no-cache --unstable-feature=resolver
[...]
Requirement already satisfied: urllib3==1.25.7 in /home/juanlu/.pyenv/versions/3.8.2/envs/bw38/lib/python3.8/site-packages (from -r requirements.txt (line 156)) (1.25.7)
Requirement already satisfied: vine==1.2.0 in /home/juanlu/.pyenv/versions/3.8.2/envs/bw38/lib/python3.8/site-packages (from -r requirements.txt (line 157)) (1.2.0)
Requirement already satisfied: wcwidth==0.1.8 in /home/juanlu/.pyenv/versions/3.8.2/envs/bw38/lib/python3.8/site-packages (from -r requirements.txt (line 158)) (0.1.8)
Requirement already satisfied: webencodings==0.5.1 in /home/juanlu/.pyenv/versions/3.8.2/envs/bw38/lib/python3.8/site-packages (from -r requirements.txt (line 159)) (0.5.1)
Requirement already satisfied: widgetsnbextension==3.5.1 in /home/juanlu/.pyenv/versions/3.8.2/envs/bw38/lib/python3.8/site-packages (from -r requirements.txt (line 160)) (3.5.1)
Requirement already satisfied: xarray==0.14.1 in /home/juanlu/.pyenv/versions/3.8.2/envs/bw38/lib/python3.8/site-packages (from -r requirements.txt (line 161)) (0.14.1)
Requirement already satisfied: setuptools==46.1.3 in /home/juanlu/.pyenv/versions/3.8.2/envs/bw38/lib/python3.8/site-packages (from ipython==7.11.1->-r requirements.txt (line 79)) (46.1.3)
ERROR: Exception:
Traceback (most recent call last):
  File "/home/juanlu/.pyenv/versions/bw38/lib/python3.8/site-packages/pip/_internal/cli/base_command.py", line 188, in _main
    status = self.run(options, args)
  File "/home/juanlu/.pyenv/versions/bw38/lib/python3.8/site-packages/pip/_internal/cli/req_command.py", line 185, in wrapper
    return func(self, options, args)
  File "/home/juanlu/.pyenv/versions/bw38/lib/python3.8/site-packages/pip/_internal/commands/install.py", line 332, in run
    requirement_set = resolver.resolve(
  File "/home/juanlu/.pyenv/versions/bw38/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/resolver.py", line 80, in resolve
    self._result = resolver.resolve(requirements)
  File "/home/juanlu/.pyenv/versions/bw38/lib/python3.8/site-packages/pip/_vendor/resolvelib/resolvers.py", line 413, in resolve
    state = resolution.resolve(requirements, max_rounds=max_rounds)
  File "/home/juanlu/.pyenv/versions/bw38/lib/python3.8/site-packages/pip/_vendor/resolvelib/resolvers.py", line 323, in resolve
    raise ResolutionTooDeep(max_rounds)
pip._vendor.resolvelib.resolvers.ResolutionTooDeep: 100

I am working on a reproducer I can disclose safely.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.