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.
Files changed (379) hide show
  1. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/PKG-INFO +220 -49
  2. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/README.md +219 -48
  3. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/SECURITY.md +384 -37
  4. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/scripts/create_client_assertion.py +2 -2
  5. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/__init__.py +24 -1
  6. anncsu_sdk-0.0.1.dev28/src/anncsu/common/auth.py +401 -0
  7. {anncsu_sdk-0.0.1.dev24/src/anncsu/pa/_hooks → anncsu_sdk-0.0.1.dev28/src/anncsu/common/hooks}/__init__.py +9 -0
  8. anncsu_sdk-0.0.1.dev28/src/anncsu/common/hooks/token_validation.py +247 -0
  9. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/pdnd_assertion.py +2 -2
  10. anncsu_sdk-0.0.1.dev28/src/anncsu/common/pdnd_token.py +505 -0
  11. anncsu_sdk-0.0.1.dev28/src/anncsu/common/security.py +184 -0
  12. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/test_cli_env_override.py +28 -6
  13. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/test_pdnd_assertion.py +151 -76
  14. anncsu_sdk-0.0.1.dev28/tests/common/test_pdnd_auth_manager.py +820 -0
  15. anncsu_sdk-0.0.1.dev28/tests/common/test_pdnd_token.py +812 -0
  16. anncsu_sdk-0.0.1.dev28/tests/common/test_security.py +203 -0
  17. anncsu_sdk-0.0.1.dev28/tests/common/test_token_validation_hook.py +456 -0
  18. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/uv.lock +131 -141
  19. anncsu_sdk-0.0.1.dev24/src/anncsu/common/security.py +0 -41
  20. anncsu_sdk-0.0.1.dev24/tests/common/test_security.py +0 -292
  21. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.devcontainer/README.md +0 -0
  22. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.devcontainer/devcontainer.json +0 -0
  23. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.devcontainer/setup.sh +0 -0
  24. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.env.example +0 -0
  25. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.gitattributes +0 -0
  26. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.github/workflows/README.md +0 -0
  27. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.github/workflows/ci.yml +0 -0
  28. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.github/workflows/publish.yml +0 -0
  29. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.gitignore +0 -0
  30. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.pre-commit-config.yaml +0 -0
  31. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.python-version +0 -0
  32. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.speakeasy/gen.lock +0 -0
  33. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.speakeasy/gen.yaml +0 -0
  34. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.speakeasy/out.openapi.yaml +0 -0
  35. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.speakeasy/workflow.yaml +0 -0
  36. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/.vscode/settings.json +0 -0
  37. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/CONTRIBUTING.md +0 -0
  38. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/LICENSE +0 -0
  39. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/USAGE.md +0 -0
  40. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/VALIDATION.md +0 -0
  41. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparambadrequesterror.md +0 -0
  42. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparaminternalservererror.md +0 -0
  43. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparammethodnotallowederror.md +0 -0
  44. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparamnotfounderror.md +0 -0
  45. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetpathparamunprocessableentityerror.md +0 -0
  46. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparambadrequesterror.md +0 -0
  47. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparaminternalservererror.md +0 -0
  48. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparammethodnotallowederror.md +0 -0
  49. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparamnotfounderror.md +0 -0
  50. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessigetqueryparamunprocessableentityerror.md +0 -0
  51. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostbadrequesterror.md +0 -0
  52. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostinternalservererror.md +0 -0
  53. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostmethodnotallowederror.md +0 -0
  54. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostnotfounderror.md +0 -0
  55. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessipostunprocessableentityerror.md +0 -0
  56. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparambadrequesterror.md +0 -0
  57. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparaminternalservererror.md +0 -0
  58. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparammethodnotallowederror.md +0 -0
  59. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparamnotfounderror.md +0 -0
  60. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetpathparamunprocessableentityerror.md +0 -0
  61. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparambadrequesterror.md +0 -0
  62. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparaminternalservererror.md +0 -0
  63. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparammethodnotallowederror.md +0 -0
  64. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparamnotfounderror.md +0 -0
  65. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiproggetqueryparamunprocessableentityerror.md +0 -0
  66. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostbadrequesterror.md +0 -0
  67. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostinternalservererror.md +0 -0
  68. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostmethodnotallowederror.md +0 -0
  69. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostnotfounderror.md +0 -0
  70. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoaccessiprogpostunprocessableentityerror.md +0 -0
  71. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparambadrequesterror.md +0 -0
  72. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparaminternalservererror.md +0 -0
  73. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparammethodnotallowederror.md +0 -0
  74. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparamnotfounderror.md +0 -0
  75. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetpathparamunprocessableentityerror.md +0 -0
  76. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparambadrequesterror.md +0 -0
  77. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparaminternalservererror.md +0 -0
  78. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparammethodnotallowederror.md +0 -0
  79. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparamnotfounderror.md +0 -0
  80. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimigetqueryparamunprocessableentityerror.md +0 -0
  81. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostbadrequesterror.md +0 -0
  82. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostinternalservererror.md +0 -0
  83. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostmethodnotallowederror.md +0 -0
  84. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostnotfounderror.md +0 -0
  85. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimipostunprocessableentityerror.md +0 -0
  86. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparambadrequesterror.md +0 -0
  87. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparaminternalservererror.md +0 -0
  88. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparammethodnotallowederror.md +0 -0
  89. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparamnotfounderror.md +0 -0
  90. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetpathparamunprocessableentityerror.md +0 -0
  91. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparambadrequesterror.md +0 -0
  92. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparaminternalservererror.md +0 -0
  93. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparammethodnotallowederror.md +0 -0
  94. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparamnotfounderror.md +0 -0
  95. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiproggetqueryparamunprocessableentityerror.md +0 -0
  96. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostbadrequesterror.md +0 -0
  97. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostinternalservererror.md +0 -0
  98. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostmethodnotallowederror.md +0 -0
  99. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostnotfounderror.md +0 -0
  100. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/elencoodonimiprogpostunprocessableentityerror.md +0 -0
  101. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparambadrequesterror.md +0 -0
  102. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparaminternalservererror.md +0 -0
  103. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparammethodnotallowederror.md +0 -0
  104. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetpathparamunprocessableentityerror.md +0 -0
  105. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparambadrequesterror.md +0 -0
  106. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparaminternalservererror.md +0 -0
  107. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparammethodnotallowederror.md +0 -0
  108. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessogetqueryparamunprocessableentityerror.md +0 -0
  109. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostbadrequesterror.md +0 -0
  110. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostinternalservererror.md +0 -0
  111. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostmethodnotallowederror.md +0 -0
  112. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteaccessopostunprocessableentityerror.md +0 -0
  113. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparambadrequesterror.md +0 -0
  114. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparaminternalservererror.md +0 -0
  115. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparammethodnotallowederror.md +0 -0
  116. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetpathparamunprocessableentityerror.md +0 -0
  117. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparambadrequesterror.md +0 -0
  118. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparaminternalservererror.md +0 -0
  119. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparammethodnotallowederror.md +0 -0
  120. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimogetqueryparamunprocessableentityerror.md +0 -0
  121. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostbadrequesterror.md +0 -0
  122. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostinternalservererror.md +0 -0
  123. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostmethodnotallowederror.md +0 -0
  124. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/esisteodonimopostunprocessableentityerror.md +0 -0
  125. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparambadrequesterror.md +0 -0
  126. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparaminternalservererror.md +0 -0
  127. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparammethodnotallowederror.md +0 -0
  128. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparamnotfounderror.md +0 -0
  129. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetpathparamunprocessableentityerror.md +0 -0
  130. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparambadrequesterror.md +0 -0
  131. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparaminternalservererror.md +0 -0
  132. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparammethodnotallowederror.md +0 -0
  133. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparamnotfounderror.md +0 -0
  134. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccgetqueryparamunprocessableentityerror.md +0 -0
  135. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostbadrequesterror.md +0 -0
  136. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostinternalservererror.md +0 -0
  137. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostmethodnotallowederror.md +0 -0
  138. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostnotfounderror.md +0 -0
  139. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazaccpostunprocessableentityerror.md +0 -0
  140. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparambadrequesterror.md +0 -0
  141. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparaminternalservererror.md +0 -0
  142. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparammethodnotallowederror.md +0 -0
  143. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparamnotfounderror.md +0 -0
  144. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetpathparamunprocessableentityerror.md +0 -0
  145. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparambadrequesterror.md +0 -0
  146. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparaminternalservererror.md +0 -0
  147. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparammethodnotallowederror.md +0 -0
  148. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparamnotfounderror.md +0 -0
  149. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareagetqueryparamunprocessableentityerror.md +0 -0
  150. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostbadrequesterror.md +0 -0
  151. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostinternalservererror.md +0 -0
  152. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostmethodnotallowederror.md +0 -0
  153. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostnotfounderror.md +0 -0
  154. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/prognazareapostunprocessableentityerror.md +0 -0
  155. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/errors/serviceunavailableerror.md +0 -0
  156. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetpathparamdata.md +0 -0
  157. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetpathparamrequest.md +0 -0
  158. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetpathparamresponse.md +0 -0
  159. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetqueryparamdata.md +0 -0
  160. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetqueryparamrequest.md +0 -0
  161. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessigetqueryparamresponse.md +0 -0
  162. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessipostdata.md +0 -0
  163. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessipostrequest.md +0 -0
  164. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessipostresponse.md +0 -0
  165. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetpathparamdata.md +0 -0
  166. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetpathparamrequest.md +0 -0
  167. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetpathparamresponse.md +0 -0
  168. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetqueryparamdata.md +0 -0
  169. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetqueryparamrequest.md +0 -0
  170. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiproggetqueryparamresponse.md +0 -0
  171. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiprogpostdata.md +0 -0
  172. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiprogpostrequest.md +0 -0
  173. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoaccessiprogpostresponse.md +0 -0
  174. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetpathparamdata.md +0 -0
  175. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetpathparamrequest.md +0 -0
  176. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetpathparamresponse.md +0 -0
  177. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetqueryparamdata.md +0 -0
  178. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetqueryparamrequest.md +0 -0
  179. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimigetqueryparamresponse.md +0 -0
  180. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimipostdata.md +0 -0
  181. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimipostrequest.md +0 -0
  182. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimipostresponse.md +0 -0
  183. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetpathparamdata.md +0 -0
  184. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetpathparamrequest.md +0 -0
  185. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetpathparamresponse.md +0 -0
  186. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetqueryparamdata.md +0 -0
  187. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetqueryparamrequest.md +0 -0
  188. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiproggetqueryparamresponse.md +0 -0
  189. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiprogpostdata.md +0 -0
  190. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiprogpostrequest.md +0 -0
  191. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/elencoodonimiprogpostresponse.md +0 -0
  192. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetpathparamrequest.md +0 -0
  193. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetpathparamresponse.md +0 -0
  194. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetqueryparamrequest.md +0 -0
  195. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessogetqueryparamresponse.md +0 -0
  196. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessopostrequest.md +0 -0
  197. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteaccessopostresponse.md +0 -0
  198. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetpathparamrequest.md +0 -0
  199. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetpathparamresponse.md +0 -0
  200. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetqueryparamrequest.md +0 -0
  201. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimogetqueryparamresponse.md +0 -0
  202. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimopostrequest.md +0 -0
  203. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/esisteodonimopostresponse.md +0 -0
  204. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetpathparamdata.md +0 -0
  205. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetpathparamrequest.md +0 -0
  206. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetpathparamresponse.md +0 -0
  207. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetqueryparamdata.md +0 -0
  208. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetqueryparamrequest.md +0 -0
  209. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccgetqueryparamresponse.md +0 -0
  210. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccpostdata.md +0 -0
  211. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccpostrequest.md +0 -0
  212. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazaccpostresponse.md +0 -0
  213. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetpathparamdata.md +0 -0
  214. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetpathparamrequest.md +0 -0
  215. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetpathparamresponse.md +0 -0
  216. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetqueryparamdata.md +0 -0
  217. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetqueryparamrequest.md +0 -0
  218. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareagetqueryparamresponse.md +0 -0
  219. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareapostdata.md +0 -0
  220. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareapostrequest.md +0 -0
  221. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/prognazareapostresponse.md +0 -0
  222. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/showstatusresponse.md +0 -0
  223. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/models/utils/retryconfig.md +0 -0
  224. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/anncsu/README.md +0 -0
  225. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/jsonpost/README.md +0 -0
  226. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/pathparam/README.md +0 -0
  227. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/queryparam/README.md +0 -0
  228. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/docs/sdks/status/README.md +0 -0
  229. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/oas/.spectral.yaml +0 -0
  230. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/oas/README.md +0 -0
  231. {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
  232. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/pylintrc +0 -0
  233. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/pyproject.toml +0 -0
  234. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/scripts/publish.sh +0 -0
  235. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/basesdk.py +0 -0
  236. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/config.py +0 -0
  237. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/__init__.py +0 -0
  238. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/apierror.py +0 -0
  239. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/base.py +0 -0
  240. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/no_response_error.py +0 -0
  241. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/errors/responsevalidationerror.py +0 -0
  242. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/hooks/registration.py +0 -0
  243. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/hooks/sdkhooks.py +0 -0
  244. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/hooks/types.py +0 -0
  245. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/httpclient.py +0 -0
  246. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/sdkconfiguration.py +0 -0
  247. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/types/__init__.py +0 -0
  248. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/types/basemodel.py +0 -0
  249. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/__init__.py +0 -0
  250. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/annotations.py +0 -0
  251. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/datetimes.py +0 -0
  252. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/enums.py +0 -0
  253. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/eventstreaming.py +0 -0
  254. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/forms.py +0 -0
  255. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/headers.py +0 -0
  256. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/logger.py +0 -0
  257. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/metadata.py +0 -0
  258. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/queryparams.py +0 -0
  259. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/requestbodies.py +0 -0
  260. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/retries.py +0 -0
  261. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/security.py +0 -0
  262. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/serializers.py +0 -0
  263. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/unmarshal_json_response.py +0 -0
  264. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/url.py +0 -0
  265. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/utils/values.py +0 -0
  266. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/__init__.py +0 -0
  267. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/examples.py +0 -0
  268. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/response_validator.py +0 -0
  269. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/common/validation/validators.py +0 -0
  270. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/__init__.py +0 -0
  271. {anncsu_sdk-0.0.1.dev24/src/anncsu/common/hooks → anncsu_sdk-0.0.1.dev28/src/anncsu/pa/_hooks}/__init__.py +0 -0
  272. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_hooks/registration.py +0 -0
  273. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_hooks/sdkhooks.py +0 -0
  274. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_hooks/types.py +0 -0
  275. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/_version.py +0 -0
  276. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/basesdk.py +0 -0
  277. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/__init__.py +0 -0
  278. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/anncsuerror.py +0 -0
  279. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/apierror.py +0 -0
  280. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessigetpathparamop.py +0 -0
  281. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessigetqueryparamop.py +0 -0
  282. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessipostop.py +0 -0
  283. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessiproggetpathparamop.py +0 -0
  284. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessiproggetqueryparamop.py +0 -0
  285. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoaccessiprogpostop.py +0 -0
  286. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimigetpathparamop.py +0 -0
  287. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimigetqueryparamop.py +0 -0
  288. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimipostop.py +0 -0
  289. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimiproggetpathparamop.py +0 -0
  290. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimiproggetqueryparamop.py +0 -0
  291. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/elencoodonimiprogpostop.py +0 -0
  292. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteaccessogetpathparamop.py +0 -0
  293. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteaccessogetqueryparamop.py +0 -0
  294. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteaccessopostop.py +0 -0
  295. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteodonimogetpathparamop.py +0 -0
  296. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteodonimogetqueryparamop.py +0 -0
  297. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/esisteodonimopostop.py +0 -0
  298. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/no_response_error.py +0 -0
  299. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazaccgetpathparamop.py +0 -0
  300. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazaccgetqueryparamop.py +0 -0
  301. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazaccpostop.py +0 -0
  302. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazareagetpathparamop.py +0 -0
  303. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazareagetqueryparamop.py +0 -0
  304. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/prognazareapostop.py +0 -0
  305. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/responsevalidationerror.py +0 -0
  306. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/errors/show_statusop.py +0 -0
  307. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/httpclient.py +0 -0
  308. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/jsonpost.py +0 -0
  309. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/__init__.py +0 -0
  310. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessigetpathparamop.py +0 -0
  311. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessigetqueryparamop.py +0 -0
  312. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessipostop.py +0 -0
  313. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessiproggetpathparamop.py +0 -0
  314. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessiproggetqueryparamop.py +0 -0
  315. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoaccessiprogpostop.py +0 -0
  316. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimigetpathparamop.py +0 -0
  317. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimigetqueryparamop.py +0 -0
  318. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimipostop.py +0 -0
  319. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimiproggetpathparamop.py +0 -0
  320. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimiproggetqueryparamop.py +0 -0
  321. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/elencoodonimiprogpostop.py +0 -0
  322. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteaccessogetpathparamop.py +0 -0
  323. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteaccessogetqueryparamop.py +0 -0
  324. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteaccessopostop.py +0 -0
  325. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteodonimogetpathparamop.py +0 -0
  326. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteodonimogetqueryparamop.py +0 -0
  327. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/esisteodonimopostop.py +0 -0
  328. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazaccgetpathparamop.py +0 -0
  329. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazaccgetqueryparamop.py +0 -0
  330. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazaccpostop.py +0 -0
  331. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazareagetpathparamop.py +0 -0
  332. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazareagetqueryparamop.py +0 -0
  333. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/prognazareapostop.py +0 -0
  334. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/models/show_statusop.py +0 -0
  335. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/pathparam.py +0 -0
  336. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/py.typed +0 -0
  337. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/queryparam.py +0 -0
  338. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/sdk.py +0 -0
  339. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/sdkconfiguration.py +0 -0
  340. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/status.py +0 -0
  341. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/types/__init__.py +0 -0
  342. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/types/basemodel.py +0 -0
  343. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/__init__.py +0 -0
  344. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/annotations.py +0 -0
  345. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/datetimes.py +0 -0
  346. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/enums.py +0 -0
  347. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/eventstreaming.py +0 -0
  348. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/forms.py +0 -0
  349. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/headers.py +0 -0
  350. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/logger.py +0 -0
  351. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/metadata.py +0 -0
  352. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/queryparams.py +0 -0
  353. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/requestbodies.py +0 -0
  354. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/retries.py +0 -0
  355. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/security.py +0 -0
  356. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/serializers.py +0 -0
  357. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/unmarshal_json_response.py +0 -0
  358. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/url.py +0 -0
  359. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/src/anncsu/pa/utils/values.py +0 -0
  360. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/README.md +0 -0
  361. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/__init__.py +0 -0
  362. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/test_imports.py +0 -0
  363. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/common/test_security_basemodel.py +0 -0
  364. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/conftest.py +0 -0
  365. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/integration/__init__.py +0 -0
  366. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/integration/test_sdk_instantiation.py +0 -0
  367. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/integration/test_security_in_requests.py +0 -0
  368. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/pa/__init__.py +0 -0
  369. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/pa/test_imports.py +0 -0
  370. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/ADVANCED_TESTING.md +0 -0
  371. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/README.md +0 -0
  372. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/README_COMPREHENSIVE_TESTS.md +0 -0
  373. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/__init__.py +0 -0
  374. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_all_operations_validation.py +0 -0
  375. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_model_factories.py +0 -0
  376. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_model_factories_comprehensive.py +0 -0
  377. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_response_validator.py +0 -0
  378. {anncsu_sdk-0.0.1.dev24 → anncsu_sdk-0.0.1.dev28}/tests/validation/test_validators.py +0 -0
  379. {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.dev24
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
- ### Basic Authentication
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 Security
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
- # Create security configuration with your PDND voucher
183
- security = Security(bearer="your-pdnd-voucher-token")
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
- # Initialize SDK with security
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
- ### Key Features
231
+ ### Basic Authentication (with existing token)
196
232
 
197
- - **PDND Voucher**: Uses PDND (Piattaforma Digitale Nazionale Dati) authentication
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.common import ClientAssertionConfig, create_client_assertion
236
+ from anncsu.pa import Anncsu
237
+ from anncsu.common import Security
208
238
 
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...",
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
- token = create_client_assertion(config)
246
+ ```
219
247
 
220
- # Option 2: With private key file path
221
- from pathlib import Path
248
+ ### Token Expiration Validation
222
249
 
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)
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
- # Use the token with the SDK
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
- security = Security(bearer=token)
237
- sdk = Anncsu(security=security)
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
- token = create_client_assertion(settings.to_config())
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
- security = Security(bearer=token)
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 - PDND token endpoint |
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=https://auth.interop.pagopa.it/token.oauth2
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
- - PDND voucher format and JWT structure
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
- ### Basic Authentication
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 Security
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
- # Create security configuration with your PDND voucher
169
- security = Security(bearer="your-pdnd-voucher-token")
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
- # Initialize SDK with security
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
- ### Key Features
217
+ ### Basic Authentication (with existing token)
182
218
 
183
- - **PDND Voucher**: Uses PDND (Piattaforma Digitale Nazionale Dati) authentication
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.common import ClientAssertionConfig, create_client_assertion
222
+ from anncsu.pa import Anncsu
223
+ from anncsu.common import Security
194
224
 
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...",
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
- token = create_client_assertion(config)
232
+ ```
205
233
 
206
- # Option 2: With private key file path
207
- from pathlib import Path
234
+ ### Token Expiration Validation
208
235
 
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)
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
- # Use the token with the SDK
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
- security = Security(bearer=token)
223
- sdk = Anncsu(security=security)
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
- token = create_client_assertion(settings.to_config())
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
- security = Security(bearer=token)
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 - PDND token endpoint |
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=https://auth.interop.pagopa.it/token.oauth2
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
- - PDND voucher format and JWT structure
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] -->