anncsu-sdk 0.0.1.dev21__tar.gz → 0.0.1.dev24__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/.env.example +34 -0
- anncsu_sdk-0.0.1.dev21/README.md → anncsu_sdk-0.0.1.dev24/PKG-INFO +94 -0
- anncsu_sdk-0.0.1.dev21/PKG-INFO → anncsu_sdk-0.0.1.dev24/README.md +80 -13
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/SECURITY.md +189 -2
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/pyproject.toml +8 -7
- anncsu_sdk-0.0.1.dev24/scripts/create_client_assertion.py +395 -0
- anncsu_sdk-0.0.1.dev24/src/anncsu/common/__init__.py +32 -0
- anncsu_sdk-0.0.1.dev24/src/anncsu/common/config.py +151 -0
- anncsu_sdk-0.0.1.dev24/src/anncsu/common/pdnd_assertion.py +322 -0
- anncsu_sdk-0.0.1.dev24/tests/common/test_cli_env_override.py +367 -0
- anncsu_sdk-0.0.1.dev24/tests/common/test_pdnd_assertion.py +839 -0
- anncsu_sdk-0.0.1.dev24/uv.lock +1073 -0
- 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/uv.lock +0 -984
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.devcontainer/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.devcontainer/devcontainer.json +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.devcontainer/setup.sh +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.gitattributes +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.github/workflows/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.github/workflows/ci.yml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.github/workflows/publish.yml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.gitignore +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.pre-commit-config.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.python-version +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.speakeasy/gen.lock +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.speakeasy/gen.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.speakeasy/out.openapi.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.speakeasy/workflow.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/.vscode/settings.json +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/CONTRIBUTING.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/LICENSE +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/USAGE.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/VALIDATION.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessigetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessipostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessipostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessipostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessipostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessipostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiproggetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiprogpostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiprogpostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiprogpostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiprogpostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoaccessiprogpostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimigetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimipostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimipostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimipostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimipostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimipostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiproggetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiprogpostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiprogpostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiprogpostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiprogpostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/elencoodonimiprogpostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessogetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessogetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessogetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessogetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessogetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessogetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessogetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessogetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessopostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessopostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessopostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteaccessopostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimogetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimogetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimogetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimogetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimogetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimogetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimogetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimogetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimopostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimopostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimopostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/esisteodonimopostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccgetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccpostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccpostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccpostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccpostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazaccpostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetpathparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetpathparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetpathparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetpathparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetpathparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetqueryparambadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetqueryparaminternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetqueryparammethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetqueryparamnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareagetqueryparamunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareapostbadrequesterror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareapostinternalservererror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareapostmethodnotallowederror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareapostnotfounderror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/prognazareapostunprocessableentityerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/errors/serviceunavailableerror.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessigetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessigetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessigetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessigetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessigetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessigetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessipostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessipostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessipostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessiproggetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessiproggetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessiproggetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessiproggetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessiproggetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessiproggetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessiprogpostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessiprogpostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoaccessiprogpostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimigetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimigetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimigetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimigetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimigetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimigetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimipostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimipostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimipostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimiproggetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimiproggetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimiproggetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimiproggetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimiproggetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimiproggetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimiprogpostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimiprogpostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/elencoodonimiprogpostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteaccessogetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteaccessogetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteaccessogetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteaccessogetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteaccessopostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteaccessopostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteodonimogetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteodonimogetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteodonimogetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteodonimogetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteodonimopostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/esisteodonimopostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazaccgetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazaccgetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazaccgetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazaccgetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazaccgetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazaccgetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazaccpostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazaccpostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazaccpostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazareagetpathparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazareagetpathparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazareagetpathparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazareagetqueryparamdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazareagetqueryparamrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazareagetqueryparamresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazareapostdata.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazareapostrequest.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/prognazareapostresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/showstatusresponse.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/models/utils/retryconfig.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/sdks/anncsu/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/sdks/jsonpost/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/sdks/pathparam/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/sdks/queryparam/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/docs/sdks/status/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/oas/.spectral.yaml +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/oas/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/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.dev24}/pylintrc +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/scripts/publish.sh +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/basesdk.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/errors/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/errors/apierror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/errors/base.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/errors/no_response_error.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/errors/responsevalidationerror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/hooks/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/hooks/registration.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/hooks/sdkhooks.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/hooks/types.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/httpclient.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/sdkconfiguration.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/security.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/types/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/types/basemodel.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/annotations.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/datetimes.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/enums.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/eventstreaming.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/forms.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/headers.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/logger.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/metadata.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/queryparams.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/requestbodies.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/retries.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/security.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/serializers.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/unmarshal_json_response.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/url.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/utils/values.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/validation/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/validation/examples.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/validation/response_validator.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/common/validation/validators.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/_hooks/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/_hooks/registration.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/_hooks/sdkhooks.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/_hooks/types.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/_version.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/basesdk.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/anncsuerror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/apierror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoaccessigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoaccessigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoaccessipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoaccessiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoaccessiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoaccessiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoodonimigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoodonimigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoodonimipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoodonimiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoodonimiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/elencoodonimiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/esisteaccessogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/esisteaccessogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/esisteaccessopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/esisteodonimogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/esisteodonimogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/esisteodonimopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/no_response_error.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/prognazaccgetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/prognazaccgetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/prognazaccpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/prognazareagetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/prognazareagetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/prognazareapostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/responsevalidationerror.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/errors/show_statusop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/httpclient.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/jsonpost.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoaccessigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoaccessigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoaccessipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoaccessiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoaccessiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoaccessiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoodonimigetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoodonimigetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoodonimipostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoodonimiproggetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoodonimiproggetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/elencoodonimiprogpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/esisteaccessogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/esisteaccessogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/esisteaccessopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/esisteodonimogetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/esisteodonimogetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/esisteodonimopostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/prognazaccgetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/prognazaccgetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/prognazaccpostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/prognazareagetpathparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/prognazareagetqueryparamop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/prognazareapostop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/models/show_statusop.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/pathparam.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/py.typed +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/queryparam.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/sdk.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/sdkconfiguration.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/status.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/types/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/types/basemodel.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/annotations.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/datetimes.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/enums.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/eventstreaming.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/forms.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/headers.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/logger.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/metadata.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/queryparams.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/requestbodies.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/retries.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/security.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/serializers.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/unmarshal_json_response.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/url.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/src/anncsu/pa/utils/values.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/common/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/common/test_imports.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/common/test_security.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/common/test_security_basemodel.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/conftest.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/integration/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/integration/test_sdk_instantiation.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/integration/test_security_in_requests.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/pa/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/pa/test_imports.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/validation/ADVANCED_TESTING.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/validation/README.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/validation/README_COMPREHENSIVE_TESTS.md +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/validation/__init__.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/validation/test_all_operations_validation.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/validation/test_model_factories.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/validation/test_model_factories_comprehensive.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/validation/test_response_validator.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/tests/validation/test_validators.py +0 -0
- {anncsu_sdk-0.0.1.dev21 → anncsu_sdk-0.0.1.dev24}/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.dev24
|
|
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
|
|
|
@@ -185,10 +199,90 @@ response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
|
185
199
|
- **Common Security**: Same `Security` class works across all ANNCSU APIs
|
|
186
200
|
- **Type-Safe**: Full type hints with modern Python syntax
|
|
187
201
|
|
|
202
|
+
### Generating Client Assertions Programmatically
|
|
203
|
+
|
|
204
|
+
The SDK includes a built-in module for generating PDND client assertions (JWT tokens) at runtime:
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
from anncsu.common import ClientAssertionConfig, create_client_assertion
|
|
208
|
+
|
|
209
|
+
# Option 1: With private key as bytes
|
|
210
|
+
config = ClientAssertionConfig(
|
|
211
|
+
kid="your-key-id",
|
|
212
|
+
issuer="your-client-id",
|
|
213
|
+
subject="your-client-id",
|
|
214
|
+
audience="https://auth.interop.pagopa.it/token.oauth2",
|
|
215
|
+
purpose_id="your-purpose-id",
|
|
216
|
+
private_key=b"-----BEGIN RSA PRIVATE KEY-----\n...",
|
|
217
|
+
)
|
|
218
|
+
token = create_client_assertion(config)
|
|
219
|
+
|
|
220
|
+
# Option 2: With private key file path
|
|
221
|
+
from pathlib import Path
|
|
222
|
+
|
|
223
|
+
config = ClientAssertionConfig(
|
|
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)
|
|
232
|
+
|
|
233
|
+
# Use the token with the SDK
|
|
234
|
+
from anncsu.common import Security
|
|
235
|
+
|
|
236
|
+
security = Security(bearer=token)
|
|
237
|
+
sdk = Anncsu(security=security)
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Loading Configuration from Environment Variables
|
|
241
|
+
|
|
242
|
+
The SDK supports loading configuration from environment variables or a `.env` file:
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
from anncsu.common.config import ClientAssertionSettings
|
|
246
|
+
from anncsu.common import create_client_assertion, Security
|
|
247
|
+
from anncsu.pa import Anncsu
|
|
248
|
+
|
|
249
|
+
# Automatically loads from environment variables or .env file
|
|
250
|
+
settings = ClientAssertionSettings()
|
|
251
|
+
token = create_client_assertion(settings.to_config())
|
|
252
|
+
|
|
253
|
+
# Use with SDK
|
|
254
|
+
security = Security(bearer=token)
|
|
255
|
+
sdk = Anncsu(security=security)
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
#### Required Environment Variables (prefix: `PDND_`)
|
|
259
|
+
|
|
260
|
+
| Variable | Description |
|
|
261
|
+
|----------|-------------|
|
|
262
|
+
| `PDND_KID` | Key ID (kid) header parameter |
|
|
263
|
+
| `PDND_ISSUER` | Issuer claim - your client_id |
|
|
264
|
+
| `PDND_SUBJECT` | Subject claim - your client_id |
|
|
265
|
+
| `PDND_AUDIENCE` | Audience claim - PDND token endpoint |
|
|
266
|
+
| `PDND_PURPOSE_ID` | Purpose ID for the request |
|
|
267
|
+
| `PDND_PRIVATE_KEY` | Private key content (or use `PDND_KEY_PATH`) |
|
|
268
|
+
| `PDND_KEY_PATH` | Path to private key file (or use `PDND_PRIVATE_KEY`) |
|
|
269
|
+
|
|
270
|
+
#### Example .env file
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
PDND_KID=my-key-id
|
|
274
|
+
PDND_ISSUER=my-client-id
|
|
275
|
+
PDND_SUBJECT=my-client-id
|
|
276
|
+
PDND_AUDIENCE=https://auth.interop.pagopa.it/token.oauth2
|
|
277
|
+
PDND_PURPOSE_ID=my-purpose-id
|
|
278
|
+
PDND_KEY_PATH=./private_key.pem
|
|
279
|
+
```
|
|
280
|
+
|
|
188
281
|
### Documentation
|
|
189
282
|
|
|
190
283
|
For comprehensive security documentation including:
|
|
191
284
|
- PDND voucher format and JWT structure
|
|
285
|
+
- Client assertion generation
|
|
192
286
|
- Token refresh strategies
|
|
193
287
|
- Error handling (401/403)
|
|
194
288
|
- Best practices and security checklist
|
|
@@ -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
|
|
|
@@ -198,10 +185,90 @@ response = sdk.queryparam.esiste_odonimo_get_query_param(
|
|
|
198
185
|
- **Common Security**: Same `Security` class works across all ANNCSU APIs
|
|
199
186
|
- **Type-Safe**: Full type hints with modern Python syntax
|
|
200
187
|
|
|
188
|
+
### Generating Client Assertions Programmatically
|
|
189
|
+
|
|
190
|
+
The SDK includes a built-in module for generating PDND client assertions (JWT tokens) at runtime:
|
|
191
|
+
|
|
192
|
+
```python
|
|
193
|
+
from anncsu.common import ClientAssertionConfig, create_client_assertion
|
|
194
|
+
|
|
195
|
+
# Option 1: With private key as bytes
|
|
196
|
+
config = ClientAssertionConfig(
|
|
197
|
+
kid="your-key-id",
|
|
198
|
+
issuer="your-client-id",
|
|
199
|
+
subject="your-client-id",
|
|
200
|
+
audience="https://auth.interop.pagopa.it/token.oauth2",
|
|
201
|
+
purpose_id="your-purpose-id",
|
|
202
|
+
private_key=b"-----BEGIN RSA PRIVATE KEY-----\n...",
|
|
203
|
+
)
|
|
204
|
+
token = create_client_assertion(config)
|
|
205
|
+
|
|
206
|
+
# Option 2: With private key file path
|
|
207
|
+
from pathlib import Path
|
|
208
|
+
|
|
209
|
+
config = ClientAssertionConfig(
|
|
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)
|
|
218
|
+
|
|
219
|
+
# Use the token with the SDK
|
|
220
|
+
from anncsu.common import Security
|
|
221
|
+
|
|
222
|
+
security = Security(bearer=token)
|
|
223
|
+
sdk = Anncsu(security=security)
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Loading Configuration from Environment Variables
|
|
227
|
+
|
|
228
|
+
The SDK supports loading configuration from environment variables or a `.env` file:
|
|
229
|
+
|
|
230
|
+
```python
|
|
231
|
+
from anncsu.common.config import ClientAssertionSettings
|
|
232
|
+
from anncsu.common import create_client_assertion, Security
|
|
233
|
+
from anncsu.pa import Anncsu
|
|
234
|
+
|
|
235
|
+
# Automatically loads from environment variables or .env file
|
|
236
|
+
settings = ClientAssertionSettings()
|
|
237
|
+
token = create_client_assertion(settings.to_config())
|
|
238
|
+
|
|
239
|
+
# Use with SDK
|
|
240
|
+
security = Security(bearer=token)
|
|
241
|
+
sdk = Anncsu(security=security)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
#### Required Environment Variables (prefix: `PDND_`)
|
|
245
|
+
|
|
246
|
+
| Variable | Description |
|
|
247
|
+
|----------|-------------|
|
|
248
|
+
| `PDND_KID` | Key ID (kid) header parameter |
|
|
249
|
+
| `PDND_ISSUER` | Issuer claim - your client_id |
|
|
250
|
+
| `PDND_SUBJECT` | Subject claim - your client_id |
|
|
251
|
+
| `PDND_AUDIENCE` | Audience claim - PDND token endpoint |
|
|
252
|
+
| `PDND_PURPOSE_ID` | Purpose ID for the request |
|
|
253
|
+
| `PDND_PRIVATE_KEY` | Private key content (or use `PDND_KEY_PATH`) |
|
|
254
|
+
| `PDND_KEY_PATH` | Path to private key file (or use `PDND_PRIVATE_KEY`) |
|
|
255
|
+
|
|
256
|
+
#### Example .env file
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
PDND_KID=my-key-id
|
|
260
|
+
PDND_ISSUER=my-client-id
|
|
261
|
+
PDND_SUBJECT=my-client-id
|
|
262
|
+
PDND_AUDIENCE=https://auth.interop.pagopa.it/token.oauth2
|
|
263
|
+
PDND_PURPOSE_ID=my-purpose-id
|
|
264
|
+
PDND_KEY_PATH=./private_key.pem
|
|
265
|
+
```
|
|
266
|
+
|
|
201
267
|
### Documentation
|
|
202
268
|
|
|
203
269
|
For comprehensive security documentation including:
|
|
204
270
|
- PDND voucher format and JWT structure
|
|
271
|
+
- Client assertion generation
|
|
205
272
|
- Token refresh strategies
|
|
206
273
|
- Error handling (401/403)
|
|
207
274
|
- Best practices and security checklist
|
|
@@ -70,6 +70,192 @@ PDND vouchers have three parts separated by dots:
|
|
|
70
70
|
2. **Payload**: Claims (issuer, subject, audience, expiration, etc.)
|
|
71
71
|
3. **Signature**: Cryptographic signature
|
|
72
72
|
|
|
73
|
+
## Generating Client Assertions
|
|
74
|
+
|
|
75
|
+
The SDK includes a built-in module for generating PDND client assertions (JWT tokens). This allows you to create the JWT needed to obtain a PDND voucher programmatically.
|
|
76
|
+
|
|
77
|
+
### Basic Usage
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
from anncsu.common import ClientAssertionConfig, create_client_assertion
|
|
81
|
+
|
|
82
|
+
# With private key as bytes
|
|
83
|
+
config = ClientAssertionConfig(
|
|
84
|
+
kid="your-key-id",
|
|
85
|
+
issuer="your-client-id",
|
|
86
|
+
subject="your-client-id",
|
|
87
|
+
audience="https://auth.interop.pagopa.it/token.oauth2",
|
|
88
|
+
purpose_id="your-purpose-id",
|
|
89
|
+
private_key=b"-----BEGIN RSA PRIVATE KEY-----\n...",
|
|
90
|
+
)
|
|
91
|
+
token = create_client_assertion(config)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### With Key File Path
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
from pathlib import Path
|
|
98
|
+
from anncsu.common import ClientAssertionConfig, create_client_assertion
|
|
99
|
+
|
|
100
|
+
config = ClientAssertionConfig(
|
|
101
|
+
kid="your-key-id",
|
|
102
|
+
issuer="your-client-id",
|
|
103
|
+
subject="your-client-id",
|
|
104
|
+
audience="https://auth.interop.pagopa.it/token.oauth2",
|
|
105
|
+
purpose_id="your-purpose-id",
|
|
106
|
+
key_path=Path("./private_key.pem"),
|
|
107
|
+
)
|
|
108
|
+
token = create_client_assertion(config)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### From Environment Variables (.env file)
|
|
112
|
+
|
|
113
|
+
The SDK supports loading configuration from environment variables or a `.env` file using `ClientAssertionSettings`:
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
from anncsu.common.config import ClientAssertionSettings
|
|
117
|
+
from anncsu.common import create_client_assertion
|
|
118
|
+
|
|
119
|
+
# Loads configuration from environment variables or .env file
|
|
120
|
+
settings = ClientAssertionSettings()
|
|
121
|
+
config = settings.to_config()
|
|
122
|
+
token = create_client_assertion(config)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### Environment Variables
|
|
126
|
+
|
|
127
|
+
All environment variables use the `PDND_` prefix:
|
|
128
|
+
|
|
129
|
+
| Environment Variable | Required | Description |
|
|
130
|
+
|---------------------|----------|-------------|
|
|
131
|
+
| `PDND_KID` | Yes | Key ID (kid) header parameter |
|
|
132
|
+
| `PDND_ISSUER` | Yes | Issuer (iss) claim - your client_id |
|
|
133
|
+
| `PDND_SUBJECT` | Yes | Subject (sub) claim - your client_id |
|
|
134
|
+
| `PDND_AUDIENCE` | Yes | Audience (aud) claim - PDND token endpoint URL |
|
|
135
|
+
| `PDND_PURPOSE_ID` | Yes | Purpose ID for the PDND request |
|
|
136
|
+
| `PDND_PRIVATE_KEY` | One required | RSA private key content in PEM format (string) |
|
|
137
|
+
| `PDND_KEY_PATH` | One required | Path to the RSA private key file |
|
|
138
|
+
| `PDND_ALG` | No | Algorithm (default: "RS256") |
|
|
139
|
+
| `PDND_TYP` | No | Token type (default: "JWT") |
|
|
140
|
+
| `PDND_VALIDITY_MINUTES` | No | JWT validity in minutes (default: 43200) |
|
|
141
|
+
|
|
142
|
+
#### Example .env File
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
# .env
|
|
146
|
+
PDND_KID=my-key-id
|
|
147
|
+
PDND_ISSUER=my-client-id
|
|
148
|
+
PDND_SUBJECT=my-client-id
|
|
149
|
+
PDND_AUDIENCE=https://auth.interop.pagopa.it/token.oauth2
|
|
150
|
+
PDND_PURPOSE_ID=my-purpose-id
|
|
151
|
+
PDND_KEY_PATH=./private_key.pem
|
|
152
|
+
# Or use PDND_PRIVATE_KEY for inline key content
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### Shell Environment Variables
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
export PDND_KID="my-key-id"
|
|
159
|
+
export PDND_ISSUER="my-client-id"
|
|
160
|
+
export PDND_SUBJECT="my-client-id"
|
|
161
|
+
export PDND_AUDIENCE="https://auth.interop.pagopa.it/token.oauth2"
|
|
162
|
+
export PDND_PURPOSE_ID="my-purpose-id"
|
|
163
|
+
export PDND_KEY_PATH="./private_key.pem"
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Then in Python:
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
from anncsu.common.config import ClientAssertionSettings
|
|
170
|
+
from anncsu.common import create_client_assertion
|
|
171
|
+
|
|
172
|
+
# Automatically loads from environment
|
|
173
|
+
settings = ClientAssertionSettings()
|
|
174
|
+
token = create_client_assertion(settings.to_config())
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Configuration Parameters
|
|
178
|
+
|
|
179
|
+
| Parameter | Type | Required | Description |
|
|
180
|
+
|-----------|------|----------|-------------|
|
|
181
|
+
| `kid` | `str` | Yes | Key ID (kid) header parameter - identifies which key was used |
|
|
182
|
+
| `issuer` | `str` | Yes | Issuer (iss) claim - typically your client_id from PDND |
|
|
183
|
+
| `subject` | `str` | Yes | Subject (sub) claim - typically your client_id from PDND |
|
|
184
|
+
| `audience` | `str` | Yes | Audience (aud) claim - the PDND token endpoint URL (must be HTTPS) |
|
|
185
|
+
| `purpose_id` | `str` | Yes | Purpose ID for the PDND request |
|
|
186
|
+
| `private_key` | `bytes` | One of these | RSA private key content in PEM format |
|
|
187
|
+
| `key_path` | `Path` | is required | Path to the RSA private key file |
|
|
188
|
+
| `alg` | `str` | No | Algorithm (default: "RS256") |
|
|
189
|
+
| `typ` | `str` | No | Token type (default: "JWT") |
|
|
190
|
+
| `validity_minutes` | `int` | No | JWT validity period in minutes (default: 43200 = 30 days, max: 43200) |
|
|
191
|
+
|
|
192
|
+
### Custom Timestamps (for Testing)
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
import datetime
|
|
196
|
+
from anncsu.common import ClientAssertionConfig, create_client_assertion
|
|
197
|
+
|
|
198
|
+
config = ClientAssertionConfig(
|
|
199
|
+
kid="your-key-id",
|
|
200
|
+
issuer="your-client-id",
|
|
201
|
+
subject="your-client-id",
|
|
202
|
+
audience="https://auth.interop.pagopa.it/token.oauth2",
|
|
203
|
+
purpose_id="your-purpose-id",
|
|
204
|
+
private_key=private_key_bytes,
|
|
205
|
+
validity_minutes=60, # 1 hour
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# Custom issued_at and jti for deterministic testing
|
|
209
|
+
token = create_client_assertion(
|
|
210
|
+
config,
|
|
211
|
+
issued_at=datetime.datetime(2024, 1, 1, 12, 0, 0, tzinfo=datetime.UTC),
|
|
212
|
+
jti="custom-jti-for-testing",
|
|
213
|
+
)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Error Handling
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
from anncsu.common import (
|
|
220
|
+
ClientAssertionConfig,
|
|
221
|
+
create_client_assertion,
|
|
222
|
+
ClientAssertionError,
|
|
223
|
+
KeyFileError,
|
|
224
|
+
JWTGenerationError,
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
try:
|
|
228
|
+
config = ClientAssertionConfig(
|
|
229
|
+
kid="your-key-id",
|
|
230
|
+
issuer="your-client-id",
|
|
231
|
+
subject="your-client-id",
|
|
232
|
+
audience="https://auth.interop.pagopa.it/token.oauth2",
|
|
233
|
+
purpose_id="your-purpose-id",
|
|
234
|
+
key_path=Path("./private_key.pem"),
|
|
235
|
+
)
|
|
236
|
+
token = create_client_assertion(config)
|
|
237
|
+
except KeyFileError as e:
|
|
238
|
+
print(f"Error reading key file: {e}")
|
|
239
|
+
except JWTGenerationError as e:
|
|
240
|
+
print(f"Error generating JWT: {e}")
|
|
241
|
+
except ClientAssertionError as e:
|
|
242
|
+
print(f"Client assertion error: {e}")
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### CLI Tool
|
|
246
|
+
|
|
247
|
+
For command-line usage, a CLI tool is also available:
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
python scripts/create_client_assertion.py create \
|
|
251
|
+
--kid "your-key-id" \
|
|
252
|
+
--issuer "your-client-id" \
|
|
253
|
+
--subject "your-client-id" \
|
|
254
|
+
--audience "https://auth.interop.pagopa.it/token.oauth2" \
|
|
255
|
+
--purpose-id "your-purpose-id" \
|
|
256
|
+
--key-path ./private_key.pem
|
|
257
|
+
```
|
|
258
|
+
|
|
73
259
|
## Authentication Flow
|
|
74
260
|
|
|
75
261
|
### 1. Obtain PDND Voucher
|
|
@@ -79,9 +265,10 @@ Before using the SDK, you need to obtain a PDND voucher from the PDND platform:
|
|
|
79
265
|
1. Register your organization on PDND
|
|
80
266
|
2. Request access to ANNCSU APIs
|
|
81
267
|
3. Obtain client credentials (client ID and secret)
|
|
82
|
-
4.
|
|
268
|
+
4. Generate a client assertion using the SDK or CLI
|
|
269
|
+
5. Exchange the client assertion for a voucher token
|
|
83
270
|
|
|
84
|
-
*Note:
|
|
271
|
+
*Note: The final exchange step is outside the scope of this SDK. Refer to PDND documentation.*
|
|
85
272
|
|
|
86
273
|
### 2. Configure SDK with Security
|
|
87
274
|
|
|
@@ -10,20 +10,21 @@ requires-python = ">=3.12"
|
|
|
10
10
|
dependencies = [
|
|
11
11
|
"httpcore >=1.0.9",
|
|
12
12
|
"httpx >=0.28.1",
|
|
13
|
-
"pydantic >=2.
|
|
13
|
+
"pydantic >=2.12.5",
|
|
14
14
|
"authlib>=1.3.0",
|
|
15
|
+
"pydantic-settings>=2.12.0",
|
|
15
16
|
]
|
|
16
17
|
[dependency-groups]
|
|
17
18
|
dev = [
|
|
18
|
-
"pytest>=
|
|
19
|
+
"pytest>=9.0.0",
|
|
19
20
|
"pytest-cov>=6.2.1",
|
|
20
|
-
"ruff>=0.
|
|
21
|
-
"uv-dynamic-versioning>=0.
|
|
21
|
+
"ruff>=0.14.6",
|
|
22
|
+
"uv-dynamic-versioning>=0.11.0",
|
|
22
23
|
"openapi-pydantic>=0.4.1",
|
|
23
24
|
"pyyaml>=6.0.0",
|
|
24
|
-
"faker>=
|
|
25
|
-
"polyfactory>=
|
|
26
|
-
"hypothesis>=6.
|
|
25
|
+
"faker>=38.2.0",
|
|
26
|
+
"polyfactory>=3.1.0",
|
|
27
|
+
"hypothesis>=6.148.3",
|
|
27
28
|
"ipython>=9.7.0",
|
|
28
29
|
"typer>=0.15.0",
|
|
29
30
|
]
|