[Zope-Checkins] CVS: Packages/ZConfig - SchemaInfo.py:1.1.2.4 SchemaParser.py:1.1.4.3 SectionMatcher.py:1.1.2.2
Fred L. Drake, Jr.
fred@zope.com
Mon, 9 Dec 2002 12:58:13 -0500
Update of /cvs-repository/Packages/ZConfig
In directory cvs.zope.org:/tmp/cvs-serv18209
Modified Files:
Tag: zconfig-schema-devel-branch
SchemaInfo.py SchemaParser.py SectionMatcher.py
Log Message:
More internal checks; better knitting together of sections.
=== Packages/ZConfig/SchemaInfo.py 1.1.2.3 => 1.1.2.4 ===
--- Packages/ZConfig/SchemaInfo.py:1.1.2.3 Mon Dec 9 12:02:25 2002
+++ Packages/ZConfig/SchemaInfo.py Mon Dec 9 12:58:12 2002
@@ -65,34 +65,39 @@
class SectionInfo(KeyInfo):
- def __init__(self, name, datatype, minOccurs=0, maxOccurs=1,
- handler=None, keytype=None, names=None):
+ def __init__(self, name, datatype, minOccurs, maxOccurs, handler,
+ keytype, names, nametype):
assert keytype is not None
self.keytype = keytype
- if names is None:
- names = "*",
self.names = names
- self._children = []
+ self.nametype = nametype
+ self._children = [] # list of (name, info) pairs
KeyInfo.__init__(self, name, datatype, minOccurs, maxOccurs,
handler)
- def _add_child(self, thing):
- for c in self._children:
- if thing.name == c.name:
- raise ValueError("child name %s already used" % thing.name)
- self._children.append(thing)
+ def _add_child(self, name, thing):
+ for n, c in self._children:
+ if name == n:
+ raise ValueError("child name %s already used" % name)
+ self._children.append((name, thing))
def addkey(self, keyinfo):
- self._add_child(keyinfo)
+ self._add_child(keyinfo.name, keyinfo)
+
+ def addsection(self, name, sectinfo):
+ if name == "*" or name == "+":
+ raise NotImplementedError("sections without a specific name"
+ " are not yet supported")
+ self._add_child(name, sectinfo)
def getinfo(self, name):
- for c in self._children:
- if c.name == name:
+ for n, c in self._children:
+ if n == name:
return c
return None
def getchildnames(self):
- return [c.name for c in self._children]
+ return [n for (n, c) in self._children]
def issection(self):
return True
=== Packages/ZConfig/SchemaParser.py 1.1.4.2 => 1.1.4.3 ===
--- Packages/ZConfig/SchemaParser.py:1.1.4.2 Mon Dec 9 12:02:25 2002
+++ Packages/ZConfig/SchemaParser.py Mon Dec 9 12:58:12 2002
@@ -100,9 +100,18 @@
self._prefixes.append(self.get_classname(name or ""))
def start_schema(self, attrs):
- self.start_section(attrs)
- assert len(self._stack) == 1
- self._schema = self._stack[0]
+ self._prefixes.append(attrs.get("prefix", ""))
+ handler = attrs.get("handler")
+ if handler:
+ handler = self.get_classname(handler)
+ if attrs.has_key("keytype"):
+ keytype = ZConfig.DataTypes.get(attrs["keytype"])
+ else:
+ keytype = default_key_type
+ self._schema = SectionInfo(None, None, 1, 1, handler,
+ keytype, (), None)
+ self._sections = [self._schema]
+ self._stack = [self._schema]
def end_schema(self):
del self._prefixes[-1]
@@ -120,21 +129,46 @@
nametype = ZConfig.DataTypes.get(attrs["nametype"])
else:
nametype = default_name_type
+ anyname = anyornoname = False
+ names = []
+ name = None
if attrs.has_key("names"):
- names = []
for s in attrs["names"].split("|"):
s = s.strip()
- if s != "*" and s != "+":
+ if not s:
+ self.doSchemaError("empty section name not allowed")
+ if s == "*":
+ if anyname:
+ self.doSchemaError("cannot specify both '+' and '*'"
+ " naming for a section")
+ if anyornoname:
+ self.doSchemaError("can specify '*' only once")
+ anyornoname = True
+ elif s == "+":
+ if anyornoname:
+ self.doSchemaError("cannot specify both '*' and '+'"
+ " naming for a section")
+ if anyname:
+ self.doSchemaError("can specify '+' only once")
+ anyname = True
+ else:
s = nametype.convert(s)
if s == "*" or s == "+":
self.doSchemaError("nametypes may not convert to"
" '*' or '+'")
+ name = name or s
names.append(s)
else:
- names = None
+ names = "*",
maxOccurs, minOccurs, handler = self.get_common_info(attrs)
- section = SectionInfo(None, None, minOccurs, maxOccurs, handler,
- keytype, names)
+ if self._stack:
+ parent = self._stack[-1]
+ else:
+ parent = self._schema
+ section = SectionInfo(name, None, minOccurs, maxOccurs, handler,
+ keytype, names, nametype)
+ for n in names:
+ parent.addsection(n, section)
self._stack.append(section)
self._sections.append(section)
=== Packages/ZConfig/SectionMatcher.py 1.1.2.1 => 1.1.2.2 ===
--- Packages/ZConfig/SectionMatcher.py:1.1.2.1 Mon Dec 9 12:02:25 2002
+++ Packages/ZConfig/SectionMatcher.py Mon Dec 9 12:58:12 2002
@@ -18,11 +18,11 @@
self.info = info
self._values = {}
- def addKeyValue(self, key, value):
+ def addValue(self, key, value):
keyinfo = self.info.getinfo(key)
if keyinfo.issection():
if keyinfo.name:
- extra = " in %s sections" % `keyinfo.name`
+ extra = " in %s sections" % `self.info.name`
else:
extra = ""
raise ZConfig.ConfigurationError(