[Checkins] SVN: zope.app.applicationcontrol/trunk/ Bugfix: AttributeError: 'module' object has no attribute '__file__'

Marius Gedminas marius at pov.lt
Sat Dec 18 12:18:27 EST 2010


Log message for revision 118999:
  Bugfix: AttributeError: 'module' object has no attribute '__file__'
  when you used ``pip install`` instead of ``easy_install``.
  
  That's because namespace packages created by pip have no __file__.
  
  It makes no sense to look at zope.app.__file__ in the modern eggified world
  anyway; remove that legacy code and make IZopeVersion utility return
  "Meaningless".
  
  

Changed:
  U   zope.app.applicationcontrol/trunk/CHANGES.txt
  U   zope.app.applicationcontrol/trunk/src/zope/app/applicationcontrol/tests/test_zopeversion.py
  U   zope.app.applicationcontrol/trunk/src/zope/app/applicationcontrol/zopeversion.py

-=-
Modified: zope.app.applicationcontrol/trunk/CHANGES.txt
===================================================================
--- zope.app.applicationcontrol/trunk/CHANGES.txt	2010-12-18 01:26:36 UTC (rev 118998)
+++ zope.app.applicationcontrol/trunk/CHANGES.txt	2010-12-18 17:18:26 UTC (rev 118999)
@@ -5,7 +5,13 @@
 3.5.9 (unreleased)
 ------------------
 
+- Bugfix: AttributeError: 'module' object has no attribute '__file__'
+  when you used ``pip install`` instead of ``easy_install``.
 
+  The IZopeVersion utility now returns "Meaningless", since there's no
+  monolithic Zope 3 in the modern eggified world.
+
+
 3.5.8 (2010-09-17)
 ------------------
 

Modified: zope.app.applicationcontrol/trunk/src/zope/app/applicationcontrol/tests/test_zopeversion.py
===================================================================
--- zope.app.applicationcontrol/trunk/src/zope/app/applicationcontrol/tests/test_zopeversion.py	2010-12-18 01:26:36 UTC (rev 118998)
+++ zope.app.applicationcontrol/trunk/src/zope/app/applicationcontrol/tests/test_zopeversion.py	2010-12-18 17:18:26 UTC (rev 118999)
@@ -16,6 +16,7 @@
 $Id$
 """
 import os
+import sys
 import shutil
 import subprocess
 import tempfile
@@ -135,6 +136,10 @@
             # check that we don't get a 'Development/Unknown' version
             self.assert_(zv.result.startswith('Development/Revision: '))
 
+    def test_ZopeVersion_no_path_specified(self):
+        zopeVersion = ZopeVersion(None)
+        self.assertEqual(zopeVersion.result, "Meaningless")
+
 def test_suite():
     return unittest.makeSuite(Test)
 

Modified: zope.app.applicationcontrol/trunk/src/zope/app/applicationcontrol/zopeversion.py
===================================================================
--- zope.app.applicationcontrol/trunk/src/zope/app/applicationcontrol/zopeversion.py	2010-12-18 01:26:36 UTC (rev 118998)
+++ zope.app.applicationcontrol/trunk/src/zope/app/applicationcontrol/zopeversion.py	2010-12-18 17:18:26 UTC (rev 118999)
@@ -21,7 +21,6 @@
 import re
 import subprocess
 
-import zope.app
 from zope.applicationcontrol.interfaces import IZopeVersion
 from zope.interface import implements
 
@@ -34,9 +33,17 @@
 
     def __init__(self, path=None):
         if path is None:
-            path = os.path.dirname(os.path.abspath(zope.app.__file__))
-        self.path = path
-        self.result = None
+            # This used to look at zope.app.__file__.  But zope.app is a
+            # namespace package these days.
+            # easy_install makes zope.app.__file__ be something random, like
+            # /path/to/zope.app.renderer-x.y.z-py2.x.egg/zope/app/__init__.pyc
+            # pip install makes zope.app have no __file__ at all, breaking
+            # the old code.
+            self.path = None
+            self.result = "Meaningless"
+        else:
+            self.path = path
+            self.result = None
 
     def getZopeVersion(self):
         """See zope.app.applicationcontrol.interfaces.IZopeVersion"""



More information about the checkins mailing list