From 57d11d26ce9553a79b5804c56b10fcec34f80c90 Mon Sep 17 00:00:00 2001 From: Elihay Ben Ezra <39125937+Elihayb@users.noreply.github.com> Date: Mon, 8 May 2023 12:37:55 +0300 Subject: [PATCH 01/10] xml provider added --- faker/providers/misc/__init__.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/faker/providers/misc/__init__.py b/faker/providers/misc/__init__.py index 19b07820e6..5c92204cb2 100644 --- a/faker/providers/misc/__init__.py +++ b/faker/providers/misc/__init__.py @@ -613,6 +613,28 @@ def create_json_structure(data_columns: Union[Dict, List]) -> dict: data = [create_json_structure(data_columns) for _ in range(num_rows)] return json.dumps(data, indent=indent, cls=cls) + def xml(self, + nb_elements: int = 10, + variable_nb_elements: bool = True, + value_types: Optional[TypesSpec] = None, + allowed_types: Optional[TypesSpec] = None, + ) -> str: + """ + Returns a xml. + + :nb_elements: number of elements for dictionary + :variable_nb_elements: is use variable number of elements for dictionary + :value_types: type of dictionary values + """ + try: + import xmltodict + except ImportError: + raise UnsupportedFeature("`xml` requires the `xmltodict` python library.", "xml") + _dict = self.generator.pydict(nb_elements=nb_elements, variable_nb_elements=variable_nb_elements, + value_types=value_types, allowed_types=allowed_types) + _dict = {self.generator.word(): _dict} + return xmltodict.unparse(_dict) + def fixed_width(self, data_columns: Optional[list] = None, num_rows: int = 10, align: str = "left") -> str: """ Generate random fixed width values. From 5fba74be2a63d81805d47fcd908e559d472a03dd Mon Sep 17 00:00:00 2001 From: Elihay Ben Ezra <39125937+Elihayb@users.noreply.github.com> Date: Mon, 8 May 2023 12:39:06 +0300 Subject: [PATCH 02/10] TypesSpec imported --- faker/providers/misc/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/faker/providers/misc/__init__.py b/faker/providers/misc/__init__.py index 5c92204cb2..48b316ab62 100644 --- a/faker/providers/misc/__init__.py +++ b/faker/providers/misc/__init__.py @@ -13,6 +13,7 @@ from faker.exceptions import UnsupportedFeature +from ..python import TypesSpec from .. import BaseProvider localized = True From 3cb79049aaa4a5f5655fcb179deef80038ecbac4 Mon Sep 17 00:00:00 2001 From: Elihay Ben Ezra <39125937+Elihayb@users.noreply.github.com> Date: Mon, 8 May 2023 12:42:49 +0300 Subject: [PATCH 03/10] xml generator test added --- tests/providers/test_misc.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/providers/test_misc.py b/tests/providers/test_misc.py index f50822f39a..93bb5d8565 100644 --- a/tests/providers/test_misc.py +++ b/tests/providers/test_misc.py @@ -8,6 +8,7 @@ import unittest import uuid import zipfile +import xml try: import PIL.Image @@ -455,6 +456,12 @@ def test_dsv_csvwriter_kwargs(self, faker): for args, kwargs in mock_writer.call_args_list: assert kwargs == test_kwargs + def test_xml(self, faker): + try: + xml.etree.ElementTree.fromstring(faker.xml()) + except xml.etree.ElementTree.ParseError: + raise AssertionError("The xml format is invalid") + def test_csv_helper_method(self, faker): kwargs = { "header": ["Column 1", "Column 2"], From 8008902c19140080a74ea3cc8c7a43ce119632d6 Mon Sep 17 00:00:00 2001 From: Elihay Ben Ezra <39125937+Elihayb@users.noreply.github.com> Date: Tue, 9 May 2023 12:38:27 +0300 Subject: [PATCH 04/10] fix pr comments --- faker/providers/misc/__init__.py | 2 ++ tox.ini | 1 + 2 files changed, 3 insertions(+) diff --git a/faker/providers/misc/__init__.py b/faker/providers/misc/__init__.py index 48b316ab62..1bf435c205 100644 --- a/faker/providers/misc/__init__.py +++ b/faker/providers/misc/__init__.py @@ -626,6 +626,8 @@ def xml(self, :nb_elements: number of elements for dictionary :variable_nb_elements: is use variable number of elements for dictionary :value_types: type of dictionary values + + Note: this provider required xmltodict library installed """ try: import xmltodict diff --git a/tox.ini b/tox.ini index a33a109520..14d5b744d2 100644 --- a/tox.ini +++ b/tox.ini @@ -11,6 +11,7 @@ deps = validators>=0.13.0 sphinx>=2.4,<3.0 Pillow + xmltodict commands = coverage run --source=faker -m pytest {posargs} coverage run --source=faker -a -m pytest --exclusive-faker-session tests/pytest/session_overrides {posargs} From d5bb55a0f31d4dd3bfa8317aa5a4fca3dd372a82 Mon Sep 17 00:00:00 2001 From: Elihay Ben Ezra <39125937+Elihayb@users.noreply.github.com> Date: Wed, 10 May 2023 08:42:42 +0300 Subject: [PATCH 05/10] Update tests/providers/test_misc.py Co-authored-by: Flavio Curella <89607+fcurella@users.noreply.github.com> --- tests/providers/test_misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/providers/test_misc.py b/tests/providers/test_misc.py index 93bb5d8565..4e6117bd1d 100644 --- a/tests/providers/test_misc.py +++ b/tests/providers/test_misc.py @@ -460,7 +460,7 @@ def test_xml(self, faker): try: xml.etree.ElementTree.fromstring(faker.xml()) except xml.etree.ElementTree.ParseError: - raise AssertionError("The xml format is invalid") + raise AssertionError("The XML format is invalid.") def test_csv_helper_method(self, faker): kwargs = { From 16f84c49e7f213243446b1049ee5fb1129e108e1 Mon Sep 17 00:00:00 2001 From: Elihay Ben Ezra <39125937+Elihayb@users.noreply.github.com> Date: Wed, 10 May 2023 08:42:53 +0300 Subject: [PATCH 06/10] Update faker/providers/misc/__init__.py Co-authored-by: Flavio Curella <89607+fcurella@users.noreply.github.com> --- faker/providers/misc/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/faker/providers/misc/__init__.py b/faker/providers/misc/__init__.py index 1bf435c205..716a46aba2 100644 --- a/faker/providers/misc/__init__.py +++ b/faker/providers/misc/__init__.py @@ -621,7 +621,7 @@ def xml(self, allowed_types: Optional[TypesSpec] = None, ) -> str: """ - Returns a xml. + Returns some XML. :nb_elements: number of elements for dictionary :variable_nb_elements: is use variable number of elements for dictionary From 43f603fbc159a182c3b6db3210219b7198aa34a2 Mon Sep 17 00:00:00 2001 From: Elihay Ben Ezra <39125937+Elihayb@users.noreply.github.com> Date: Wed, 10 May 2023 08:43:13 +0300 Subject: [PATCH 07/10] Update faker/providers/misc/__init__.py Co-authored-by: Flavio Curella <89607+fcurella@users.noreply.github.com> --- faker/providers/misc/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/faker/providers/misc/__init__.py b/faker/providers/misc/__init__.py index 716a46aba2..9d3b7457d0 100644 --- a/faker/providers/misc/__init__.py +++ b/faker/providers/misc/__init__.py @@ -632,7 +632,7 @@ def xml(self, try: import xmltodict except ImportError: - raise UnsupportedFeature("`xml` requires the `xmltodict` python library.", "xml") + raise UnsupportedFeature("`xml` requires the `xmltodict` Python library.", "xml") _dict = self.generator.pydict(nb_elements=nb_elements, variable_nb_elements=variable_nb_elements, value_types=value_types, allowed_types=allowed_types) _dict = {self.generator.word(): _dict} From 83986057bdddb6312e9a497e4cf525f5bf554ec9 Mon Sep 17 00:00:00 2001 From: Elihay Ben Ezra <39125937+Elihayb@users.noreply.github.com> Date: Wed, 10 May 2023 08:43:30 +0300 Subject: [PATCH 08/10] Update tests/providers/test_misc.py Co-authored-by: Flavio Curella <89607+fcurella@users.noreply.github.com> --- tests/providers/test_misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/providers/test_misc.py b/tests/providers/test_misc.py index 4e6117bd1d..6cd4ef7b48 100644 --- a/tests/providers/test_misc.py +++ b/tests/providers/test_misc.py @@ -7,8 +7,8 @@ import tarfile import unittest import uuid -import zipfile import xml +import zipfile try: import PIL.Image From b907e508b7533fd81b8bb687d012fc927781eb4e Mon Sep 17 00:00:00 2001 From: elihaybe Date: Wed, 10 May 2023 11:52:42 +0300 Subject: [PATCH 09/10] lint wes running --- faker/providers/misc/__init__.py | 17 +++++++++++------ tests/providers/test_misc.py | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/faker/providers/misc/__init__.py b/faker/providers/misc/__init__.py index 9d3b7457d0..240249cbba 100644 --- a/faker/providers/misc/__init__.py +++ b/faker/providers/misc/__init__.py @@ -13,8 +13,8 @@ from faker.exceptions import UnsupportedFeature -from ..python import TypesSpec from .. import BaseProvider +from ..python import TypesSpec localized = True @@ -614,12 +614,13 @@ def create_json_structure(data_columns: Union[Dict, List]) -> dict: data = [create_json_structure(data_columns) for _ in range(num_rows)] return json.dumps(data, indent=indent, cls=cls) - def xml(self, + def xml( + self, nb_elements: int = 10, variable_nb_elements: bool = True, value_types: Optional[TypesSpec] = None, allowed_types: Optional[TypesSpec] = None, - ) -> str: + ) -> str: """ Returns some XML. @@ -633,11 +634,15 @@ def xml(self, import xmltodict except ImportError: raise UnsupportedFeature("`xml` requires the `xmltodict` Python library.", "xml") - _dict = self.generator.pydict(nb_elements=nb_elements, variable_nb_elements=variable_nb_elements, - value_types=value_types, allowed_types=allowed_types) + _dict = self.generator.pydict( + nb_elements=nb_elements, + variable_nb_elements=variable_nb_elements, + value_types=value_types, + allowed_types=allowed_types, + ) _dict = {self.generator.word(): _dict} return xmltodict.unparse(_dict) - + def fixed_width(self, data_columns: Optional[list] = None, num_rows: int = 10, align: str = "left") -> str: """ Generate random fixed width values. diff --git a/tests/providers/test_misc.py b/tests/providers/test_misc.py index 6cd4ef7b48..7fe90b4fa5 100644 --- a/tests/providers/test_misc.py +++ b/tests/providers/test_misc.py @@ -461,7 +461,7 @@ def test_xml(self, faker): xml.etree.ElementTree.fromstring(faker.xml()) except xml.etree.ElementTree.ParseError: raise AssertionError("The XML format is invalid.") - + def test_csv_helper_method(self, faker): kwargs = { "header": ["Column 1", "Column 2"], From de9ddb0dbd3d34d8bb094794e60d972a896c2930 Mon Sep 17 00:00:00 2001 From: elihaybe Date: Tue, 16 May 2023 16:38:44 +0300 Subject: [PATCH 10/10] cover importError exception test for xml --- tests/providers/test_misc.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/providers/test_misc.py b/tests/providers/test_misc.py index 7fe90b4fa5..ec9fe57a25 100644 --- a/tests/providers/test_misc.py +++ b/tests/providers/test_misc.py @@ -15,6 +15,11 @@ except ImportError: PIL = None +try: + import xmltodict +except ImportError: + xmltodict = None + from typing import Pattern from unittest.mock import patch @@ -456,12 +461,20 @@ def test_dsv_csvwriter_kwargs(self, faker): for args, kwargs in mock_writer.call_args_list: assert kwargs == test_kwargs + @unittest.skipUnless(xmltodict, "requires the Python xmltodict Library") def test_xml(self, faker): try: xml.etree.ElementTree.fromstring(faker.xml()) except xml.etree.ElementTree.ParseError: raise AssertionError("The XML format is invalid.") + def test_xml_no_xmltodict(self, faker): + with patch.dict("sys.modules", {"xmltodict": None}): + with pytest.raises(exceptions.UnsupportedFeature) as excinfo: + faker.xml() + + assert excinfo.value.name == "xml" + def test_csv_helper_method(self, faker): kwargs = { "header": ["Column 1", "Column 2"],