From defff145d686bf82e1cb93ea107e027d24c5ebde Mon Sep 17 00:00:00 2001 From: Adam Wallace Date: Tue, 23 Jan 2024 15:13:08 +0000 Subject: [PATCH] add as_txt functionality to produce string (#455) --- .gitignore | 2 + python/answer_displayers/CheckboxesField.py | 2 +- .../ClientSideFileUploadField.py | 2 +- python/answer_displayers/DatePartsField.py | 2 +- python/answer_displayers/EmailAddressField.py | 2 +- python/answer_displayers/FreeTextField.py | 2 +- python/answer_displayers/MonthYearField.py | 2 +- python/answer_displayers/MultiInputField.py | 27 +++++++++-- python/answer_displayers/NumberField.py | 2 +- python/answer_displayers/RadiosField.py | 2 +- .../answer_displayers/TelephoneNumberField.py | 2 +- python/answer_displayers/TextField.py | 2 +- python/answer_displayers/UkAddressField.py | 2 +- python/answer_displayers/WebsiteField.py | 2 +- python/answer_displayers/YesNoField.py | 2 +- .../shared}/answer_displayer.py | 0 .../shared}/dictionaries.py | 0 python/pyproject.toml | 2 +- python/tests/test_MultiInputField.py | 47 ++++++++++++------- version | 2 +- 20 files changed, 70 insertions(+), 36 deletions(-) rename python/{ => answer_displayers/shared}/answer_displayer.py (100%) rename python/{ => answer_displayers/shared}/dictionaries.py (100%) diff --git a/.gitignore b/.gitignore index 951794dd22..eab873139c 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ tsconfig.tsbuildinfo .yarn/install-state.gz docs/**/typedoc .venv + +__pycache__/ diff --git a/python/answer_displayers/CheckboxesField.py b/python/answer_displayers/CheckboxesField.py index fecee73d83..93d55e72b3 100644 --- a/python/answer_displayers/CheckboxesField.py +++ b/python/answer_displayers/CheckboxesField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class CheckboxesFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/ClientSideFileUploadField.py b/python/answer_displayers/ClientSideFileUploadField.py index 80a451767b..f634bde726 100644 --- a/python/answer_displayers/ClientSideFileUploadField.py +++ b/python/answer_displayers/ClientSideFileUploadField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class ClientSideFileUploadFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/DatePartsField.py b/python/answer_displayers/DatePartsField.py index 01c4cf5acf..92ac4947b2 100644 --- a/python/answer_displayers/DatePartsField.py +++ b/python/answer_displayers/DatePartsField.py @@ -1,7 +1,7 @@ import contextlib import datetime -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class DatePartsFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/EmailAddressField.py b/python/answer_displayers/EmailAddressField.py index 5e7fcee545..dab6aca5c9 100644 --- a/python/answer_displayers/EmailAddressField.py +++ b/python/answer_displayers/EmailAddressField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class EmailAddressFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/FreeTextField.py b/python/answer_displayers/FreeTextField.py index a68f2bb8cf..94165e014f 100644 --- a/python/answer_displayers/FreeTextField.py +++ b/python/answer_displayers/FreeTextField.py @@ -1,5 +1,5 @@ from bs4 import BeautifulSoup -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class FreeTextFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/MonthYearField.py b/python/answer_displayers/MonthYearField.py index 3b1e83a770..130187bbf5 100644 --- a/python/answer_displayers/MonthYearField.py +++ b/python/answer_displayers/MonthYearField.py @@ -1,7 +1,7 @@ import contextlib import datetime -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class MonthYearFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/MultiInputField.py b/python/answer_displayers/MultiInputField.py index b4e0d7f6db..7828b5c7a4 100644 --- a/python/answer_displayers/MultiInputField.py +++ b/python/answer_displayers/MultiInputField.py @@ -1,6 +1,6 @@ from typing import Any -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class MultiInputFieldDisplayer(AnswerDisplayer): @@ -22,7 +22,7 @@ def _legacy_parsed_answer(self) -> str: @property def _parse_multi_input_component(self) -> list[dict[str, AnswerDisplayer]]: - from python.dictionaries import ( + from python.answer_displayers.shared.dictionaries import ( EXISTING_KEY_TO_TYPE_DICT, FIELD_TO_DISPLAYER_DICT_MULTI_INPUT, ) @@ -46,11 +46,30 @@ def as_csv(self) -> str | list[dict[str, AnswerDisplayer]]: return self._parse_multi_input_component @property - def as_txt(self) -> str | list[dict[str, AnswerDisplayer]]: + def as_txt(self) -> str: if self.legacy: return self._legacy_parsed_answer else: - return self._parse_multi_input_component + multi_input_rows_as_string = "" + for index, answer_displayers_for_each_item_in_row in enumerate( + self._parse_multi_input_component + ): + text_for_row = "" + for ( + key, + answer_displayer, + ) in answer_displayers_for_each_item_in_row.items(): + text_for_row = text_for_row + str(answer_displayer.as_txt) + "\n" + multi_input_rows_as_string = ( + multi_input_rows_as_string + + "Multi-input item " + + str(index + 1) + + "\n" + + text_for_row + + "\n" + ) + + return multi_input_rows_as_string @property def as_pdf(self) -> str | list[dict[str, AnswerDisplayer]]: diff --git a/python/answer_displayers/NumberField.py b/python/answer_displayers/NumberField.py index 9b67a46e11..49cf3653ac 100644 --- a/python/answer_displayers/NumberField.py +++ b/python/answer_displayers/NumberField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class NumberFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/RadiosField.py b/python/answer_displayers/RadiosField.py index db9346d938..3597f425ca 100644 --- a/python/answer_displayers/RadiosField.py +++ b/python/answer_displayers/RadiosField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class RadiosFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/TelephoneNumberField.py b/python/answer_displayers/TelephoneNumberField.py index becc68f62b..5f3333e597 100644 --- a/python/answer_displayers/TelephoneNumberField.py +++ b/python/answer_displayers/TelephoneNumberField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class TelephoneNumberFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/TextField.py b/python/answer_displayers/TextField.py index 74efe35469..4780db7135 100644 --- a/python/answer_displayers/TextField.py +++ b/python/answer_displayers/TextField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class TextFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/UkAddressField.py b/python/answer_displayers/UkAddressField.py index efa2bf9ebf..f34136e5f4 100644 --- a/python/answer_displayers/UkAddressField.py +++ b/python/answer_displayers/UkAddressField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class UkAddressFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/WebsiteField.py b/python/answer_displayers/WebsiteField.py index ef1fd984e6..4ad4778862 100644 --- a/python/answer_displayers/WebsiteField.py +++ b/python/answer_displayers/WebsiteField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class WebsiteFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayers/YesNoField.py b/python/answer_displayers/YesNoField.py index 00ec53dcc6..9911fce486 100644 --- a/python/answer_displayers/YesNoField.py +++ b/python/answer_displayers/YesNoField.py @@ -1,4 +1,4 @@ -from python.answer_displayer import AnswerDisplayer +from python.answer_displayers.shared.answer_displayer import AnswerDisplayer class YesNoFieldDisplayer(AnswerDisplayer): diff --git a/python/answer_displayer.py b/python/answer_displayers/shared/answer_displayer.py similarity index 100% rename from python/answer_displayer.py rename to python/answer_displayers/shared/answer_displayer.py diff --git a/python/dictionaries.py b/python/answer_displayers/shared/dictionaries.py similarity index 100% rename from python/dictionaries.py rename to python/answer_displayers/shared/dictionaries.py diff --git a/python/pyproject.toml b/python/pyproject.toml index 904e3a2598..7537ec62f5 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "funding-service-design-digital-form-builder-tools" -version = "0.0.2" # please follow semver.org if you can! +version = "1.0.0" # please follow semver.org if you can! authors = [ { name="DLUHC", email="FundingServiceDesignTeam@levellingup.gov.uk" }, ] diff --git a/python/tests/test_MultiInputField.py b/python/tests/test_MultiInputField.py index 0bea3e8e0e..c2d4e30ef6 100644 --- a/python/tests/test_MultiInputField.py +++ b/python/tests/test_MultiInputField.py @@ -41,11 +41,17 @@ def test_as_pdf(answer, expected_result): _TEST_INPUTS = [ [ { - "gLqiyJ": "Test Value for Money CYP Form", + "gLqiyJ": "Test Value for Money CYP Form FIRST", "yuzbjT": 678, "HpLJyL": {"HpLJyL__month": 3, "HpLJyL__year": 2024}, "MadvIr": "Capital", - } + }, + { + "gLqiyJ": "Test Value for Money CYP Form SECOND", + "yuzbjT": 678, + "HpLJyL": {"HpLJyL__month": 4, "HpLJyL__year": 2024}, + "MadvIr": "Capital", + }, ], [ { @@ -66,14 +72,23 @@ def test_as_pdf(answer, expected_result): _TEST_OUTPUTS_LENGTHS = [4, 5] +_TEST_TEXT_OUTPUTS = [ + "Multi-input item 1\nTest Value for Money CYP Form FIRST\n£678.00\nMarch 2024\nCapital\n\nMulti-input item 2\nTest Value for Money CYP Form SECOND\n£678.00\nApril 2024\nCapital\n\n", + "Multi-input item 1\nTest About your organisation CYP Form\n268 Schultz Fold, Upper Berge, W12 0HS\nhttps://twitter.com/luhc\nNone\nNone\n\n", +] _TEST_OUTPUTS = [ - ["Test Value for Money CYP Form", "£678.00", "March 2024", "Capital"], [ - "Test About your organisation CYP Form", - "268 Schultz Fold, Upper Berge, W12 0HS", - "https://twitter.com/luhc", - None, - None, + ["Test Value for Money CYP Form FIRST", "£678.00", "March 2024", "Capital"], + ["Test Value for Money CYP Form SECOND", "£678.00", "April 2024", "Capital"], + ], + [ + [ + "Test About your organisation CYP Form", + "268 Schultz Fold, Upper Berge, W12 0HS", + "https://twitter.com/luhc", + None, + None, + ] ], ] @@ -84,20 +99,18 @@ def test_as_pdf(answer, expected_result): ) def test_as_csv_multi_input(answer, expected_answers): answer_displayers = MultiInputFieldDisplayer(answer).as_csv - for answer_displayer_dict in answer_displayers: - for key, expected_answer in zip(answer_displayer_dict, expected_answers): + for index, answer_displayer_dict in enumerate(answer_displayers): + for key, expected_answer in zip(answer_displayer_dict, expected_answers[index]): assert answer_displayer_dict[key].as_csv == expected_answer @pytest.mark.parametrize( "answer, expected_answers", - zip(_TEST_INPUTS, _TEST_OUTPUTS), + zip(_TEST_INPUTS, _TEST_TEXT_OUTPUTS), ) def test_as_txt_multi_input(answer, expected_answers): - answer_displayers = MultiInputFieldDisplayer(answer).as_txt - for answer_displayer_dict in answer_displayers: - for key, expected_answer in zip(answer_displayer_dict, expected_answers): - assert answer_displayer_dict[key].as_txt == expected_answer + multiinput_as_text = MultiInputFieldDisplayer(answer).as_txt + assert multiinput_as_text == expected_answers @pytest.mark.parametrize( @@ -106,6 +119,6 @@ def test_as_txt_multi_input(answer, expected_answers): ) def test_as_pdf_multi_input(answer, expected_answers): answer_displayers = MultiInputFieldDisplayer(answer).as_pdf - for answer_displayer_dict in answer_displayers: - for key, expected_answer in zip(answer_displayer_dict, expected_answers): + for index, answer_displayer_dict in enumerate(answer_displayers): + for key, expected_answer in zip(answer_displayer_dict, expected_answers[index]): assert answer_displayer_dict[key].as_pdf == expected_answer diff --git a/version b/version index 9c2db5afca..3decb54de8 100644 --- a/version +++ b/version @@ -1 +1 @@ -VERSION=0.1.230 +VERSION=0.1.231