anncsu-sdk 0.0.1.dev21__tar.gz → 0.0.1.dev28__tar.gz

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