From 3298032c2e24defbfb3a9dad1cc0b803f198d855 Mon Sep 17 00:00:00 2001 From: tferns Date: Wed, 22 Nov 2023 23:57:56 +0000 Subject: [PATCH] FS-3629: Fix tests and multi input --- .github/workflows/test-and-tag-python.yml | 98 +++++++++++++++++++ python/answer_displayers/MultiInputField.py | 12 +-- python/dictionaries.py | 34 ++++--- python/pyproject.toml | 27 +++++ python/setup.cfg | 19 ---- python/setup.py | 10 +- python/tests/test_CheckboxesField.py | 2 +- .../tests/test_ClientSideFileUploadField.py | 2 +- python/tests/test_DatePartsField.py | 2 +- python/tests/test_EmailAddressField.py | 2 +- python/tests/test_FreeTextField.py | 2 +- python/tests/test_MonthYearField.py | 4 +- python/tests/test_MultiInputField.py | 14 +-- python/tests/test_NumberField.py | 2 +- python/tests/test_RadiosField.py | 2 +- python/tests/test_TelephoneNumberField.py | 2 +- python/tests/test_TextField.py | 2 +- python/tests/test_UkAddressField.py | 4 +- python/tests/test_WebsiteField.py | 2 +- python/tests/test_YesNoField.py | 2 +- 20 files changed, 180 insertions(+), 64 deletions(-) create mode 100644 .github/workflows/test-and-tag-python.yml create mode 100644 python/pyproject.toml delete mode 100644 python/setup.cfg diff --git a/.github/workflows/test-and-tag-python.yml b/.github/workflows/test-and-tag-python.yml new file mode 100644 index 0000000000..2e6dc9dd17 --- /dev/null +++ b/.github/workflows/test-and-tag-python.yml @@ -0,0 +1,98 @@ +name: Test and Tag Python tools + +on: + workflow_dispatch: + push: + paths: + - "python/**" # Trigger only on changes in the "python" directory + +jobs: + run-unit-tests: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + + - name: Change working directory to python + run: cd python + + - name: Setup python + id: setup_python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Run tests + run: | + python -m venv .venv + source .venv/bin/activate && python -m pip install --upgrade pip && pip install -r python/requirements.txt + pytest python/tests + + create-release: + runs-on: ubuntu-latest + needs: run-unit-tests + if: github.ref == 'refs/heads/main' + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + + - name: Change working directory to python + run: cd python + + - name: Setup python + id: setup_python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Get package version + id: package_version + run: echo "app_version="$(python setup.py --version) >> $GITHUB_OUTPUT + + - name: Check if tag exists + uses: mukunku/tag-exists-action@v1.0.0 + id: check_tag + with: + tag: ${{ steps.package_version.outputs.app_version }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - uses: ncipollo/release-action@v1 + name: Create Release + id: create_release + if: ${{ steps.check_tag.outputs.exists == 'false' }} + with: + commit: main + tag: ${{ steps.package_version.outputs.app_version }} + token: ${{ secrets.GITHUB_TOKEN }} + + publish-release: + runs-on: ubuntu-latest + needs: create-release + if: github.ref == 'refs/heads/main' + steps: + - uses: actions/checkout@v3 + + - name: Change working directory to python + run: cd python + + - name: Setup python + id: setup_python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Build for publish + id: build_dist + run: | + python -m pip install --upgrade pip && pip install build + python -m build + echo workspace dir $GITHUB_WORKSPACE + + - name: Publish to PyPI + id: publish-to-pypi + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/python/answer_displayers/MultiInputField.py b/python/answer_displayers/MultiInputField.py index 489205c7b8..06582b04b0 100644 --- a/python/answer_displayers/MultiInputField.py +++ b/python/answer_displayers/MultiInputField.py @@ -21,37 +21,37 @@ def _legacy_parsed_answer(self) -> str: ) @property - def _parse_multi_input_component(self) -> list[AnswerDisplayer]: + def _parse_multi_input_component(self) -> dict[str, AnswerDisplayer]: from python.dictionaries import ( EXISTING_KEY_TO_TYPE_DICT, FIELD_TO_DISPLAYER_DICT_MULTI_INPUT, ) raw_answer: list[dict[str, Any]] = self.raw_answer - answer_displayers: list[AnswerDisplayer] = [] + answer_displayers: dict[str, AnswerDisplayer] = {} for answer_tuple in raw_answer: for key, answer in answer_tuple.items(): answer_type = EXISTING_KEY_TO_TYPE_DICT[key] displayer = FIELD_TO_DISPLAYER_DICT_MULTI_INPUT[answer_type](answer) - answer_displayers.append(displayer) + answer_displayers[key] = displayer return answer_displayers @property - def as_csv(self) -> str | list[AnswerDisplayer]: + def as_csv(self) -> str | dict[str, AnswerDisplayer]: if self.legacy: return self._legacy_parsed_answer else: return self._parse_multi_input_component @property - def as_txt(self) -> str | list[AnswerDisplayer]: + def as_txt(self) -> str | dict[str, AnswerDisplayer]: if self.legacy: return self._legacy_parsed_answer else: return self._parse_multi_input_component @property - def as_pdf(self) -> str | list[AnswerDisplayer]: + def as_pdf(self) -> str | dict[str, AnswerDisplayer]: if self.legacy: return self._legacy_parsed_answer else: diff --git a/python/dictionaries.py b/python/dictionaries.py index 0b491a8fa1..3538b80ab1 100644 --- a/python/dictionaries.py +++ b/python/dictionaries.py @@ -1,19 +1,21 @@ -from python import CheckboxesFieldDisplayer -from python import ClientSideFileUploadFieldDisplayer -from python import DatePartsFieldDisplayer -from python import EmailAddressFieldDisplayer -from python import FreeTextFieldDisplayer -from python import MonthYearFieldDisplayer -from python import MonthYearFieldDisplayerMultiInput -from python import MultiInputFieldDisplayer -from python import NumberFieldDisplayer -from python import RadiosFieldDisplayer -from python import TelephoneNumberFieldDisplayer -from python import TextFieldDisplayer -from python import UkAddressFieldDisplayer -from python import UkAddressFieldDisplayerMultiInput -from python import WebsiteFieldDisplayer -from python import YesNoFieldDisplayer +from python.answer_displayers.CheckboxesField import CheckboxesFieldDisplayer +from python.answer_displayers.ClientSideFileUploadField import ( + ClientSideFileUploadFieldDisplayer, +) +from python.answer_displayers.DatePartsField import DatePartsFieldDisplayer +from python.answer_displayers.EmailAddressField import EmailAddressFieldDisplayer +from python.answer_displayers.FreeTextField import FreeTextFieldDisplayer +from python.answer_displayers.MonthYearField import MonthYearFieldDisplayer +from python.answer_displayers.MonthYearField import MonthYearFieldDisplayerMultiInput +from python.answer_displayers.MultiInputField import MultiInputFieldDisplayer +from python.answer_displayers.NumberField import NumberFieldDisplayer +from python.answer_displayers.RadiosField import RadiosFieldDisplayer +from python.answer_displayers.TelephoneNumberField import TelephoneNumberFieldDisplayer +from python.answer_displayers.TextField import TextFieldDisplayer +from python.answer_displayers.UkAddressField import UkAddressFieldDisplayer +from python.answer_displayers.UkAddressField import UkAddressFieldDisplayerMultiInput +from python.answer_displayers.WebsiteField import WebsiteFieldDisplayer +from python.answer_displayers.YesNoField import YesNoFieldDisplayer FIELD_TO_DISPLAYER_DICT_MULTI_INPUT = { "CheckboxesField": CheckboxesFieldDisplayer, diff --git a/python/pyproject.toml b/python/pyproject.toml new file mode 100644 index 0000000000..818d853ba3 --- /dev/null +++ b/python/pyproject.toml @@ -0,0 +1,27 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "funding-service-design-digital-form-builder-tools" +version = "0.0.1" +authors = [ + { name="DLUHC", email="FundingServiceDesignTeam@levellingup.gov.uk" }, +] +description = "Python tools for our fork of the digital-form-builder" +readme = "README.md" +license = { file = "LICENSE" } +requires-python = ">=3.10" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", +] + +[dependencies] +beautifulsoup4 = "4.12.2" + + +[project.urls] +"Bug Tracker" = "https://github.com/tferns/fsd-digital-form-builder-tools/issues" +"Homepage" = "https://github.com/tferns/fsd-digital-form-builder-tools" diff --git a/python/setup.cfg b/python/setup.cfg deleted file mode 100644 index cb3d492733..0000000000 --- a/python/setup.cfg +++ /dev/null @@ -1,19 +0,0 @@ -[metadata] -name = funding-service-design-digital-form-builder-tools -version = 0.0.1 -author = Thomas Ferns -author_email = thomas.ferns@version1.com -description = Python tools for our fork of the digital-form-builder -long_description = file: README.md -long_description_content_type = text/markdown -url = https://github.com/tferns/fsd-digital-form-builder-tools -project_urls = - Bug Tracker = https://github.com/tferns/fsd-digital-form-builder-tools/issues -classifiers = - Programming Language :: Python :: 3 - License :: OSI Approved :: MIT License - Operating System :: OS Independent - -[options] -packages = find: -python_requires = >=3.10 diff --git a/python/setup.py b/python/setup.py index 606849326a..9a231a23b8 100644 --- a/python/setup.py +++ b/python/setup.py @@ -1,3 +1,11 @@ +from setuptools import find_packages from setuptools import setup -setup() +package_data = {"": ["*"]} + +setup_kwargs = { + "packages": find_packages(), + "package_data": package_data, +} + +setup(**setup_kwargs) diff --git a/python/tests/test_CheckboxesField.py b/python/tests/test_CheckboxesField.py index 9fe2f8790e..adf9384be9 100644 --- a/python/tests/test_CheckboxesField.py +++ b/python/tests/test_CheckboxesField.py @@ -1,5 +1,5 @@ import pytest -from python.components.CheckboxesField import CheckboxesFieldDisplayer +from python.answer_displayers.CheckboxesField import CheckboxesFieldDisplayer _TEST_INPUTS = [ ["community-pride", "delivering-positive"], diff --git a/python/tests/test_ClientSideFileUploadField.py b/python/tests/test_ClientSideFileUploadField.py index 974f743635..7af426db31 100644 --- a/python/tests/test_ClientSideFileUploadField.py +++ b/python/tests/test_ClientSideFileUploadField.py @@ -1,5 +1,5 @@ import pytest -from python.components.ClientSideFileUploadField import ( +from python.answer_displayers.ClientSideFileUploadField import ( ClientSideFileUploadFieldDisplayer, ) diff --git a/python/tests/test_DatePartsField.py b/python/tests/test_DatePartsField.py index 07ebef0f58..980661f259 100644 --- a/python/tests/test_DatePartsField.py +++ b/python/tests/test_DatePartsField.py @@ -1,5 +1,5 @@ import pytest -from python.components.DatePartsField import DatePartsFieldDisplayer +from python.answer_displayers.DatePartsField import DatePartsFieldDisplayer _TEST_INPUTS = [ "2022-12-01", diff --git a/python/tests/test_EmailAddressField.py b/python/tests/test_EmailAddressField.py index 3c2259d4cb..c341e9871e 100644 --- a/python/tests/test_EmailAddressField.py +++ b/python/tests/test_EmailAddressField.py @@ -1,5 +1,5 @@ import pytest -from python.components.EmailAddressField import EmailAddressFieldDisplayer +from python.answer_displayers.EmailAddressField import EmailAddressFieldDisplayer _TEST_INPUTS = _TEST_OUTPUTS = [ "testemailfundingservice@testemailfundingservice.com", diff --git a/python/tests/test_FreeTextField.py b/python/tests/test_FreeTextField.py index 740c9c0238..81add983ef 100644 --- a/python/tests/test_FreeTextField.py +++ b/python/tests/test_FreeTextField.py @@ -1,5 +1,5 @@ import pytest -from python.components.FreeTextField import FreeTextFieldDisplayer +from python.answer_displayers.FreeTextField import FreeTextFieldDisplayer _TEST_INPUTS = [ "Tell us how you have engaged with the community about your intention to take ownership of the asset", diff --git a/python/tests/test_MonthYearField.py b/python/tests/test_MonthYearField.py index c3410f89cf..0c229ed3b5 100644 --- a/python/tests/test_MonthYearField.py +++ b/python/tests/test_MonthYearField.py @@ -1,6 +1,6 @@ import pytest -from python.components.MonthYearField import MonthYearFieldDisplayer -from python.components.MonthYearField import MonthYearFieldDisplayerMultiInput +from python.answer_displayers.MonthYearField import MonthYearFieldDisplayer +from python.answer_displayers.MonthYearField import MonthYearFieldDisplayerMultiInput _TEST_INPUTS = [ "2022-04", diff --git a/python/tests/test_MultiInputField.py b/python/tests/test_MultiInputField.py index a4693ad17e..37939dd5ff 100644 --- a/python/tests/test_MultiInputField.py +++ b/python/tests/test_MultiInputField.py @@ -1,5 +1,5 @@ import pytest -from python.components.MultiInputField import MultiInputFieldDisplayer +from python.answer_displayers.MultiInputField import MultiInputFieldDisplayer _TEST_INPUTS_LEGACY = [ ["Test : \u00a3100"], @@ -84,8 +84,8 @@ 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, expected_answer in zip(answer_displayers, expected_answers): - assert answer_displayer.as_csv == expected_answer + for key, expected_answer in zip(answer_displayers, expected_answers): + assert answer_displayers[key].as_csv == expected_answer @pytest.mark.parametrize( @@ -94,8 +94,8 @@ def test_as_csv_multi_input(answer, expected_answers): ) def test_as_txt_multi_input(answer, expected_answers): answer_displayers = MultiInputFieldDisplayer(answer).as_txt - for answer_displayer, expected_answer in zip(answer_displayers, expected_answers): - assert answer_displayer.as_txt == expected_answer + for key, expected_answer in zip(answer_displayers, expected_answers): + assert answer_displayers[key].as_txt == expected_answer @pytest.mark.parametrize( @@ -104,5 +104,5 @@ 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, expected_answer in zip(answer_displayers, expected_answers): - assert answer_displayer.as_pdf == expected_answer + for key, expected_answer in zip(answer_displayers, expected_answers): + assert answer_displayers[key].as_pdf == expected_answer diff --git a/python/tests/test_NumberField.py b/python/tests/test_NumberField.py index f7fc2603b1..352210aff7 100644 --- a/python/tests/test_NumberField.py +++ b/python/tests/test_NumberField.py @@ -1,5 +1,5 @@ import pytest -from python.components.NumberField import NumberFieldDisplayer +from python.answer_displayers.NumberField import NumberFieldDisplayer _TEST_INPUTS = [ "2300", diff --git a/python/tests/test_RadiosField.py b/python/tests/test_RadiosField.py index de99d97b2f..a356c2b0b6 100644 --- a/python/tests/test_RadiosField.py +++ b/python/tests/test_RadiosField.py @@ -1,5 +1,5 @@ import pytest -from python.components.RadiosField import RadiosFieldDisplayer +from python.answer_displayers.RadiosField import RadiosFieldDisplayer _TEST_INPUTS = [ "CIO", diff --git a/python/tests/test_TelephoneNumberField.py b/python/tests/test_TelephoneNumberField.py index cac9689eca..48ca774c55 100644 --- a/python/tests/test_TelephoneNumberField.py +++ b/python/tests/test_TelephoneNumberField.py @@ -1,5 +1,5 @@ import pytest -from python.components.TelephoneNumberField import TelephoneNumberFieldDisplayer +from python.answer_displayers.TelephoneNumberField import TelephoneNumberFieldDisplayer _TEST_INPUTS = _TEST_OUTPUTS = [ "332323232", diff --git a/python/tests/test_TextField.py b/python/tests/test_TextField.py index f4c33e7980..5490533e38 100644 --- a/python/tests/test_TextField.py +++ b/python/tests/test_TextField.py @@ -1,5 +1,5 @@ import pytest -from python.components.TextField import TextFieldDisplayer +from python.answer_displayers.TextField import TextFieldDisplayer _TEST_INPUTS = _TEST_OUTPUTS = [ "ghjghj", diff --git a/python/tests/test_UkAddressField.py b/python/tests/test_UkAddressField.py index a3dc8d07da..d0f7767a7e 100644 --- a/python/tests/test_UkAddressField.py +++ b/python/tests/test_UkAddressField.py @@ -1,6 +1,6 @@ import pytest -from python.components.UkAddressField import UkAddressFieldDisplayer -from python.components.UkAddressField import UkAddressFieldDisplayerMultiInput +from python.answer_displayers.UkAddressField import UkAddressFieldDisplayer +from python.answer_displayers.UkAddressField import UkAddressFieldDisplayerMultiInput _TEST_INPUTS = [ "test, null, test, null, te3 2bf", diff --git a/python/tests/test_WebsiteField.py b/python/tests/test_WebsiteField.py index 963b371127..f14d579189 100644 --- a/python/tests/test_WebsiteField.py +++ b/python/tests/test_WebsiteField.py @@ -1,5 +1,5 @@ import pytest -from python.components.WebsiteField import WebsiteFieldDisplayer +from python.answer_displayers.WebsiteField import WebsiteFieldDisplayer _TEST_INPUTS = _TEST_OUTPUTS = [ "https://github.com/serenity-bdd/serenity-cucumber-starter", diff --git a/python/tests/test_YesNoField.py b/python/tests/test_YesNoField.py index 182aafe740..6c2487bcd6 100644 --- a/python/tests/test_YesNoField.py +++ b/python/tests/test_YesNoField.py @@ -1,5 +1,5 @@ import pytest -from python.components.YesNoField import YesNoFieldDisplayer +from python.answer_displayers.YesNoField import YesNoFieldDisplayer _TEST_INPUTS = [ True,