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.
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/PKG-INFO +1 -1
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/_version.py +1 -1
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/actions.py +2 -5
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/create_connected_account_request.py +1 -10
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/client.py +28 -9
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/core.py +1 -1
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/directory.py +1 -1
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/m2m_client.py +1 -1
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/organization.py +10 -3
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/role.py +26 -8
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/PKG-INFO +1 -1
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_actions.py +39 -4
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_m2m_client.py +12 -5
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_organization.py +7 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_roles.py +28 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_users.py +38 -32
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/LICENSE +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/README.md +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/expression_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/expression_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/expression_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/priv/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/priv/private_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/priv/private_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/priv/private_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/validate_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/validate_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/validate_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/pyproject.toml +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/google_adk.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/langchain.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/types/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/types/google_adk_tool.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/util.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/mcp_config.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/mcp_instance.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/mcp_request.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/tool_request.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/update_connected_account_request.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/create_connected_account_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/create_mcp_config_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/create_mcp_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/delete_connected_account_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/delete_mcp_config_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/delete_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/ensure_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/execute_tool_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/get_connected_account_auth_response.py +0 -0
- {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
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/get_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/get_mcp_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/list_connected_accounts_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/list_mcp_configs_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/list_mcp_instances_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/magic_link_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/update_connected_account_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/update_mcp_config_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/responses/update_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/tool_input_output.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/tool_mapping.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/modifier.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/types.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/auth.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/common/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/common/exceptions.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/common/scalekit.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/common/user.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/connected_accounts.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/connection.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/constants/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/constants/user.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/domain.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/mcp.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/passwordless.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/permissions.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/sessions.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/token.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/tools.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/users.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/utils/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/utils/directory.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auditlogs/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auditlogs/auditlogs_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auditlogs/auditlogs_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auditlogs/auditlogs_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/auth_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/auth_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/auth_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/passwordless_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/passwordless_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/passwordless_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/totp_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/totp_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/totp_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/webauthn_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/webauthn_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/auth/webauthn_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/clients/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/clients/clients_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/clients/clients_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/clients/clients_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/commons/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/commons/commons_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/commons/commons_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/commons/commons_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connected_accounts/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connected_accounts/connected_accounts_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connected_accounts/connected_accounts_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connected_accounts/connected_accounts_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connections/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connections/connections_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connections/connections_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/connections/connections_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/directories/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/directories/directories_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/directories/directories_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/directories/directories_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/domains/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/domains/domains_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/domains/domains_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/domains/domains_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/emails/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/emails/emails_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/emails/emails_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/emails/emails_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/environments/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/environments/environments_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/environments/environments_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/environments/environments_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/errdetails/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/errdetails/errdetails_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/errdetails/errdetails_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/errdetails/errdetails_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/events/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/events/events_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/events/events_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/events/events_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/interceptors/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/interceptors/interceptors_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/interceptors/interceptors_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/interceptors/interceptors_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/mcp/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/mcp/mcp_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/mcp/mcp_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/mcp/mcp_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/members/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/members/members_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/members/members_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/members/members_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/migrations/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/migrations/migrations_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/migrations/migrations_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/migrations/migrations_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/options/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/options/options_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/options/options_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/options/options_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/organizations/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/organizations/organizations_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/organizations/organizations_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/organizations/organizations_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/providers/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/providers/providers_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/providers/providers_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/providers/providers_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/roles/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/roles/roles_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/roles/roles_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/roles/roles_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/secrets/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/secrets/secrets_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/secrets/secrets_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/secrets/secrets_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/sessions/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/sessions/sessions_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/sessions/sessions_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/sessions/sessions_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tokens/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tokens/tokens_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tokens/tokens_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tokens/tokens_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tools/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tools/tools_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tools/tools_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/tools/tools_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/user_attributes/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/user_attributes/user_attributes_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/user_attributes/user_attributes_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/user_attributes/user_attributes_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/users/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/users/users_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/users/users_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/users/users_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/webhooks/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/webhooks/webhooks_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/webhooks/webhooks_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/webhooks/webhooks_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/workspaces/__init__.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/workspaces/workspaces_pb2.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/workspaces/workspaces_pb2.pyi +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/v1/workspaces/workspaces_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/webauthn.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/SOURCES.txt +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/dependency_links.txt +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/requires.txt +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit_sdk_python.egg-info/top_level.txt +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/setup.cfg +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/setup.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/basetest.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_connected_accounts.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_connection.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_directory.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_domain.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_mcp.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_org_roles.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_passwordless.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_permissions.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_sessions.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_tokens.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_tools.py +0 -0
- {scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/tests/test_webauthn_credentials.py +0 -0
|
@@ -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
|
|
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=
|
|
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(
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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 = "
|
|
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):
|
|
@@ -24,21 +24,28 @@ class OrganizationClient:
|
|
|
24
24
|
)
|
|
25
25
|
|
|
26
26
|
def list_organizations(
|
|
27
|
-
self,
|
|
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
|
-
|
|
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
|
|
45
|
+
Method to get role by name
|
|
46
46
|
|
|
47
|
-
:param
|
|
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
|
|
76
|
+
Method to update an existing role by name
|
|
77
77
|
|
|
78
|
-
:param
|
|
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
|
|
100
|
+
Method to delete role by name
|
|
101
101
|
|
|
102
|
-
:param
|
|
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
|
|
144
|
+
:param role_name : Role name to get user count for
|
|
127
145
|
:type : ``` str ```
|
|
128
146
|
|
|
129
147
|
:returns:
|
|
@@ -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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
517
|
-
|
|
518
|
-
self.
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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
|
-
|
|
529
|
-
|
|
529
|
+
except Exception as exp:
|
|
530
|
+
errors.append(exp)
|
|
531
|
+
|
|
530
532
|
if self.external_id:
|
|
531
533
|
try:
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
self.
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
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
|
|
544
|
-
pass
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
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
|
-
|
|
551
|
-
|
|
553
|
+
except Exception as exp:
|
|
554
|
+
errors.append(exp)
|
|
555
|
+
|
|
556
|
+
if errors:
|
|
557
|
+
raise Exception(f"Errors during tearDown cleanup: {errors}")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/buf/validate/priv/private_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/__init__.py
RENAMED
|
File without changes
|
{scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/google_adk.py
RENAMED
|
File without changes
|
{scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/frameworks/langchain.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/mcp_config.py
RENAMED
|
File without changes
|
{scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/mcp_instance.py
RENAMED
|
File without changes
|
{scalekit_sdk_python-2.5.0 → scalekit_sdk_python-2.6.1}/scalekit/actions/models/requests/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|