From 51fa5702cc200589d4ff06560af7c34a817373da Mon Sep 17 00:00:00 2001 From: Marcus Smith Date: Wed, 21 May 2014 23:51:08 -0400 Subject: [PATCH 1/2] when installing from wheel files, parse the filename to build the requirement --- pip/req/req_install.py | 18 ++++++++++-------- .../simplewheel-1.0-py2.py3-none-any.whl | Bin 0 -> 1759 bytes .../simplewheel-2.0-py2.py3-none-any.whl | Bin 0 -> 1754 bytes tests/data/src/simplewheel-1.0/setup.cfg | 5 +++++ tests/data/src/simplewheel-1.0/setup.py | 7 +++++++ tests/data/src/simplewheel-1.0/setup.py~ | 7 +++++++ .../src/simplewheel-1.0/simple/__init__.py | 1 + tests/data/src/simplewheel-2.0/setup.cfg | 5 +++++ tests/data/src/simplewheel-2.0/setup.py | 7 +++++++ tests/data/src/simplewheel-2.0/setup.py~ | 7 +++++++ .../src/simplewheel-2.0/simple/__init__.py | 1 + tests/functional/test_install_wheel.py | 12 ++++++++++++ tests/unit/test_req.py | 5 +++++ 13 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 tests/data/packages/simplewheel-1.0-py2.py3-none-any.whl create mode 100644 tests/data/packages/simplewheel-2.0-py2.py3-none-any.whl create mode 100644 tests/data/src/simplewheel-1.0/setup.cfg create mode 100644 tests/data/src/simplewheel-1.0/setup.py create mode 100644 tests/data/src/simplewheel-1.0/setup.py~ create mode 100644 tests/data/src/simplewheel-1.0/simple/__init__.py create mode 100644 tests/data/src/simplewheel-2.0/setup.cfg create mode 100644 tests/data/src/simplewheel-2.0/setup.py create mode 100644 tests/data/src/simplewheel-2.0/setup.py~ create mode 100644 tests/data/src/simplewheel-2.0/simple/__init__.py diff --git a/pip/req/req_install.py b/pip/req/req_install.py index 27a11f76995..6ec2a429072 100644 --- a/pip/req/req_install.py +++ b/pip/req/req_install.py @@ -130,19 +130,15 @@ def from_line(cls, name, comes_from=None, prereleases=None): ) link = Link(path_to_url(name)) - # If the line has an egg= definition, but isn't editable, pull the - # requirement out. Otherwise, assume the name is the req for the non - # URL/path/archive case. - if link and req is None: - url = link.url_without_fragment - # when fragment is None, this will become an 'unnamed' requirement - req = link.egg_fragment + # it's a local file, dir, or url + if link: + url = link.url_without_fragment # Handle relative file URLs if link.scheme == 'file' and re.search(r'\.\./', url): url = path_to_url(os.path.normpath(os.path.abspath(link.path))) - # fail early for invalid or unsupported wheels + # wheel file if link.ext == wheel_ext: wheel = Wheel(link.filename) # can raise InvalidWheelFilename if not wheel.supported(): @@ -150,7 +146,13 @@ def from_line(cls, name, comes_from=None, prereleases=None): "%s is not a supported wheel on this platform." % wheel.filename ) + req = "%s==%s" % (wheel.name, wheel.version) + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req = link.egg_fragment + # a requirement specifier else: req = name diff --git a/tests/data/packages/simplewheel-1.0-py2.py3-none-any.whl b/tests/data/packages/simplewheel-1.0-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..0e6b91eea8572528b8b5c599f2688ff0ab13ff76 GIT binary patch literal 1759 zcmWIWW@Zs#U|`^2(62IZY-nN);{@{9fmjHLi!*Zza#Ho<<1_OzOXB183MzyBG|!%0 z`-F)h0Io4>?^c&M-TF&BKn+|#tO?gxo{^fGqid*VpqG+aT%wzqmzJ;Z;u`E6F=jkR9wRS_4BvS{NEoxdW3G|?!=}q{XnC(0paO67{l*^YeUre7O%9 z2)O+Bx;eS2B`QDes8`_aM2dn%2YZ`}AI$9(-@g-S#^ zbHoz0oqe%9!EJBfZLyrzUL2V@wIeYmMPXCPlbY*~UN_!2)MC47W1H{aBQE$~ZLjOj7kk&Oi+XYYW|5V&J!&vD$w=IRg)e?T zmE;%1=cJaU=IE7FlxUwjqkF>hDS8O?)bFf`0fr0+%i|59a1U2kAMW!WzGpA;dh2SP zJ9B<>kiiw>2Sxs8y>-2GPU>$8^6)yTqt~g=zB2HF!3ATZYsMFzaGg4@fAOo%HC_!} zud^q8HU(*DYWY6p^7Pprq_M)}(%IAJy|4P7S^Wef>Wmb8@(O?sS_{NVcpc{J8sg~U z7~=TZSJ%_WQ^)fP!g-gBAAIsY5k-3J2NBC z(M?VIYKG&HcymR6`%>|Dd7JFN&JAuC+rCZd``fX=SW{~P)6aTm%v^T(qKtR; z)2TLJmV|xMdTO68yTWeK2JTDD=XCkYH|Op-&#=?4;M38z+g|nmFT~&UH@?85dqJ!+ z>zH|E(C*M{&Y64IBj@z=JHEcJemnPqo>My8b;EO=g-;uHRk>|m)~jVS$tyuP`cK95 zv$IS;hi{aB6x44oqn>B>tkP?7LcvaZhhSUqnGFG# zmc>_DgkR6mym!~+0b@n&5B literal 0 HcmV?d00001 diff --git a/tests/data/packages/simplewheel-2.0-py2.py3-none-any.whl b/tests/data/packages/simplewheel-2.0-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..acf0c56cfd9a7258f4aa0ff3fec937ee26447f91 GIT binary patch literal 1754 zcmWIWW@Zs#U|`^2(62IZY-nN);{@{9fmjHLi!*Zza#Ho<<1_OzOXB183MzyBG|!%0 z`-F)h0IpGU?^c&M-TF&BKn+|#tO?gxo{^fGqidvRpqG+aT%wzqmzJ;Z;u`E6F=jkR9wRS_4BvS{NEoxdW3FdwzSgbUZ7E1fmj`{k-4cQi7AOCiF#SZ`FXKDzTAfl z1YG`m-JIOi5|kfz)miY;BX&9O95G%K&y#tgnt$Jy9i4o<@^hNohK;f|Y798PD#&nbkV4iz73qb|glnDr_owQgi>|>&6=gdu%stZ1eqm#AScw!lIS$ zBn%|`Ja3$}di2ctwAfCqYg+MLF3sQ7_PXwT(Y$V5)QkH!zc8W(Qj?6t9a!k%_fbiH zL3~bXS!#}6NkxhFxih*aJfEV6Pfz{MniycXfUrE?@Co;Db@kys@8Ns)BCofu*10q1 zHwPJ9F@8|wf7V;qOXsBirXUZmlRA2x`s^zMFBn`fHo9hf;R)BN^ZFOR>RjX1(Dgcd z(q~hUhNhP9Q!Y=R?LitVOfH>0ect=3@0rz4Fe0v3-~CfA&_Qc~SP8Ggd|g8vT^vIk zKl|!>`grPiUO_nTlJSF2-e-Kb25EqOuM2YhL#K&+dS}o2>a5xl!~sn=pH7_jy{hZs z=OI(-TW8-ua$;*uA!5bE?Vf5vuo4;4&RnH)4S$>xRhBM z-J#AWYFn_fn7_L?Y<6AQ^JyPXieBG*SY<+W;&Q!>>LN_cEe}-h??3GSBYAy>&liz* z?gc$fQ9Q0!9@WY-t2hnB^3* zeryF4L^lJ&mPSjsejRj7DpK73d~2iT?otY=;op4LWFsr@R|q7lL6kWY#<%%K&S&$KZ6Ct F0{}u2WP$(y literal 0 HcmV?d00001 diff --git a/tests/data/src/simplewheel-1.0/setup.cfg b/tests/data/src/simplewheel-1.0/setup.cfg new file mode 100644 index 00000000000..861a9f55426 --- /dev/null +++ b/tests/data/src/simplewheel-1.0/setup.cfg @@ -0,0 +1,5 @@ +[egg_info] +tag_build = +tag_date = 0 +tag_svn_revision = 0 + diff --git a/tests/data/src/simplewheel-1.0/setup.py b/tests/data/src/simplewheel-1.0/setup.py new file mode 100644 index 00000000000..97a2210f0a1 --- /dev/null +++ b/tests/data/src/simplewheel-1.0/setup.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python +from setuptools import setup, find_packages + +setup(name='simplewheel', + version='1.0', + packages=find_packages() + ) diff --git a/tests/data/src/simplewheel-1.0/setup.py~ b/tests/data/src/simplewheel-1.0/setup.py~ new file mode 100644 index 00000000000..3270ba20cb8 --- /dev/null +++ b/tests/data/src/simplewheel-1.0/setup.py~ @@ -0,0 +1,7 @@ +#!/usr/bin/env python +from setuptools import setup, find_packages + +setup(name='simple', + version='1.0', + packages=find_packages() + ) diff --git a/tests/data/src/simplewheel-1.0/simple/__init__.py b/tests/data/src/simplewheel-1.0/simple/__init__.py new file mode 100644 index 00000000000..7986d11379a --- /dev/null +++ b/tests/data/src/simplewheel-1.0/simple/__init__.py @@ -0,0 +1 @@ +#dummy diff --git a/tests/data/src/simplewheel-2.0/setup.cfg b/tests/data/src/simplewheel-2.0/setup.cfg new file mode 100644 index 00000000000..861a9f55426 --- /dev/null +++ b/tests/data/src/simplewheel-2.0/setup.cfg @@ -0,0 +1,5 @@ +[egg_info] +tag_build = +tag_date = 0 +tag_svn_revision = 0 + diff --git a/tests/data/src/simplewheel-2.0/setup.py b/tests/data/src/simplewheel-2.0/setup.py new file mode 100644 index 00000000000..f2b31f6af93 --- /dev/null +++ b/tests/data/src/simplewheel-2.0/setup.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python +from setuptools import setup, find_packages + +setup(name='simplewheel', + version='2.0', + packages=find_packages() + ) diff --git a/tests/data/src/simplewheel-2.0/setup.py~ b/tests/data/src/simplewheel-2.0/setup.py~ new file mode 100644 index 00000000000..3c51380546c --- /dev/null +++ b/tests/data/src/simplewheel-2.0/setup.py~ @@ -0,0 +1,7 @@ +#!/usr/bin/env python +from setuptools import setup, find_packages + +setup(name='simple', + version='2.0', + packages=find_packages() + ) diff --git a/tests/data/src/simplewheel-2.0/simple/__init__.py b/tests/data/src/simplewheel-2.0/simple/__init__.py new file mode 100644 index 00000000000..7986d11379a --- /dev/null +++ b/tests/data/src/simplewheel-2.0/simple/__init__.py @@ -0,0 +1 @@ +#dummy diff --git a/tests/functional/test_install_wheel.py b/tests/functional/test_install_wheel.py index ac9f7b7c690..6f1bd378fa3 100644 --- a/tests/functional/test_install_wheel.py +++ b/tests/functional/test_install_wheel.py @@ -302,3 +302,15 @@ def test_wheel_no_compiles_pyc(script, data): ) assert not any(exists) + + +def test_install_from_wheel_uninstalls_old_version(script, data): + # regression test for https://github.com/pypa/pip/issues/1825 + package = data.packages.join("simplewheel-1.0-py2.py3-none-any.whl") + result = script.pip('install', package, '--no-index', expect_error=True) + package = data.packages.join("simplewheel-2.0-py2.py3-none-any.whl") + result = script.pip('install', package, '--no-index', expect_error=False) + dist_info_folder = script.site_packages / 'simplewheel-2.0.dist-info' + assert dist_info_folder in result.files_created + dist_info_folder = script.site_packages / 'simplewheel-1.0.dist-info' + assert dist_info_folder not in result.files_created diff --git a/tests/unit/test_req.py b/tests/unit/test_req.py index a44e98bc47b..169fb13b8c4 100644 --- a/tests/unit/test_req.py +++ b/tests/unit/test_req.py @@ -8,6 +8,7 @@ from pip.exceptions import ( PreviousBuildDirError, InvalidWheelFilename, UnsupportedWheel, ) +from pip._vendor import pkg_resources from pip.download import PipSession from pip.index import PackageFinder from pip.log import logger @@ -90,6 +91,10 @@ def test_invalid_wheel_requirement_raises(self): with pytest.raises(InvalidWheelFilename): InstallRequirement.from_line('invalid.whl') + def test_wheel_requirement_sets_req_attribute(self): + req = InstallRequirement.from_line('simple-0.1-py2.py3-none-any.whl') + assert req.req == pkg_resources.Requirement.parse('simple==0.1') + def test_requirements_data_structure_keeps_order(): requirements = Requirements() From 280f15a442e440a97b8d8a096b9856bba49510ff Mon Sep 17 00:00:00 2001 From: Marcus Smith Date: Thu, 22 May 2014 16:32:03 -0400 Subject: [PATCH 2/2] remove ~ files --- tests/data/src/simplewheel-1.0/setup.py~ | 7 ------- tests/data/src/simplewheel-2.0/setup.py~ | 7 ------- 2 files changed, 14 deletions(-) delete mode 100644 tests/data/src/simplewheel-1.0/setup.py~ delete mode 100644 tests/data/src/simplewheel-2.0/setup.py~ diff --git a/tests/data/src/simplewheel-1.0/setup.py~ b/tests/data/src/simplewheel-1.0/setup.py~ deleted file mode 100644 index 3270ba20cb8..00000000000 --- a/tests/data/src/simplewheel-1.0/setup.py~ +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env python -from setuptools import setup, find_packages - -setup(name='simple', - version='1.0', - packages=find_packages() - ) diff --git a/tests/data/src/simplewheel-2.0/setup.py~ b/tests/data/src/simplewheel-2.0/setup.py~ deleted file mode 100644 index 3c51380546c..00000000000 --- a/tests/data/src/simplewheel-2.0/setup.py~ +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env python -from setuptools import setup, find_packages - -setup(name='simple', - version='2.0', - packages=find_packages() - )