From dc5e825d4e915ff39a2368f9fb4d2c15ca358aa9 Mon Sep 17 00:00:00 2001 From: Marcus Smith Date: Tue, 13 Nov 2012 21:29:58 -0800 Subject: [PATCH 1/2] upper case url reqs should be recognized as same as other lower case forms --- pip/req.py | 4 ++-- tests/packages/README.txt | 5 +++++ tests/packages/Upper-1.0.tar.gz | Bin 0 -> 675 bytes tests/packages/Upper-2.0.tar.gz | Bin 0 -> 677 bytes tests/packages/requiresupper-1.0.tar.gz | Bin 0 -> 740 bytes tests/test_requirements.py | 23 +++++++++++++++++++++++ 6 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/packages/Upper-1.0.tar.gz create mode 100644 tests/packages/Upper-2.0.tar.gz create mode 100644 tests/packages/requiresupper-1.0.tar.gz diff --git a/pip/req.py b/pip/req.py index dbe7af27b7f..559c1fc58f9 100644 --- a/pip/req.py +++ b/pip/req.py @@ -1094,8 +1094,8 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False): subreq = InstallRequirement(req, req_to_install) reqs.append(subreq) self.add_requirement(subreq) - if req_to_install.name not in self.requirements: - self.requirements[req_to_install.name] = req_to_install + if not self.has_requirement(req_to_install.name): + self.add_requirement(req_to_install) if self.is_download or req_to_install._temp_build_dir is not None: self.reqs_to_cleanup.append(req_to_install) else: diff --git a/tests/packages/README.txt b/tests/packages/README.txt index 0d25eb59d91..fdf925d6e96 100644 --- a/tests/packages/README.txt +++ b/tests/packages/README.txt @@ -62,6 +62,11 @@ simple-[123].0.tar.gz --------------------- contains "simple" package; good for basic testing and version logic. +Upper-[12].0.tar.gz and requiresuppper-1.0.tar.gz +-------------------------------------------------- +'requiresupper' requires 'upper' +used for testing case mismatch case for url requirements + diff --git a/tests/packages/Upper-1.0.tar.gz b/tests/packages/Upper-1.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e0d28fdc7629b893b60b6f93f6ea4f87920c10f3 GIT binary patch literal 675 zcmV;U0$lwciwFoPB%@FQ166QvWpXVsE-)^1VR8WNnA>ifKoEwx<|(%7g%c^5&e-{R3I9QtbXJ==UWh~c>KGl`h zpc2n1XUgO;{&zR; zwU5Jhqjuu&+VQu>BB!_n8F`XNo2mIZURF}*6qk2G&yYb*((cw@bdri>R`kG)~VG>=Ky8djb?kWH3{33QdgD)=)VK7oLnOO0Q%S0o#5%eaj^e4x8}c=Tg`uM=)W6YzR=4e*Y6{) zGrl0%Qts8cI?L09)CnQdG%iS#WN9u|mMb!gc<5)r^g(X>3stSH7d%MVpjW3;?@A># zi`D30(3AP~Xk0%yc=DQy%fIeR6r=O#f3+EF;~U4%e=Vcx|1tmVKK^ZN#t-*@UKM}S zu}#x6%xeB?S_bNWC-pxplVpjS3jhEB0000000000000000000000000006*q;19?F JlAr)k006`tSZ)9S literal 0 HcmV?d00001 diff --git a/tests/packages/Upper-2.0.tar.gz b/tests/packages/Upper-2.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..81ff441daa652886493beabd5bd9f1247dbfa9c5 GIT binary patch literal 677 zcmV;W0$TkaiwFpmCZkXS166QvWpXVtE-)^1VR8WNm`!h+KoEvG^DDOMA&C^sf{l?P z`B3#+N$seX+e1|$0&5oq77B}7|NAcM`Xk7eWy#>CdY=n0vlvS=@9gYMvW(@1-Jzz| z7*ygqPIa|hhi+e2XqHVK+PAy5-P5RLxh~a+qqRU;2tOx8`}r$KL$-h2A^$UFvX1}# z?R(?n@ZG4H`1gCgz45pERxSQrxn3g_@o$_@O!%QMeB%qtizwwc#OhFe=qK!ksNB%k z4w)qSxJ(j1Ur68Zb~ySv)IX#NGcte1Hl|ml_>t!IXM-hv6mP6|QNVby_1YU&1bLJR z^{tihKK8{l&6ABq1I_5aV4}=A!F1NT{;Auo>%VVV(0?0zW3!nT@oD;97yit9D5E$e z1EL;eU10K_s)u6Ey`0UXsun0Cl=y$?U)^4{kOrg>(3VYp7O8nPm8)MWEtZj z+(}bvm5NR40BucV07fZ`EnMOSHGCz2f$NoasmGzSQ2^(Cfbh^0K ziDJGS9SkmHeyxqG7Y9#%=JM*V`wGSAJo;ZA#+vxX@$=uVRrUXv|F$3hCJy6=`#-me zzwPvF+qLX!{wos!^}m(+AC^h7K+OdJ000000000000000000000000000000;5qOI L40zPm08jt`7jt3< literal 0 HcmV?d00001 diff --git a/tests/packages/requiresupper-1.0.tar.gz b/tests/packages/requiresupper-1.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..fe121a90f23a2a8b5baa769178bb02093de3340e GIT binary patch literal 740 zcmVCb9HcVWpXVsE-)^1VR8WNnO#rYFcgM!onPT; z7X^tncG4sgQZJ@`3s%q&+XX_AY20FwFA}F)|NWA5rA-l(t|4OLeQr`8JF?ny-q)_3 zirZYKBFmFRq+QmdhSoT=z_so2$y}SRJ{M@rq&9U-%dv_$vm8b>VrwmsXNsqUXt%#c zu`eDTx2gX>CB2vb)1%MbuftC#&F0_f_aDr^>9V!__g!jhgd+dX&NrdB&lT_f5NRgk z=#UgOpbvQ{4oR&x^xA;4JPdg{J0$1Bqv6TVq5dTfMK|FSu?)S-)peY%x4R0ii5G~e2>zvBq5mgl zs3H9q%{Be^O~-=%+W_k*^#3INuexr->p!LT`ubm;|3UvPeEl-ZkOB0+N&h?Ss5a`K zIqUj&i{a3J+xf?40QxuX{t-4d$433T*4q7#-M1L@-v$?j!F#2_U+RiaysKOWJ{gdz z;d3R5&$Mb})5uH3RF-FeRS;(J3f6z4DgAGE|L@qQh5MhEkpGqAzvuIR>X!L8?S8TG zV`h2(=fMBl;jN#C;S635|F7@=c98ql`Zry7>Hj7x_kWg!^PhI~|HjC()VPw7A)+Zs zX6ibQ^l=)8q$&gz$3aG9n8c}?M-IqXM!uKu(G8!7OrKvI?L|BkgHElSItMzbn9i?` z2c4q6?t(HZe)%Bq7OxbW%8SnYz01Xz#Uz8;lzaPsyZ7N+00000000000000000000 W0000000019Cw~A7nWV}9Pyhfz=YPKd literal 0 HcmV?d00001 diff --git a/tests/test_requirements.py b/tests/test_requirements.py index 47a274824cc..a21478ac6e3 100644 --- a/tests/test_requirements.py +++ b/tests/test_requirements.py @@ -184,3 +184,26 @@ def test_install_local_editable_with_extras(): assert env.site_packages/'easy-install.pth' in res.files_updated assert env.site_packages/'LocalExtras.egg-link' in res.files_created assert env.site_packages/'simple' in res.files_created + + +def test_url_req_case_mismatch(): + """ + tar ball url requirements (with no egg fragment), that happen to have upper case project names, + should be considered equal to later requirements that reference the project name using lower case. + + tests/packages contains Upper-1.0.tar.gz and Upper-2.0.tar.gz + 'requiresupper' has install_requires = ['upper'] + """ + env = reset_env() + find_links = 'file://' + os.path.join(here, 'packages') + Upper = os.path.join(find_links, 'Upper-1.0.tar.gz') + result = run_pip('install', '--no-index', '-f', find_links, Upper, 'requiresupper') + + #only Upper-1.0.tar.gz should get installed. + egg_folder = env.site_packages / 'Upper-1.0-py%s.egg-info' % pyversion + assert egg_folder in result.files_created, str(result) + egg_folder = env.site_packages / 'Upper-2.0-py%s.egg-info' % pyversion + assert egg_folder not in result.files_created, str(result) + + + From d882827e3f986f15ebdd3e9e82db9bc39890db88 Mon Sep 17 00:00:00 2001 From: Marcus Smith Date: Wed, 14 Nov 2012 12:44:05 -0800 Subject: [PATCH 2/2] comments on 'unnamed' requirements --- pip/req.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pip/req.py b/pip/req.py index 559c1fc58f9..16c3cff6abc 100644 --- a/pip/req.py +++ b/pip/req.py @@ -107,7 +107,7 @@ def from_line(cls, name, comes_from=None): # 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 - req = link.egg_fragment + req = link.egg_fragment #when fragment is None, this will become an 'unnamed' requirement # Handle relative file URLs if link.scheme == 'file' and re.search(r'\.\./', url): @@ -843,6 +843,7 @@ def add_requirement(self, install_req): install_req.as_egg = self.as_egg install_req.use_user_site = self.use_user_site if not name: + #url or path requirement w/o an egg fragment self.unnamed_requirements.append(install_req) else: if self.has_requirement(name): @@ -1095,6 +1096,7 @@ def prepare_files(self, finder, force_root_egg_info=False, bundle=False): reqs.append(subreq) self.add_requirement(subreq) if not self.has_requirement(req_to_install.name): + #'unnamed' requirements will get added here self.add_requirement(req_to_install) if self.is_download or req_to_install._temp_build_dir is not None: self.reqs_to_cleanup.append(req_to_install)