mirror of
https://github.com/kennethreitz/pipenv.git
synced 2026-06-05 22:50:18 +00:00
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:
+21
-13
@@ -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
|
||||
|
||||
@@ -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}}
|
||||
|
||||
Reference in New Issue
Block a user