anncsu-sdk 0.0.1.dev24__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.dev24 → anncsu_sdk-0.0.1.dev28}/PKG-INFO +220 -49
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/README.md +219 -48
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/SECURITY.md +384 -37
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/scripts/create_client_assertion.py +2 -2
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/__init__.py +24 -1
- anncsu_sdk-0.0.1.dev28/src/anncsu/common/auth.py +401 -0
- {anncsu_sdk-0.0.1.dev24/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.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/pdnd_assertion.py +2 -2
- 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.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/test_cli_env_override.py +28 -6
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/test_pdnd_assertion.py +151 -76
- 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.dev24 → anncsu_sdk-0.0.1.dev28}/uv.lock +131 -141
- anncsu_sdk-0.0.1.dev24/src/anncsu/common/security.py +0 -41
- anncsu_sdk-0.0.1.dev24/tests/common/test_security.py +0 -292
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.devcontainer/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.devcontainer/devcontainer.json +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.devcontainer/setup.sh +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.env.example +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.gitattributes +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.github/workflows/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.github/workflows/ci.yml +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.github/workflows/publish.yml +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.gitignore +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.pre-commit-config.yaml +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.python-version +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.speakeasy/gen.lock +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.speakeasy/gen.yaml +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.speakeasy/out.openapi.yaml +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.speakeasy/workflow.yaml +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.vscode/settings.json +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/CONTRIBUTING.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/LICENSE +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/USAGE.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/VALIDATION.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/serviceunavailableerror.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessipostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessipostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessipostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiprogpostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiprogpostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiprogpostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimipostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimipostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimipostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiprogpostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiprogpostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiprogpostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessopostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessopostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimopostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimopostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccpostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccpostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccpostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareapostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareapostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareapostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/showstatusresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/utils/retryconfig.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/anncsu/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/jsonpost/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/pathparam/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/queryparam/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/status/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/oas/.spectral.yaml +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/oas/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → 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.dev24 → anncsu_sdk-0.0.1.dev28}/pylintrc +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/pyproject.toml +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/scripts/publish.sh +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/basesdk.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/config.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/apierror.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/base.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/no_response_error.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/responsevalidationerror.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/hooks/registration.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/hooks/sdkhooks.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/hooks/types.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/httpclient.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/sdkconfiguration.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/types/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/types/basemodel.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/annotations.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/datetimes.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/enums.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/eventstreaming.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/forms.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/headers.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/logger.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/metadata.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/queryparams.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/requestbodies.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/retries.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/security.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/serializers.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/unmarshal_json_response.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/url.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/values.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/examples.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/response_validator.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/validators.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24/src/anncsu/common/hooks → anncsu_sdk-0.0.1.dev28/src/anncsu/pa/_hooks}/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_hooks/registration.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_hooks/sdkhooks.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_hooks/types.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_version.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/basesdk.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/anncsuerror.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/apierror.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteaccessogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteaccessogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteaccessopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteodonimogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteodonimogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteodonimopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/no_response_error.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazaccgetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazaccgetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazaccpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazareagetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazareagetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazareapostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/responsevalidationerror.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/show_statusop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/httpclient.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/jsonpost.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteaccessogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteaccessogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteaccessopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteodonimogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteodonimogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteodonimopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazaccgetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazaccgetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazaccpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazareagetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazareagetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazareapostop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/show_statusop.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/pathparam.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/py.typed +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/queryparam.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/sdk.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/sdkconfiguration.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/status.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/types/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/types/basemodel.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/annotations.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/datetimes.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/enums.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/eventstreaming.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/forms.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/headers.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/logger.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/metadata.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/queryparams.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/requestbodies.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/retries.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/security.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/serializers.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/unmarshal_json_response.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/url.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/values.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/test_imports.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/test_security_basemodel.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/conftest.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/integration/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/integration/test_sdk_instantiation.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/integration/test_security_in_requests.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/pa/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/pa/test_imports.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/ADVANCED_TESTING.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/README.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/README_COMPREHENSIVE_TESTS.md +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_all_operations_validation.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_model_factories.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_model_factories_comprehensive.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_response_validator.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_validators.py +0 -0
- {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_validators_property.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: anncsu-sdk
|
|
3
|
-
Version: 0.0.1.
|
|
3
|
+
Version: 0.0.1.dev28
|
|
4
4
|
Summary: ANNCSU Software Development Kit for API consumption
|
|
5
5
|
Author-email: Francesco Bartoli <francesco.bartoli@geobeyond.it>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -173,86 +173,144 @@ asyncio.run(main())
|
|
|
173
173
|
|
|
174
174
|
All ANNCSU APIs use PDND (Piattaforma Digitale Nazionale Dati) voucher-based authentication with HTTP Bearer tokens.
|
|
175
175
|
|
|
176
|
-
###
|
|
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
|
+
```
|
|
177
187
|
|
|
178
188
|
```python
|
|
189
|
+
from pathlib import Path
|
|
179
190
|
from anncsu.pa import Anncsu
|
|
180
|
-
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
|
+
)
|
|
201
|
+
|
|
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)
|
|
181
212
|
|
|
182
|
-
#
|
|
183
|
-
|
|
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)
|
|
184
220
|
|
|
185
|
-
#
|
|
221
|
+
# Step 3: Use access token for API calls
|
|
222
|
+
security = Security(bearer=token_response.access_token)
|
|
186
223
|
sdk = Anncsu(security=security)
|
|
187
224
|
|
|
188
|
-
# Make authenticated requests
|
|
189
225
|
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
190
226
|
codcom="H501",
|
|
191
227
|
denom="VklBIFJPTUE="
|
|
192
228
|
)
|
|
193
229
|
```
|
|
194
230
|
|
|
195
|
-
###
|
|
231
|
+
### Basic Authentication (with existing token)
|
|
196
232
|
|
|
197
|
-
|
|
198
|
-
- **Bearer Token**: JWT format tokens in Authorization header
|
|
199
|
-
- **Common Security**: Same `Security` class works across all ANNCSU APIs
|
|
200
|
-
- **Type-Safe**: Full type hints with modern Python syntax
|
|
201
|
-
|
|
202
|
-
### Generating Client Assertions Programmatically
|
|
203
|
-
|
|
204
|
-
The SDK includes a built-in module for generating PDND client assertions (JWT tokens) at runtime:
|
|
233
|
+
If you already have an access token:
|
|
205
234
|
|
|
206
235
|
```python
|
|
207
|
-
from anncsu.
|
|
236
|
+
from anncsu.pa import Anncsu
|
|
237
|
+
from anncsu.common import Security
|
|
208
238
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
purpose_id="your-purpose-id",
|
|
216
|
-
private_key=b"-----BEGIN RSA PRIVATE KEY-----\n...",
|
|
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="
|
|
217
245
|
)
|
|
218
|
-
|
|
246
|
+
```
|
|
219
247
|
|
|
220
|
-
|
|
221
|
-
from pathlib import Path
|
|
248
|
+
### Token Expiration Validation
|
|
222
249
|
|
|
223
|
-
|
|
224
|
-
kid="your-key-id",
|
|
225
|
-
issuer="your-client-id",
|
|
226
|
-
subject="your-client-id",
|
|
227
|
-
audience="https://auth.interop.pagopa.it/token.oauth2",
|
|
228
|
-
purpose_id="your-purpose-id",
|
|
229
|
-
key_path=Path("./private_key.pem"),
|
|
230
|
-
)
|
|
231
|
-
token = create_client_assertion(config)
|
|
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:
|
|
232
251
|
|
|
233
|
-
|
|
234
|
-
from anncsu.common import Security
|
|
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
|
+
```
|
|
235
263
|
|
|
236
|
-
|
|
237
|
-
|
|
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")
|
|
238
275
|
```
|
|
239
276
|
|
|
277
|
+
To skip validation (not recommended):
|
|
278
|
+
|
|
279
|
+
```python
|
|
280
|
+
security = Security(bearer=expired_token, validate_expiration=False)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Key Features
|
|
284
|
+
|
|
285
|
+
- **Complete Auth Flow**: Generate assertions, exchange for tokens, authenticate API calls
|
|
286
|
+
- **PDND Voucher**: Full PDND (Piattaforma Digitale Nazionale Dati) authentication support
|
|
287
|
+
- **Bearer Token**: JWT format tokens in Authorization header
|
|
288
|
+
- **Sync & Async**: Both `get_access_token` and `get_access_token_async` available
|
|
289
|
+
- **Error Handling**: Dedicated exceptions for token errors (`TokenRequestError`, `TokenResponseError`)
|
|
290
|
+
- **Type-Safe**: Full type hints with modern Python syntax
|
|
291
|
+
|
|
240
292
|
### Loading Configuration from Environment Variables
|
|
241
293
|
|
|
242
294
|
The SDK supports loading configuration from environment variables or a `.env` file:
|
|
243
295
|
|
|
244
296
|
```python
|
|
245
297
|
from anncsu.common.config import ClientAssertionSettings
|
|
246
|
-
from anncsu.common import create_client_assertion, Security
|
|
298
|
+
from anncsu.common import create_client_assertion, TokenConfig, get_access_token, Security
|
|
247
299
|
from anncsu.pa import Anncsu
|
|
248
300
|
|
|
249
301
|
# Automatically loads from environment variables or .env file
|
|
250
302
|
settings = ClientAssertionSettings()
|
|
251
|
-
|
|
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
|
+
))
|
|
252
311
|
|
|
253
312
|
# Use with SDK
|
|
254
|
-
|
|
255
|
-
sdk = Anncsu(security=security)
|
|
313
|
+
sdk = Anncsu(security=Security(bearer=token_response.access_token))
|
|
256
314
|
```
|
|
257
315
|
|
|
258
316
|
#### Required Environment Variables (prefix: `PDND_`)
|
|
@@ -262,7 +320,7 @@ sdk = Anncsu(security=security)
|
|
|
262
320
|
| `PDND_KID` | Key ID (kid) header parameter |
|
|
263
321
|
| `PDND_ISSUER` | Issuer claim - your client_id |
|
|
264
322
|
| `PDND_SUBJECT` | Subject claim - your client_id |
|
|
265
|
-
| `PDND_AUDIENCE` | Audience claim -
|
|
323
|
+
| `PDND_AUDIENCE` | Audience claim - must end with `/client-assertion` |
|
|
266
324
|
| `PDND_PURPOSE_ID` | Purpose ID for the request |
|
|
267
325
|
| `PDND_PRIVATE_KEY` | Private key content (or use `PDND_KEY_PATH`) |
|
|
268
326
|
| `PDND_KEY_PATH` | Path to private key file (or use `PDND_PRIVATE_KEY`) |
|
|
@@ -273,7 +331,7 @@ sdk = Anncsu(security=security)
|
|
|
273
331
|
PDND_KID=my-key-id
|
|
274
332
|
PDND_ISSUER=my-client-id
|
|
275
333
|
PDND_SUBJECT=my-client-id
|
|
276
|
-
PDND_AUDIENCE=
|
|
334
|
+
PDND_AUDIENCE=auth.uat.interop.pagopa.it/client-assertion
|
|
277
335
|
PDND_PURPOSE_ID=my-purpose-id
|
|
278
336
|
PDND_KEY_PATH=./private_key.pem
|
|
279
337
|
```
|
|
@@ -281,10 +339,10 @@ PDND_KEY_PATH=./private_key.pem
|
|
|
281
339
|
### Documentation
|
|
282
340
|
|
|
283
341
|
For comprehensive security documentation including:
|
|
284
|
-
-
|
|
342
|
+
- Complete authentication flow (3 steps)
|
|
343
|
+
- Token exchange parameters and error handling
|
|
285
344
|
- Client assertion generation
|
|
286
345
|
- Token refresh strategies
|
|
287
|
-
- Error handling (401/403)
|
|
288
346
|
- Best practices and security checklist
|
|
289
347
|
- Testing with security
|
|
290
348
|
|
|
@@ -578,6 +636,119 @@ with Anncsu(
|
|
|
578
636
|
print(res)
|
|
579
637
|
|
|
580
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
|
+
```
|
|
581
752
|
<!-- End Server Selection [server] -->
|
|
582
753
|
|
|
583
754
|
<!-- Start Custom HTTP Client [http-client] -->
|
|
@@ -159,86 +159,144 @@ asyncio.run(main())
|
|
|
159
159
|
|
|
160
160
|
All ANNCSU APIs use PDND (Piattaforma Digitale Nazionale Dati) voucher-based authentication with HTTP Bearer tokens.
|
|
161
161
|
|
|
162
|
-
###
|
|
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
|
+
```
|
|
163
173
|
|
|
164
174
|
```python
|
|
175
|
+
from pathlib import Path
|
|
165
176
|
from anncsu.pa import Anncsu
|
|
166
|
-
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
|
+
)
|
|
187
|
+
|
|
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)
|
|
167
198
|
|
|
168
|
-
#
|
|
169
|
-
|
|
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)
|
|
170
206
|
|
|
171
|
-
#
|
|
207
|
+
# Step 3: Use access token for API calls
|
|
208
|
+
security = Security(bearer=token_response.access_token)
|
|
172
209
|
sdk = Anncsu(security=security)
|
|
173
210
|
|
|
174
|
-
# Make authenticated requests
|
|
175
211
|
response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
176
212
|
codcom="H501",
|
|
177
213
|
denom="VklBIFJPTUE="
|
|
178
214
|
)
|
|
179
215
|
```
|
|
180
216
|
|
|
181
|
-
###
|
|
217
|
+
### Basic Authentication (with existing token)
|
|
182
218
|
|
|
183
|
-
|
|
184
|
-
- **Bearer Token**: JWT format tokens in Authorization header
|
|
185
|
-
- **Common Security**: Same `Security` class works across all ANNCSU APIs
|
|
186
|
-
- **Type-Safe**: Full type hints with modern Python syntax
|
|
187
|
-
|
|
188
|
-
### Generating Client Assertions Programmatically
|
|
189
|
-
|
|
190
|
-
The SDK includes a built-in module for generating PDND client assertions (JWT tokens) at runtime:
|
|
219
|
+
If you already have an access token:
|
|
191
220
|
|
|
192
221
|
```python
|
|
193
|
-
from anncsu.
|
|
222
|
+
from anncsu.pa import Anncsu
|
|
223
|
+
from anncsu.common import Security
|
|
194
224
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
purpose_id="your-purpose-id",
|
|
202
|
-
private_key=b"-----BEGIN RSA PRIVATE KEY-----\n...",
|
|
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="
|
|
203
231
|
)
|
|
204
|
-
|
|
232
|
+
```
|
|
205
233
|
|
|
206
|
-
|
|
207
|
-
from pathlib import Path
|
|
234
|
+
### Token Expiration Validation
|
|
208
235
|
|
|
209
|
-
|
|
210
|
-
kid="your-key-id",
|
|
211
|
-
issuer="your-client-id",
|
|
212
|
-
subject="your-client-id",
|
|
213
|
-
audience="https://auth.interop.pagopa.it/token.oauth2",
|
|
214
|
-
purpose_id="your-purpose-id",
|
|
215
|
-
key_path=Path("./private_key.pem"),
|
|
216
|
-
)
|
|
217
|
-
token = create_client_assertion(config)
|
|
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:
|
|
218
237
|
|
|
219
|
-
|
|
220
|
-
from anncsu.common import Security
|
|
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
|
+
```
|
|
221
249
|
|
|
222
|
-
|
|
223
|
-
|
|
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")
|
|
224
261
|
```
|
|
225
262
|
|
|
263
|
+
To skip validation (not recommended):
|
|
264
|
+
|
|
265
|
+
```python
|
|
266
|
+
security = Security(bearer=expired_token, validate_expiration=False)
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Key Features
|
|
270
|
+
|
|
271
|
+
- **Complete Auth Flow**: Generate assertions, exchange for tokens, authenticate API calls
|
|
272
|
+
- **PDND Voucher**: Full PDND (Piattaforma Digitale Nazionale Dati) authentication support
|
|
273
|
+
- **Bearer Token**: JWT format tokens in Authorization header
|
|
274
|
+
- **Sync & Async**: Both `get_access_token` and `get_access_token_async` available
|
|
275
|
+
- **Error Handling**: Dedicated exceptions for token errors (`TokenRequestError`, `TokenResponseError`)
|
|
276
|
+
- **Type-Safe**: Full type hints with modern Python syntax
|
|
277
|
+
|
|
226
278
|
### Loading Configuration from Environment Variables
|
|
227
279
|
|
|
228
280
|
The SDK supports loading configuration from environment variables or a `.env` file:
|
|
229
281
|
|
|
230
282
|
```python
|
|
231
283
|
from anncsu.common.config import ClientAssertionSettings
|
|
232
|
-
from anncsu.common import create_client_assertion, Security
|
|
284
|
+
from anncsu.common import create_client_assertion, TokenConfig, get_access_token, Security
|
|
233
285
|
from anncsu.pa import Anncsu
|
|
234
286
|
|
|
235
287
|
# Automatically loads from environment variables or .env file
|
|
236
288
|
settings = ClientAssertionSettings()
|
|
237
|
-
|
|
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
|
+
))
|
|
238
297
|
|
|
239
298
|
# Use with SDK
|
|
240
|
-
|
|
241
|
-
sdk = Anncsu(security=security)
|
|
299
|
+
sdk = Anncsu(security=Security(bearer=token_response.access_token))
|
|
242
300
|
```
|
|
243
301
|
|
|
244
302
|
#### Required Environment Variables (prefix: `PDND_`)
|
|
@@ -248,7 +306,7 @@ sdk = Anncsu(security=security)
|
|
|
248
306
|
| `PDND_KID` | Key ID (kid) header parameter |
|
|
249
307
|
| `PDND_ISSUER` | Issuer claim - your client_id |
|
|
250
308
|
| `PDND_SUBJECT` | Subject claim - your client_id |
|
|
251
|
-
| `PDND_AUDIENCE` | Audience claim -
|
|
309
|
+
| `PDND_AUDIENCE` | Audience claim - must end with `/client-assertion` |
|
|
252
310
|
| `PDND_PURPOSE_ID` | Purpose ID for the request |
|
|
253
311
|
| `PDND_PRIVATE_KEY` | Private key content (or use `PDND_KEY_PATH`) |
|
|
254
312
|
| `PDND_KEY_PATH` | Path to private key file (or use `PDND_PRIVATE_KEY`) |
|
|
@@ -259,7 +317,7 @@ sdk = Anncsu(security=security)
|
|
|
259
317
|
PDND_KID=my-key-id
|
|
260
318
|
PDND_ISSUER=my-client-id
|
|
261
319
|
PDND_SUBJECT=my-client-id
|
|
262
|
-
PDND_AUDIENCE=
|
|
320
|
+
PDND_AUDIENCE=auth.uat.interop.pagopa.it/client-assertion
|
|
263
321
|
PDND_PURPOSE_ID=my-purpose-id
|
|
264
322
|
PDND_KEY_PATH=./private_key.pem
|
|
265
323
|
```
|
|
@@ -267,10 +325,10 @@ PDND_KEY_PATH=./private_key.pem
|
|
|
267
325
|
### Documentation
|
|
268
326
|
|
|
269
327
|
For comprehensive security documentation including:
|
|
270
|
-
-
|
|
328
|
+
- Complete authentication flow (3 steps)
|
|
329
|
+
- Token exchange parameters and error handling
|
|
271
330
|
- Client assertion generation
|
|
272
331
|
- Token refresh strategies
|
|
273
|
-
- Error handling (401/403)
|
|
274
332
|
- Best practices and security checklist
|
|
275
333
|
- Testing with security
|
|
276
334
|
|
|
@@ -564,6 +622,119 @@ with Anncsu(
|
|
|
564
622
|
print(res)
|
|
565
623
|
|
|
566
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
|
+
```
|
|
567
738
|
<!-- End Server Selection [server] -->
|
|
568
739
|
|
|
569
740
|
<!-- Start Custom HTTP Client [http-client] -->
|