[Zodb-checkins] CVS: Packages/ZConfig - info.py:1.11

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


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

Modified Files:
	info.py 
Log Message:
Add some helper routines that will be used by the command-line
integration support.


=== Packages/ZConfig/info.py 1.10 => 1.11 ===
--- Packages/ZConfig/info.py:1.10	Wed Feb  5 18:23:26 2003
+++ Packages/ZConfig/info.py	Wed Feb 19 12:56:38 2003
@@ -222,7 +222,12 @@
             raise ZConfig.SchemaError("no sectiontype %s in abstracttype %s"
                                       % (`name`, `self.name`))
 
+    def hassubtype(self, name):
+        """Return true iff this type has 'name' as a concrete manifestation."""
+        return name in self._subtypes.keys()
+
     def getsubtypenames(self):
+        """Return the names of all concrete types as a sorted list."""
         L = self._subtypes.keys()
         L.sort()
         return L
@@ -363,6 +368,41 @@
         if st.isabstract():
             st = st.gettype(type)
         return st
+
+    def getinfobyname(self, name):
+        """Return the info object corresponding to the section 'name'.
+
+        Returns None if there is no matching info.  The resulting info
+        may represent either a section or a key; if it's a section, it
+        may be abstract or a multi-section.
+        """
+        if name in ("*", "+"):
+            raise ZConfig.ConfigurationError(
+                "'*' and '+' may not be used as key or section names")
+        for key, info in self._children:
+            if info.name == name:
+                return info
+        return None
+
+    def getsectionbytype(self, type):
+        L = []
+        for key, info in self._children:
+            if not info.issection():
+                continue
+            if info.sectiontype.name == type:
+                L.append(info)
+            if info.sectiontype.isabstract():
+                st = info.sectiontype
+                if st.hassubtype(type):
+                    L.append(info)
+        if len(L) == 1:
+            return L[0]
+        elif L:
+            raise ZConfig.ConfigurationError(
+                "section type not found in context")
+        else:
+            raise ZConfig.ConfigurationError(
+                "section type ambiguous in context")
 
     def isabstract(self):
         return False