handle package[extra]==version properly

Previously doing `pipenv install "django-rest-auth[with_social]==0.8.2` would
lose the extra information and if you edited the Pipfile by hand to
```
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[packages.django-rest-auth]
version = "==0.8.2"
extras = [ "with_social",]
```

`pipenv update` would break with a malformed pip command.
This commit is contained in:
Christian Sauer
2017-05-17 14:13:03 -04:00
parent 31b4133253
commit d60b42d147
2 changed files with 36 additions and 13 deletions
+21 -13
View File
@@ -40,18 +40,8 @@ def convert_deps_from_pip(dep):
req = [r for r in requirements.parse(dep)][0]
# Comparison operators: e.g. Django>1.10
if req.specs:
r = multi_split(dep, '=<>')
dependency[req.name] = dep[len(r[0]):]
# Extras: e.g. requests[socks]
elif req.extras:
r = multi_split(dep, '[]')
dependency[req.name] = {'extras': req.extras}
# VCS Installs.
elif req.vcs:
if req.vcs:
if req.name is None:
raise ValueError('pipenv requires an #egg fragment for version controlled '
'dependencies. Please install remote dependency '
@@ -68,6 +58,23 @@ def convert_deps_from_pip(dep):
if req.revision:
dependency[req.name].update({'ref': req.revision})
elif req.specs or req.extras:
specs = None
# Comparison operators: e.g. Django>1.10
if req.specs:
r = multi_split(dep, '=<>')
specs = dep[len(r[0]):]
dependency[req.name] = specs
# Extras: e.g. requests[socks]
if req.extras:
r = multi_split(dep, '[]')
dependency[req.name] = {'extras': req.extras}
if specs:
dependency[req.name].update({'version': specs})
# Bare dependencies: e.g. requests
else:
dependency[dep] = '*'
@@ -89,8 +96,9 @@ def convert_deps_to_pip(deps, r=True):
if deps[dep] == '*' or str(extra) == '{}':
extra = ''
hash = ''
if 'hash' in deps[dep]:
extra = ' --hash={0}'.format(deps[dep]['hash'])
hash = ' --hash={0}'.format(deps[dep]['hash'])
# Support for extras (e.g. requests[socks])
if 'extras' in deps[dep]:
@@ -119,7 +127,7 @@ def convert_deps_to_pip(deps, r=True):
else:
dep = ''
dependencies.append('{0}{1}{2}'.format(dep, version, extra))
dependencies.append('{0}{1}{2}{3}'.format(dep, extra, version, hash))
if not r:
return dependencies
+15
View File
@@ -41,6 +41,11 @@ class TestUtils:
deps = pipenv.utils.convert_deps_to_pip(deps, r=False)
assert deps[0] == 'django>1.10'
# Pinned version with Extras
deps = {'requests': {'extras': ['socks'], 'version': '>1.10'}}
deps = pipenv.utils.convert_deps_to_pip(deps, r=False)
assert deps[0] == 'requests[socks]>1.10'
# pinax = { git = 'git://github.com/pinax/pinax.git', ref = '1.4', editable = true }
deps = {'pinax': {'git': 'git://github.com/pinax/pinax.git', 'ref': '1.4', 'editable': True}}
deps = pipenv.utils.convert_deps_to_pip(deps, r=False)
@@ -56,6 +61,11 @@ class TestUtils:
deps = pipenv.utils.convert_deps_to_pip(deps, r=False)
assert deps[0] == 'FooProject==1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'
# test everything
deps = {'FooProject': {'version': '==1.2', 'extras': ['stuff'], 'hash': 'sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'}}
deps = pipenv.utils.convert_deps_to_pip(deps, r=False)
assert deps[0] == 'FooProject[stuff]==1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'
# test unicode values
deps = {u'django': u'==1.10'}
deps = pipenv.utils.convert_deps_to_pip(deps, r=False)
@@ -79,6 +89,11 @@ class TestUtils:
dep = pipenv.utils.convert_deps_from_pip(dep)
assert dep == {'requests': {'extras': ['socks']}}
# requests[socks] w/ version
dep = 'requests[socks]==1.10'
dep = pipenv.utils.convert_deps_from_pip(dep)
assert dep == {'requests': {'extras': ['socks'], 'version': '==1.10'}}
dep = '-e svn+svn://svn.myproject.org/svn/MyProject#egg=MyProject'
dep = pipenv.utils.convert_deps_from_pip(dep)
assert dep == {u'MyProject': {u'svn': u'svn://svn.myproject.org/svn/MyProject', 'editable': True}}