[Zope-Checkins] SVN: Zope/trunk/src/App/Extensions.py Cleanup, PEP8, sane variable names.
Tres Seaver
tseaver at palladion.com
Mon Apr 5 12:48:08 EDT 2010
Log message for revision 110498:
Cleanup, PEP8, sane variable names.
Changed:
U Zope/trunk/src/App/Extensions.py
-=-
Modified: Zope/trunk/src/App/Extensions.py
===================================================================
--- Zope/trunk/src/App/Extensions.py 2010-04-05 16:43:48 UTC (rev 110497)
+++ Zope/trunk/src/App/Extensions.py 2010-04-05 16:48:07 UTC (rev 110498)
@@ -10,45 +10,54 @@
# FOR A PARTICULAR PURPOSE
#
##############################################################################
-__doc__='''Standard routines for handling extensions.
+"""Standard routines for handling extensions.
Extensions currently include external methods and pluggable brains.
+"""
+import imp
+import os
-$Id$'''
-__version__='$Revision: 1.23 $'[11:-2]
-
-import os, imp
import Products
from zExceptions import NotFound
-path_split=os.path.split
-path_join=os.path.join
-exists=os.path.exists
+
class FuncCode:
def __init__(self, f, im=0):
- self.co_varnames=f.func_code.co_varnames[im:]
- self.co_argcount=f.func_code.co_argcount-im
+ self.co_varnames = f.func_code.co_varnames[im:]
+ self.co_argcount = f.func_code.co_argcount - im
- def __cmp__(self,other):
- if other is None: return 1
- try: return cmp((self.co_argcount, self.co_varnames),
- (other.co_argcount, other.co_varnames))
- except: return 1
+ def __cmp__(self, other):
+ if other is None:
+ return 1
+ try:
+ return cmp((self.co_argcount, self.co_varnames),
+ (other.co_argcount, other.co_varnames))
+ except:
+ return 1
def _getPath(home, prefix, name, suffixes):
- d=path_join(home, prefix)
- if d==prefix: raise ValueError, (
- 'The prefix, %s, should be a relative path' % prefix)
- d=path_join(d,name)
- if d==name: raise ValueError, ( # Paranoia
- 'The file name, %s, should be a simple file name' % name)
- for s in suffixes:
- if s: s="%s.%s" % (d, s)
- else: s=d
- if exists(s): return s
+ dir = os.path.join(home, prefix)
+ if dir == prefix:
+ raise ValueError('The prefix, %s, should be a relative path' % prefix)
+
+ fn = os.path.join(dir, name)
+ if fn == name:
+ # Paranoia
+ raise ValueError('The file name, %s, should be a simple file name'
+ % name)
+
+ for suffix in suffixes:
+ if suffix:
+ fqn = "%s.%s" % (fn, suffix)
+ else:
+ fqn = fn
+ if os.path.exists(fqn):
+ return fqn
+
+
def getPath(prefix, name, checkProduct=1, suffixes=('',), cfg=None):
"""Find a file in one of several relative locations
@@ -76,69 +85,69 @@
the directory containing the directory containing the software
home, and possibly product areas.
"""
- d,n = path_split(name)
- if d: raise ValueError, (
- 'The file name, %s, should be a simple file name' % name)
+ dir, ignored = os.path.split(name)
+ if dir:
+ raise ValueError('The file name, %s, should be a simple file name'
+ % name)
result = None
if checkProduct:
- l = name.find('.')
- if l > 0:
- p = name[:l]
- n = name[l + 1:]
+ dot = name.find('.')
+ if dot > 0:
+ product = name[:dot]
+ extname = name[dot + 1:]
for product_dir in Products.__path__:
- r = _getPath(product_dir, os.path.join(p, prefix), n, suffixes)
- if r is not None: result = r
+ found = _getPath(product_dir, os.path.join(product, prefix),
+ extname, suffixes)
+ if found is not None:
+ return found
- if result is None:
- if cfg is None:
- import App.config
- cfg = App.config.getConfiguration()
- locations = []
- locations.append(cfg.instancehome)
- sw = getattr(cfg, 'softwarehome', None)
- if sw is not None:
- sw = os.path.dirname(sw)
- locations.append(sw)
- for home in locations:
- r=_getPath(home, prefix, name, suffixes)
- if r is not None:
- result = r
- del locations
+ if cfg is None:
+ import App.config
+ cfg = App.config.getConfiguration()
- if result is None:
- try:
- l = name.rfind('.')
- if l > 0:
- realName = name[l + 1:]
- toplevel = name[:l]
-
- pos = toplevel.rfind('.')
- if pos > -1:
- m = __import__(toplevel, globals(), {}, toplevel[pos+1:])
+ locations = [cfg.instancehome]
+
+ softwarehome = getattr(cfg, 'softwarehome', None)
+ if softwarehome is not None:
+ zopehome = os.path.dirname(softwarehome)
+ locations.append(zopehome)
+
+ for home in locations:
+ found = _getPath(home, prefix, name, suffixes)
+ if found is not None:
+ return found
+
+ try:
+ dot = name.rfind('.')
+ if dot > 0:
+ realName = name[dot+1:]
+ toplevel = name[:dot]
+
+ rdot = toplevel.rfind('.')
+ if rdot > -1:
+ module = __import__(toplevel, globals(), {}, toplevel[rdot+1:])
+ else:
+ module = __import__(toplevel)
+
+ prefix = os.path.join(module.__path__[0], prefix, realName)
+
+ for suffix in suffixes:
+ if suffix:
+ fn = "%s.%s" % (prefix, suffix)
else:
- m = __import__(toplevel)
-
- d = os.path.join(m.__path__[0], prefix, realName)
-
- for s in suffixes:
- if s: s="%s.%s" % (d, s)
- else: s=d
- if os.path.exists(s):
- result = s
- break
- except:
- pass
-
+ fn = prefix
+ if os.path.exists(fn):
+ return fn
+ except:
+ pass
+
- return result
-
def getObject(module, name, reload=0,
# The use of a mutable default is intentional here,
# because modules is a module cache.
modules={}
):
-
# The use of modules here is not thread safe, however, there is
# no real harm in a race condition here. If two threads
# update the cache, then one will have simply worked a little
@@ -151,56 +160,60 @@
base, ext = os.path.splitext(module)
if ext in ('py', 'pyc'):
# XXX should never happen; splitext() keeps '.' with the extension
- p = base
+ prefix = base
else:
- p = module
- p=getPath('Extensions', p, suffixes=('','py','pyc'))
- if p is None:
- raise NotFound, (
- "The specified module, <em>%s</em>, couldn't be found." % module)
+ prefix = module
- __traceback_info__=p, module
+ path = getPath('Extensions', prefix, suffixes=('','py','pyc'))
+ if path is None:
+ raise NotFound("The specified module, '%s', couldn't be found."
+ % module)
- base, ext = os.path.splitext(p)
+ __traceback_info__= path, module
+
+ base, ext = os.path.splitext(path)
if ext=='.pyc':
- file = open(p, 'rb')
- binmod=imp.load_compiled('Extension', p, file)
+ file = open(path, 'rb')
+ binmod = imp.load_compiled('Extension', path, file)
file.close()
- m=binmod.__dict__
-
+ module_dict = binmod.__dict__
else:
- try: execsrc=open(p)
- except: raise NotFound, (
- "The specified module, <em>%s</em>, couldn't be opened."
- % module)
- m={}
- exec execsrc in m
+ try:
+ execsrc = open(path)
+ except:
+ raise NotFound("The specified module, '%s', "
+ "couldn't be opened." % module)
+ module_dict = {}
+ exec execsrc in module_dict
if old is not None:
- old.update(m)
+ # XXX Accretive??
+ old.update(module_dict)
else:
- modules[module] = m
+ modules[module] = module_dict
try:
- return m[name]
+ return module_dict[name]
except KeyError:
- raise NotFound, (
- "The specified object, <em>%s</em>, was not found in module, "
- "<em>%s</em>." % (name, module))
+ raise NotFound("The specified object, '%s', was not found "
+ "in module, '%s'." % (name, module))
-class NoBrains: pass
+class NoBrains:
+ pass
-def getBrain(module, class_name, reload=0):
- 'Check/load a class'
- if not module and not class_name: return NoBrains
+def getBrain(module, class_name, reload=0, modules=None):
+ """ Check/load a class from an extension.
+ """
+ if not module and not class_name:
+ return NoBrains
- try: c=getObject(module, class_name, reload)
- except KeyError, v:
- if v == class_name: raise ValueError, (
- 'The class, %s, is not defined in file, %s' % (class_name, module))
+ if modules is None:
+ c=getObject(module, class_name, reload)
+ else:
+ c=getObject(module, class_name, reload, modules=modules)
- if not hasattr(c,'__bases__'): raise ValueError, (
- '%s, is not a class' % class_name)
+ if getattr(c, '__bases__', None) is None:
+ raise ValueError('%s, is not a class' % class_name)
return c
More information about the Zope-Checkins
mailing list