diff options
author | Daniel Veillard <veillard@src.gnome.org> | 2005-03-30 22:47:10 +0000 |
---|---|---|
committer | Daniel Veillard <veillard@src.gnome.org> | 2005-03-30 22:47:10 +0000 |
commit | 0e460da346bfb2cc9d5d6cb4be8f851c18bfb81e (patch) | |
tree | 3f0e29bb120f40ec8dd280274a2bf00c3f7a6273 /python | |
parent | bb8502c0ef2af706fbdff69119e994e40da64a88 (diff) | |
download | libxml2-0e460da346bfb2cc9d5d6cb4be8f851c18bfb81e.tar.gz |
another patch from Brent Hendricks to add new handlers with the various
* python/generator.py python/libxml.py: another patch from Brent
Hendricks to add new handlers with the various validity contexts
* python/tests/Makefile.am python/tests/validDTD.py
python/tests/validRNG.py python/tests/validSchemas.py: also
added the regression tests he provided
Daniel
Diffstat (limited to 'python')
-rwxr-xr-x | python/generator.py | 3 | ||||
-rw-r--r-- | python/libxml.py | 39 | ||||
-rw-r--r-- | python/libxml2class.txt | 12 | ||||
-rw-r--r-- | python/tests/Makefile.am | 5 | ||||
-rwxr-xr-x | python/tests/validDTD.py | 59 | ||||
-rwxr-xr-x | python/tests/validRNG.py | 76 | ||||
-rwxr-xr-x | python/tests/validSchemas.py | 83 |
7 files changed, 273 insertions, 4 deletions
diff --git a/python/generator.py b/python/generator.py index 0856d76d..6144e549 100755 --- a/python/generator.py +++ b/python/generator.py @@ -747,6 +747,9 @@ classes_ancestor = { "inputBuffer": "ioReadWrapper", "parserCtxt": "parserCtxtCore", "xmlTextReader": "xmlTextReaderCore", + "ValidCtxt": "ValidCtxtCore", + "SchemaValidCtxt": "SchemaValidCtxtCore", + "relaxNgValidCtxt": "relaxNgValidCtxtCore", } classes_destructors = { "parserCtxt": "xmlFreeParserCtxt", diff --git a/python/libxml.py b/python/libxml.py index bde8aba4..2eca71e8 100644 --- a/python/libxml.py +++ b/python/libxml.py @@ -587,6 +587,45 @@ class parserCtxtCore: return libxml2mod.addLocalCatalog(self._o, uri) +class ValidCtxtCore: + + def __init__(self, *args, **kw): + pass + + def setValidityErrorHandler(self, err_func, warn_func, arg=None): + """ + Register error and warning handlers for DTD validation. + These will be called back as f(msg,arg) + """ + libxml2mod.xmlSetValidErrors(self._o, err_func, warn_func, arg) + + +class SchemaValidCtxtCore: + + def __init__(self, *args, **kw): + pass + + def setValidityErrorHandler(self, err_func, warn_func, arg=None): + """ + Register error and warning handlers for Schema validation. + These will be called back as f(msg,arg) + """ + libxml2mod.xmlSchemaSetValidErrors(self._o, err_func, warn_func, arg) + + +class relaxNgValidCtxtCore: + + def __init__(self, *args, **kw): + pass + + def setValidityErrorHandler(self, err_func, warn_func, arg=None): + """ + Register error and warning handlers for RelaxNG validation. + These will be called back as f(msg,arg) + """ + libxml2mod.xmlRelaxNGSetValidErrors(self._o, err_func, warn_func, arg) + + def _xmlTextReaderErrorFunc((f,arg),msg,severity,locator): """Intermediate callback to wrap the locator""" return f(arg,msg,severity,xmlTextReaderLocator(locator)) diff --git a/python/libxml2class.txt b/python/libxml2class.txt index f8146897..c8a2de1f 100644 --- a/python/libxml2class.txt +++ b/python/libxml2class.txt @@ -694,7 +694,9 @@ Class xmlReg() regexpExec() regexpIsDeterminist() regexpPrint() -Class relaxNgValidCtxt() + + +Class relaxNgValidCtxt(relaxNgValidCtxtCore) # functions from module relaxng relaxNGValidateDoc() @@ -885,7 +887,9 @@ Class SchemaParserCtxt() # functions from module xmlschemas schemaParse() -Class ValidCtxt() + + +Class ValidCtxt(ValidCtxtCore) # functions from module valid validCtxtNormalizeAttributeValue() @@ -1111,7 +1115,9 @@ Class inputBuffer(ioReadWrapper) # functions from module xmlreader newTextReader() -Class SchemaValidCtxt() + + +Class SchemaValidCtxt(SchemaValidCtxtCore) # functions from module xmlschemas schemaSetValidOptions() diff --git a/python/tests/Makefile.am b/python/tests/Makefile.am index f41cd6d1..c6d03e99 100644 --- a/python/tests/Makefile.am +++ b/python/tests/Makefile.am @@ -39,7 +39,10 @@ PYTESTS= \ tstLastError.py \ indexes.py \ dtdvalid.py \ - tstmem.py + tstmem.py \ + validDTD.py \ + validSchemas.py \ + validRNG.py XMLS= \ tst.xml \ diff --git a/python/tests/validDTD.py b/python/tests/validDTD.py new file mode 100755 index 00000000..1222f9fb --- /dev/null +++ b/python/tests/validDTD.py @@ -0,0 +1,59 @@ +#!/usr/bin/python -u +import libxml2 +import sys + +ARG = 'test string' + +class ErrorHandler: + + def __init__(self): + self.errors = [] + + def handler(self, msg, data): + if data != ARG: + raise Exception, "Error handler did not receive correct argument" + self.errors.append(msg) + + +# Memory debug specific +libxml2.debugMemory(1) + +dtd="""<!ELEMENT foo EMPTY>""" +valid="""<?xml version="1.0"?> +<foo></foo>""" + +invalid="""<?xml version="1.0"?> +<foo><bar/></foo>""" + +dtd = libxml2.parseDTD(None, 'test.dtd') +ctxt = libxml2.newValidCtxt() +e = ErrorHandler() +ctxt.setValidityErrorHandler(e.handler, e.handler, ARG) + +# Test valid document +doc = libxml2.parseDoc(valid) +ret = doc.validateDtd(ctxt, dtd) +if ret != 1 or e.errors: + print "error doing DTD validation" + sys.exit(1) +doc.freeDoc() + +# Test invalid document +doc = libxml2.parseDoc(invalid) +ret = doc.validateDtd(ctxt, dtd) +if ret != 0 or not e.errors: + print "Error: document supposed to be invalid" +doc.freeDoc() + +dtd.freeDtd() +del dtd +del ctxt + +# Memory debug specific +libxml2.cleanupParser() +if libxml2.debugMemory(1) == 0: + print "OK" +else: + print "Memory leak %d bytes" % (libxml2.debugMemory(1)) + libxml2.dumpMemory() + diff --git a/python/tests/validRNG.py b/python/tests/validRNG.py new file mode 100755 index 00000000..7022efe9 --- /dev/null +++ b/python/tests/validRNG.py @@ -0,0 +1,76 @@ +#!/usr/bin/python -u +import libxml2 +import sys + +ARG = 'test string' + +class ErrorHandler: + + def __init__(self): + self.errors = [] + + def handler(self, msg, data): + if data != ARG: + raise Exception, "Error handler did not receive correct argument" + self.errors.append(msg) + +# Memory debug specific +libxml2.debugMemory(1) + +schema="""<?xml version="1.0"?> +<element name="foo" + xmlns="http://relaxng.org/ns/structure/1.0" + xmlns:a="http://relaxng.org/ns/annotation/1.0" + xmlns:ex1="http://www.example.com/n1" + xmlns:ex2="http://www.example.com/n2"> + <a:documentation>A foo element.</a:documentation> + <element name="ex1:bar1"> + <empty/> + </element> + <element name="ex2:bar2"> + <empty/> + </element> +</element> +""" + +valid="""<?xml version="1.0"?> +<foo><pre1:bar1 xmlns:pre1="http://www.example.com/n1"/><pre2:bar2 xmlns:pre2="http://www.example.com/n2"/></foo>""" + +invalid="""<?xml version="1.0"?> +<foo><pre1:bar1 xmlns:pre1="http://www.example.com/n1">bad</pre1:bar1><pre2:bar2 xmlns:pre2="http://www.example.com/n2"/></foo>""" + +rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) +rngs = rngp.relaxNGParse() +ctxt = rngs.relaxNGNewValidCtxt() +e = ErrorHandler() +ctxt.setValidityErrorHandler(e.handler, e.handler, ARG) + +# Test valid document +doc = libxml2.parseDoc(valid) +ret = doc.relaxNGValidateDoc(ctxt) +if ret != 0 or e.errors: + print "error doing RelaxNG validation" + sys.exit(1) +doc.freeDoc() + +# Test invalid document +doc = libxml2.parseDoc(invalid) +ret = doc.relaxNGValidateDoc(ctxt) +if ret == 0 or not e.errors: + print "Error: document supposed to be RelaxNG invalid" + sys.exit(1) +doc.freeDoc() + +del rngp +del rngs +del ctxt +libxml2.relaxNGCleanupTypes() + +# Memory debug specific +libxml2.cleanupParser() +if libxml2.debugMemory(1) == 0: + print "OK" +else: + print "Memory leak %d bytes" % (libxml2.debugMemory(1)) + libxml2.dumpMemory() + diff --git a/python/tests/validSchemas.py b/python/tests/validSchemas.py new file mode 100755 index 00000000..d4d62b24 --- /dev/null +++ b/python/tests/validSchemas.py @@ -0,0 +1,83 @@ +#!/usr/bin/python -u +import libxml2 +import sys + +ARG = 'test string' + +class ErrorHandler: + + def __init__(self): + self.errors = [] + + def handler(self, msg, data): + if data != ARG: + raise Exception, "Error handler did not receive correct argument" + self.errors.append(msg) + +# Memory debug specific +libxml2.debugMemory(1) + +schema="""<?xml version="1.0" encoding="iso-8859-1"?> +<schema xmlns = "http://www.w3.org/2001/XMLSchema"> + <element name = "Customer"> + <complexType> + <sequence> + <element name = "FirstName" type = "string" /> + <element name = "MiddleInitial" type = "string" /> + <element name = "LastName" type = "string" /> + </sequence> + <attribute name = "customerID" type = "integer" /> + </complexType> + </element> +</schema>""" + +valid="""<?xml version="1.0" encoding="iso-8859-1"?> +<Customer customerID = "24332"> + <FirstName>Raymond</FirstName> + <MiddleInitial>G</MiddleInitial> + <LastName>Bayliss</LastName> +</Customer> +""" + +invalid="""<?xml version="1.0" encoding="iso-8859-1"?> +<Customer customerID = "24332"> + <MiddleInitial>G</MiddleInitial> + <LastName>Bayliss</LastName> +</Customer> +""" + +e = ErrorHandler() +ctxt_parser = libxml2.schemaNewMemParserCtxt(schema, len(schema)) +ctxt_schema = ctxt_parser.schemaParse() +ctxt_valid = ctxt_schema.schemaNewValidCtxt() +ctxt_valid.setValidityErrorHandler(e.handler, e.handler, ARG) + +# Test valid document +doc = libxml2.parseDoc(valid) +ret = doc.schemaValidateDoc(ctxt_valid) +if ret != 0 or e.errors: + print "error doing schema validation" + sys.exit(1) +doc.freeDoc() + +# Test invalid document +doc = libxml2.parseDoc(invalid) +ret = doc.schemaValidateDoc(ctxt_valid) +if ret == 0 or not e.errors: + print "Error: document supposer to be schema invalid" + sys.exit(1) +doc.freeDoc() + +del ctxt_parser +del ctxt_schema +del ctxt_valid +libxml2.schemaCleanupTypes() + +# Memory debug specific +libxml2.cleanupParser() +if libxml2.debugMemory(1) == 0: + print "OK" +else: + print "Memory leak %d bytes" % (libxml2.debugMemory(1)) + libxml2.dumpMemory() + |