diff --git a/pipenv/utils.py b/pipenv/utils.py index d1da2faf..91086043 100644 --- a/pipenv/utils.py +++ b/pipenv/utils.py @@ -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 diff --git a/tests/test_utils.py b/tests/test_utils.py index 21a97383..654478e0 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -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}}