From f461acbaf28aa79d82cffaf65b886c3d884cc5f4 Mon Sep 17 00:00:00 2001 From: Michele Lazzeri Date: Wed, 11 Jan 2012 18:58:43 +0100 Subject: [PATCH 1/9] update author --- djangorestframework/parsers.py | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/djangorestframework/parsers.py b/djangorestframework/parsers.py index c218e5ee5..c5eefaec2 100644 --- a/djangorestframework/parsers.py +++ b/djangorestframework/parsers.py @@ -189,11 +189,38 @@ class XMLParser(BaseParser): """ data = {} tree = ET.parse(stream) - for child in tree.getroot().getchildren(): - data[child.tag] = self._type_convert(child.text) - + data = self._xml_convert(tree.getroot()) + return (data, None) + def _xml_convert(self, element): + """ + convert the xml `element` into the corresponding python object + + `data` The python object representation of xml `element`. + """ + + children = element.getchildren() + + if len(children) == 0: + return self._type_convert(element.text) + else: + if element.tag == "resource": + data = [] + for child in children: + data.append(self._xml_convert(child)) + else: + if children[0].tag == "resource": + data = [] + for child in children: + data.append(self._xml_convert(child)) + else: + data = {} + for child in children: + data[child.tag] = self._xml_convert(child) + + return data + def _type_convert(self, value): """ Converts the value returned by the XMl parse into the equivalent From ad7d921e86198a81a8db2a991111218c798026b8 Mon Sep 17 00:00:00 2001 From: Michele Lazzeri Date: Wed, 11 Jan 2012 19:29:48 +0100 Subject: [PATCH 2/9] Revert "update author" This reverts commit f461acbaf28aa79d82cffaf65b886c3d884cc5f4. --- djangorestframework/parsers.py | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/djangorestframework/parsers.py b/djangorestframework/parsers.py index c5eefaec2..c218e5ee5 100644 --- a/djangorestframework/parsers.py +++ b/djangorestframework/parsers.py @@ -189,38 +189,11 @@ class XMLParser(BaseParser): """ data = {} tree = ET.parse(stream) - data = self._xml_convert(tree.getroot()) - + for child in tree.getroot().getchildren(): + data[child.tag] = self._type_convert(child.text) + return (data, None) - def _xml_convert(self, element): - """ - convert the xml `element` into the corresponding python object - - `data` The python object representation of xml `element`. - """ - - children = element.getchildren() - - if len(children) == 0: - return self._type_convert(element.text) - else: - if element.tag == "resource": - data = [] - for child in children: - data.append(self._xml_convert(child)) - else: - if children[0].tag == "resource": - data = [] - for child in children: - data.append(self._xml_convert(child)) - else: - data = {} - for child in children: - data[child.tag] = self._xml_convert(child) - - return data - def _type_convert(self, value): """ Converts the value returned by the XMl parse into the equivalent From ab83a2faaedd9813887af0382f7199702461f60f Mon Sep 17 00:00:00 2001 From: Michele Lazzeri Date: Wed, 11 Jan 2012 19:31:08 +0100 Subject: [PATCH 3/9] recursive xml parsing --- djangorestframework/parsers.py | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/djangorestframework/parsers.py b/djangorestframework/parsers.py index c218e5ee5..c5eefaec2 100644 --- a/djangorestframework/parsers.py +++ b/djangorestframework/parsers.py @@ -189,11 +189,38 @@ class XMLParser(BaseParser): """ data = {} tree = ET.parse(stream) - for child in tree.getroot().getchildren(): - data[child.tag] = self._type_convert(child.text) - + data = self._xml_convert(tree.getroot()) + return (data, None) + def _xml_convert(self, element): + """ + convert the xml `element` into the corresponding python object + + `data` The python object representation of xml `element`. + """ + + children = element.getchildren() + + if len(children) == 0: + return self._type_convert(element.text) + else: + if element.tag == "resource": + data = [] + for child in children: + data.append(self._xml_convert(child)) + else: + if children[0].tag == "resource": + data = [] + for child in children: + data.append(self._xml_convert(child)) + else: + data = {} + for child in children: + data[child.tag] = self._xml_convert(child) + + return data + def _type_convert(self, value): """ Converts the value returned by the XMl parse into the equivalent From 27d22cff6cbdbbebbf92304934e0a1f1be87c1c4 Mon Sep 17 00:00:00 2001 From: Michele Lazzeri Date: Wed, 11 Jan 2012 19:34:08 +0100 Subject: [PATCH 4/9] Revert "update author" This reverts commit f461acbaf28aa79d82cffaf65b886c3d884cc5f4. --- djangorestframework/parsers.py | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/djangorestframework/parsers.py b/djangorestframework/parsers.py index c5eefaec2..c218e5ee5 100644 --- a/djangorestframework/parsers.py +++ b/djangorestframework/parsers.py @@ -189,38 +189,11 @@ class XMLParser(BaseParser): """ data = {} tree = ET.parse(stream) - data = self._xml_convert(tree.getroot()) - + for child in tree.getroot().getchildren(): + data[child.tag] = self._type_convert(child.text) + return (data, None) - def _xml_convert(self, element): - """ - convert the xml `element` into the corresponding python object - - `data` The python object representation of xml `element`. - """ - - children = element.getchildren() - - if len(children) == 0: - return self._type_convert(element.text) - else: - if element.tag == "resource": - data = [] - for child in children: - data.append(self._xml_convert(child)) - else: - if children[0].tag == "resource": - data = [] - for child in children: - data.append(self._xml_convert(child)) - else: - data = {} - for child in children: - data[child.tag] = self._xml_convert(child) - - return data - def _type_convert(self, value): """ Converts the value returned by the XMl parse into the equivalent From 1664bc7b915578ae8062562656fcc1b931ef095e Mon Sep 17 00:00:00 2001 From: Michele Lazzeri Date: Wed, 11 Jan 2012 19:36:43 +0100 Subject: [PATCH 5/9] recursive xml parsing --- djangorestframework/parsers.py | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/djangorestframework/parsers.py b/djangorestframework/parsers.py index c218e5ee5..c5eefaec2 100644 --- a/djangorestframework/parsers.py +++ b/djangorestframework/parsers.py @@ -189,11 +189,38 @@ class XMLParser(BaseParser): """ data = {} tree = ET.parse(stream) - for child in tree.getroot().getchildren(): - data[child.tag] = self._type_convert(child.text) - + data = self._xml_convert(tree.getroot()) + return (data, None) + def _xml_convert(self, element): + """ + convert the xml `element` into the corresponding python object + + `data` The python object representation of xml `element`. + """ + + children = element.getchildren() + + if len(children) == 0: + return self._type_convert(element.text) + else: + if element.tag == "resource": + data = [] + for child in children: + data.append(self._xml_convert(child)) + else: + if children[0].tag == "resource": + data = [] + for child in children: + data.append(self._xml_convert(child)) + else: + data = {} + for child in children: + data[child.tag] = self._xml_convert(child) + + return data + def _type_convert(self, value): """ Converts the value returned by the XMl parse into the equivalent From 6b3792aef27e045a049d6f3bd86d970cb53ea9f5 Mon Sep 17 00:00:00 2001 From: Michele Lazzeri Date: Wed, 11 Jan 2012 19:37:43 +0100 Subject: [PATCH 6/9] recursive xml parsing --- djangorestframework/parsers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/djangorestframework/parsers.py b/djangorestframework/parsers.py index c5eefaec2..79e14260c 100644 --- a/djangorestframework/parsers.py +++ b/djangorestframework/parsers.py @@ -196,8 +196,6 @@ class XMLParser(BaseParser): def _xml_convert(self, element): """ convert the xml `element` into the corresponding python object - - `data` The python object representation of xml `element`. """ children = element.getchildren() From 2966c343520147c4027ea48f3fea47913da3ebdb Mon Sep 17 00:00:00 2001 From: Michele Lazzeri Date: Thu, 12 Jan 2012 13:28:32 +0100 Subject: [PATCH 7/9] correct complex data xml parsing --- djangorestframework/parsers.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/djangorestframework/parsers.py b/djangorestframework/parsers.py index 79e14260c..b99423a09 100644 --- a/djangorestframework/parsers.py +++ b/djangorestframework/parsers.py @@ -187,12 +187,11 @@ class XMLParser(BaseParser): `data` will simply be a string representing the body of the request. `files` will always be `None`. """ - data = {} tree = ET.parse(stream) data = self._xml_convert(tree.getroot()) - + return (data, None) - + def _xml_convert(self, element): """ convert the xml `element` into the corresponding python object @@ -203,19 +202,15 @@ class XMLParser(BaseParser): if len(children) == 0: return self._type_convert(element.text) else: - if element.tag == "resource": + # if the fist child tag is list-item means all children are list-item + if children[0].tag == "list-item": data = [] for child in children: - data.append(self._xml_convert(child)) + data.append(self._xml_convert(child)) else: - if children[0].tag == "resource": - data = [] - for child in children: - data.append(self._xml_convert(child)) - else: - data = {} - for child in children: - data[child.tag] = self._xml_convert(child) + data = {} + for child in children: + data[child.tag] = self._xml_convert(child) return data From 1bec6f2d5ed3d27b39ef543e0e4afb23678cfe4b Mon Sep 17 00:00:00 2001 From: Michele Lazzeri Date: Thu, 12 Jan 2012 18:04:18 +0100 Subject: [PATCH 8/9] add testcate XMLRendererTestCase.test_render_and_parse_complex_data --- djangorestframework/tests/renderers.py | 29 +++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/djangorestframework/tests/renderers.py b/djangorestframework/tests/renderers.py index e80f0f20a..d000df27f 100644 --- a/djangorestframework/tests/renderers.py +++ b/djangorestframework/tests/renderers.py @@ -6,7 +6,7 @@ from djangorestframework.views import View from djangorestframework.compat import View as DjangoView from djangorestframework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer, \ XMLRenderer, JSONPRenderer, DocumentingHTMLRenderer -from djangorestframework.parsers import JSONParser, YAMLParser +from djangorestframework.parsers import JSONParser, YAMLParser, XMLParser from djangorestframework.mixins import ResponseMixin from djangorestframework.response import Response @@ -479,6 +479,33 @@ class XMLRendererTestCase(TestCase): content = renderer.render({'field': None}, 'application/xml') self.assertXMLContains(content, '') + def test_render_and_parse_complex_data(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer(None) + complex_data_in = { + "creation_date": datetime.datetime(2011, 12, 25, 12, 45, 00), + "name": "name", + "sub_data_list": [ + { + "sub_id": 1, + "sub_name": "first" + }, + { + "sub_id": 2, + "sub_name": "second" + } + ] + } + + content = StringIO(renderer.render(complex_data_in, 'application/xml')) + + parser = XMLParser(None) + complex_data_out, dummy = parser.parse(content) + error_msg = "complex data differs!IN:\n %s \n\n OUT:\n %s" % (repr(complex_data_in), repr(complex_data_out)) + self.assertDictEqual(complex_data_in, complex_data_out, error_msg) + def assertXMLContains(self, xml, string): self.assertTrue(xml.startswith('\n')) self.assertTrue(xml.endswith('')) From 21776c0de2eca3d66534817b3f5a258a6fc1fc2f Mon Sep 17 00:00:00 2001 From: Michele Lazzeri Date: Fri, 13 Jan 2012 10:11:34 +0100 Subject: [PATCH 9/9] split renderer and parser complex data test case --- djangorestframework/tests/parsers.py | 41 ++++++-- djangorestframework/tests/renderers.py | 137 ++++++------------------- 2 files changed, 64 insertions(+), 114 deletions(-) diff --git a/djangorestframework/tests/parsers.py b/djangorestframework/tests/parsers.py index e4e7e09a4..5bd4aad3d 100644 --- a/djangorestframework/tests/parsers.py +++ b/djangorestframework/tests/parsers.py @@ -156,10 +156,9 @@ class TestFormParser(TestCase): self.assertEqual(Form(data).is_valid(), True) - class TestXMLParser(TestCase): def setUp(self): - self.input = StringIO( + self._input = StringIO( '' '' '121.0' @@ -168,15 +167,45 @@ class TestXMLParser(TestCase): '2011-12-25 12:45:00' '' ) - self.data = { + self._data = { 'field_a': 121, 'field_b': 'dasd', 'field_c': None, 'field_d': datetime.datetime(2011, 12, 25, 12, 45, 00) } - + self._complex_data_input = StringIO( + '' + '' + '2011-12-25 12:45:00' + '' + '1first' + '2second' + '' + 'name' + '' + ) + self._complex_data = { + "creation_date": datetime.datetime(2011, 12, 25, 12, 45, 00), + "name": "name", + "sub_data_list": [ + { + "sub_id": 1, + "sub_name": "first" + }, + { + "sub_id": 2, + "sub_name": "second" + } + ] + } + def test_parse(self): parser = XMLParser(None) - (data, files) = parser.parse(self.input) - self.assertEqual(data, self.data) + (data, files) = parser.parse(self._input) + self.assertEqual(data, self._data) + + def test_complex_data_parse(self): + parser = XMLParser(None) + (data, files) = parser.parse(self._complex_data_input) + self.assertEqual(data, self._complex_data) diff --git a/djangorestframework/tests/renderers.py b/djangorestframework/tests/renderers.py index d000df27f..142791e48 100644 --- a/djangorestframework/tests/renderers.py +++ b/djangorestframework/tests/renderers.py @@ -283,72 +283,6 @@ if YAMLRenderer: self.assertEquals(obj, data) -class XMLRendererTestCase(TestCase): - """ - Tests specific to the XML Renderer - """ - - def test_render_string(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer(None) - content = renderer.render({'field': 'astring'}, 'application/xml') - self.assertXMLContains(content, 'astring') - - def test_render_integer(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer(None) - content = renderer.render({'field': 111}, 'application/xml') - self.assertXMLContains(content, '111') - - def test_render_datetime(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer(None) - content = renderer.render({ - 'field': datetime.datetime(2011, 12, 25, 12, 45, 00) - }, 'application/xml') - self.assertXMLContains(content, '2011-12-25 12:45:00') - - def test_render_float(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer(None) - content = renderer.render({'field': 123.4}, 'application/xml') - self.assertXMLContains(content, '123.4') - - def test_render_decimal(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer(None) - content = renderer.render({'field': Decimal('111.2')}, 'application/xml') - self.assertXMLContains(content, '111.2') - - def test_render_none(self): - """ - Test XML rendering. - """ - renderer = XMLRenderer(None) - content = renderer.render({'field': None}, 'application/xml') - self.assertXMLContains(content, '') - - def assertXMLContains(self, xml, string): - self.assertTrue(xml.startswith('\n')) - self.assertTrue(xml.endswith('')) - self.assertTrue(string in xml, '%r not in %r' % (string, xml)) - -class HTMLView(View): - renderers = (DocumentingHTMLRenderer) - - def get(self, request, **kwargs): - return 'text' - urlpatterns += patterns('', url(r'^/html$', HTMLView.as_view()), ) @@ -429,6 +363,21 @@ class XMLRendererTestCase(TestCase): Tests specific to the XML Renderer """ + _complex_data = { + "creation_date": datetime.datetime(2011, 12, 25, 12, 45, 00), + "name": "name", + "sub_data_list": [ + { + "sub_id": 1, + "sub_name": "first" + }, + { + "sub_id": 2, + "sub_name": "second" + } + ] + } + def test_render_string(self): """ Test XML rendering. @@ -478,57 +427,29 @@ class XMLRendererTestCase(TestCase): renderer = XMLRenderer(None) content = renderer.render({'field': None}, 'application/xml') self.assertXMLContains(content, '') + + def test_render_complex_data(self): + """ + Test XML rendering. + """ + renderer = XMLRenderer(None) + content = renderer.render(self._complex_data, 'application/xml') + self.assertXMLContains(content, 'first') + self.assertXMLContains(content, 'second') def test_render_and_parse_complex_data(self): """ Test XML rendering. """ - renderer = XMLRenderer(None) - complex_data_in = { - "creation_date": datetime.datetime(2011, 12, 25, 12, 45, 00), - "name": "name", - "sub_data_list": [ - { - "sub_id": 1, - "sub_name": "first" - }, - { - "sub_id": 2, - "sub_name": "second" - } - ] - } - - content = StringIO(renderer.render(complex_data_in, 'application/xml')) + renderer = XMLRenderer(None) + content = StringIO(renderer.render(self._complex_data, 'application/xml')) parser = XMLParser(None) complex_data_out, dummy = parser.parse(content) - error_msg = "complex data differs!IN:\n %s \n\n OUT:\n %s" % (repr(complex_data_in), repr(complex_data_out)) - self.assertDictEqual(complex_data_in, complex_data_out, error_msg) + error_msg = "complex data differs!IN:\n %s \n\n OUT:\n %s" % (repr(self._complex_data), repr(complex_data_out)) + self.assertDictEqual(self._complex_data, complex_data_out, error_msg) def assertXMLContains(self, xml, string): self.assertTrue(xml.startswith('\n')) self.assertTrue(xml.endswith('')) - self.assertTrue(string in xml, '%r not in %r' % (string, xml)) - - - -class Issue122Tests(TestCase): - """ - Tests that covers #122. - """ - - urls = 'djangorestframework.tests.renderers' - - def test_only_html_renderer(self): - """ - Test if no recursion occurs. - """ - resp = self.client.get('/html') - - def test_html_renderer_is_first(self): - """ - Test if no recursion occurs. - """ - resp = self.client.get('/html1') - + self.assertTrue(string in xml, '%r not in %r' % (string, xml)) \ No newline at end of file