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

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