def bits_type(self, tchain, p_elem): elem = SchemaNode("list", p_elem) zom = SchemaNode("zeroOrMore", elem) choi = SchemaNode.choice(zom, occur=2) for bit in tchain[0].search("bit"): optel = SchemaNode("optional", choi) SchemaNode("value", optel, bit.arg)
def bits_type(self, tchain, p_elem): elem = SchemaNode("list", p_elem) zom = SchemaNode("zeroOrMore", elem) choi = SchemaNode.choice(zom, occur=2) for bit in tchain[0].search("bit"): optel = SchemaNode("optional", choi) SchemaNode("value", optel, bit.arg)
def type_with_ranges(self, tchain, p_elem, rangekw, gen_data): """Handle types with 'range' or 'length' restrictions.""" ranges = self.get_ranges(tchain, rangekw) if not ranges: return p_elem.subnode(gen_data()) if len(ranges) > 1: p_elem = SchemaNode.choice(p_elem) p_elem.occur = 2 for r in ranges: d_elem = gen_data() for p in self.range_params(r, rangekw): d_elem.subnode(p) p_elem.subnode(d_elem)
def type_with_ranges(self, tchain, p_elem, rangekw, gen_data): """Handle types with 'range' or 'length' restrictions.""" ranges = self.get_ranges(tchain, rangekw) if not ranges: return p_elem.subnode(gen_data()) if len(ranges) > 1: p_elem = SchemaNode.choice(p_elem) p_elem.occur = 2 for r in ranges: d_elem = gen_data() for p in self.range_params(r, rangekw): d_elem.subnode(p) p_elem.subnode(d_elem)
def choice_stmt(self, stmt, p_elem, pset): chelem = SchemaNode.choice(p_elem) plist, new_pset = self.select_patch(pset, stmt.arg) if self.is_mandatory(stmt, plist): chelem.occur = 2 self.propagate_occur(chelem.parent, 2) else: defv = self.get_default(stmt, plist) if defv: chelem.default_case = defv else: chelem.occur = 3 for s in plist: self.handle_stmt(s, chelem, new_pset) self.handle_substmts(stmt, chelem, new_pset)
def add_identity(self, ident): """Add `id_stmt` and all derivates to `self.identities`. `ident` must be a fully qualified identity name. """ def trname(iname): return "__" + iname.replace(":","_") if ident in self.identities: return parent = SchemaNode.define(trname(ident)) self.identities[ident] = parent if self.identity_deps[ident]: parent = SchemaNode.choice(parent, occur=2) SchemaNode("value", parent, ident).attr["type"]="QName" for i in self.identity_deps[ident]: SchemaNode("ref", parent).attr["name"]=trname(i) self.add_identity(i)
def choice_stmt(self, stmt, p_elem, pset): chelem = SchemaNode.choice(p_elem) plist, new_pset = self.select_patch(pset, stmt.arg) if self.is_mandatory(stmt, plist): chelem.occur = 2 self.propagate_occur(chelem.parent, 2) else: defv = self.get_default(stmt, plist) if defv: chelem.default_case = defv else: chelem.occur = 3 for s in plist: self.handle_stmt(s, chelem, new_pset) self.handle_substmts(stmt, chelem, new_pset)
def add_identity(self, ident): """Add `id_stmt` and all derivates to `self.identities`. `ident` must be a fully qualified identity name. """ def trname(iname): return "__" + iname.replace(":", "_") if ident in self.identities: return parent = SchemaNode.define(trname(ident)) self.identities[ident] = parent if self.identity_deps[ident]: parent = SchemaNode.choice(parent, occur=2) SchemaNode("value", parent, ident).attr["type"] = "QName" for i in self.identity_deps[ident]: SchemaNode("ref", parent).attr["name"] = trname(i) self.add_identity(i)
def type_with_ranges(self, tchain, p_elem, rangekw, gen_data): """Handle types with 'range' or 'length' restrictions. `tchain` is the chain of type definitions from which the ranges may need to be extracted. `rangekw` is the statement keyword determining the range type (either 'range' or 'length'). `gen_data` is a function that generates the output schema node (a RELAX NG <data> pattern). """ ranges = self.get_ranges(tchain, rangekw) if not ranges: return p_elem.subnode(gen_data()) if len(ranges) > 1: p_elem = SchemaNode.choice(p_elem) p_elem.occur = 2 for r in ranges: d_elem = gen_data() for p in self.range_params(r, rangekw): d_elem.subnode(p) p_elem.subnode(d_elem)
def type_with_ranges(self, tchain, p_elem, rangekw, gen_data): """Handle types with 'range' or 'length' restrictions. `tchain` is the chain of type definitions from which the ranges may need to be extracted. `rangekw` is the statement keyword determining the range type (either 'range' or 'length'). `gen_data` is a function that generates the output schema node (a RELAX NG <data> pattern). """ ranges = self.get_ranges(tchain, rangekw) if not ranges: return p_elem.subnode(gen_data()) if len(ranges) > 1: p_elem = SchemaNode.choice(p_elem) p_elem.occur = 2 for r in ranges: d_elem = gen_data() for p in self.range_params(r, rangekw): d_elem.subnode(p) p_elem.subnode(d_elem)
def choice_stmt(self, stmt, p_elem, pset): chelem = SchemaNode.choice(p_elem) chelem.attr["nma:name"] = stmt.arg refd, augs, new_pset = self.process_patches(pset, stmt, chelem) left = self.lookup_expand(stmt, new_pset.keys()) for a in augs: left = self.lookup_expand(a, left) if refd["mandatory"] or stmt.search_one("mandatory", "true"): chelem.attr["nma:mandatory"] = "true" self.propagate_occur(chelem, 2) else: defv = self.get_default(stmt, refd) if defv is not None: chelem.default_case = defv else: chelem.occur = 3 self.handle_substmts(stmt, chelem, new_pset) self.apply_augments(augs, chelem, new_pset) if not chelem.children: chelem.subnode(SchemaNode("empty"))
def choice_stmt(self, stmt, p_elem, pset): chelem = SchemaNode.choice(p_elem) chelem.attr["nma:name"] = stmt.arg refd, augs, new_pset = self.process_patches(pset, stmt, chelem) left = self.lookup_expand(stmt, new_pset.keys()) for a in augs: left = self.lookup_expand(a, left) if refd["mandatory"] or stmt.search_one("mandatory", "true"): chelem.attr["nma:mandatory"] = "true" self.propagate_occur(chelem, 2) else: defv = self.get_default(stmt, refd) if defv is not None: chelem.default_case = defv else: chelem.occur = 3 self.handle_substmts(stmt, chelem, new_pset) self.apply_augments(augs, chelem, new_pset) if not chelem.children: chelem.subnode(SchemaNode("empty"))
def choice_type(self, tchain, p_elem): """Handle ``enumeration`` and ``union`` types.""" elem = SchemaNode.choice(p_elem, occur=2) self.handle_substmts(tchain[0], elem)
def boolean_type(self, tchain, p_elem): elem = SchemaNode.choice(p_elem, occur=2) SchemaNode("value", elem, "true") SchemaNode("value", elem, "false")
def choice_type(self, tchain, p_elem): """Handle ``enumeration`` and ``union`` types.""" elem = SchemaNode.choice(p_elem, occur=2) self.handle_substmts(tchain[0], elem)
def boolean_type(self, tchain, p_elem): elem = SchemaNode.choice(p_elem, occur=2) SchemaNode("value", elem, "true") SchemaNode("value", elem, "false")