Skip to content

Commit cc20004

Browse files
author
Arzaroth Lekva
committed
finalize merge pr #4
1 parent 8632c46 commit cc20004

6 files changed

Lines changed: 49 additions & 86 deletions

File tree

rapidxml/c_ext/src/document_object.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ static void rapidxml_DocumentObject_dealloc(rapidxml_DocumentObject* self) {
2525

2626
static int _parse(rapidxml_DocumentObject* self,
2727
Py_buffer* text_buff,
28-
bool from_file, bool parse_cdata=false) {
28+
bool from_file,
29+
bool parse_cdata) {
2930
const char* text;
3031
std::vector<char> text_vector;
3132

@@ -43,17 +44,14 @@ static int _parse(rapidxml_DocumentObject* self,
4344
}
4445
try {
4546
self->base.base.document->clear();
46-
if (!parse_cdata){
47-
(self->base.base.document
48-
->parse<rapidxml::parse_no_utf8 | rapidxml::parse_no_data_nodes>)
49-
(self->base.base.document->allocate_string(text));
50-
51-
}else{
52-
(self->base.base.document
53-
->parse<rapidxml::parse_declaration_node>)
54-
(self->base.base.document->allocate_string(text));
55-
}
56-
47+
char* data = self->base.base.document->allocate_string(text);
48+
if (!parse_cdata) {
49+
(self->base.base.document
50+
->parse<rapidxml::parse_no_utf8 | rapidxml::parse_no_data_nodes>)(data);
51+
} else {
52+
(self->base.base.document
53+
->parse<rapidxml::parse_declaration_node>)(data);
54+
}
5755
} catch (rapidxml::parse_error &e) {
5856
PyErr_SetString(rapidxml_RapidXmlError, e.what());
5957
return 0;
@@ -78,7 +76,8 @@ static PyObject* rapidxml_DocumentObject_parse(rapidxml_DocumentObject* self,
7876
}
7977

8078
if (!_parse(self, &text_buff,
81-
(from_file_obj != NULL) && PyObject_IsTrue(from_file_obj), (read_cdata != NULL) && PyObject_IsTrue(read_cdata))) {
79+
(from_file_obj != NULL) && PyObject_IsTrue(from_file_obj),
80+
(read_cdata != NULL) && PyObject_IsTrue(read_cdata))) {
8281
return NULL;
8382
}
8483
Py_INCREF(Py_None);
@@ -106,7 +105,10 @@ static int rapidxml_DocumentObject_init(rapidxml_DocumentObject* self,
106105
self->base.base.underlying_obj = new rapidxml::xml_document<>();
107106
self->base.base.document = static_cast<rapidxml::xml_document<>*>(self->base.base.underlying_obj);
108107
if (text_buff.buf) {
109-
return _parse(self, &text_buff, (from_file_obj != NULL) && PyObject_IsTrue(from_file_obj), (read_cdata != NULL) && PyObject_IsTrue(read_cdata)) - 1;
108+
return (_parse(self, &text_buff,
109+
(from_file_obj != NULL) && PyObject_IsTrue(from_file_obj),
110+
(read_cdata != NULL) && PyObject_IsTrue(read_cdata))
111+
- 1);
110112
}
111113
return 0;
112114
}

rapidxml/rapidxml.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,11 @@ def __init__(self,
101101
attribute_prefix='@',
102102
cdata_key='#text',
103103
always_aslist=False,
104-
parse_cdata=False):
104+
parse_cdata=False):
105105
DictNode.__init__(self, attribute_prefix, cdata_key, always_aslist)
106106
rapidxml.c_ext.Document.__init__(self, text, from_file, parse_cdata)
107107

108108
def allocate_node(self, *args):
109109
return DictNode(self.attribute_prefix,
110110
self.cdata_key,
111111
self.always_aslist).copy(super(RapidXml, self).allocate_node(*args))
112-

tests/conftest.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,24 @@ def init_rapidxml():
2222
<test>some text</test>
2323
</root>""")
2424
return r
25-
25+
2626
@pytest.fixture(scope="function")
2727
def init_rapidxml_with_CDADA():
28-
datra_str = "<root><test attr1=\"one\" attr2=\"two\" attr3=\"three\"/><test2><node id=\"1\"/><node id=\"2\"/><node id=\"3\"/></test2><test>some text</test><ns2:AdditionalData><ns2:Data TID=\"AD_1\"><![CDATA[{\"Cart\":{\"expirationTime\":\"2017-04-22T09:40\",\"id\":\"b469df3b-f626-4fe3-898c-825373e546a2\",\"products\":[\"1223\"],\"creationTime\":\"2017-04-21T09:40\",\"totalPrice\":{\"currencyCode\":\"EUR\",\"amount\":\"138.000\"}}}]]></ns2:Data></ns2:AdditionalData></root>"
29-
r = rapidxml.RapidXml(datra_str,
30-
from_file=False,
31-
attribute_prefix='@',
32-
cdata_key='#text',
33-
always_aslist=False,
34-
parse_cdata=True)
28+
data = b"<root><test attr1=\"one\" attr2=\"two\" attr3=\"three\"/><test2><node id=\"1\"/><node id=\"2\"/><node id=\"3\"/></test2><test>some text</test><ns2:AdditionalData><ns2:Data TID=\"AD_1\"><![CDATA[{\"Cart\":{\"expirationTime\":\"2017-04-22T09:40\",\"id\":\"b469df3b-f626-4fe3-898c-825373e546a2\",\"products\":[\"1223\"],\"creationTime\":\"2017-04-21T09:40\",\"totalPrice\":{\"currencyCode\":\"EUR\",\"amount\":\"138.000\"}}}]]></ns2:Data></ns2:AdditionalData></root>"
29+
r = rapidxml.RapidXml(data, parse_cdata=True)
3530
return r
31+
32+
@pytest.fixture(scope="module")
33+
def cdata_obj():
34+
return {
35+
"Cart": {
36+
"expirationTime": "2017-04-22T09:40",
37+
"id": "b469df3b-f626-4fe3-898c-825373e546a2",
38+
"products": ["1223"],
39+
"creationTime":"2017-04-21T09:40",
40+
"totalPrice": {
41+
"currencyCode": "EUR",
42+
"amount": "138.000",
43+
},
44+
},
45+
}

tests/test_cdata.py

Lines changed: 0 additions & 44 deletions
This file was deleted.

tests/test_nodes.py

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# arzaroth@arzaroth.com
77
#
88

9-
import ast
9+
import json
1010

1111
def test_first_node(init_rapidxml):
1212
root = init_rapidxml.first_node()
@@ -38,26 +38,11 @@ def test_first_node_cdata(init_rapidxml_with_CDADA):
3838
assert root.first_node() == root.first_node("test")
3939
assert root.first_node() != root.first_node("test2")
4040

41-
def test_last_node_cdata(init_rapidxml_with_CDADA):
41+
def test_last_node_cdata(init_rapidxml_with_CDADA, cdata_obj):
4242
root = init_rapidxml_with_CDADA.first_node()
4343
assert root.first_node() != root.last_node()
4444
assert root.first_node("test2") == root.last_node("test2")
45-
object = \
46-
{
47-
"Cart":
48-
{
49-
"expirationTime":"2017-04-22T09:40",
50-
"id":"b469df3b-f626-4fe3-898c-825373e546a2",
51-
"products":["1223"],
52-
"creationTime":"2017-04-21T09:40",
53-
"totalPrice":
54-
{
55-
"currencyCode":"EUR",
56-
"amount":"138.000"
57-
}
58-
}
59-
}
60-
assert ast.literal_eval(root.last_node().first_node().first_node().value) == object
45+
assert json.loads(root.last_node().first_node().first_node().value) == cdata_obj
6146

6247
def test_nested_node_cdata(init_rapidxml_with_CDADA):
6348
test = init_rapidxml_with_CDADA.first_node().first_node("test")

tests/test_utf8.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,14 @@ def test_utf8():
1919
assert data == r.unparse(raw=True)
2020
r.first_node().value = b'\x85'
2121
assert r.unparse(raw=True).decode('cp1252').encode('utf-8') == b"<root>\xe2\x80\xa6</root>"
22+
23+
def test_utf8_cdata():
24+
data = "<root><![CDATA[\"Càrt\"]]></root>"
25+
if sys.version_info[0] >= 3:
26+
data = data.encode('utf-8')
27+
r = rapidxml.RapidXml(data, parse_cdata=True)
28+
assert str(r) == r.unparse(pretty=True)
29+
assert repr(r) == r.unparse()
30+
assert data == r.unparse(raw=True)
31+
r.first_node().first_node().value = b'\x85'
32+
assert r.unparse(raw=True).decode('cp1252').encode('utf-8') == b"<root><![CDATA[\xe2\x80\xa6]]></root>"

0 commit comments

Comments
 (0)