Opened at 2014-06-10T17:54:51Z
Closed at 2015-04-28T19:20:25Z
#2242 closed defect (fixed)
exception from parsing requirements
| Reported by: | zooko | Owned by: | daira |
|---|---|---|---|
| Priority: | normal | Milestone: | 1.10.1 |
| Component: | packaging | Version: | 1.10.0 |
| Keywords: | setuptools pkg_resources coverage | Cc: | |
| Launchpad Bug: |
Description (last modified by warner)
as reported by ambimorph on IRC:
amber@abhyasa:~/tahoe-lafs$ bin/tahoe @python-coverage run --branch --include='src/allmydata/*' @tahoe debug trial allmydata.test.test_cli
Traceback (most recent call last):
File "/usr/bin/python-coverage", line 5, in <module>
from pkg_resources import load_entry_point
File "/home/amber/tahoe-lafs/support/lib/python2.7/site-packages/setuptools-0.6c16dev4.egg/pkg_resources.py", line 2638, in <module>
working_set.add(dist)
File "/home/amber/tahoe-lafs/support/lib/python2.7/site-packages/setuptools-0.6c16dev4.egg/pkg_resources.py", line 532, in add
for thisreq in parse_requirements(thisreqstr):
File "/home/amber/tahoe-lafs/support/lib/python2.7/site-packages/setuptools-0.6c16dev4.egg/pkg_resources.py", line 2451, in parse_requirements
raise ValueError("Missing distribution spec", line)
ValueError: ('Missing distribution spec', '=', {'thisreqstr': '='})
Investigation showed the the __requires___ variable held a string ("coverage==3.4") instead of an iterable containing strings, therefore this code in our splinter of setuptools tried to parse each character of that string.
Change History (10)
comment:1 Changed at 2014-06-12T15:44:57Z by daira
comment:2 Changed at 2015-02-24T18:22:54Z by zooko
[e9e63c5e72619f4e5811cd1eed31e344db6236c8] will reveal more information in this case.
comment:3 Changed at 2015-02-25T21:16:03Z by warner
- Description modified (diff)
This came up in #2378, causing one of the buildslaves to fail the "test-from-egg" step.
comment:4 Changed at 2015-03-17T16:35:11Z by zooko
Would it be okay if I pushed this patch into trunk? I tested it manually and it worked:
diff --git a/setuptools-0.6c16dev5.egg/pkg_resources.py b/setuptools-0.6c16dev5.egg/pkg_resources.py
index a94d89f..bde9087 100644
--- a/setuptools-0.6c16dev5.egg/pkg_resources.py
+++ b/setuptools-0.6c16dev5.egg/pkg_resources.py
@@ -536,7 +536,7 @@ class WorkingSet(object):
if dist not in thisreq:
return
except ValueError, e:
- e.args = tuple(e.args + ({'thisreqstr': thisreqstr},))
+ e.args = tuple(e.args + ({'thisreqstr': thisreqstr, '__requires__': __requires__},))
raise
self.by_key[dist.key] = dist
Here's the result of running locally a manual test with this patch applied, which does indeed helpfully show me what requirements are triggering the problem:
Traceback (most recent call last):
File "/usr/local/bin/verinfo", line 5, in <module>
from pkg_resources import load_entry_point
File "/home/zooko/playground/tahoe/tahoe-lafs/support/lib/python2.7/site-packages/setuptools-0.6c16dev5.egg/pkg_resources.py", line 2650, in <module>
working_set.add(dist)
File "/home/zooko/playground/tahoe/tahoe-lafs/support/lib/python2.7/site-packages/setuptools-0.6c16dev5.egg/pkg_resources.py", line 534, in add
for thisreq in parse_requirements(thisreqstr):
File "/home/zooko/playground/tahoe/tahoe-lafs/support/lib/python2.7/site-packages/setuptools-0.6c16dev5.egg/pkg_resources.py", line 2463, in parse_requirements
raise ValueError("Missing distribution spec", line, strs)
ValueError: ('Missing distribution spec', '=', '=', {'__requires__': 'pyutil==unknown', 'thisreqstr': '='})
comment:5 Changed at 2015-03-17T16:49:07Z by warner
+1
comment:6 Changed at 2015-03-17T16:50:01Z by zooko
Here is a patch that is intended to fix this by checking whether __requires__ is a string or a list, and if it is a string then treat it as a list of one element:
diff --git a/setuptools-0.6c16dev5.egg/pkg_resources.py b/setuptools-0.6c16dev5.egg/pkg_resources.py
index a94d89f..a026b1b 100644
--- a/setuptools-0.6c16dev5.egg/pkg_resources.py
+++ b/setuptools-0.6c16dev5.egg/pkg_resources.py
@@ -529,14 +529,20 @@ class WorkingSet(object):
# If we have a __requires__ then we can already tell if this
# dist is unsatisfactory, in which case we won't add it.
if __requires__ is not None:
- for thisreqstr in __requires__:
+ assert isinstance(__requires__, (basestring, list)), repr(__requires__)
+ if isinstance(__requires__, basestring):
+ array_of__requires__ = [__requires__]
+ else:
+ array_of__requires__ = __requires__
+
+ for thisreqstr in array_of__requires__:
try:
for thisreq in parse_requirements(thisreqstr):
if thisreq.key == dist.key:
if dist not in thisreq:
return
except ValueError, e:
- e.args = tuple(e.args + ({'thisreqstr': thisreqstr},))
+ e.args = tuple(e.args + ({'thisreqstr': thisreqstr, '__requires__': __requires__},))
raise
self.by_key[dist.key] = dist
I tested this patch manually, and it changed the error shown in comment:4 to this result, which I think means it worked:
pkg_resources.require('Twisted') => [Twisted 15.0.0 (/usr/local/lib/python2.7/dist-packages/Twisted-15.0.0-py2.7-linux-x86_64.egg), zope.interface 4.0.5 (/usr/lib/python2.7/dist-packages)]
import Twisted;print Twisted =>
Traceback (most recent call last):
File "/usr/local/bin/verinfo", line 9, in <module>
load_entry_point('pyutil==unknown', 'console_scripts', 'verinfo')()
File "/usr/local/lib/python2.7/dist-packages/pyutil-unknown-py2.7.egg/pyutil/scripts/verinfo.py", line 22, in main
x = __import__(PACKNAME)
ImportError: No module named Twisted
comment:7 Changed at 2015-03-17T17:57:58Z by zooko
review from IRC:
<dstufft> zooko: that patch looks OK to me, th eonly comment I have is the assert means you'll fail on other iterables other than lists like tuples... but I don't know if it's likely you'll ever see a tuple
comment:8 Changed at 2015-03-19T23:32:06Z by daira
I would suggest using that code without the assert. The for will raise an exception in any case if array_of__requires__ is not iterable.
comment:9 Changed at 2015-04-13T12:54:41Z by daira
- Milestone changed from soon to 1.10.1
- Owner set to daira
- Status changed from new to assigned
comment:10 Changed at 2015-04-28T19:20:25Z by warner
- Resolution set to fixed
- Status changed from assigned to closed
Fixed in [575d7a2] (without the assert).

Do we want to fix this specific bug in zetuptoolz, or concentrate on migrating to a later version of setuptools (#2044)?