[z3-checkins] r13646 - in z3/zopejam/trunk/src: zcmledit zcmledit/tests zopejam

hathawsh at codespeak.net hathawsh at codespeak.net
Tue Jun 21 09:18:21 CEST 2005


Author: hathawsh
Date: Tue Jun 21 09:18:17 2005
New Revision: 13646

Modified:
   z3/zopejam/trunk/src/zcmledit/configfile.py
   z3/zopejam/trunk/src/zcmledit/exceptions.py
   z3/zopejam/trunk/src/zcmledit/include.py
   z3/zopejam/trunk/src/zcmledit/tests/test_include.py
   z3/zopejam/trunk/src/zopejam/main.py
Log:
Began recognizing directive definition directives (a subset of the meta-directives.)


Modified: z3/zopejam/trunk/src/zcmledit/configfile.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/configfile.py	(original)
+++ z3/zopejam/trunk/src/zcmledit/configfile.py	Tue Jun 21 09:18:17 2005
@@ -14,12 +14,13 @@
 from xml.parsers import expat
 from xml.sax.saxutils import quoteattr
 
-from zcmledit.exceptions import NoPackageError
+from zcmledit.exceptions import NameResolutionError, NoPackageError
 from zcmledit.include import IncludeResolver, join_package
 
 
 ZCML_CONDITION = (u"http://namespaces.zope.org/zcml", u"condition")
 XMLNS_NS = u"http://www.w3.org/2000/xmlns/" # URI for XML NS declarations
+META_NS = u"http://namespaces.zope.org/meta"
 
 
 class ConfigurationFile:
@@ -39,8 +40,8 @@
         """
         self.root = None     # A DirectiveElement
         self.output = []     # [line, DirectiveElement, line, ...]
-        self.resolvers = []  # [IncludeResolver]
-        self.metadirs = []   # [DirectiveElement]
+        self.includes = []   # [IncludeResolver]
+        self.definitions = []  # [Definition]
         self.error = None
 
         fn = self.filename
@@ -68,10 +69,10 @@
             if self.package_name:
                 self.root._setDefaultPackage(self.package_name)
             for e in self.root.flattened():
-                if e.isIncludeDirective():
-                    self.resolvers.append(IncludeResolver(e, pythonpath))
-                elif e.isMetaDirective():
-                    self.metadirs.append(e)
+                if e.isInclude():
+                    self.includes.append(IncludeResolver(e, pythonpath))
+                elif e.isDefinition():
+                    self.definitions.append(Definition(e))
         finally:
             f.close()
 
@@ -93,7 +94,7 @@
                  attr_order, extra_attrs, condition, prefix_uri):
         self.config_file = config_file
         self.parent = parent
-        self.name = name  # (ns, localname)
+        self.name = tuple(name)  # (ns, localname)
         self.data = data  # {localname: value}
         self.attr_order = attr_order  # list of (ns, localname)
         self.extra_attrs = extra_attrs  # {(ns, localname): value}
@@ -128,6 +129,13 @@
         else:
             self._is_include = False
 
+        if ns == META_NS and localname in (
+            'directive', 'groupingDirective',
+            'complexDirective', 'simpleDirective'):
+            self._is_definition = True
+        else:
+            self._is_definition = False
+
     def _setDefaultPackage(self, package_name):
         if not self._package_name:
             self._package_name = package_name
@@ -164,13 +172,13 @@
             raise NoPackageError("No absolute package has been set")
         return join_package(parent_pn, my_pn)
 
-    def isIncludeDirective(self):
+    def isInclude(self):
         """Returns True if this is an include directive"""
         return self._is_include
 
-    def isMetaDirective(self):
+    def isDefinition(self):
         """Returns True if this directive defines a directive type"""
-        return False
+        return self._is_definition
 
     def getXMLName(self, ns, localname):
         """Returns the tag or attribute for a given namespace and localname"""
@@ -420,3 +428,44 @@
         # no content
         return lines
     return [line[count:] for line in lines]
+
+
+class Definition:
+    """A directive definition"""
+
+    def __init__(self, element):
+        self.element = element
+        self.update()
+
+    def update(self):
+        self.error = None
+        self.name = self.element.data.get('name')
+        self.schema = self.element.data.get('schema')
+
+        localname = self.element.data.get('name')
+        ns = None
+        parent = self.element.parent
+        while parent is not None:
+            if parent.name == (META_NS, 'directives'):
+                # use the namespace inherited from a 'directives' directive
+                ns = parent.data['namespace']
+                break
+            parent = parent.parent
+        if ns is None:
+            ns = self.element.data.get('namespace')
+
+        self.fullname = (ns, localname)
+        if self.schema:
+            if self.schema.startswith('.'):
+                try:
+                    pkg = self.element.getAbsolutePackageName()
+                    abs_schema = join_package(pkg, self.schema)
+                except NameResolutionError, e:
+                    abs_schema = None
+                    self.error = '%s: %s' % (e.__class__.__name__, str(e))
+            else:
+                abs_schema = self.schema
+        else:
+            self.error = "Missing 'schema' attribute"
+        self.abs_schema = abs_schema
+

Modified: z3/zopejam/trunk/src/zcmledit/exceptions.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/exceptions.py	(original)
+++ z3/zopejam/trunk/src/zcmledit/exceptions.py	Tue Jun 21 09:18:17 2005
@@ -2,14 +2,14 @@
 # (c) 2005 Shane Hathaway
 # License: ZPL 2.1
 
-class PackageSpecError(Exception):
-    """Failed package specification"""
+class NameResolutionError(Exception):
+    """Failed name resolution"""
 
-class NoPackageError(PackageSpecError):
+class NoPackageError(NameResolutionError):
     """No absolute package specified for resolving relative package names"""
 
-class InvalidRelativePackageError(PackageSpecError):
-    """A relative package spec is not valid"""
+class InvalidRelativeNameError(NameResolutionError):
+    """A relative name is not valid"""
 
-class MissingPackageError(PackageSpecError):
+class MissingPackageError(NameResolutionError):
     """Could not find the specified package"""

Modified: z3/zopejam/trunk/src/zcmledit/include.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/include.py	(original)
+++ z3/zopejam/trunk/src/zcmledit/include.py	Tue Jun 21 09:18:17 2005
@@ -7,8 +7,8 @@
 from glob import glob
 import os
 
-from zcmledit.exceptions import PackageSpecError, NoPackageError
-from zcmledit.exceptions import InvalidRelativePackageError
+from zcmledit.exceptions import NameResolutionError, NoPackageError
+from zcmledit.exceptions import InvalidRelativeNameError
 from zcmledit.exceptions import MissingPackageError
 
 
@@ -67,7 +67,7 @@
                 abs_package = join_package(parent, self.package)
             else:
                 abs_package = self.package
-        except PackageSpecError, e:
+        except NameResolutionError, e:
             abs_package = None
             self.error = '%s: %s' % (e.__class__.__name__, str(e))
         self.abs_package = abs_package
@@ -79,7 +79,7 @@
             if abs_package:
                 try:
                     basepath = find_package(abs_package, pythonpath)
-                except PackageSpecError, e:
+                except NameResolutionError, e:
                     basepath = None
                     self.error = '%s: %s' % (e.__class__.__name__, str(e))
             else:
@@ -114,11 +114,11 @@
 
 
 def join_package(parent, child):
-    """Joins an absolute package name with a relative package name."""
+    """Joins an absolute package name with a relative object name."""
     if child == '.':
         return parent
     if child.endswith('.'):
-        raise PackageSpecError("Package names must not end with '.'")
+        raise NameResolutionError("Object names must not end with '.'")
     if not child.startswith('.'):
         return child
     if not parent:
@@ -130,9 +130,9 @@
         try:
             pnames.pop()
         except IndexError:
-            raise InvalidRelativePackageError(
+            raise InvalidRelativeNameError(
                 "Can't join absolute package '%s' with "
-                "relative package '%s'" % (parent, child))
+                "relative name '%s'" % (parent, child))
     return '.'.join(pnames + cnames)
 
 

Modified: z3/zopejam/trunk/src/zcmledit/tests/test_include.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/tests/test_include.py	(original)
+++ z3/zopejam/trunk/src/zcmledit/tests/test_include.py	Tue Jun 21 09:18:17 2005
@@ -9,8 +9,8 @@
 import zcmledit
 from zcmledit.configfile import ConfigurationFile
 from zcmledit.include import join_package, find_package
-from zcmledit.exceptions import PackageSpecError, NoPackageError
-from zcmledit.exceptions import InvalidRelativePackageError
+from zcmledit.exceptions import NameResolutionError, NoPackageError
+from zcmledit.exceptions import InvalidRelativeNameError
 from zcmledit.exceptions import MissingPackageError
 
 tests_dir = os.path.join(os.path.dirname(zcmledit.__file__), 'tests')
@@ -28,8 +28,8 @@
     assert join_package('', 'zope') == 'zope'
 
     py.test.raises(NoPackageError, join_package, '', '.foo')
-    py.test.raises(PackageSpecError, join_package, 'zope', '.foo.')
-    py.test.raises(InvalidRelativePackageError, join_package, 'zope', '...os')
+    py.test.raises(NameResolutionError, join_package, 'zope', '.foo.')
+    py.test.raises(InvalidRelativeNameError, join_package, 'zope', '...os')
 
 
 def test_find_package():
@@ -60,7 +60,7 @@
     fn_list.append(fn)
     cf = ConfigurationFile(fn, package_name)
     cf.load(sys.path)
-    for resolver in cf.resolvers:
+    for resolver in cf.includes:
         subpackage = resolver.getAbsolutePackageName()
         for include_fn in resolver.listFiles():
             assert include_fn not in fn_list

Modified: z3/zopejam/trunk/src/zopejam/main.py
==============================================================================
--- z3/zopejam/trunk/src/zopejam/main.py	(original)
+++ z3/zopejam/trunk/src/zopejam/main.py	Tue Jun 21 09:18:17 2005
@@ -23,9 +23,12 @@
 
 class Project:
 
-    def __init__(self, root_filename, pythonpath=None):
+    def __init__(self, root_filename, interpreter=None, pythonpath=None):
         self.root_filename = root_filename  # '/path/to/site.zcml'
         self.base = os.path.dirname(root_filename)
+        if interpreter is None:
+            interpreter = sys.executable
+        self.interpreter = interpreter
         if pythonpath is None:
             pythonpath = [os.path.join(self.base, 'src')]
         self.pythonpath = pythonpath
@@ -33,6 +36,7 @@
     def load(self):
         self.packages = {}  # {package name: [filename]}
         self.files = {}     # {filename: config_file}
+        self.definitions = {}  # {(ns, localname): Definition}
         self.root_config = ConfigurationFile(self.root_filename)
         self.files[self.root_filename] = self.root_config
 
@@ -49,7 +53,7 @@
             filenames.append(cfg.filename)
 
             # add to self.files
-            for resolver in cfg.resolvers:
+            for resolver in cfg.includes:
                 for fn in resolver.listFiles():
                     if not self.files.has_key(fn):
                         subcfg = ConfigurationFile(
@@ -57,6 +61,30 @@
                         self.files[fn] = subcfg
                         todo.append(subcfg)
 
+            # add to self.definitions
+            for dfn in cfg.definitions:
+                if self.definitions.has_key(dfn.fullname):
+                    raise RuntimeError('conflict on %s' % repr(dfn.fullname))
+                self.definitions[dfn.fullname] = dfn
+
+        if 1:
+            print len(self.definitions)
+            items = self.definitions.items()
+            items.sort()
+            for (ns, localname), dfn in items:
+                print '{%s}%s: %s' % (ns, localname, dfn.abs_schema)
+
+        if 0:
+            # profile
+            start = time.time()
+            count = 0
+            for cfg in self.files.values():
+                if cfg.root is not None:
+                    count += len(cfg.root.flattened())
+            end = time.time()
+            print '%d directives found in %f seconds' % (count, end - start)
+
+
 
 class PaletteImageList(wx.ImageList):
 
@@ -254,7 +282,7 @@
             image = images.get('zcmlfile', -1)
             child = inctree.AppendItem(parent, label, image=image, data=data)
 
-            for resolver in cfg.resolvers:
+            for resolver in cfg.includes:
                 data = wx.TreeItemData(resolver)
                 f = resolver.files or resolver.file
                 if resolver.abs_package:


More information about the z3-checkins mailing list