From 2b90ba0bbbc1d9291176fb71361d356e1f645e8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 09:05:21 +0000 Subject: [PATCH 01/12] chore: Bump the development-dependencies group with 9 updates Bumps the development-dependencies group with 9 updates: | Package | From | To | | --- | --- | --- | | [black](https://github.com/psf/black) | `23.3.0` | `23.7.0` | | [coverage](https://github.com/nedbat/coveragepy) | `7.2.7` | `7.3.0` | | [flake8](https://github.com/pycqa/flake8) | `6.0.0` | `6.1.0` | | [mypy](https://github.com/python/mypy) | `1.2.0` | `1.5.1` | | [tox](https://github.com/tox-dev/tox) | `4.6.4` | `4.8.0` | | [twine](https://github.com/pypa/twine) | `3.1.1` | `4.0.2` | | [types-jsonschema](https://github.com/python/typeshed) | `4.17.0.6` | `4.17.0.10` | | [types-pytz](https://github.com/python/typeshed) | `2023.3.0.0` | `2023.3.0.1` | | [wheel](https://github.com/pypa/wheel) | `0.41.0` | `0.41.2` | Updates `black` from 23.3.0 to 23.7.0 - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.3.0...23.7.0) Updates `coverage` from 7.2.7 to 7.3.0 - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.2.7...7.3.0) Updates `flake8` from 6.0.0 to 6.1.0 - [Commits](https://github.com/pycqa/flake8/compare/6.0.0...6.1.0) Updates `mypy` from 1.2.0 to 1.5.1 - [Commits](https://github.com/python/mypy/compare/v1.2.0...v1.5.1) Updates `tox` from 4.6.4 to 4.8.0 - [Release notes](https://github.com/tox-dev/tox/releases) - [Changelog](https://github.com/tox-dev/tox/blob/main/docs/changelog.rst) - [Commits](https://github.com/tox-dev/tox/compare/4.6.4...4.8.0) Updates `twine` from 3.1.1 to 4.0.2 - [Release notes](https://github.com/pypa/twine/releases) - [Changelog](https://github.com/pypa/twine/blob/main/docs/changelog.rst) - [Commits](https://github.com/pypa/twine/compare/3.1.1...4.0.2) Updates `types-jsonschema` from 4.17.0.6 to 4.17.0.10 - [Commits](https://github.com/python/typeshed/commits) Updates `types-pytz` from 2023.3.0.0 to 2023.3.0.1 - [Commits](https://github.com/python/typeshed/commits) Updates `wheel` from 0.41.0 to 0.41.2 - [Changelog](https://github.com/pypa/wheel/blob/main/docs/news.rst) - [Commits](https://github.com/pypa/wheel/compare/0.41.0...0.41.2) --- updated-dependencies: - dependency-name: black dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development-dependencies - dependency-name: coverage dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development-dependencies - dependency-name: flake8 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development-dependencies - dependency-name: mypy dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development-dependencies - dependency-name: tox dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development-dependencies - dependency-name: twine dependency-type: direct:development update-type: version-update:semver-major dependency-group: development-dependencies - dependency-name: types-jsonschema dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development-dependencies - dependency-name: types-pytz dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development-dependencies - dependency-name: wheel dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development-dependencies ... Signed-off-by: dependabot[bot] --- requirements-dev.in | 18 +++++++-------- requirements-dev.txt | 52 +++++++++++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/requirements-dev.in b/requirements-dev.in index 7544b466..45b5a4bb 100644 --- a/requirements-dev.in +++ b/requirements-dev.in @@ -4,15 +4,15 @@ -c requirements.txt -black==23.3.0 +black==23.7.0 bumpversion==0.5.3 -coverage==7.2.7 -flake8==6.0.0 +coverage==7.3.0 +flake8==6.1.0 isort==5.12.0 -mypy==1.2.0 -tox==4.6.4 -twine==3.1.1 -types-jsonschema==4.17.0.6 +mypy==1.5.1 +tox==4.8.0 +twine==4.0.2 +types-jsonschema==4.17.0.10 types-pyOpenSSL==23.2.0.2 -types-pytz==2023.3.0.0 -wheel==0.41.0 +types-pytz==2023.3.0.1 +wheel==0.41.2 diff --git a/requirements-dev.txt b/requirements-dev.txt index f1ad5180..9e647744 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,7 +4,7 @@ # # pip-compile --strip-extras requirements-dev.in # -black==23.3.0 +black==23.7.0 # via -r requirements-dev.in bleach==5.0.1 # via readme-renderer @@ -28,7 +28,7 @@ click==8.0.3 # via black colorama==0.4.6 # via tox -coverage==7.2.7 +coverage==7.3.0 # via -r requirements-dev.in cryptography==41.0.3 # via @@ -43,10 +43,14 @@ filelock==3.12.2 # via # tox # virtualenv -flake8==6.0.0 +flake8==6.1.0 # via -r requirements-dev.in idna==2.10 # via requests +importlib-metadata==6.1.0 + # via + # -c requirements.txt + # twine isort==5.12.0 # via -r requirements-dev.in jeepney==0.8.0 @@ -55,9 +59,13 @@ jeepney==0.8.0 # secretstorage keyring==21.4.0 # via twine +markdown-it-py==3.0.0 + # via rich mccabe==0.7.0 # via flake8 -mypy==1.2.0 +mdurl==0.1.2 + # via markdown-it-py +mypy==1.5.1 # via -r requirements-dev.in mypy-extensions==1.0.0 # via @@ -80,16 +88,18 @@ platformdirs==3.9.1 # virtualenv pluggy==1.2.0 # via tox -pycodestyle==2.10.0 +pycodestyle==2.11.0 # via flake8 pycparser==2.20 # via # -c requirements.txt # cffi -pyflakes==3.0.1 +pyflakes==3.1.0 # via flake8 pygments==2.15.0 - # via readme-renderer + # via + # readme-renderer + # rich pyproject-api==1.5.3 # via tox readme-renderer==35.0 @@ -100,6 +110,10 @@ requests==2.31.0 # twine requests-toolbelt==0.9.1 # via twine +rfc3986==2.0.0 + # via twine +rich==13.5.2 + # via twine secretstorage==3.3.3 # via keyring six==1.16.0 @@ -110,31 +124,33 @@ tomli==2.0.1 # mypy # pyproject-api # tox -tox==4.6.4 +tox==4.8.0 # via -r requirements-dev.in -tqdm==4.64.0 - # via twine -twine==3.1.1 +twine==4.0.2 # via -r requirements-dev.in -types-jsonschema==4.17.0.6 +types-jsonschema==4.17.0.10 # via -r requirements-dev.in types-pyopenssl==23.2.0.2 # via -r requirements-dev.in -types-pytz==2023.3.0.0 +types-pytz==2023.3.0.1 # via -r requirements-dev.in typing-extensions==4.3.0 # via # -c requirements.txt # black # mypy + # rich urllib3==1.26.12 - # via requests + # via + # requests + # twine virtualenv==20.24.1 # via tox webencodings==0.5.1 # via bleach -wheel==0.41.0 +wheel==0.41.2 # via -r requirements-dev.in - -# The following packages are considered to be unsafe in a requirements file: -# setuptools +zipp==3.8.1 + # via + # -c requirements.txt + # importlib-metadata From ac99cd2d431b11ffd89213f489b5f0bac778b244 Mon Sep 17 00:00:00 2001 From: Jose Tomas Robles Hahn Date: Tue, 5 Sep 2023 15:19:23 -0300 Subject: [PATCH 02/12] fix(libs): Fix errors reported by Flake8 Fix the following error: ```text E721 do not compare types, for exact checks use `is` / `is not`, for instance checks use `isinstance()` ``` --- cl_sii/libs/dataclass_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cl_sii/libs/dataclass_utils.py b/cl_sii/libs/dataclass_utils.py index 71180ebd..55ff9135 100644 --- a/cl_sii/libs/dataclass_utils.py +++ b/cl_sii/libs/dataclass_utils.py @@ -84,7 +84,7 @@ def dc_deep_compare(value_a: object, value_b: object) -> DcDeepComparison: def _dc_deep_compare_to(value_a: object, value_b: object) -> DcDeepComparison: - if type(value_a) != type(value_b): + if type(value_a) is not type(value_b): raise TypeError("Values to be compared must be of the same type.") if value_a == value_b: From 3bcd12f681789114b3903246d4aa0dd87d88f33c Mon Sep 17 00:00:00 2001 From: Jose Tomas Robles Hahn Date: Tue, 5 Sep 2023 20:15:48 -0300 Subject: [PATCH 03/12] chore(deps): Update `typing-extensions` from 4.3.0 to 4.7.1 - [Software Repository](https://pypi.org/project/typing-extensions/4.7.1/) - [Release notes](https://github.com/python/typing_extensions/releases/tag/4.7.1) - [Changelog](https://github.com/python/typing_extensions/blob/4.7.1/CHANGELOG.md#release-471-july-2-2023) - [Commits](https://github.com/python/typing_extensions/compare/4.3.0...4.7.1) --- requirements-dev.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 9e647744..98c70a5b 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -134,7 +134,7 @@ types-pyopenssl==23.2.0.2 # via -r requirements-dev.in types-pytz==2023.3.0.1 # via -r requirements-dev.in -typing-extensions==4.3.0 +typing-extensions==4.7.1 # via # -c requirements.txt # black diff --git a/requirements.txt b/requirements.txt index 1b7a85b6..268afe88 100644 --- a/requirements.txt +++ b/requirements.txt @@ -60,7 +60,7 @@ signxml==3.2.0 # via -r requirements.in sqlparse==0.4.4 # via django -typing-extensions==4.3.0 +typing-extensions==4.7.1 # via pydantic zipp==3.8.1 # via From ee4374f3da7081fe78acb093791764e49bf4b0ce Mon Sep 17 00:00:00 2001 From: Jose Tomas Robles Hahn Date: Wed, 6 Sep 2023 20:22:10 -0300 Subject: [PATCH 04/12] fix: Fix errors reported by EditorConfig-Checker Add specific EditorConfig files for the following directories: - `cl_sii/data/ref/factura_electronica/schemas-xml/` - `tests/test_data/` --- .../factura_electronica/schemas-xml/.editorconfig | 5 +++++ tests/test_data/.editorconfig | 13 +++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 cl_sii/data/ref/factura_electronica/schemas-xml/.editorconfig create mode 100644 tests/test_data/.editorconfig diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/.editorconfig b/cl_sii/data/ref/factura_electronica/schemas-xml/.editorconfig new file mode 100644 index 00000000..60d734ac --- /dev/null +++ b/cl_sii/data/ref/factura_electronica/schemas-xml/.editorconfig @@ -0,0 +1,5 @@ +[*.xsd] +end_of_line = unset +indent_style = unset +trim_trailing_whitespace = unset +insert_final_newline = unset diff --git a/tests/test_data/.editorconfig b/tests/test_data/.editorconfig new file mode 100644 index 00000000..d62a098d --- /dev/null +++ b/tests/test_data/.editorconfig @@ -0,0 +1,13 @@ +[*.der] +end_of_line = unset +insert_final_newline = unset + +[*.pem] +end_of_line = unset +insert_final_newline = unset + +[*.xml] +end_of_line = unset +indent_style = unset +trim_trailing_whitespace = unset +insert_final_newline = unset From a66e0374e360333c167508e6fc8bbe4bc0a1a5a0 Mon Sep 17 00:00:00 2001 From: Jose Tomas Robles Hahn Date: Wed, 9 Aug 2023 17:52:15 -0400 Subject: [PATCH 05/12] chore: Add `src/` for change of Python project structure to Src layout --- src/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/.keep diff --git a/src/.keep b/src/.keep new file mode 100644 index 00000000..e69de29b From 347201cc5442962a0bd764df28bd4709e5b3fcd6 Mon Sep 17 00:00:00 2001 From: Jose Tomas Robles Hahn Date: Wed, 9 Aug 2023 17:53:20 -0400 Subject: [PATCH 06/12] chore: Change Python project structure from Flat layout to Src layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This project currently uses a “flat layout”. This commit changes the project structure to a “src layout”. > The “flat layout” refers to organising a project’s files in a folder > or repository, such that the various configuration files and import > packages are all in the top-level directory. > The “src layout” deviates from the flat layout by moving the code that > is intended to be importable (i.e. `import awesome_package`, also > known as import packages) into a subdirectory. This subdirectory is > typically named `src/`, hence “src layout”. Two advantages of the src layout are: > - It helps prevent accidental usage of the in-development copy of the > code. > - The src layout helps enforce that an editable installation is only > able to import files that were meant to be importable. Related documentation: - [Src Layout vs Flat Layout ← Python Packaging User Guide](https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/) - [Package Discovery and Namespace Packages ← Setuptools documentation](https://setuptools.pypa.io/en/stable/userguide/package_discovery.html#automatic-discovery) --- {cl_sii => src/cl_sii}/__init__.py | 0 {cl_sii => src/cl_sii}/base/__init__.py | 0 {cl_sii => src/cl_sii}/base/constants.py | 0 {cl_sii => src/cl_sii}/contribuyente/__init__.py | 0 {cl_sii => src/cl_sii}/contribuyente/constants.py | 0 {cl_sii => src/cl_sii}/cte/__init__.py | 0 {cl_sii => src/cl_sii}/cte/f29/__init__.py | 0 {cl_sii => src/cl_sii}/cte/f29/data_models.py | 0 {cl_sii => src/cl_sii}/cte/f29/parse_datos_obj.py | 0 .../data/cte/f29_datos_obj_missing_key_fixes.json | 0 .../data/cte/schemas-json/f29_datos_obj.schema.json | 0 .../factura_electronica/schemas-xml/.editorconfig | 0 .../ref/factura_electronica/schemas-xml/AEC_v10.xsd | 0 .../factura_electronica/schemas-xml/Cesion_v10.xsd | 0 .../schemas-xml/DTECedido_v10.xsd | 0 .../ref/factura_electronica/schemas-xml/DTE_v10.xsd | 0 .../schemas-xml/EnvioDTE_v10.xsd | 0 .../factura_electronica/schemas-xml/LceCal_v10.xsd | 0 .../schemas-xml/LceCoCertif_v10.xsd | 0 .../schemas-xml/LceSiiTypes_v10.xsd | 0 .../factura_electronica/schemas-xml/LibroCV_v10.xsd | 0 .../ref/factura_electronica/schemas-xml/README.md | 0 .../factura_electronica/schemas-xml/Recibos_v10.xsd | 0 .../schemas-xml/SiiTypes_v10.xsd | 0 .../schemas-xml/xmldsignature_v10.xsd | 0 {cl_sii => src/cl_sii}/dte/__init__.py | 0 {cl_sii => src/cl_sii}/dte/constants.py | 0 {cl_sii => src/cl_sii}/dte/data_models.py | 0 {cl_sii => src/cl_sii}/dte/parse.py | 0 {cl_sii => src/cl_sii}/extras/__init__.py | 0 {cl_sii => src/cl_sii}/extras/dj_form_fields.py | 0 {cl_sii => src/cl_sii}/extras/dj_model_fields.py | 0 {cl_sii => src/cl_sii}/extras/drf_fields.py | 0 {cl_sii => src/cl_sii}/extras/mm_fields.py | 0 {cl_sii => src/cl_sii}/libs/__init__.py | 0 {cl_sii => src/cl_sii}/libs/crypto_utils.py | 0 {cl_sii => src/cl_sii}/libs/csv_utils.py | 0 {cl_sii => src/cl_sii}/libs/dataclass_utils.py | 0 {cl_sii => src/cl_sii}/libs/encoding_utils.py | 0 {cl_sii => src/cl_sii}/libs/io_utils.py | 0 {cl_sii => src/cl_sii}/libs/json_utils.py | 0 {cl_sii => src/cl_sii}/libs/mm_utils.py | 0 {cl_sii => src/cl_sii}/libs/rows_processing.py | 0 {cl_sii => src/cl_sii}/libs/tz_utils.py | 0 {cl_sii => src/cl_sii}/libs/xml_utils.py | 0 {cl_sii => src/cl_sii}/py.typed | 0 {cl_sii => src/cl_sii}/rcv/__init__.py | 0 {cl_sii => src/cl_sii}/rcv/constants.py | 0 {cl_sii => src/cl_sii}/rcv/data_models.py | 0 {cl_sii => src/cl_sii}/rcv/parse_csv.py | 0 {cl_sii => src/cl_sii}/rtc/__init__.py | 0 {cl_sii => src/cl_sii}/rtc/constants.py | 0 {cl_sii => src/cl_sii}/rtc/data_models.py | 0 {cl_sii => src/cl_sii}/rtc/data_models_aec.py | 0 .../cl_sii}/rtc/data_models_cesiones_periodo.py | 0 {cl_sii => src/cl_sii}/rtc/parse_aec.py | 0 {cl_sii => src/cl_sii}/rtc/xml_utils.py | 0 {cl_sii => src/cl_sii}/rut/__init__.py | 0 {cl_sii => src/cl_sii}/rut/constants.py | 0 {cl_sii => src/cl_sii}/rut/crypto_utils.py | 0 {scripts => src/scripts}/canonicalize_xml_file.py | 0 {scripts => src/scripts}/clean_dte_xml_file.py | 0 {scripts => src/scripts}/example.py | 0 {tests => src/tests}/__init__.py | 0 {tests => src/tests}/cte_f29_factories.py | 0 {tests => src/tests}/test_contribuyente.py | 0 {tests => src/tests}/test_cte_f29_data_models.py | 0 .../tests}/test_cte_f29_parse_datos_obj.py | 0 {tests => src/tests}/test_data/.editorconfig | 0 .../test_data/crypto/wildcard-google-com-cert.der | Bin .../test_data/crypto/wildcard-google-com-cert.pem | 0 .../AEC--76354771-K--33--170--SEQ-2-cert.der | Bin .../AEC--76354771-K--33--170--SEQ-2-cert.pem | 0 ...771-K--33--170--SEQ-2-signature-value-base64.txt | 0 .../AEC--76399752-9--33--25568--SEQ-1-cert.der | Bin .../AEC--76399752-9--33--25568--SEQ-1-cert.pem | 0 ...2-9--33--25568--SEQ-1-signature-value-base64.txt | 0 .../DTE--60910000-1--33--2336600-cert.der | Bin .../DTE--60910000-1--33--2336600-cert.pem | 0 ...910000-1--33--2336600-signature-value-base64.txt | 0 .../sii-crypto/DTE--76354771-K--33--170-cert.der | Bin .../sii-crypto/DTE--76354771-K--33--170-cert.pem | 0 ...--76354771-K--33--170-signature-value-base64.txt | 0 .../sii-crypto/DTE--76399752-9--33--25568-cert.der | Bin .../sii-crypto/DTE--76399752-9--33--25568-cert.pem | 0 ...76399752-9--33--25568-signature-value-base64.txt | 0 .../sii-crypto/DTE--96670340-7--61--110616-cert.der | Bin .../sii-crypto/DTE--96670340-7--61--110616-cert.pem | 0 ...6670340-7--61--110616-signature-value-base64.txt | 0 .../tests}/test_data/sii-crypto/prueba-sii-cert.der | Bin .../tests}/test_data/sii-crypto/prueba-sii-cert.pem | 0 ...9-6600000016-datos-obj-fake-missing-code-49.json | 0 ...--61002000-3--f29-6600000016-datos-obj-fake.json | 0 ...e--6286736-1--f29-6700000056-datos-obj-fake.json | 0 .../DTE--60910000-1--33--2336600--cleaned.xml | 0 .../sii-dte/DTE--60910000-1--33--2336600.xml | 0 ...1-K--33--170--cleaned-mod-bad-cert-no-base64.xml | 0 ...E--76354771-K--33--170--cleaned-mod-bad-cert.xml | 0 ...354771-K--33--170--cleaned-mod-changed-monto.xml | 0 ...6354771-K--33--170--cleaned-mod-empty-emails.xml | 0 ...71-K--33--170--cleaned-mod-removed-signature.xml | 0 ...354771-K--33--170--cleaned-mod-replaced-cert.xml | 0 ...--76354771-K--33--170--cleaned-signature_xml.xml | 0 ...TE--76354771-K--33--170--cleaned-signed_data.xml | 0 ...DTE--76354771-K--33--170--cleaned-signed_xml.xml | 0 .../sii-dte/DTE--76354771-K--33--170--cleaned.xml | 0 .../test_data/sii-dte/DTE--76354771-K--33--170.xml | 0 .../sii-dte/DTE--76399752-9--33--25568--cleaned.xml | 0 .../sii-dte/DTE--76399752-9--33--25568.xml | 0 .../DTE--96670340-7--61--110616--cleaned.xml | 0 .../sii-dte/DTE--96670340-7--61--110616.xml | 0 ...ra-no_incluir-rz_leading_trailing_whitespace.csv | 0 ...pra-pendiente-rz_leading_trailing_whitespace.csv | 0 ...pra-reclamado-rz_leading_trailing_whitespace.csv | 0 ...mpra-registro-rz_leading_trailing_whitespace.csv | 0 .../RCV-venta-rz_leading_trailing_whitespace.csv | 0 ...-170--SEQ-2-canonicalized-c14n-signature_xml.xml | 0 ...3--170--SEQ-2-canonicalized-c14n-signed_data.xml | 0 ...33--170--SEQ-2-canonicalized-c14n-signed_xml.xml | 0 ...6354771-K--33--170--SEQ-2-canonicalized-c14n.xml | 0 .../sii-rtc/AEC--76354771-K--33--170--SEQ-2.xml | 0 .../sii-rtc/AEC--76399752-9--33--25568--SEQ-1.xml | 0 .../test_data/xml/attacks/billion-laughs-1.xml | 0 .../test_data/xml/attacks/billion-laughs-2.xml | 0 .../attacks/external-entity-expansion-remote.xml | 0 .../attacks/quadratic-blowup-entity-expansion.xml | 0 {tests => src/tests}/test_data/xml/trivial-doc.xml | 0 {tests => src/tests}/test_data/xml/trivial.xml | 0 {tests => src/tests}/test_dte.py | 0 {tests => src/tests}/test_dte_constants.py | 0 {tests => src/tests}/test_dte_data_models.py | 0 {tests => src/tests}/test_dte_parse.py | 0 {tests => src/tests}/test_extras_dj_form_fields.py | 0 {tests => src/tests}/test_extras_dj_model_fields.py | 0 {tests => src/tests}/test_extras_drf_fields.py | 0 {tests => src/tests}/test_extras_mm_fields.py | 0 {tests => src/tests}/test_libs_crypto_utils.py | 0 {tests => src/tests}/test_libs_csv_utils.py | 0 {tests => src/tests}/test_libs_dataclass_utils.py | 0 {tests => src/tests}/test_libs_encoding_utils.py | 0 {tests => src/tests}/test_libs_io_utils.py | 0 {tests => src/tests}/test_libs_json_utils.py | 0 {tests => src/tests}/test_libs_mm_utils.py | 0 {tests => src/tests}/test_libs_rows_processing.py | 0 {tests => src/tests}/test_libs_tz_utils.py | 0 {tests => src/tests}/test_libs_xml_utils.py | 0 {tests => src/tests}/test_rcv_constants.py | 0 {tests => src/tests}/test_rcv_data_models.py | 0 {tests => src/tests}/test_rcv_parse_csv.py | 0 {tests => src/tests}/test_rtc_constants.py | 0 {tests => src/tests}/test_rtc_data_models.py | 0 {tests => src/tests}/test_rtc_data_models_aec.py | 0 .../tests}/test_rtc_data_models_cesiones_periodo.py | 0 {tests => src/tests}/test_rtc_parse_aec.py | 0 {tests => src/tests}/test_rtc_xml_utils.py | 0 {tests => src/tests}/test_rut.py | 0 {tests => src/tests}/test_rut_crypto_utils.py | 0 .../tests}/test_scripts_canonicalize_xml_file.py | 0 .../tests}/test_scripts_clean_dte_xml_file.py | 0 {tests => src/tests}/utils.py | 0 160 files changed, 0 insertions(+), 0 deletions(-) rename {cl_sii => src/cl_sii}/__init__.py (100%) rename {cl_sii => src/cl_sii}/base/__init__.py (100%) rename {cl_sii => src/cl_sii}/base/constants.py (100%) rename {cl_sii => src/cl_sii}/contribuyente/__init__.py (100%) rename {cl_sii => src/cl_sii}/contribuyente/constants.py (100%) rename {cl_sii => src/cl_sii}/cte/__init__.py (100%) rename {cl_sii => src/cl_sii}/cte/f29/__init__.py (100%) rename {cl_sii => src/cl_sii}/cte/f29/data_models.py (100%) rename {cl_sii => src/cl_sii}/cte/f29/parse_datos_obj.py (100%) rename {cl_sii => src/cl_sii}/data/cte/f29_datos_obj_missing_key_fixes.json (100%) rename {cl_sii => src/cl_sii}/data/cte/schemas-json/f29_datos_obj.schema.json (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/.editorconfig (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/AEC_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/Cesion_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/DTECedido_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/LceCal_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/LceCoCertif_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/LceSiiTypes_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/LibroCV_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/README.md (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/Recibos_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/SiiTypes_v10.xsd (100%) rename {cl_sii => src/cl_sii}/data/ref/factura_electronica/schemas-xml/xmldsignature_v10.xsd (100%) rename {cl_sii => src/cl_sii}/dte/__init__.py (100%) rename {cl_sii => src/cl_sii}/dte/constants.py (100%) rename {cl_sii => src/cl_sii}/dte/data_models.py (100%) rename {cl_sii => src/cl_sii}/dte/parse.py (100%) rename {cl_sii => src/cl_sii}/extras/__init__.py (100%) rename {cl_sii => src/cl_sii}/extras/dj_form_fields.py (100%) rename {cl_sii => src/cl_sii}/extras/dj_model_fields.py (100%) rename {cl_sii => src/cl_sii}/extras/drf_fields.py (100%) rename {cl_sii => src/cl_sii}/extras/mm_fields.py (100%) rename {cl_sii => src/cl_sii}/libs/__init__.py (100%) rename {cl_sii => src/cl_sii}/libs/crypto_utils.py (100%) rename {cl_sii => src/cl_sii}/libs/csv_utils.py (100%) rename {cl_sii => src/cl_sii}/libs/dataclass_utils.py (100%) rename {cl_sii => src/cl_sii}/libs/encoding_utils.py (100%) rename {cl_sii => src/cl_sii}/libs/io_utils.py (100%) rename {cl_sii => src/cl_sii}/libs/json_utils.py (100%) rename {cl_sii => src/cl_sii}/libs/mm_utils.py (100%) rename {cl_sii => src/cl_sii}/libs/rows_processing.py (100%) rename {cl_sii => src/cl_sii}/libs/tz_utils.py (100%) rename {cl_sii => src/cl_sii}/libs/xml_utils.py (100%) rename {cl_sii => src/cl_sii}/py.typed (100%) rename {cl_sii => src/cl_sii}/rcv/__init__.py (100%) rename {cl_sii => src/cl_sii}/rcv/constants.py (100%) rename {cl_sii => src/cl_sii}/rcv/data_models.py (100%) rename {cl_sii => src/cl_sii}/rcv/parse_csv.py (100%) rename {cl_sii => src/cl_sii}/rtc/__init__.py (100%) rename {cl_sii => src/cl_sii}/rtc/constants.py (100%) rename {cl_sii => src/cl_sii}/rtc/data_models.py (100%) rename {cl_sii => src/cl_sii}/rtc/data_models_aec.py (100%) rename {cl_sii => src/cl_sii}/rtc/data_models_cesiones_periodo.py (100%) rename {cl_sii => src/cl_sii}/rtc/parse_aec.py (100%) rename {cl_sii => src/cl_sii}/rtc/xml_utils.py (100%) rename {cl_sii => src/cl_sii}/rut/__init__.py (100%) rename {cl_sii => src/cl_sii}/rut/constants.py (100%) rename {cl_sii => src/cl_sii}/rut/crypto_utils.py (100%) rename {scripts => src/scripts}/canonicalize_xml_file.py (100%) rename {scripts => src/scripts}/clean_dte_xml_file.py (100%) rename {scripts => src/scripts}/example.py (100%) rename {tests => src/tests}/__init__.py (100%) rename {tests => src/tests}/cte_f29_factories.py (100%) rename {tests => src/tests}/test_contribuyente.py (100%) rename {tests => src/tests}/test_cte_f29_data_models.py (100%) rename {tests => src/tests}/test_cte_f29_parse_datos_obj.py (100%) rename {tests => src/tests}/test_data/.editorconfig (100%) rename {tests => src/tests}/test_data/crypto/wildcard-google-com-cert.der (100%) rename {tests => src/tests}/test_data/crypto/wildcard-google-com-cert.pem (100%) rename {tests => src/tests}/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.der (100%) rename {tests => src/tests}/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.pem (100%) rename {tests => src/tests}/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-signature-value-base64.txt (100%) rename {tests => src/tests}/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.der (100%) rename {tests => src/tests}/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.pem (100%) rename {tests => src/tests}/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-signature-value-base64.txt (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.der (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.pem (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--60910000-1--33--2336600-signature-value-base64.txt (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--76354771-K--33--170-cert.der (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--76354771-K--33--170-cert.pem (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--76354771-K--33--170-signature-value-base64.txt (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.der (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.pem (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--76399752-9--33--25568-signature-value-base64.txt (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.der (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.pem (100%) rename {tests => src/tests}/test_data/sii-crypto/DTE--96670340-7--61--110616-signature-value-base64.txt (100%) rename {tests => src/tests}/test_data/sii-crypto/prueba-sii-cert.der (100%) rename {tests => src/tests}/test_data/sii-crypto/prueba-sii-cert.pem (100%) rename {tests => src/tests}/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake-missing-code-49.json (100%) rename {tests => src/tests}/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake.json (100%) rename {tests => src/tests}/test_data/sii-cte/f29/cte--6286736-1--f29-6700000056-datos-obj-fake.json (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--60910000-1--33--2336600--cleaned.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--60910000-1--33--2336600.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert-no-base64.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-changed-monto.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-empty-emails.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-removed-signature.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-replaced-cert.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signature_xml.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_data.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_xml.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170--cleaned.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76354771-K--33--170.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76399752-9--33--25568--cleaned.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--76399752-9--33--25568.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--96670340-7--61--110616--cleaned.xml (100%) rename {tests => src/tests}/test_data/sii-dte/DTE--96670340-7--61--110616.xml (100%) rename {tests => src/tests}/test_data/sii-rcv/RCV-compra-no_incluir-rz_leading_trailing_whitespace.csv (100%) rename {tests => src/tests}/test_data/sii-rcv/RCV-compra-pendiente-rz_leading_trailing_whitespace.csv (100%) rename {tests => src/tests}/test_data/sii-rcv/RCV-compra-reclamado-rz_leading_trailing_whitespace.csv (100%) rename {tests => src/tests}/test_data/sii-rcv/RCV-compra-registro-rz_leading_trailing_whitespace.csv (100%) rename {tests => src/tests}/test_data/sii-rcv/RCV-venta-rz_leading_trailing_whitespace.csv (100%) rename {tests => src/tests}/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signature_xml.xml (100%) rename {tests => src/tests}/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_data.xml (100%) rename {tests => src/tests}/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_xml.xml (100%) rename {tests => src/tests}/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n.xml (100%) rename {tests => src/tests}/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2.xml (100%) rename {tests => src/tests}/test_data/sii-rtc/AEC--76399752-9--33--25568--SEQ-1.xml (100%) rename {tests => src/tests}/test_data/xml/attacks/billion-laughs-1.xml (100%) rename {tests => src/tests}/test_data/xml/attacks/billion-laughs-2.xml (100%) rename {tests => src/tests}/test_data/xml/attacks/external-entity-expansion-remote.xml (100%) rename {tests => src/tests}/test_data/xml/attacks/quadratic-blowup-entity-expansion.xml (100%) rename {tests => src/tests}/test_data/xml/trivial-doc.xml (100%) rename {tests => src/tests}/test_data/xml/trivial.xml (100%) rename {tests => src/tests}/test_dte.py (100%) rename {tests => src/tests}/test_dte_constants.py (100%) rename {tests => src/tests}/test_dte_data_models.py (100%) rename {tests => src/tests}/test_dte_parse.py (100%) rename {tests => src/tests}/test_extras_dj_form_fields.py (100%) rename {tests => src/tests}/test_extras_dj_model_fields.py (100%) rename {tests => src/tests}/test_extras_drf_fields.py (100%) rename {tests => src/tests}/test_extras_mm_fields.py (100%) rename {tests => src/tests}/test_libs_crypto_utils.py (100%) rename {tests => src/tests}/test_libs_csv_utils.py (100%) rename {tests => src/tests}/test_libs_dataclass_utils.py (100%) rename {tests => src/tests}/test_libs_encoding_utils.py (100%) rename {tests => src/tests}/test_libs_io_utils.py (100%) rename {tests => src/tests}/test_libs_json_utils.py (100%) rename {tests => src/tests}/test_libs_mm_utils.py (100%) rename {tests => src/tests}/test_libs_rows_processing.py (100%) rename {tests => src/tests}/test_libs_tz_utils.py (100%) rename {tests => src/tests}/test_libs_xml_utils.py (100%) rename {tests => src/tests}/test_rcv_constants.py (100%) rename {tests => src/tests}/test_rcv_data_models.py (100%) rename {tests => src/tests}/test_rcv_parse_csv.py (100%) rename {tests => src/tests}/test_rtc_constants.py (100%) rename {tests => src/tests}/test_rtc_data_models.py (100%) rename {tests => src/tests}/test_rtc_data_models_aec.py (100%) rename {tests => src/tests}/test_rtc_data_models_cesiones_periodo.py (100%) rename {tests => src/tests}/test_rtc_parse_aec.py (100%) rename {tests => src/tests}/test_rtc_xml_utils.py (100%) rename {tests => src/tests}/test_rut.py (100%) rename {tests => src/tests}/test_rut_crypto_utils.py (100%) rename {tests => src/tests}/test_scripts_canonicalize_xml_file.py (100%) rename {tests => src/tests}/test_scripts_clean_dte_xml_file.py (100%) rename {tests => src/tests}/utils.py (100%) diff --git a/cl_sii/__init__.py b/src/cl_sii/__init__.py similarity index 100% rename from cl_sii/__init__.py rename to src/cl_sii/__init__.py diff --git a/cl_sii/base/__init__.py b/src/cl_sii/base/__init__.py similarity index 100% rename from cl_sii/base/__init__.py rename to src/cl_sii/base/__init__.py diff --git a/cl_sii/base/constants.py b/src/cl_sii/base/constants.py similarity index 100% rename from cl_sii/base/constants.py rename to src/cl_sii/base/constants.py diff --git a/cl_sii/contribuyente/__init__.py b/src/cl_sii/contribuyente/__init__.py similarity index 100% rename from cl_sii/contribuyente/__init__.py rename to src/cl_sii/contribuyente/__init__.py diff --git a/cl_sii/contribuyente/constants.py b/src/cl_sii/contribuyente/constants.py similarity index 100% rename from cl_sii/contribuyente/constants.py rename to src/cl_sii/contribuyente/constants.py diff --git a/cl_sii/cte/__init__.py b/src/cl_sii/cte/__init__.py similarity index 100% rename from cl_sii/cte/__init__.py rename to src/cl_sii/cte/__init__.py diff --git a/cl_sii/cte/f29/__init__.py b/src/cl_sii/cte/f29/__init__.py similarity index 100% rename from cl_sii/cte/f29/__init__.py rename to src/cl_sii/cte/f29/__init__.py diff --git a/cl_sii/cte/f29/data_models.py b/src/cl_sii/cte/f29/data_models.py similarity index 100% rename from cl_sii/cte/f29/data_models.py rename to src/cl_sii/cte/f29/data_models.py diff --git a/cl_sii/cte/f29/parse_datos_obj.py b/src/cl_sii/cte/f29/parse_datos_obj.py similarity index 100% rename from cl_sii/cte/f29/parse_datos_obj.py rename to src/cl_sii/cte/f29/parse_datos_obj.py diff --git a/cl_sii/data/cte/f29_datos_obj_missing_key_fixes.json b/src/cl_sii/data/cte/f29_datos_obj_missing_key_fixes.json similarity index 100% rename from cl_sii/data/cte/f29_datos_obj_missing_key_fixes.json rename to src/cl_sii/data/cte/f29_datos_obj_missing_key_fixes.json diff --git a/cl_sii/data/cte/schemas-json/f29_datos_obj.schema.json b/src/cl_sii/data/cte/schemas-json/f29_datos_obj.schema.json similarity index 100% rename from cl_sii/data/cte/schemas-json/f29_datos_obj.schema.json rename to src/cl_sii/data/cte/schemas-json/f29_datos_obj.schema.json diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/.editorconfig b/src/cl_sii/data/ref/factura_electronica/schemas-xml/.editorconfig similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/.editorconfig rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/.editorconfig diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/AEC_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/AEC_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/AEC_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/AEC_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/Cesion_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/Cesion_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/Cesion_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/Cesion_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/DTECedido_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/DTECedido_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/DTECedido_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/DTECedido_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/LceCal_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/LceCal_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/LceCal_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/LceCal_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/LceCoCertif_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/LceCoCertif_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/LceCoCertif_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/LceCoCertif_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/LceSiiTypes_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/LceSiiTypes_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/LceSiiTypes_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/LceSiiTypes_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/LibroCV_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/LibroCV_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/LibroCV_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/LibroCV_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/README.md b/src/cl_sii/data/ref/factura_electronica/schemas-xml/README.md similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/README.md rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/README.md diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/Recibos_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/Recibos_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/Recibos_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/Recibos_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/SiiTypes_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/SiiTypes_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/SiiTypes_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/SiiTypes_v10.xsd diff --git a/cl_sii/data/ref/factura_electronica/schemas-xml/xmldsignature_v10.xsd b/src/cl_sii/data/ref/factura_electronica/schemas-xml/xmldsignature_v10.xsd similarity index 100% rename from cl_sii/data/ref/factura_electronica/schemas-xml/xmldsignature_v10.xsd rename to src/cl_sii/data/ref/factura_electronica/schemas-xml/xmldsignature_v10.xsd diff --git a/cl_sii/dte/__init__.py b/src/cl_sii/dte/__init__.py similarity index 100% rename from cl_sii/dte/__init__.py rename to src/cl_sii/dte/__init__.py diff --git a/cl_sii/dte/constants.py b/src/cl_sii/dte/constants.py similarity index 100% rename from cl_sii/dte/constants.py rename to src/cl_sii/dte/constants.py diff --git a/cl_sii/dte/data_models.py b/src/cl_sii/dte/data_models.py similarity index 100% rename from cl_sii/dte/data_models.py rename to src/cl_sii/dte/data_models.py diff --git a/cl_sii/dte/parse.py b/src/cl_sii/dte/parse.py similarity index 100% rename from cl_sii/dte/parse.py rename to src/cl_sii/dte/parse.py diff --git a/cl_sii/extras/__init__.py b/src/cl_sii/extras/__init__.py similarity index 100% rename from cl_sii/extras/__init__.py rename to src/cl_sii/extras/__init__.py diff --git a/cl_sii/extras/dj_form_fields.py b/src/cl_sii/extras/dj_form_fields.py similarity index 100% rename from cl_sii/extras/dj_form_fields.py rename to src/cl_sii/extras/dj_form_fields.py diff --git a/cl_sii/extras/dj_model_fields.py b/src/cl_sii/extras/dj_model_fields.py similarity index 100% rename from cl_sii/extras/dj_model_fields.py rename to src/cl_sii/extras/dj_model_fields.py diff --git a/cl_sii/extras/drf_fields.py b/src/cl_sii/extras/drf_fields.py similarity index 100% rename from cl_sii/extras/drf_fields.py rename to src/cl_sii/extras/drf_fields.py diff --git a/cl_sii/extras/mm_fields.py b/src/cl_sii/extras/mm_fields.py similarity index 100% rename from cl_sii/extras/mm_fields.py rename to src/cl_sii/extras/mm_fields.py diff --git a/cl_sii/libs/__init__.py b/src/cl_sii/libs/__init__.py similarity index 100% rename from cl_sii/libs/__init__.py rename to src/cl_sii/libs/__init__.py diff --git a/cl_sii/libs/crypto_utils.py b/src/cl_sii/libs/crypto_utils.py similarity index 100% rename from cl_sii/libs/crypto_utils.py rename to src/cl_sii/libs/crypto_utils.py diff --git a/cl_sii/libs/csv_utils.py b/src/cl_sii/libs/csv_utils.py similarity index 100% rename from cl_sii/libs/csv_utils.py rename to src/cl_sii/libs/csv_utils.py diff --git a/cl_sii/libs/dataclass_utils.py b/src/cl_sii/libs/dataclass_utils.py similarity index 100% rename from cl_sii/libs/dataclass_utils.py rename to src/cl_sii/libs/dataclass_utils.py diff --git a/cl_sii/libs/encoding_utils.py b/src/cl_sii/libs/encoding_utils.py similarity index 100% rename from cl_sii/libs/encoding_utils.py rename to src/cl_sii/libs/encoding_utils.py diff --git a/cl_sii/libs/io_utils.py b/src/cl_sii/libs/io_utils.py similarity index 100% rename from cl_sii/libs/io_utils.py rename to src/cl_sii/libs/io_utils.py diff --git a/cl_sii/libs/json_utils.py b/src/cl_sii/libs/json_utils.py similarity index 100% rename from cl_sii/libs/json_utils.py rename to src/cl_sii/libs/json_utils.py diff --git a/cl_sii/libs/mm_utils.py b/src/cl_sii/libs/mm_utils.py similarity index 100% rename from cl_sii/libs/mm_utils.py rename to src/cl_sii/libs/mm_utils.py diff --git a/cl_sii/libs/rows_processing.py b/src/cl_sii/libs/rows_processing.py similarity index 100% rename from cl_sii/libs/rows_processing.py rename to src/cl_sii/libs/rows_processing.py diff --git a/cl_sii/libs/tz_utils.py b/src/cl_sii/libs/tz_utils.py similarity index 100% rename from cl_sii/libs/tz_utils.py rename to src/cl_sii/libs/tz_utils.py diff --git a/cl_sii/libs/xml_utils.py b/src/cl_sii/libs/xml_utils.py similarity index 100% rename from cl_sii/libs/xml_utils.py rename to src/cl_sii/libs/xml_utils.py diff --git a/cl_sii/py.typed b/src/cl_sii/py.typed similarity index 100% rename from cl_sii/py.typed rename to src/cl_sii/py.typed diff --git a/cl_sii/rcv/__init__.py b/src/cl_sii/rcv/__init__.py similarity index 100% rename from cl_sii/rcv/__init__.py rename to src/cl_sii/rcv/__init__.py diff --git a/cl_sii/rcv/constants.py b/src/cl_sii/rcv/constants.py similarity index 100% rename from cl_sii/rcv/constants.py rename to src/cl_sii/rcv/constants.py diff --git a/cl_sii/rcv/data_models.py b/src/cl_sii/rcv/data_models.py similarity index 100% rename from cl_sii/rcv/data_models.py rename to src/cl_sii/rcv/data_models.py diff --git a/cl_sii/rcv/parse_csv.py b/src/cl_sii/rcv/parse_csv.py similarity index 100% rename from cl_sii/rcv/parse_csv.py rename to src/cl_sii/rcv/parse_csv.py diff --git a/cl_sii/rtc/__init__.py b/src/cl_sii/rtc/__init__.py similarity index 100% rename from cl_sii/rtc/__init__.py rename to src/cl_sii/rtc/__init__.py diff --git a/cl_sii/rtc/constants.py b/src/cl_sii/rtc/constants.py similarity index 100% rename from cl_sii/rtc/constants.py rename to src/cl_sii/rtc/constants.py diff --git a/cl_sii/rtc/data_models.py b/src/cl_sii/rtc/data_models.py similarity index 100% rename from cl_sii/rtc/data_models.py rename to src/cl_sii/rtc/data_models.py diff --git a/cl_sii/rtc/data_models_aec.py b/src/cl_sii/rtc/data_models_aec.py similarity index 100% rename from cl_sii/rtc/data_models_aec.py rename to src/cl_sii/rtc/data_models_aec.py diff --git a/cl_sii/rtc/data_models_cesiones_periodo.py b/src/cl_sii/rtc/data_models_cesiones_periodo.py similarity index 100% rename from cl_sii/rtc/data_models_cesiones_periodo.py rename to src/cl_sii/rtc/data_models_cesiones_periodo.py diff --git a/cl_sii/rtc/parse_aec.py b/src/cl_sii/rtc/parse_aec.py similarity index 100% rename from cl_sii/rtc/parse_aec.py rename to src/cl_sii/rtc/parse_aec.py diff --git a/cl_sii/rtc/xml_utils.py b/src/cl_sii/rtc/xml_utils.py similarity index 100% rename from cl_sii/rtc/xml_utils.py rename to src/cl_sii/rtc/xml_utils.py diff --git a/cl_sii/rut/__init__.py b/src/cl_sii/rut/__init__.py similarity index 100% rename from cl_sii/rut/__init__.py rename to src/cl_sii/rut/__init__.py diff --git a/cl_sii/rut/constants.py b/src/cl_sii/rut/constants.py similarity index 100% rename from cl_sii/rut/constants.py rename to src/cl_sii/rut/constants.py diff --git a/cl_sii/rut/crypto_utils.py b/src/cl_sii/rut/crypto_utils.py similarity index 100% rename from cl_sii/rut/crypto_utils.py rename to src/cl_sii/rut/crypto_utils.py diff --git a/scripts/canonicalize_xml_file.py b/src/scripts/canonicalize_xml_file.py similarity index 100% rename from scripts/canonicalize_xml_file.py rename to src/scripts/canonicalize_xml_file.py diff --git a/scripts/clean_dte_xml_file.py b/src/scripts/clean_dte_xml_file.py similarity index 100% rename from scripts/clean_dte_xml_file.py rename to src/scripts/clean_dte_xml_file.py diff --git a/scripts/example.py b/src/scripts/example.py similarity index 100% rename from scripts/example.py rename to src/scripts/example.py diff --git a/tests/__init__.py b/src/tests/__init__.py similarity index 100% rename from tests/__init__.py rename to src/tests/__init__.py diff --git a/tests/cte_f29_factories.py b/src/tests/cte_f29_factories.py similarity index 100% rename from tests/cte_f29_factories.py rename to src/tests/cte_f29_factories.py diff --git a/tests/test_contribuyente.py b/src/tests/test_contribuyente.py similarity index 100% rename from tests/test_contribuyente.py rename to src/tests/test_contribuyente.py diff --git a/tests/test_cte_f29_data_models.py b/src/tests/test_cte_f29_data_models.py similarity index 100% rename from tests/test_cte_f29_data_models.py rename to src/tests/test_cte_f29_data_models.py diff --git a/tests/test_cte_f29_parse_datos_obj.py b/src/tests/test_cte_f29_parse_datos_obj.py similarity index 100% rename from tests/test_cte_f29_parse_datos_obj.py rename to src/tests/test_cte_f29_parse_datos_obj.py diff --git a/tests/test_data/.editorconfig b/src/tests/test_data/.editorconfig similarity index 100% rename from tests/test_data/.editorconfig rename to src/tests/test_data/.editorconfig diff --git a/tests/test_data/crypto/wildcard-google-com-cert.der b/src/tests/test_data/crypto/wildcard-google-com-cert.der similarity index 100% rename from tests/test_data/crypto/wildcard-google-com-cert.der rename to src/tests/test_data/crypto/wildcard-google-com-cert.der diff --git a/tests/test_data/crypto/wildcard-google-com-cert.pem b/src/tests/test_data/crypto/wildcard-google-com-cert.pem similarity index 100% rename from tests/test_data/crypto/wildcard-google-com-cert.pem rename to src/tests/test_data/crypto/wildcard-google-com-cert.pem diff --git a/tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.der b/src/tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.der similarity index 100% rename from tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.der rename to src/tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.der diff --git a/tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.pem b/src/tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.pem similarity index 100% rename from tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.pem rename to src/tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-cert.pem diff --git a/tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-signature-value-base64.txt b/src/tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-signature-value-base64.txt similarity index 100% rename from tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-signature-value-base64.txt rename to src/tests/test_data/sii-crypto/AEC--76354771-K--33--170--SEQ-2-signature-value-base64.txt diff --git a/tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.der b/src/tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.der similarity index 100% rename from tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.der rename to src/tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.der diff --git a/tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.pem b/src/tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.pem similarity index 100% rename from tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.pem rename to src/tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-cert.pem diff --git a/tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-signature-value-base64.txt b/src/tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-signature-value-base64.txt similarity index 100% rename from tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-signature-value-base64.txt rename to src/tests/test_data/sii-crypto/AEC--76399752-9--33--25568--SEQ-1-signature-value-base64.txt diff --git a/tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.der b/src/tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.der similarity index 100% rename from tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.der rename to src/tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.der diff --git a/tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.pem b/src/tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.pem similarity index 100% rename from tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.pem rename to src/tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-cert.pem diff --git a/tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-signature-value-base64.txt b/src/tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-signature-value-base64.txt similarity index 100% rename from tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-signature-value-base64.txt rename to src/tests/test_data/sii-crypto/DTE--60910000-1--33--2336600-signature-value-base64.txt diff --git a/tests/test_data/sii-crypto/DTE--76354771-K--33--170-cert.der b/src/tests/test_data/sii-crypto/DTE--76354771-K--33--170-cert.der similarity index 100% rename from tests/test_data/sii-crypto/DTE--76354771-K--33--170-cert.der rename to src/tests/test_data/sii-crypto/DTE--76354771-K--33--170-cert.der diff --git a/tests/test_data/sii-crypto/DTE--76354771-K--33--170-cert.pem b/src/tests/test_data/sii-crypto/DTE--76354771-K--33--170-cert.pem similarity index 100% rename from tests/test_data/sii-crypto/DTE--76354771-K--33--170-cert.pem rename to src/tests/test_data/sii-crypto/DTE--76354771-K--33--170-cert.pem diff --git a/tests/test_data/sii-crypto/DTE--76354771-K--33--170-signature-value-base64.txt b/src/tests/test_data/sii-crypto/DTE--76354771-K--33--170-signature-value-base64.txt similarity index 100% rename from tests/test_data/sii-crypto/DTE--76354771-K--33--170-signature-value-base64.txt rename to src/tests/test_data/sii-crypto/DTE--76354771-K--33--170-signature-value-base64.txt diff --git a/tests/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.der b/src/tests/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.der similarity index 100% rename from tests/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.der rename to src/tests/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.der diff --git a/tests/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.pem b/src/tests/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.pem similarity index 100% rename from tests/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.pem rename to src/tests/test_data/sii-crypto/DTE--76399752-9--33--25568-cert.pem diff --git a/tests/test_data/sii-crypto/DTE--76399752-9--33--25568-signature-value-base64.txt b/src/tests/test_data/sii-crypto/DTE--76399752-9--33--25568-signature-value-base64.txt similarity index 100% rename from tests/test_data/sii-crypto/DTE--76399752-9--33--25568-signature-value-base64.txt rename to src/tests/test_data/sii-crypto/DTE--76399752-9--33--25568-signature-value-base64.txt diff --git a/tests/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.der b/src/tests/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.der similarity index 100% rename from tests/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.der rename to src/tests/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.der diff --git a/tests/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.pem b/src/tests/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.pem similarity index 100% rename from tests/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.pem rename to src/tests/test_data/sii-crypto/DTE--96670340-7--61--110616-cert.pem diff --git a/tests/test_data/sii-crypto/DTE--96670340-7--61--110616-signature-value-base64.txt b/src/tests/test_data/sii-crypto/DTE--96670340-7--61--110616-signature-value-base64.txt similarity index 100% rename from tests/test_data/sii-crypto/DTE--96670340-7--61--110616-signature-value-base64.txt rename to src/tests/test_data/sii-crypto/DTE--96670340-7--61--110616-signature-value-base64.txt diff --git a/tests/test_data/sii-crypto/prueba-sii-cert.der b/src/tests/test_data/sii-crypto/prueba-sii-cert.der similarity index 100% rename from tests/test_data/sii-crypto/prueba-sii-cert.der rename to src/tests/test_data/sii-crypto/prueba-sii-cert.der diff --git a/tests/test_data/sii-crypto/prueba-sii-cert.pem b/src/tests/test_data/sii-crypto/prueba-sii-cert.pem similarity index 100% rename from tests/test_data/sii-crypto/prueba-sii-cert.pem rename to src/tests/test_data/sii-crypto/prueba-sii-cert.pem diff --git a/tests/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake-missing-code-49.json b/src/tests/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake-missing-code-49.json similarity index 100% rename from tests/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake-missing-code-49.json rename to src/tests/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake-missing-code-49.json diff --git a/tests/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake.json b/src/tests/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake.json similarity index 100% rename from tests/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake.json rename to src/tests/test_data/sii-cte/f29/cte--61002000-3--f29-6600000016-datos-obj-fake.json diff --git a/tests/test_data/sii-cte/f29/cte--6286736-1--f29-6700000056-datos-obj-fake.json b/src/tests/test_data/sii-cte/f29/cte--6286736-1--f29-6700000056-datos-obj-fake.json similarity index 100% rename from tests/test_data/sii-cte/f29/cte--6286736-1--f29-6700000056-datos-obj-fake.json rename to src/tests/test_data/sii-cte/f29/cte--6286736-1--f29-6700000056-datos-obj-fake.json diff --git a/tests/test_data/sii-dte/DTE--60910000-1--33--2336600--cleaned.xml b/src/tests/test_data/sii-dte/DTE--60910000-1--33--2336600--cleaned.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--60910000-1--33--2336600--cleaned.xml rename to src/tests/test_data/sii-dte/DTE--60910000-1--33--2336600--cleaned.xml diff --git a/tests/test_data/sii-dte/DTE--60910000-1--33--2336600.xml b/src/tests/test_data/sii-dte/DTE--60910000-1--33--2336600.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--60910000-1--33--2336600.xml rename to src/tests/test_data/sii-dte/DTE--60910000-1--33--2336600.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert-no-base64.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert-no-base64.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert-no-base64.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert-no-base64.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-bad-cert.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-changed-monto.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-changed-monto.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-changed-monto.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-changed-monto.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-empty-emails.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-empty-emails.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-empty-emails.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-empty-emails.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-removed-signature.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-removed-signature.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-removed-signature.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-removed-signature.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-replaced-cert.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-replaced-cert.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-replaced-cert.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-mod-replaced-cert.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signature_xml.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signature_xml.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signature_xml.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signature_xml.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_data.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_data.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_data.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_data.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_xml.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_xml.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_xml.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned-signed_xml.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170--cleaned.xml diff --git a/tests/test_data/sii-dte/DTE--76354771-K--33--170.xml b/src/tests/test_data/sii-dte/DTE--76354771-K--33--170.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76354771-K--33--170.xml rename to src/tests/test_data/sii-dte/DTE--76354771-K--33--170.xml diff --git a/tests/test_data/sii-dte/DTE--76399752-9--33--25568--cleaned.xml b/src/tests/test_data/sii-dte/DTE--76399752-9--33--25568--cleaned.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76399752-9--33--25568--cleaned.xml rename to src/tests/test_data/sii-dte/DTE--76399752-9--33--25568--cleaned.xml diff --git a/tests/test_data/sii-dte/DTE--76399752-9--33--25568.xml b/src/tests/test_data/sii-dte/DTE--76399752-9--33--25568.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--76399752-9--33--25568.xml rename to src/tests/test_data/sii-dte/DTE--76399752-9--33--25568.xml diff --git a/tests/test_data/sii-dte/DTE--96670340-7--61--110616--cleaned.xml b/src/tests/test_data/sii-dte/DTE--96670340-7--61--110616--cleaned.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--96670340-7--61--110616--cleaned.xml rename to src/tests/test_data/sii-dte/DTE--96670340-7--61--110616--cleaned.xml diff --git a/tests/test_data/sii-dte/DTE--96670340-7--61--110616.xml b/src/tests/test_data/sii-dte/DTE--96670340-7--61--110616.xml similarity index 100% rename from tests/test_data/sii-dte/DTE--96670340-7--61--110616.xml rename to src/tests/test_data/sii-dte/DTE--96670340-7--61--110616.xml diff --git a/tests/test_data/sii-rcv/RCV-compra-no_incluir-rz_leading_trailing_whitespace.csv b/src/tests/test_data/sii-rcv/RCV-compra-no_incluir-rz_leading_trailing_whitespace.csv similarity index 100% rename from tests/test_data/sii-rcv/RCV-compra-no_incluir-rz_leading_trailing_whitespace.csv rename to src/tests/test_data/sii-rcv/RCV-compra-no_incluir-rz_leading_trailing_whitespace.csv diff --git a/tests/test_data/sii-rcv/RCV-compra-pendiente-rz_leading_trailing_whitespace.csv b/src/tests/test_data/sii-rcv/RCV-compra-pendiente-rz_leading_trailing_whitespace.csv similarity index 100% rename from tests/test_data/sii-rcv/RCV-compra-pendiente-rz_leading_trailing_whitespace.csv rename to src/tests/test_data/sii-rcv/RCV-compra-pendiente-rz_leading_trailing_whitespace.csv diff --git a/tests/test_data/sii-rcv/RCV-compra-reclamado-rz_leading_trailing_whitespace.csv b/src/tests/test_data/sii-rcv/RCV-compra-reclamado-rz_leading_trailing_whitespace.csv similarity index 100% rename from tests/test_data/sii-rcv/RCV-compra-reclamado-rz_leading_trailing_whitespace.csv rename to src/tests/test_data/sii-rcv/RCV-compra-reclamado-rz_leading_trailing_whitespace.csv diff --git a/tests/test_data/sii-rcv/RCV-compra-registro-rz_leading_trailing_whitespace.csv b/src/tests/test_data/sii-rcv/RCV-compra-registro-rz_leading_trailing_whitespace.csv similarity index 100% rename from tests/test_data/sii-rcv/RCV-compra-registro-rz_leading_trailing_whitespace.csv rename to src/tests/test_data/sii-rcv/RCV-compra-registro-rz_leading_trailing_whitespace.csv diff --git a/tests/test_data/sii-rcv/RCV-venta-rz_leading_trailing_whitespace.csv b/src/tests/test_data/sii-rcv/RCV-venta-rz_leading_trailing_whitespace.csv similarity index 100% rename from tests/test_data/sii-rcv/RCV-venta-rz_leading_trailing_whitespace.csv rename to src/tests/test_data/sii-rcv/RCV-venta-rz_leading_trailing_whitespace.csv diff --git a/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signature_xml.xml b/src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signature_xml.xml similarity index 100% rename from tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signature_xml.xml rename to src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signature_xml.xml diff --git a/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_data.xml b/src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_data.xml similarity index 100% rename from tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_data.xml rename to src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_data.xml diff --git a/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_xml.xml b/src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_xml.xml similarity index 100% rename from tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_xml.xml rename to src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n-signed_xml.xml diff --git a/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n.xml b/src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n.xml similarity index 100% rename from tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n.xml rename to src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2-canonicalized-c14n.xml diff --git a/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2.xml b/src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2.xml similarity index 100% rename from tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2.xml rename to src/tests/test_data/sii-rtc/AEC--76354771-K--33--170--SEQ-2.xml diff --git a/tests/test_data/sii-rtc/AEC--76399752-9--33--25568--SEQ-1.xml b/src/tests/test_data/sii-rtc/AEC--76399752-9--33--25568--SEQ-1.xml similarity index 100% rename from tests/test_data/sii-rtc/AEC--76399752-9--33--25568--SEQ-1.xml rename to src/tests/test_data/sii-rtc/AEC--76399752-9--33--25568--SEQ-1.xml diff --git a/tests/test_data/xml/attacks/billion-laughs-1.xml b/src/tests/test_data/xml/attacks/billion-laughs-1.xml similarity index 100% rename from tests/test_data/xml/attacks/billion-laughs-1.xml rename to src/tests/test_data/xml/attacks/billion-laughs-1.xml diff --git a/tests/test_data/xml/attacks/billion-laughs-2.xml b/src/tests/test_data/xml/attacks/billion-laughs-2.xml similarity index 100% rename from tests/test_data/xml/attacks/billion-laughs-2.xml rename to src/tests/test_data/xml/attacks/billion-laughs-2.xml diff --git a/tests/test_data/xml/attacks/external-entity-expansion-remote.xml b/src/tests/test_data/xml/attacks/external-entity-expansion-remote.xml similarity index 100% rename from tests/test_data/xml/attacks/external-entity-expansion-remote.xml rename to src/tests/test_data/xml/attacks/external-entity-expansion-remote.xml diff --git a/tests/test_data/xml/attacks/quadratic-blowup-entity-expansion.xml b/src/tests/test_data/xml/attacks/quadratic-blowup-entity-expansion.xml similarity index 100% rename from tests/test_data/xml/attacks/quadratic-blowup-entity-expansion.xml rename to src/tests/test_data/xml/attacks/quadratic-blowup-entity-expansion.xml diff --git a/tests/test_data/xml/trivial-doc.xml b/src/tests/test_data/xml/trivial-doc.xml similarity index 100% rename from tests/test_data/xml/trivial-doc.xml rename to src/tests/test_data/xml/trivial-doc.xml diff --git a/tests/test_data/xml/trivial.xml b/src/tests/test_data/xml/trivial.xml similarity index 100% rename from tests/test_data/xml/trivial.xml rename to src/tests/test_data/xml/trivial.xml diff --git a/tests/test_dte.py b/src/tests/test_dte.py similarity index 100% rename from tests/test_dte.py rename to src/tests/test_dte.py diff --git a/tests/test_dte_constants.py b/src/tests/test_dte_constants.py similarity index 100% rename from tests/test_dte_constants.py rename to src/tests/test_dte_constants.py diff --git a/tests/test_dte_data_models.py b/src/tests/test_dte_data_models.py similarity index 100% rename from tests/test_dte_data_models.py rename to src/tests/test_dte_data_models.py diff --git a/tests/test_dte_parse.py b/src/tests/test_dte_parse.py similarity index 100% rename from tests/test_dte_parse.py rename to src/tests/test_dte_parse.py diff --git a/tests/test_extras_dj_form_fields.py b/src/tests/test_extras_dj_form_fields.py similarity index 100% rename from tests/test_extras_dj_form_fields.py rename to src/tests/test_extras_dj_form_fields.py diff --git a/tests/test_extras_dj_model_fields.py b/src/tests/test_extras_dj_model_fields.py similarity index 100% rename from tests/test_extras_dj_model_fields.py rename to src/tests/test_extras_dj_model_fields.py diff --git a/tests/test_extras_drf_fields.py b/src/tests/test_extras_drf_fields.py similarity index 100% rename from tests/test_extras_drf_fields.py rename to src/tests/test_extras_drf_fields.py diff --git a/tests/test_extras_mm_fields.py b/src/tests/test_extras_mm_fields.py similarity index 100% rename from tests/test_extras_mm_fields.py rename to src/tests/test_extras_mm_fields.py diff --git a/tests/test_libs_crypto_utils.py b/src/tests/test_libs_crypto_utils.py similarity index 100% rename from tests/test_libs_crypto_utils.py rename to src/tests/test_libs_crypto_utils.py diff --git a/tests/test_libs_csv_utils.py b/src/tests/test_libs_csv_utils.py similarity index 100% rename from tests/test_libs_csv_utils.py rename to src/tests/test_libs_csv_utils.py diff --git a/tests/test_libs_dataclass_utils.py b/src/tests/test_libs_dataclass_utils.py similarity index 100% rename from tests/test_libs_dataclass_utils.py rename to src/tests/test_libs_dataclass_utils.py diff --git a/tests/test_libs_encoding_utils.py b/src/tests/test_libs_encoding_utils.py similarity index 100% rename from tests/test_libs_encoding_utils.py rename to src/tests/test_libs_encoding_utils.py diff --git a/tests/test_libs_io_utils.py b/src/tests/test_libs_io_utils.py similarity index 100% rename from tests/test_libs_io_utils.py rename to src/tests/test_libs_io_utils.py diff --git a/tests/test_libs_json_utils.py b/src/tests/test_libs_json_utils.py similarity index 100% rename from tests/test_libs_json_utils.py rename to src/tests/test_libs_json_utils.py diff --git a/tests/test_libs_mm_utils.py b/src/tests/test_libs_mm_utils.py similarity index 100% rename from tests/test_libs_mm_utils.py rename to src/tests/test_libs_mm_utils.py diff --git a/tests/test_libs_rows_processing.py b/src/tests/test_libs_rows_processing.py similarity index 100% rename from tests/test_libs_rows_processing.py rename to src/tests/test_libs_rows_processing.py diff --git a/tests/test_libs_tz_utils.py b/src/tests/test_libs_tz_utils.py similarity index 100% rename from tests/test_libs_tz_utils.py rename to src/tests/test_libs_tz_utils.py diff --git a/tests/test_libs_xml_utils.py b/src/tests/test_libs_xml_utils.py similarity index 100% rename from tests/test_libs_xml_utils.py rename to src/tests/test_libs_xml_utils.py diff --git a/tests/test_rcv_constants.py b/src/tests/test_rcv_constants.py similarity index 100% rename from tests/test_rcv_constants.py rename to src/tests/test_rcv_constants.py diff --git a/tests/test_rcv_data_models.py b/src/tests/test_rcv_data_models.py similarity index 100% rename from tests/test_rcv_data_models.py rename to src/tests/test_rcv_data_models.py diff --git a/tests/test_rcv_parse_csv.py b/src/tests/test_rcv_parse_csv.py similarity index 100% rename from tests/test_rcv_parse_csv.py rename to src/tests/test_rcv_parse_csv.py diff --git a/tests/test_rtc_constants.py b/src/tests/test_rtc_constants.py similarity index 100% rename from tests/test_rtc_constants.py rename to src/tests/test_rtc_constants.py diff --git a/tests/test_rtc_data_models.py b/src/tests/test_rtc_data_models.py similarity index 100% rename from tests/test_rtc_data_models.py rename to src/tests/test_rtc_data_models.py diff --git a/tests/test_rtc_data_models_aec.py b/src/tests/test_rtc_data_models_aec.py similarity index 100% rename from tests/test_rtc_data_models_aec.py rename to src/tests/test_rtc_data_models_aec.py diff --git a/tests/test_rtc_data_models_cesiones_periodo.py b/src/tests/test_rtc_data_models_cesiones_periodo.py similarity index 100% rename from tests/test_rtc_data_models_cesiones_periodo.py rename to src/tests/test_rtc_data_models_cesiones_periodo.py diff --git a/tests/test_rtc_parse_aec.py b/src/tests/test_rtc_parse_aec.py similarity index 100% rename from tests/test_rtc_parse_aec.py rename to src/tests/test_rtc_parse_aec.py diff --git a/tests/test_rtc_xml_utils.py b/src/tests/test_rtc_xml_utils.py similarity index 100% rename from tests/test_rtc_xml_utils.py rename to src/tests/test_rtc_xml_utils.py diff --git a/tests/test_rut.py b/src/tests/test_rut.py similarity index 100% rename from tests/test_rut.py rename to src/tests/test_rut.py diff --git a/tests/test_rut_crypto_utils.py b/src/tests/test_rut_crypto_utils.py similarity index 100% rename from tests/test_rut_crypto_utils.py rename to src/tests/test_rut_crypto_utils.py diff --git a/tests/test_scripts_canonicalize_xml_file.py b/src/tests/test_scripts_canonicalize_xml_file.py similarity index 100% rename from tests/test_scripts_canonicalize_xml_file.py rename to src/tests/test_scripts_canonicalize_xml_file.py diff --git a/tests/test_scripts_clean_dte_xml_file.py b/src/tests/test_scripts_clean_dte_xml_file.py similarity index 100% rename from tests/test_scripts_clean_dte_xml_file.py rename to src/tests/test_scripts_clean_dte_xml_file.py diff --git a/tests/utils.py b/src/tests/utils.py similarity index 100% rename from tests/utils.py rename to src/tests/utils.py From bb20f9837d961b3ec52afd85c5f819921a7e2ebf Mon Sep 17 00:00:00 2001 From: Jose Tomas Robles Hahn Date: Wed, 9 Aug 2023 18:16:59 -0400 Subject: [PATCH 07/12] chore: Update files for change of Python project structure to Src layout - Update Python-related files: - Python Setuptools configuration (`setup.py`). - Python Source distribution Manifest (`MANIFEST.in`). - Coverage.py configuration. - Mypy configuration. - Python code comments. - Update other files: - Make tasks. - Git Ignore. - Bumpversion configuration. - DeepSource configuration. --- .bumpversion.cfg | 2 +- .deepsource.toml | 2 +- .gitignore | 2 +- MANIFEST.in | 10 +++++----- Makefile | 18 +++++++++++++----- mypy.ini | 7 +++++-- setup.cfg | 5 +++-- setup.py | 5 +++-- src/cl_sii/dte/parse.py | 8 ++++---- src/tests/test_libs_crypto_utils.py | 2 +- 10 files changed, 37 insertions(+), 24 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 23e77450..ccc865c7 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -4,5 +4,5 @@ commit = True tag = False message = chore: Bump version from {current_version} to {new_version} -[bumpversion:file:cl_sii/__init__.py] +[bumpversion:file:src/cl_sii/__init__.py] diff --git a/.deepsource.toml b/.deepsource.toml index 00f29146..05cf2f03 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -1,7 +1,7 @@ version = 1 test_patterns = [ - "cl_sii/**" + "src/cl_sii/**" ] [[analyzers]] diff --git a/.gitignore b/.gitignore index 36647d29..41ac7dde 100644 --- a/.gitignore +++ b/.gitignore @@ -277,4 +277,4 @@ tags # warning: rules order matter. Do not move the ones in this section upwards! # note: prevent this dir from being ignored (because of rule `[Ss]cripts`) -!/scripts/ +!/src/scripts/ diff --git a/MANIFEST.in b/MANIFEST.in index cc584939..29621e02 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,8 +1,8 @@ include HISTORY.md include LICENSE include README.md -include cl_sii/data/cte/*.json -recursive-include cl_sii *py -recursive-include cl_sii/data/cte/schemas-json *.schema.json -recursive-include cl_sii/data/ref/factura_electronica/schemas-xml *.xsd -include cl_sii/py.typed +include src/cl_sii/data/cte/*.json +recursive-include src/cl_sii *py +recursive-include src/cl_sii/data/cte/schemas-json *.schema.json +recursive-include src/cl_sii/data/ref/factura_electronica/schemas-xml *.xsd +include src/cl_sii/py.typed diff --git a/Makefile b/Makefile index c696a635..a862e826 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,8 @@ SHELL = /usr/bin/env bash +# Sources Root +SOURCES_ROOT = $(CURDIR)/src + # Python PYTHON = python3 PYTHON_PIP = $(PYTHON) -m pip @@ -67,15 +70,20 @@ install-deps-dev: ## Install dependencies for development python -m pip install -r requirements-dev.txt python -m pip check +lint: FLAKE8_FILES = *.py "$(SOURCES_ROOT)" +lint: ISORT_FILES = *.py "$(SOURCES_ROOT)" +lint: BLACK_SRC = *.py "$(SOURCES_ROOT)" lint: ## run tools for code style analysis, static type check, etc - flake8 --config=setup.cfg cl_sii scripts tests + flake8 $(FLAKE8_FILES) mypy - isort --check-only . - $(BLACK) --check . + isort --check-only $(ISORT_FILES) + $(BLACK) --check $(BLACK_SRC) +lint-fix: BLACK_SRC = *.py "$(SOURCES_ROOT)" +lint-fix: ISORT_FILES = *.py "$(SOURCES_ROOT)" lint-fix: ## Fix lint errors - $(BLACK) . - isort . + $(BLACK) $(BLACK_SRC) + isort $(ISORT_FILES) test: ## run tests quickly with the default Tox Python tox -e "$(TOXENV)" diff --git a/mypy.ini b/mypy.ini index 64634425..f30c377f 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,9 +1,12 @@ [mypy] python_version = 3.8 platform = linux +mypy_path = + src files = - cl_sii, - scripts + *.py, + src +exclude = (^(src/tests)/.*$) plugins = pydantic.mypy diff --git a/setup.cfg b/setup.cfg index c8f5641a..3746bf09 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,9 +2,10 @@ universal = 0 [coverage:run] -source = cl_sii/ +source = src/ omit = - tests/* + src/scripts/* + src/tests/* branch = True [coverage:report] diff --git a/setup.py b/setup.py index 0ec8a63a..0ca7e521 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ def get_version(*file_paths: str) -> str: raise RuntimeError('Unable to find version string.') -version = get_version('cl_sii', '__init__.py') +version = get_version('src', 'cl_sii', '__init__.py') readme = open('README.md').read() history = open('HISTORY.md').read() @@ -85,7 +85,8 @@ def get_version(*file_paths: str) -> str: include_package_data=True, name='cl-sii', package_data=_package_data, - packages=find_packages(exclude=['docs', 'tests*']), + package_dir={'': 'src'}, + packages=find_packages(where='src', exclude=['scripts', 'tests*']), python_requires='>=3.8, <3.11', setup_requires=setup_requirements, test_suite='tests', diff --git a/src/cl_sii/dte/parse.py b/src/cl_sii/dte/parse.py index e98a3b65..674c9442 100644 --- a/src/cl_sii/dte/parse.py +++ b/src/cl_sii/dte/parse.py @@ -43,8 +43,8 @@ Ref: target namespace in 'DTE_v10.xsd' and 'EnvioDTE_v10.xsd'. -* cl_sii/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd#L19 (f57a326) -* cl_sii/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd#L14 (f57a326) +* src/cl_sii/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd#L19 (f57a326) +* src/cl_sii/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd#L14 (f57a326) """ DTE_XMLNS_MAP = { @@ -650,8 +650,8 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: def _set_dte_xml_missing_xmlns(xml_doc: XmlElement) -> Tuple[XmlElement, bool]: # source: name of the XML element without namespace. - # cl_sii/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd#L22 (f57a326) - # cl_sii/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd#L92 (f57a326) + # src/cl_sii/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd#L22 (f57a326) + # src/cl_sii/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd#L92 (f57a326) em_tag_simple = 'DTE' em_namespace = DTE_XMLNS diff --git a/src/tests/test_libs_crypto_utils.py b/src/tests/test_libs_crypto_utils.py index 853332c0..f30d8b27 100644 --- a/src/tests/test_libs_crypto_utils.py +++ b/src/tests/test_libs_crypto_utils.py @@ -22,7 +22,7 @@ # TODO: get fake certificates, keys, and all the variations from # https://github.com/urllib3/urllib3/tree/1.24.2/dummyserver/certs -# TODO: move me into 'cl_sii/crypto/constants.py' +# TODO: move me into 'src/cl_sii/crypto/constants.py' # - Organismo: MINISTERIO DE ECONOMÍA / SUBSECRETARIA DE ECONOMIA # - Decreto 181 (Julio-Agosto 2002) # "APRUEBA REGLAMENTO DE LA LEY 19.799 SOBRE DOCUMENTOS ELECTRONICOS, FIRMA ELECTRONICA From 7791901d26c4bbdec2f0640abbf140c13546b638 Mon Sep 17 00:00:00 2001 From: Jose Tomas Robles Hahn Date: Wed, 6 Sep 2023 21:26:00 -0300 Subject: [PATCH 08/12] chore: Add Codecov repository upload token; update Codecov status badge --- .github/workflows/ci.yaml | 1 + README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 13993dde..b129e9d0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -123,6 +123,7 @@ jobs: - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v3.1.4 with: + token: ${{ secrets.CODECOV_TOKEN }} directory: ./test-reports/coverage/ fail_ci_if_error: true diff --git a/README.md b/README.md index 4ff784a8..8774b291 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ The full documentation is at . | Code Coverage | Code Climate | Documentation | Project Analysis | | ------------- | ------------ | ------------- | ---------------- | -| [![Codecov](https://codecov.io/gh/fyntex/lib-cl-sii-python/branch/develop/graph/badge.svg?token=VdwPUEUzzQ)](https://codecov.io/gh/fyntex/lib-cl-sii-python) | [![Maintainability](https://api.codeclimate.com/v1/badges/c4e8a9b023310ff8c276/maintainability)](https://codeclimate.com/github/fyntex/lib-cl-sii-python/maintainability) | [![Read the Docs](https://readthedocs.org/projects/lib-cl-sii-python/badge/)](https://readthedocs.org/projects/lib-cl-sii-python/) | [Open Source Insights](https://deps.dev/pypi/cl-sii) | +| [![Codecov](https://codecov.io/gh/cordada/lib-cl-sii-python/graph/badge.svg?token=VdwPUEUzzQ)](https://codecov.io/gh/cordada/lib-cl-sii-python) | [![Maintainability](https://api.codeclimate.com/v1/badges/c4e8a9b023310ff8c276/maintainability)](https://codeclimate.com/github/fyntex/lib-cl-sii-python/maintainability) | [![Read the Docs](https://readthedocs.org/projects/lib-cl-sii-python/badge/)](https://readthedocs.org/projects/lib-cl-sii-python/) | [Open Source Insights](https://deps.dev/pypi/cl-sii) | ### Hosting From 645549d68fd38e83905f52980aa9c92d822c3fb6 Mon Sep 17 00:00:00 2001 From: Samuel Villegas Date: Thu, 14 Sep 2023 16:16:17 -0300 Subject: [PATCH 09/12] chore(deps): Update pydantic from 1.10.12 to 2.3.0 - [Software Repository](https://pypi.org/project/pydantic/2.3.0/) - [Release notes](https://github.com/pydantic/pydantic/releases/tag/v2.3.0) - [Changelog](https://github.com/pydantic/pydantic/blob/v2.3.0/HISTORY.md#v230-2023-08-23) - [Commits](https://github.com/pydantic/pydantic/compare/v1.10.12...v2.3.0) --- requirements.in | 2 +- requirements.txt | 11 +++++++++-- setup.py | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/requirements.in b/requirements.in index 3a162b66..a44d4bdd 100644 --- a/requirements.in +++ b/requirements.in @@ -13,7 +13,7 @@ importlib-metadata==6.1.0 jsonschema==4.17.3 lxml==4.9.2 marshmallow==3.19.0 -pydantic==1.10.12 +pydantic==2.3.0 pyOpenSSL==23.2.0 pytz==2023.3 signxml==3.2.0 diff --git a/requirements.txt b/requirements.txt index 268afe88..80854c37 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,8 @@ # # pip-compile --strip-extras requirements.in # +annotated-types==0.5.0 + # via pydantic asgiref==3.5.2 # via django attrs==20.3.0 @@ -43,8 +45,10 @@ pkgutil-resolve-name==1.3.10 # via jsonschema pycparser==2.20 # via cffi -pydantic==1.10.12 +pydantic==2.3.0 # via -r requirements.in +pydantic-core==2.6.3 + # via pydantic pyopenssl==23.2.0 # via # -r requirements.in @@ -61,7 +65,10 @@ signxml==3.2.0 sqlparse==0.4.4 # via django typing-extensions==4.7.1 - # via pydantic + # via + # annotated-types + # pydantic + # pydantic-core zipp==3.8.1 # via # importlib-metadata diff --git a/setup.py b/setup.py index 0ca7e521..838138ae 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ def get_version(*file_paths: str) -> str: 'jsonschema>=3.1.1', 'lxml>=4.6.5,<5', 'marshmallow>=3,<4', - 'pydantic>=1.6.2,!=1.7.*,!=1.8.*,!=1.9.*', + 'pydantic>=2.3.0,!=1.7.*,!=1.8.*,!=1.9.*', 'pyOpenSSL>=22.0.0', 'pytz>=2019.3', 'signxml>=3.1.0', From c0684c8fa02f87ace121b15ec6241644e9f5af55 Mon Sep 17 00:00:00 2001 From: Samuel Villegas Date: Thu, 14 Sep 2023 16:25:23 -0300 Subject: [PATCH 10/12] chore(deps): Update code to use `pydantic.v1` This update switches to `pydantic==2.3.0` but retains the code from the previous version. Subsequent commits will introduce changes to utilize the features from version 2. Ref: https://app.shortcut.com/cordada/story/768/update-lib-cl-sii-python --- src/cl_sii/dte/data_models.py | 58 ++++++++--------- src/cl_sii/dte/parse.py | 8 +-- src/cl_sii/rcv/data_models.py | 40 ++++++------ src/cl_sii/rtc/data_models.py | 38 +++++------ src/cl_sii/rtc/data_models_aec.py | 36 +++++----- src/cl_sii/rtc/parse_aec.py | 82 +++++++++++------------ src/tests/test_dte_data_models.py | 94 +++++++++++++-------------- src/tests/test_rcv_data_models.py | 40 ++++++------ src/tests/test_rtc_data_models.py | 30 ++++----- src/tests/test_rtc_data_models_aec.py | 16 ++--- 10 files changed, 221 insertions(+), 221 deletions(-) diff --git a/src/cl_sii/dte/data_models.py b/src/cl_sii/dte/data_models.py index f08a9c14..dea3fe7b 100644 --- a/src/cl_sii/dte/data_models.py +++ b/src/cl_sii/dte/data_models.py @@ -21,7 +21,7 @@ from datetime import date, datetime from typing import Mapping, Optional, Sequence -import pydantic +import pydantic.v1 import cl_sii.contribuyente.constants import cl_sii.rut.constants @@ -98,7 +98,7 @@ def validate_non_empty_bytes(value: bytes) -> None: raise ValueError("Bytes value length is 0.") -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -165,14 +165,14 @@ def slug(self) -> str: # Validators ########################################################################### - @pydantic.validator('folio') + @pydantic.v1.validator('folio') def validate_folio(cls, v: object) -> object: if isinstance(v, int): validate_dte_folio(v) return v -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -214,7 +214,7 @@ def natural_key(self) -> DteNaturalKey: return DteNaturalKey(emisor_rut=self.emisor_rut, tipo_dte=self.tipo_dte, folio=self.folio) -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -322,7 +322,7 @@ def deudor_rut(self) -> Rut: # Validators ########################################################################### - @pydantic.validator('monto_total') + @pydantic.v1.validator('monto_total') def validate_monto_total(cls, v: object, values: Mapping[str, object]) -> object: tipo_dte = values.get('tipo_dte') @@ -332,7 +332,7 @@ def validate_monto_total(cls, v: object, values: Mapping[str, object]) -> object return v -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -433,38 +433,38 @@ def as_dte_data_l1(self) -> DteDataL1: # Validators ########################################################################### - @pydantic.validator('emisor_razon_social', 'receptor_razon_social') + @pydantic.v1.validator('emisor_razon_social', 'receptor_razon_social') def validate_contribuyente_razon_social(cls, v: object) -> object: if isinstance(v, str): validate_contribuyente_razon_social(v) return v - @pydantic.validator('firma_documento_dt') + @pydantic.v1.validator('firma_documento_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v - @pydantic.validator('signature_value', 'signature_x509_cert_der') + @pydantic.v1.validator('signature_value', 'signature_x509_cert_der') def validate_non_empty_bytes(cls, v: object) -> object: if isinstance(v, bytes): validate_non_empty_bytes(v) return v - @pydantic.validator('emisor_giro', 'emisor_email', 'receptor_email') + @pydantic.v1.validator('emisor_giro', 'emisor_email', 'receptor_email') def validate_no_leading_or_trailing_whitespace_characters(cls, v: object) -> object: if isinstance(v, str): validate_clean_str(v) return v - @pydantic.validator('emisor_giro', 'emisor_email', 'receptor_email') + @pydantic.v1.validator('emisor_giro', 'emisor_email', 'receptor_email') def validate_non_empty_stripped_str(cls, v: object) -> object: if isinstance(v, str): validate_non_empty_str(v) return v -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -579,7 +579,7 @@ class DteXmlReferencia: # Validators ########################################################################### - @pydantic.validator('numero_linea_ref') + @pydantic.v1.validator('numero_linea_ref') def validate_numero_linea_ref(cls, value: int) -> int: if ( constants.DTE_REFERENCIA_LINE_NUMBER_MIN_VALUE @@ -595,7 +595,7 @@ def validate_numero_linea_ref(cls, value: int) -> int: value, ) - @pydantic.validator('tipo_documento_ref') + @pydantic.v1.validator('tipo_documento_ref') def validate_tipo_documento_ref(cls, value: str) -> str: if 1 <= len(value) <= 3: return value @@ -604,13 +604,13 @@ def validate_tipo_documento_ref(cls, value: str) -> str: "The length of 'tipo_documento_ref' must be a value between 1 and 3", value ) - @pydantic.validator('ind_global') + @pydantic.v1.validator('ind_global') def validate_ind_global(cls, value: int | None) -> int | None: if value and value != 1: raise ValueError("Only the value '1' is valid for the field 'ind_global'", value) return value - @pydantic.validator('folio_ref') + @pydantic.v1.validator('folio_ref') def validate_folio_ref(cls, value: str) -> str: if ( constants.DTE_REFERENCIA_FOLIO_MIN_LENGTH @@ -626,7 +626,7 @@ def validate_folio_ref(cls, value: str) -> str: value, ) - @pydantic.validator('fecha_ref') + @pydantic.v1.validator('fecha_ref') def validate_fecha_ref(cls, value: date) -> date: if ( value < constants.DTE_REFERENCIA_FECHA_NOT_BEFORE @@ -641,7 +641,7 @@ def validate_fecha_ref(cls, value: date) -> date: return value - @pydantic.validator('razon_ref') + @pydantic.v1.validator('razon_ref') def validate_razon_ref(cls, value: str | None) -> str | None: if value and len(value) > constants.DTE_REFERENCIA_RAZON_MAX_LENGTH: raise ValueError( @@ -653,7 +653,7 @@ def validate_razon_ref(cls, value: str | None) -> str | None: return value -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -781,37 +781,37 @@ def as_dte_data_l2(self) -> DteDataL2: # Validators ########################################################################### - @pydantic.validator('emisor_razon_social', 'receptor_razon_social') + @pydantic.v1.validator('emisor_razon_social', 'receptor_razon_social') def validate_contribuyente_razon_social(cls, v: object) -> object: if isinstance(v, str): validate_contribuyente_razon_social(v) return v - @pydantic.validator('firma_documento_dt') + @pydantic.v1.validator('firma_documento_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v - @pydantic.validator('signature_value', 'signature_x509_cert_der') + @pydantic.v1.validator('signature_value', 'signature_x509_cert_der') def validate_non_empty_bytes(cls, v: object) -> object: if isinstance(v, bytes): validate_non_empty_bytes(v) return v - @pydantic.validator('emisor_giro', 'emisor_email', 'receptor_email') + @pydantic.v1.validator('emisor_giro', 'emisor_email', 'receptor_email') def validate_no_leading_or_trailing_whitespace_characters(cls, v: object) -> object: if isinstance(v, str): validate_clean_str(v) return v - @pydantic.validator('emisor_giro', 'emisor_email', 'receptor_email') + @pydantic.v1.validator('emisor_giro', 'emisor_email', 'receptor_email') def validate_non_empty_stripped_str(cls, v: object) -> object: if isinstance(v, str): validate_non_empty_str(v) return v - @pydantic.validator('referencias') + @pydantic.v1.validator('referencias') def validate_referencias_numero_linea_ref_order(cls, v: object) -> object: if isinstance(v, Sequence): for idx, referencia in enumerate(v, start=1): @@ -819,7 +819,7 @@ def validate_referencias_numero_linea_ref_order(cls, v: object) -> object: raise ValueError("items must be ordered according to their 'numero_linea_ref'") return v - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_referencias_rut_otro_is_consistent_with_tipo_dte( cls, values: Mapping[str, object], @@ -842,7 +842,7 @@ def validate_referencias_rut_otro_is_consistent_with_tipo_dte( return values - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_referencias_rut_otro_is_consistent_with_emisor_rut( cls, values: Mapping[str, object], @@ -861,7 +861,7 @@ def validate_referencias_rut_otro_is_consistent_with_emisor_rut( return values - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_referencias_codigo_ref_is_consistent_with_tipo_dte( cls, values: Mapping[str, object], diff --git a/src/cl_sii/dte/parse.py b/src/cl_sii/dte/parse.py index 674c9442..f3c9c968 100644 --- a/src/cl_sii/dte/parse.py +++ b/src/cl_sii/dte/parse.py @@ -26,7 +26,7 @@ from datetime import date, datetime from typing import Mapping, Optional, Sequence, Tuple -import pydantic +import pydantic.v1 from cl_sii.libs import encoding_utils, tz_utils, xml_utils from cl_sii.libs.xml_utils import XmlElement, XmlElementTree @@ -570,7 +570,7 @@ def _validate_rut(v: object) -> object: return v -class _DteXmlReferenciaParser(pydantic.BaseModel): +class _DteXmlReferenciaParser(pydantic.v1.BaseModel): """ Parser for ``/Documento/Referencia``. """ @@ -579,7 +579,7 @@ class Config: allow_mutation = False anystr_strip_whitespace = True arbitrary_types_allowed = True - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid ########################################################################### # Fields @@ -636,7 +636,7 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: # Validators ########################################################################### - _validate_rut = pydantic.validator( + _validate_rut = pydantic.v1.validator( 'rut_otro', pre=True, allow_reuse=True, diff --git a/src/cl_sii/rcv/data_models.py b/src/cl_sii/rcv/data_models.py index d2732d92..03cd95f6 100644 --- a/src/cl_sii/rcv/data_models.py +++ b/src/cl_sii/rcv/data_models.py @@ -10,7 +10,7 @@ from datetime import date, datetime from typing import ClassVar, Mapping, Optional -import pydantic +import pydantic.v1 import cl_sii.dte.data_models from cl_sii.base.constants import SII_OFFICIAL_TZ @@ -22,7 +22,7 @@ logger = logging.getLogger(__name__) -@pydantic.dataclasses.dataclass(frozen=True) +@pydantic.v1.dataclasses.dataclass(frozen=True) class PeriodoTributario: ########################################################################### # constants @@ -41,14 +41,14 @@ class PeriodoTributario: # Validators ########################################################################### - @pydantic.validator('year') + @pydantic.v1.validator('year') def validate_year(cls, v: object) -> object: if isinstance(v, int) and v < 1900: # 1900 si an arbitrary number but it more useful than checking not < 1. raise ValueError("Value is out of the valid range for 'year'.") return v - @pydantic.validator('month') + @pydantic.v1.validator('month') def validate_month(cls, v: object) -> object: if isinstance(v, int): if v < 1 or v > 12: @@ -97,7 +97,7 @@ def as_datetime(self) -> datetime: ) -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -161,19 +161,19 @@ class RcvDetalleEntry: # Validators ########################################################################### - @pydantic.validator('folio') + @pydantic.v1.validator('folio') def validate_folio(cls, v: object) -> object: if isinstance(v, int): cl_sii.dte.data_models.validate_dte_folio(v) return v - @pydantic.validator('fecha_recepcion_dt') + @pydantic.v1.validator('fecha_recepcion_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_rcv_kind_is_consistent_with_rc_estado_contable( cls, values: Mapping[str, object], @@ -233,7 +233,7 @@ def as_dte_data_l2(self) -> cl_sii.dte.data_models.DteDataL2: return dte_data -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -274,20 +274,20 @@ class RvDetalleEntry(RcvDetalleEntry): # Validators ########################################################################### - @pydantic.validator('receptor_razon_social') + @pydantic.v1.validator('receptor_razon_social') def validate_contribuyente_razon_social(cls, v: object) -> object: if isinstance(v, str): cl_sii.dte.data_models.validate_contribuyente_razon_social(v) return v - @pydantic.validator('fecha_acuse_dt', 'fecha_reclamo_dt') + @pydantic.v1.validator('fecha_acuse_dt', 'fecha_reclamo_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -325,20 +325,20 @@ class RcRegistroDetalleEntry(RcvDetalleEntry): # Validators ########################################################################### - @pydantic.validator('emisor_razon_social') + @pydantic.v1.validator('emisor_razon_social') def validate_contribuyente_razon_social(cls, v: object) -> object: if isinstance(v, str): cl_sii.dte.data_models.validate_contribuyente_razon_social(v) return v - @pydantic.validator('fecha_acuse_dt') + @pydantic.v1.validator('fecha_acuse_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -358,7 +358,7 @@ class RcNoIncluirDetalleEntry(RcRegistroDetalleEntry): RC_ESTADO_CONTABLE = RcEstadoContable.NO_INCLUIR -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -400,20 +400,20 @@ class RcReclamadoDetalleEntry(RcvDetalleEntry): # Validators ########################################################################### - @pydantic.validator('emisor_razon_social') + @pydantic.v1.validator('emisor_razon_social') def validate_contribuyente_razon_social(cls, v: object) -> object: if isinstance(v, str): cl_sii.dte.data_models.validate_contribuyente_razon_social(v) return v - @pydantic.validator('fecha_reclamo_dt') + @pydantic.v1.validator('fecha_reclamo_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -441,7 +441,7 @@ class RcPendienteDetalleEntry(RcvDetalleEntry): # Validators ########################################################################### - @pydantic.validator('emisor_razon_social') + @pydantic.v1.validator('emisor_razon_social') def validate_contribuyente_razon_social(cls, v: object) -> object: if isinstance(v, str): cl_sii.dte.data_models.validate_contribuyente_razon_social(v) diff --git a/src/cl_sii/rtc/data_models.py b/src/cl_sii/rtc/data_models.py index 59f816e3..637019eb 100644 --- a/src/cl_sii/rtc/data_models.py +++ b/src/cl_sii/rtc/data_models.py @@ -23,7 +23,7 @@ from datetime import date, datetime from typing import Any, ClassVar, Mapping, Optional -import pydantic +import pydantic.v1 from cl_sii.base.constants import SII_OFFICIAL_TZ from cl_sii.dte import data_models as dte_data_models @@ -79,7 +79,7 @@ def validate_cesion_and_dte_montos(cesion_value: int, dte_value: int) -> None: raise ValueError('Value of "cesión" must be <= value of DTE.', cesion_value, dte_value) -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -140,20 +140,20 @@ def as_dict(self) -> Mapping[str, object]: # Validators ########################################################################### - @pydantic.validator('dte_key') + @pydantic.v1.validator('dte_key') def validate_dte_tipo_dte(cls, v: object) -> object: if isinstance(v, dte_data_models.DteNaturalKey): validate_cesion_dte_tipo_dte(v.tipo_dte) return v - @pydantic.validator('seq') + @pydantic.v1.validator('seq') def validate_seq(cls, v: object) -> object: if isinstance(v, int): validate_cesion_seq(v) return v -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -245,19 +245,19 @@ def as_dict(self) -> Mapping[str, object]: # Validators ########################################################################### - @pydantic.validator('dte_key') + @pydantic.v1.validator('dte_key') def validate_dte_tipo_dte(cls, v: object) -> object: if isinstance(v, dte_data_models.DteNaturalKey): validate_cesion_dte_tipo_dte(v.tipo_dte) return v - @pydantic.validator('fecha_cesion_dt') + @pydantic.v1.validator('fecha_cesion_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v - @pydantic.validator('fecha_cesion_dt') + @pydantic.v1.validator('fecha_cesion_dt') def truncate_fecha_cesion_dt_to_minutes(cls, v: object) -> object: if isinstance(v, datetime): if v.second != 0: @@ -267,7 +267,7 @@ def truncate_fecha_cesion_dt_to_minutes(cls, v: object) -> object: return v -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -390,26 +390,26 @@ def as_dict(self) -> Mapping[str, object]: # Validators ########################################################################### - @pydantic.validator('dte_key') + @pydantic.v1.validator('dte_key') def validate_dte_tipo_dte(cls, v: object) -> object: if isinstance(v, dte_data_models.DteNaturalKey): validate_cesion_dte_tipo_dte(v.tipo_dte) return v - @pydantic.validator('seq') + @pydantic.v1.validator('seq') def validate_seq(cls, v: object) -> object: if isinstance(v, int): validate_cesion_seq(v) return v - @pydantic.validator('fecha_cesion_dt') + @pydantic.v1.validator('fecha_cesion_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -508,13 +508,13 @@ def as_dte_data_l1(self) -> dte_data_models.DteDataL1: # TODO: Validate value of 'fecha_cesion_dt' in relation to the DTE data. - @pydantic.validator('monto_cedido') + @pydantic.v1.validator('monto_cedido') def validate_monto_cedido(cls, v: object) -> object: if isinstance(v, int): validate_cesion_monto(v) return v - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_monto_cedido_does_not_exceed_dte_monto_total( cls, values: Mapping[str, object], @@ -528,7 +528,7 @@ def validate_monto_cedido_does_not_exceed_dte_monto_total( return values -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -696,7 +696,7 @@ def as_dte_data_l2(self) -> dte_data_models.DteDataL2: # TODO: Validate value of 'fecha_ultimo_vencimiento' in relation to the DTE data. - @pydantic.validator( + @pydantic.v1.validator( 'fecha_cesion_dt', 'fecha_firma_dt', ) @@ -705,7 +705,7 @@ def validate_datetime_tz(cls, v: object) -> object: tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v - @pydantic.validator( + @pydantic.v1.validator( 'cedente_razon_social', 'cesionario_razon_social', 'dte_emisor_razon_social', @@ -716,7 +716,7 @@ def validate_contribuyente_razon_social(cls, v: object) -> object: dte_data_models.validate_contribuyente_razon_social(v) return v - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_dte_data_l2(cls, values: Mapping[str, Any]) -> Mapping[str, object]: dte_key = values['dte_key'] try: diff --git a/src/cl_sii/rtc/data_models_aec.py b/src/cl_sii/rtc/data_models_aec.py index fe55ff81..c8a852b2 100644 --- a/src/cl_sii/rtc/data_models_aec.py +++ b/src/cl_sii/rtc/data_models_aec.py @@ -9,7 +9,7 @@ from datetime import date, datetime from typing import ClassVar, Mapping, Optional, Sequence, Tuple -import pydantic +import pydantic.v1 from cl_sii.base.constants import SII_OFFICIAL_TZ from cl_sii.dte import data_models as dte_data_models @@ -18,7 +18,7 @@ from . import data_models -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -307,25 +307,25 @@ def as_cesion_l2(self) -> data_models.CesionL2: # Validators ########################################################################### - @pydantic.validator('dte') + @pydantic.v1.validator('dte') def validate_dte_tipo_dte(cls, v: object) -> object: if isinstance(v, dte_data_models.DteDataL0): data_models.validate_cesion_dte_tipo_dte(v.tipo_dte) return v - @pydantic.validator('seq') + @pydantic.v1.validator('seq') def validate_seq(cls, v: object) -> object: if isinstance(v, int): data_models.validate_cesion_seq(v) return v - @pydantic.validator('monto_cesion') + @pydantic.v1.validator('monto_cesion') def validate_monto_cesion(cls, v: object) -> object: if isinstance(v, int): data_models.validate_cesion_monto(v) return v - @pydantic.validator( + @pydantic.v1.validator( 'cedente_razon_social', 'cesionario_razon_social', ) @@ -334,13 +334,13 @@ def validate_contribuyente_razon_social(cls, v: object) -> object: dte_data_models.validate_contribuyente_razon_social(v) return v - @pydantic.validator('fecha_cesion_dt') + @pydantic.v1.validator('fecha_cesion_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_fecha_cesion_dt_is_consistent_with_dte( cls, values: Mapping[str, object], @@ -353,7 +353,7 @@ def validate_fecha_cesion_dt_is_consistent_with_dte( return values - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_monto_cesion_does_not_exceed_dte_monto_total( cls, values: Mapping[str, object], @@ -369,7 +369,7 @@ def validate_monto_cesion_does_not_exceed_dte_monto_total( return values - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_fecha_ultimo_vencimiento_is_consistent_with_dte( cls, values: Mapping[str, object], @@ -385,7 +385,7 @@ def validate_fecha_ultimo_vencimiento_is_consistent_with_dte( return values -@pydantic.dataclasses.dataclass( +@pydantic.v1.dataclasses.dataclass( frozen=True, config=type( 'Config', @@ -693,26 +693,26 @@ def as_cesion_l2(self) -> data_models.CesionL2: # Validators ########################################################################### - @pydantic.validator('dte') + @pydantic.v1.validator('dte') def validate_dte_tipo_dte(cls, v: object) -> object: if isinstance(v, dte_data_models.DteDataL0): data_models.validate_cesion_dte_tipo_dte(v.tipo_dte) return v - @pydantic.validator('fecha_firma_dt') + @pydantic.v1.validator('fecha_firma_dt') def validate_datetime_tz(cls, v: object) -> object: if isinstance(v, datetime): tz_utils.validate_dt_tz(v, cls.DATETIME_FIELDS_TZ) return v - @pydantic.validator('cesiones') + @pydantic.v1.validator('cesiones') def validate_cesiones_min_items(cls, v: object) -> object: if isinstance(v, Sequence): if len(v) < 1: raise ValueError("must contain at least one item") return v - @pydantic.validator('cesiones') + @pydantic.v1.validator('cesiones') def validate_cesiones_seq_order(cls, v: object) -> object: if isinstance(v, Sequence): for idx, cesion in enumerate(v, start=1): @@ -739,7 +739,7 @@ def validate_cesiones_seq_order(cls, v: object) -> object: # return v - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_dte_matches_cesiones_dtes( cls, values: Mapping[str, object], @@ -761,7 +761,7 @@ def validate_dte_matches_cesiones_dtes( return values - @pydantic.root_validator(skip_on_failure=True) + @pydantic.v1.root_validator(skip_on_failure=True) def validate_last_cesion_matches_some_fields( cls, values: Mapping[str, object], @@ -795,7 +795,7 @@ def validate_last_cesion_matches_some_fields( return values - @pydantic.root_validator + @pydantic.v1.root_validator def validate_signature_value_and_signature_x509_cert_der_may_only_be_none_together( cls, values: Mapping[str, object], diff --git a/src/cl_sii/rtc/parse_aec.py b/src/cl_sii/rtc/parse_aec.py index 0b52dd00..7cc30f41 100644 --- a/src/cl_sii/rtc/parse_aec.py +++ b/src/cl_sii/rtc/parse_aec.py @@ -21,7 +21,7 @@ from pathlib import Path from typing import Mapping, Optional, Sequence -import pydantic +import pydantic.v1 import cl_sii.dte.data_models import cl_sii.dte.parse @@ -104,7 +104,7 @@ def _validate_rut(v: object) -> object: return v -class _XmlSignature(pydantic.BaseModel): +class _XmlSignature(pydantic.v1.BaseModel): """ Parser for ``//Signature``. """ @@ -112,7 +112,7 @@ class _XmlSignature(pydantic.BaseModel): class Config: allow_mutation = False anystr_strip_whitespace = True - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid min_anystr_length = 1 ########################################################################### @@ -158,7 +158,7 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: # Validators ########################################################################### - @pydantic.validator( + @pydantic.v1.validator( 'signature_value', 'key_info_x509_data_x509_cert', pre=True, @@ -178,7 +178,7 @@ def validate_base64(cls, v: object) -> object: # return v -class _Cesionario(pydantic.BaseModel): +class _Cesionario(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cesionario``. """ @@ -187,7 +187,7 @@ class Config: allow_mutation = False anystr_strip_whitespace = True arbitrary_types_allowed = True - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid min_anystr_length = 1 ########################################################################### @@ -220,14 +220,14 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: # Validators ########################################################################### - _validate_rut = pydantic.validator( # type: ignore[pydantic-field] + _validate_rut = pydantic.v1.validator( # type: ignore[pydantic-field] 'rut', pre=True, allow_reuse=True, )(_validate_rut) -class _RutAutorizado(pydantic.BaseModel): +class _RutAutorizado(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cedente/RUTAutorizado``. """ @@ -236,7 +236,7 @@ class Config: allow_mutation = False anystr_strip_whitespace = True arbitrary_types_allowed = True - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid min_anystr_length = 1 ########################################################################### @@ -265,20 +265,20 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: # Validators ########################################################################### - _empty_str_to_none = pydantic.validator( # type: ignore[pydantic-field] + _empty_str_to_none = pydantic.v1.validator( # type: ignore[pydantic-field] 'nombre', pre=True, allow_reuse=True, )(_empty_str_to_none) - _validate_rut = pydantic.validator( # type: ignore[pydantic-field] + _validate_rut = pydantic.v1.validator( # type: ignore[pydantic-field] 'rut', pre=True, allow_reuse=True, )(_validate_rut) -class _Cedente(pydantic.BaseModel): +class _Cedente(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cedente``. """ @@ -287,7 +287,7 @@ class Config: allow_mutation = False anystr_strip_whitespace = True arbitrary_types_allowed = True - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid min_anystr_length = 1 ########################################################################### @@ -338,13 +338,13 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: # Validators ########################################################################### - @pydantic.validator('rut', pre=True) + @pydantic.v1.validator('rut', pre=True) def validate_rut(cls, v: object) -> object: if isinstance(v, str): v = Rut(value=v, validate_dv=False) # Raises ValueError if invalid. return v - @pydantic.validator('ruts_autorizados') + @pydantic.v1.validator('ruts_autorizados') def validate_ruts_autorizados_item_count(cls, v: object) -> object: if isinstance(v, Sequence): if len(v) < 1: @@ -354,7 +354,7 @@ def validate_ruts_autorizados_item_count(cls, v: object) -> object: return v -class _IdDte(pydantic.BaseModel): +class _IdDte(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/IdDTE``. """ @@ -362,7 +362,7 @@ class _IdDte(pydantic.BaseModel): class Config: allow_mutation = False arbitrary_types_allowed = True - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid ########################################################################### # Fields @@ -408,26 +408,26 @@ def as_dte_data_l1(self) -> cl_sii.dte.data_models.DteDataL1: # Validators ########################################################################### - _validate_rut_emisor = pydantic.validator( # type: ignore[pydantic-field] + _validate_rut_emisor = pydantic.v1.validator( # type: ignore[pydantic-field] 'rut_emisor', pre=True, allow_reuse=True, )(_validate_rut) - _validate_rut_receptor = pydantic.validator( # type: ignore[pydantic-field] + _validate_rut_receptor = pydantic.v1.validator( # type: ignore[pydantic-field] 'rut_receptor', pre=True, allow_reuse=True, )(_validate_rut) - @pydantic.validator('tipo_dte', pre=True) + @pydantic.v1.validator('tipo_dte', pre=True) def validate_tipo_dte(cls, v: object) -> object: if isinstance(v, int): v = TipoDte(v) # Raises ValueError if invalid. return v -class _DocumentoCesion(pydantic.BaseModel): +class _DocumentoCesion(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion``. """ @@ -435,7 +435,7 @@ class _DocumentoCesion(pydantic.BaseModel): class Config: allow_mutation = False anystr_strip_whitespace = True - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid min_anystr_length = 1 ########################################################################### @@ -498,7 +498,7 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: # Validators ########################################################################### - @pydantic.validator('tmst_cesion') + @pydantic.v1.validator('tmst_cesion') def validate_datetime(cls, v: object) -> object: if isinstance(v, str): v = datetime.fromisoformat(v) @@ -511,14 +511,14 @@ def validate_datetime(cls, v: object) -> object: return v -class _Cesion(pydantic.BaseModel): +class _Cesion(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC/Cesiones/Cesion``. """ class Config: allow_mutation = False - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid ########################################################################### # Fields @@ -585,7 +585,7 @@ def as_cesion_aec_xml(self) -> data_models_aec.CesionAecXml: ) -class _DocumentoDteCedido(pydantic.BaseModel): +class _DocumentoDteCedido(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC/Cesiones/DTECedido/DocumentoDTECedido``. """ @@ -593,7 +593,7 @@ class _DocumentoDteCedido(pydantic.BaseModel): class Config: allow_mutation = False arbitrary_types_allowed = True - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid ########################################################################### # Fields @@ -631,7 +631,7 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: # Validators ########################################################################### - @pydantic.validator('dte', pre=True) + @pydantic.v1.validator('dte', pre=True) def validate_dte(cls, v: object) -> object: if isinstance(v, XmlElement): cl_sii.dte.parse.validate_dte_xml(v) @@ -651,14 +651,14 @@ def validate_dte(cls, v: object) -> object: # return v -class _DteCedido(pydantic.BaseModel): +class _DteCedido(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC/Cesiones/DTECedido``. """ class Config: allow_mutation = False - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid ########################################################################### # Fields @@ -702,7 +702,7 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: ) -class _Caratula(pydantic.BaseModel): +class _Caratula(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC/Caratula``. """ @@ -711,7 +711,7 @@ class Config: allow_mutation = False anystr_strip_whitespace = True arbitrary_types_allowed = True - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid min_anystr_length = 1 ########################################################################### @@ -748,7 +748,7 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: # Validators ########################################################################### - _empty_str_to_none = pydantic.validator( # type: ignore[pydantic-field] + _empty_str_to_none = pydantic.v1.validator( # type: ignore[pydantic-field] 'nmb_contacto', 'fono_contacto', 'mail_contacto', @@ -756,19 +756,19 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: allow_reuse=True, )(_empty_str_to_none) - _validate_rut_cedente = pydantic.validator( # type: ignore[pydantic-field] + _validate_rut_cedente = pydantic.v1.validator( # type: ignore[pydantic-field] 'rut_cedente', pre=True, allow_reuse=True, )(_validate_rut) - _validate_rut_cesionario = pydantic.validator( # type: ignore[pydantic-field] + _validate_rut_cesionario = pydantic.v1.validator( # type: ignore[pydantic-field] 'rut_cesionario', pre=True, allow_reuse=True, )(_validate_rut) - @pydantic.validator('tmst_firmaenvio') + @pydantic.v1.validator('tmst_firmaenvio') def validate_datetime(cls, v: object) -> object: if isinstance(v, str): v = datetime.fromisoformat(v) @@ -781,14 +781,14 @@ def validate_datetime(cls, v: object) -> object: return v -class _DocumentoAec(pydantic.BaseModel): +class _DocumentoAec(pydantic.v1.BaseModel): """ Parser for ``/AEC/DocumentoAEC``. """ class Config: allow_mutation = False - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid ########################################################################### # Fields @@ -844,7 +844,7 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: # Validators ########################################################################### - @pydantic.validator('cesiones_cesion') + @pydantic.v1.validator('cesiones_cesion') def validate_cesiones_cesion_min_items(cls, v: object) -> object: if isinstance(v, Sequence): if len(v) < 1: @@ -852,14 +852,14 @@ def validate_cesiones_cesion_min_items(cls, v: object) -> object: return v -class _Aec(pydantic.BaseModel): +class _Aec(pydantic.v1.BaseModel): """ Parser for ``/AEC``. """ class Config: allow_mutation = False - extra = pydantic.Extra.forbid + extra = pydantic.v1.Extra.forbid ########################################################################### # Fields diff --git a/src/tests/test_dte_data_models.py b/src/tests/test_dte_data_models.py index c204bfd1..665c9ff3 100644 --- a/src/tests/test_dte_data_models.py +++ b/src/tests/test_dte_data_models.py @@ -3,7 +3,7 @@ import unittest from datetime import date, datetime -import pydantic +import pydantic.v1 from cl_sii.dte.constants import ( DTE_FOLIO_FIELD_MAX_VALUE, @@ -48,7 +48,7 @@ def test_validate_folio_range(self) -> None: ] # Validate the minimum value of the field folio - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_nk_1, folio=DTE_FOLIO_FIELD_MIN_VALUE - 1, @@ -60,7 +60,7 @@ def test_validate_folio_range(self) -> None: self.assertIn(expected_validation_error, validation_errors) # Validate the maximum value of the field folio - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_nk_1, folio=DTE_FOLIO_FIELD_MAX_VALUE + 1, @@ -136,7 +136,7 @@ def test_is_ok_negative_monto_total_in_tipo_dte_liquidacion_factura(self) -> Non tipo_dte=TipoDte.LIQUIDACION_FACTURA_ELECTRONICA, monto_total=-1, ) - except pydantic.ValidationError as exc: + except pydantic.v1.ValidationError as exc: self.fail(f'{exc.__class__.__name__} raised') def test_validate_monto_total_range(self) -> None: @@ -149,7 +149,7 @@ def test_validate_monto_total_range(self) -> None: ] # Validate the minimum value of the field monto_total - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l1_1, monto_total=DTE_MONTO_TOTAL_FIELD_MIN_VALUE - 1, @@ -161,7 +161,7 @@ def test_validate_monto_total_range(self) -> None: self.assertIn(expected_validation_error, validation_errors) # Validate the maximum value of the field monto_total - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l1_1, monto_total=DTE_MONTO_TOTAL_FIELD_MAX_VALUE + 1, @@ -174,7 +174,7 @@ def test_validate_monto_total_range(self) -> None: # Validate the minimum value of the field monto_total # for a tipo_dte FACTURA_ELECTRONICA - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l1_1, monto_total=-1, @@ -331,7 +331,7 @@ def test_ok_razon_social_none(self) -> None: emisor_razon_social=None, receptor_razon_social=None, ) - except pydantic.ValidationError as exc: + except pydantic.v1.ValidationError as exc: self.fail(f'{exc.__class__.__name__} raised') def test_validate_emisor_razon_social_empty(self) -> None: @@ -343,7 +343,7 @@ def test_validate_emisor_razon_social_empty(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, emisor_razon_social='', @@ -363,7 +363,7 @@ def test_validate_receptor_razon_social_empty(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, receptor_razon_social='', @@ -385,7 +385,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, firma_documento_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -411,7 +411,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, firma_documento_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -455,7 +455,7 @@ def test_validate_non_empty_bytes_signature_value(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, signature_value=b'', @@ -496,7 +496,7 @@ def test_validate_non_empty_bytes_signature_x509_cert_der(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, signature_x509_cert_der=b'', @@ -516,7 +516,7 @@ def test_validate_no_leading_or_trailing_whitespace_characters_emisor_giro(self) }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, emisor_giro=' NASA ', @@ -541,7 +541,7 @@ def test_validate_no_leading_or_trailing_whitespace_characters_emisor_email(self }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, emisor_email=' fake_emisor_email@test.cl ', @@ -566,7 +566,7 @@ def test_validate_no_leading_or_trailing_whitespace_characters_receptor_email(se }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, receptor_email=' fake_receptor_email@test.cl ', @@ -586,7 +586,7 @@ def test_validate_non_empty_stripped_str_emisor_giro(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, emisor_giro='', @@ -606,7 +606,7 @@ def test_validate_non_empty_stripped_str_emisor_email(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, emisor_email='', @@ -626,7 +626,7 @@ def test_validate_non_empty_stripped_str_receptor_email(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_l2_1, receptor_email='', @@ -746,7 +746,7 @@ def test_init_fail_numero_linea_ref_out_of_range(self) -> None: obj = self.obj_1 - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, numero_linea_ref=0, @@ -761,7 +761,7 @@ def test_init_fail_numero_linea_ref_out_of_range(self) -> None: } ], ) - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, numero_linea_ref=41, @@ -782,7 +782,7 @@ def test_init_fail_tipo_documento_ref_invalid(self) -> None: obj = self.obj_1 - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, tipo_documento_ref="8001", @@ -798,7 +798,7 @@ def test_init_fail_tipo_documento_ref_invalid(self) -> None: } ], ) - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, tipo_documento_ref="2BAD", @@ -820,7 +820,7 @@ def test_init_fail_ind_global_invalid(self) -> None: obj = self.obj_1 - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, ind_global=2, @@ -841,7 +841,7 @@ def test_init_fail_folio_ref_empty(self) -> None: obj = self.obj_2 - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, folio_ref="", @@ -862,7 +862,7 @@ def test_init_fail_fecha_ref_out_of_range(self) -> None: obj = self.obj_1 - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_ref=date(2002, 7, 31), @@ -878,7 +878,7 @@ def test_init_fail_fecha_ref_out_of_range(self) -> None: } ], ) - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_ref=date(2051, 1, 1), @@ -900,7 +900,7 @@ def test_init_fail_razon_ref_too_long(self) -> None: obj = self.obj_1 - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, razon_ref=( @@ -1065,7 +1065,7 @@ def test_validate_emisor_razon_social_empty(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, emisor_razon_social='', @@ -1085,7 +1085,7 @@ def test_validate_receptor_razon_social_empty(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, receptor_razon_social='', @@ -1105,7 +1105,7 @@ def test_validate_emisor_razon_social_none(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, emisor_razon_social=None, @@ -1125,7 +1125,7 @@ def test_validate_receptor_razon_social_none(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, receptor_razon_social=None, @@ -1147,7 +1147,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, firma_documento_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -1173,7 +1173,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, firma_documento_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -1217,7 +1217,7 @@ def test_validate_non_empty_bytes_signature_value(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, signature_value=b'', @@ -1258,7 +1258,7 @@ def test_validate_non_empty_bytes_signature_x509_cert_der(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, signature_x509_cert_der=b'', @@ -1278,7 +1278,7 @@ def test_validate_no_leading_or_trailing_whitespace_characters_emisor_giro(self) }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, emisor_giro=' NASA ', @@ -1303,7 +1303,7 @@ def test_validate_no_leading_or_trailing_whitespace_characters_emisor_email(self }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, emisor_email=' fake_emisor_email@test.cl ', @@ -1328,7 +1328,7 @@ def test_validate_no_leading_or_trailing_whitespace_characters_receptor_email(se }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, receptor_email=' fake_receptor_email@test.cl ', @@ -1348,7 +1348,7 @@ def test_validate_non_empty_stripped_str_emisor_giro(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, emisor_giro='', @@ -1368,7 +1368,7 @@ def test_validate_non_empty_stripped_str_emisor_email(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, emisor_email='', @@ -1388,7 +1388,7 @@ def test_validate_non_empty_stripped_str_receptor_email(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.dte_xml_data_1, receptor_email='', @@ -1553,7 +1553,7 @@ def test_validate_referencias_numero_linea_ref_order(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, referencias=list(reversed(obj.referencias)), @@ -1587,7 +1587,7 @@ def test_validate_referencias_rut_otro_is_consistent_with_tipo_dte(self) -> None }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, referencias=[obj_referencia], @@ -1625,7 +1625,7 @@ def test_validate_referencias_rut_otro_is_consistent_with_emisor_rut(self) -> No }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, referencias=[obj_referencia], @@ -1653,7 +1653,7 @@ def test_validate_referencias_codigo_ref_is_consistent_with_tipo_dte(self) -> No }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, referencias=[obj_referencia], diff --git a/src/tests/test_rcv_data_models.py b/src/tests/test_rcv_data_models.py index 4fc556d4..c842c0e3 100644 --- a/src/tests/test_rcv_data_models.py +++ b/src/tests/test_rcv_data_models.py @@ -2,7 +2,7 @@ import unittest from datetime import date, datetime -import pydantic +import pydantic.v1 import cl_sii.dte.constants from cl_sii.base.constants import SII_OFFICIAL_TZ @@ -39,7 +39,7 @@ def test_validate_year_range(self) -> None: ] # Validate the minimum value of the field year - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.periodo_tributario_1, year=1899, @@ -60,7 +60,7 @@ def test_validate_month_range(self) -> None: ] # Validate the minimum value of the field month - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.periodo_tributario_1, month=0, @@ -72,7 +72,7 @@ def test_validate_month_range(self) -> None: self.assertIn(expected_validation_error, validation_errors) # Validate the maximum value of the field month - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.periodo_tributario_1, month=13, @@ -111,7 +111,7 @@ def test_validate_folio_range(self) -> None: ] # Validate the minimum value of the field folio - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rcv_detalle_entry_1, folio=cl_sii.dte.constants.DTE_FOLIO_FIELD_MIN_VALUE - 1, @@ -123,7 +123,7 @@ def test_validate_folio_range(self) -> None: self.assertIn(expected_validation_error, validation_errors) # Validate the maximum value of the field folio - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rcv_detalle_entry_1, folio=cl_sii.dte.constants.DTE_FOLIO_FIELD_MAX_VALUE + 1, @@ -145,7 +145,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rcv_detalle_entry_1, fecha_recepcion_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -171,7 +171,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rcv_detalle_entry_1, fecha_recepcion_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -227,7 +227,7 @@ def test_validate_receptor_razon_social_empty(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rv_detalle_entry_1, receptor_razon_social='', @@ -250,7 +250,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rv_detalle_entry_1, fecha_acuse_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -276,7 +276,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rv_detalle_entry_1, fecha_acuse_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -301,7 +301,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rv_detalle_entry_1, fecha_reclamo_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -327,7 +327,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rv_detalle_entry_1, fecha_reclamo_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -379,7 +379,7 @@ def test_validate_emisor_razon_social_empty(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rc_registro_detalle_entry_1, emisor_razon_social='', @@ -401,7 +401,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rc_registro_detalle_entry_1, fecha_acuse_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -427,7 +427,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rc_registro_detalle_entry_1, fecha_acuse_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -502,7 +502,7 @@ def test_validate_emisor_razon_social_empty(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rc_reclamado_detalle_entry_1, emisor_razon_social='', @@ -524,7 +524,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rc_reclamado_detalle_entry_1, fecha_reclamo_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -550,7 +550,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rc_reclamado_detalle_entry_1, fecha_reclamo_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -592,7 +592,7 @@ def test_validate_emisor_razon_social_empty(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( self.rc_pendiente_detalle_entry_1, emisor_razon_social='', diff --git a/src/tests/test_rtc_data_models.py b/src/tests/test_rtc_data_models.py index e8fbb814..dce89cac 100644 --- a/src/tests/test_rtc_data_models.py +++ b/src/tests/test_rtc_data_models.py @@ -4,7 +4,7 @@ import unittest from datetime import date, datetime -import pydantic +import pydantic.v1 from cl_sii.dte.constants import TipoDte from cl_sii.dte.data_models import DteDataL1, DteDataL2, DteNaturalKey @@ -91,7 +91,7 @@ def test_validate_dte_tipo_dte(self) -> None: 'type': 'value_error', } - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, dte_key=dataclasses.replace( @@ -116,7 +116,7 @@ def test_validate_seq(self) -> None: 'type': 'value_error', } - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, seq=test_value, @@ -211,7 +211,7 @@ def test_validate_dte_tipo_dte(self) -> None: 'type': 'value_error', } - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, dte_key=dataclasses.replace( @@ -236,7 +236,7 @@ def test_validate_datetime_tz(self) -> None: 'type': 'value_error', } - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_cesion_dt=datetime(2019, 4, 5, 12, 57), @@ -258,7 +258,7 @@ def test_validate_datetime_tz(self) -> None: 'type': 'value_error', } - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_cesion_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -432,7 +432,7 @@ def test_validate_dte_tipo_dte(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, dte_key=dataclasses.replace( @@ -461,7 +461,7 @@ def test_validate_seq(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, seq=test_value, @@ -487,7 +487,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_cesion_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -513,7 +513,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_cesion_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -663,7 +663,7 @@ def test_validate_monto_cedido(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, monto_cedido=test_value, @@ -686,7 +686,7 @@ def test_validate_monto_cedido_does_not_exceed_dte_monto_total(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, monto_cedido=1000, @@ -895,7 +895,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_cesion_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -932,7 +932,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_cesion_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -979,7 +979,7 @@ def test_validate_contribuyente_razon_social(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, cedente_razon_social='', diff --git a/src/tests/test_rtc_data_models_aec.py b/src/tests/test_rtc_data_models_aec.py index a7979b42..61e2c6c2 100644 --- a/src/tests/test_rtc_data_models_aec.py +++ b/src/tests/test_rtc_data_models_aec.py @@ -4,7 +4,7 @@ import unittest from datetime import date, datetime -import pydantic +import pydantic.v1 from cl_sii.dte.constants import TipoDte from cl_sii.dte.data_models import DteDataL1, DteNaturalKey, DteXmlData @@ -464,7 +464,7 @@ def test_validate_dte_tipo_dte(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, dte=dataclasses.replace( @@ -493,7 +493,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_firma_dt=datetime(2019, 4, 5, 12, 57, 32), @@ -519,7 +519,7 @@ def test_validate_datetime_tz(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, fecha_firma_dt=tz_utils.convert_naive_dt_to_tz_aware( @@ -546,7 +546,7 @@ def test_validate_cesiones_min_items(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, cesiones=[], @@ -570,7 +570,7 @@ def test_validate_cesiones_seq_order(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, cesiones=list(reversed(obj.cesiones)), @@ -639,7 +639,7 @@ def test_validate_dte_matches_cesiones_dtes(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, cesiones=[ @@ -677,7 +677,7 @@ def test_validate_last_cesion_matches_some_fields(self) -> None: }, ] - with self.assertRaises(pydantic.ValidationError) as assert_raises_cm: + with self.assertRaises(pydantic.v1.ValidationError) as assert_raises_cm: dataclasses.replace( obj, cedente_rut=obj.cesionario_rut, From 2c8189f944d26e7059bd760e214f532bc0c71c49 Mon Sep 17 00:00:00 2001 From: Samuel Villegas Date: Thu, 14 Sep 2023 17:03:36 -0300 Subject: [PATCH 11/12] chore: Update history for new version --- HISTORY.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/HISTORY.md b/HISTORY.md index e58ca321..a45478d7 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,14 @@ # History +## 0.23.3 (2023-09-14) + +- (PR #530, 2023-09-05) chore: Bump the development-dependencies group with 9 updates +- (PR #536, 2023-09-05) chore(deps): Update `typing-extensions` from 4.3.0 to 4.7.1 +- (PR #538, 2023-09-06) Fix errors reported by EditorConfig-Checker +- (PR #537, 2023-09-06) Change Python project structure from Flat layout to Src layout +- (PR #539, 2023-09-07) Add Codecov repository upload token; update Codecov status badge +- (PR #540, 2023-09-14) Update pydantic from 1.10.12 to 2.3.0 + ## 0.23.2 (2023-09-05) - (PR #522, 2023-08-07) Enable Editor Configuration validation in Super-Linter From a6839aca10f746e1d2133953cbf9affb8d8ddb09 Mon Sep 17 00:00:00 2001 From: Samuel Villegas Date: Thu, 14 Sep 2023 17:03:47 -0300 Subject: [PATCH 12/12] chore: Bump version from 0.23.2 to 0.23.3 --- .bumpversion.cfg | 2 +- src/cl_sii/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index ccc865c7..72c30bb4 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.23.2 +current_version = 0.23.3 commit = True tag = False message = chore: Bump version from {current_version} to {new_version} diff --git a/src/cl_sii/__init__.py b/src/cl_sii/__init__.py index b50016a8..b2fdefc5 100644 --- a/src/cl_sii/__init__.py +++ b/src/cl_sii/__init__.py @@ -5,4 +5,4 @@ """ -__version__ = '0.23.2' +__version__ = '0.23.3'