scalekit-sdk-python 2.5.0__tar.gz → 2.6.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 (231) hide show
  1. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/PKG-INFO +1 -1
  2. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/_version.py +1 -1
  3. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/client.py +28 -9
  4. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/core.py +1 -1
  5. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/directory.py +1 -1
  6. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/m2m_client.py +1 -1
  7. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/organization.py +10 -3
  8. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/role.py +26 -8
  9. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit_sdk_python.egg-info/PKG-INFO +1 -1
  10. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_m2m_client.py +12 -5
  11. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_organization.py +7 -0
  12. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_roles.py +28 -0
  13. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_users.py +38 -32
  14. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/LICENSE +0 -0
  15. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/README.md +0 -0
  16. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/__init__.py +0 -0
  17. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/__init__.py +0 -0
  18. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/expression_pb2.py +0 -0
  19. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/expression_pb2.pyi +0 -0
  20. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/expression_pb2_grpc.py +0 -0
  21. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/priv/__init__.py +0 -0
  22. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/priv/private_pb2.py +0 -0
  23. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/priv/private_pb2.pyi +0 -0
  24. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/priv/private_pb2_grpc.py +0 -0
  25. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/validate_pb2.py +0 -0
  26. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/validate_pb2.pyi +0 -0
  27. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/buf/validate/validate_pb2_grpc.py +0 -0
  28. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/pyproject.toml +0 -0
  29. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/__init__.py +0 -0
  30. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/__init__.py +0 -0
  31. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/actions.py +0 -0
  32. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/frameworks/__init__.py +0 -0
  33. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/frameworks/google_adk.py +0 -0
  34. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/frameworks/langchain.py +0 -0
  35. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/frameworks/types/__init__.py +0 -0
  36. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/frameworks/types/google_adk_tool.py +0 -0
  37. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/frameworks/util.py +0 -0
  38. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/__init__.py +0 -0
  39. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/mcp_config.py +0 -0
  40. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/mcp_instance.py +0 -0
  41. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/requests/__init__.py +0 -0
  42. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/requests/create_connected_account_request.py +0 -0
  43. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/requests/mcp_request.py +0 -0
  44. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/requests/tool_request.py +0 -0
  45. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/requests/update_connected_account_request.py +0 -0
  46. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/__init__.py +0 -0
  47. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/create_connected_account_response.py +0 -0
  48. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/create_mcp_config_response.py +0 -0
  49. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/create_mcp_response.py +0 -0
  50. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/delete_connected_account_response.py +0 -0
  51. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/delete_mcp_config_response.py +0 -0
  52. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/delete_mcp_instance_response.py +0 -0
  53. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/ensure_mcp_instance_response.py +0 -0
  54. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/execute_tool_response.py +0 -0
  55. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/get_connected_account_auth_response.py +0 -0
  56. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/get_mcp_instance_auth_state_response.py +0 -0
  57. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/get_mcp_instance_response.py +0 -0
  58. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/get_mcp_response.py +0 -0
  59. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/list_connected_accounts_response.py +0 -0
  60. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/list_mcp_configs_response.py +0 -0
  61. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/list_mcp_instances_response.py +0 -0
  62. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/magic_link_response.py +0 -0
  63. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/update_connected_account_response.py +0 -0
  64. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/update_mcp_config_response.py +0 -0
  65. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/responses/update_mcp_instance_response.py +0 -0
  66. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/tool_input_output.py +0 -0
  67. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/models/tool_mapping.py +0 -0
  68. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/modifier.py +0 -0
  69. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/actions/types.py +0 -0
  70. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/auth.py +0 -0
  71. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/common/__init__.py +0 -0
  72. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/common/exceptions.py +0 -0
  73. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/common/scalekit.py +0 -0
  74. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/common/user.py +0 -0
  75. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/connected_accounts.py +0 -0
  76. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/connection.py +0 -0
  77. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/constants/__init__.py +0 -0
  78. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/constants/user.py +0 -0
  79. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/domain.py +0 -0
  80. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/mcp.py +0 -0
  81. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/passwordless.py +0 -0
  82. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/permissions.py +0 -0
  83. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/sessions.py +0 -0
  84. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/token.py +0 -0
  85. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/tools.py +0 -0
  86. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/users.py +0 -0
  87. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/utils/__init__.py +0 -0
  88. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/utils/directory.py +0 -0
  89. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/__init__.py +0 -0
  90. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auditlogs/__init__.py +0 -0
  91. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auditlogs/auditlogs_pb2.py +0 -0
  92. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auditlogs/auditlogs_pb2.pyi +0 -0
  93. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auditlogs/auditlogs_pb2_grpc.py +0 -0
  94. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/__init__.py +0 -0
  95. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/auth_pb2.py +0 -0
  96. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/auth_pb2.pyi +0 -0
  97. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/auth_pb2_grpc.py +0 -0
  98. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/passwordless_pb2.py +0 -0
  99. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/passwordless_pb2.pyi +0 -0
  100. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/passwordless_pb2_grpc.py +0 -0
  101. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/totp_pb2.py +0 -0
  102. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/totp_pb2.pyi +0 -0
  103. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/totp_pb2_grpc.py +0 -0
  104. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/webauthn_pb2.py +0 -0
  105. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/webauthn_pb2.pyi +0 -0
  106. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/auth/webauthn_pb2_grpc.py +0 -0
  107. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/clients/__init__.py +0 -0
  108. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/clients/clients_pb2.py +0 -0
  109. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/clients/clients_pb2.pyi +0 -0
  110. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/clients/clients_pb2_grpc.py +0 -0
  111. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/commons/__init__.py +0 -0
  112. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/commons/commons_pb2.py +0 -0
  113. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/commons/commons_pb2.pyi +0 -0
  114. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/commons/commons_pb2_grpc.py +0 -0
  115. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/connected_accounts/__init__.py +0 -0
  116. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/connected_accounts/connected_accounts_pb2.py +0 -0
  117. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/connected_accounts/connected_accounts_pb2.pyi +0 -0
  118. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/connected_accounts/connected_accounts_pb2_grpc.py +0 -0
  119. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/connections/__init__.py +0 -0
  120. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/connections/connections_pb2.py +0 -0
  121. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/connections/connections_pb2.pyi +0 -0
  122. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/connections/connections_pb2_grpc.py +0 -0
  123. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/directories/__init__.py +0 -0
  124. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/directories/directories_pb2.py +0 -0
  125. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/directories/directories_pb2.pyi +0 -0
  126. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/directories/directories_pb2_grpc.py +0 -0
  127. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/domains/__init__.py +0 -0
  128. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/domains/domains_pb2.py +0 -0
  129. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/domains/domains_pb2.pyi +0 -0
  130. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/domains/domains_pb2_grpc.py +0 -0
  131. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/emails/__init__.py +0 -0
  132. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/emails/emails_pb2.py +0 -0
  133. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/emails/emails_pb2.pyi +0 -0
  134. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/emails/emails_pb2_grpc.py +0 -0
  135. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/environments/__init__.py +0 -0
  136. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/environments/environments_pb2.py +0 -0
  137. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/environments/environments_pb2.pyi +0 -0
  138. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/environments/environments_pb2_grpc.py +0 -0
  139. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/errdetails/__init__.py +0 -0
  140. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/errdetails/errdetails_pb2.py +0 -0
  141. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/errdetails/errdetails_pb2.pyi +0 -0
  142. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/errdetails/errdetails_pb2_grpc.py +0 -0
  143. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/events/__init__.py +0 -0
  144. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/events/events_pb2.py +0 -0
  145. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/events/events_pb2.pyi +0 -0
  146. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/events/events_pb2_grpc.py +0 -0
  147. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/interceptors/__init__.py +0 -0
  148. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/interceptors/interceptors_pb2.py +0 -0
  149. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/interceptors/interceptors_pb2.pyi +0 -0
  150. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/interceptors/interceptors_pb2_grpc.py +0 -0
  151. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/mcp/__init__.py +0 -0
  152. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/mcp/mcp_pb2.py +0 -0
  153. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/mcp/mcp_pb2.pyi +0 -0
  154. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/mcp/mcp_pb2_grpc.py +0 -0
  155. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/members/__init__.py +0 -0
  156. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/members/members_pb2.py +0 -0
  157. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/members/members_pb2.pyi +0 -0
  158. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/members/members_pb2_grpc.py +0 -0
  159. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/migrations/__init__.py +0 -0
  160. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/migrations/migrations_pb2.py +0 -0
  161. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/migrations/migrations_pb2.pyi +0 -0
  162. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/migrations/migrations_pb2_grpc.py +0 -0
  163. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/options/__init__.py +0 -0
  164. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/options/options_pb2.py +0 -0
  165. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/options/options_pb2.pyi +0 -0
  166. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/options/options_pb2_grpc.py +0 -0
  167. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/organizations/__init__.py +0 -0
  168. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/organizations/organizations_pb2.py +0 -0
  169. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/organizations/organizations_pb2.pyi +0 -0
  170. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/organizations/organizations_pb2_grpc.py +0 -0
  171. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/providers/__init__.py +0 -0
  172. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/providers/providers_pb2.py +0 -0
  173. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/providers/providers_pb2.pyi +0 -0
  174. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/providers/providers_pb2_grpc.py +0 -0
  175. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/roles/__init__.py +0 -0
  176. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/roles/roles_pb2.py +0 -0
  177. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/roles/roles_pb2.pyi +0 -0
  178. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/roles/roles_pb2_grpc.py +0 -0
  179. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/secrets/__init__.py +0 -0
  180. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/secrets/secrets_pb2.py +0 -0
  181. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/secrets/secrets_pb2.pyi +0 -0
  182. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/secrets/secrets_pb2_grpc.py +0 -0
  183. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/sessions/__init__.py +0 -0
  184. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/sessions/sessions_pb2.py +0 -0
  185. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/sessions/sessions_pb2.pyi +0 -0
  186. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/sessions/sessions_pb2_grpc.py +0 -0
  187. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/tokens/__init__.py +0 -0
  188. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/tokens/tokens_pb2.py +0 -0
  189. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/tokens/tokens_pb2.pyi +0 -0
  190. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/tokens/tokens_pb2_grpc.py +0 -0
  191. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/tools/__init__.py +0 -0
  192. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/tools/tools_pb2.py +0 -0
  193. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/tools/tools_pb2.pyi +0 -0
  194. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/tools/tools_pb2_grpc.py +0 -0
  195. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/user_attributes/__init__.py +0 -0
  196. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/user_attributes/user_attributes_pb2.py +0 -0
  197. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/user_attributes/user_attributes_pb2.pyi +0 -0
  198. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/user_attributes/user_attributes_pb2_grpc.py +0 -0
  199. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/users/__init__.py +0 -0
  200. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/users/users_pb2.py +0 -0
  201. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/users/users_pb2.pyi +0 -0
  202. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/users/users_pb2_grpc.py +0 -0
  203. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/webhooks/__init__.py +0 -0
  204. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/webhooks/webhooks_pb2.py +0 -0
  205. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/webhooks/webhooks_pb2.pyi +0 -0
  206. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/webhooks/webhooks_pb2_grpc.py +0 -0
  207. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/workspaces/__init__.py +0 -0
  208. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/workspaces/workspaces_pb2.py +0 -0
  209. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/workspaces/workspaces_pb2.pyi +0 -0
  210. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/v1/workspaces/workspaces_pb2_grpc.py +0 -0
  211. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit/webauthn.py +0 -0
  212. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit_sdk_python.egg-info/SOURCES.txt +0 -0
  213. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit_sdk_python.egg-info/dependency_links.txt +0 -0
  214. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit_sdk_python.egg-info/requires.txt +0 -0
  215. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/scalekit_sdk_python.egg-info/top_level.txt +0 -0
  216. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/setup.cfg +0 -0
  217. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/setup.py +0 -0
  218. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/basetest.py +0 -0
  219. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_actions.py +0 -0
  220. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_connected_accounts.py +0 -0
  221. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_connection.py +0 -0
  222. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_directory.py +0 -0
  223. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_domain.py +0 -0
  224. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_mcp.py +0 -0
  225. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_org_roles.py +0 -0
  226. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_passwordless.py +0 -0
  227. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_permissions.py +0 -0
  228. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_sessions.py +0 -0
  229. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_tokens.py +0 -0
  230. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_tools.py +0 -0
  231. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.0}/tests/test_webauthn_credentials.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scalekit-sdk-python
3
- Version: 2.5.0
3
+ Version: 2.6.0
4
4
  Summary: Scalekit official Python SDK
5
5
  Home-page: https://github.com/scalekit-inc/scalekit-sdk-python
6
6
  Author: Team Scalekit
@@ -1,3 +1,3 @@
1
1
  # Single source of truth for the SDK version.
2
2
  # Import this in setup.py and scalekit/core.py — never hardcode the version elsewhere.
3
- __version__ = "2.5.0"
3
+ __version__ = "2.6.0"
@@ -1,3 +1,4 @@
1
+ from __future__ import annotations
1
2
  import json
2
3
  from math import floor
3
4
  from typing import Any, Optional, Dict
@@ -203,7 +204,7 @@ class ScalekitClient:
203
204
  except Exception:
204
205
  return False
205
206
 
206
- def generate_client_token(self, client_id: str, client_secret: str) -> str:
207
+ def generate_client_token(self, client_id: str, client_secret: str, scopes: Optional[list[str]] = None) -> str:
207
208
  """
208
209
  Method to generate access token
209
210
 
@@ -211,22 +212,40 @@ class ScalekitClient:
211
212
  :type : ``` str ```
212
213
  :param client_secret : Client Secret for access token
213
214
  :type : ``` str ```
215
+ :param scopes : Optional list of scopes to be requested in the token (e.g. ["read:users", "write:users"])
216
+ :type : ``` list[str] ```
214
217
  :returns:
215
218
  access token
216
219
  """
217
220
  try:
218
- response = self.core_client.authenticate(
219
- {
220
- "grant_type": GrantType.ClientCredentials.value,
221
- "client_id": client_id,
222
- "client_secret": client_secret,
223
- }
224
- )
221
+ payload = {
222
+ "grant_type": GrantType.ClientCredentials.value,
223
+ "client_id": client_id,
224
+ "client_secret": client_secret,
225
+ }
226
+ if scopes:
227
+ payload["scope"] = " ".join(scopes)
228
+
229
+ response = self.core_client.authenticate(payload)
225
230
  response = json.loads(response.content)
226
- return response
231
+ return response['access_token']
227
232
  except Exception as exp:
228
233
  raise exp
229
234
 
235
+ def get_client_access_token(self) -> str:
236
+ """
237
+ Method to generate an access token using the stored client credentials.
238
+
239
+ Uses the client_id and client_secret supplied to the ScalekitClient constructor.
240
+
241
+ :returns:
242
+ access token string
243
+ """
244
+ return self.generate_client_token(
245
+ self.core_client.client_id,
246
+ self.core_client.client_secret,
247
+ )
248
+
230
249
  def validate_access_token_and_get_claims(self, token: str, options: Optional[TokenValidationOptions] = None, audience = None) -> Dict[str, Any]:
231
250
  """
232
251
  Method to validate access token and get claims
@@ -28,7 +28,7 @@ class CoreClient:
28
28
  """Class definition for Core Client"""
29
29
 
30
30
  sdk_version = f"Scalekit-Python/{_sdk_version}"
31
- api_version = "20260226"
31
+ api_version = "20260310"
32
32
  user_agent = f"{sdk_version} Python/{platform.python_version()} ({platform.system()}; {platform.architecture()}"
33
33
 
34
34
  def __init__(self, env_url, client_id, client_secret):
@@ -154,7 +154,7 @@ class DirectoryClient:
154
154
  :type : ``` str ```
155
155
 
156
156
  :returns:
157
- list of directory users
157
+ list of directory groups
158
158
  """
159
159
  response = self.core_client.grpc_exec(
160
160
  self.directory_service.ListDirectoryGroups.with_call,
@@ -61,7 +61,7 @@ class M2MClient:
61
61
  :param client_id : client id
62
62
  :type : ``` str ```
63
63
  :returns:
64
- None
64
+ GetOrganizationClientResponse: The organization client details
65
65
  """
66
66
  return self.core_client.grpc_exec(
67
67
  self.client_service.GetOrganizationClient.with_call,
@@ -24,21 +24,28 @@ class OrganizationClient:
24
24
  )
25
25
 
26
26
  def list_organizations(
27
- self, page_size: int, page_token: Optional[str] = None
27
+ self,
28
+ page_size: Optional[int] = None,
29
+ page_token: Optional[str] = None,
28
30
  ) -> ListOrganizationsResponse:
29
31
  """
30
32
  Method to list organizations
31
33
 
32
- :param page_size : page size for org list fetch
34
+ :param page_size : page size for org list fetch (optional, uses server default if not provided)
33
35
  :type : ``` int ```
34
36
  :param page_token : page token for org list fetch
35
37
  :type : ``` str ```
36
38
  :returns:
37
39
  list of organizations
38
40
  """
41
+ request = ListOrganizationsRequest()
42
+ if page_size is not None:
43
+ request.page_size = page_size
44
+ if page_token is not None:
45
+ request.page_token = page_token
39
46
  return self.core_client.grpc_exec(
40
47
  self.organization_service.ListOrganization.with_call,
41
- ListOrganizationsRequest(page_size=page_size, page_token=page_token),
48
+ request,
42
49
  )
43
50
 
44
51
  def create_organization(
@@ -42,9 +42,9 @@ class RoleClient:
42
42
 
43
43
  def get_role(self, role_name: str) -> GetRoleResponse:
44
44
  """
45
- Method to get role by ID
45
+ Method to get role by name
46
46
 
47
- :param role_id : Role id to get role details
47
+ :param role_name : Role name to get role details
48
48
  :type : ``` str ```
49
49
 
50
50
  :returns:
@@ -73,9 +73,9 @@ class RoleClient:
73
73
  role: UpdateRole
74
74
  ) -> UpdateRoleResponse:
75
75
  """
76
- Method to update an existing role by ID
76
+ Method to update an existing role by name
77
77
 
78
- :param role_id : Role id to update
78
+ :param role_name : Role name to update
79
79
  :type : ``` str ```
80
80
  :param role : UpdateRole object with expected values for role update
81
81
  :type : ``` obj ```
@@ -97,9 +97,9 @@ class RoleClient:
97
97
  reassign_role_name: Optional[str] = None
98
98
  ):
99
99
  """
100
- Method to delete role by ID
100
+ Method to delete role by name
101
101
 
102
- :param role_id : Role id to be deleted
102
+ :param role_name : Role name to be deleted
103
103
  :type : ``` str ```
104
104
  :param reassign_role_name: Role name to reassign users to when deleting this role
105
105
  :type : ``` str ```
@@ -116,14 +116,32 @@ class RoleClient:
116
116
  request,
117
117
  )
118
118
 
119
+ def delete_role_base(
120
+ self,
121
+ role_name: str
122
+ ):
123
+ """
124
+ Method to delete the base inheritance relationship for an environment-level role
125
+
126
+ :param role_name : Role name to remove base relationship for
127
+ :type : ``` str ```
128
+
129
+ :returns:
130
+ None
131
+ """
132
+ return self.core_client.grpc_exec(
133
+ self.role_service.DeleteRoleBase.with_call,
134
+ DeleteRoleBaseRequest(role_name=role_name),
135
+ )
136
+
119
137
  def get_role_users_count(
120
- self,
138
+ self,
121
139
  role_name: str
122
140
  ) -> GetRoleUsersCountResponse:
123
141
  """
124
142
  Method to get the count of users associated with a role
125
143
 
126
- :param role_id : Role id to get user count for
144
+ :param role_name : Role name to get user count for
127
145
  :type : ``` str ```
128
146
 
129
147
  :returns:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scalekit-sdk-python
3
- Version: 2.5.0
3
+ Version: 2.6.0
4
4
  Summary: Scalekit official Python SDK
5
5
  Home-page: https://github.com/scalekit-inc/scalekit-sdk-python
6
6
  Author: Team Scalekit
@@ -3,6 +3,7 @@ from faker import Faker
3
3
 
4
4
  from basetest import BaseTest
5
5
  from scalekit.common.exceptions import ScalekitNotFoundException, ScalekitBadRequestException
6
+ from scalekit.common.scalekit import TokenValidationOptions
6
7
  from scalekit.v1.organizations.organizations_pb2 import CreateOrganization
7
8
  from scalekit.v1.clients.clients_pb2 import OrganizationClient
8
9
 
@@ -361,17 +362,23 @@ class TestM2MClient(BaseTest):
361
362
  client_id = create_response[0].client.client_id
362
363
  client_secret = create_response[0].plain_secret
363
364
 
364
- token_response = self.scalekit_client.generate_client_token(
365
- client_id=client_id, client_secret=client_secret
365
+ token = self.scalekit_client.generate_client_token(
366
+ client_id=client_id, client_secret=client_secret, scopes=["write", "read"]
366
367
  )
367
368
 
368
- token = token_response["access_token"]
369
369
  return token, client_id, client_secret
370
370
 
371
+ def test_get_client_access_token(self):
372
+ """ Method to test get_client_access_token uses stored credentials """
373
+ token = self.scalekit_client.get_client_access_token()
374
+ self.assertIsNotNone(token)
375
+ self.assertIsInstance(token, str)
376
+ self.assertGreater(len(token), 0)
377
+
371
378
  def test_token_validation(self):
372
379
  """ Method to test token validation """
373
380
  token, client_id, client_secret = self.__generate_token_for_org()
374
- claims = self.scalekit_client.validate_access_token_and_get_claims(token=token)
381
+ claims = self.scalekit_client.validate_access_token_and_get_claims(token=token, audience="my-own-api", options=TokenValidationOptions(required_scopes=["write", "read"]))
375
382
  self.assertIsNotNone(claims)
376
383
  self.assertIn("client_id", claims)
377
384
  self.assertIn("my-own-api", claims["aud"])
@@ -380,7 +387,7 @@ class TestM2MClient(BaseTest):
380
387
  self.assertIn("wksp_id", claims["custom_claims"])
381
388
 
382
389
  # with Audience check enforced
383
- claims = self.scalekit_client.validate_access_token_and_get_claims(token=token, audience="my-own-api")
390
+ claims = self.scalekit_client.validate_access_token_and_get_claims(token=token, audience="my-own-api", )
384
391
 
385
392
  self.assertIsNotNone(claims)
386
393
  self.assertIn("client_id", claims)
@@ -65,6 +65,13 @@ class TestOrganization(BaseTest):
65
65
  self.assertEqual(response[0].organizations[0].id, self.org_id)
66
66
  self.assertEqual(response[0].organizations[0].display_name, organization.display_name)
67
67
 
68
+ def test_list_organizations_no_params(self):
69
+ """ Method to test list organizations with no pagination params (both optional) """
70
+ response = self.scalekit_client.organization.list_organizations()
71
+ self.assertEqual(response[1].code().name, "OK")
72
+ self.assertTrue(response[0] is not None)
73
+ self.assertGreaterEqual(len(response[0].organizations), 0)
74
+
68
75
  def test_update_organization(self):
69
76
  """ Method to test update organization """
70
77
  organization = CreateOrganization(display_name=Faker().company(), external_id=Faker().uuid4())
@@ -309,6 +309,34 @@ class TestRoles(BaseTest):
309
309
  # Expected behavior - duplicate name error
310
310
  self.assertTrue(exp.message, 'duplicate key not allowed')
311
311
 
312
+ def test_delete_role_base(self):
313
+ """ Method to test deleting the base inheritance relationship for an environment-level role """
314
+ # Create a base role
315
+ base_role_name = f"test_base_role_{self.faker.unique.random_number()}"
316
+ base_role = CreateRole(
317
+ name=base_role_name,
318
+ display_name=f"Base Role {self.faker.unique.random_number()}",
319
+ description="Base role for inheritance testing"
320
+ )
321
+ self.scalekit_client.roles.create_role(role=base_role)
322
+
323
+ # Create a role that extends the base role
324
+ self.role_name = f"test_child_role_{self.faker.unique.random_number()}"
325
+ child_role = CreateRole(
326
+ name=self.role_name,
327
+ display_name=f"Child Role {self.faker.unique.random_number()}",
328
+ description="Child role extending base role",
329
+ extends=base_role_name
330
+ )
331
+ self.scalekit_client.roles.create_role(role=child_role)
332
+
333
+ # Delete the base relationship
334
+ response = self.scalekit_client.roles.delete_role_base(role_name=self.role_name)
335
+ self.assertEqual(response[1].code().name, "OK")
336
+
337
+ # Cleanup base role manually (tearDown handles child role via self.role_name)
338
+ self.scalekit_client.roles.delete_role(role_name=base_role_name)
339
+
312
340
  def test_get_role_users_count(self):
313
341
  """ Method to test get role users count """
314
342
  self.role_name = f"test_role_{self.faker.unique.random_number()}"
@@ -6,7 +6,7 @@ from scalekit.v1.users.users_pb2 import CreateUser, UpdateUser, CreateUserProfil
6
6
  from scalekit.v1.commons.commons_pb2 import Role
7
7
  from scalekit.v1.organizations.organizations_pb2 import CreateOrganization
8
8
 
9
- from scalekit.common.exceptions import ScalekitNotFoundException
9
+ from scalekit.common.exceptions import ScalekitNotFoundException, ScalekitBadRequestException
10
10
 
11
11
 
12
12
  class TestUsers(BaseTest):
@@ -511,41 +511,47 @@ class TestUsers(BaseTest):
511
511
 
512
512
  def tearDown(self):
513
513
  """ Method to clean up """
514
+ errors = []
515
+
514
516
  if self.user_id:
515
517
  try:
516
- # First try to delete membership if it exists
517
- try:
518
- self.scalekit_client.users.delete_membership(
519
- organization_id=self.org_id,
520
- user_id=self.user_id
521
- )
522
- except Exception:
523
- pass
524
-
525
- # Then try to delete the user
518
+ self.scalekit_client.users.delete_membership(
519
+ organization_id=self.org_id,
520
+ user_id=self.user_id
521
+ )
522
+ except ScalekitNotFoundException:
523
+ pass # membership may not exist — expected
524
+ except Exception as exp:
525
+ errors.append(exp)
526
+
527
+ try:
526
528
  self.scalekit_client.users.delete_user(user_id=self.user_id)
527
- except Exception:
528
- pass
529
-
529
+ except Exception as exp:
530
+ errors.append(exp)
531
+
530
532
  if self.external_id:
531
533
  try:
532
- # First try to delete membership if it exists
533
- try:
534
- self.scalekit_client.users.delete_membership_by_external_id(
535
- organization_id=self.org_id,
536
- external_id=self.external_id
537
- )
538
- except Exception:
539
- pass
540
-
541
- # Then try to delete the user
534
+ self.scalekit_client.users.delete_membership_by_external_id(
535
+ organization_id=self.org_id,
536
+ external_id=self.external_id
537
+ )
538
+ except (ScalekitNotFoundException, ScalekitBadRequestException):
539
+ pass # membership may not exist or user already deleted — expected
540
+ except Exception as exp:
541
+ errors.append(exp)
542
+
543
+ try:
542
544
  self.scalekit_client.users.delete_user_by_external_id(external_id=self.external_id)
543
- except Exception:
544
- pass
545
-
546
- # Clean up created organization
547
- try:
548
- if self.org_id:
545
+ except (ScalekitNotFoundException, ScalekitBadRequestException):
546
+ pass # user may have been deleted by the test itself — expected
547
+ except Exception as exp:
548
+ errors.append(exp)
549
+
550
+ if self.org_id:
551
+ try:
549
552
  self.scalekit_client.organization.delete_organization(organization_id=self.org_id)
550
- except Exception as exp:
551
- raise exp
553
+ except Exception as exp:
554
+ errors.append(exp)
555
+
556
+ if errors:
557
+ raise Exception(f"Errors during tearDown cleanup: {errors}")