xmlclass/xsdschema.py
changeset 2450 5024c19ca8f0
parent 1872 866fb3ab8778
child 2457 9deec258ab1a
equal deleted inserted replaced
2449:b0560adec4b7 2450:5024c19ca8f0
    26 from __future__ import absolute_import
    26 from __future__ import absolute_import
    27 from __future__ import print_function
    27 from __future__ import print_function
    28 import os
    28 import os
    29 import re
    29 import re
    30 import datetime
    30 import datetime
       
    31 from types import FunctionType
    31 from xml.dom import minidom
    32 from xml.dom import minidom
    32 from types import *
    33 from six import string_types
       
    34 from past.builtins import long
    33 
    35 
    34 from xmlclass.xmlclass import *
    36 from xmlclass.xmlclass import *
    35 
    37 
    36 
    38 
    37 def GenerateDictFacets(facets):
    39 def GenerateDictFacets(facets):
    59     def generateXMLTextMethod(value, name=None, indent=0):
    61     def generateXMLTextMethod(value, name=None, indent=0):
    60         text = ""
    62         text = ""
    61         if name is not None:
    63         if name is not None:
    62             ind1, _ind2 = getIndent(indent, name)
    64             ind1, _ind2 = getIndent(indent, name)
    63             text += ind1 + "<%s>" % name
    65             text += ind1 + "<%s>" % name
    64         if isinstance(value, IntType):
    66         if isinstance(value, int):
    65             text += str(value)
    67             text += str(value)
    66         elif value in extra_values or value % 1 != 0:
    68         elif value in extra_values or value % 1 != 0:
    67             text += float_format(value)
    69             text += float_format(value)
    68         else:
    70         else:
    69             text += "{:.0f}".format(value)
    71             text += "{:.0f}".format(value)
   165     if "name" in attributes:
   167     if "name" in attributes:
   166         simpleType["name"] = attributes["name"]
   168         simpleType["name"] = attributes["name"]
   167 
   169 
   168     if typeinfos["type"] in ["restriction", "extension"]:
   170     if typeinfos["type"] in ["restriction", "extension"]:
   169         # Search for base type definition
   171         # Search for base type definition
   170         if isinstance(typeinfos["base"], (StringType, UnicodeType)):
   172         if isinstance(typeinfos["base"], string_types):
   171             basetypeinfos = factory.FindSchemaElement(typeinfos["base"], SIMPLETYPE)
   173             basetypeinfos = factory.FindSchemaElement(typeinfos["base"], SIMPLETYPE)
   172             if basetypeinfos is None:
   174             if basetypeinfos is None:
   173                 raise "\"%s\" isn't defined!" % typeinfos["base"]
   175                 raise "\"%s\" isn't defined!" % typeinfos["base"]
   174         else:
   176         else:
   175             basetypeinfos = typeinfos["base"]
   177             basetypeinfos = typeinfos["base"]
   389 
   391 
   390         GenerateSimpleType = basetypeinfos["generate"]
   392         GenerateSimpleType = basetypeinfos["generate"]
   391 
   393 
   392     elif typeinfos["type"] == "list":
   394     elif typeinfos["type"] == "list":
   393         # Search for item type definition
   395         # Search for item type definition
   394         if isinstance(typeinfos["itemType"], (StringType, UnicodeType)):
   396         if isinstance(typeinfos["itemType"], string_types):
   395             itemtypeinfos = factory.FindSchemaElement(typeinfos["itemType"], SIMPLETYPE)
   397             itemtypeinfos = factory.FindSchemaElement(typeinfos["itemType"], SIMPLETYPE)
   396             if itemtypeinfos is None:
   398             if itemtypeinfos is None:
   397                 raise "\"%s\" isn't defined!" % typeinfos["itemType"]
   399                 raise "\"%s\" isn't defined!" % typeinfos["itemType"]
   398         else:
   400         else:
   399             itemtypeinfos = typeinfos["itemType"]
   401             itemtypeinfos = typeinfos["itemType"]
   435 
   437 
   436     elif typeinfos["type"] == "union":
   438     elif typeinfos["type"] == "union":
   437         # Search for member types definition
   439         # Search for member types definition
   438         membertypesinfos = []
   440         membertypesinfos = []
   439         for membertype in typeinfos["memberTypes"]:
   441         for membertype in typeinfos["memberTypes"]:
   440             if isinstance(membertype, (StringType, UnicodeType)):
   442             if isinstance(membertype, string_types):
   441                 infos = factory.FindSchemaElement(membertype, SIMPLETYPE)
   443                 infos = factory.FindSchemaElement(membertype, SIMPLETYPE)
   442                 if infos is None:
   444                 if infos is None:
   443                     raise ValueError("\"%s\" isn't defined!" % membertype)
   445                     raise ValueError("\"%s\" isn't defined!" % membertype)
   444             else:
   446             else:
   445                 infos = membertype
   447                 infos = membertype
   476             return False
   478             return False
   477 
   479 
   478         SimpleTypeInitialValue = membertypesinfos[0]["initial"]
   480         SimpleTypeInitialValue = membertypesinfos[0]["initial"]
   479 
   481 
   480         def GenerateSimpleTypeFunction(value):
   482         def GenerateSimpleTypeFunction(value):
   481             if isinstance(value, BooleanType):
   483             if isinstance(value, bool):
   482                 return {True: "true", False: "false"}[value]
   484                 return {True: "true", False: "false"}[value]
   483             else:
   485             else:
   484                 return str(value)
   486                 return str(value)
   485         GenerateSimpleType = GenerateSimpleTypeXMLText(GenerateSimpleTypeFunction)
   487         GenerateSimpleType = GenerateSimpleTypeXMLText(GenerateSimpleTypeFunction)
   486 
   488 
   509 def ExtractAttributes(factory, elements, base=None):
   511 def ExtractAttributes(factory, elements, base=None):
   510     attrs = []
   512     attrs = []
   511     attrnames = {}
   513     attrnames = {}
   512     if base is not None:
   514     if base is not None:
   513         basetypeinfos = factory.FindSchemaElement(base)
   515         basetypeinfos = factory.FindSchemaElement(base)
   514         if not isinstance(basetypeinfos, (UnicodeType, StringType)) and basetypeinfos["type"] == COMPLEXTYPE:
   516         if not isinstance(basetypeinfos, string_types) and basetypeinfos["type"] == COMPLEXTYPE:
   515             attrnames = dict(map(lambda x: (x["name"], True), basetypeinfos["attributes"]))
   517             attrnames = dict(map(lambda x: (x["name"], True), basetypeinfos["attributes"]))
   516 
   518 
   517     for element in elements:
   519     for element in elements:
   518         if element["type"] == ATTRIBUTE:
   520         if element["type"] == ATTRIBUTE:
   519             if attrnames.get(element["name"], False):
   521             if attrnames.get(element["name"], False):
   810             elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
   812             elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
   811             if "choices" not in elmtgroup:
   813             if "choices" not in elmtgroup:
   812                 raise ValueError("Only group composed of \"choice\" can be referenced in \"choice\" element!")
   814                 raise ValueError("Only group composed of \"choice\" can be referenced in \"choice\" element!")
   813             choices_tmp = []
   815             choices_tmp = []
   814             for choice in elmtgroup["choices"]:
   816             for choice in elmtgroup["choices"]:
   815                 if not isinstance(choice["elmt_type"], (UnicodeType, StringType)) and choice["elmt_type"]["type"] == COMPLEXTYPE:
   817                 if not isinstance(choice["elmt_type"], string_types) and choice["elmt_type"]["type"] == COMPLEXTYPE:
   816                     elmt_type = "%s_%s" % (elmtgroup["name"], choice["name"])
   818                     elmt_type = "%s_%s" % (elmtgroup["name"], choice["name"])
   817                     if factory.TargetNamespace is not None:
   819                     if factory.TargetNamespace is not None:
   818                         elmt_type = "%s:%s" % (factory.TargetNamespace, elmt_type)
   820                         elmt_type = "%s:%s" % (factory.TargetNamespace, elmt_type)
   819                     new_choice = choice.copy()
   821                     new_choice = choice.copy()
   820                     new_choice["elmt_type"] = elmt_type
   822                     new_choice["elmt_type"] = elmt_type
   844             elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
   846             elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
   845             if "elements" not in elmtgroup or not elmtgroup["order"]:
   847             if "elements" not in elmtgroup or not elmtgroup["order"]:
   846                 raise ValueError("Only group composed of \"sequence\" can be referenced in \"sequence\" element!")
   848                 raise ValueError("Only group composed of \"sequence\" can be referenced in \"sequence\" element!")
   847             elements_tmp = []
   849             elements_tmp = []
   848             for element in elmtgroup["elements"]:
   850             for element in elmtgroup["elements"]:
   849                 if not isinstance(element["elmt_type"], (UnicodeType, StringType)) and element["elmt_type"]["type"] == COMPLEXTYPE:
   851                 if not isinstance(element["elmt_type"], string_types) and element["elmt_type"]["type"] == COMPLEXTYPE:
   850                     elmt_type = "%s_%s" % (elmtgroup["name"], element["name"])
   852                     elmt_type = "%s_%s" % (elmtgroup["name"], element["name"])
   851                     if factory.TargetNamespace is not None:
   853                     if factory.TargetNamespace is not None:
   852                         elmt_type = "%s:%s" % (factory.TargetNamespace, elmt_type)
   854                         elmt_type = "%s:%s" % (factory.TargetNamespace, elmt_type)
   853                     new_element = element.copy()
   855                     new_element = element.copy()
   854                     new_element["elmt_type"] = elmt_type
   856                     new_element["elmt_type"] = elmt_type
   980             elif not CompareSchema(infos, child):
   982             elif not CompareSchema(infos, child):
   981                 raise ValueError("\"%s\" is defined twice in targetNamespace!" % child["name"])
   983                 raise ValueError("\"%s\" is defined twice in targetNamespace!" % child["name"])
   982 
   984 
   983 
   985 
   984 def CompareSchema(schema, reference):
   986 def CompareSchema(schema, reference):
   985     if isinstance(schema, ListType):
   987     if isinstance(schema, list):
   986         if not isinstance(reference, ListType) or len(schema) != len(reference):
   988         if not isinstance(reference, list) or len(schema) != len(reference):
   987             return False
   989             return False
   988         for i, value in enumerate(schema):
   990         for i, value in enumerate(schema):
   989             result = CompareSchema(value, reference[i])
   991             result = CompareSchema(value, reference[i])
   990             if not result:
   992             if not result:
   991                 return result
   993                 return result
   992         return True
   994         return True
   993     elif isinstance(schema, DictType):
   995     elif isinstance(schema, dict):
   994         if not isinstance(reference, DictType) or len(schema) != len(reference):
   996         if not isinstance(reference, dict) or len(schema) != len(reference):
   995             return False
   997             return False
   996         for name, value in schema.items():
   998         for name, value in schema.items():
   997             ref_value = reference.get(name, None)
   999             ref_value = reference.get(name, None)
   998             if ref_value is None and value is not None:
  1000             if ref_value is None and value is not None:
   999                 return False
  1001                 return False
  2210         "basename": "string",
  2212         "basename": "string",
  2211         "extract": GetAttributeValue,
  2213         "extract": GetAttributeValue,
  2212         "facets": STRING_FACETS,
  2214         "facets": STRING_FACETS,
  2213         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2215         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2214         "initial": lambda: "",
  2216         "initial": lambda: "",
  2215         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2217         "check": lambda x: isinstance(x, string_types)},
  2216     },
       
  2217 
  2218 
  2218     "normalizedString": {
  2219     "normalizedString": {
  2219         "type": SIMPLETYPE,
  2220         "type": SIMPLETYPE,
  2220         "basename": "normalizedString",
  2221         "basename": "normalizedString",
  2221         "extract": GetNormalizedString,
  2222         "extract": GetNormalizedString,
  2222         "facets": STRING_FACETS,
  2223         "facets": STRING_FACETS,
  2223         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2224         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2224         "initial": lambda: "",
  2225         "initial": lambda: "",
  2225         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2226         "check": lambda x: isinstance(x, string_types)
  2226     },
  2227     },
  2227 
  2228 
  2228     "token": {
  2229     "token": {
  2229         "type": SIMPLETYPE,
  2230         "type": SIMPLETYPE,
  2230         "basename": "token",
  2231         "basename": "token",
  2231         "extract": GetToken,
  2232         "extract": GetToken,
  2232         "facets": STRING_FACETS,
  2233         "facets": STRING_FACETS,
  2233         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2234         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2234         "initial": lambda: "",
  2235         "initial": lambda: "",
  2235         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2236         "check": lambda x: isinstance(x, string_types)
  2236     },
  2237     },
  2237 
  2238 
  2238     "base64Binary": {
  2239     "base64Binary": {
  2239         "type": SIMPLETYPE,
  2240         "type": SIMPLETYPE,
  2240         "basename": "base64Binary",
  2241         "basename": "base64Binary",
  2241         "extract": NotSupportedYet("base64Binary"),
  2242         "extract": NotSupportedYet("base64Binary"),
  2242         "facets": STRING_FACETS,
  2243         "facets": STRING_FACETS,
  2243         "generate": GenerateSimpleTypeXMLText(str),
  2244         "generate": GenerateSimpleTypeXMLText(str),
  2244         "initial": lambda: 0,
  2245         "initial": lambda: 0,
  2245         "check": lambda x: isinstance(x, (IntType, LongType))
  2246         "check": lambda x: isinstance(x, (int, long))
  2246     },
  2247     },
  2247 
  2248 
  2248     "hexBinary": {
  2249     "hexBinary": {
  2249         "type": SIMPLETYPE,
  2250         "type": SIMPLETYPE,
  2250         "basename": "hexBinary",
  2251         "basename": "hexBinary",
  2251         "extract": GetHexInteger,
  2252         "extract": GetHexInteger,
  2252         "facets": STRING_FACETS,
  2253         "facets": STRING_FACETS,
  2253         "generate": GenerateSimpleTypeXMLText(lambda x: ("%."+str(int(round(len("%X" % x)/2.)*2))+"X") % x),
  2254         "generate": GenerateSimpleTypeXMLText(lambda x: ("%."+str(int(round(len("%X" % x)/2.)*2))+"X") % x),
  2254         "initial": lambda: 0,
  2255         "initial": lambda: 0,
  2255         "check": lambda x: isinstance(x, (IntType, LongType))
  2256         "check": lambda x: isinstance(x, (int, long))
  2256     },
  2257     },
  2257 
  2258 
  2258     "integer": {
  2259     "integer": {
  2259         "type": SIMPLETYPE,
  2260         "type": SIMPLETYPE,
  2260         "basename": "integer",
  2261         "basename": "integer",
  2261         "extract": GenerateIntegerExtraction(),
  2262         "extract": GenerateIntegerExtraction(),
  2262         "facets": DECIMAL_FACETS,
  2263         "facets": DECIMAL_FACETS,
  2263         "generate": GenerateSimpleTypeXMLText(str),
  2264         "generate": GenerateSimpleTypeXMLText(str),
  2264         "initial": lambda: 0,
  2265         "initial": lambda: 0,
  2265         "check": lambda x: isinstance(x, IntType)
  2266         "check": lambda x: isinstance(x, int)
  2266     },
  2267     },
  2267 
  2268 
  2268     "positiveInteger": {
  2269     "positiveInteger": {
  2269         "type": SIMPLETYPE,
  2270         "type": SIMPLETYPE,
  2270         "basename": "positiveInteger",
  2271         "basename": "positiveInteger",
  2271         "extract": GenerateIntegerExtraction(minExclusive=0),
  2272         "extract": GenerateIntegerExtraction(minExclusive=0),
  2272         "facets": DECIMAL_FACETS,
  2273         "facets": DECIMAL_FACETS,
  2273         "generate": GenerateSimpleTypeXMLText(str),
  2274         "generate": GenerateSimpleTypeXMLText(str),
  2274         "initial": lambda: 1,
  2275         "initial": lambda: 1,
  2275         "check": lambda x: isinstance(x, IntType)
  2276         "check": lambda x: isinstance(x, int)
  2276     },
  2277     },
  2277 
  2278 
  2278     "negativeInteger": {
  2279     "negativeInteger": {
  2279         "type": SIMPLETYPE,
  2280         "type": SIMPLETYPE,
  2280         "basename": "negativeInteger",
  2281         "basename": "negativeInteger",
  2281         "extract": GenerateIntegerExtraction(maxExclusive=0),
  2282         "extract": GenerateIntegerExtraction(maxExclusive=0),
  2282         "facets": DECIMAL_FACETS,
  2283         "facets": DECIMAL_FACETS,
  2283         "generate": GenerateSimpleTypeXMLText(str),
  2284         "generate": GenerateSimpleTypeXMLText(str),
  2284         "initial": lambda: -1,
  2285         "initial": lambda: -1,
  2285         "check": lambda x: isinstance(x, IntType)
  2286         "check": lambda x: isinstance(x, int)
  2286     },
  2287     },
  2287 
  2288 
  2288     "nonNegativeInteger": {
  2289     "nonNegativeInteger": {
  2289         "type": SIMPLETYPE,
  2290         "type": SIMPLETYPE,
  2290         "basename": "nonNegativeInteger",
  2291         "basename": "nonNegativeInteger",
  2291         "extract": GenerateIntegerExtraction(minInclusive=0),
  2292         "extract": GenerateIntegerExtraction(minInclusive=0),
  2292         "facets": DECIMAL_FACETS,
  2293         "facets": DECIMAL_FACETS,
  2293         "generate": GenerateSimpleTypeXMLText(str),
  2294         "generate": GenerateSimpleTypeXMLText(str),
  2294         "initial": lambda: 0,
  2295         "initial": lambda: 0,
  2295         "check": lambda x: isinstance(x, IntType)
  2296         "check": lambda x: isinstance(x, int)
  2296     },
  2297     },
  2297 
  2298 
  2298     "nonPositiveInteger": {
  2299     "nonPositiveInteger": {
  2299         "type": SIMPLETYPE,
  2300         "type": SIMPLETYPE,
  2300         "basename": "nonPositiveInteger",
  2301         "basename": "nonPositiveInteger",
  2301         "extract": GenerateIntegerExtraction(maxInclusive=0),
  2302         "extract": GenerateIntegerExtraction(maxInclusive=0),
  2302         "facets": DECIMAL_FACETS,
  2303         "facets": DECIMAL_FACETS,
  2303         "generate": GenerateSimpleTypeXMLText(str),
  2304         "generate": GenerateSimpleTypeXMLText(str),
  2304         "initial": lambda: 0,
  2305         "initial": lambda: 0,
  2305         "check": lambda x: isinstance(x, IntType)
  2306         "check": lambda x: isinstance(x, int)
  2306     },
  2307     },
  2307 
  2308 
  2308     "long": {
  2309     "long": {
  2309         "type": SIMPLETYPE,
  2310         "type": SIMPLETYPE,
  2310         "basename": "long",
  2311         "basename": "long",
  2311         "extract": GenerateIntegerExtraction(minInclusive=-2**63, maxExclusive=2**63),
  2312         "extract": GenerateIntegerExtraction(minInclusive=-2**63, maxExclusive=2**63),
  2312         "facets": DECIMAL_FACETS,
  2313         "facets": DECIMAL_FACETS,
  2313         "generate": GenerateSimpleTypeXMLText(str),
  2314         "generate": GenerateSimpleTypeXMLText(str),
  2314         "initial": lambda: 0,
  2315         "initial": lambda: 0,
  2315         "check": lambda x: isinstance(x, IntType)
  2316         "check": lambda x: isinstance(x, int)
  2316     },
  2317     },
  2317 
  2318 
  2318     "unsignedLong": {
  2319     "unsignedLong": {
  2319         "type": SIMPLETYPE,
  2320         "type": SIMPLETYPE,
  2320         "basename": "unsignedLong",
  2321         "basename": "unsignedLong",
  2321         "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**64),
  2322         "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**64),
  2322         "facets": DECIMAL_FACETS,
  2323         "facets": DECIMAL_FACETS,
  2323         "generate": GenerateSimpleTypeXMLText(str),
  2324         "generate": GenerateSimpleTypeXMLText(str),
  2324         "initial": lambda: 0,
  2325         "initial": lambda: 0,
  2325         "check": lambda x: isinstance(x, IntType)
  2326         "check": lambda x: isinstance(x, int)
  2326     },
  2327     },
  2327 
  2328 
  2328     "int": {
  2329     "int": {
  2329         "type": SIMPLETYPE,
  2330         "type": SIMPLETYPE,
  2330         "basename": "int",
  2331         "basename": "int",
  2331         "extract": GenerateIntegerExtraction(minInclusive=-2**31, maxExclusive=2**31),
  2332         "extract": GenerateIntegerExtraction(minInclusive=-2**31, maxExclusive=2**31),
  2332         "facets": DECIMAL_FACETS,
  2333         "facets": DECIMAL_FACETS,
  2333         "generate": GenerateSimpleTypeXMLText(str),
  2334         "generate": GenerateSimpleTypeXMLText(str),
  2334         "initial": lambda: 0,
  2335         "initial": lambda: 0,
  2335         "check": lambda x: isinstance(x, IntType)
  2336         "check": lambda x: isinstance(x, int)
  2336     },
  2337     },
  2337 
  2338 
  2338     "unsignedInt": {
  2339     "unsignedInt": {
  2339         "type": SIMPLETYPE,
  2340         "type": SIMPLETYPE,
  2340         "basename": "unsignedInt",
  2341         "basename": "unsignedInt",
  2341         "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**32),
  2342         "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**32),
  2342         "facets": DECIMAL_FACETS,
  2343         "facets": DECIMAL_FACETS,
  2343         "generate": GenerateSimpleTypeXMLText(str),
  2344         "generate": GenerateSimpleTypeXMLText(str),
  2344         "initial": lambda: 0,
  2345         "initial": lambda: 0,
  2345         "check": lambda x: isinstance(x, IntType)
  2346         "check": lambda x: isinstance(x, int)
  2346     },
  2347     },
  2347 
  2348 
  2348     "short": {
  2349     "short": {
  2349         "type": SIMPLETYPE,
  2350         "type": SIMPLETYPE,
  2350         "basename": "short",
  2351         "basename": "short",
  2351         "extract": GenerateIntegerExtraction(minInclusive=-2**15, maxExclusive=2**15),
  2352         "extract": GenerateIntegerExtraction(minInclusive=-2**15, maxExclusive=2**15),
  2352         "facets": DECIMAL_FACETS,
  2353         "facets": DECIMAL_FACETS,
  2353         "generate": GenerateSimpleTypeXMLText(str),
  2354         "generate": GenerateSimpleTypeXMLText(str),
  2354         "initial": lambda: 0,
  2355         "initial": lambda: 0,
  2355         "check": lambda x: isinstance(x, IntType)
  2356         "check": lambda x: isinstance(x, int)
  2356     },
  2357     },
  2357 
  2358 
  2358     "unsignedShort": {
  2359     "unsignedShort": {
  2359         "type": SIMPLETYPE,
  2360         "type": SIMPLETYPE,
  2360         "basename": "unsignedShort",
  2361         "basename": "unsignedShort",
  2361         "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**16),
  2362         "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**16),
  2362         "facets": DECIMAL_FACETS,
  2363         "facets": DECIMAL_FACETS,
  2363         "generate": GenerateSimpleTypeXMLText(str),
  2364         "generate": GenerateSimpleTypeXMLText(str),
  2364         "initial": lambda: 0,
  2365         "initial": lambda: 0,
  2365         "check": lambda x: isinstance(x, IntType)
  2366         "check": lambda x: isinstance(x, int)
  2366     },
  2367     },
  2367 
  2368 
  2368     "byte": {
  2369     "byte": {
  2369         "type": SIMPLETYPE,
  2370         "type": SIMPLETYPE,
  2370         "basename": "byte",
  2371         "basename": "byte",
  2371         "extract": GenerateIntegerExtraction(minInclusive=-2**7, maxExclusive=2**7),
  2372         "extract": GenerateIntegerExtraction(minInclusive=-2**7, maxExclusive=2**7),
  2372         "facets": DECIMAL_FACETS,
  2373         "facets": DECIMAL_FACETS,
  2373         "generate": GenerateSimpleTypeXMLText(str),
  2374         "generate": GenerateSimpleTypeXMLText(str),
  2374         "initial": lambda: 0,
  2375         "initial": lambda: 0,
  2375         "check": lambda x: isinstance(x, IntType)
  2376         "check": lambda x: isinstance(x, int)
  2376     },
  2377     },
  2377 
  2378 
  2378     "unsignedByte": {
  2379     "unsignedByte": {
  2379         "type": SIMPLETYPE,
  2380         "type": SIMPLETYPE,
  2380         "basename": "unsignedByte",
  2381         "basename": "unsignedByte",
  2381         "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**8),
  2382         "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**8),
  2382         "facets": DECIMAL_FACETS,
  2383         "facets": DECIMAL_FACETS,
  2383         "generate": GenerateSimpleTypeXMLText(str),
  2384         "generate": GenerateSimpleTypeXMLText(str),
  2384         "initial": lambda: 0,
  2385         "initial": lambda: 0,
  2385         "check": lambda x: isinstance(x, IntType)
  2386         "check": lambda x: isinstance(x, int)
  2386     },
  2387     },
  2387 
  2388 
  2388     "decimal": {
  2389     "decimal": {
  2389         "type": SIMPLETYPE,
  2390         "type": SIMPLETYPE,
  2390         "basename": "decimal",
  2391         "basename": "decimal",
  2391         "extract": GenerateFloatExtraction("decimal"),
  2392         "extract": GenerateFloatExtraction("decimal"),
  2392         "facets": DECIMAL_FACETS,
  2393         "facets": DECIMAL_FACETS,
  2393         "generate": GenerateFloatXMLText(decimal=3),
  2394         "generate": GenerateFloatXMLText(decimal=3),
  2394         "initial": lambda: 0.,
  2395         "initial": lambda: 0.,
  2395         "check": lambda x: isinstance(x, (IntType, FloatType))
  2396         "check": lambda x: isinstance(x, (int, float))
  2396     },
  2397     },
  2397 
  2398 
  2398     "float": {
  2399     "float": {
  2399         "type": SIMPLETYPE,
  2400         "type": SIMPLETYPE,
  2400         "basename": "float",
  2401         "basename": "float",
  2401         "extract": GenerateFloatExtraction("float", ["INF", "-INF", "NaN"]),
  2402         "extract": GenerateFloatExtraction("float", ["INF", "-INF", "NaN"]),
  2402         "facets": NUMBER_FACETS,
  2403         "facets": NUMBER_FACETS,
  2403         "generate": GenerateFloatXMLText(["INF", "-INF", "NaN"]),
  2404         "generate": GenerateFloatXMLText(["INF", "-INF", "NaN"]),
  2404         "initial": lambda: 0.,
  2405         "initial": lambda: 0.,
  2405         "check": lambda x: {"INF": True, "-INF": True, "NaN": True}.get(x, isinstance(x, (IntType, FloatType)))
  2406         "check": lambda x: {"INF": True, "-INF": True, "NaN": True}.get(x, isinstance(x, (int, float)))
  2406     },
  2407     },
  2407 
  2408 
  2408     "double": {
  2409     "double": {
  2409         "type": SIMPLETYPE,
  2410         "type": SIMPLETYPE,
  2410         "basename": "double",
  2411         "basename": "double",
  2411         "extract": GenerateFloatExtraction("double", ["INF", "-INF", "NaN"]),
  2412         "extract": GenerateFloatExtraction("double", ["INF", "-INF", "NaN"]),
  2412         "facets": NUMBER_FACETS,
  2413         "facets": NUMBER_FACETS,
  2413         "generate": GenerateFloatXMLText(["INF", "-INF", "NaN"]),
  2414         "generate": GenerateFloatXMLText(["INF", "-INF", "NaN"]),
  2414         "initial": lambda: 0.,
  2415         "initial": lambda: 0.,
  2415         "check": lambda x: {"INF": True, "-INF": True, "NaN": True}.get(x, isinstance(x, (IntType, FloatType)))
  2416         "check": lambda x: {"INF": True, "-INF": True, "NaN": True}.get(x, isinstance(x, (int, float)))
  2416     },
  2417     },
  2417 
  2418 
  2418     "boolean": {
  2419     "boolean": {
  2419         "type": SIMPLETYPE,
  2420         "type": SIMPLETYPE,
  2420         "basename": "boolean",
  2421         "basename": "boolean",
  2421         "extract": GetBoolean,
  2422         "extract": GetBoolean,
  2422         "facets": GenerateDictFacets(["pattern", "whiteSpace"]),
  2423         "facets": GenerateDictFacets(["pattern", "whiteSpace"]),
  2423         "generate": GenerateSimpleTypeXMLText(lambda x: {True: "true", False: "false"}[x]),
  2424         "generate": GenerateSimpleTypeXMLText(lambda x: {True: "true", False: "false"}[x]),
  2424         "initial": lambda: False,
  2425         "initial": lambda: False,
  2425         "check": lambda x: isinstance(x, BooleanType)
  2426         "check": lambda x: isinstance(x, bool)
  2426     },
  2427     },
  2427 
  2428 
  2428     "duration": {
  2429     "duration": {
  2429         "type": SIMPLETYPE,
  2430         "type": SIMPLETYPE,
  2430         "basename": "duration",
  2431         "basename": "duration",
  2431         "extract": NotSupportedYet("duration"),
  2432         "extract": NotSupportedYet("duration"),
  2432         "facets": NUMBER_FACETS,
  2433         "facets": NUMBER_FACETS,
  2433         "generate": GenerateSimpleTypeXMLText(str),
  2434         "generate": GenerateSimpleTypeXMLText(str),
  2434         "initial": lambda: "",
  2435         "initial": lambda: "",
  2435         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2436         "check": lambda x: isinstance(x, string_types)
  2436     },
  2437     },
  2437 
  2438 
  2438     "dateTime": {
  2439     "dateTime": {
  2439         "type": SIMPLETYPE,
  2440         "type": SIMPLETYPE,
  2440         "basename": "dateTime",
  2441         "basename": "dateTime",
  2470         "basename": "gYear",
  2471         "basename": "gYear",
  2471         "extract": NotSupportedYet("gYear"),
  2472         "extract": NotSupportedYet("gYear"),
  2472         "facets": NUMBER_FACETS,
  2473         "facets": NUMBER_FACETS,
  2473         "generate": GenerateSimpleTypeXMLText(str),
  2474         "generate": GenerateSimpleTypeXMLText(str),
  2474         "initial": lambda: "",
  2475         "initial": lambda: "",
  2475         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2476         "check": lambda x: isinstance(x, string_types)
  2476     },
  2477     },
  2477 
  2478 
  2478     "gYearMonth": {
  2479     "gYearMonth": {
  2479         "type": SIMPLETYPE,
  2480         "type": SIMPLETYPE,
  2480         "basename": "gYearMonth",
  2481         "basename": "gYearMonth",
  2481         "extract": NotSupportedYet("gYearMonth"),
  2482         "extract": NotSupportedYet("gYearMonth"),
  2482         "facets": NUMBER_FACETS,
  2483         "facets": NUMBER_FACETS,
  2483         "generate": GenerateSimpleTypeXMLText(str),
  2484         "generate": GenerateSimpleTypeXMLText(str),
  2484         "initial": lambda: "",
  2485         "initial": lambda: "",
  2485         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2486         "check": lambda x: isinstance(x, string_types)
  2486     },
  2487     },
  2487 
  2488 
  2488     "gMonth": {
  2489     "gMonth": {
  2489         "type": SIMPLETYPE,
  2490         "type": SIMPLETYPE,
  2490         "basename": "gMonth",
  2491         "basename": "gMonth",
  2491         "extract": NotSupportedYet("gMonth"),
  2492         "extract": NotSupportedYet("gMonth"),
  2492         "facets": NUMBER_FACETS,
  2493         "facets": NUMBER_FACETS,
  2493         "generate": GenerateSimpleTypeXMLText(str),
  2494         "generate": GenerateSimpleTypeXMLText(str),
  2494         "initial": lambda: "",
  2495         "initial": lambda: "",
  2495         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2496         "check": lambda x: isinstance(x, string_types)
  2496     },
  2497     },
  2497 
  2498 
  2498     "gMonthDay": {
  2499     "gMonthDay": {
  2499         "type": SIMPLETYPE,
  2500         "type": SIMPLETYPE,
  2500         "basename": "gMonthDay",
  2501         "basename": "gMonthDay",
  2501         "extract": NotSupportedYet("gMonthDay"),
  2502         "extract": NotSupportedYet("gMonthDay"),
  2502         "facets": NUMBER_FACETS,
  2503         "facets": NUMBER_FACETS,
  2503         "generate": GenerateSimpleTypeXMLText(str),
  2504         "generate": GenerateSimpleTypeXMLText(str),
  2504         "initial": lambda: "",
  2505         "initial": lambda: "",
  2505         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2506         "check": lambda x: isinstance(x, string_types)
  2506     },
  2507     },
  2507 
  2508 
  2508     "gDay": {
  2509     "gDay": {
  2509         "type": SIMPLETYPE,
  2510         "type": SIMPLETYPE,
  2510         "basename": "gDay",
  2511         "basename": "gDay",
  2511         "extract": NotSupportedYet("gDay"),
  2512         "extract": NotSupportedYet("gDay"),
  2512         "facets": NUMBER_FACETS,
  2513         "facets": NUMBER_FACETS,
  2513         "generate": GenerateSimpleTypeXMLText(str),
  2514         "generate": GenerateSimpleTypeXMLText(str),
  2514         "initial": lambda: "",
  2515         "initial": lambda: "",
  2515         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2516         "check": lambda x: isinstance(x, string_types)
  2516     },
  2517     },
  2517 
  2518 
  2518     "Name": {
  2519     "Name": {
  2519         "type": SIMPLETYPE,
  2520         "type": SIMPLETYPE,
  2520         "basename": "Name",
  2521         "basename": "Name",
  2521         "extract": GenerateModelNameExtraction("Name", Name_model),
  2522         "extract": GenerateModelNameExtraction("Name", Name_model),
  2522         "facets": STRING_FACETS,
  2523         "facets": STRING_FACETS,
  2523         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2524         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2524         "initial": lambda: "",
  2525         "initial": lambda: "",
  2525         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2526         "check": lambda x: isinstance(x, string_types)
  2526     },
  2527     },
  2527 
  2528 
  2528     "QName": {
  2529     "QName": {
  2529         "type": SIMPLETYPE,
  2530         "type": SIMPLETYPE,
  2530         "basename": "QName",
  2531         "basename": "QName",
  2531         "extract": GenerateModelNameExtraction("QName", QName_model),
  2532         "extract": GenerateModelNameExtraction("QName", QName_model),
  2532         "facets": STRING_FACETS,
  2533         "facets": STRING_FACETS,
  2533         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2534         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2534         "initial": lambda: "",
  2535         "initial": lambda: "",
  2535         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2536         "check": lambda x: isinstance(x, string_types)
  2536     },
  2537     },
  2537 
  2538 
  2538     "NCName": {
  2539     "NCName": {
  2539         "type": SIMPLETYPE,
  2540         "type": SIMPLETYPE,
  2540         "basename": "NCName",
  2541         "basename": "NCName",
  2541         "extract": GenerateModelNameExtraction("NCName", NCName_model),
  2542         "extract": GenerateModelNameExtraction("NCName", NCName_model),
  2542         "facets": STRING_FACETS,
  2543         "facets": STRING_FACETS,
  2543         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2544         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2544         "initial": lambda: "",
  2545         "initial": lambda: "",
  2545         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2546         "check": lambda x: isinstance(x, string_types)
  2546     },
  2547     },
  2547 
  2548 
  2548     "anyURI": {
  2549     "anyURI": {
  2549         "type": SIMPLETYPE,
  2550         "type": SIMPLETYPE,
  2550         "basename": "anyURI",
  2551         "basename": "anyURI",
  2551         "extract": GenerateModelNameExtraction("anyURI", URI_model),
  2552         "extract": GenerateModelNameExtraction("anyURI", URI_model),
  2552         "facets": STRING_FACETS,
  2553         "facets": STRING_FACETS,
  2553         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2554         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2554         "initial": lambda: "",
  2555         "initial": lambda: "",
  2555         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2556         "check": lambda x: isinstance(x, string_types)
  2556     },
  2557     },
  2557 
  2558 
  2558     "language": {
  2559     "language": {
  2559         "type": SIMPLETYPE,
  2560         "type": SIMPLETYPE,
  2560         "basename": "language",
  2561         "basename": "language",
  2561         "extract": GenerateModelNameExtraction("language", LANGUAGE_model),
  2562         "extract": GenerateModelNameExtraction("language", LANGUAGE_model),
  2562         "facets": STRING_FACETS,
  2563         "facets": STRING_FACETS,
  2563         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2564         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2564         "initial": lambda: "en",
  2565         "initial": lambda: "en",
  2565         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2566         "check": lambda x: isinstance(x, string_types)
  2566     },
  2567     },
  2567 
  2568 
  2568     "ID": {
  2569     "ID": {
  2569         "type": SIMPLETYPE,
  2570         "type": SIMPLETYPE,
  2570         "basename": "ID",
  2571         "basename": "ID",
  2571         "extract": GenerateModelNameExtraction("ID", Name_model),
  2572         "extract": GenerateModelNameExtraction("ID", Name_model),
  2572         "facets": STRING_FACETS,
  2573         "facets": STRING_FACETS,
  2573         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2574         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2574         "initial": lambda: "",
  2575         "initial": lambda: "",
  2575         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2576         "check": lambda x: isinstance(x, string_types)
  2576     },
  2577     },
  2577 
  2578 
  2578     "IDREF": {
  2579     "IDREF": {
  2579         "type": SIMPLETYPE,
  2580         "type": SIMPLETYPE,
  2580         "basename": "IDREF",
  2581         "basename": "IDREF",
  2581         "extract": GenerateModelNameExtraction("IDREF", Name_model),
  2582         "extract": GenerateModelNameExtraction("IDREF", Name_model),
  2582         "facets": STRING_FACETS,
  2583         "facets": STRING_FACETS,
  2583         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2584         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2584         "initial": lambda: "",
  2585         "initial": lambda: "",
  2585         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2586         "check": lambda x: isinstance(x, string_types)
  2586     },
  2587     },
  2587 
  2588 
  2588     "IDREFS": {
  2589     "IDREFS": {
  2589         "type": SIMPLETYPE,
  2590         "type": SIMPLETYPE,
  2590         "basename": "IDREFS",
  2591         "basename": "IDREFS",
  2591         "extract": GenerateModelNameExtraction("IDREFS", Names_model),
  2592         "extract": GenerateModelNameExtraction("IDREFS", Names_model),
  2592         "facets": STRING_FACETS,
  2593         "facets": STRING_FACETS,
  2593         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2594         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2594         "initial": lambda: "",
  2595         "initial": lambda: "",
  2595         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2596         "check": lambda x: isinstance(x, string_types)
  2596     },
  2597     },
  2597 
  2598 
  2598     "ENTITY": {
  2599     "ENTITY": {
  2599         "type": SIMPLETYPE,
  2600         "type": SIMPLETYPE,
  2600         "basename": "ENTITY",
  2601         "basename": "ENTITY",
  2601         "extract": GenerateModelNameExtraction("ENTITY", Name_model),
  2602         "extract": GenerateModelNameExtraction("ENTITY", Name_model),
  2602         "facets": STRING_FACETS,
  2603         "facets": STRING_FACETS,
  2603         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2604         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2604         "initial": lambda: "",
  2605         "initial": lambda: "",
  2605         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2606         "check": lambda x: isinstance(x, string_types)
  2606     },
  2607     },
  2607 
  2608 
  2608     "ENTITIES": {
  2609     "ENTITIES": {
  2609         "type": SIMPLETYPE,
  2610         "type": SIMPLETYPE,
  2610         "basename": "ENTITIES",
  2611         "basename": "ENTITIES",
  2611         "extract": GenerateModelNameExtraction("ENTITIES", Names_model),
  2612         "extract": GenerateModelNameExtraction("ENTITIES", Names_model),
  2612         "facets": STRING_FACETS,
  2613         "facets": STRING_FACETS,
  2613         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2614         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2614         "initial": lambda: "",
  2615         "initial": lambda: "",
  2615         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2616         "check": lambda x: isinstance(x, string_types)
  2616     },
  2617     },
  2617 
  2618 
  2618     "NOTATION": {
  2619     "NOTATION": {
  2619         "type": SIMPLETYPE,
  2620         "type": SIMPLETYPE,
  2620         "basename": "NOTATION",
  2621         "basename": "NOTATION",
  2621         "extract": GenerateModelNameExtraction("NOTATION", Name_model),
  2622         "extract": GenerateModelNameExtraction("NOTATION", Name_model),
  2622         "facets": STRING_FACETS,
  2623         "facets": STRING_FACETS,
  2623         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2624         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2624         "initial": lambda: "",
  2625         "initial": lambda: "",
  2625         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2626         "check": lambda x: isinstance(x, string_types)
  2626     },
  2627     },
  2627 
  2628 
  2628     "NMTOKEN": {
  2629     "NMTOKEN": {
  2629         "type": SIMPLETYPE,
  2630         "type": SIMPLETYPE,
  2630         "basename": "NMTOKEN",
  2631         "basename": "NMTOKEN",
  2631         "extract": GenerateModelNameExtraction("NMTOKEN", NMToken_model),
  2632         "extract": GenerateModelNameExtraction("NMTOKEN", NMToken_model),
  2632         "facets": STRING_FACETS,
  2633         "facets": STRING_FACETS,
  2633         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2634         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2634         "initial": lambda: "",
  2635         "initial": lambda: "",
  2635         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2636         "check": lambda x: isinstance(x, string_types)
  2636     },
  2637     },
  2637 
  2638 
  2638     "NMTOKENS": {
  2639     "NMTOKENS": {
  2639         "type": SIMPLETYPE,
  2640         "type": SIMPLETYPE,
  2640         "basename": "NMTOKENS",
  2641         "basename": "NMTOKENS",
  2641         "extract": GenerateModelNameExtraction("NMTOKENS", NMTokens_model),
  2642         "extract": GenerateModelNameExtraction("NMTOKENS", NMTokens_model),
  2642         "facets": STRING_FACETS,
  2643         "facets": STRING_FACETS,
  2643         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2644         "generate": GenerateSimpleTypeXMLText(lambda x: x),
  2644         "initial": lambda: "",
  2645         "initial": lambda: "",
  2645         "check": lambda x: isinstance(x, (StringType, UnicodeType))
  2646         "check": lambda x: isinstance(x, string_types)
  2646     },
  2647     },
  2647 
  2648 
  2648     # Complex Types
  2649     # Complex Types
  2649     "anyType": {"type": COMPLEXTYPE, "extract": lambda x: None},
  2650     "anyType": {"type": COMPLEXTYPE, "extract": lambda x: None},
  2650 }
  2651 }