pypa / pypa/setuptools

`'extras_require' must be a dictionary` when using git+ link in extras_require

Open
#2,048 2 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
2.9k
Forks
1.4k
Avg merge
1d 1h
Merged PRs (30d)
1

Description

moved from https://github.com/pypa/pip/issues/7906

I don't know why it says I added a Python 2 label. I don't even see a button to add labels. This is a python 3 thing (well it probably affects both, but I don't care about py2 :) ).

here's the error for quick reference: https://github.com/pypa/setuptools/blob/8bbdc6000f53be32305287edb9bae5725adc7ca5/setuptools/dist.py#L246-L255

Environment1
virtualenv

  • pip version: 20.0.2
  • Python version: 3.5.2, Python
  • Linux my-docker-container 4.4.0-174-generic #204-Ubuntu SMP Wed Jan 29 06:41:01 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux (nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04)

Environment2
Anaconda virtualenv

  • pip version: 19.1.1
  • Python version: 3.6.4
  • Linux my-hostname 4.4.0-174-generic #204-Ubuntu SMP Wed Jan 29 06:41:01 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux (Ubuntu 16.04.6 LTS)

My test env:

$ pip freeze
pip             20.0.2
setuptools      46.1.1
wheel           0.34.2
#!/usr/bin/env python 
# setup.py
from setuptools import setup, find_packages

# The link is actually to a client library, I'm using six to demonstrate
setup(
        name="dummy",
        packages=find_packages(),
    extras_require={
        'myextra': ['git+https://github.com/benjaminp/six.git'],
    }
)

Description

pip install "./[myextra]"

or

pip install .

fails with

    ERROR: Complete output from command python setup.py egg_info:
    ERROR: error in dummy setup command: 'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.
    ----------------------------------------
ERROR: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-req-build-fgmgoxp2/

Expected behavior
successful pip install of my app plus the extras (a client library in this case). I can pip install a git link, and I can install extras_require, but I can't do extras with a git link

How to Reproduce

  1. new virtualenv/container
  2. make a dummy package with the above setup.py
  3. pip install .

Output

Exception information:
Traceback (most recent call last):
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/cli/base_command.py", line 186, in _main
    status = self.run(options, args)
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/commands/install.py", line 331, in run
    resolver.resolve(requirement_set)
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/legacy_resolve.py", line 177, in resolve
    discovered_reqs.extend(self._resolve_one(requirement_set, req))
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/legacy_resolve.py", line 333, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/legacy_resolve.py", line 282, in _get_abstract_dist_for
    abstract_dist = self.preparer.prepare_linked_requirement(req)
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/operations/prepare.py", line 516, in prepare_linked_requirement
    req, self.req_tracker, self.finder, self.build_isolation,
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/operations/prepare.py", line 95, in _get_prepared_distribution
    abstract_dist.prepare_distribution_metadata(finder, build_isolation)
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/distributions/sdist.py", line 40, in prepare_distribution_metadata
    self.req.prepare_metadata()
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/req/req_install.py", line 564, in prepare_metadata
    self.metadata_directory = self._generate_metadata()
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/req/req_install.py", line 544, in _generate_metadata
    details=self.name or "from {}".format(self.link)
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/operations/build/metadata_legacy.py", line 118, in generate_metadata
    command_desc='python setup.py egg_info',
  File "/home/ubuntu/.virtualenvs/testdev/lib/python3.6/site-packages/pip/_internal/utils/subprocess.py", line 242, in call_subprocess
    raise InstallationError(exc_msg)
pip._internal.exceptions.InstallationError: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the linked setuptools/dist.py section at lines 246-255 and reproduce the failure using the issue's setup.py and pip install . commands in a Python virtual environment. Trace how the git+ requirement is validated in extras_require; done means the dummy package installs successfully with the extra and the existing error no longer occurs.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
build-system
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.