lbessard@151: #!/usr/bin/env python
lbessard@151: # -*- coding: utf-8 -*-
lbessard@151:
lbessard@151: #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
lbessard@151: #based on the plcopen standard.
lbessard@151: #
lbessard@151: #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
lbessard@151: #
lbessard@151: #See COPYING file for copyrights details.
lbessard@151: #
lbessard@151: #This library is free software; you can redistribute it and/or
lbessard@151: #modify it under the terms of the GNU General Public
lbessard@151: #License as published by the Free Software Foundation; either
lbessard@151: #version 2.1 of the License, or (at your option) any later version.
lbessard@151: #
lbessard@151: #This library is distributed in the hope that it will be useful,
lbessard@151: #but WITHOUT ANY WARRANTY; without even the implied warranty of
lbessard@151: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
lbessard@151: #General Public License for more details.
lbessard@151: #
lbessard@151: #You should have received a copy of the GNU General Public
lbessard@151: #License along with this library; if not, write to the Free Software
lbessard@151: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
lbessard@151:
lbessard@151: from xml.dom import minidom
lbessard@151: from types import *
lbessard@151: import re, datetime
lbessard@151: from xmlclass import *
lbessard@151:
lbessard@151: def GenerateDictFacets(facets):
lbessard@151: return dict([(name, (None, False)) for name in facets])
lbessard@151:
lbessard@151: def GenerateSimpleTypeXMLText(function):
lbessard@151: def generateXMLTextMethod(value, name = None, indent = 0):
lbessard@151: text = ""
lbessard@151: if name is not None:
lbessard@151: ind1, ind2 = getIndent(indent, name)
lbessard@151: text += ind1 + "<%s>"%name
lbessard@151: text += function(value)
lbessard@151: if name is not None:
lbessard@151: text += "%s>\n"%name
lbessard@151: return text
lbessard@151: return generateXMLTextMethod
lbessard@151:
lbessard@151: def GenerateFloatXMLText(extra_values = []):
lbessard@151: def generateXMLTextMethod(value, name = None, indent = 0):
lbessard@151: text = ""
lbessard@151: if name is not None:
lbessard@151: ind1, ind2 = getIndent(indent, name)
lbessard@151: text += ind1 + "<%s>"%name
lbessard@151: if value in extra_values or value % 1 != 0 or isinstance(value, IntType):
lbessard@151: text += str(value)
lbessard@151: else:
lbessard@151: text += "%.0f"%value
lbessard@151: if name is not None:
lbessard@151: text += "%s>\n"%name
lbessard@151: return text
lbessard@151: return generateXMLTextMethod
lbessard@151:
lbessard@151: DEFAULT_FACETS = GenerateDictFacets(["pattern", "whiteSpace", "enumeration"])
lbessard@151: NUMBER_FACETS = GenerateDictFacets(DEFAULT_FACETS.keys() + ["maxInclusive", "maxExclusive", "minInclusive", "minExclusive"])
lbessard@151: DECIMAL_FACETS = GenerateDictFacets(NUMBER_FACETS.keys() + ["totalDigits", "fractionDigits"])
lbessard@151: STRING_FACETS = GenerateDictFacets(DEFAULT_FACETS.keys() + ["length", "minLength", "maxLength"])
lbessard@151:
lbessard@151: ALL_FACETS = ["pattern", "whiteSpace", "enumeration", "maxInclusive",
lbessard@151: "maxExclusive", "minInclusive", "minExclusive", "totalDigits",
lbessard@151: "fractionDigits", "length", "minLength", "maxLength"]
lbessard@151:
lbessard@151:
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151: # Structure reducing functions
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151:
lbessard@151:
lbessard@151: # Documentation elements
lbessard@151:
lbessard@151: def ReduceAppInfo(factory, attributes, elements):
lbessard@151: return {"type" : "appinfo", "source" : attributes.get("source", None),
lbessard@151: "content" : "\n".join(elements)}
lbessard@151:
lbessard@151:
lbessard@151: def ReduceDocumentation(factory, attributes, elements):
lbessard@151: return {"type" : "documentation", "source" : attributes.get("source", None),
lbessard@151: "language" : attributes.get("lang", "any"), "content" : "\n".join(elements)}
lbessard@151:
lbessard@151:
lbessard@151: def ReduceAnnotation(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: annotation = {"type" : "annotation", "appinfo" : [], "documentation" : {}}
lbessard@151: for child in children:
lbessard@151: if child["type"] == "appinfo":
lbessard@151: annotation["appinfo"].append((child["source"], child["content"]))
lbessard@151: elif child["type"] == "documentation":
lbessard@151: if child["source"] is not None:
lbessard@151: text = "(source : %(source)s):\n%(content)s\n\n"%child
lbessard@151: else:
lbessard@151: text = child["content"] + "\n\n"
lbessard@151: if child["language"] not in annotation["documentation"]:
lbessard@151: annotation["documentation"] = text
lbessard@151: else:
lbessard@151: annotation["documentation"] += text
lbessard@151: return annotation
lbessard@151:
lbessard@151: # Simple type elements
lbessard@151:
lbessard@151: def GenerateFacetReducing(facetname, canbefixed):
lbessard@151: def ReduceFacet(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: if "value" in attributes:
lbessard@151: facet = {"type" : facetname, "value" : attributes["value"], "doc" : annotations}
lbessard@151: if canbefixed:
lbessard@151: facet["fixed"] = attributes.get("fixed", False)
lbessard@151: return facet
lbessard@151: raise ValueError, "A value must be defined for the \"%s\" facet!"%facetname
lbessard@151: return ReduceFacet
lbessard@151:
lbessard@151:
lbessard@151: def ReduceList(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: list = {"type" : "list", "itemType" : attributes.get("itemType", None), "doc" : annotations}
lbessard@151:
lbessard@151: if len(children) > 0 and children[0]["type"] == SIMPLETYPE:
lbessard@151: if list["itemType"] is None:
lbessard@151: list["itemType"] = children[0]
lbessard@151: else:
lbessard@151: raise ValueError, "Only one base type can be defined for restriction!"
lbessard@151: if list["itemType"] is None:
lbessard@151: raise ValueError, "No base type has been defined for list!"
lbessard@151: return list
lbessard@151:
lbessard@151:
lbessard@151: def ReduceUnion(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: union = {"type" : "union", "memberTypes" : attributes.get("memberTypes", []), "doc" : annotations}
lbessard@151:
lbessard@151: if child in children:
lbessard@151: if child["type"] == SIMPLETYPE:
lbessard@151: union["memberTypes"] = child
lbessard@151: if len(union["memberTypes"]) == 0:
lbessard@151: raise ValueError, "No base type has been defined for union!"
lbessard@151: return list
lbessard@151:
lbessard@151:
lbessard@151: def ReduceSimpleType(factory, attributes, elements):
lbessard@151: # Reduce all the simple type children
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: typeinfos = children[0]
lbessard@151:
lbessard@151: # Initialize type informations
lbessard@151: facets = {}
lbessard@151: simpleType = {"type" : SIMPLETYPE, "final" : attributes.get("final", []), "doc" : annotations}
lbessard@151: if "name" in attributes:
lbessard@151: simpleType["name"] = attributes["name"]
lbessard@151:
lbessard@151: if typeinfos["type"] == "restriction":
lbessard@151: # Search for base type definition
lbessard@151: if isinstance(typeinfos["base"], (StringType, UnicodeType)):
lbessard@151: basetypeinfos = factory.FindSchemaElement(typeinfos["base"], SIMPLETYPE)
lbessard@151: if basetypeinfos is None:
lbessard@151: raise "\"%s\" isn't defined!"%typeinfos["base"]
lbessard@151: else:
lbessard@151: basetypeinfos = typeinfos["base"]
lbessard@151:
lbessard@151: # Check that base type is a simple type
lbessard@151: if basetypeinfos["type"] != SIMPLETYPE:
lbessard@151: raise ValueError, "Base type given isn't a simpleType!"
lbessard@151:
lbessard@151: typeinfos["basename"] = basetypeinfos["basename"]
lbessard@151:
lbessard@151: # Check that derivation is allowed
lbessard@151: if "final" in basetypeinfos:
lbessard@151: if "#all" in basetypeinfos["final"]:
lbessard@151: raise ValueError, "Base type can't be derivated!"
lbessard@151: if "restriction" in basetypeinfos["final"]:
lbessard@151: raise ValueError, "Base type can't be derivated by restriction!"
lbessard@151:
lbessard@151: # Extract simple type facets
lbessard@151: for facet in typeinfos["facets"]:
lbessard@151: facettype = facet["type"]
lbessard@151: if facettype not in basetypeinfos["facets"]:
lbessard@151: raise ValueError, "\"%s\" facet can't be defined for \"%s\" type!"%(facettype, type)
lbessard@151: elif basetypeinfos["facets"][facettype][1]:
lbessard@151: raise ValueError, "\"%s\" facet is fixed on base type!"%facettype
lbessard@151: value = facet["value"]
lbessard@151: basevalue = basetypeinfos["facets"][facettype][0]
lbessard@151: if facettype == "enumeration":
lbessard@151: value = basetypeinfos["extract"](value, False)
lbessard@151: if len(facets) == 0:
lbessard@151: facets["enumeration"] = ([value], False)
lbessard@151: continue
lbessard@151: elif facets.keys() == ["enumeration"]:
lbessard@151: facets["enumeration"][0].append(value)
lbessard@151: continue
lbessard@151: else:
lbessard@151: raise ValueError, "\"enumeration\" facet can't be defined with another facet type!"
lbessard@151: elif "enumeration" in facets:
lbessard@151: raise ValueError, "\"enumeration\" facet can't be defined with another facet type!"
lbessard@151: elif facettype in facets:
lbessard@151: raise ValueError, "\"%s\" facet can't be defined two times!"%facettype
lbessard@151: elif facettype == "length":
lbessard@151: if "minLength" in facets:
lbessard@151: raise ValueError, "\"length\" and \"minLength\" facets can't be defined at the same time!"
lbessard@151: if "maxLength" in facets:
lbessard@151: raise ValueError, "\"length\" and \"maxLength\" facets can't be defined at the same time!"
lbessard@151: try:
lbessard@151: value = int(value)
lbessard@151: except:
lbessard@151: raise ValueError, "\"length\" must be an integer!"
lbessard@151: if value < 0:
lbessard@151: raise ValueError, "\"length\" can't be negative!"
lbessard@151: elif basevalue is not None and basevalue != value:
lbessard@151: raise ValueError, "\"length\" can't be different from \"length\" defined in base type!"
lbessard@151: elif facettype == "minLength":
lbessard@151: if "length" in facets:
lbessard@151: raise ValueError, "\"length\" and \"minLength\" facets can't be defined at the same time!"
lbessard@151: try:
lbessard@151: value = int(value)
lbessard@151: except:
lbessard@151: raise ValueError, "\"minLength\" must be an integer!"
lbessard@151: if value < 0:
lbessard@151: raise ValueError, "\"minLength\" can't be negative!"
lbessard@151: elif "maxLength" in facets and value > facets["maxLength"]:
lbessard@151: raise ValueError, "\"minLength\" must be lesser than or equal to \"maxLength\"!"
lbessard@151: elif basevalue is not None and basevalue < value:
lbessard@151: raise ValueError, "\"minLength\" can't be lesser than \"minLength\" defined in base type!"
lbessard@151: elif facettype == "maxLength":
lbessard@151: if "length" in facets:
lbessard@151: raise ValueError, "\"length\" and \"maxLength\" facets can't be defined at the same time!"
lbessard@151: try:
lbessard@151: value = int(value)
lbessard@151: except:
lbessard@151: raise ValueError, "\"maxLength\" must be an integer!"
lbessard@151: if value < 0:
lbessard@151: raise ValueError, "\"maxLength\" can't be negative!"
lbessard@151: elif "minLength" in facets and value < facets["minLength"]:
lbessard@151: raise ValueError, "\"minLength\" must be lesser than or equal to \"maxLength\"!"
lbessard@151: elif basevalue is not None and basevalue > value:
lbessard@151: raise ValueError, "\"maxLength\" can't be greater than \"maxLength\" defined in base type!"
lbessard@151: elif facettype == "minInclusive":
lbessard@151: if "minExclusive" in facets:
lbessard@151: raise ValueError, "\"minExclusive\" and \"minInclusive\" facets can't be defined at the same time!"
lbessard@151: value = basetypeinfos["extract"](facet["value"], False)
lbessard@151: if "maxInclusive" in facets and value > facets["maxInclusive"][0]:
lbessard@151: raise ValueError, "\"minInclusive\" must be lesser than or equal to \"maxInclusive\"!"
lbessard@151: elif "maxExclusive" in facets and value >= facets["maxExclusive"][0]:
lbessard@151: raise ValueError, "\"minInclusive\" must be lesser than \"maxExclusive\"!"
lbessard@151: elif facettype == "minExclusive":
lbessard@151: if "minInclusive" in facets:
lbessard@151: raise ValueError, "\"minExclusive\" and \"minInclusive\" facets can't be defined at the same time!"
lbessard@151: value = basetypeinfos["extract"](facet["value"], False)
lbessard@151: if "maxInclusive" in facets and value >= facets["maxInclusive"][0]:
lbessard@151: raise ValueError, "\"minExclusive\" must be lesser than \"maxInclusive\"!"
lbessard@151: elif "maxExclusive" in facets and value >= facets["maxExclusive"][0]:
lbessard@151: raise ValueError, "\"minExclusive\" must be lesser than \"maxExclusive\"!"
lbessard@151: elif facettype == "maxInclusive":
lbessard@151: if "maxExclusive" in facets:
lbessard@151: raise ValueError, "\"maxExclusive\" and \"maxInclusive\" facets can't be defined at the same time!"
lbessard@151: value = basetypeinfos["extract"](facet["value"], False)
lbessard@151: if "minInclusive" in facets and value < facets["minInclusive"][0]:
lbessard@151: raise ValueError, "\"minInclusive\" must be lesser than or equal to \"maxInclusive\"!"
lbessard@151: elif "minExclusive" in facets and value <= facets["minExclusive"][0]:
lbessard@151: raise ValueError, "\"minExclusive\" must be lesser than \"maxInclusive\"!"
lbessard@151: elif facettype == "maxExclusive":
lbessard@151: if "maxInclusive" in facets:
lbessard@151: raise ValueError, "\"maxExclusive\" and \"maxInclusive\" facets can't be defined at the same time!"
lbessard@151: value = basetypeinfos["extract"](facet["value"], False)
lbessard@151: if "minInclusive" in facets and value <= facets["minInclusive"][0]:
lbessard@151: raise ValueError, "\"minInclusive\" must be lesser than \"maxExclusive\"!"
lbessard@151: elif "minExclusive" in facets and value <= facets["minExclusive"][0]:
lbessard@151: raise ValueError, "\"minExclusive\" must be lesser than \"maxExclusive\"!"
lbessard@151: elif facettype == "whiteSpace":
lbessard@151: if basevalue == "collapse" and value in ["preserve", "replace"] or basevalue == "replace" and value == "preserve":
lbessard@151: raise ValueError, "\"whiteSpace\" is incompatible with \"whiteSpace\" defined in base type!"
lbessard@151: elif facettype == "totalDigits":
lbessard@151: if "fractionDigits" in facets and value <= facets["fractionDigits"][0]:
lbessard@151: raise ValueError, "\"fractionDigits\" must be lesser than or equal to \"totalDigits\"!"
lbessard@151: elif basevalue is not None and value > basevalue:
lbessard@151: raise ValueError, "\"totalDigits\" can't be greater than \"totalDigits\" defined in base type!"
lbessard@151: elif facettype == "fractionDigits":
lbessard@151: if "totalDigits" in facets and value <= facets["totalDigits"][0]:
lbessard@151: raise ValueError, "\"fractionDigits\" must be lesser than or equal to \"totalDigits\"!"
lbessard@151: elif basevalue is not None and value > basevalue:
lbessard@151: raise ValueError, "\"totalDigits\" can't be greater than \"totalDigits\" defined in base type!"
lbessard@151: facets[facettype] = (value, facet.get("fixed", False))
lbessard@151:
lbessard@151: # Report not redefined facet from base type to new created type
lbessard@151: for facettype, facetvalue in basetypeinfos["facets"].items():
lbessard@151: if facettype not in facets:
lbessard@151: facets[facettype] = facetvalue
lbessard@151:
lbessard@151: # Generate extract value for new created type
lbessard@151: def ExtractSimpleTypeValue(attr, extract = True):
lbessard@151: value = basetypeinfos["extract"](attr, extract)
lbessard@151: for facetname, (facetvalue, facetfixed) in facets.items():
lbessard@151: if facetvalue is not None:
lbessard@151: if facetname == "enumeration" and value not in facetvalue:
lbessard@151: raise ValueError, "\"%s\" not in enumerated values"%value
lbessard@151: elif facetname == "length" and len(value) != facetvalue:
lbessard@151: raise ValueError, "value must have a length of %d"%facetvalue
lbessard@151: elif facetname == "minLength" and len(value) < facetvalue:
lbessard@151: raise ValueError, "value must have a length of %d at least"%facetvalue
lbessard@151: elif facetname == "maxLength" and len(value) > facetvalue:
lbessard@151: raise ValueError, "value must have a length of %d at most"%facetvalue
lbessard@151: elif facetname == "minInclusive" and value < facetvalue:
lbessard@151: raise ValueError, "value must be greater than or equal to %s"%str(facetvalue)
lbessard@151: elif facetname == "minExclusive" and value <= facetvalue:
lbessard@151: raise ValueError, "value must be greater than %s"%str(facetvalue)
lbessard@151: elif facetname == "maxInclusive" and value > facetvalue:
lbessard@151: raise ValueError, "value must be lesser than or equal to %s"%str(facetvalue)
lbessard@151: elif facetname == "maxExclusive" and value >= facetvalue:
lbessard@151: raise ValueError, "value must be lesser than %s"%str(facetvalue)
lbessard@151: elif facetname == "pattern":
lbessard@151: model = re.compile("(?:%s)?$"%facetvalue)
lbessard@151: result = model.match(value)
lbessard@151: if result is None:
lbessard@151: raise ValueError, "value doesn't follow the pattern %s"%facetvalue
lbessard@151: elif facetname == "whiteSpace":
lbessard@151: if facetvalue == "replace":
lbessard@151: value = GetNormalizedString(value, False)
lbessard@151: elif facetvalue == "collapse":
lbessard@151: value = GetToken(value, False)
lbessard@151: return value
lbessard@151:
lbessard@151: def CheckSimpleTypeValue(value):
lbessard@151: for facetname, (facetvalue, facetfixed) in facets.items():
lbessard@151: if facetvalue is not None:
lbessard@151: if facetname == "enumeration" and value not in facetvalue:
lbessard@151: return False
lbessard@151: elif facetname == "length" and len(value) != facetvalue:
lbessard@151: return False
lbessard@151: elif facetname == "minLength" and len(value) < facetvalue:
lbessard@151: return False
lbessard@151: elif facetname == "maxLength" and len(value) > facetvalue:
lbessard@151: return False
lbessard@151: elif facetname == "minInclusive" and value < facetvalue:
lbessard@151: return False
lbessard@151: elif facetname == "minExclusive" and value <= facetvalue:
lbessard@151: return False
lbessard@151: elif facetname == "maxInclusive" and value > facetvalue:
lbessard@151: return False
lbessard@151: elif facetname == "maxExclusive" and value >= facetvalue:
lbessard@151: return False
lbessard@151: elif facetname == "pattern":
lbessard@151: model = re.compile("(?:%s)?$"%facetvalue)
lbessard@151: result = model.match(value)
lbessard@151: if result is None:
lbessard@151: raise ValueError, "value doesn't follow the pattern %s"%facetvalue
lbessard@151: return True
lbessard@151:
lbessard@151: def SimpleTypeInitialValue():
lbessard@151: for facetname, (facetvalue, facetfixed) in facets.items():
lbessard@151: if facetvalue is not None:
lbessard@151: if facetname == "enumeration":
lbessard@151: return facetvalue[0]
lbessard@151: elif facetname == "length":
lbessard@151: return " "*facetvalue
lbessard@151: elif facetname == "minLength":
lbessard@151: return " "*minLength
lbessard@151: elif facetname == "minInclusive" and facetvalue > 0:
lbessard@151: return facetvalue
lbessard@151: elif facetname == "minExclusive" and facetvalue >= 0:
lbessard@151: return facetvalue + 1
lbessard@151: elif facetname == "maxInclusive" and facetvalue < 0:
lbessard@151: return facetvalue
lbessard@151: elif facetname == "maxExclusive" and facetvalue <= 0:
lbessard@151: return facetvalue - 1
lbessard@151: return basetypeinfos["initial"]()
lbessard@151:
lbessard@151: GenerateSimpleType = basetypeinfos["generate"]
lbessard@151:
lbessard@151: elif typeinfos["type"] == "list":
lbessard@151: # Search for item type definition
lbessard@151: if isinstance(typeinfos["itemType"], (StringType, UnicodeType)):
lbessard@151: itemtypeinfos = factory.FindSchemaElement(typeinfos["itemType"], SIMPLETYPE)
lbessard@151: if itemtypeinfos is None:
lbessard@151: raise "\"%s\" isn't defined!"%typeinfos["itemType"]
lbessard@151: else:
lbessard@151: itemtypeinfos = typeinfos["itemType"]
lbessard@151:
lbessard@151: # Check that item type is a simple type
lbessard@151: if itemtypeinfos["type"] != SIMPLETYPE:
lbessard@151: raise ValueError, "Item type given isn't a simpleType!"
lbessard@151:
lbessard@151: # Check that derivation is allowed
lbessard@151: if "#all" in itemtypeinfos["final"]:
lbessard@151: raise ValueError, "Item type can't be derivated!"
lbessard@151: if "list" in itemtypeinfos["final"]:
lbessard@151: raise ValueError, "Item type can't be derivated by list!"
lbessard@151:
lbessard@151: # Generate extract value for new created type
lbessard@151: def ExtractSimpleTypeValue(attr, extract = True):
lbessard@151: values = []
lbessard@151: for value in GetToken(attr, extract).split(" "):
lbessard@151: values.append(itemtypeinfos["extract"](value, False))
lbessard@151: return values
lbessard@151:
lbessard@151: def CheckSimpleTypeValue(value):
lbessard@151: for value in GetToken(attr, extract).split(" "):
lbessard@151: result = itemtypeinfos["check"](value)
lbessard@151: if not result:
lbessard@151: return result
lbessard@151: return True
lbessard@151:
lbessard@151: SimpleTypeInitialValue = lambda: ""
lbessard@151:
lbessard@151: GenerateSimpleType = GenerateSimpleTypeXMLText(lambda x : " ".join(map(itemtypeinfos, values)))
lbessard@151:
lbessard@151: facets = GenerateDictFacets(["length", "maxLength", "minLength", "enumeration", "pattern"])
lbessard@151: facet["whiteSpace"] = ("collapse", False)
lbessard@151:
lbessard@151: elif typeinfos["type"] == "union":
lbessard@151: # Search for member types definition
lbessard@151: membertypesinfos = []
lbessard@151: for membertype in typeinfos["memberTypes"]:
lbessard@151: if isinstance(membertype, (StringType, UnicodeType)):
lbessard@151: infos = factory.FindSchemaElement(typeinfos["memberTypes"], SIMPLETYPE)
lbessard@151: if infos is None:
lbessard@151: raise "\"%s\" isn't defined!"%typeinfos["itemType"]
lbessard@151: else:
lbessard@151: infos = membertype
lbessard@151:
lbessard@151: # Check that member type is a simple type
lbessard@151: if infos["type"] != SIMPLETYPE:
lbessard@151: raise ValueError, "Member type given isn't a simpleType!"
lbessard@151:
lbessard@151: # Check that derivation is allowed
lbessard@151: if "#all" in infos["final"]:
lbessard@151: raise ValueError, "Item type can't be derivated!"
lbessard@151: if "union" in infos["final"]:
lbessard@151: raise ValueError, "Member type can't be derivated by union!"
lbessard@151:
lbessard@151: membertypesinfos.append(infos)
lbessard@151:
lbessard@151: # Generate extract value for new created type
lbessard@151: def ExtractSimpleTypeValue(attr, extract = True):
lbessard@151: if extract:
lbessard@151: value = GetAttributeValue(attr)
lbessard@151: else:
lbessard@151: value = attr
lbessard@151: for infos in membertypesinfos:
lbessard@151: try:
lbessard@151: return infos["extract"](attr, False)
lbessard@151: except:
lbessard@151: pass
lbessard@151: raise ValueError, "\"%s\" isn't valid for type defined for union!"
lbessard@151:
lbessard@151: def CheckSimpleTypeValue(value):
lbessard@151: for infos in membertypesinfos:
lbessard@151: result = infos["check"](value)
lbessard@151: if result:
lbessard@151: return result
lbessard@151: return False
lbessard@151:
lbessard@151: SimpleTypeInitialValue = membertypesinfos[0]["initial"]
lbessard@151:
lbessard@151: def GenerateSimpleTypeFunction(value):
lbessard@151: if isinstance(value, BooleanType):
lbessard@151: return {True : "true", False : "false"}[value]
lbessard@151: else:
lbessard@151: return str(value)
lbessard@151: GenerateSimpleType = GenerateSimpleTypeXMLText(GenerateSimpleTypeFunction)
lbessard@151:
lbessard@151: facets = GenerateDictFacets(["pattern", "enumeration"])
lbessard@151:
lbessard@151: simpleType["facets"] = facets
lbessard@151: simpleType["extract"] = ExtractSimpleTypeValue
lbessard@151: simpleType["initial"] = SimpleTypeInitialValue
lbessard@151: simpleType["check"] = CheckSimpleTypeValue
lbessard@151: simpleType["generate"] = GenerateSimpleType
lbessard@151: return simpleType
lbessard@151:
lbessard@151:
lbessard@151: # Complex type
lbessard@151:
lbessard@151: def ExtractAttributes(factory, elements, base = None):
lbessard@151: if base is not None:
lbessard@151: basetypeinfos = factory.FindSchemaElement(base, COMPLEXTYPE)
lbessard@151: if isinstance(basetypeinfos, (UnicodeType, StringType)):
lbessard@151: attrnames = {}
lbessard@151: else:
lbessard@151: attrnames = dict(map(lambda x:(x["name"], True), basetypeinfos["attributes"]))
lbessard@151: else:
lbessard@151: attrnames = {}
lbessard@151: attrs = []
lbessard@151: for element in elements:
lbessard@151: if element["type"] == ATTRIBUTE:
lbessard@151: if attrnames.get(element["name"], False):
lbessard@151: raise ValueError, "\"%s\" attribute has been defined two times!"%element["name"]
lbessard@151: else:
lbessard@151: attrnames[element["name"]] = True
lbessard@151: attrs.append(element)
lbessard@151: elif element["type"] == "attributeGroup":
lbessard@151: attrgroup = factory.FindSchemaElement(element["ref"], ATTRIBUTESGROUP)
lbessard@151: for attr in attrgroup["attributes"]:
lbessard@151: if attrnames.get(attr["name"], False):
lbessard@151: raise ValueError, "\"%s\" attribute has been defined two times!"%attr["name"]
lbessard@151: else:
lbessard@151: attrnames[attr["name"]] = True
lbessard@151: attrs.append(attr)
lbessard@151: elif element["type"] == "anyAttribute":
lbessard@151: raise ValueError, "\"anyAttribute\" element isn't supported yet!"
lbessard@151: return attrs
lbessard@151:
lbessard@151:
lbessard@151: def ReduceRestriction(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: restriction = {"type" : "restriction", "base" : attributes.get("base", None), "facets" : [], "doc" : annotations}
lbessard@151: if len(children) > 0 and children[0]["type"] == SIMPLETYPE:
lbessard@151: if restriction["base"] is None:
lbessard@151: restriction["base"] = children.pop(0)
lbessard@151: else:
lbessard@151: raise ValueError, "Only one base type can be defined for restriction!"
lbessard@151: if restriction["base"] is None:
lbessard@151: raise ValueError, "No base type has been defined for restriction!"
lbessard@151:
lbessard@151: while len(children) > 0 and children[0]["type"] in ALL_FACETS:
lbessard@151: restriction["facets"].append(children.pop(0))
lbessard@151: restriction["attributes"] = ExtractAttributes(factory, children)
lbessard@151: return restriction
lbessard@151:
lbessard@151:
lbessard@151: def ReduceExtension(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: extension = {"type" : "extension", "attributes" : [], "elements" : [], "base" : attributes.get("base", None), "doc" : annotations}
lbessard@151: if len(children) > 0:
lbessard@151: if children[0]["type"] in ["group", "all", CHOICE, "sequence"]:
lbessard@151: group = children.pop(0)
lbessard@151: if group["type"] in ["all", "sequence"]:
lbessard@151: extension["elements"] = group["elements"]
lbessard@151: extension["order"] = group["order"]
lbessard@151: elif group["type"] == CHOICE:
lbessard@151: content = group.copy()
lbessard@151: content["name"] = "content"
lbessard@151: extension["elements"].append(content)
lbessard@151: elif group["type"] == "group":
lbessard@151: elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
lbessard@151: if "elements" in elmtgroup:
lbessard@151: extension["elements"] = elmtgroup["elements"]
lbessard@151: extension["order"] = elmtgroup["order"]
lbessard@151: else:
lbessard@151: content = elmtgroup.copy()
lbessard@151: content["name"] = "content"
lbessard@151: extension["elements"].append(content)
lbessard@151: extension["attributes"] = ExtractAttributes(factory, children, extension["base"])
lbessard@151: return extension
lbessard@151:
lbessard@151:
lbessard@151: def ReduceSimpleContent(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: simpleContent = children[0].copy()
lbessard@151: simpleContent["type"] = "simpleContent"
lbessard@151: return simpleContent
lbessard@151:
lbessard@151:
lbessard@151: def ReduceComplexContent(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: complexContent = children[0].copy()
lbessard@151: complexContent["type"] = "complexContent"
lbessard@151: return complexContent
lbessard@151:
lbessard@151:
lbessard@151: def ReduceComplexType(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: if len(children) > 0:
lbessard@151: if children[0]["type"] in ["simpleContent", "complexContent"]:
lbessard@151: complexType = children[0].copy()
lbessard@151: complexType.update(attributes)
lbessard@151: complexType["type"] = COMPLEXTYPE
lbessard@151: return complexType
lbessard@151: elif children[0]["type"] in ["group", "all", CHOICE, "sequence"]:
lbessard@151: complexType = {"type" : COMPLEXTYPE, "elements" : [], "order" : True, "doc" : annotations}
lbessard@151: complexType.update(attributes)
lbessard@151: group = children.pop(0)
lbessard@151: if group["type"] in ["all", "sequence"]:
lbessard@151: if group["minOccurs"] == 0 or group["maxOccurs"] != 1:
lbessard@151: if len(group["elements"]) > 1:
lbessard@151: raise ValueError, "Not supported yet!"
lbessard@151: if group["minOccurs"] == 0:
lbessard@151: group["elements"][0]["minOccurs"] = group["minOccurs"]
lbessard@151: if group["maxOccurs"] != 1:
lbessard@151: group["elements"][0]["maxOccurs"] = group["maxOccurs"]
lbessard@151: complexType["elements"] = group["elements"]
lbessard@151: complexType["order"] = group["order"]
lbessard@151: elif group["type"] == CHOICE:
lbessard@151: content = group.copy()
lbessard@151: content["name"] = "content"
lbessard@151: complexType["elements"].append(content)
lbessard@151: elif group["type"] == "group":
lbessard@151: elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
lbessard@151: if "elements" in elmtgroup:
lbessard@151: complexType["elements"] = elmtgroup["elements"]
lbessard@151: complexType["order"] = elmtgroup["order"]
lbessard@151: else:
lbessard@151: content = elmtgroup.copy()
lbessard@151: content["name"] = "content"
lbessard@151: complexType["elements"].append(content)
lbessard@151: else:
lbessard@151: complexType = {"elements" : [], "order" : True, "doc" : annotations}
lbessard@151: complexType.update(attributes)
lbessard@151: complexType["type"] = COMPLEXTYPE
lbessard@151: complexType["attributes"] = ExtractAttributes(factory, children)
lbessard@151: return complexType
lbessard@151: else:
lbessard@151: raise ValueError, "\"ComplexType\" can't be empty!"
lbessard@151:
lbessard@151:
lbessard@151: # Attribute elements
lbessard@151:
lbessard@151: def ReduceAnyAttribute(factory, attributes, elements):
lbessard@151: return {"type" : "anyAttribute"}
lbessard@151:
lbessard@151:
lbessard@151: def ReduceAttribute(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: if "default" in attributes:
lbessard@151: if "fixed" in attributes:
lbessard@151: raise ValueError, "\"default\" and \"fixed\" can't be defined at the same time!"
lbessard@151: elif attributes.get("use", "optional") != "optional":
lbessard@151: raise ValueError, "if \"default\" present, \"use\" can only have the value \"optional\"!"
lbessard@151:
lbessard@151: attribute = {"type" : ATTRIBUTE, "attr_type" : attributes.get("type", None), "doc" : annotations}
lbessard@151: if len(children) > 0:
lbessard@151: if attribute["attr_type"] is None:
lbessard@151: attribute["attr_type"] = children[0]
lbessard@151: else:
lbessard@151: raise ValueError, "Only one type can be defined for attribute!"
lbessard@151:
lbessard@151: if "ref" in attributes:
lbessard@151: if "name" in attributes:
lbessard@151: raise ValueError, "\"ref\" and \"name\" can't be defined at the same time!"
lbessard@151: elif "form" in attributes:
lbessard@151: raise ValueError, "\"ref\" and \"form\" can't be defined at the same time!"
lbessard@151: elif attribute["attr_type"] is not None:
lbessard@151: raise ValueError, "if \"ref\" is present, no type can be defined!"
lbessard@151: elif attribute["attr_type"] is None:
lbessard@151: raise ValueError, "No type has been defined for attribute!"
lbessard@151:
lbessard@151: if "type" in attributes:
lbessard@151: tmp_attrs = attributes.copy()
lbessard@151: tmp_attrs.pop("type")
lbessard@151: attribute.update(tmp_attrs)
lbessard@151: else:
lbessard@151: attribute.update(attributes)
lbessard@151: return attribute
lbessard@151:
lbessard@151:
lbessard@151: def ReduceAttributeGroup(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: if "ref" in attributes:
lbessard@151: return {"type" : "attributeGroup", "ref" : attributes["ref"], "doc" : annotations}
lbessard@151: else:
lbessard@151: return {"type" : ATTRIBUTESGROUP, "attributes" : ExtractAttributes(factory, children), "doc" : annotations}
lbessard@151:
lbessard@151:
lbessard@151: # Elements groups
lbessard@151:
lbessard@151: def ReduceAny(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: any = {"type" : ANY, "doc" : annotations}
lbessard@151: any.update(attributes)
lbessard@151: return any
lbessard@151:
lbessard@151: def ReduceElement(factory, attributes, elements):
lbessard@151: if "default" in attributes and "fixed" in attributes:
lbessard@151: raise ValueError, "\"default\" and \"fixed\" can't be defined at the same time!"
lbessard@151:
lbessard@151: if "ref" in attributes:
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: for attr in ["name", "default", "fixed", "form", "block", "type"]:
lbessard@151: if attr in attributes:
lbessard@151: raise ValueError, "\"ref\" and \"%s\" can't be defined at the same time!"%attr
lbessard@151: if attributes.get("nillable", False):
lbessard@151: raise ValueError, "\"ref\" and \"nillable\" can't be defined at the same time!"
lbessard@151: if len(children) > 0:
lbessard@151: raise ValueError, "No type and no constraints can be defined where \"ref\" is defined!"
lbessard@151:
lbessard@151: infos = factory.FindSchemaElement(attributes["ref"], ELEMENT)
lbessard@151: if infos is not None:
lbessard@151: element = infos.copy()
lbessard@151: element["minOccurs"] = attributes["minOccurs"]
lbessard@151: element["maxOccurs"] = attributes["maxOccurs"]
lbessard@151: return element
lbessard@151: else:
lbessard@151: raise ValueError, "\"%s\" base type isn't defined or circular referenced!"%name
lbessard@151:
lbessard@151: elif "name" in attributes:
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: element = {"type" : ELEMENT, "elmt_type" : attributes.get("type", None), "doc" : annotations}
lbessard@151: if len(children) > 0:
lbessard@151: if element["elmt_type"] is None:
lbessard@151: element["elmt_type"] = children[0]
lbessard@151: else:
lbessard@151: raise ValueError, "Only one type can be defined for attribute!"
lbessard@151: elif element["elmt_type"] is None:
lbessard@151: element["elmt_type"] = "tag"
lbessard@151: element["type"] = TAG
lbessard@151:
lbessard@151: if "type" in attributes:
lbessard@151: tmp_attrs = attributes.copy()
lbessard@151: tmp_attrs.pop("type")
lbessard@151: element.update(tmp_attrs)
lbessard@151: else:
lbessard@151: element.update(attributes)
lbessard@151: return element
lbessard@151: else:
lbessard@151: raise ValueError, "\"Element\" must have at least a \"ref\" or a \"name\" defined!"
lbessard@151:
lbessard@151: def ReduceAll(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: for child in children:
lbessard@151: if children["maxOccurs"] == "unbounded" or children["maxOccurs"] > 1:
lbessard@151: raise ValueError, "\"all\" item can't have \"maxOccurs\" attribute greater than 1!"
lbessard@151:
lbessard@151: return {"type" : "all", "elements" : children, "minOccurs" : attributes["minOccurs"],
lbessard@151: "maxOccurs" : attributes["maxOccurs"], "order" : False, "doc" : annotations}
lbessard@151:
lbessard@151:
lbessard@151: def ReduceChoice(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: choices = []
lbessard@151: for child in children:
lbessard@151: if child["type"] in [ELEMENT, ANY, TAG]:
lbessard@151: choices.append(child)
lbessard@151: elif child["type"] == "sequence":
lbessard@151: raise ValueError, "\"sequence\" in \"choice\" is not supported. Create instead a new complex type!"
lbessard@151: elif child["type"] == CHOICE:
lbessard@151: choices.extend(child["choices"])
lbessard@151: elif child["type"] == "group":
lbessard@151: elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
lbessard@151: if "choices" not in elmtgroup:
lbessard@151: raise ValueError, "Only group composed of \"choice\" can be referenced in \"choice\" element!"
lbessard@151: choices_tmp = []
lbessard@151: for choice in elmtgroup["choices"]:
lbessard@151: if not isinstance(choice["elmt_type"], (UnicodeType, StringType)) and choice["elmt_type"]["type"] == COMPLEXTYPE:
lbessard@151: elmt_type = "%s_%s"%(elmtgroup["name"], choice["name"])
lbessard@151: if factory.TargetNamespace is not None:
lbessard@151: elmt_type = "%s:%s"%(factory.TargetNamespace, elmt_type)
lbessard@151: new_choice = choice.copy()
lbessard@151: new_choice["elmt_type"] = elmt_type
lbessard@151: choices_tmp.append(new_choice)
lbessard@151: else:
lbessard@151: choices_tmp.append(choice)
lbessard@151: choices.extend(choices_tmp)
lbessard@151:
lbessard@151: return {"type" : CHOICE, "choices" : choices, "minOccurs" : attributes["minOccurs"],
lbessard@151: "maxOccurs" : attributes["maxOccurs"], "doc" : annotations}
lbessard@151:
lbessard@151:
lbessard@151: def ReduceSequence(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: sequence = []
lbessard@151: for child in children:
lbessard@151: if child["type"] in [ELEMENT, ANY, TAG]:
lbessard@151: sequence.append(child)
lbessard@151: elif child["type"] == CHOICE:
lbessard@151: content = child.copy()
lbessard@151: content["name"] = "content"
lbessard@151: sequence.append(content)
lbessard@151: elif child["type"] == "sequence":
lbessard@151: sequence.extend(child["elements"])
lbessard@151: elif child["type"] == "group":
lbessard@151: elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
lbessard@151: if "elements" not in elmtgroup or not elmtgroup["order"]:
lbessard@151: raise ValueError, "Only group composed of \"sequence\" can be referenced in \"sequence\" element!"
lbessard@151: elements_tmp = []
lbessard@151: for element in elmtgroup["elements"]:
lbessard@151: if not isinstance(element["elmt_type"], (UnicodeType, StringType)) and element["elmt_type"]["type"] == COMPLEXTYPE:
lbessard@151: elmt_type = "%s_%s"%(elmtgroup["name"], element["name"])
lbessard@151: if factory.TargetNamespace is not None:
lbessard@151: elmt_type = "%s:%s"%(factory.TargetNamespace, elmt_type)
lbessard@151: new_element = element.copy()
lbessard@151: new_element["elmt_type"] = elmt_type
lbessard@151: elements_tmp.append(new_element)
lbessard@151: else:
lbessard@151: elements_tmp.append(element)
lbessard@151: sequence.extend(elements_tmp)
lbessard@151:
lbessard@151: return {"type" : "sequence", "elements" : sequence, "minOccurs" : attributes["minOccurs"],
lbessard@151: "maxOccurs" : attributes["maxOccurs"], "order" : True, "doc" : annotations}
lbessard@151:
lbessard@151:
lbessard@151: def ReduceGroup(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151:
lbessard@151: if "ref" in attributes:
lbessard@151: return {"type" : "group", "ref" : attributes["ref"], "doc" : annotations}
lbessard@151: else:
lbessard@151: element = children[0]
lbessard@151: group = {"type" : ELEMENTSGROUP, "doc" : annotations}
lbessard@151: if element["type"] == CHOICE:
lbessard@151: group["choices"] = element["choices"]
lbessard@151: else:
lbessard@151: group.update({"elements" : element["elements"], "order" : group["order"]})
lbessard@151: group.update(attributes)
lbessard@151: return group
lbessard@151:
lbessard@151: # Constraint elements
lbessard@151:
lbessard@151: def ReduceUnique(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: raise ValueError, "\"unique\" element isn't supported yet!"
lbessard@151:
lbessard@151: def ReduceKey(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: raise ValueError, "\"key\" element isn't supported yet!"
lbessard@151:
lbessard@151: def ReduceKeyRef(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: raise ValueError, "\"keyref\" element isn't supported yet!"
lbessard@151:
lbessard@151: def ReduceSelector(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: raise ValueError, "\"selector\" element isn't supported yet!"
lbessard@151:
lbessard@151: def ReduceField(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: raise ValueError, "\"field\" element isn't supported yet!"
lbessard@151:
lbessard@151:
lbessard@151: # Inclusion elements
lbessard@151:
lbessard@151: def ReduceImport(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: raise ValueError, "\"import\" element isn't supported yet!"
lbessard@151:
lbessard@151: def ReduceInclude(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: raise ValueError, "\"include\" element isn't supported yet!"
lbessard@151:
lbessard@151: def ReduceRedefine(factory, attributes, elements):
lbessard@151: annotations, children = factory.ReduceElements(elements)
lbessard@151: raise ValueError, "\"redefine\" element isn't supported yet!"
lbessard@151:
lbessard@151:
lbessard@151: # Schema element
lbessard@151:
lbessard@151: def ReduceSchema(factory, attributes, elements):
lbessard@151: factory.AttributeFormDefault = attributes["attributeFormDefault"]
lbessard@151: factory.ElementFormDefault = attributes["elementFormDefault"]
lbessard@151: factory.BlockDefault = attributes["blockDefault"]
lbessard@151: factory.FinalDefault = attributes["finalDefault"]
lbessard@151:
lbessard@151: if "targetNamespace" in attributes:
lbessard@151: factory.TargetNamespace = factory.DefinedNamespaces.get(attributes["targetNamespace"], None)
lbessard@151: factory.Namespaces[factory.TargetNamespace] = {}
lbessard@151:
lbessard@151: annotations, children = factory.ReduceElements(elements, True)
lbessard@151:
lbessard@151: for child in children:
lbessard@151: if "name" in child:
lbessard@151: infos = factory.GetQualifiedNameInfos(child["name"], factory.TargetNamespace, True)
lbessard@151: if infos is None:
lbessard@151: factory.Namespaces[factory.TargetNamespace][child["name"]] = child
lbessard@151: elif not CompareSchema(infos, child):
lbessard@151: raise ValueError, "\"%s\" is defined twice in targetNamespace!"%child["name"]
lbessard@151:
lbessard@151: def CompareSchema(schema, reference):
lbessard@151: if isinstance(schema, ListType):
lbessard@151: if not isinstance(reference, ListType) or len(schema) != len(reference):
lbessard@151: return False
lbessard@151: for i, value in enumerate(schema):
lbessard@151: result = CompareSchema(value, reference[i])
lbessard@151: if not result:
lbessard@151: return result
lbessard@151: return True
lbessard@151: elif isinstance(schema, DictType):
lbessard@151: if not isinstance(reference, DictType) or len(schema) != len(reference):
lbessard@151: return False
lbessard@151: for name, value in schema.items():
lbessard@151: ref_value = reference.get(name, None)
lbessard@151: if ref_value is None:
lbessard@151: return False
lbessard@151: result = CompareSchema(value, ref_value)
lbessard@151: if not result:
lbessard@151: return result
lbessard@151: return True
lbessard@151: elif isinstance(schema, FunctionType):
lbessard@151: if not isinstance(reference, FunctionType) or schema.__name__ != reference.__name__:
lbessard@151: return False
lbessard@151: else:
lbessard@151: return True
lbessard@151: return schema == reference
lbessard@151:
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151: # Base class for XSD schema extraction
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151:
lbessard@151:
lbessard@151: class XSDClassFactory(ClassFactory):
lbessard@151:
lbessard@151: def __init__(self, document, debug = False):
lbessard@151: ClassFactory.__init__(self, document, debug)
lbessard@151: self.Namespaces["xml"] = {
lbessard@151: "lang" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateEnumeratedExtraction("lang", LANGUAGES)
lbessard@151: }
lbessard@151: }
lbessard@151: }
lbessard@151: self.Namespaces["xsi"] = {
lbessard@151: "noNamespaceSchemaLocation" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : NotSupportedYet("noNamespaceSchemaLocation")
lbessard@151: }
lbessard@151: },
lbessard@151: "nil" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : NotSupportedYet("nil")
lbessard@151: }
lbessard@151: },
lbessard@151: "schemaLocation" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : NotSupportedYet("schemaLocation")
lbessard@151: }
lbessard@151: },
lbessard@151: "type" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : NotSupportedYet("type")
lbessard@151: }
lbessard@151: }
lbessard@151: }
lbessard@151:
lbessard@151: def ParseSchema(self):
lbessard@151: schema = self.Document.childNodes[0]
lbessard@151: for qualified_name, attr in schema._attrs.items():
lbessard@151: value = GetAttributeValue(attr)
lbessard@151: if value == "http://www.w3.org/2001/XMLSchema":
lbessard@151: namespace, name = DecomposeQualifiedName(qualified_name)
lbessard@151: if namespace == "xmlns":
lbessard@151: self.DefinedNamespaces["http://www.w3.org/2001/XMLSchema"] = name
lbessard@151: self.SchemaNamespace = name
lbessard@151: else:
lbessard@151: self.DefinedNamespaces["http://www.w3.org/2001/XMLSchema"] = self.SchemaNamespace
lbessard@151: self.Namespaces[self.SchemaNamespace] = XSD_NAMESPACE
lbessard@151: self.Schema = XSD_NAMESPACE["schema"]["extract"]["default"](self, schema)
lbessard@151: ReduceSchema(self, self.Schema[1], self.Schema[2])
lbessard@151:
lbessard@151: def FindSchemaElement(self, element_name, element_type):
lbessard@151: namespace, name = DecomposeQualifiedName(element_name)
lbessard@151: element = self.GetQualifiedNameInfos(name, namespace, True)
lbessard@151: if element is None and namespace == self.TargetNamespace and name not in self.CurrentCompilations:
lbessard@151: self.CurrentCompilations.append(name)
lbessard@151: element = self.CreateSchemaElement(name, element_type)
lbessard@151: self.CurrentCompilations.pop(-1)
lbessard@151: if element is not None:
lbessard@151: self.Namespaces[self.TargetNamespace][name] = element
lbessard@151: if element is None:
lbessard@151: if name in self.CurrentCompilations:
lbessard@151: if self.Debug:
lbessard@151: print "Warning : \"%s\" is circular referenced!"%element_name
lbessard@151: return element_name
lbessard@151: else:
lbessard@151: raise ValueError, "\"%s\" isn't defined!"%element_name
lbessard@151: if element["type"] != element_type:
lbessard@151: raise ValueError, "\"%s\" isn't a group!"%element_name
lbessard@151: return element
lbessard@151:
lbessard@151: def CreateSchemaElement(self, element_name, element_type):
lbessard@151: for type, attributes, elements in self.Schema[2]:
lbessard@151: namespace, name = DecomposeQualifiedName(type)
lbessard@151: if "name" in attributes and attributes["name"] == element_name:
lbessard@151: element_infos = None
lbessard@151: if element_type == ATTRIBUTE and name == "attribute":
lbessard@151: element_infos = ReduceAttribute(self, attributes, elements)
lbessard@151: elif element_type == ELEMENT and name == "element":
lbessard@151: element_infos = ReduceElement(self, attributes, elements)
lbessard@151: elif element_type == ATTRIBUTESGROUP and name == "attributeGroup":
lbessard@151: element_infos = ReduceAttributeGroup(self, attributes, elements)
lbessard@151: elif element_type == ELEMENTSGROUP and name == "group":
lbessard@151: element_infos = ReduceGroup(self, attributes, elements)
lbessard@151: elif element_type == SIMPLETYPE and name == "simpleType":
lbessard@151: element_infos = ReduceSimpleType(self, attributes, elements)
lbessard@151: elif element_type == COMPLEXTYPE and name == "complexType":
lbessard@151: element_infos = ReduceComplexType(self, attributes, elements)
lbessard@151: if element_infos is not None:
lbessard@151: self.Namespaces[self.TargetNamespace][element_name] = element_infos
lbessard@151: return element_infos
lbessard@151: return None
lbessard@151:
lbessard@151: """
lbessard@151: This function opens the xsd file and generate the classes from the xml tree
lbessard@151: """
lbessard@151: def GenerateClassesFromXSD(filename, declare = False):
lbessard@151: xsdfile = open(filename, 'r')
lbessard@151: factory = XSDClassFactory(minidom.parse(xsdfile))
lbessard@151: xsdfile.close()
lbessard@151: factory.ParseSchema()
lbessard@151: return GenerateClasses(factory, declare)
lbessard@151:
lbessard@151: """
lbessard@151: This function generate the classes from the xsd given as a string
lbessard@151: """
lbessard@151: def GenerateClassesFromXSDstring(xsdstring, declare = False):
lbessard@151: factory = XSDClassFactory(minidom.parseString(xsdstring))
lbessard@151: factory.ParseSchema()
lbessard@151: return GenerateClasses(factory, declare)
lbessard@151:
lbessard@151:
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151: # XSD schema syntax elements
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151:
lbessard@151: XSD_NAMESPACE = {
lbessard@151:
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151: # Syntax elements definition
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151:
lbessard@151: "all" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, element*)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("all", ["id", "maxOccurs", "minOccurs"],
lbessard@151: re.compile("((?:annotation )?(?:element )*)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceAll
lbessard@151: },
lbessard@151:
lbessard@151: "annotation" : {"struct" : """
lbessard@151:
lbessard@151: Content: (appinfo | documentation)*
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("annotation", ["id"],
lbessard@151: re.compile("((?:app_info |documentation )*)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceAnnotation
lbessard@151: },
lbessard@151:
lbessard@151: "any" : {"struct": """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("any",
lbessard@151: ["id", "maxOccurs", "minOccurs", "namespace", "processContents"],
lbessard@151: re.compile("((?:annotation )?(?:simpleType )*)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceAny
lbessard@151: },
lbessard@151:
lbessard@151: "anyAttribute" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("anyAttribute",
lbessard@151: ["id", "namespace", "processContents"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : ReduceAnyAttribute
lbessard@151: },
lbessard@151:
lbessard@151: "appinfo" : {"struct" : """
lbessard@151:
lbessard@151: Content: ({any})*
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("appinfo", ["source"], re.compile("(.*)"), True)
lbessard@151: },
lbessard@151: "reduce" : ReduceAppInfo
lbessard@151: },
lbessard@151:
lbessard@151: "attribute" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, simpleType?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("attribute",
lbessard@151: ["default", "fixed", "form", "id", "name", "ref", "type", "use"],
lbessard@151: re.compile("((?:annotation )?(?:simpleType )?)")),
lbessard@151: "schema" : GenerateElement("attribute",
lbessard@151: ["default", "fixed", "form", "id", "name", "type"],
lbessard@151: re.compile("((?:annotation )?(?:simpleType )?)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceAttribute
lbessard@151: },
lbessard@151:
lbessard@151: "attributeGroup" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, ((attribute | attributeGroup)*, anyAttribute?))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("attributeGroup",
lbessard@151: ["id", "ref"], ONLY_ANNOTATION),
lbessard@151: "schema" : GenerateElement("attributeGroup",
lbessard@151: ["id", "name"],
lbessard@151: re.compile("((?:annotation )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))"))
lbessard@151: },
lbessard@151: "reduce" : ReduceAttributeGroup
lbessard@151: },
lbessard@151:
lbessard@151: "choice" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (element | group | choice | sequence | any)*)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("choice", ["id", "maxOccurs", "minOccurs"],
lbessard@151: re.compile("((?:annotation )?(?:element |group |choice |sequence |any )*)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceChoice
lbessard@151: },
lbessard@151:
lbessard@151: "complexContent" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (restriction | extension))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("complexContent", ["id", "mixed"],
lbessard@151: re.compile("((?:annotation )?(?:restriction |extension ))"))
lbessard@151: },
lbessard@151: "reduce" : ReduceComplexContent
lbessard@151: },
lbessard@151:
lbessard@151: "complexType" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("complexType",
lbessard@151: ["abstract", "block", "final", "id", "mixed", "name"],
lbessard@151: re.compile("((?:annotation )?(?:simpleContent |complexContent |(?:(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))))"))
lbessard@151: },
lbessard@151: "reduce" : ReduceComplexType
lbessard@151: },
lbessard@151:
lbessard@151: "documentation" : {"struct" : """
lbessard@151:
lbessard@151: Content: ({any})*
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("documentation",
lbessard@151: ["source", "lang"], re.compile("(.*)"), True)
lbessard@151: },
lbessard@151: "reduce" : ReduceDocumentation
lbessard@151: },
lbessard@151:
lbessard@151: "element" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("element",
lbessard@151: ["abstract", "block", "default", "final", "fixed", "form", "id", "maxOccurs", "minOccurs", "name", "nillable", "ref", "substitutionGroup", "type"],
lbessard@151: re.compile("((?:annotation )?(?:simpleType |complexType )?(?:unique |key |keyref )*)")),
lbessard@151: "schema" : GenerateElement("element",
lbessard@151: ["abstract", "block", "default", "final", "fixed", "form", "id", "name", "nillable", "substitutionGroup", "type"],
lbessard@151: re.compile("((?:annotation )?(?:simpleType |complexType )?(?:unique |key |keyref )*)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceElement
lbessard@151: },
lbessard@151:
lbessard@151: "enumeration" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("enumeration", ["id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("enumeration", False)
lbessard@151: },
lbessard@151:
lbessard@151: "extension" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("extension", ["base", "id"],
lbessard@151: re.compile("((?:annotation )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))")),
lbessard@151: "complexContent" : GenerateElement("extension", ["base", "id"],
lbessard@151: re.compile("((?:annotation )?(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))"))
lbessard@151: },
lbessard@151: "reduce" : ReduceExtension
lbessard@151: },
lbessard@151:
lbessard@151: "field" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("field", ["id", "xpath"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : ReduceField
lbessard@151: },
lbessard@151:
lbessard@151: "fractionDigits" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("fractionDigits",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("fractionDigits", True)
lbessard@151: },
lbessard@151:
lbessard@151: "group" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (all | choice | sequence)?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("group",
lbessard@151: ["id", "maxOccurs", "minOccurs", "ref"],
lbessard@151: re.compile("((?:annotation )?(?:all |choice |sequence )?)")),
lbessard@151: "schema" : GenerateElement("group",
lbessard@151: ["id", "name"],
lbessard@151: re.compile("((?:annotation )?(?:all |choice |sequence )?)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceGroup
lbessard@151: },
lbessard@151:
lbessard@151: "import" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("import",
lbessard@151: ["id", "namespace", "schemaLocation"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : ReduceImport
lbessard@151: },
lbessard@151:
lbessard@151: "include" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("include",
lbessard@151: ["id", "schemaLocation"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : ReduceInclude
lbessard@151: },
lbessard@151:
lbessard@151: "key" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (selector, field+))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("key", ["id", "name"],
lbessard@151: re.compile("((?:annotation )?(?:selector |(?:field )+))"))
lbessard@151: },
lbessard@151: "reduce" : ReduceKey
lbessard@151: },
lbessard@151:
lbessard@151: "keyref" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (selector, field+))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("keyref", ["id", "name", "refer"],
lbessard@151: re.compile("((?:annotation )?(?:selector |(?:field )+))"))
lbessard@151: },
lbessard@151: "reduce" : ReduceKeyRef
lbessard@151: },
lbessard@151:
lbessard@151: "length" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("length",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("length", True)
lbessard@151: },
lbessard@151:
lbessard@151: "list" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, simpleType?)
lbessard@151:
""",
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("list", ["id", "itemType"],
lbessard@151: re.compile("((?:annotation )?(?:simpleType )?)$"))
lbessard@151: },
lbessard@151: "reduce" : ReduceList
lbessard@151: },
lbessard@151:
lbessard@151: "maxExclusive" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("maxExclusive",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("maxExclusive", True)
lbessard@151: },
lbessard@151:
lbessard@151: "maxInclusive" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("maxInclusive",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("maxInclusive", True)
lbessard@151: },
lbessard@151:
lbessard@151: "maxLength" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("maxLength",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("maxLength", True)
lbessard@151: },
lbessard@151:
lbessard@151: "minExclusive" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("minExclusive",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("minExclusive", True)
lbessard@151: },
lbessard@151:
lbessard@151: "minInclusive" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("minInclusive",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("minInclusive", True)
lbessard@151: },
lbessard@151:
lbessard@151: "minLength" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("minLength",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("minLength", True)
lbessard@151: },
lbessard@151:
lbessard@151: "pattern" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("pattern", ["id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("pattern", False)
lbessard@151: },
lbessard@151:
lbessard@151: "redefine" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation | (simpleType | complexType | group | attributeGroup))*
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("refine", ["id", "schemaLocation"],
lbessard@151: re.compile("((?:annotation |(?:simpleType |complexType |group |attributeGroup ))*)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceRedefine
lbessard@151: },
lbessard@151:
lbessard@151: "restriction" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("restriction", ["base", "id"],
lbessard@151: re.compile("((?:annotation )?(?:(?:simpleType )?(?:(?:minExclusive |minInclusive |maxExclusive |maxInclusive |totalDigits |fractionDigits |length |minLength |maxLength |enumeration |whiteSpace |pattern )*)))")),
lbessard@151: "simpleContent" : GenerateElement("restriction", ["base", "id"],
lbessard@151: re.compile("((?:annotation )?(?:(?:simpleType )?(?:(?:minExclusive |minInclusive |maxExclusive |maxInclusive |totalDigits |fractionDigits |length |minLength |maxLength |enumeration |whiteSpace |pattern )*)?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?)))")),
lbessard@151: "complexContent" : GenerateElement("restriction", ["base", "id"],
lbessard@151: re.compile("((?:annotation )?(?:(?:simpleType )?(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?)))")),
lbessard@151: },
lbessard@151: "reduce" : ReduceRestriction
lbessard@151: },
lbessard@151:
lbessard@151: "schema" : {"struct" : """
lbessard@151:
lbessard@151: Content: ((include | import | redefine | annotation)*, (((simpleType | complexType | group | attributeGroup) | element | attribute | notation), annotation*)*)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("schema",
lbessard@151: ["attributeFormDefault", "blockDefault", "elementFormDefault", "finalDefault", "id", "targetNamespace", "version", "lang"],
lbessard@151: re.compile("((?:include |import |redefine |annotation )*(?:(?:(?:simpleType |complexType |group |attributeGroup )|element |attribute |annotation )(?:annotation )*)*)"))
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "selector" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("selector", ["id", "xpath"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : ReduceSelector
lbessard@151: },
lbessard@151:
lbessard@151: "sequence" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (element | group | choice | sequence | any)*)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("sequence", ["id", "maxOccurs", "minOccurs"],
lbessard@151: re.compile("((?:annotation )?(?:element |group |choice |sequence |any )*)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceSequence
lbessard@151: },
lbessard@151:
lbessard@151: "simpleContent" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (restriction | extension))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("simpleContent", ["id"],
lbessard@151: re.compile("((?:annotation )?(?:restriction |extension ))"))
lbessard@151: },
lbessard@151: "reduce" : ReduceSimpleContent
lbessard@151: },
lbessard@151:
lbessard@151: "simpleType" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (restriction | list | union))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("simpleType", ["final", "id", "name"],
lbessard@151: re.compile("((?:annotation )?(?:restriction |list |union ))"))
lbessard@151: },
lbessard@151: "reduce" : ReduceSimpleType
lbessard@151: },
lbessard@151:
lbessard@151: "totalDigits" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("totalDigits",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION),
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("totalDigits", True)
lbessard@151: },
lbessard@151:
lbessard@151: "union" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, simpleType*)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("union", ["id", "memberTypes"],
lbessard@151: re.compile("((?:annotation )?(?:simpleType )*)"))
lbessard@151: },
lbessard@151: "reduce" : ReduceUnion
lbessard@151: },
lbessard@151:
lbessard@151: "unique" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?, (selector, field+))
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("unique", ["id", "name"],
lbessard@151: re.compile("((?:annotation )?(?:selector |(?:field )+))"))
lbessard@151: },
lbessard@151: "reduce" : ReduceUnique
lbessard@151: },
lbessard@151:
lbessard@151: "whiteSpace" : {"struct" : """
lbessard@151:
lbessard@151: Content: (annotation?)
lbessard@151: """,
lbessard@151: "type" : SYNTAXELEMENT,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateElement("whiteSpace",
lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION)
lbessard@151: },
lbessard@151: "reduce" : GenerateFacetReducing("whiteSpace", True)
lbessard@151: },
lbessard@151:
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151: # Syntax attributes definition
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151:
lbessard@151: "abstract" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GetBoolean
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : False
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "attributeFormDefault" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateEnumeratedExtraction("member attributeFormDefault", ["qualified", "unqualified"])
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : "unqualified"
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "base" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member base", QName_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "block" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateGetList("block", ["restriction", "extension", "substitution"])
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "blockDefault" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateGetList("block", ["restriction", "extension", "substitution"])
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : ""
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "default" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GetAttributeValue
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "elementFormDefault" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateEnumeratedExtraction("member elementFormDefault", ["qualified", "unqualified"])
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : "unqualified"
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "final" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateGetList("final", ["restriction", "extension", "substitution"]),
lbessard@151: "simpleType" : GenerateGetList("final", ["list", "union", "restriction"])
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "finalDefault" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateGetList("finalDefault", ["restriction", "extension", "list", "union"])
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : ""
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "fixed" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GetBoolean,
lbessard@151: "attribute" : GetAttributeValue,
lbessard@151: "element" : GetAttributeValue
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : False,
lbessard@151: "attribute" : None,
lbessard@151: "element" : None
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "form" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateEnumeratedExtraction("member form", ["qualified", "unqualified"])
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "id" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member id", NCName_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "itemType" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member itemType", QName_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "memberTypes" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameListExtraction("member memberTypes", QNames_model)
lbessard@151: },
lbessard@151: },
lbessard@151:
lbessard@151: "maxOccurs" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateLimitExtraction(),
lbessard@151: "all" : GenerateLimitExtraction(1, 1, False)
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : 1
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "minOccurs" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateLimitExtraction(unbounded = False),
lbessard@151: "all" : GenerateLimitExtraction(0, 1, False)
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : 1
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "mixed" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GetBoolean
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : None,
lbessard@151: "complexType" : False
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "name" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member name", NCName_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "namespace" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member namespace", URI_model),
lbessard@151: "any" : GetNamespaces
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : None,
lbessard@151: "any" : "##any"
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "nillable" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GetBoolean
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : False
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "processContents" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateEnumeratedExtraction("member processContents", ["lax", "skip", "strict"])
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : "strict"
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "ref" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member ref", QName_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "refer" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member refer", QName_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "schemaLocation" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member schemaLocation", URI_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "source" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member source", URI_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "substitutionGroup" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member substitutionGroup", QName_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "targetNamespace" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member targetNamespace", URI_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "type" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateModelNameExtraction("member type", QName_model)
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "use" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GenerateEnumeratedExtraction("member usage", ["required", "optional", "prohibited"])
lbessard@151: },
lbessard@151: "default" : {
lbessard@151: "default" : "optional"
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "value" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GetAttributeValue,
lbessard@151: "fractionDigits" : GenerateIntegerExtraction(minInclusive=0),
lbessard@151: "length" : GenerateIntegerExtraction(minInclusive=0),
lbessard@151: "maxLength" : GenerateIntegerExtraction(minInclusive=0),
lbessard@151: "minLength" : GenerateIntegerExtraction(minInclusive=0),
lbessard@151: "totalDigits" : GenerateIntegerExtraction(minExclusive=0),
lbessard@151: "whiteSpace" : GenerateEnumeratedExtraction("value", ["collapse", "preserve", "replace"])
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "version" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : GetToken
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: "xpath" : {
lbessard@151: "type" : SYNTAXATTRIBUTE,
lbessard@151: "extract" : {
lbessard@151: "default" : NotSupportedYet("xpath")
lbessard@151: }
lbessard@151: },
lbessard@151:
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151: # Simple types definition
lbessard@151: #-------------------------------------------------------------------------------
lbessard@151:
lbessard@151: "string" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "string",
lbessard@151: "extract" : GetAttributeValue,
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x : x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "normalizedString" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "normalizedString",
lbessard@151: "extract" : GetNormalizedString,
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x : x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "token" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "token",
lbessard@151: "extract" : GetToken,
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x : x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "base64Binary" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "base64Binary",
lbessard@151: "extract" : NotSupportedYet("base64Binary"),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "hexBinary" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "hexBinary",
lbessard@151: "extract" : GetHexInteger,
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x : "%X"%x),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "integer" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "integer",
lbessard@151: "extract" : GenerateIntegerExtraction(),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "positiveInteger" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "positiveInteger",
lbessard@151: "extract" : GenerateIntegerExtraction(minExclusive=0),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "negativeInteger" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "negativeInteger",
lbessard@151: "extract" : GenerateIntegerExtraction(maxExclusive=0),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "nonNegativeInteger" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "nonNegativeInteger",
lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "nonPositiveInteger" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "nonPositiveInteger",
lbessard@151: "extract" : GenerateIntegerExtraction(maxInclusive=0),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "long" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "long",
lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=-2**63,maxExclusive=2**63),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "unsignedLong" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "unsignedLong",
lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**64),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "int" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "int",
lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=-2**31,maxExclusive=2**31),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "unsignedInt" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "unsignedInt",
lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**32),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "short" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "short",
lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=-2**15,maxExclusive=2**15),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "unsignedShort" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "unsignedShort",
lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**16),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "byte" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "byte",
lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=-2**7,maxExclusive=2**7),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "unsignedByte" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "unsignedByte",
lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**8),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: 0,
lbessard@151: "check" : lambda x: isinstance(x, IntType)
lbessard@151: },
lbessard@151:
lbessard@151: "decimal" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "decimal",
lbessard@151: "extract" : GenerateFloatExtraction("decimal"),
lbessard@151: "facets" : DECIMAL_FACETS,
lbessard@151: "generate" : GenerateFloatXMLText(),
lbessard@151: "initial" : lambda: 0.,
lbessard@151: "check" : lambda x: isinstance(x, (IntType, FloatType))
lbessard@151: },
lbessard@151:
lbessard@151: "float" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "float",
lbessard@151: "extract" : GenerateFloatExtraction("float", ["INF", "-INF", "NaN"]),
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateFloatXMLText(["INF", "-INF", "NaN"]),
lbessard@151: "initial" : lambda: 0.,
lbessard@151: "check" : lambda x: {"INF" : True, "-INF" : True, "NaN" : True}.get(x, isinstance(x, (IntType, FloatType)))
lbessard@151: },
lbessard@151:
lbessard@151: "double" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "double",
lbessard@151: "extract" : GenerateFloatExtraction("double", ["INF", "-INF", "NaN"]),
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateFloatXMLText(["INF", "-INF", "NaN"]),
lbessard@151: "initial" : lambda: 0.,
lbessard@151: "check" : lambda x: {"INF" : True, "-INF" : True, "NaN" : True}.get(x, isinstance(x, (IntType, FloatType)))
lbessard@151: },
lbessard@151:
lbessard@151: "boolean" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "boolean",
lbessard@151: "extract" : GetBoolean,
lbessard@151: "facets" : ["pattern", "whiteSpace"],
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x:{True : "true", False : "false"}[x]),
lbessard@151: "initial" : lambda: False,
lbessard@151: "check" : lambda x: isinstance(x, BooleanType)
lbessard@151: },
lbessard@151:
lbessard@151: "duration" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "duration",
lbessard@151: "extract" : NotSupportedYet("duration"),
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "dateTime" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "dateTime",
lbessard@151: "extract" : GetDateTime,
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: datetime.datetime(1,1,1,0,0,0,0),
lbessard@151: "check" : lambda x: isinstance(x, datetime.datetime)
lbessard@151: },
lbessard@151:
lbessard@151: "date" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "date",
lbessard@151: "extract" : GetDate,
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: datetime.date(1,1,1),
lbessard@151: "check" : lambda x: isinstance(x, datetime.date)
lbessard@151: },
lbessard@151:
lbessard@151: "time" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "time",
lbessard@151: "extract" : GetTime,
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: datetime.time(0,0,0,0),
lbessard@151: "check" : lambda x: isinstance(x, datetime.time)
lbessard@151: },
lbessard@151:
lbessard@151: "gYear" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "gYear",
lbessard@151: "extract" : NotSupportedYet("gYear"),
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "gYearMonth" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "gYearMonth",
lbessard@151: "extract" : NotSupportedYet("gYearMonth"),
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "gMonth" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "gMonth",
lbessard@151: "extract" : NotSupportedYet("gMonth"),
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "gMonthDay" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "gMonthDay",
lbessard@151: "extract" : NotSupportedYet("gMonthDay"),
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "gDay" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "gDay",
lbessard@151: "extract" : NotSupportedYet("gDay"),
lbessard@151: "facets" : NUMBER_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(str),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "Name" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "Name",
lbessard@151: "extract" : GenerateModelNameExtraction("Name", Name_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "QName" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "QName",
lbessard@151: "extract" : GenerateModelNameExtraction("QName", QName_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "NCName" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "NCName",
lbessard@151: "extract" : GenerateModelNameExtraction("NCName", NCName_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "anyURI" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "anyURI",
lbessard@151: "extract" : GenerateModelNameExtraction("anyURI", URI_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "language" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "language",
lbessard@151: "extract" : GenerateEnumeratedExtraction("language", LANGUAGES),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "en",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "ID" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "ID",
lbessard@151: "extract" : GenerateModelNameExtraction("ID", Name_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "IDREF" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "IDREF",
lbessard@151: "extract" : GenerateModelNameExtraction("IDREF", Name_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "IDREFS" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "IDREFS",
lbessard@151: "extract" : GenerateModelNameExtraction("IDREFS", Names_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "ENTITY" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "ENTITY",
lbessard@151: "extract" : GenerateModelNameExtraction("ENTITY", Name_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "ENTITIES" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "ENTITIES",
lbessard@151: "extract" : GenerateModelNameExtraction("ENTITIES", Names_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "NOTATION" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "NOTATION",
lbessard@151: "extract" : GenerateModelNameExtraction("NOTATION", Name_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "NMTOKEN" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "NMTOKEN",
lbessard@151: "extract" : GenerateModelNameExtraction("NMTOKEN", NMToken_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: "NMTOKENS" : {
lbessard@151: "type" : SIMPLETYPE,
lbessard@151: "basename" : "NMTOKENS",
lbessard@151: "extract" : GenerateModelNameExtraction("NMTOKENS", NMTokens_model),
lbessard@151: "facets" : STRING_FACETS,
lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x),
lbessard@151: "initial" : lambda: "",
lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType))
lbessard@151: },
lbessard@151:
lbessard@151: # Complex Types
lbessard@151: "anyType" : {"type" : COMPLEXTYPE, "extract" : lambda x:None},
lbessard@151: }
lbessard@151:
lbessard@151: if __name__ == '__main__':
lbessard@151: classes = GenerateClassesFromXSD("test.xsd")
lbessard@151:
lbessard@151: # Code for test of test.xsd
lbessard@151: xmlfile = open("po.xml", 'r')
lbessard@151: tree = minidom.parse(xmlfile)
lbessard@151: xmlfile.close()
lbessard@151: test = classes["PurchaseOrderType"]()
lbessard@151: for child in tree.childNodes:
lbessard@151: if child.nodeType == tree.ELEMENT_NODE and child.nodeName == "purchaseOrder":
lbessard@151: test.loadXMLTree(child)
lbessard@151: test.items.item[0].setquantity(2)
lbessard@151: testfile = open("test.xml", 'w')
lbessard@151: testfile.write("\n")
lbessard@151: testfile.write(test.generateXMLText("purchaseOrder"))
lbessard@151: testfile.close()