Poetry: Optinal package install (mypy) raising "Could not parse version constraint: <empty>"

Created on 18 Oct 2019  Â·  3Comments  Â·  Source: python-poetry/poetry

  • [X] I am on the latest Poetry version.
  • [X] I have searched the issues of this repo and believe that this is not a duplicate.
  • [X] If an exception occurs when executing a command, I executed it again in debug mode (-vvv option).
  • OS version and name: CentOS 7.
  • Poetry version: 0.12.17
  • Link of a Gist with the contents of your pyproject.toml file: NA

Issue

I have a package that needs running on Python 2 and 3. Therefore, I have

[tool.poetry.dependencies]
python = "^2.7 || ^3.6 ||  ^3.7"

in my pyproject.toml file.

I want some dependencies to be only Python 3, mostly for dev work -- namely mypy and black. Reading the documentation, I found it is best practice to use poetry add … so that is what I did. However, I got a Could not parse version constraint: <empty>.

_What am I doing wrong?_

Could it be another manifestation of bug #1480?

usignals-py3.7(poetry ↑2|+3); poetry add -v -D --python ">=3.6" --optional mypy
Using virtualenv: /home/usr/.cache/pypoetry/virtualenvs/usignals-py3.7
Using version ^0.740.0 for mypy

Updating dependencies
Resolving dependencies... (0.9s)

[ValueError]                    
Could not parse version constraint: <empty>  

Exception trace:
 /home/usr/.poetry/lib/poetry/_vendor/py3.7/cleo/application.py in run() at line 94
   status_code = self.do_run(input_, output_)
 /home/usr/.poetry/lib/poetry/console/application.py in do_run() at line 88
   return super(Application, self).do_run(i, o)
 /home/usr/.poetry/lib/poetry/_vendor/py3.7/cleo/application.py in do_run() at line 197
   status_code = command.run(input_, output_)
 /home/usr/.poetry/lib/poetry/console/commands/command.py in run() at line 77
   return super(BaseCommand, self).run(i, o)
 /home/usr/.poetry/lib/poetry/_vendor/py3.7/cleo/commands/base_command.py in run() at line 146
   status_code = self.execute(input_, output_)
 /home/usr/.poetry/lib/poetry/_vendor/py3.7/cleo/commands/command.py in execute() at line 107
   return self.handle()
 /home/usr/.poetry/lib/poetry/console/commands/add.py in handle() at line 139
   status = installer.run()
 /home/usr/.poetry/lib/poetry/installation/installer.py in run() at line 73
   self._do_install(local_repo)
 /home/usr/.poetry/lib/poetry/installation/installer.py in _do_install() at line 165
   ops = solver.solve(use_latest=self._whitelist)
 /home/usr/.poetry/lib/poetry/puzzle/solver.py in solve() at line 38
   packages, depths = self._solve(use_latest=use_latest)
 /home/usr/.poetry/lib/poetry/puzzle/solver.py in _solve() at line 177
   e.constraints, use_latest=use_latest
 /home/usr/.poetry/lib/poetry/puzzle/solver.py in solve_in_compatibility_mode() at line 144
   _packages, _depths = self._solve(use_latest=use_latest)
 /home/usr/.poetry/lib/poetry/puzzle/solver.py in _solve() at line 171
   self._package, self._provider, locked=locked, use_latest=use_latest
 /home/usr/.poetry/lib/poetry/mixology/__init__.py in resolve_version() at line 7
   return solver.solve()
 /home/usr/.poetry/lib/poetry/mixology/version_solver.py in solve() at line 79
   next = self._choose_package_version()
 /home/usr/.poetry/lib/poetry/mixology/version_solver.py in _choose_package_version() at line 377
   version = self._provider.complete_package(version)
 /home/usr/.poetry/lib/poetry/puzzle/provider.py in complete_package() at line 592
   package.dependency.python_constraint
 /home/usr/.poetry/lib/poetry/packages/dependency.py in transitive_python_versions() at line 109
   self._transitive_python_constraint = parse_constraint(value)
 /home/usr/.poetry/lib/poetry/semver/__init__.py in parse_constraint() at line 31
   constraint_objects.append(parse_single_constraint(and_constraints[0]))
 /home/usr/.poetry/lib/poetry/semver/__init__.py in parse_single_constraint() at line 164
   raise ValueError("Could not parse version constraint: {}".format(constraint))

add [-D|--dev] [--git GIT] [--path PATH] [-E|--extras EXTRAS] [--optional] [--python PYTHON] [--platform PLATFORM] [--allow-prereleases] [--dry-run] [--] <name> (<name>)...
Bug

Most helpful comment

I am having a similar problem with pytest-mock package

poetry add -v -D --python "^3.4" --optional pytest-mock
Using virtualenv: /Users/byron/Library/Caches/pypoetry/virtualenvs/demo-py2.7
Using version ^1.11 for pytest-mock

Updating dependencies
Resolving dependencies... (1.5s)

[ValueError]
Could not parse version constraint: <empty>

Exception trace:
 /Users/byron/.poetry/lib/poetry/_vendor/py2.7/cleo/application.py in run() at line 94
   status_code = self.do_run(input_, output_)
 /Users/byron/.poetry/lib/poetry/console/application.py in do_run() at line 88
   return super(Application, self).do_run(i, o)
 /Users/byron/.poetry/lib/poetry/_vendor/py2.7/cleo/application.py in do_run() at line 197
   status_code = command.run(input_, output_)
 /Users/byron/.poetry/lib/poetry/console/commands/command.py in run() at line 77
   return super(BaseCommand, self).run(i, o)
 /Users/byron/.poetry/lib/poetry/_vendor/py2.7/cleo/commands/base_command.py in run() at line 146
   status_code = self.execute(input_, output_)
 /Users/byron/.poetry/lib/poetry/_vendor/py2.7/cleo/commands/command.py in execute() at line 107
   return self.handle()
 /Users/byron/.poetry/lib/poetry/console/commands/add.py in handle() at line 139
   status = installer.run()
 /Users/byron/.poetry/lib/poetry/installation/installer.py in run() at line 73
   self._do_install(local_repo)
 /Users/byron/.poetry/lib/poetry/installation/installer.py in _do_install() at line 165
   ops = solver.solve(use_latest=self._whitelist)
 /Users/byron/.poetry/lib/poetry/puzzle/solver.py in solve() at line 38
   packages, depths = self._solve(use_latest=use_latest)
 /Users/byron/.poetry/lib/poetry/puzzle/solver.py in _solve() at line 177
   e.constraints, use_latest=use_latest
 /Users/byron/.poetry/lib/poetry/puzzle/solver.py in solve_in_compatibility_mode() at line 144
   _packages, _depths = self._solve(use_latest=use_latest)
 /Users/byron/.poetry/lib/poetry/puzzle/solver.py in _solve() at line 171
   self._package, self._provider, locked=locked, use_latest=use_latest
 /Users/byron/.poetry/lib/poetry/mixology/__init__.py in resolve_version() at line 7
   return solver.solve()
 /Users/byron/.poetry/lib/poetry/mixology/version_solver.py in solve() at line 79
   next = self._choose_package_version()
 /Users/byron/.poetry/lib/poetry/mixology/version_solver.py in _choose_package_version() at line 377
   version = self._provider.complete_package(version)
 /Users/byron/.poetry/lib/poetry/puzzle/provider.py in complete_package() at line 592
   package.dependency.python_constraint
 /Users/byron/.poetry/lib/poetry/packages/dependency.py in transitive_python_versions() at line 109
   self._transitive_python_constraint = parse_constraint(value)
 /Users/byron/.poetry/lib/poetry/semver/__init__.py in parse_constraint() at line 31
   constraint_objects.append(parse_single_constraint(and_constraints[0]))
 /Users/byron/.poetry/lib/poetry/semver/__init__.py in parse_single_constraint() at line 164
   raise ValueError("Could not parse version constraint: {}".format(constraint))

add [-D|--dev] [--git GIT] [--path PATH] [-E|--extras EXTRAS] [--optional] [--python PYTHON] [--platform PLATFORM] [--allow-prereleases] [--dry-run] [--] <name> (<name>)...

I found out that it adds an entry about typing module in the poetry.lock , and it seems to be the root cause with an invalid marker field marker = "<empty>"

[[package]]
category = "dev"
description = "Type Hints for Python"
marker = "<empty>"
name = "typing"
optional = true
python-versions = "*"
version = "3.7.4.1"

a reference toml file

[tool.poetry]
name = "demo"
authors = ["bz"]
version = "1.6"
description = ""

[tool.poetry.dependencies]
python = "~2.7 || ^3.3"

future = "^0.18.2"
requests = [
    {version = "^2.22", extras = ["security"], python="^3.5"},
    {version = "^2.0", extras = ["security"], python="<3.5"}
]
flask = [
    { version = "^1.0.0", python="^3.5" },
    { version = "<1.0", python = "<3.5" }
]
flask-compress = "^1.4"

pytest = [
    { version = "^5.0.0", optional = true, python = "^3.5" },
    { version = "^3.0.0", optional = true, python = "<3.5" }
]
pytest-mock = [
    { version = "^1.11.0", optional = true, python = "^3.4" },
    { version = "^1.6.0", optional = true, python = "<3.4" }
]
pytest-sugar = { version = "^0.9.2", optional = true }
selenium = { version = "^3.141.0", optional = true }
percy = { version = "^2.0", optional = true }

[tool.poetry.dev-dependencies]
flake8 = [
    { version = "^3.7", python = "^3.5", optional = true },
    { version = "^3.5.0 && < 3.7", python = "~2.7 || <3.5", optional = true }
]
pylint = [
    { version = "^1.0.0", python = "~2.7 || <3.5", optional = true },
    { version = "^2.0.0", python = "^3.5", optional = true }
]
astroid = { version = "^2.2.5", python = "^3.7", optional=true }
coloredlogs = "^10.0"
fire = "^0.2.1"
mock = [
    { version = "^2.0.0", python = "~2.7 || <3.5", optional = true },
    { version = "^3.0.0", python = "^3.5", optional = true }
]
pyyaml = "^5.1"
virtualenv = { version="^16", python = "~2.7", optional = true}

[tool.poetry.extras]
testing = ["pytest", "pytest-sugar", "pytest-mock", "selenium", "percy"]
dev = ["flake8", "mock", "coloredlogs", "fire", "pyyaml"]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

All 3 comments

Running:

poetry add -v -D --python ">=3.6" --optional --allow-prereleases mypy

Did add the following to pyproject.toml file:

mypy = {version = "^0.740.0", optional = true, allows-prereleases = true, python = ">=3.6"}

Yet pip claims the package is not installed in my vene (which is python 3.7.4) like so:

```
usignals-py3.7(poetry ↑2|+3); mypy --version
zsh: mypy: command not found...
zsh: command not found: mypy
usignals-py3.7(poetry ↑2|+3); pip list | ag mypy
You are using pip version 19.0.3, however version 19.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
usignals-py3.7(poetry ↑2|+3);
````

My apologies if this is really obvious. I am new to poetry…

I am having a similar problem with pytest-mock package

poetry add -v -D --python "^3.4" --optional pytest-mock
Using virtualenv: /Users/byron/Library/Caches/pypoetry/virtualenvs/demo-py2.7
Using version ^1.11 for pytest-mock

Updating dependencies
Resolving dependencies... (1.5s)

[ValueError]
Could not parse version constraint: <empty>

Exception trace:
 /Users/byron/.poetry/lib/poetry/_vendor/py2.7/cleo/application.py in run() at line 94
   status_code = self.do_run(input_, output_)
 /Users/byron/.poetry/lib/poetry/console/application.py in do_run() at line 88
   return super(Application, self).do_run(i, o)
 /Users/byron/.poetry/lib/poetry/_vendor/py2.7/cleo/application.py in do_run() at line 197
   status_code = command.run(input_, output_)
 /Users/byron/.poetry/lib/poetry/console/commands/command.py in run() at line 77
   return super(BaseCommand, self).run(i, o)
 /Users/byron/.poetry/lib/poetry/_vendor/py2.7/cleo/commands/base_command.py in run() at line 146
   status_code = self.execute(input_, output_)
 /Users/byron/.poetry/lib/poetry/_vendor/py2.7/cleo/commands/command.py in execute() at line 107
   return self.handle()
 /Users/byron/.poetry/lib/poetry/console/commands/add.py in handle() at line 139
   status = installer.run()
 /Users/byron/.poetry/lib/poetry/installation/installer.py in run() at line 73
   self._do_install(local_repo)
 /Users/byron/.poetry/lib/poetry/installation/installer.py in _do_install() at line 165
   ops = solver.solve(use_latest=self._whitelist)
 /Users/byron/.poetry/lib/poetry/puzzle/solver.py in solve() at line 38
   packages, depths = self._solve(use_latest=use_latest)
 /Users/byron/.poetry/lib/poetry/puzzle/solver.py in _solve() at line 177
   e.constraints, use_latest=use_latest
 /Users/byron/.poetry/lib/poetry/puzzle/solver.py in solve_in_compatibility_mode() at line 144
   _packages, _depths = self._solve(use_latest=use_latest)
 /Users/byron/.poetry/lib/poetry/puzzle/solver.py in _solve() at line 171
   self._package, self._provider, locked=locked, use_latest=use_latest
 /Users/byron/.poetry/lib/poetry/mixology/__init__.py in resolve_version() at line 7
   return solver.solve()
 /Users/byron/.poetry/lib/poetry/mixology/version_solver.py in solve() at line 79
   next = self._choose_package_version()
 /Users/byron/.poetry/lib/poetry/mixology/version_solver.py in _choose_package_version() at line 377
   version = self._provider.complete_package(version)
 /Users/byron/.poetry/lib/poetry/puzzle/provider.py in complete_package() at line 592
   package.dependency.python_constraint
 /Users/byron/.poetry/lib/poetry/packages/dependency.py in transitive_python_versions() at line 109
   self._transitive_python_constraint = parse_constraint(value)
 /Users/byron/.poetry/lib/poetry/semver/__init__.py in parse_constraint() at line 31
   constraint_objects.append(parse_single_constraint(and_constraints[0]))
 /Users/byron/.poetry/lib/poetry/semver/__init__.py in parse_single_constraint() at line 164
   raise ValueError("Could not parse version constraint: {}".format(constraint))

add [-D|--dev] [--git GIT] [--path PATH] [-E|--extras EXTRAS] [--optional] [--python PYTHON] [--platform PLATFORM] [--allow-prereleases] [--dry-run] [--] <name> (<name>)...

I found out that it adds an entry about typing module in the poetry.lock , and it seems to be the root cause with an invalid marker field marker = "<empty>"

[[package]]
category = "dev"
description = "Type Hints for Python"
marker = "<empty>"
name = "typing"
optional = true
python-versions = "*"
version = "3.7.4.1"

a reference toml file

[tool.poetry]
name = "demo"
authors = ["bz"]
version = "1.6"
description = ""

[tool.poetry.dependencies]
python = "~2.7 || ^3.3"

future = "^0.18.2"
requests = [
    {version = "^2.22", extras = ["security"], python="^3.5"},
    {version = "^2.0", extras = ["security"], python="<3.5"}
]
flask = [
    { version = "^1.0.0", python="^3.5" },
    { version = "<1.0", python = "<3.5" }
]
flask-compress = "^1.4"

pytest = [
    { version = "^5.0.0", optional = true, python = "^3.5" },
    { version = "^3.0.0", optional = true, python = "<3.5" }
]
pytest-mock = [
    { version = "^1.11.0", optional = true, python = "^3.4" },
    { version = "^1.6.0", optional = true, python = "<3.4" }
]
pytest-sugar = { version = "^0.9.2", optional = true }
selenium = { version = "^3.141.0", optional = true }
percy = { version = "^2.0", optional = true }

[tool.poetry.dev-dependencies]
flake8 = [
    { version = "^3.7", python = "^3.5", optional = true },
    { version = "^3.5.0 && < 3.7", python = "~2.7 || <3.5", optional = true }
]
pylint = [
    { version = "^1.0.0", python = "~2.7 || <3.5", optional = true },
    { version = "^2.0.0", python = "^3.5", optional = true }
]
astroid = { version = "^2.2.5", python = "^3.7", optional=true }
coloredlogs = "^10.0"
fire = "^0.2.1"
mock = [
    { version = "^2.0.0", python = "~2.7 || <3.5", optional = true },
    { version = "^3.0.0", python = "^3.5", optional = true }
]
pyyaml = "^5.1"
virtualenv = { version="^16", python = "~2.7", optional = true}

[tool.poetry.extras]
testing = ["pytest", "pytest-sugar", "pytest-mock", "selenium", "percy"]
dev = ["flake8", "mock", "coloredlogs", "fire", "pyyaml"]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

I found that extras only work with regular deps and not dev deps, is that true?

Was this page helpful?
0 / 5 - 0 ratings