summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2019-05-06 22:29:22 +0200
committerStefan Behnel <stefan_ml@behnel.de>2019-05-06 22:29:22 +0200
commitbb2a4fd588d1cdf5ecd9badd618505d578ea2942 (patch)
tree626238d4951f109b6dea39641f20540af322d8dd
parent3f0db5d57940eebd418fe86bcbdad39ffe23211d (diff)
downloadpython-lxml-bb2a4fd588d1cdf5ecd9badd618505d578ea2942.tar.gz
LP#1827833: Fix .rnc parsing support with recent versions of rnc2rng.
-rw-r--r--.travis.yml2
-rw-r--r--CHANGES.txt3
-rw-r--r--src/lxml/relaxng.pxi19
-rw-r--r--src/lxml/tests/test_relaxng.py13
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():