anncsu-sdk 0.0.1.dev21__tar.gz → 0.0.1.dev28__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- anncsu_sdk-0.0.1.dev28/.env.example +34 -0
- anncsu_sdk-0.0.1.dev21/README.md → anncsu_sdk-0.0.1.dev28/PKG-INFO +275 -10
- anncsu_sdk-0.0.1.dev21/PKG-INFO → anncsu_sdk-0.0.1.dev28/README.md +261 -23
- anncsu_sdk-0.0.1.dev28/docs/SECURITY.md +1069 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/pyproject.toml +8 -7
- anncsu_sdk-0.0.1.dev28/scripts/create_client_assertion.py +395 -0
- anncsu_sdk-0.0.1.dev28/src/anncsu/common/__init__.py +55 -0
- anncsu_sdk-0.0.1.dev28/src/anncsu/common/auth.py +401 -0
- anncsu_sdk-0.0.1.dev28/src/anncsu/common/config.py +151 -0
- {anncsu_sdk-0.0.1.dev21/src/anncsu/pa/_hooks → anncsu_sdk-0.0.1.dev28/src/anncsu/common/hooks}/__init__.py +9 -0
- anncsu_sdk-0.0.1.dev28/src/anncsu/common/hooks/token_validation.py +247 -0
- anncsu_sdk-0.0.1.dev28/src/anncsu/common/pdnd_assertion.py +322 -0
- anncsu_sdk-0.0.1.dev28/src/anncsu/common/pdnd_token.py +505 -0
- anncsu_sdk-0.0.1.dev28/src/anncsu/common/security.py +184 -0
- anncsu_sdk-0.0.1.dev28/tests/common/test_cli_env_override.py +389 -0
- anncsu_sdk-0.0.1.dev28/tests/common/test_pdnd_assertion.py +914 -0
- anncsu_sdk-0.0.1.dev28/tests/common/test_pdnd_auth_manager.py +820 -0
- anncsu_sdk-0.0.1.dev28/tests/common/test_pdnd_token.py +812 -0
- anncsu_sdk-0.0.1.dev28/tests/common/test_security.py +203 -0
- anncsu_sdk-0.0.1.dev28/tests/common/test_token_validation_hook.py +456 -0
- anncsu_sdk-0.0.1.dev28/uv.lock +1063 -0
- anncsu_sdk-0.0.1.dev21/docs/SECURITY.md +0 -535
- anncsu_sdk-0.0.1.dev21/scripts/create_client_assertion.py +0 -371
- anncsu_sdk-0.0.1.dev21/src/anncsu/common/__init__.py +0 -17
- anncsu_sdk-0.0.1.dev21/src/anncsu/common/security.py +0 -41
- anncsu_sdk-0.0.1.dev21/tests/common/test_security.py +0 -292
- anncsu_sdk-0.0.1.dev21/uv.lock +0 -984
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.devcontainer/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.devcontainer/devcontainer.json +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.devcontainer/setup.sh +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.gitattributes +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.github/workflows/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.github/workflows/ci.yml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.github/workflows/publish.yml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.gitignore +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.pre-commit-config.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.python-version +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.speakeasy/gen.lock +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.speakeasy/gen.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.speakeasy/out.openapi.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.speakeasy/workflow.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/.vscode/settings.json +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/CONTRIBUTING.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/LICENSE +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/USAGE.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/VALIDATION.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/errors/serviceunavailableerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessipostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessipostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessipostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiprogpostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiprogpostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiprogpostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimipostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimipostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimipostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiprogpostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiprogpostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiprogpostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessopostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessopostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimopostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimopostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccpostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccpostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccpostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareapostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareapostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareapostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/showstatusresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/models/utils/retryconfig.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/sdks/anncsu/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/sdks/jsonpost/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/sdks/pathparam/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/sdks/queryparam/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/docs/sdks/status/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/oas/.spectral.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/oas/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/oas/dev/Specifica API - ANNCSU /342/200/223 Consultazione per le PA.yaml" +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/pylintrc +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/scripts/publish.sh +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/basesdk.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/apierror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/base.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/no_response_error.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/responsevalidationerror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/hooks/registration.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/hooks/sdkhooks.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/hooks/types.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/httpclient.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/sdkconfiguration.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/types/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/types/basemodel.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/annotations.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/datetimes.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/enums.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/eventstreaming.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/forms.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/headers.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/logger.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/metadata.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/queryparams.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/requestbodies.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/retries.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/security.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/serializers.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/unmarshal_json_response.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/url.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/values.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/examples.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/response_validator.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/validators.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21/src/anncsu/common/hooks → anncsu_sdk-0.0.1.dev28/src/anncsu/pa/_hooks}/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_hooks/registration.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_hooks/sdkhooks.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_hooks/types.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_version.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/basesdk.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/anncsuerror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/apierror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteaccessogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteaccessogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteaccessopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteodonimogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteodonimogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteodonimopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/no_response_error.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazaccgetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazaccgetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazaccpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazareagetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazareagetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazareapostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/responsevalidationerror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/show_statusop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/httpclient.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/jsonpost.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteaccessogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteaccessogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteaccessopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteodonimogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteodonimogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteodonimopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazaccgetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazaccgetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazaccpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazareagetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazareagetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazareapostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/show_statusop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/pathparam.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/py.typed +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/queryparam.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/sdk.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/sdkconfiguration.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/status.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/types/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/types/basemodel.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/annotations.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/datetimes.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/enums.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/eventstreaming.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/forms.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/headers.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/logger.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/metadata.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/queryparams.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/requestbodies.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/retries.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/security.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/serializers.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/unmarshal_json_response.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/url.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/values.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/common/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/common/test_imports.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/common/test_security_basemodel.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/conftest.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/integration/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/integration/test_sdk_instantiation.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/integration/test_security_in_requests.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/pa/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/pa/test_imports.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/ADVANCED_TESTING.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/README_COMPREHENSIVE_TESTS.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_all_operations_validation.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_model_factories.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_model_factories_comprehensive.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_response_validator.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_validators.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_validators_property.py +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# PDND Client Assertion Configuration
|
|
2
|
+
# Copy this file to .env and fill in your actual values
|
|
3
|
+
# All variables are prefixed with PDND_
|
|
4
|
+
|
|
5
|
+
# Required: Key ID (kid) header parameter - identifies which key was used
|
|
6
|
+
PDND_KID=your-key-id
|
|
7
|
+
|
|
8
|
+
# Required: Issuer (iss) claim - typically your client_id from PDND
|
|
9
|
+
PDND_ISSUER=your-client-id
|
|
10
|
+
|
|
11
|
+
# Required: Subject (sub) claim - typically your client_id from PDND
|
|
12
|
+
PDND_SUBJECT=your-client-id
|
|
13
|
+
|
|
14
|
+
# Required: Audience (aud) claim - the PDND token endpoint URL
|
|
15
|
+
PDND_AUDIENCE=https://auth.interop.pagopa.it/token.oauth2
|
|
16
|
+
|
|
17
|
+
# Required: Purpose ID for the PDND request
|
|
18
|
+
PDND_PURPOSE_ID=your-purpose-id
|
|
19
|
+
|
|
20
|
+
# Required (one of the following):
|
|
21
|
+
# Option 1: Path to the RSA private key file (PEM format)
|
|
22
|
+
PDND_KEY_PATH=./private_key.pem
|
|
23
|
+
|
|
24
|
+
# Option 2: RSA private key content in PEM format (alternative to PDND_KEY_PATH)
|
|
25
|
+
# PDND_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----
|
|
26
|
+
|
|
27
|
+
# Optional: Algorithm for signing the JWT (default: RS256)
|
|
28
|
+
# PDND_ALG=RS256
|
|
29
|
+
|
|
30
|
+
# Optional: Token type (default: JWT)
|
|
31
|
+
# PDND_TYP=JWT
|
|
32
|
+
|
|
33
|
+
# Optional: JWT validity period in minutes (default: 43200 = 30 days, max: 43200)
|
|
34
|
+
# PDND_VALIDITY_MINUTES=43200
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: anncsu-sdk
|
|
3
|
+
Version: 0.0.1.dev28
|
|
4
|
+
Summary: ANNCSU Software Development Kit for API consumption
|
|
5
|
+
Author-email: Francesco Bartoli <francesco.bartoli@geobeyond.it>
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Requires-Python: >=3.12
|
|
8
|
+
Requires-Dist: authlib>=1.3.0
|
|
9
|
+
Requires-Dist: httpcore>=1.0.9
|
|
10
|
+
Requires-Dist: httpx>=0.28.1
|
|
11
|
+
Requires-Dist: pydantic-settings>=2.12.0
|
|
12
|
+
Requires-Dist: pydantic>=2.12.5
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
|
|
1
15
|
# anncsu-sdk
|
|
2
16
|
ANNCSU Software Development Kit for API consumption
|
|
3
17
|
|
|
@@ -159,38 +173,176 @@ asyncio.run(main())
|
|
|
159
173
|
|
|
160
174
|
All ANNCSU APIs use PDND (Piattaforma Digitale Nazionale Dati) voucher-based authentication with HTTP Bearer tokens.
|
|
161
175
|
|
|
162
|
-
###
|
|
176
|
+
### Complete Authentication Flow
|
|
177
|
+
|
|
178
|
+
The SDK supports the complete PDND authentication flow:
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
|
|
182
|
+
│ 1. Create Client │ │ 2. Exchange for │ │ 3. Use Access │
|
|
183
|
+
│ Assertion │────▶│ Access Token │────▶│ Token │
|
|
184
|
+
│ (JWT) │ │ (OAuth2) │ │ (API Calls) │
|
|
185
|
+
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
|
|
186
|
+
```
|
|
163
187
|
|
|
164
188
|
```python
|
|
189
|
+
from pathlib import Path
|
|
165
190
|
from anncsu.pa import Anncsu
|
|
166
|
-
from anncsu.common import
|
|
191
|
+
from anncsu.common import (
|
|
192
|
+
# Step 1: Client Assertion
|
|
193
|
+
ClientAssertionConfig,
|
|
194
|
+
create_client_assertion,
|
|
195
|
+
# Step 2: Token Exchange
|
|
196
|
+
TokenConfig,
|
|
197
|
+
get_access_token,
|
|
198
|
+
# Step 3: API Authentication
|
|
199
|
+
Security,
|
|
200
|
+
)
|
|
167
201
|
|
|
168
|
-
#
|
|
169
|
-
|
|
202
|
+
# Step 1: Create client assertion (JWT)
|
|
203
|
+
assertion_config = ClientAssertionConfig(
|
|
204
|
+
kid="your-key-id",
|
|
205
|
+
issuer="your-client-id",
|
|
206
|
+
subject="your-client-id",
|
|
207
|
+
audience="auth.uat.interop.pagopa.it/client-assertion",
|
|
208
|
+
purpose_id="your-purpose-id",
|
|
209
|
+
key_path=Path("./private_key.pem"),
|
|
210
|
+
)
|
|
211
|
+
client_assertion = create_client_assertion(assertion_config)
|
|
170
212
|
|
|
171
|
-
#
|
|
213
|
+
# Step 2: Exchange for access token
|
|
214
|
+
token_config = TokenConfig(
|
|
215
|
+
client_id="your-client-id",
|
|
216
|
+
client_assertion=client_assertion,
|
|
217
|
+
token_endpoint="https://auth.uat.interop.pagopa.it/token.oauth2",
|
|
218
|
+
)
|
|
219
|
+
token_response = get_access_token(token_config)
|
|
220
|
+
|
|
221
|
+
# Step 3: Use access token for API calls
|
|
222
|
+
security = Security(bearer=token_response.access_token)
|
|
172
223
|
sdk = Anncsu(security=security)
|
|
173
224
|
|
|
174
|
-
# Make authenticated requests
|
|
175
225
|
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
176
226
|
codcom="H501",
|
|
177
227
|
denom="VklBIFJPTUE="
|
|
178
228
|
)
|
|
179
229
|
```
|
|
180
230
|
|
|
231
|
+
### Basic Authentication (with existing token)
|
|
232
|
+
|
|
233
|
+
If you already have an access token:
|
|
234
|
+
|
|
235
|
+
```python
|
|
236
|
+
from anncsu.pa import Anncsu
|
|
237
|
+
from anncsu.common import Security
|
|
238
|
+
|
|
239
|
+
security = Security(bearer="your-access-token")
|
|
240
|
+
sdk = Anncsu(security=security)
|
|
241
|
+
|
|
242
|
+
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
243
|
+
codcom="H501",
|
|
244
|
+
denom="VklBIFJPTUE="
|
|
245
|
+
)
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Token Expiration Validation
|
|
249
|
+
|
|
250
|
+
The `Security` class automatically validates token expiration when initialized. If the token is expired, it raises `TokenExpiredError` instead of letting the API return a confusing 404 error:
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
from anncsu.common import Security, TokenExpiredError
|
|
254
|
+
|
|
255
|
+
try:
|
|
256
|
+
security = Security(bearer=token_response.access_token)
|
|
257
|
+
except TokenExpiredError as e:
|
|
258
|
+
print(f"Token expired at {e.expired_at}, current time: {e.current_time}")
|
|
259
|
+
# Obtain a new access token...
|
|
260
|
+
token_response = get_access_token(token_config)
|
|
261
|
+
security = Security(bearer=token_response.access_token)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
You can also check expiration manually:
|
|
265
|
+
|
|
266
|
+
```python
|
|
267
|
+
# Check if token is expired
|
|
268
|
+
if security.is_expired():
|
|
269
|
+
print("Token needs refresh!")
|
|
270
|
+
|
|
271
|
+
# Get seconds until expiration (negative if already expired)
|
|
272
|
+
ttl = security.time_until_expiration()
|
|
273
|
+
if ttl and ttl < 60:
|
|
274
|
+
print(f"Token expires in {ttl} seconds, consider refreshing")
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
To skip validation (not recommended):
|
|
278
|
+
|
|
279
|
+
```python
|
|
280
|
+
security = Security(bearer=expired_token, validate_expiration=False)
|
|
281
|
+
```
|
|
282
|
+
|
|
181
283
|
### Key Features
|
|
182
284
|
|
|
183
|
-
- **
|
|
285
|
+
- **Complete Auth Flow**: Generate assertions, exchange for tokens, authenticate API calls
|
|
286
|
+
- **PDND Voucher**: Full PDND (Piattaforma Digitale Nazionale Dati) authentication support
|
|
184
287
|
- **Bearer Token**: JWT format tokens in Authorization header
|
|
185
|
-
- **
|
|
288
|
+
- **Sync & Async**: Both `get_access_token` and `get_access_token_async` available
|
|
289
|
+
- **Error Handling**: Dedicated exceptions for token errors (`TokenRequestError`, `TokenResponseError`)
|
|
186
290
|
- **Type-Safe**: Full type hints with modern Python syntax
|
|
187
291
|
|
|
292
|
+
### Loading Configuration from Environment Variables
|
|
293
|
+
|
|
294
|
+
The SDK supports loading configuration from environment variables or a `.env` file:
|
|
295
|
+
|
|
296
|
+
```python
|
|
297
|
+
from anncsu.common.config import ClientAssertionSettings
|
|
298
|
+
from anncsu.common import create_client_assertion, TokenConfig, get_access_token, Security
|
|
299
|
+
from anncsu.pa import Anncsu
|
|
300
|
+
|
|
301
|
+
# Automatically loads from environment variables or .env file
|
|
302
|
+
settings = ClientAssertionSettings()
|
|
303
|
+
client_assertion = create_client_assertion(settings.to_config())
|
|
304
|
+
|
|
305
|
+
# Exchange for access token
|
|
306
|
+
token_response = get_access_token(TokenConfig(
|
|
307
|
+
client_id=settings.issuer,
|
|
308
|
+
client_assertion=client_assertion,
|
|
309
|
+
token_endpoint="https://auth.uat.interop.pagopa.it/token.oauth2",
|
|
310
|
+
))
|
|
311
|
+
|
|
312
|
+
# Use with SDK
|
|
313
|
+
sdk = Anncsu(security=Security(bearer=token_response.access_token))
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
#### Required Environment Variables (prefix: `PDND_`)
|
|
317
|
+
|
|
318
|
+
| Variable | Description |
|
|
319
|
+
|----------|-------------|
|
|
320
|
+
| `PDND_KID` | Key ID (kid) header parameter |
|
|
321
|
+
| `PDND_ISSUER` | Issuer claim - your client_id |
|
|
322
|
+
| `PDND_SUBJECT` | Subject claim - your client_id |
|
|
323
|
+
| `PDND_AUDIENCE` | Audience claim - must end with `/client-assertion` |
|
|
324
|
+
| `PDND_PURPOSE_ID` | Purpose ID for the request |
|
|
325
|
+
| `PDND_PRIVATE_KEY` | Private key content (or use `PDND_KEY_PATH`) |
|
|
326
|
+
| `PDND_KEY_PATH` | Path to private key file (or use `PDND_PRIVATE_KEY`) |
|
|
327
|
+
|
|
328
|
+
#### Example .env file
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
PDND_KID=my-key-id
|
|
332
|
+
PDND_ISSUER=my-client-id
|
|
333
|
+
PDND_SUBJECT=my-client-id
|
|
334
|
+
PDND_AUDIENCE=auth.uat.interop.pagopa.it/client-assertion
|
|
335
|
+
PDND_PURPOSE_ID=my-purpose-id
|
|
336
|
+
PDND_KEY_PATH=./private_key.pem
|
|
337
|
+
```
|
|
338
|
+
|
|
188
339
|
### Documentation
|
|
189
340
|
|
|
190
341
|
For comprehensive security documentation including:
|
|
191
|
-
-
|
|
342
|
+
- Complete authentication flow (3 steps)
|
|
343
|
+
- Token exchange parameters and error handling
|
|
344
|
+
- Client assertion generation
|
|
192
345
|
- Token refresh strategies
|
|
193
|
-
- Error handling (401/403)
|
|
194
346
|
- Best practices and security checklist
|
|
195
347
|
- Testing with security
|
|
196
348
|
|
|
@@ -484,6 +636,119 @@ with Anncsu(
|
|
|
484
636
|
print(res)
|
|
485
637
|
|
|
486
638
|
```
|
|
639
|
+
|
|
640
|
+
### UAT Environment Configuration
|
|
641
|
+
|
|
642
|
+
When working with the UAT (User Acceptance Testing) environment, you may need to configure a different server URL and handle SSL certificate issues.
|
|
643
|
+
|
|
644
|
+
#### Basic UAT Configuration
|
|
645
|
+
|
|
646
|
+
```python
|
|
647
|
+
from anncsu.pa import Anncsu
|
|
648
|
+
from anncsu.common import Security
|
|
649
|
+
|
|
650
|
+
sdk = Anncsu(
|
|
651
|
+
security=Security(bearer_auth=token_response.access_token),
|
|
652
|
+
server_url="https://modipa-uat.agenziaentrate.gov.it/govway/rest/in/AgenziaEntrate-PDND/anncsu-consultazione/v1",
|
|
653
|
+
)
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
#### Disabling SSL Verification (UAT Only)
|
|
657
|
+
|
|
658
|
+
The UAT environment may use certificates that are not trusted by your system's certificate store. To bypass SSL verification **for testing purposes only**:
|
|
659
|
+
|
|
660
|
+
```python
|
|
661
|
+
import httpx
|
|
662
|
+
from anncsu.pa import Anncsu
|
|
663
|
+
from anncsu.common import Security
|
|
664
|
+
|
|
665
|
+
# Create HTTP client with SSL verification disabled
|
|
666
|
+
client = httpx.Client(verify=False)
|
|
667
|
+
|
|
668
|
+
sdk = Anncsu(
|
|
669
|
+
security=Security(bearer_auth=token_response.access_token),
|
|
670
|
+
server_url="https://modipa-uat.agenziaentrate.gov.it/govway/rest/in/AgenziaEntrate-PDND/anncsu-consultazione/v1",
|
|
671
|
+
client=client,
|
|
672
|
+
)
|
|
673
|
+
|
|
674
|
+
# Make API calls
|
|
675
|
+
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
676
|
+
codcom="H501",
|
|
677
|
+
denom="VklBIFJPTUE="
|
|
678
|
+
)
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
For async operations, also configure the async client:
|
|
682
|
+
|
|
683
|
+
```python
|
|
684
|
+
import httpx
|
|
685
|
+
from anncsu.pa import Anncsu
|
|
686
|
+
from anncsu.common import Security
|
|
687
|
+
|
|
688
|
+
client = httpx.Client(verify=False)
|
|
689
|
+
async_client = httpx.AsyncClient(verify=False)
|
|
690
|
+
|
|
691
|
+
sdk = Anncsu(
|
|
692
|
+
security=Security(bearer_auth=token_response.access_token),
|
|
693
|
+
server_url="https://modipa-uat.agenziaentrate.gov.it/govway/rest/in/AgenziaEntrate-PDND/anncsu-consultazione/v1",
|
|
694
|
+
client=client,
|
|
695
|
+
async_client=async_client,
|
|
696
|
+
)
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
> **Warning**: Never disable SSL verification in production! This should only be used for UAT/testing environments where the server uses self-signed or untrusted certificates.
|
|
700
|
+
|
|
701
|
+
#### Complete UAT Example
|
|
702
|
+
|
|
703
|
+
Here's a complete example for UAT environment with PDND authentication:
|
|
704
|
+
|
|
705
|
+
```python
|
|
706
|
+
import httpx
|
|
707
|
+
from pathlib import Path
|
|
708
|
+
from anncsu.pa import Anncsu
|
|
709
|
+
from anncsu.common import (
|
|
710
|
+
ClientAssertionConfig,
|
|
711
|
+
create_client_assertion,
|
|
712
|
+
TokenConfig,
|
|
713
|
+
get_access_token,
|
|
714
|
+
Security,
|
|
715
|
+
)
|
|
716
|
+
|
|
717
|
+
# Step 1: Create client assertion for UAT
|
|
718
|
+
assertion_config = ClientAssertionConfig(
|
|
719
|
+
kid="your-key-id",
|
|
720
|
+
issuer="your-client-id",
|
|
721
|
+
subject="your-client-id",
|
|
722
|
+
audience="auth.uat.interop.pagopa.it/client-assertion", # UAT audience
|
|
723
|
+
purpose_id="your-purpose-id",
|
|
724
|
+
key_path=Path("./private_key.pem"),
|
|
725
|
+
)
|
|
726
|
+
client_assertion = create_client_assertion(assertion_config)
|
|
727
|
+
|
|
728
|
+
# Step 2: Exchange for access token (UAT token endpoint)
|
|
729
|
+
token_config = TokenConfig(
|
|
730
|
+
client_id="your-client-id",
|
|
731
|
+
client_assertion=client_assertion,
|
|
732
|
+
token_endpoint="https://auth.uat.interop.pagopa.it/token.oauth2", # UAT endpoint
|
|
733
|
+
)
|
|
734
|
+
token_response = get_access_token(token_config)
|
|
735
|
+
|
|
736
|
+
# Step 3: Create SDK with UAT configuration
|
|
737
|
+
client = httpx.Client(verify=False) # Only for UAT!
|
|
738
|
+
|
|
739
|
+
sdk = Anncsu(
|
|
740
|
+
security=Security(bearer_auth=token_response.access_token),
|
|
741
|
+
server_url="https://modipa-uat.agenziaentrate.gov.it/govway/rest/in/AgenziaEntrate-PDND/anncsu-consultazione/v1",
|
|
742
|
+
client=client,
|
|
743
|
+
)
|
|
744
|
+
|
|
745
|
+
# Step 4: Make API calls
|
|
746
|
+
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
747
|
+
codcom="H501",
|
|
748
|
+
denom="VklBIFJPTUE="
|
|
749
|
+
)
|
|
750
|
+
print(response)
|
|
751
|
+
```
|
|
487
752
|
<!-- End Server Selection [server] -->
|
|
488
753
|
|
|
489
754
|
<!-- Start Custom HTTP Client [http-client] -->
|
|
@@ -1,16 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: anncsu-sdk
|
|
3
|
-
Version: 0.0.1.dev21
|
|
4
|
-
Summary: ANNCSU Software Development Kit for API consumption
|
|
5
|
-
Author-email: Francesco Bartoli <francesco.bartoli@geobeyond.it>
|
|
6
|
-
License-File: LICENSE
|
|
7
|
-
Requires-Python: >=3.12
|
|
8
|
-
Requires-Dist: authlib>=1.3.0
|
|
9
|
-
Requires-Dist: httpcore>=1.0.9
|
|
10
|
-
Requires-Dist: httpx>=0.28.1
|
|
11
|
-
Requires-Dist: pydantic>=2.11.2
|
|
12
|
-
Description-Content-Type: text/markdown
|
|
13
|
-
|
|
14
1
|
# anncsu-sdk
|
|
15
2
|
ANNCSU Software Development Kit for API consumption
|
|
16
3
|
|
|
@@ -172,38 +159,176 @@ asyncio.run(main())
|
|
|
172
159
|
|
|
173
160
|
All ANNCSU APIs use PDND (Piattaforma Digitale Nazionale Dati) voucher-based authentication with HTTP Bearer tokens.
|
|
174
161
|
|
|
175
|
-
###
|
|
162
|
+
### Complete Authentication Flow
|
|
163
|
+
|
|
164
|
+
The SDK supports the complete PDND authentication flow:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
|
|
168
|
+
│ 1. Create Client │ │ 2. Exchange for │ │ 3. Use Access │
|
|
169
|
+
│ Assertion │────▶│ Access Token │────▶│ Token │
|
|
170
|
+
│ (JWT) │ │ (OAuth2) │ │ (API Calls) │
|
|
171
|
+
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
|
|
172
|
+
```
|
|
176
173
|
|
|
177
174
|
```python
|
|
175
|
+
from pathlib import Path
|
|
178
176
|
from anncsu.pa import Anncsu
|
|
179
|
-
from anncsu.common import
|
|
177
|
+
from anncsu.common import (
|
|
178
|
+
# Step 1: Client Assertion
|
|
179
|
+
ClientAssertionConfig,
|
|
180
|
+
create_client_assertion,
|
|
181
|
+
# Step 2: Token Exchange
|
|
182
|
+
TokenConfig,
|
|
183
|
+
get_access_token,
|
|
184
|
+
# Step 3: API Authentication
|
|
185
|
+
Security,
|
|
186
|
+
)
|
|
180
187
|
|
|
181
|
-
#
|
|
182
|
-
|
|
188
|
+
# Step 1: Create client assertion (JWT)
|
|
189
|
+
assertion_config = ClientAssertionConfig(
|
|
190
|
+
kid="your-key-id",
|
|
191
|
+
issuer="your-client-id",
|
|
192
|
+
subject="your-client-id",
|
|
193
|
+
audience="auth.uat.interop.pagopa.it/client-assertion",
|
|
194
|
+
purpose_id="your-purpose-id",
|
|
195
|
+
key_path=Path("./private_key.pem"),
|
|
196
|
+
)
|
|
197
|
+
client_assertion = create_client_assertion(assertion_config)
|
|
183
198
|
|
|
184
|
-
#
|
|
199
|
+
# Step 2: Exchange for access token
|
|
200
|
+
token_config = TokenConfig(
|
|
201
|
+
client_id="your-client-id",
|
|
202
|
+
client_assertion=client_assertion,
|
|
203
|
+
token_endpoint="https://auth.uat.interop.pagopa.it/token.oauth2",
|
|
204
|
+
)
|
|
205
|
+
token_response = get_access_token(token_config)
|
|
206
|
+
|
|
207
|
+
# Step 3: Use access token for API calls
|
|
208
|
+
security = Security(bearer=token_response.access_token)
|
|
185
209
|
sdk = Anncsu(security=security)
|
|
186
210
|
|
|
187
|
-
# Make authenticated requests
|
|
188
211
|
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
189
212
|
codcom="H501",
|
|
190
213
|
denom="VklBIFJPTUE="
|
|
191
214
|
)
|
|
192
215
|
```
|
|
193
216
|
|
|
217
|
+
### Basic Authentication (with existing token)
|
|
218
|
+
|
|
219
|
+
If you already have an access token:
|
|
220
|
+
|
|
221
|
+
```python
|
|
222
|
+
from anncsu.pa import Anncsu
|
|
223
|
+
from anncsu.common import Security
|
|
224
|
+
|
|
225
|
+
security = Security(bearer="your-access-token")
|
|
226
|
+
sdk = Anncsu(security=security)
|
|
227
|
+
|
|
228
|
+
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
229
|
+
codcom="H501",
|
|
230
|
+
denom="VklBIFJPTUE="
|
|
231
|
+
)
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Token Expiration Validation
|
|
235
|
+
|
|
236
|
+
The `Security` class automatically validates token expiration when initialized. If the token is expired, it raises `TokenExpiredError` instead of letting the API return a confusing 404 error:
|
|
237
|
+
|
|
238
|
+
```python
|
|
239
|
+
from anncsu.common import Security, TokenExpiredError
|
|
240
|
+
|
|
241
|
+
try:
|
|
242
|
+
security = Security(bearer=token_response.access_token)
|
|
243
|
+
except TokenExpiredError as e:
|
|
244
|
+
print(f"Token expired at {e.expired_at}, current time: {e.current_time}")
|
|
245
|
+
# Obtain a new access token...
|
|
246
|
+
token_response = get_access_token(token_config)
|
|
247
|
+
security = Security(bearer=token_response.access_token)
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
You can also check expiration manually:
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
# Check if token is expired
|
|
254
|
+
if security.is_expired():
|
|
255
|
+
print("Token needs refresh!")
|
|
256
|
+
|
|
257
|
+
# Get seconds until expiration (negative if already expired)
|
|
258
|
+
ttl = security.time_until_expiration()
|
|
259
|
+
if ttl and ttl < 60:
|
|
260
|
+
print(f"Token expires in {ttl} seconds, consider refreshing")
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
To skip validation (not recommended):
|
|
264
|
+
|
|
265
|
+
```python
|
|
266
|
+
security = Security(bearer=expired_token, validate_expiration=False)
|
|
267
|
+
```
|
|
268
|
+
|
|
194
269
|
### Key Features
|
|
195
270
|
|
|
196
|
-
- **
|
|
271
|
+
- **Complete Auth Flow**: Generate assertions, exchange for tokens, authenticate API calls
|
|
272
|
+
- **PDND Voucher**: Full PDND (Piattaforma Digitale Nazionale Dati) authentication support
|
|
197
273
|
- **Bearer Token**: JWT format tokens in Authorization header
|
|
198
|
-
- **
|
|
274
|
+
- **Sync & Async**: Both `get_access_token` and `get_access_token_async` available
|
|
275
|
+
- **Error Handling**: Dedicated exceptions for token errors (`TokenRequestError`, `TokenResponseError`)
|
|
199
276
|
- **Type-Safe**: Full type hints with modern Python syntax
|
|
200
277
|
|
|
278
|
+
### Loading Configuration from Environment Variables
|
|
279
|
+
|
|
280
|
+
The SDK supports loading configuration from environment variables or a `.env` file:
|
|
281
|
+
|
|
282
|
+
```python
|
|
283
|
+
from anncsu.common.config import ClientAssertionSettings
|
|
284
|
+
from anncsu.common import create_client_assertion, TokenConfig, get_access_token, Security
|
|
285
|
+
from anncsu.pa import Anncsu
|
|
286
|
+
|
|
287
|
+
# Automatically loads from environment variables or .env file
|
|
288
|
+
settings = ClientAssertionSettings()
|
|
289
|
+
client_assertion = create_client_assertion(settings.to_config())
|
|
290
|
+
|
|
291
|
+
# Exchange for access token
|
|
292
|
+
token_response = get_access_token(TokenConfig(
|
|
293
|
+
client_id=settings.issuer,
|
|
294
|
+
client_assertion=client_assertion,
|
|
295
|
+
token_endpoint="https://auth.uat.interop.pagopa.it/token.oauth2",
|
|
296
|
+
))
|
|
297
|
+
|
|
298
|
+
# Use with SDK
|
|
299
|
+
sdk = Anncsu(security=Security(bearer=token_response.access_token))
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
#### Required Environment Variables (prefix: `PDND_`)
|
|
303
|
+
|
|
304
|
+
| Variable | Description |
|
|
305
|
+
|----------|-------------|
|
|
306
|
+
| `PDND_KID` | Key ID (kid) header parameter |
|
|
307
|
+
| `PDND_ISSUER` | Issuer claim - your client_id |
|
|
308
|
+
| `PDND_SUBJECT` | Subject claim - your client_id |
|
|
309
|
+
| `PDND_AUDIENCE` | Audience claim - must end with `/client-assertion` |
|
|
310
|
+
| `PDND_PURPOSE_ID` | Purpose ID for the request |
|
|
311
|
+
| `PDND_PRIVATE_KEY` | Private key content (or use `PDND_KEY_PATH`) |
|
|
312
|
+
| `PDND_KEY_PATH` | Path to private key file (or use `PDND_PRIVATE_KEY`) |
|
|
313
|
+
|
|
314
|
+
#### Example .env file
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
PDND_KID=my-key-id
|
|
318
|
+
PDND_ISSUER=my-client-id
|
|
319
|
+
PDND_SUBJECT=my-client-id
|
|
320
|
+
PDND_AUDIENCE=auth.uat.interop.pagopa.it/client-assertion
|
|
321
|
+
PDND_PURPOSE_ID=my-purpose-id
|
|
322
|
+
PDND_KEY_PATH=./private_key.pem
|
|
323
|
+
```
|
|
324
|
+
|
|
201
325
|
### Documentation
|
|
202
326
|
|
|
203
327
|
For comprehensive security documentation including:
|
|
204
|
-
-
|
|
328
|
+
- Complete authentication flow (3 steps)
|
|
329
|
+
- Token exchange parameters and error handling
|
|
330
|
+
- Client assertion generation
|
|
205
331
|
- Token refresh strategies
|
|
206
|
-
- Error handling (401/403)
|
|
207
332
|
- Best practices and security checklist
|
|
208
333
|
- Testing with security
|
|
209
334
|
|
|
@@ -497,6 +622,119 @@ with Anncsu(
|
|
|
497
622
|
print(res)
|
|
498
623
|
|
|
499
624
|
```
|
|
625
|
+
|
|
626
|
+
### UAT Environment Configuration
|
|
627
|
+
|
|
628
|
+
When working with the UAT (User Acceptance Testing) environment, you may need to configure a different server URL and handle SSL certificate issues.
|
|
629
|
+
|
|
630
|
+
#### Basic UAT Configuration
|
|
631
|
+
|
|
632
|
+
```python
|
|
633
|
+
from anncsu.pa import Anncsu
|
|
634
|
+
from anncsu.common import Security
|
|
635
|
+
|
|
636
|
+
sdk = Anncsu(
|
|
637
|
+
security=Security(bearer_auth=token_response.access_token),
|
|
638
|
+
server_url="https://modipa-uat.agenziaentrate.gov.it/govway/rest/in/AgenziaEntrate-PDND/anncsu-consultazione/v1",
|
|
639
|
+
)
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
#### Disabling SSL Verification (UAT Only)
|
|
643
|
+
|
|
644
|
+
The UAT environment may use certificates that are not trusted by your system's certificate store. To bypass SSL verification **for testing purposes only**:
|
|
645
|
+
|
|
646
|
+
```python
|
|
647
|
+
import httpx
|
|
648
|
+
from anncsu.pa import Anncsu
|
|
649
|
+
from anncsu.common import Security
|
|
650
|
+
|
|
651
|
+
# Create HTTP client with SSL verification disabled
|
|
652
|
+
client = httpx.Client(verify=False)
|
|
653
|
+
|
|
654
|
+
sdk = Anncsu(
|
|
655
|
+
security=Security(bearer_auth=token_response.access_token),
|
|
656
|
+
server_url="https://modipa-uat.agenziaentrate.gov.it/govway/rest/in/AgenziaEntrate-PDND/anncsu-consultazione/v1",
|
|
657
|
+
client=client,
|
|
658
|
+
)
|
|
659
|
+
|
|
660
|
+
# Make API calls
|
|
661
|
+
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
662
|
+
codcom="H501",
|
|
663
|
+
denom="VklBIFJPTUE="
|
|
664
|
+
)
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
For async operations, also configure the async client:
|
|
668
|
+
|
|
669
|
+
```python
|
|
670
|
+
import httpx
|
|
671
|
+
from anncsu.pa import Anncsu
|
|
672
|
+
from anncsu.common import Security
|
|
673
|
+
|
|
674
|
+
client = httpx.Client(verify=False)
|
|
675
|
+
async_client = httpx.AsyncClient(verify=False)
|
|
676
|
+
|
|
677
|
+
sdk = Anncsu(
|
|
678
|
+
security=Security(bearer_auth=token_response.access_token),
|
|
679
|
+
server_url="https://modipa-uat.agenziaentrate.gov.it/govway/rest/in/AgenziaEntrate-PDND/anncsu-consultazione/v1",
|
|
680
|
+
client=client,
|
|
681
|
+
async_client=async_client,
|
|
682
|
+
)
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
> **Warning**: Never disable SSL verification in production! This should only be used for UAT/testing environments where the server uses self-signed or untrusted certificates.
|
|
686
|
+
|
|
687
|
+
#### Complete UAT Example
|
|
688
|
+
|
|
689
|
+
Here's a complete example for UAT environment with PDND authentication:
|
|
690
|
+
|
|
691
|
+
```python
|
|
692
|
+
import httpx
|
|
693
|
+
from pathlib import Path
|
|
694
|
+
from anncsu.pa import Anncsu
|
|
695
|
+
from anncsu.common import (
|
|
696
|
+
ClientAssertionConfig,
|
|
697
|
+
create_client_assertion,
|
|
698
|
+
TokenConfig,
|
|
699
|
+
get_access_token,
|
|
700
|
+
Security,
|
|
701
|
+
)
|
|
702
|
+
|
|
703
|
+
# Step 1: Create client assertion for UAT
|
|
704
|
+
assertion_config = ClientAssertionConfig(
|
|
705
|
+
kid="your-key-id",
|
|
706
|
+
issuer="your-client-id",
|
|
707
|
+
subject="your-client-id",
|
|
708
|
+
audience="auth.uat.interop.pagopa.it/client-assertion", # UAT audience
|
|
709
|
+
purpose_id="your-purpose-id",
|
|
710
|
+
key_path=Path("./private_key.pem"),
|
|
711
|
+
)
|
|
712
|
+
client_assertion = create_client_assertion(assertion_config)
|
|
713
|
+
|
|
714
|
+
# Step 2: Exchange for access token (UAT token endpoint)
|
|
715
|
+
token_config = TokenConfig(
|
|
716
|
+
client_id="your-client-id",
|
|
717
|
+
client_assertion=client_assertion,
|
|
718
|
+
token_endpoint="https://auth.uat.interop.pagopa.it/token.oauth2", # UAT endpoint
|
|
719
|
+
)
|
|
720
|
+
token_response = get_access_token(token_config)
|
|
721
|
+
|
|
722
|
+
# Step 3: Create SDK with UAT configuration
|
|
723
|
+
client = httpx.Client(verify=False) # Only for UAT!
|
|
724
|
+
|
|
725
|
+
sdk = Anncsu(
|
|
726
|
+
security=Security(bearer_auth=token_response.access_token),
|
|
727
|
+
server_url="https://modipa-uat.agenziaentrate.gov.it/govway/rest/in/AgenziaEntrate-PDND/anncsu-consultazione/v1",
|
|
728
|
+
client=client,
|
|
729
|
+
)
|
|
730
|
+
|
|
731
|
+
# Step 4: Make API calls
|
|
732
|
+
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
733
|
+
codcom="H501",
|
|
734
|
+
denom="VklBIFJPTUE="
|
|
735
|
+
)
|
|
736
|
+
print(response)
|
|
737
|
+
```
|
|
500
738
|
<!-- End Server Selection [server] -->
|
|
501
739
|
|
|
502
740
|
<!-- Start Custom HTTP Client [http-client] -->
|