diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2019-05-06 22:29:22 +0200 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2019-05-06 22:29:22 +0200 |
commit | bb2a4fd588d1cdf5ecd9badd618505d578ea2942 (patch) | |
tree | 626238d4951f109b6dea39641f20540af322d8dd | |
parent | 3f0db5d57940eebd418fe86bcbdad39ffe23211d (diff) | |
download | python-lxml-bb2a4fd588d1cdf5ecd9badd618505d578ea2942.tar.gz |
LP#1827833: Fix .rnc parsing support with recent versions of rnc2rng.
-rw-r--r-- | .travis.yml | 2 | ||||
-rw-r--r-- | CHANGES.txt | 3 | ||||
-rw-r--r-- | src/lxml/relaxng.pxi | 19 | ||||
-rw-r--r-- | src/lxml/tests/test_relaxng.py | 13 |
4 files changed, 21 insertions, 16 deletions
diff --git a/.travis.yml b/.travis.yml index fb9c3458..339b2f08 100644 --- a/.travis.yml +++ b/.travis.yml @@ -70,7 +70,7 @@ install: then pip install --install-option=--no-cython-compile https://github.com/cython/cython/archive/master.zip; else pip install -r requirements.txt; fi - - pip install -U beautifulsoup4 cssselect html5lib ${EXTRA_DEPS} + - pip install -U beautifulsoup4 cssselect html5lib rnc2rng ${EXTRA_DEPS} script: - CFLAGS="-O0 -g -fPIC" python -u setup.py build_ext --inplace diff --git a/CHANGES.txt b/CHANGES.txt index 55e67926..86fe0982 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -62,6 +62,9 @@ Bugs fixed ``start`` elements. Also, when walking an ElementTree (as opposed to its root element), comments and PIs outside of the root element are now reported. +* LP#1827833: The RelaxNG compact syntax support was broken with recent versions + of ``rnc2rng``. + * LP#1758553: The HTML elements ``source`` and ``track`` were added to the list of empty tags in ``lxml.html.defs``. diff --git a/src/lxml/relaxng.pxi b/src/lxml/relaxng.pxi index 2adc507f..d161ce46 100644 --- a/src/lxml/relaxng.pxi +++ b/src/lxml/relaxng.pxi @@ -57,11 +57,9 @@ cdef class RelaxNG(_Validator): if _isString(file): if file[-4:].lower() == '.rnc': _require_rnc2rng() - rng_data = _rnc2rng.dumps(_rnc2rng.load(file)) - doc = _parseMemoryDocument(rng_data, parser=None, url=None) - root_node = doc.getroot() - fake_c_doc = _fakeRootDoc(doc._c_doc, root_node._c_node) - parser_ctxt = relaxng.xmlRelaxNGNewDocParserCtxt(fake_c_doc) + rng_data_utf8 = _utf8(_rnc2rng.dumps(_rnc2rng.load(file))) + doc = _parseMemoryDocument(rng_data_utf8, parser=None, url=file) + parser_ctxt = relaxng.xmlRelaxNGNewDocParserCtxt(doc._c_doc) else: doc = None filename = _encodeFilename(file) @@ -69,11 +67,10 @@ cdef class RelaxNG(_Validator): parser_ctxt = relaxng.xmlRelaxNGNewParserCtxt(_cstr(filename)) elif (_getFilenameForFile(file) or '')[-4:].lower() == '.rnc': _require_rnc2rng() - rng_data = _rnc2rng.dumps(_rnc2rng.load(file)) - doc = _parseMemoryDocument(rng_data, parser=None, url=None) - root_node = doc.getroot() - fake_c_doc = _fakeRootDoc(doc._c_doc, root_node._c_node) - parser_ctxt = relaxng.xmlRelaxNGNewDocParserCtxt(fake_c_doc) + rng_data_utf8 = _utf8(_rnc2rng.dumps(_rnc2rng.load(file))) + doc = _parseMemoryDocument( + rng_data_utf8, parser=None, url=_getFilenameForFile(file)) + parser_ctxt = relaxng.xmlRelaxNGNewDocParserCtxt(doc._c_doc) else: doc = _parseDocument(file, parser=None, base_url=None) parser_ctxt = relaxng.xmlRelaxNGNewDocParserCtxt(doc._c_doc) @@ -160,5 +157,5 @@ cdef class RelaxNG(_Validator): will enable resolving resource references relative to the source. """ _require_rnc2rng() - rng_str = _rnc2rng.dumps(_rnc2rng.loads(src)) + rng_str = utf8(_rnc2rng.dumps(_rnc2rng.loads(src))) return cls(_parseMemoryDocument(rng_str, parser=None, url=base_url)) diff --git a/src/lxml/tests/test_relaxng.py b/src/lxml/tests/test_relaxng.py index 62811c95..3eae4b23 100644 --- a/src/lxml/tests/test_relaxng.py +++ b/src/lxml/tests/test_relaxng.py @@ -218,6 +218,7 @@ class ETreeRelaxNGTestCase(HelperTestCase): self.assertTrue(schema.validate(b_tree)) self.assertFalse(schema.error_log.filter_from_errors()) + class RelaxNGCompactTestCase(HelperTestCase): pytestmark = skipif('rnc2rng is None') @@ -230,17 +231,21 @@ class RelaxNGCompactTestCase(HelperTestCase): self.assertFalse(schema.validate(tree_invalid)) def test_relaxng_compact_file_obj(self): - f = open(fileInTestDir('test.rnc'), 'rb') - try: + with open(fileInTestDir('test.rnc'), 'r') as f: schema = etree.RelaxNG(file=f) - finally: - f.close() + + tree_valid = self.parse('<a><b>B</b><c>C</c></a>') + tree_invalid = self.parse('<a><b></b></a>') + self.assertTrue(schema.validate(tree_valid)) + self.assertFalse(schema.validate(tree_invalid)) def test_relaxng_compact_str(self): tree_valid = self.parse('<a><b>B</b></a>') + tree_invalid = self.parse('<a><b>X</b></a>') rnc_str = 'element a { element b { "B" } }' schema = etree.RelaxNG.from_rnc_string(rnc_str) self.assertTrue(schema.validate(tree_valid)) + self.assertFalse(schema.validate(tree_invalid)) def test_suite(): |