scalekit-sdk-python 2.5.0__tar.gz → 2.6.1__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.1}/PKG-INFO +1 -1
  2. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/_version.py +1 -1
  3. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/actions.py +2 -5
  4. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/create_connected_account_request.py +1 -10
  5. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/client.py +28 -9
  6. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/core.py +1 -1
  7. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/directory.py +1 -1
  8. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/m2m_client.py +1 -1
  9. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/organization.py +10 -3
  10. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/role.py +26 -8
  11. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/PKG-INFO +1 -1
  12. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_actions.py +39 -4
  13. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_m2m_client.py +12 -5
  14. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_organization.py +7 -0
  15. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_roles.py +28 -0
  16. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_users.py +38 -32
  17. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/LICENSE +0 -0
  18. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/README.md +0 -0
  19. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/__init__.py +0 -0
  20. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/__init__.py +0 -0
  21. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/expression_pb2.py +0 -0
  22. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/expression_pb2.pyi +0 -0
  23. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/expression_pb2_grpc.py +0 -0
  24. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/priv/__init__.py +0 -0
  25. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/priv/private_pb2.py +0 -0
  26. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/priv/private_pb2.pyi +0 -0
  27. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/priv/private_pb2_grpc.py +0 -0
  28. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/validate_pb2.py +0 -0
  29. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/validate_pb2.pyi +0 -0
  30. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/validate_pb2_grpc.py +0 -0
  31. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/pyproject.toml +0 -0
  32. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/__init__.py +0 -0
  33. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/__init__.py +0 -0
  34. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/__init__.py +0 -0
  35. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/google_adk.py +0 -0
  36. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/langchain.py +0 -0
  37. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/types/__init__.py +0 -0
  38. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/types/google_adk_tool.py +0 -0
  39. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/util.py +0 -0
  40. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/__init__.py +0 -0
  41. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/mcp_config.py +0 -0
  42. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/mcp_instance.py +0 -0
  43. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/__init__.py +0 -0
  44. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/mcp_request.py +0 -0
  45. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/tool_request.py +0 -0
  46. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/update_connected_account_request.py +0 -0
  47. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/__init__.py +0 -0
  48. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/create_connected_account_response.py +0 -0
  49. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/create_mcp_config_response.py +0 -0
  50. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/create_mcp_response.py +0 -0
  51. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/delete_connected_account_response.py +0 -0
  52. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/delete_mcp_config_response.py +0 -0
  53. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/delete_mcp_instance_response.py +0 -0
  54. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/ensure_mcp_instance_response.py +0 -0
  55. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/execute_tool_response.py +0 -0
  56. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/get_connected_account_auth_response.py +0 -0
  57. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/get_mcp_instance_auth_state_response.py +0 -0
  58. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/get_mcp_instance_response.py +0 -0
  59. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/get_mcp_response.py +0 -0
  60. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/list_connected_accounts_response.py +0 -0
  61. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/list_mcp_configs_response.py +0 -0
  62. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/list_mcp_instances_response.py +0 -0
  63. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/magic_link_response.py +0 -0
  64. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/update_connected_account_response.py +0 -0
  65. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/update_mcp_config_response.py +0 -0
  66. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/update_mcp_instance_response.py +0 -0
  67. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/tool_input_output.py +0 -0
  68. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/tool_mapping.py +0 -0
  69. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/modifier.py +0 -0
  70. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/types.py +0 -0
  71. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/auth.py +0 -0
  72. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/common/__init__.py +0 -0
  73. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/common/exceptions.py +0 -0
  74. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/common/scalekit.py +0 -0
  75. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/common/user.py +0 -0
  76. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/connected_accounts.py +0 -0
  77. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/connection.py +0 -0
  78. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/constants/__init__.py +0 -0
  79. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/constants/user.py +0 -0
  80. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/domain.py +0 -0
  81. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/mcp.py +0 -0
  82. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/passwordless.py +0 -0
  83. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/permissions.py +0 -0
  84. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/sessions.py +0 -0
  85. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/token.py +0 -0
  86. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/tools.py +0 -0
  87. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/users.py +0 -0
  88. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/utils/__init__.py +0 -0
  89. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/utils/directory.py +0 -0
  90. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/__init__.py +0 -0
  91. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auditlogs/__init__.py +0 -0
  92. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auditlogs/auditlogs_pb2.py +0 -0
  93. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auditlogs/auditlogs_pb2.pyi +0 -0
  94. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auditlogs/auditlogs_pb2_grpc.py +0 -0
  95. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/__init__.py +0 -0
  96. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/auth_pb2.py +0 -0
  97. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/auth_pb2.pyi +0 -0
  98. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/auth_pb2_grpc.py +0 -0
  99. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/passwordless_pb2.py +0 -0
  100. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/passwordless_pb2.pyi +0 -0
  101. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/passwordless_pb2_grpc.py +0 -0
  102. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/totp_pb2.py +0 -0
  103. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/totp_pb2.pyi +0 -0
  104. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/totp_pb2_grpc.py +0 -0
  105. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/webauthn_pb2.py +0 -0
  106. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/webauthn_pb2.pyi +0 -0
  107. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/webauthn_pb2_grpc.py +0 -0
  108. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/clients/__init__.py +0 -0
  109. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/clients/clients_pb2.py +0 -0
  110. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/clients/clients_pb2.pyi +0 -0
  111. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/clients/clients_pb2_grpc.py +0 -0
  112. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/commons/__init__.py +0 -0
  113. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/commons/commons_pb2.py +0 -0
  114. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/commons/commons_pb2.pyi +0 -0
  115. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/commons/commons_pb2_grpc.py +0 -0
  116. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connected_accounts/__init__.py +0 -0
  117. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connected_accounts/connected_accounts_pb2.py +0 -0
  118. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connected_accounts/connected_accounts_pb2.pyi +0 -0
  119. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connected_accounts/connected_accounts_pb2_grpc.py +0 -0
  120. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connections/__init__.py +0 -0
  121. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connections/connections_pb2.py +0 -0
  122. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connections/connections_pb2.pyi +0 -0
  123. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connections/connections_pb2_grpc.py +0 -0
  124. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/directories/__init__.py +0 -0
  125. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/directories/directories_pb2.py +0 -0
  126. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/directories/directories_pb2.pyi +0 -0
  127. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/directories/directories_pb2_grpc.py +0 -0
  128. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/domains/__init__.py +0 -0
  129. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/domains/domains_pb2.py +0 -0
  130. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/domains/domains_pb2.pyi +0 -0
  131. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/domains/domains_pb2_grpc.py +0 -0
  132. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/emails/__init__.py +0 -0
  133. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/emails/emails_pb2.py +0 -0
  134. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/emails/emails_pb2.pyi +0 -0
  135. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/emails/emails_pb2_grpc.py +0 -0
  136. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/environments/__init__.py +0 -0
  137. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/environments/environments_pb2.py +0 -0
  138. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/environments/environments_pb2.pyi +0 -0
  139. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/environments/environments_pb2_grpc.py +0 -0
  140. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/errdetails/__init__.py +0 -0
  141. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/errdetails/errdetails_pb2.py +0 -0
  142. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/errdetails/errdetails_pb2.pyi +0 -0
  143. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/errdetails/errdetails_pb2_grpc.py +0 -0
  144. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/events/__init__.py +0 -0
  145. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/events/events_pb2.py +0 -0
  146. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/events/events_pb2.pyi +0 -0
  147. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/events/events_pb2_grpc.py +0 -0
  148. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/interceptors/__init__.py +0 -0
  149. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/interceptors/interceptors_pb2.py +0 -0
  150. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/interceptors/interceptors_pb2.pyi +0 -0
  151. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/interceptors/interceptors_pb2_grpc.py +0 -0
  152. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/mcp/__init__.py +0 -0
  153. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/mcp/mcp_pb2.py +0 -0
  154. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/mcp/mcp_pb2.pyi +0 -0
  155. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/mcp/mcp_pb2_grpc.py +0 -0
  156. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/members/__init__.py +0 -0
  157. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/members/members_pb2.py +0 -0
  158. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/members/members_pb2.pyi +0 -0
  159. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/members/members_pb2_grpc.py +0 -0
  160. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/migrations/__init__.py +0 -0
  161. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/migrations/migrations_pb2.py +0 -0
  162. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/migrations/migrations_pb2.pyi +0 -0
  163. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/migrations/migrations_pb2_grpc.py +0 -0
  164. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/options/__init__.py +0 -0
  165. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/options/options_pb2.py +0 -0
  166. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/options/options_pb2.pyi +0 -0
  167. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/options/options_pb2_grpc.py +0 -0
  168. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/organizations/__init__.py +0 -0
  169. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/organizations/organizations_pb2.py +0 -0
  170. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/organizations/organizations_pb2.pyi +0 -0
  171. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/organizations/organizations_pb2_grpc.py +0 -0
  172. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/providers/__init__.py +0 -0
  173. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/providers/providers_pb2.py +0 -0
  174. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/providers/providers_pb2.pyi +0 -0
  175. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/providers/providers_pb2_grpc.py +0 -0
  176. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/roles/__init__.py +0 -0
  177. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/roles/roles_pb2.py +0 -0
  178. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/roles/roles_pb2.pyi +0 -0
  179. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/roles/roles_pb2_grpc.py +0 -0
  180. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/secrets/__init__.py +0 -0
  181. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/secrets/secrets_pb2.py +0 -0
  182. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/secrets/secrets_pb2.pyi +0 -0
  183. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/secrets/secrets_pb2_grpc.py +0 -0
  184. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/sessions/__init__.py +0 -0
  185. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/sessions/sessions_pb2.py +0 -0
  186. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/sessions/sessions_pb2.pyi +0 -0
  187. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/sessions/sessions_pb2_grpc.py +0 -0
  188. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tokens/__init__.py +0 -0
  189. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tokens/tokens_pb2.py +0 -0
  190. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tokens/tokens_pb2.pyi +0 -0
  191. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tokens/tokens_pb2_grpc.py +0 -0
  192. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tools/__init__.py +0 -0
  193. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tools/tools_pb2.py +0 -0
  194. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tools/tools_pb2.pyi +0 -0
  195. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tools/tools_pb2_grpc.py +0 -0
  196. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/user_attributes/__init__.py +0 -0
  197. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/user_attributes/user_attributes_pb2.py +0 -0
  198. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/user_attributes/user_attributes_pb2.pyi +0 -0
  199. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/user_attributes/user_attributes_pb2_grpc.py +0 -0
  200. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/users/__init__.py +0 -0
  201. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/users/users_pb2.py +0 -0
  202. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/users/users_pb2.pyi +0 -0
  203. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/users/users_pb2_grpc.py +0 -0
  204. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/webhooks/__init__.py +0 -0
  205. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/webhooks/webhooks_pb2.py +0 -0
  206. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/webhooks/webhooks_pb2.pyi +0 -0
  207. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/webhooks/webhooks_pb2_grpc.py +0 -0
  208. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/workspaces/__init__.py +0 -0
  209. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/workspaces/workspaces_pb2.py +0 -0
  210. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/workspaces/workspaces_pb2.pyi +0 -0
  211. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/workspaces/workspaces_pb2_grpc.py +0 -0
  212. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/webauthn.py +0 -0
  213. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/SOURCES.txt +0 -0
  214. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/dependency_links.txt +0 -0
  215. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/requires.txt +0 -0
  216. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/top_level.txt +0 -0
  217. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/setup.cfg +0 -0
  218. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/setup.py +0 -0
  219. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/basetest.py +0 -0
  220. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_connected_accounts.py +0 -0
  221. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_connection.py +0 -0
  222. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_directory.py +0 -0
  223. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_domain.py +0 -0
  224. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_mcp.py +0 -0
  225. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_org_roles.py +0 -0
  226. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_passwordless.py +0 -0
  227. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_permissions.py +0 -0
  228. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_sessions.py +0 -0
  229. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_tokens.py +0 -0
  230. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_tools.py +0 -0
  231. {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/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.1
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.1"
@@ -641,7 +641,7 @@ class ActionClient:
641
641
  :type: str
642
642
  :param identifier: Connected account identifier (required)
643
643
  :type: str
644
- :param authorization_details: Authorization details (OAuth token or static auth) (optional, empty auth will be used if not provided)
644
+ :param authorization_details: Authorization details (OAuth token or static auth) (optional)
645
645
  :type: Optional[Dict[str, Any]]
646
646
  :param organization_id: Organization ID (optional)
647
647
  :type: str
@@ -672,13 +672,10 @@ class ActionClient:
672
672
 
673
673
  except ScalekitNotFoundException:
674
674
  # Connected account doesn't exist, create a new one
675
- # Use empty authorization details if none provided
676
- auth_details = authorization_details if authorization_details is not None else {}
677
-
678
675
  return self.create_connected_account(
679
676
  connection_name=connection_name,
680
677
  identifier=identifier,
681
- authorization_details=auth_details,
678
+ authorization_details=authorization_details,
682
679
  organization_id=organization_id,
683
680
  user_id=user_id,
684
681
  api_config=api_config
@@ -14,7 +14,7 @@ class CreateConnectedAccountRequest(BaseModel):
14
14
 
15
15
  connection_name: str = Field(..., description="Connector identifier")
16
16
  identifier: str = Field(..., description="Connected account identifier")
17
- authorization_details: Dict[str, Any] = Field(default_factory=dict, description="Authorization details (OAuth token or static auth)")
17
+ authorization_details: Optional[Dict[str, Any]] = Field(None, description="Authorization details (OAuth token or static auth)")
18
18
  organization_id: Optional[str] = Field(None, description="Organization ID")
19
19
  user_id: Optional[str] = Field(None, description="User ID")
20
20
  api_config: Optional[Dict[str, Any]] = Field(None, description="Optional API configuration for the connected account")
@@ -45,15 +45,6 @@ class CreateConnectedAccountRequest(BaseModel):
45
45
  static_auth = StaticAuth(details=struct_details)
46
46
  auth_details = AuthorizationDetails(static_auth=static_auth)
47
47
 
48
- elif not self.authorization_details:
49
- # Create empty OAuth token for empty authorization details
50
- oauth_token = OauthToken(
51
- access_token="",
52
- refresh_token="",
53
- scopes=[]
54
- )
55
- auth_details = AuthorizationDetails(oauth_token=oauth_token)
56
-
57
48
  # Handle api_config if provided
58
49
  api_config_struct = None
59
50
  if self.api_config:
@@ -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.1
4
4
  Summary: Scalekit official Python SDK
5
5
  Home-page: https://github.com/scalekit-inc/scalekit-sdk-python
6
6
  Author: Team Scalekit
@@ -640,6 +640,42 @@ class TestConnect(BaseTest):
640
640
  except Exception as e:
641
641
  raise e
642
642
 
643
+ def test_get_or_create_connected_account_no_auth_details(self):
644
+ """Method to test get_or_create_connected_account creates account without authorization_details (no empty token sent)"""
645
+ import uuid
646
+
647
+ test_id = f"test_no_auth_{uuid.uuid4().hex[:8]}"
648
+
649
+ try:
650
+ # Create with no authorization_details — should NOT send an empty OAuth token
651
+ result = self.scalekit_client.connect.get_or_create_connected_account(
652
+ connection_name="GMAIL",
653
+ identifier=test_id,
654
+ )
655
+
656
+ self.assertIsNotNone(result)
657
+ self.assertIsInstance(result, CreateConnectedAccountResponse)
658
+ self.assertIsNotNone(result.connected_account)
659
+ self.assertEqual(result.connected_account.identifier, test_id)
660
+
661
+ # Calling again should return the same account, not create a second one
662
+ result2 = self.scalekit_client.connect.get_or_create_connected_account(
663
+ connection_name="GMAIL",
664
+ identifier=test_id,
665
+ )
666
+
667
+ self.assertIsNotNone(result2)
668
+ self.assertEqual(result.connected_account.id, result2.connected_account.id)
669
+
670
+ # Clean up
671
+ self.scalekit_client.connect.delete_connected_account(
672
+ connection_name="GMAIL",
673
+ identifier=test_id,
674
+ )
675
+
676
+ except Exception as e:
677
+ raise e
678
+
643
679
  def test_get_or_create_connected_account_validation(self):
644
680
  """Method to test get_or_create_connected_account parameter validation"""
645
681
  # Test missing connection_name
@@ -715,18 +751,17 @@ class TestConnect(BaseTest):
715
751
  self.assertIsNotNone(proto)
716
752
  self.assertTrue(proto.authorization_details.HasField("oauth_token"))
717
753
 
718
- # Test empty auth details
754
+ # Test no auth details — should not send any authorization_details in proto
719
755
  empty_request = CreateConnectedAccountRequest(
720
756
  connection_name="TEST",
721
757
  identifier="test_user"
722
758
  )
723
759
 
724
- self.assertEqual(empty_request.authorization_details, {})
760
+ self.assertIsNone(empty_request.authorization_details)
725
761
 
726
762
  empty_proto = empty_request.to_proto()
727
763
  self.assertIsNotNone(empty_proto)
728
- self.assertTrue(empty_proto.authorization_details.HasField("oauth_token"))
729
- self.assertEqual(empty_proto.authorization_details.oauth_token.access_token, "")
764
+ self.assertFalse(empty_proto.HasField("authorization_details"))
730
765
 
731
766
  @unittest.skip
732
767
  def test_google_adk_get_tools(self):
@@ -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}")