atlan-application-sdk 2.1.0__tar.gz → 2.2.0__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 (433) hide show
  1. atlan_application_sdk-2.2.0/.github/release_notes.md +8 -0
  2. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/CHANGELOG.md +20 -0
  3. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/PKG-INFO +6 -2
  4. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/__init__.py +14 -0
  5. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/metadata_extraction/sql.py +40 -2
  6. atlan_application_sdk-2.2.0/application_sdk/clients/azure/__init__.py +6 -0
  7. atlan_application_sdk-2.2.0/application_sdk/clients/azure/auth.py +288 -0
  8. atlan_application_sdk-2.2.0/application_sdk/clients/azure/client.py +336 -0
  9. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/common/error_codes.py +9 -0
  10. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/fastapi/__init__.py +30 -1
  11. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/fastapi/models.py +62 -1
  12. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/query/__init__.py +30 -3
  13. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/version.py +1 -1
  14. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/components/eventstore.yaml +1 -1
  15. atlan_application_sdk-2.2.0/components/pubsub.yaml +41 -0
  16. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/server.md +86 -1
  17. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/pyproject.toml +7 -2
  18. atlan_application_sdk-2.2.0/tests/unit/clients/test_azure_auth.py +177 -0
  19. atlan_application_sdk-2.2.0/tests/unit/clients/test_azure_client.py +246 -0
  20. atlan_application_sdk-2.2.0/tests/unit/server/fastapi/test_fastapi.py +911 -0
  21. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/test_sql_transformer.py +18 -0
  22. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/uv.lock +996 -551
  23. atlan_application_sdk-2.1.0/.github/release_notes.md +0 -12
  24. atlan_application_sdk-2.1.0/tests/unit/server/fastapi/test_fastapi.py +0 -192
  25. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/BUGBOT.md +0 -0
  26. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/rules/commits.mdc +0 -0
  27. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/rules/documentation.mdc +0 -0
  28. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/rules/exception-handling.mdc +0 -0
  29. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/rules/guidelines.mdc +0 -0
  30. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/rules/logging.mdc +0 -0
  31. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/rules/performance.mdc +0 -0
  32. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/rules/setup.mdc +0 -0
  33. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/rules/standards.mdc +0 -0
  34. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.cursor/rules/testing.mdc +0 -0
  35. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.dockerignore +0 -0
  36. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.env.example +0 -0
  37. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/CODEOWNERS +0 -0
  38. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  39. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
  40. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  41. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/docgen/action.yaml +0 -0
  42. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/doclint/action.yaml +0 -0
  43. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/docstring-coverage/action.yaml +0 -0
  44. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/e2e-apps/action.yaml +0 -0
  45. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/e2e-examples/action.yaml +0 -0
  46. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/secure-build-push-apps/action.yaml +0 -0
  47. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/setup-deps/action.yaml +0 -0
  48. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/sync-branches/action.yaml +0 -0
  49. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/trivy/action.yaml +0 -0
  50. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/trivy-container/action.yaml +0 -0
  51. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/actions/unit-tests/action.yaml +0 -0
  52. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/dependabot.yaml +0 -0
  53. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/pull_request_template.md +0 -0
  54. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/scripts/extract_release_notes.py +0 -0
  55. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/scripts/release.py +0 -0
  56. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/scripts/trivy-to-markdown.py +0 -0
  57. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/scripts/update_changelog.py +0 -0
  58. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/AMPM.yml +0 -0
  59. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Accessibility.yml +0 -0
  60. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Acronyms.yml +0 -0
  61. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Adverbs.yml +0 -0
  62. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Auto.yml +0 -0
  63. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Avoid.yml +0 -0
  64. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Contractions.yml +0 -0
  65. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Dashes.yml +0 -0
  66. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/DateFormat.yml +0 -0
  67. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/DateNumbers.yml +0 -0
  68. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/DateOrder.yml +0 -0
  69. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Ellipses.yml +0 -0
  70. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/FirstPerson.yml +0 -0
  71. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Foreign.yml +0 -0
  72. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Gender.yml +0 -0
  73. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/GenderBias.yml +0 -0
  74. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/GeneralURL.yml +0 -0
  75. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/HeadingAcronyms.yml +0 -0
  76. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/HeadingColons.yml +0 -0
  77. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/HeadingPunctuation.yml +0 -0
  78. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Headings.yml +0 -0
  79. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Hyphens.yml +0 -0
  80. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Negative.yml +0 -0
  81. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Ordinal.yml +0 -0
  82. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/OxfordComma.yml +0 -0
  83. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Passive.yml +0 -0
  84. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Percentages.yml +0 -0
  85. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Plurals.yml +0 -0
  86. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Quotes.yml +0 -0
  87. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/RangeTime.yml +0 -0
  88. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Semicolon.yml +0 -0
  89. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/SentenceLength.yml +0 -0
  90. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Spacing.yml +0 -0
  91. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Suspended.yml +0 -0
  92. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Terms.yml +0 -0
  93. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/URLFormat.yml +0 -0
  94. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Units.yml +0 -0
  95. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Vocab.yml +0 -0
  96. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/We.yml +0 -0
  97. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/Wordiness.yml +0 -0
  98. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/Microsoft/meta.json +0 -0
  99. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/config/vocabularies/deviations/accept.txt +0 -0
  100. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/styles/config/vocabularies/deviations/reject.txt +0 -0
  101. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/checks.properties.json +0 -0
  102. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/checks.yaml +0 -0
  103. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/codeql.properties.json +0 -0
  104. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/codeql.yaml +0 -0
  105. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/dependency-review.properties.json +0 -0
  106. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/dependency-review.yml +0 -0
  107. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/stale.properties.json +0 -0
  108. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/stale.yml +0 -0
  109. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/trivy-container.properties.json +0 -0
  110. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/trivy-container.yaml +0 -0
  111. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/trivy.properties.json +0 -0
  112. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflow-templates/trivy.yaml +0 -0
  113. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/build-image.yaml +0 -0
  114. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/codeql.yaml +0 -0
  115. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/pull_request.yaml +0 -0
  116. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/push.yaml +0 -0
  117. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/release.yaml +0 -0
  118. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/scale-tests.yaml +0 -0
  119. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/schedule.yaml +0 -0
  120. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/tag-and-publish.yaml +0 -0
  121. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/trivy-container.yaml +0 -0
  122. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.github/workflows/verify-snyk-status.yml +0 -0
  123. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.gitignore +0 -0
  124. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.pre-commit-config.yaml +0 -0
  125. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/.vscode/launch.json +0 -0
  126. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/CODE_OF_CONDUCT.md +0 -0
  127. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/CONTRIBUTING.md +0 -0
  128. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/Dockerfile +0 -0
  129. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/LICENSE +0 -0
  130. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/NOTICE +0 -0
  131. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/README.md +0 -0
  132. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/SECURITY.md +0 -0
  133. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/__init__.py +0 -0
  134. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/.cursor/BUGBOT.md +0 -0
  135. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/common/__init__.py +0 -0
  136. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/common/models.py +0 -0
  137. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/common/sql_utils.py +0 -0
  138. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/common/utils.py +0 -0
  139. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/lock_management.py +0 -0
  140. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/metadata_extraction/__init__.py +0 -0
  141. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/metadata_extraction/base.py +0 -0
  142. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/metadata_extraction/rest.py +0 -0
  143. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/query_extraction/__init__.py +0 -0
  144. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/activities/query_extraction/sql.py +0 -0
  145. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/application/__init__.py +0 -0
  146. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/application/metadata_extraction/sql.py +0 -0
  147. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/.cursor/BUGBOT.md +0 -0
  148. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/__init__.py +0 -0
  149. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/atlan.py +0 -0
  150. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/atlan_auth.py +0 -0
  151. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/base.py +0 -0
  152. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/models.py +0 -0
  153. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/redis.py +0 -0
  154. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/sql.py +0 -0
  155. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/temporal.py +0 -0
  156. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/utils.py +0 -0
  157. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/clients/workflow.py +0 -0
  158. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/common/.cursor/BUGBOT.md +0 -0
  159. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/common/__init__.py +0 -0
  160. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/common/aws_utils.py +0 -0
  161. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/common/file_converter.py +0 -0
  162. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/common/types.py +0 -0
  163. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/common/utils.py +0 -0
  164. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/constants.py +0 -0
  165. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/decorators/.cursor/BUGBOT.md +0 -0
  166. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/decorators/__init__.py +0 -0
  167. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/decorators/locks.py +0 -0
  168. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/decorators/mcp_tool.py +0 -0
  169. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/__init__.py +0 -0
  170. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/exporters/__init__.py +0 -0
  171. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/exporters/mkdocs.py +0 -0
  172. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/models/__init__.py +0 -0
  173. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/models/export/__init__.py +0 -0
  174. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/models/export/page.py +0 -0
  175. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/models/manifest/__init__.py +0 -0
  176. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/models/manifest/customer.py +0 -0
  177. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/models/manifest/internal.py +0 -0
  178. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/models/manifest/metadata.py +0 -0
  179. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/models/manifest/page.py +0 -0
  180. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/models/manifest/section.py +0 -0
  181. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/parsers/__init__.py +0 -0
  182. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/parsers/directory.py +0 -0
  183. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/docgen/parsers/manifest.py +0 -0
  184. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/handlers/__init__.py +0 -0
  185. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/handlers/base.py +0 -0
  186. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/handlers/sql.py +0 -0
  187. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/interceptors/.cursor/BUGBOT.md +0 -0
  188. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/interceptors/__init__.py +0 -0
  189. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/interceptors/cleanup.py +0 -0
  190. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/interceptors/correlation_context.py +0 -0
  191. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/interceptors/events.py +0 -0
  192. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/interceptors/lock.py +0 -0
  193. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/interceptors/models.py +0 -0
  194. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/io/__init__.py +0 -0
  195. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/io/json.py +0 -0
  196. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/io/parquet.py +0 -0
  197. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/io/utils.py +0 -0
  198. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/observability/__init__.py +0 -0
  199. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/observability/context.py +0 -0
  200. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/observability/decorators/observability_decorator.py +0 -0
  201. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/observability/logger_adaptor.py +0 -0
  202. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/observability/metrics_adaptor.py +0 -0
  203. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/observability/observability.py +0 -0
  204. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/observability/traces_adaptor.py +0 -0
  205. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/observability/utils.py +0 -0
  206. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/.cursor/BUGBOT.md +0 -0
  207. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/__init__.py +0 -0
  208. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/fastapi/middleware/logmiddleware.py +0 -0
  209. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/fastapi/middleware/metrics.py +0 -0
  210. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/fastapi/routers/__init__.py +0 -0
  211. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/fastapi/routers/server.py +0 -0
  212. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/fastapi/utils.py +0 -0
  213. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/mcp/__init__.py +0 -0
  214. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/mcp/models.py +0 -0
  215. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/server/mcp/server.py +0 -0
  216. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/services/__init__.py +0 -0
  217. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/services/_utils.py +0 -0
  218. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/services/atlan_storage.py +0 -0
  219. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/services/eventstore.py +0 -0
  220. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/services/objectstore.py +0 -0
  221. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/services/secretstore.py +0 -0
  222. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/services/statestore.py +0 -0
  223. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/__init__.py +0 -0
  224. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/e2e/__init__.py +0 -0
  225. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/e2e/base.py +0 -0
  226. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/e2e/client.py +0 -0
  227. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/e2e/conftest.py +0 -0
  228. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/e2e/utils.py +0 -0
  229. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/__init__.py +0 -0
  230. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/__init__.py +0 -0
  231. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/clients/__init__.py +0 -0
  232. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/clients/sql.py +0 -0
  233. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/common/__init__.py +0 -0
  234. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/common/logger.py +0 -0
  235. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/handlers/__init__.py +0 -0
  236. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/handlers/sql/__init__.py +0 -0
  237. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/handlers/sql/sql_metadata.py +0 -0
  238. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/handlers/sql/sql_preflight.py +0 -0
  239. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/inputs/__init__.py +0 -0
  240. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/inputs/json_input.py +0 -0
  241. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/inputs/parquet_input.py +0 -0
  242. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/outputs/__init__.py +0 -0
  243. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/outputs/json_output.py +0 -0
  244. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/outputs/statestore.py +0 -0
  245. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/server/__init__.py +0 -0
  246. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/server/fastapi/__init__.py +0 -0
  247. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/sql_client.py +0 -0
  248. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/hypothesis/strategies/temporal.py +0 -0
  249. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/README.md +0 -0
  250. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/__init__.py +0 -0
  251. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/config_loader.py +0 -0
  252. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/data_generator.py +0 -0
  253. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/driver.py +0 -0
  254. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/examples/config.yaml +0 -0
  255. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/output_handler/__init__.py +0 -0
  256. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/output_handler/base.py +0 -0
  257. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/output_handler/csv_handler.py +0 -0
  258. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/output_handler/json_handler.py +0 -0
  259. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/scale_data_generator/output_handler/parquet_handler.py +0 -0
  260. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/test_utils/workflow_monitoring.py +0 -0
  261. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/__init__.py +0 -0
  262. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/atlas/__init__.py +0 -0
  263. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/atlas/sql.py +0 -0
  264. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/common/__init__.py +0 -0
  265. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/common/utils.py +0 -0
  266. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/query/templates/column.yaml +0 -0
  267. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/query/templates/database.yaml +0 -0
  268. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/query/templates/extras-procedure.yaml +0 -0
  269. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/query/templates/function.yaml +0 -0
  270. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/query/templates/schema.yaml +0 -0
  271. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/query/templates/table.yaml +0 -0
  272. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/transformers/query/templates/tag_attachment.yaml +0 -0
  273. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/worker.py +0 -0
  274. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/workflows/.cursor/BUGBOT.md +0 -0
  275. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/workflows/__init__.py +0 -0
  276. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/workflows/metadata_extraction/__init__.py +0 -0
  277. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/workflows/metadata_extraction/sql.py +0 -0
  278. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/workflows/query_extraction/__init__.py +0 -0
  279. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/application_sdk/workflows/query_extraction/sql.py +0 -0
  280. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/components/README.md +0 -0
  281. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/components/atlan-storage.yaml +0 -0
  282. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/components/aws-secrets.yaml +0 -0
  283. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/components/configuration.yaml +0 -0
  284. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/components/deployment-secrets.yaml +0 -0
  285. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/components/objectstore.yaml +0 -0
  286. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/components/secretstore.yaml +0 -0
  287. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/components/statestore.yaml +0 -0
  288. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/API.md +0 -0
  289. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/activities.md +0 -0
  290. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/application.md +0 -0
  291. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/application_sql.md +0 -0
  292. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/atlanupload.md +0 -0
  293. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/clients.md +0 -0
  294. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/common.md +0 -0
  295. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/handlers.md +0 -0
  296. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/inputs.md +0 -0
  297. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/mcp.md +0 -0
  298. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/output_paths.md +0 -0
  299. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/outputs.md +0 -0
  300. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/services.md +0 -0
  301. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/temporal_auth.md +0 -0
  302. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/worker.md +0 -0
  303. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/concepts/workflows.md +0 -0
  304. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/configuration.md +0 -0
  305. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/guides/architecture.md +0 -0
  306. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/guides/atlantis.md +0 -0
  307. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/guides/best-practices.md +0 -0
  308. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/guides/getting-started.md +0 -0
  309. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/guides/index.md +0 -0
  310. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/guides/secretstores.md +0 -0
  311. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/guides/sql-application-guide.md +0 -0
  312. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/guides/test-framework.md +0 -0
  313. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/index.md +0 -0
  314. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/setup/LINUX.md +0 -0
  315. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/setup/MAC.md +0 -0
  316. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/setup/WINDOWS.md +0 -0
  317. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/setup/troubleshooting.md +0 -0
  318. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/static/assets/logo.svg +0 -0
  319. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/static/images/phoenix-sdk-featureset.png +0 -0
  320. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/static/javascripts/mathjax.js +0 -0
  321. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/docs/static/stylesheets/extra.css +0 -0
  322. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/docs/mkdocs.yml +0 -0
  323. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/README.md +0 -0
  324. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/application_custom_fastapi.py +0 -0
  325. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/application_fastapi.py +0 -0
  326. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/application_hello_world.py +0 -0
  327. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/application_sql.py +0 -0
  328. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/application_sql_miner.py +0 -0
  329. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/application_sql_with_custom_pyatlan_transformer.py +0 -0
  330. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/application_sql_with_custom_transformer.py +0 -0
  331. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/run_examples.py +0 -0
  332. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/examples/sql_query_templates/database.yaml +0 -0
  333. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/.cursor/BUGBOT.md +0 -0
  334. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/__init__.py +0 -0
  335. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/conftest.py +0 -0
  336. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/__init__.py +0 -0
  337. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/activities/__init__.py +0 -0
  338. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/activities/common/__init__.py +0 -0
  339. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/activities/common/test_sql_utils.py +0 -0
  340. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/activities/common/test_utils.py +0 -0
  341. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/activities/metadata_extraction/__init__.py +0 -0
  342. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/activities/metadata_extraction/test_sql.py +0 -0
  343. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/activities/query_extraction/__init__.py +0 -0
  344. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/activities/test_activities.py +0 -0
  345. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/activities/test_lock_management.py +0 -0
  346. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/application/__init__.py +0 -0
  347. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/application/metadata_extraction/test_sql.py +0 -0
  348. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/application/test_application.py +0 -0
  349. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/clients/__init__.py +0 -0
  350. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/clients/test_async_sql_client.py +0 -0
  351. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/clients/test_atlan_auth.py +0 -0
  352. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/clients/test_atlan_client.py +0 -0
  353. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/clients/test_atlanauth.py +0 -0
  354. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/clients/test_base_client.py +0 -0
  355. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/clients/test_redis_client.py +0 -0
  356. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/clients/test_sql_client.py +0 -0
  357. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/clients/test_temporal_client.py +0 -0
  358. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/common/test_aws_utils.py +0 -0
  359. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/common/test_credential_utils.py +0 -0
  360. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/common/test_file_converter.py +0 -0
  361. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/common/test_utils.py +0 -0
  362. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/common/test_utils_file_discovery.py +0 -0
  363. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/decorators/__init__.py +0 -0
  364. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/decorators/test_mcp_tool.py +0 -0
  365. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/docgen/parsers/test_directory_parser.py +0 -0
  366. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/docgen/parsers/test_manifest_parser.py +0 -0
  367. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/__init__.py +0 -0
  368. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/sql/test_auth.py +0 -0
  369. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/sql/test_check_schemas_and_databases.py +0 -0
  370. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/sql/test_extract_allowed_schemas.py +0 -0
  371. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/sql/test_metadata.py +0 -0
  372. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/sql/test_preflight_check.py +0 -0
  373. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/sql/test_prepare_metadata.py +0 -0
  374. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/sql/test_tables_check.py +0 -0
  375. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/sql/test_validate_filters.py +0 -0
  376. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/handlers/test_base_handler.py +0 -0
  377. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/interceptors/__init__.py +0 -0
  378. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/interceptors/test_correlation_context.py +0 -0
  379. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/io/readers/test_json_reader.py +0 -0
  380. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/io/readers/test_parquet_reader.py +0 -0
  381. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/io/test_base_io.py +0 -0
  382. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/io/writers/test_json_writer.py +0 -0
  383. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/io/writers/test_parquet_writer.py +0 -0
  384. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/observability/__init__.py +0 -0
  385. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/observability/test_logger_adaptor.py +0 -0
  386. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/observability/test_metrics_adaptor.py +0 -0
  387. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/observability/test_traces_adaptor.py +0 -0
  388. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/server/__init__.py +0 -0
  389. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/server/fastapi/routers/__init__.py +0 -0
  390. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/server/fastapi/routers/server.py +0 -0
  391. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/server/mcp/__init__.py +0 -0
  392. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/server/mcp/test_mcp_server.py +0 -0
  393. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/services/test_atlan_storage.py +0 -0
  394. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/services/test_eventstore.py +0 -0
  395. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/services/test_objectstore.py +0 -0
  396. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/services/test_statestore.py +0 -0
  397. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/test_worker.py +0 -0
  398. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/__init__.py +0 -0
  399. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/__init__.py +0 -0
  400. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/raw_columns.json +0 -0
  401. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/raw_databases.json +0 -0
  402. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/raw_functions.json +0 -0
  403. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/raw_procedures.json +0 -0
  404. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/raw_schemas.json +0 -0
  405. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/raw_tables.json +0 -0
  406. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/transformed_columns.json +0 -0
  407. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/transformed_databases.json +0 -0
  408. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/transformed_functions.json +0 -0
  409. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/transformed_procedures.json +0 -0
  410. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/transformed_schemas.json +0 -0
  411. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/resources/transformed_tables.json +0 -0
  412. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/test_column.py +0 -0
  413. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/test_database.py +0 -0
  414. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/test_function.py +0 -0
  415. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/test_procedure.py +0 -0
  416. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/test_schema.py +0 -0
  417. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/atlas/test_table.py +0 -0
  418. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/raw/column.json +0 -0
  419. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/raw/database.json +0 -0
  420. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/raw/extras-procedure.json +0 -0
  421. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/raw/function.json +0 -0
  422. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/raw/schema.json +0 -0
  423. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/raw/table.json +0 -0
  424. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/transformed/column.json +0 -0
  425. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/transformed/database.json +0 -0
  426. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/transformed/extras-procedure.json +0 -0
  427. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/transformed/function.json +0 -0
  428. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/transformed/schema.json +0 -0
  429. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/resources/transformed/table.json +0 -0
  430. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/transformers/query/test_sql_transformer_output_validation.py +0 -0
  431. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/workflows/metadata_extraction/test_sql_workflow.py +0 -0
  432. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/workflows/query_extraction/__init__.py +0 -0
  433. {atlan_application_sdk-2.1.0 → atlan_application_sdk-2.2.0}/tests/unit/workflows/query_extraction/test_sql.py +0 -0
@@ -0,0 +1,8 @@
1
+ ## v2.2.0 (January 14, 2026)
2
+
3
+ Full Changelog: https://github.com/atlanhq/application-sdk/compare/v2.1.1...v2.2.0
4
+
5
+ ### Features
6
+
7
+ - added Azure specific client authentication (#619) (by @rupali-atlan in [37b2e19](https://github.com/atlanhq/application-sdk/commit/37b2e19))
8
+ - Using Pubsub for message processors (#898) (by @niteesh-atlan in [f87f583](https://github.com/atlanhq/application-sdk/commit/f87f583))
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## v2.2.0 (January 14, 2026)
4
+
5
+ Full Changelog: https://github.com/atlanhq/application-sdk/compare/v2.1.1...v2.2.0
6
+
7
+ ### Features
8
+
9
+ - added Azure specific client authentication (#619) (by @rupali-atlan in [37b2e19](https://github.com/atlanhq/application-sdk/commit/37b2e19))
10
+ - Using Pubsub for message processors (#898) (by @niteesh-atlan in [f87f583](https://github.com/atlanhq/application-sdk/commit/f87f583))
11
+
12
+
13
+ ## v2.1.1 (January 08, 2026)
14
+
15
+ Full Changelog: https://github.com/atlanhq/application-sdk/compare/v2.1.0...v2.1.1
16
+
17
+ ### Bug Fixes
18
+
19
+ - daft struct error (#931) (by @OnkarVO7 in [d64e60b](https://github.com/atlanhq/application-sdk/commit/d64e60b))
20
+ - time based state refresh for each activity (#796) (by @abhishekagrawal-atlan in [3563595](https://github.com/atlanhq/application-sdk/commit/3563595))
21
+
22
+
3
23
  ## v2.1.0 (January 08, 2026)
4
24
 
5
25
  Full Changelog: https://github.com/atlanhq/application-sdk/compare/v2.0.0...v2.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atlan-application-sdk
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: Atlan Application SDK is a Python library for developing applications on the Atlan Platform
5
5
  Project-URL: Repository, https://github.com/atlanhq/application-sdk
6
6
  Project-URL: Documentation, https://github.com/atlanhq/application-sdk/README.md
@@ -30,8 +30,12 @@ Requires-Dist: pyatlan<8.5.0,>=8.0.2
30
30
  Requires-Dist: pydantic<2.13.0,>=2.10.6
31
31
  Requires-Dist: python-dotenv<1.3.0,>=1.1.0
32
32
  Requires-Dist: uvloop<0.23.0,>=0.21.0; sys_platform != 'win32'
33
+ Provides-Extra: azure
34
+ Requires-Dist: azure-identity>=1.15.0; extra == 'azure'
35
+ Requires-Dist: azure-storage-blob>=12.19.0; extra == 'azure'
36
+ Requires-Dist: azure-storage-file-datalake>=12.19.0; extra == 'azure'
33
37
  Provides-Extra: daft
34
- Requires-Dist: daft<0.8.0,>=0.4.12; extra == 'daft'
38
+ Requires-Dist: daft<0.8.0,>=0.7.1; extra == 'daft'
35
39
  Provides-Extra: distributed-lock
36
40
  Requires-Dist: redis[hiredis]<7.2.0,>=5.2.0; extra == 'distributed-lock'
37
41
  Provides-Extra: iam-auth
@@ -15,6 +15,7 @@ Example:
15
15
 
16
16
  import os
17
17
  from abc import ABC
18
+ from datetime import datetime, timedelta
18
19
  from typing import Any, Dict, Generic, Optional, TypeVar
19
20
 
20
21
  from pydantic import BaseModel
@@ -62,6 +63,7 @@ class ActivitiesState(BaseModel, Generic[HandlerType]):
62
63
  model_config = {"arbitrary_types_allowed": True}
63
64
  handler: Optional[HandlerType] = None
64
65
  workflow_args: Optional[Dict[str, Any]] = None
66
+ last_updated_timestamp: Optional[datetime] = None
65
67
 
66
68
 
67
69
  ActivitiesStateType = TypeVar("ActivitiesStateType", bound=ActivitiesState)
@@ -113,12 +115,15 @@ class ActivitiesInterface(ABC, Generic[ActivitiesStateType]):
113
115
  Note:
114
116
  The workflow ID is automatically retrieved from the current activity context.
115
117
  If no state exists for the current workflow, a new one will be created.
118
+ This method also updates the last_updated_timestamp to enable time-based
119
+ state refresh functionality.
116
120
  """
117
121
  workflow_id = get_workflow_id()
118
122
  if not self._state.get(workflow_id):
119
123
  self._state[workflow_id] = ActivitiesState()
120
124
 
121
125
  self._state[workflow_id].workflow_args = workflow_args
126
+ self._state[workflow_id].last_updated_timestamp = datetime.now()
122
127
 
123
128
  async def _get_state(self, workflow_args: Dict[str, Any]) -> ActivitiesStateType:
124
129
  """Retrieve the state for the current workflow.
@@ -142,6 +147,15 @@ class ActivitiesInterface(ABC, Generic[ActivitiesStateType]):
142
147
  workflow_id = get_workflow_id()
143
148
  if workflow_id not in self._state:
144
149
  await self._set_state(workflow_args)
150
+
151
+ else:
152
+ current_timestamp = datetime.now()
153
+ # if difference of current_timestamp and last_updated_timestamp is greater than 15 minutes, then again _set_state
154
+ last_updated = self._state[workflow_id].last_updated_timestamp
155
+ if last_updated and current_timestamp - last_updated > timedelta(
156
+ minutes=15
157
+ ):
158
+ await self._set_state(workflow_args)
145
159
  return self._state[workflow_id]
146
160
  except OrchestratorError as e:
147
161
  logger.error(
@@ -1,4 +1,5 @@
1
1
  import os
2
+ from datetime import datetime
2
3
  from typing import (
3
4
  TYPE_CHECKING,
4
5
  Any,
@@ -60,6 +61,7 @@ class BaseSQLMetadataExtractionActivitiesState(ActivitiesState):
60
61
  sql_client: Optional[BaseSQLClient] = None
61
62
  handler: Optional[BaseSQLHandler] = None
62
63
  transformer: Optional[TransformerInterface] = None
64
+ last_updated_timestamp: Optional[datetime] = None
63
65
 
64
66
 
65
67
  class BaseSQLMetadataExtractionActivities(ActivitiesInterface):
@@ -149,13 +151,30 @@ class BaseSQLMetadataExtractionActivities(ActivitiesInterface):
149
151
 
150
152
  Args:
151
153
  workflow_args (Dict[str, Any]): Arguments passed to the workflow.
154
+
155
+ Note:
156
+ This method creates and configures the new SQL client before closing
157
+ the old one to ensure state is never left with a closed client if
158
+ initialization fails. The timestamp is only updated after the new
159
+ client is successfully created and assigned.
152
160
  """
153
161
  workflow_id = get_workflow_id()
154
162
  if not self._state.get(workflow_id):
155
163
  self._state[workflow_id] = BaseSQLMetadataExtractionActivitiesState()
156
164
 
157
- await super()._set_state(workflow_args)
165
+ existing_state = self._state[workflow_id]
166
+
167
+ # Update workflow_args early, but preserve old timestamp until new client is ready
168
+ # This ensures that if initialization fails, the state can still be refreshed
169
+ existing_state.workflow_args = workflow_args
170
+
171
+ # Store reference to old client for cleanup after new client is ready
172
+ old_sql_client = None
173
+ if existing_state and existing_state.sql_client is not None:
174
+ old_sql_client = existing_state.sql_client
158
175
 
176
+ # Create and configure new client BEFORE closing old one
177
+ # This ensures state is never left with a closed client if initialization fails
159
178
  sql_client = self.sql_client_class()
160
179
 
161
180
  # Load credentials BEFORE creating handler to avoid race condition
@@ -165,10 +184,29 @@ class BaseSQLMetadataExtractionActivities(ActivitiesInterface):
165
184
  )
166
185
  await sql_client.load(credentials)
167
186
 
168
- # Assign sql_client and handler to state AFTER credentials are loaded
187
+ # Only after new client is successfully created and configured,
188
+ # close old client and assign new one to state
189
+ if old_sql_client is not None:
190
+ try:
191
+ await old_sql_client.close()
192
+ logger.debug(
193
+ f"Closed existing SQL client for workflow {workflow_id} during state refresh"
194
+ )
195
+ except Exception as e:
196
+ logger.warning(
197
+ f"Failed to close existing SQL client for workflow {workflow_id}: {e}",
198
+ exc_info=True,
199
+ )
200
+ # Continue even if close fails - new client is already ready
201
+
202
+ # Assign sql_client and handler to state AFTER new client is ready
169
203
  self._state[workflow_id].sql_client = sql_client
170
204
  handler = self.handler_class(sql_client)
171
205
  self._state[workflow_id].handler = handler
206
+ # Update timestamp only after successful client creation and assignment
207
+ # This ensures that if initialization fails, the old timestamp remains
208
+ # and the state can be refreshed again immediately
209
+ self._state[workflow_id].last_updated_timestamp = datetime.now()
172
210
 
173
211
  # Create transformer with required parameters from ApplicationConstants
174
212
  transformer_params = {
@@ -0,0 +1,6 @@
1
+ """Azure client module for the application-sdk framework."""
2
+
3
+ # Azure Management API endpoint for token acquisition
4
+ AZURE_MANAGEMENT_API_ENDPOINT = "https://management.azure.com/.default"
5
+
6
+ __all__ = ["AZURE_MANAGEMENT_API_ENDPOINT"]
@@ -0,0 +1,288 @@
1
+ """
2
+ Azure authentication provider for the application-sdk framework.
3
+
4
+ This module provides the AzureAuthProvider class that handles Azure
5
+ Service Principal authentication for the application-sdk framework.
6
+
7
+ Example:
8
+ >>> from application_sdk.clients.azure.auth import AzureAuthProvider
9
+ >>> import asyncio
10
+ >>>
11
+ >>> # Create authentication provider
12
+ >>> auth_provider = AzureAuthProvider()
13
+ >>>
14
+ >>> # Authenticate with Service Principal credentials
15
+ >>> credentials = {
16
+ ... "tenant_id": "your-tenant-id",
17
+ ... "client_id": "your-client-id",
18
+ ... "client_secret": "your-client-secret"
19
+ ... }
20
+ >>>
21
+ >>> # Create credential
22
+ >>> credential = await auth_provider.create_credential(
23
+ ... auth_type="service_principal",
24
+ ... credentials=credentials
25
+ ... )
26
+ >>>
27
+ >>> # Alternative credential key formats are also supported
28
+ >>> alt_credentials = {
29
+ ... "tenantId": "your-tenant-id", # camelCase
30
+ ... "clientId": "your-client-id", # camelCase
31
+ ... "clientSecret": "your-client-secret" # camelCase
32
+ ... }
33
+ >>>
34
+ >>> credential = await auth_provider.create_credential(
35
+ ... auth_type="service_principal",
36
+ ... credentials=alt_credentials
37
+ ... )
38
+ >>>
39
+ >>> # Error handling for missing credentials
40
+ >>> try:
41
+ ... await auth_provider.create_credential(
42
+ ... auth_type="service_principal",
43
+ ... credentials={"tenant_id": "only-tenant"} # Missing client_id and client_secret
44
+ ... )
45
+ ... except CommonError as e:
46
+ ... print(f"Authentication failed: {e}")
47
+ ... # Output: Authentication failed: Missing required credential keys: client_id, client_secret
48
+ >>>
49
+ >>> # Unsupported authentication type
50
+ >>> try:
51
+ ... await auth_provider.create_credential(
52
+ ... auth_type="unsupported_type",
53
+ ... credentials=credentials
54
+ ... )
55
+ ... except CommonError as e:
56
+ ... print(f"Authentication failed: {e}")
57
+ ... # Output: Authentication failed: Only 'service_principal' authentication is supported. Received: unsupported_type
58
+ """
59
+
60
+ from typing import Any, Dict, Optional
61
+
62
+ from azure.core.credentials import TokenCredential
63
+ from azure.core.exceptions import ClientAuthenticationError
64
+ from azure.identity import ClientSecretCredential
65
+ from pydantic import BaseModel, ConfigDict, Field, ValidationError
66
+
67
+ from application_sdk.clients.azure import AZURE_MANAGEMENT_API_ENDPOINT
68
+ from application_sdk.common.error_codes import CommonError
69
+ from application_sdk.common.utils import run_sync
70
+ from application_sdk.observability.logger_adaptor import get_logger
71
+
72
+ logger = get_logger(__name__)
73
+
74
+
75
+ class ServicePrincipalCredentials(BaseModel):
76
+ """
77
+ Pydantic model for Azure Service Principal credentials.
78
+
79
+ Supports both snake_case and camelCase field names through field aliases.
80
+ All fields are required for service principal authentication.
81
+
82
+ Attributes:
83
+ tenant_id: Azure tenant ID (also accepts 'tenantId').
84
+ client_id: Azure client ID (also accepts 'clientId').
85
+ client_secret: Azure client secret (also accepts 'clientSecret').
86
+ """
87
+
88
+ tenant_id: str = Field(
89
+ ...,
90
+ alias="tenantId",
91
+ description="Azure tenant ID for service principal authentication",
92
+ )
93
+ client_id: str = Field(
94
+ ...,
95
+ alias="clientId",
96
+ description="Azure client ID for service principal authentication",
97
+ )
98
+ client_secret: str = Field(
99
+ ...,
100
+ alias="clientSecret",
101
+ description="Azure client secret for service principal authentication",
102
+ )
103
+
104
+ model_config = ConfigDict(
105
+ populate_by_name=True, # Allow both field name and alias
106
+ extra="ignore", # Ignore additional fields (Azure client may need extra fields like storage_account_name, network_config, etc.)
107
+ validate_assignment=True, # Validate on assignment
108
+ )
109
+
110
+
111
+ class AzureAuthProvider:
112
+ """
113
+ Azure authentication provider for handling Service Principal authentication.
114
+
115
+ This class provides a unified interface for creating Azure credentials
116
+ using Service Principal authentication with Azure SDK.
117
+
118
+ Supported authentication method:
119
+ - service_principal: Using client ID, client secret, and tenant ID
120
+ """
121
+
122
+ def __init__(self):
123
+ """Initialize the Azure authentication provider."""
124
+ pass
125
+
126
+ async def create_credential(
127
+ self,
128
+ auth_type: str = "service_principal",
129
+ credentials: Optional[Dict[str, Any]] = None,
130
+ ) -> TokenCredential:
131
+ """
132
+ Create Azure credential using Service Principal authentication.
133
+
134
+ Args:
135
+ auth_type (str): Type of authentication to use.
136
+ Currently only supports 'service_principal'.
137
+ credentials (Optional[Dict[str, Any]]): Service Principal credentials.
138
+ Required fields: tenant_id, client_id, client_secret.
139
+
140
+ Returns:
141
+ TokenCredential: Azure credential instance.
142
+
143
+ Raises:
144
+ CommonError: If authentication type is not supported or credentials are invalid.
145
+ ClientAuthenticationError: If credential creation fails.
146
+ """
147
+ try:
148
+ logger.debug(f"Creating Azure credential with auth type: {auth_type}")
149
+
150
+ if auth_type.lower() != "service_principal":
151
+ raise CommonError(
152
+ f"{CommonError.CREDENTIALS_PARSE_ERROR}: "
153
+ f"Only 'service_principal' authentication is supported. "
154
+ f"Received: {auth_type}"
155
+ )
156
+
157
+ if not credentials:
158
+ raise CommonError(
159
+ f"{CommonError.CREDENTIALS_PARSE_ERROR}: "
160
+ "Credentials required for service principal authentication"
161
+ )
162
+
163
+ return await self._create_service_principal_credential(credentials)
164
+
165
+ except ClientAuthenticationError as e:
166
+ logger.error(f"Azure authentication failed: {str(e)}")
167
+ raise CommonError(f"{CommonError.AZURE_CREDENTIAL_ERROR}: {str(e)}")
168
+ except ValueError as e:
169
+ logger.error(f"Invalid Azure credential parameters: {str(e)}")
170
+ raise CommonError(
171
+ f"{CommonError.CREDENTIALS_PARSE_ERROR}: Invalid credential parameters - {str(e)}"
172
+ )
173
+ except TypeError as e:
174
+ logger.error(f"Wrong Azure credential parameter types: {str(e)}")
175
+ raise CommonError(
176
+ f"{CommonError.CREDENTIALS_PARSE_ERROR}: Invalid credential parameter types - {str(e)}"
177
+ )
178
+ except Exception as e:
179
+ logger.error(f"Unexpected error creating Azure credential: {str(e)}")
180
+ raise CommonError(
181
+ f"{CommonError.CREDENTIALS_PARSE_ERROR}: Unexpected error - {str(e)}"
182
+ )
183
+
184
+ async def _create_service_principal_credential(
185
+ self, credentials: Dict[str, Any]
186
+ ) -> ClientSecretCredential:
187
+ """
188
+ Create service principal credential.
189
+
190
+ Args:
191
+ credentials (Dict[str, Any]): Service principal credentials.
192
+ Must include tenant_id, client_id, and client_secret.
193
+
194
+ Returns:
195
+ ClientSecretCredential: Service principal credential.
196
+
197
+ Raises:
198
+ CommonError: If required credentials are missing or invalid.
199
+ """
200
+ if not credentials:
201
+ raise CommonError(
202
+ f"{CommonError.CREDENTIALS_PARSE_ERROR}: "
203
+ "Credentials required for service principal authentication"
204
+ )
205
+
206
+ try:
207
+ # Validate credentials using Pydantic model
208
+ validated_credentials = ServicePrincipalCredentials(**credentials)
209
+ except ValidationError as e:
210
+ # Pydantic provides detailed error messages for all validation errors
211
+ # Format errors into a user-friendly message
212
+ error_details = "; ".join(
213
+ [
214
+ f"{'.'.join(str(loc) for loc in err['loc'])}: {err['msg']}"
215
+ for err in e.errors()
216
+ ]
217
+ )
218
+ error_message = f"Invalid credential parameters: {error_details}"
219
+ logger.error(f"Azure credential validation failed: {error_message}")
220
+ raise CommonError(f"{CommonError.CREDENTIALS_PARSE_ERROR}: {error_message}")
221
+
222
+ logger.debug(
223
+ f"Creating service principal credential for tenant: {validated_credentials.tenant_id}"
224
+ )
225
+
226
+ try:
227
+ return await run_sync(ClientSecretCredential)(
228
+ validated_credentials.tenant_id,
229
+ validated_credentials.client_id,
230
+ validated_credentials.client_secret,
231
+ )
232
+ except ValueError as e:
233
+ logger.error(f"Invalid Azure credential parameters: {str(e)}")
234
+ raise CommonError(
235
+ f"{CommonError.CREDENTIALS_PARSE_ERROR}: Invalid credential parameters - {str(e)}"
236
+ )
237
+ except TypeError as e:
238
+ logger.error(f"Wrong Azure credential parameter types: {str(e)}")
239
+ raise CommonError(
240
+ f"{CommonError.CREDENTIALS_PARSE_ERROR}: Invalid credential parameter types - {str(e)}"
241
+ )
242
+ except ClientAuthenticationError as e:
243
+ logger.error(f"Azure authentication failed: {str(e)}")
244
+ raise CommonError(f"{CommonError.AZURE_CREDENTIAL_ERROR}: {str(e)}")
245
+ except Exception as e:
246
+ logger.error(f"Unexpected error creating Azure credential: {str(e)}")
247
+ raise CommonError(
248
+ f"{CommonError.CREDENTIALS_PARSE_ERROR}: Unexpected error - {str(e)}"
249
+ )
250
+
251
+ async def validate_credential(self, credential: TokenCredential) -> bool:
252
+ """
253
+ Validate Azure credential by attempting to get a token.
254
+
255
+ Args:
256
+ credential (TokenCredential): Azure credential to validate.
257
+
258
+ Returns:
259
+ bool: True if credential is valid, False otherwise.
260
+ """
261
+ try:
262
+ logger.debug("Validating Azure credential")
263
+
264
+ # Try to get a token for Azure Management API
265
+ token = await run_sync(credential.get_token)(AZURE_MANAGEMENT_API_ENDPOINT)
266
+
267
+ if token and hasattr(token, "token"):
268
+ logger.debug("Azure credential validation successful")
269
+ return True
270
+ else:
271
+ logger.warning("Azure credential validation failed: No token received")
272
+ return False
273
+
274
+ except ClientAuthenticationError as e:
275
+ logger.error(
276
+ f"Azure credential validation failed - authentication error: {str(e)}"
277
+ )
278
+ return False
279
+ except ValueError as e:
280
+ logger.error(
281
+ f"Azure credential validation failed - invalid parameters: {str(e)}"
282
+ )
283
+ return False
284
+ except Exception as e:
285
+ logger.error(
286
+ f"Azure credential validation failed - unexpected error: {str(e)}"
287
+ )
288
+ return False