[Zope-Checkins] CVS: Packages/ZConfig - loader.py:1.16 matcher.py:1.9

Fred L. Drake, Jr. fred@zope.com
Wed, 19 Feb 2003 15:35:39 -0500


Update of /cvs-repository/Packages/ZConfig
In directory cvs.zope.org:/tmp/cvs-serv7074

Modified Files:
	loader.py matcher.py 
Log Message:
Refactor:
- simplify schema matcher construction
- make a matcher responsible for creating "child" matchers; this reduces
  some of the weird data flow previously done by the loader.


=== Packages/ZConfig/loader.py 1.15 => 1.16 ===
--- Packages/ZConfig/loader.py:1.15	Wed Jan 15 14:17:41 2003
+++ Packages/ZConfig/loader.py	Wed Feb 19 15:35:38 2003
@@ -163,11 +163,9 @@
         self.schema = schema
 
     def loadResource(self, resource):
-        self.handlers = []
-        sm = ZConfig.matcher.SchemaMatcher(self.schema, self.handlers)
+        sm = ZConfig.matcher.SchemaMatcher(self.schema)
         self._parse_resource(sm, resource)
-        result = sm.finish(), CompositeHandler(self.handlers, self.schema)
-        del self.handlers
+        result = sm.finish(), CompositeHandler(sm.handlers, self.schema)
         return result
 
     # config parser support API
@@ -180,13 +178,7 @@
             raise ZConfig.ConfigurationError(
                 "concrete sections cannot match abstract section types;"
                 " found abstract type " + `type`)
-        ci = parent.type.getsectioninfo(type, name)
-        assert not ci.isabstract()
-        if not ci.isAllowedName(name):
-            raise ZConfig.ConfigurationError(
-                "%s is not an allowed name for %s sections"
-                % (`name`, `ci.sectiontype.name`))
-        return ZConfig.matcher.SectionMatcher(ci, t, name, self.handlers)
+        return parent.createChildMatcher(t, name)
 
     def endSection(self, parent, type, name, delegatename, matcher):
         assert not delegatename


=== Packages/ZConfig/matcher.py 1.8 => 1.9 ===
--- Packages/ZConfig/matcher.py:1.8	Fri Feb 14 15:24:08 2003
+++ Packages/ZConfig/matcher.py	Wed Feb 19 15:35:38 2003
@@ -28,7 +28,7 @@
         self._sectionnames = {}
         if handlers is None:
             handlers = []
-        self._handlers = handlers
+        self.handlers = handlers
 
     def __repr__(self):
         clsname = self.__class__.__name__
@@ -115,6 +115,15 @@
         else:
             self._values[i] = value
 
+    def createChildMatcher(self, type, name):
+        ci = self.type.getsectioninfo(type.name, name)
+        assert not ci.isabstract()
+        if not ci.isAllowedName(name):
+            raise ZConfig.ConfigurationError(
+                "%s is not an allowed name for %s sections"
+                % (`name`, `ci.sectiontype.name`))
+        return SectionMatcher(ci, type, name, self.handlers)
+
     def finish(self):
         """Check the constraints of the section and convert to an application
         object."""
@@ -202,7 +211,7 @@
                     v = v.convert(ci.datatype)
             values[i] = v
             if ci.handler is not None:
-                self._handlers.append((ci.handler, v))
+                self.handlers.append((ci.handler, v))
         return self.createValue(attrnames)
 
     def createValue(self, attrnames):
@@ -223,8 +232,8 @@
 
 
 class SchemaMatcher(BaseMatcher):
-    def __init__(self, info, handlers=None):
-        BaseMatcher.__init__(self, info, info, handlers)
+    def __init__(self, schema):
+        BaseMatcher.__init__(self, schema, schema, [])
 
     def finish(self):
         # Since there's no outer container to call datatype()
@@ -232,7 +241,7 @@
         v = BaseMatcher.finish(self)
         v = self.type.datatype(v)
         if self.type.handler is not None:
-            self._handlers.append((self.type.handler, v))
+            self.handlers.append((self.type.handler, v))
         return v