diff options
-rw-r--r-- | CHANGES.txt | 3 | ||||
-rw-r--r-- | pkg_resources.py | 26 | ||||
-rw-r--r-- | setuptools/tests/test_resources.py | 24 |
3 files changed, 47 insertions, 6 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index e92f9cbf..73a10b36 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,9 @@ CHANGES 0.6.5 ----- +* Distribute no longer shadows setuptools if we require a 0.7-series + setuptools. + * When run from within buildout, no attempt is made to modify an existing setuptools egg, whether in a shared egg directory or a system setuptools. diff --git a/pkg_resources.py b/pkg_resources.py index 1d5d8643..510be536 100644 --- a/pkg_resources.py +++ b/pkg_resources.py @@ -504,8 +504,7 @@ class WorkingSet(object): while requirements: req = requirements.pop(0) # process dependencies breadth-first - if req.project_name == 'setuptools': - # TODO: only return distribute if setuptools < 0.7 + if _override_setuptools(req): req = Requirement.parse('distribute') if req in processed: @@ -2501,8 +2500,7 @@ class Requirement: # if asked for setuptools distribution # and if distribute is installed, we want to give # distribute instead - if founded_req.project_name == 'setuptools': - # TODO: only return distribute if setuptools < 0.7 + if _override_setuptools(founded_req): distribute = list(parse_requirements('distribute')) if len(distribute) == 1: return distribute[0] @@ -2526,6 +2524,26 @@ state_machine = { } +def _override_setuptools(req): + """Return True when distribute wants to override a setuptools dependency. + + We want to override when the requirement is setuptools and the version is + a variant of 0.6. + + """ + if req.project_name == 'setuptools': + if not len(req.specs): + # Just setuptools: ok + return True + for comparator, version in req.specs: + if comparator in ['==', '>=', '>']: + if '0.7' in version: + # We want some setuptools not from the 0.6 series. + return False + return True + return False + + def _get_mro(cls): """Get an mro for a type or classic class""" if not isinstance(cls,type): diff --git a/setuptools/tests/test_resources.py b/setuptools/tests/test_resources.py index d53aef56..c9236e88 100644 --- a/setuptools/tests/test_resources.py +++ b/setuptools/tests/test_resources.py @@ -354,8 +354,28 @@ class RequirementsTests(TestCase): self.failUnless(d("foo-0.3a3.egg") in r2) self.failUnless(d("foo-0.3a5.egg") in r2) - - + def testDistributeSetuptoolsOverride(self): + # Plain setuptools or distribute mean we return distribute. + self.assertEqual( + Requirement.parse('setuptools').project_name, 'distribute') + self.assertEqual( + Requirement.parse('distribute').project_name, 'distribute') + # setuptools lower than 0.7 means distribute + self.assertEqual( + Requirement.parse('setuptools==0.6c9').project_name, 'distribute') + self.assertEqual( + Requirement.parse('setuptools==0.6c10').project_name, 'distribute') + self.assertEqual( + Requirement.parse('setuptools>=0.6').project_name, 'distribute') + self.assertEqual( + Requirement.parse('setuptools < 0.7').project_name, 'distribute') + # setuptools 0.7 and higher means setuptools. + self.assertEqual( + Requirement.parse('setuptools == 0.7').project_name, 'setuptools') + self.assertEqual( + Requirement.parse('setuptools == 0.7a1').project_name, 'setuptools') + self.assertEqual( + Requirement.parse('setuptools >= 0.7').project_name, 'setuptools') |