diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 4808d97..b29b3b6 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "5.1.0"
+ ".": "5.2.0"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index 9e5c2f5..e5df493 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 160
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-d45f6eec4623ab6146f79fd62b69435949b99b7cdd0c89379363d2be3ed1ac7c.yml
-openapi_spec_hash: 1f5262ae5849178b5dfd766537910ec5
+configured_endpoints: 150
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-25fffba3f78da9bb7ed2f734f4b712bbacb7f07fff37c3f7903e1047b941bede.yml
+openapi_spec_hash: ad96cd61fc43fc4840a84a93ec208842
config_hash: 0636636df2adbdea4b2e982ab5c858d4
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6004989..c0e48e8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,20 @@
# Changelog
+## 5.2.0 (2026-06-29)
+
+Full Changelog: [v5.1.0...v5.2.0](https://github.com/droidrun/mobilerun-sdk-python/compare/v5.1.0...v5.2.0)
+
+### Features
+
+* **api:** api update ([3945474](https://github.com/droidrun/mobilerun-sdk-python/commit/394547478c920f583e007fb733cda9e6c4dcc80c))
+* **api:** api update ([8b87544](https://github.com/droidrun/mobilerun-sdk-python/commit/8b875445c5e1220f17702ec1cef0d38d960848d7))
+* **api:** api update ([e6f7fac](https://github.com/droidrun/mobilerun-sdk-python/commit/e6f7facbcedbc95d47024b3b4d36851a4c292337))
+* **api:** api update ([a27ba34](https://github.com/droidrun/mobilerun-sdk-python/commit/a27ba34af6d90312d190b13d5acff3ad92516e2c))
+* **api:** api update ([949f7d6](https://github.com/droidrun/mobilerun-sdk-python/commit/949f7d6d7ca33f2a817a0b7a357a36246173a1ce))
+* **api:** api update ([faaad66](https://github.com/droidrun/mobilerun-sdk-python/commit/faaad668d436ba097cc51ff38716d0f46effafb6))
+* **api:** api update ([be4ca60](https://github.com/droidrun/mobilerun-sdk-python/commit/be4ca60c393e2a0a62a38ad3b60949e3301ad144))
+* **api:** api update ([ee37ca6](https://github.com/droidrun/mobilerun-sdk-python/commit/ee37ca601d0b87118e80f4fe38fd1e8660ed3543))
+
## 5.1.0 (2026-06-23)
Full Changelog: [v5.0.0...v5.1.0](https://github.com/droidrun/mobilerun-sdk-python/compare/v5.0.0...v5.1.0)
diff --git a/api.md b/api.md
index 1c524a7..1a26682 100644
--- a/api.md
+++ b/api.md
@@ -182,7 +182,7 @@ Methods:
- client.devices.apps.delete(package_name, \*, device_id) -> None
- client.devices.apps.install(device_id, \*\*params) -> None
- client.devices.apps.start(package_name, \*, device_id, \*\*params) -> None
-- client.devices.apps.stop(package_name, \*, device_id) -> None
+- client.devices.apps.stop(package_name, \*, device_id, \*\*params) -> None
## Esim
@@ -319,34 +319,6 @@ Methods:
- client.devices.language.get(device_id) -> LanguageGetResponse
- client.devices.language.set(device_id, \*\*params) -> None
-# Hooks
-
-Types:
-
-```python
-from mobilerun_sdk.types import (
- HookRetrieveResponse,
- HookUpdateResponse,
- HookListResponse,
- HookGetSampleDataResponse,
- HookPerformResponse,
- HookSubscribeResponse,
- HookTestResponse,
- HookUnsubscribeResponse,
-)
-```
-
-Methods:
-
-- client.hooks.retrieve(hook_id) -> HookRetrieveResponse
-- client.hooks.update(hook_id, \*\*params) -> HookUpdateResponse
-- client.hooks.list(\*\*params) -> HookListResponse
-- client.hooks.get_sample_data() -> HookGetSampleDataResponse
-- client.hooks.perform(\*\*params) -> HookPerformResponse
-- client.hooks.subscribe(\*\*params) -> HookSubscribeResponse
-- client.hooks.test(hook_id, \*\*params) -> HookTestResponse
-- client.hooks.unsubscribe(hook_id) -> HookUnsubscribeResponse
-
# Models
Types:
@@ -662,21 +634,8 @@ from mobilerun_sdk.types.workflows import EventDryRunResponse, EventIngestRespon
Methods:
-- client.workflows.events.dry_run(\*\*params) -> EventDryRunResponse
-- client.workflows.events.ingest(\*\*params) -> EventIngestResponse
-
-### Catalog
-
-Types:
-
-```python
-from mobilerun_sdk.types.workflows.events import CatalogListResponse, CatalogRegisterResponse
-```
-
-Methods:
-
-- client.workflows.events.catalog.list(\*\*params) -> CatalogListResponse
-- client.workflows.events.catalog.register(\*\*params) -> CatalogRegisterResponse
+- client.workflows.events.dry_run(\*\*params) -> EventDryRunResponse
+- client.workflows.events.ingest(\*\*params) -> EventIngestResponse
## Executions
diff --git a/pyproject.toml b/pyproject.toml
index a49aac4..f34d3f6 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "mobilerun-sdk"
-version = "5.1.0"
+version = "5.2.0"
description = "The official Python library for the mobilerun API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/mobilerun_sdk/_client.py b/src/mobilerun_sdk/_client.py
index f43b8dd..2ac5304 100644
--- a/src/mobilerun_sdk/_client.py
+++ b/src/mobilerun_sdk/_client.py
@@ -38,7 +38,6 @@
if TYPE_CHECKING:
from .resources import (
apps,
- hooks,
tasks,
models,
connect,
@@ -51,7 +50,6 @@
credentials,
)
from .resources.apps import AppsResource, AsyncAppsResource
- from .resources.hooks import HooksResource, AsyncHooksResource
from .resources.models import ModelsResource, AsyncModelsResource
from .resources.proxies import ProxiesResource, AsyncProxiesResource
from .resources.carriers import CarriersResource, AsyncCarriersResource
@@ -137,21 +135,18 @@ def __init__(
@cached_property
def apps(self) -> AppsResource:
- """App Management"""
from .resources.apps import AppsResource
return AppsResource(self)
@cached_property
def carriers(self) -> CarriersResource:
- """Mobile Carriers"""
from .resources.carriers import CarriersResource
return CarriersResource(self)
@cached_property
def credentials(self) -> CredentialsResource:
- """Vault & Secrets"""
from .resources.credentials import CredentialsResource
return CredentialsResource(self)
@@ -162,12 +157,6 @@ def devices(self) -> DevicesResource:
return DevicesResource(self)
- @cached_property
- def hooks(self) -> HooksResource:
- from .resources.hooks import HooksResource
-
- return HooksResource(self)
-
@cached_property
def models(self) -> ModelsResource:
"""LLM Models"""
@@ -183,7 +172,6 @@ def profiles(self) -> ProfilesResource:
@cached_property
def proxies(self) -> ProxiesResource:
- """Network Proxies"""
from .resources.proxies import ProxiesResource
return ProxiesResource(self)
@@ -399,21 +387,18 @@ def __init__(
@cached_property
def apps(self) -> AsyncAppsResource:
- """App Management"""
from .resources.apps import AsyncAppsResource
return AsyncAppsResource(self)
@cached_property
def carriers(self) -> AsyncCarriersResource:
- """Mobile Carriers"""
from .resources.carriers import AsyncCarriersResource
return AsyncCarriersResource(self)
@cached_property
def credentials(self) -> AsyncCredentialsResource:
- """Vault & Secrets"""
from .resources.credentials import AsyncCredentialsResource
return AsyncCredentialsResource(self)
@@ -424,12 +409,6 @@ def devices(self) -> AsyncDevicesResource:
return AsyncDevicesResource(self)
- @cached_property
- def hooks(self) -> AsyncHooksResource:
- from .resources.hooks import AsyncHooksResource
-
- return AsyncHooksResource(self)
-
@cached_property
def models(self) -> AsyncModelsResource:
"""LLM Models"""
@@ -445,7 +424,6 @@ def profiles(self) -> AsyncProfilesResource:
@cached_property
def proxies(self) -> AsyncProxiesResource:
- """Network Proxies"""
from .resources.proxies import AsyncProxiesResource
return AsyncProxiesResource(self)
@@ -607,21 +585,18 @@ def __init__(self, client: Mobilerun) -> None:
@cached_property
def apps(self) -> apps.AppsResourceWithRawResponse:
- """App Management"""
from .resources.apps import AppsResourceWithRawResponse
return AppsResourceWithRawResponse(self._client.apps)
@cached_property
def carriers(self) -> carriers.CarriersResourceWithRawResponse:
- """Mobile Carriers"""
from .resources.carriers import CarriersResourceWithRawResponse
return CarriersResourceWithRawResponse(self._client.carriers)
@cached_property
def credentials(self) -> credentials.CredentialsResourceWithRawResponse:
- """Vault & Secrets"""
from .resources.credentials import CredentialsResourceWithRawResponse
return CredentialsResourceWithRawResponse(self._client.credentials)
@@ -632,12 +607,6 @@ def devices(self) -> devices.DevicesResourceWithRawResponse:
return DevicesResourceWithRawResponse(self._client.devices)
- @cached_property
- def hooks(self) -> hooks.HooksResourceWithRawResponse:
- from .resources.hooks import HooksResourceWithRawResponse
-
- return HooksResourceWithRawResponse(self._client.hooks)
-
@cached_property
def models(self) -> models.ModelsResourceWithRawResponse:
"""LLM Models"""
@@ -653,7 +622,6 @@ def profiles(self) -> profiles.ProfilesResourceWithRawResponse:
@cached_property
def proxies(self) -> proxies.ProxiesResourceWithRawResponse:
- """Network Proxies"""
from .resources.proxies import ProxiesResourceWithRawResponse
return ProxiesResourceWithRawResponse(self._client.proxies)
@@ -692,21 +660,18 @@ def __init__(self, client: AsyncMobilerun) -> None:
@cached_property
def apps(self) -> apps.AsyncAppsResourceWithRawResponse:
- """App Management"""
from .resources.apps import AsyncAppsResourceWithRawResponse
return AsyncAppsResourceWithRawResponse(self._client.apps)
@cached_property
def carriers(self) -> carriers.AsyncCarriersResourceWithRawResponse:
- """Mobile Carriers"""
from .resources.carriers import AsyncCarriersResourceWithRawResponse
return AsyncCarriersResourceWithRawResponse(self._client.carriers)
@cached_property
def credentials(self) -> credentials.AsyncCredentialsResourceWithRawResponse:
- """Vault & Secrets"""
from .resources.credentials import AsyncCredentialsResourceWithRawResponse
return AsyncCredentialsResourceWithRawResponse(self._client.credentials)
@@ -717,12 +682,6 @@ def devices(self) -> devices.AsyncDevicesResourceWithRawResponse:
return AsyncDevicesResourceWithRawResponse(self._client.devices)
- @cached_property
- def hooks(self) -> hooks.AsyncHooksResourceWithRawResponse:
- from .resources.hooks import AsyncHooksResourceWithRawResponse
-
- return AsyncHooksResourceWithRawResponse(self._client.hooks)
-
@cached_property
def models(self) -> models.AsyncModelsResourceWithRawResponse:
"""LLM Models"""
@@ -738,7 +697,6 @@ def profiles(self) -> profiles.AsyncProfilesResourceWithRawResponse:
@cached_property
def proxies(self) -> proxies.AsyncProxiesResourceWithRawResponse:
- """Network Proxies"""
from .resources.proxies import AsyncProxiesResourceWithRawResponse
return AsyncProxiesResourceWithRawResponse(self._client.proxies)
@@ -777,21 +735,18 @@ def __init__(self, client: Mobilerun) -> None:
@cached_property
def apps(self) -> apps.AppsResourceWithStreamingResponse:
- """App Management"""
from .resources.apps import AppsResourceWithStreamingResponse
return AppsResourceWithStreamingResponse(self._client.apps)
@cached_property
def carriers(self) -> carriers.CarriersResourceWithStreamingResponse:
- """Mobile Carriers"""
from .resources.carriers import CarriersResourceWithStreamingResponse
return CarriersResourceWithStreamingResponse(self._client.carriers)
@cached_property
def credentials(self) -> credentials.CredentialsResourceWithStreamingResponse:
- """Vault & Secrets"""
from .resources.credentials import CredentialsResourceWithStreamingResponse
return CredentialsResourceWithStreamingResponse(self._client.credentials)
@@ -802,12 +757,6 @@ def devices(self) -> devices.DevicesResourceWithStreamingResponse:
return DevicesResourceWithStreamingResponse(self._client.devices)
- @cached_property
- def hooks(self) -> hooks.HooksResourceWithStreamingResponse:
- from .resources.hooks import HooksResourceWithStreamingResponse
-
- return HooksResourceWithStreamingResponse(self._client.hooks)
-
@cached_property
def models(self) -> models.ModelsResourceWithStreamingResponse:
"""LLM Models"""
@@ -823,7 +772,6 @@ def profiles(self) -> profiles.ProfilesResourceWithStreamingResponse:
@cached_property
def proxies(self) -> proxies.ProxiesResourceWithStreamingResponse:
- """Network Proxies"""
from .resources.proxies import ProxiesResourceWithStreamingResponse
return ProxiesResourceWithStreamingResponse(self._client.proxies)
@@ -862,21 +810,18 @@ def __init__(self, client: AsyncMobilerun) -> None:
@cached_property
def apps(self) -> apps.AsyncAppsResourceWithStreamingResponse:
- """App Management"""
from .resources.apps import AsyncAppsResourceWithStreamingResponse
return AsyncAppsResourceWithStreamingResponse(self._client.apps)
@cached_property
def carriers(self) -> carriers.AsyncCarriersResourceWithStreamingResponse:
- """Mobile Carriers"""
from .resources.carriers import AsyncCarriersResourceWithStreamingResponse
return AsyncCarriersResourceWithStreamingResponse(self._client.carriers)
@cached_property
def credentials(self) -> credentials.AsyncCredentialsResourceWithStreamingResponse:
- """Vault & Secrets"""
from .resources.credentials import AsyncCredentialsResourceWithStreamingResponse
return AsyncCredentialsResourceWithStreamingResponse(self._client.credentials)
@@ -887,12 +832,6 @@ def devices(self) -> devices.AsyncDevicesResourceWithStreamingResponse:
return AsyncDevicesResourceWithStreamingResponse(self._client.devices)
- @cached_property
- def hooks(self) -> hooks.AsyncHooksResourceWithStreamingResponse:
- from .resources.hooks import AsyncHooksResourceWithStreamingResponse
-
- return AsyncHooksResourceWithStreamingResponse(self._client.hooks)
-
@cached_property
def models(self) -> models.AsyncModelsResourceWithStreamingResponse:
"""LLM Models"""
@@ -908,7 +847,6 @@ def profiles(self) -> profiles.AsyncProfilesResourceWithStreamingResponse:
@cached_property
def proxies(self) -> proxies.AsyncProxiesResourceWithStreamingResponse:
- """Network Proxies"""
from .resources.proxies import AsyncProxiesResourceWithStreamingResponse
return AsyncProxiesResourceWithStreamingResponse(self._client.proxies)
diff --git a/src/mobilerun_sdk/_version.py b/src/mobilerun_sdk/_version.py
index c478aec..76bc230 100644
--- a/src/mobilerun_sdk/_version.py
+++ b/src/mobilerun_sdk/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "mobilerun_sdk"
-__version__ = "5.1.0" # x-release-please-version
+__version__ = "5.2.0" # x-release-please-version
diff --git a/src/mobilerun_sdk/resources/__init__.py b/src/mobilerun_sdk/resources/__init__.py
index a0e7538..be9be40 100644
--- a/src/mobilerun_sdk/resources/__init__.py
+++ b/src/mobilerun_sdk/resources/__init__.py
@@ -8,14 +8,6 @@
AppsResourceWithStreamingResponse,
AsyncAppsResourceWithStreamingResponse,
)
-from .hooks import (
- HooksResource,
- AsyncHooksResource,
- HooksResourceWithRawResponse,
- AsyncHooksResourceWithRawResponse,
- HooksResourceWithStreamingResponse,
- AsyncHooksResourceWithStreamingResponse,
-)
from .tasks import (
TasksResource,
AsyncTasksResource,
@@ -122,12 +114,6 @@
"AsyncDevicesResourceWithRawResponse",
"DevicesResourceWithStreamingResponse",
"AsyncDevicesResourceWithStreamingResponse",
- "HooksResource",
- "AsyncHooksResource",
- "HooksResourceWithRawResponse",
- "AsyncHooksResourceWithRawResponse",
- "HooksResourceWithStreamingResponse",
- "AsyncHooksResourceWithStreamingResponse",
"ModelsResource",
"AsyncModelsResource",
"ModelsResourceWithRawResponse",
diff --git a/src/mobilerun_sdk/resources/apps.py b/src/mobilerun_sdk/resources/apps.py
index 3e2bb8f..f9914fa 100644
--- a/src/mobilerun_sdk/resources/apps.py
+++ b/src/mobilerun_sdk/resources/apps.py
@@ -31,8 +31,6 @@
class AppsResource(SyncAPIResource):
- """App Management"""
-
@cached_property
def with_raw_response(self) -> AppsResourceWithRawResponse:
"""
@@ -336,8 +334,6 @@ def mark_failed(
class AsyncAppsResource(AsyncAPIResource):
- """App Management"""
-
@cached_property
def with_raw_response(self) -> AsyncAppsResourceWithRawResponse:
"""
diff --git a/src/mobilerun_sdk/resources/carriers.py b/src/mobilerun_sdk/resources/carriers.py
index d627159..a674b8f 100644
--- a/src/mobilerun_sdk/resources/carriers.py
+++ b/src/mobilerun_sdk/resources/carriers.py
@@ -29,8 +29,6 @@
class CarriersResource(SyncAPIResource):
- """Mobile Carriers"""
-
@cached_property
def with_raw_response(self) -> CarriersResourceWithRawResponse:
"""
@@ -419,8 +417,6 @@ def lookup(
class AsyncCarriersResource(AsyncAPIResource):
- """Mobile Carriers"""
-
@cached_property
def with_raw_response(self) -> AsyncCarriersResourceWithRawResponse:
"""
diff --git a/src/mobilerun_sdk/resources/connect/countries.py b/src/mobilerun_sdk/resources/connect/countries.py
index d6d0bf0..2780f0d 100644
--- a/src/mobilerun_sdk/resources/connect/countries.py
+++ b/src/mobilerun_sdk/resources/connect/countries.py
@@ -48,7 +48,7 @@ def list(
*,
page: int | Omit = omit,
page_size: int | Omit = omit,
- type: Literal["residential"] | Omit = omit,
+ type: Literal["dedicated_residential", "residential", "mobile"] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -119,7 +119,7 @@ async def list(
*,
page: int | Omit = omit,
page_size: int | Omit = omit,
- type: Literal["residential"] | Omit = omit,
+ type: Literal["dedicated_residential", "residential", "mobile"] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
diff --git a/src/mobilerun_sdk/resources/connect/proxies.py b/src/mobilerun_sdk/resources/connect/proxies.py
index 48d5db0..b274aaa 100644
--- a/src/mobilerun_sdk/resources/connect/proxies.py
+++ b/src/mobilerun_sdk/resources/connect/proxies.py
@@ -137,7 +137,7 @@ def buy(
self,
*,
country: str,
- type: Literal["residential"] | Omit = omit,
+ type: Literal["dedicated_residential", "residential", "mobile"] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -499,7 +499,7 @@ async def buy(
self,
*,
country: str,
- type: Literal["residential"] | Omit = omit,
+ type: Literal["dedicated_residential", "residential", "mobile"] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
diff --git a/src/mobilerun_sdk/resources/credentials/credentials.py b/src/mobilerun_sdk/resources/credentials/credentials.py
index 9276d9f..33a0594 100644
--- a/src/mobilerun_sdk/resources/credentials/credentials.py
+++ b/src/mobilerun_sdk/resources/credentials/credentials.py
@@ -30,11 +30,8 @@
class CredentialsResource(SyncAPIResource):
- """Vault & Secrets"""
-
@cached_property
def packages(self) -> PackagesResource:
- """Vault & Secrets"""
return PackagesResource(self._client)
@cached_property
@@ -69,7 +66,9 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CredentialListResponse:
"""
- List all credentials for the authenticated user
+ Returns a paginated list of all credentials belonging to the authenticated user
+ across every package. Accepts standard pagination query parameters and responds
+ with the credential items plus pagination metadata.
Args:
extra_headers: Send extra headers
@@ -100,11 +99,8 @@ def list(
class AsyncCredentialsResource(AsyncAPIResource):
- """Vault & Secrets"""
-
@cached_property
def packages(self) -> AsyncPackagesResource:
- """Vault & Secrets"""
return AsyncPackagesResource(self._client)
@cached_property
@@ -139,7 +135,9 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CredentialListResponse:
"""
- List all credentials for the authenticated user
+ Returns a paginated list of all credentials belonging to the authenticated user
+ across every package. Accepts standard pagination query parameters and responds
+ with the credential items plus pagination metadata.
Args:
extra_headers: Send extra headers
@@ -179,7 +177,6 @@ def __init__(self, credentials: CredentialsResource) -> None:
@cached_property
def packages(self) -> PackagesResourceWithRawResponse:
- """Vault & Secrets"""
return PackagesResourceWithRawResponse(self._credentials.packages)
@@ -193,7 +190,6 @@ def __init__(self, credentials: AsyncCredentialsResource) -> None:
@cached_property
def packages(self) -> AsyncPackagesResourceWithRawResponse:
- """Vault & Secrets"""
return AsyncPackagesResourceWithRawResponse(self._credentials.packages)
@@ -207,7 +203,6 @@ def __init__(self, credentials: CredentialsResource) -> None:
@cached_property
def packages(self) -> PackagesResourceWithStreamingResponse:
- """Vault & Secrets"""
return PackagesResourceWithStreamingResponse(self._credentials.packages)
@@ -221,5 +216,4 @@ def __init__(self, credentials: AsyncCredentialsResource) -> None:
@cached_property
def packages(self) -> AsyncPackagesResourceWithStreamingResponse:
- """Vault & Secrets"""
return AsyncPackagesResourceWithStreamingResponse(self._credentials.packages)
diff --git a/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py b/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py
index df12c15..afbe1bc 100644
--- a/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py
+++ b/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py
@@ -34,11 +34,8 @@
class CredentialsResource(SyncAPIResource):
- """Vault & Secrets"""
-
@cached_property
def fields(self) -> FieldsResource:
- """Vault & Secrets"""
return FieldsResource(self._client)
@cached_property
@@ -74,7 +71,9 @@ def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CredentialCreateResponse:
"""
- Create a credential with fields for a package
+ Creates a credential under the given package with a `credentialName` and at
+ least one field. Each field has a `fieldType` (email, username, password,
+ api_token, phone_number, two_factor_secret, or backup_codes) and a value.
Args:
extra_headers: Send extra headers
@@ -115,7 +114,8 @@ def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CredentialRetrieveResponse:
"""
- Get a specific credential with its fields
+ Fetches a single credential by `packageName` and `credentialName`, including all
+ of its stored fields. Returns not found if no matching credential exists.
Args:
extra_headers: Send extra headers
@@ -155,7 +155,8 @@ def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CredentialDeleteResponse:
"""
- Delete a credential and all its fields
+ Permanently deletes the credential identified by `packageName` and
+ `credentialName`, removing all of its fields. Returns the deleted credential.
Args:
extra_headers: Send extra headers
@@ -184,11 +185,8 @@ def delete(
class AsyncCredentialsResource(AsyncAPIResource):
- """Vault & Secrets"""
-
@cached_property
def fields(self) -> AsyncFieldsResource:
- """Vault & Secrets"""
return AsyncFieldsResource(self._client)
@cached_property
@@ -224,7 +222,9 @@ async def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CredentialCreateResponse:
"""
- Create a credential with fields for a package
+ Creates a credential under the given package with a `credentialName` and at
+ least one field. Each field has a `fieldType` (email, username, password,
+ api_token, phone_number, two_factor_secret, or backup_codes) and a value.
Args:
extra_headers: Send extra headers
@@ -265,7 +265,8 @@ async def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CredentialRetrieveResponse:
"""
- Get a specific credential with its fields
+ Fetches a single credential by `packageName` and `credentialName`, including all
+ of its stored fields. Returns not found if no matching credential exists.
Args:
extra_headers: Send extra headers
@@ -305,7 +306,8 @@ async def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CredentialDeleteResponse:
"""
- Delete a credential and all its fields
+ Permanently deletes the credential identified by `packageName` and
+ `credentialName`, removing all of its fields. Returns the deleted credential.
Args:
extra_headers: Send extra headers
@@ -349,7 +351,6 @@ def __init__(self, credentials: CredentialsResource) -> None:
@cached_property
def fields(self) -> FieldsResourceWithRawResponse:
- """Vault & Secrets"""
return FieldsResourceWithRawResponse(self._credentials.fields)
@@ -369,7 +370,6 @@ def __init__(self, credentials: AsyncCredentialsResource) -> None:
@cached_property
def fields(self) -> AsyncFieldsResourceWithRawResponse:
- """Vault & Secrets"""
return AsyncFieldsResourceWithRawResponse(self._credentials.fields)
@@ -389,7 +389,6 @@ def __init__(self, credentials: CredentialsResource) -> None:
@cached_property
def fields(self) -> FieldsResourceWithStreamingResponse:
- """Vault & Secrets"""
return FieldsResourceWithStreamingResponse(self._credentials.fields)
@@ -409,5 +408,4 @@ def __init__(self, credentials: AsyncCredentialsResource) -> None:
@cached_property
def fields(self) -> AsyncFieldsResourceWithStreamingResponse:
- """Vault & Secrets"""
return AsyncFieldsResourceWithStreamingResponse(self._credentials.fields)
diff --git a/src/mobilerun_sdk/resources/credentials/packages/credentials/fields.py b/src/mobilerun_sdk/resources/credentials/packages/credentials/fields.py
index 38ebfd9..34acdff 100644
--- a/src/mobilerun_sdk/resources/credentials/packages/credentials/fields.py
+++ b/src/mobilerun_sdk/resources/credentials/packages/credentials/fields.py
@@ -26,8 +26,6 @@
class FieldsResource(SyncAPIResource):
- """Vault & Secrets"""
-
@cached_property
def with_raw_response(self) -> FieldsResourceWithRawResponse:
"""
@@ -63,8 +61,11 @@ def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FieldCreateResponse:
- """
- Add a new field to an existing credential
+ """Adds a single field to an existing credential.
+
+ The body specifies a `fieldType`
+ (one of the supported field types) and its value. Returns a conflict if a field
+ of that type already exists on the credential.
Args:
extra_headers: Send extra headers
@@ -115,7 +116,9 @@ def update(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FieldUpdateResponse:
"""
- Update the value of a credential field
+ Updates the value of an existing field on a credential, identified by
+ `packageName`, `credentialName`, and `fieldType` in the path. The body carries
+ the new value and returns the updated credential.
Args:
extra_headers: Send extra headers
@@ -162,7 +165,8 @@ def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FieldDeleteResponse:
"""
- Delete a field from a credential
+ Removes a single field of the given `fieldType` from the specified credential
+ while leaving the credential itself intact. Returns the updated credential.
Args:
extra_headers: Send extra headers
@@ -194,8 +198,6 @@ def delete(
class AsyncFieldsResource(AsyncAPIResource):
- """Vault & Secrets"""
-
@cached_property
def with_raw_response(self) -> AsyncFieldsResourceWithRawResponse:
"""
@@ -231,8 +233,11 @@ async def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FieldCreateResponse:
- """
- Add a new field to an existing credential
+ """Adds a single field to an existing credential.
+
+ The body specifies a `fieldType`
+ (one of the supported field types) and its value. Returns a conflict if a field
+ of that type already exists on the credential.
Args:
extra_headers: Send extra headers
@@ -283,7 +288,9 @@ async def update(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FieldUpdateResponse:
"""
- Update the value of a credential field
+ Updates the value of an existing field on a credential, identified by
+ `packageName`, `credentialName`, and `fieldType` in the path. The body carries
+ the new value and returns the updated credential.
Args:
extra_headers: Send extra headers
@@ -330,7 +337,8 @@ async def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FieldDeleteResponse:
"""
- Delete a field from a credential
+ Removes a single field of the given `fieldType` from the specified credential
+ while leaving the credential itself intact. Returns the updated credential.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/credentials/packages/packages.py b/src/mobilerun_sdk/resources/credentials/packages/packages.py
index 135ccdd..d82ed0e 100644
--- a/src/mobilerun_sdk/resources/credentials/packages/packages.py
+++ b/src/mobilerun_sdk/resources/credentials/packages/packages.py
@@ -31,11 +31,8 @@
class PackagesResource(SyncAPIResource):
- """Vault & Secrets"""
-
@cached_property
def credentials(self) -> CredentialsResource:
- """Vault & Secrets"""
return CredentialsResource(self._client)
@cached_property
@@ -69,7 +66,9 @@ def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> PackageCreateResponse:
"""
- Initialize a new package/app
+ Creates a new package (identified by `packageName`) under which credentials can
+ be grouped. Returns a conflict if a package with the same name already exists
+ for the user.
Args:
extra_headers: Send extra headers
@@ -100,8 +99,10 @@ def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> PackageListResponse:
- """
- List credentials for a specific package
+ """Returns all credentials stored under the given `packageName`.
+
+ Each credential
+ includes its name, secret path, and the list of fields it holds.
Args:
extra_headers: Send extra headers
@@ -124,11 +125,8 @@ def list(
class AsyncPackagesResource(AsyncAPIResource):
- """Vault & Secrets"""
-
@cached_property
def credentials(self) -> AsyncCredentialsResource:
- """Vault & Secrets"""
return AsyncCredentialsResource(self._client)
@cached_property
@@ -162,7 +160,9 @@ async def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> PackageCreateResponse:
"""
- Initialize a new package/app
+ Creates a new package (identified by `packageName`) under which credentials can
+ be grouped. Returns a conflict if a package with the same name already exists
+ for the user.
Args:
extra_headers: Send extra headers
@@ -193,8 +193,10 @@ async def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> PackageListResponse:
- """
- List credentials for a specific package
+ """Returns all credentials stored under the given `packageName`.
+
+ Each credential
+ includes its name, secret path, and the list of fields it holds.
Args:
extra_headers: Send extra headers
@@ -229,7 +231,6 @@ def __init__(self, packages: PackagesResource) -> None:
@cached_property
def credentials(self) -> CredentialsResourceWithRawResponse:
- """Vault & Secrets"""
return CredentialsResourceWithRawResponse(self._packages.credentials)
@@ -246,7 +247,6 @@ def __init__(self, packages: AsyncPackagesResource) -> None:
@cached_property
def credentials(self) -> AsyncCredentialsResourceWithRawResponse:
- """Vault & Secrets"""
return AsyncCredentialsResourceWithRawResponse(self._packages.credentials)
@@ -263,7 +263,6 @@ def __init__(self, packages: PackagesResource) -> None:
@cached_property
def credentials(self) -> CredentialsResourceWithStreamingResponse:
- """Vault & Secrets"""
return CredentialsResourceWithStreamingResponse(self._packages.credentials)
@@ -280,5 +279,4 @@ def __init__(self, packages: AsyncPackagesResource) -> None:
@cached_property
def credentials(self) -> AsyncCredentialsResourceWithStreamingResponse:
- """Vault & Secrets"""
return AsyncCredentialsResourceWithStreamingResponse(self._packages.credentials)
diff --git a/src/mobilerun_sdk/resources/devices/actions.py b/src/mobilerun_sdk/resources/devices/actions.py
index fa65c7e..8ebefb6 100644
--- a/src/mobilerun_sdk/resources/devices/actions.py
+++ b/src/mobilerun_sdk/resources/devices/actions.py
@@ -60,7 +60,8 @@ def global_(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Perform a global action
+ Performs a global system action on the device, such as navigating back or going
+ to the home screen, identified by an action code.
Args:
extra_headers: Send extra headers
@@ -102,7 +103,7 @@ def overlay_visible(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionOverlayVisibleResponse:
"""
- Check if overlay is visible
+ Returns whether the accessibility overlay is currently visible on the device.
Args:
extra_headers: Send extra headers
@@ -143,7 +144,8 @@ def set_overlay_visible(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Set overlay visibility
+ Shows or hides the accessibility overlay on the device based on the visibility
+ flag in the request body.
Args:
extra_headers: Send extra headers
@@ -191,7 +193,9 @@ def swipe(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Swipe
+ Swipes from a start coordinate to an end coordinate over the given duration in
+ milliseconds. An optional stealth flag applies human-like jitter and curved
+ paths on devices that support it.
Args:
duration: Swipe duration in milliseconds
@@ -247,8 +251,10 @@ def tap(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Tap by coordinates
+ """Taps the device screen at the given x/y coordinates.
+
+ An optional stealth flag
+ routes the tap through human-like input on devices that support it.
Args:
extra_headers: Send extra headers
@@ -319,7 +325,8 @@ async def global_(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Perform a global action
+ Performs a global system action on the device, such as navigating back or going
+ to the home screen, identified by an action code.
Args:
extra_headers: Send extra headers
@@ -361,7 +368,7 @@ async def overlay_visible(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionOverlayVisibleResponse:
"""
- Check if overlay is visible
+ Returns whether the accessibility overlay is currently visible on the device.
Args:
extra_headers: Send extra headers
@@ -402,7 +409,8 @@ async def set_overlay_visible(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Set overlay visibility
+ Shows or hides the accessibility overlay on the device based on the visibility
+ flag in the request body.
Args:
extra_headers: Send extra headers
@@ -452,7 +460,9 @@ async def swipe(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Swipe
+ Swipes from a start coordinate to an end coordinate over the given duration in
+ milliseconds. An optional stealth flag applies human-like jitter and curved
+ paths on devices that support it.
Args:
duration: Swipe duration in milliseconds
@@ -508,8 +518,10 @@ async def tap(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Tap by coordinates
+ """Taps the device screen at the given x/y coordinates.
+
+ An optional stealth flag
+ routes the tap through human-like input on devices that support it.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/devices/apps.py b/src/mobilerun_sdk/resources/devices/apps.py
index dbd6985..ce91eeb 100644
--- a/src/mobilerun_sdk/resources/devices/apps.py
+++ b/src/mobilerun_sdk/resources/devices/apps.py
@@ -18,7 +18,7 @@
async_to_streamed_response_wrapper,
)
from ..._base_client import make_request_options
-from ...types.devices import app_list_params, app_start_params, app_install_params
+from ...types.devices import app_list_params, app_stop_params, app_start_params, app_install_params
from ...types.devices.app_list_response import AppListResponse
__all__ = ["AppsResource", "AsyncAppsResource"]
@@ -59,7 +59,9 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Optional[AppListResponse]:
"""
- List apps
+ Returns detailed information about apps installed on the device, including
+ package name and label. System and protected apps are excluded unless the
+ corresponding query parameters are set.
Args:
extra_headers: Send extra headers
@@ -110,7 +112,8 @@ def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Delete app
+ Uninstalls the app identified by the path package name from the device.
+ Protected packages cannot be deleted.
Args:
extra_headers: Send extra headers
@@ -155,12 +158,13 @@ def install(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """Install app
+ """Installs an app on the device.
- Args:
- bundle_id: iOS bundle identifier (e.g.
+ The request body must supply exactly one of an
+ Android packageName or an iOS bundleId; protected packages are rejected.
- com.example.app)
+ Args:
+ bundle_id: iOS bundle identifier (e.g. com.example.app)
package_name: Android package name (e.g. com.example.app)
@@ -189,12 +193,13 @@ def install(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """Install app
+ """Installs an app on the device.
- Args:
- package_name: Android package name (e.g.
+ The request body must supply exactly one of an
+ Android packageName or an iOS bundleId; protected packages are rejected.
- com.example.app)
+ Args:
+ package_name: Android package name (e.g. com.example.app)
bundle_id: iOS bundle identifier (e.g. com.example.app)
@@ -262,7 +267,9 @@ def start(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Start app
+ Launches the app identified by the path package name, optionally starting a
+ specific activity given in the request body. Protected packages cannot be
+ started.
Args:
extra_headers: Send extra headers
@@ -298,6 +305,7 @@ def stop(
package_name: str,
*,
device_id: str,
+ clear_data: bool | Omit = omit,
x_device_display_id: int | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -306,10 +314,15 @@ def stop(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Stop app
+ """Force-stops the app identified by the path package name.
+
+ When clearData is set
+ in the request body, the app's data is also cleared. Protected packages cannot
+ be stopped.
Args:
+ clear_data: If true, clears all app data (pm clear) in addition to stopping the app.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -331,6 +344,7 @@ def stop(
}
return self._patch(
path_template("/devices/{device_id}/apps/{package_name}", device_id=device_id, package_name=package_name),
+ body=maybe_transform({"clear_data": clear_data}, app_stop_params.AppStopParams),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -373,7 +387,9 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Optional[AppListResponse]:
"""
- List apps
+ Returns detailed information about apps installed on the device, including
+ package name and label. System and protected apps are excluded unless the
+ corresponding query parameters are set.
Args:
extra_headers: Send extra headers
@@ -424,7 +440,8 @@ async def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Delete app
+ Uninstalls the app identified by the path package name from the device.
+ Protected packages cannot be deleted.
Args:
extra_headers: Send extra headers
@@ -469,12 +486,13 @@ async def install(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """Install app
+ """Installs an app on the device.
- Args:
- bundle_id: iOS bundle identifier (e.g.
+ The request body must supply exactly one of an
+ Android packageName or an iOS bundleId; protected packages are rejected.
- com.example.app)
+ Args:
+ bundle_id: iOS bundle identifier (e.g. com.example.app)
package_name: Android package name (e.g. com.example.app)
@@ -503,12 +521,13 @@ async def install(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """Install app
+ """Installs an app on the device.
- Args:
- package_name: Android package name (e.g.
+ The request body must supply exactly one of an
+ Android packageName or an iOS bundleId; protected packages are rejected.
- com.example.app)
+ Args:
+ package_name: Android package name (e.g. com.example.app)
bundle_id: iOS bundle identifier (e.g. com.example.app)
@@ -576,7 +595,9 @@ async def start(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Start app
+ Launches the app identified by the path package name, optionally starting a
+ specific activity given in the request body. Protected packages cannot be
+ started.
Args:
extra_headers: Send extra headers
@@ -612,6 +633,7 @@ async def stop(
package_name: str,
*,
device_id: str,
+ clear_data: bool | Omit = omit,
x_device_display_id: int | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -620,10 +642,15 @@ async def stop(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Stop app
+ """Force-stops the app identified by the path package name.
+
+ When clearData is set
+ in the request body, the app's data is also cleared. Protected packages cannot
+ be stopped.
Args:
+ clear_data: If true, clears all app data (pm clear) in addition to stopping the app.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -645,6 +672,7 @@ async def stop(
}
return await self._patch(
path_template("/devices/{device_id}/apps/{package_name}", device_id=device_id, package_name=package_name),
+ body=await async_maybe_transform({"clear_data": clear_data}, app_stop_params.AppStopParams),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
diff --git a/src/mobilerun_sdk/resources/devices/devices.py b/src/mobilerun_sdk/resources/devices/devices.py
index 9837a6f..13a44ce 100644
--- a/src/mobilerun_sdk/resources/devices/devices.py
+++ b/src/mobilerun_sdk/resources/devices/devices.py
@@ -178,7 +178,6 @@ def state(self) -> StateResource:
@cached_property
def tasks(self) -> TasksResource:
- """Device Management"""
return TasksResource(self._client)
@cached_property
@@ -211,8 +210,11 @@ def with_streaming_response(self) -> DevicesResourceWithStreamingResponse:
def create(
self,
*,
+ billing: Literal["auto", "subscription", "minute"] | Omit = omit,
query_country: str | Omit = omit,
- device_type: Literal["dedicated_physical_device", "dedicated_premium_device", "dedicated_ios_device"]
+ device_type: Literal[
+ "dedicated_physical_device", "dedicated_premium_device", "dedicated_ios_device", "dedicated_emulated_device"
+ ]
| Omit = omit,
profile_id: str | Omit = omit,
android_version: int | Omit = omit,
@@ -233,12 +235,19 @@ def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Device:
- """Provision a new device
+ """
+ Requests a new device for the authenticated user from the device spec in the
+ request body. Optional query parameters select the device type, target country,
+ billing mode, and a profile to use as the base spec; the response returns the
+ device and its stream token.
Args:
- query_country: ISO 3166-1 alpha-2 country code.
+ billing: Billing mode. 'auto' uses a subscription slot when available and otherwise bills
+ per minute; 'subscription' requires an available subscription slot; 'minute'
+ bills per minute. Only cloud phone and cloud emulator devices support per-minute
+ billing.
- If omitted the system picks the country with
+ query_country: ISO 3166-1 alpha-2 country code. If omitted the system picks the country with
the most availability.
profile_id: Profile ID to use as device spec
@@ -276,6 +285,7 @@ def create(
timeout=timeout,
query=maybe_transform(
{
+ "billing": billing,
"query_country": query_country,
"device_type": device_type,
"profile_id": profile_id,
@@ -298,7 +308,9 @@ def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Device:
"""
- Get device info
+ Returns the current state and metadata for a single device, including its
+ lifecycle state, type, stream URL, billing strategy, and timestamps. A stream
+ token is included while the device is active.
Args:
extra_headers: Send extra headers
@@ -354,7 +366,7 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeviceListResponse:
"""
- List devices
+ Returns a paginated list of the user's devices along with pagination metadata.
Args:
extra_headers: Send extra headers
@@ -400,7 +412,7 @@ def count(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeviceCountResponse:
- """Count claimed devices"""
+ """Returns the number of claimed devices for the user, broken down by device type."""
return self._get(
"/devices/count",
options=make_request_options(
@@ -422,7 +434,9 @@ def fingerprint(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeviceFingerprintResponse:
"""
- Device fingerprint snapshot
+ Returns a live snapshot of the device's spoofed identity, including model,
+ display, identifiers, and carrier. Devices without fingerprint support return an
+ unsupported-feature error.
Args:
extra_headers: Send extra headers
@@ -460,8 +474,10 @@ def reboot(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Reboot a device
+ """Triggers a reboot of the device.
+
+ The device transitions through its reboot
+ lifecycle and becomes ready again once the restart completes.
Args:
extra_headers: Send extra headers
@@ -495,7 +511,9 @@ def reset(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Reset a device to a fresh state
+ Resets the device back to a clean state, clearing installed apps and user data
+ accumulated during the session. The device transitions through its reset
+ lifecycle before becoming ready again.
Args:
extra_headers: Send extra headers
@@ -530,7 +548,8 @@ def set_name(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Device:
"""
- Update device name
+ Sets the display name for a device from the name in the request body and returns
+ the updated device.
Args:
extra_headers: Send extra headers
@@ -565,8 +584,11 @@ def terminate(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Terminate a device
+ """Terminates the device and releases its resources.
+
+ Termination can be scheduled
+ for a future time or chained from a previous device via the request body, in
+ which case a service key is required.
Args:
extra_headers: Send extra headers
@@ -607,7 +629,9 @@ def wait_ready(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Device:
"""
- Wait for device to be ready
+ Blocks until the device reaches the ready state, then returns the same payload
+ as Get device info. The call returns early with an error if the wait is
+ cancelled or times out.
Args:
extra_headers: Send extra headers
@@ -672,7 +696,6 @@ def state(self) -> AsyncStateResource:
@cached_property
def tasks(self) -> AsyncTasksResource:
- """Device Management"""
return AsyncTasksResource(self._client)
@cached_property
@@ -705,8 +728,11 @@ def with_streaming_response(self) -> AsyncDevicesResourceWithStreamingResponse:
async def create(
self,
*,
+ billing: Literal["auto", "subscription", "minute"] | Omit = omit,
query_country: str | Omit = omit,
- device_type: Literal["dedicated_physical_device", "dedicated_premium_device", "dedicated_ios_device"]
+ device_type: Literal[
+ "dedicated_physical_device", "dedicated_premium_device", "dedicated_ios_device", "dedicated_emulated_device"
+ ]
| Omit = omit,
profile_id: str | Omit = omit,
android_version: int | Omit = omit,
@@ -727,12 +753,19 @@ async def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Device:
- """Provision a new device
+ """
+ Requests a new device for the authenticated user from the device spec in the
+ request body. Optional query parameters select the device type, target country,
+ billing mode, and a profile to use as the base spec; the response returns the
+ device and its stream token.
Args:
- query_country: ISO 3166-1 alpha-2 country code.
+ billing: Billing mode. 'auto' uses a subscription slot when available and otherwise bills
+ per minute; 'subscription' requires an available subscription slot; 'minute'
+ bills per minute. Only cloud phone and cloud emulator devices support per-minute
+ billing.
- If omitted the system picks the country with
+ query_country: ISO 3166-1 alpha-2 country code. If omitted the system picks the country with
the most availability.
profile_id: Profile ID to use as device spec
@@ -770,6 +803,7 @@ async def create(
timeout=timeout,
query=await async_maybe_transform(
{
+ "billing": billing,
"query_country": query_country,
"device_type": device_type,
"profile_id": profile_id,
@@ -792,7 +826,9 @@ async def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Device:
"""
- Get device info
+ Returns the current state and metadata for a single device, including its
+ lifecycle state, type, stream URL, billing strategy, and timestamps. A stream
+ token is included while the device is active.
Args:
extra_headers: Send extra headers
@@ -848,7 +884,7 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeviceListResponse:
"""
- List devices
+ Returns a paginated list of the user's devices along with pagination metadata.
Args:
extra_headers: Send extra headers
@@ -894,7 +930,7 @@ async def count(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeviceCountResponse:
- """Count claimed devices"""
+ """Returns the number of claimed devices for the user, broken down by device type."""
return await self._get(
"/devices/count",
options=make_request_options(
@@ -916,7 +952,9 @@ async def fingerprint(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeviceFingerprintResponse:
"""
- Device fingerprint snapshot
+ Returns a live snapshot of the device's spoofed identity, including model,
+ display, identifiers, and carrier. Devices without fingerprint support return an
+ unsupported-feature error.
Args:
extra_headers: Send extra headers
@@ -954,8 +992,10 @@ async def reboot(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Reboot a device
+ """Triggers a reboot of the device.
+
+ The device transitions through its reboot
+ lifecycle and becomes ready again once the restart completes.
Args:
extra_headers: Send extra headers
@@ -989,7 +1029,9 @@ async def reset(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Reset a device to a fresh state
+ Resets the device back to a clean state, clearing installed apps and user data
+ accumulated during the session. The device transitions through its reset
+ lifecycle before becoming ready again.
Args:
extra_headers: Send extra headers
@@ -1024,7 +1066,8 @@ async def set_name(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Device:
"""
- Update device name
+ Sets the display name for a device from the name in the request body and returns
+ the updated device.
Args:
extra_headers: Send extra headers
@@ -1059,8 +1102,11 @@ async def terminate(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Terminate a device
+ """Terminates the device and releases its resources.
+
+ Termination can be scheduled
+ for a future time or chained from a previous device via the request body, in
+ which case a service key is required.
Args:
extra_headers: Send extra headers
@@ -1101,7 +1147,9 @@ async def wait_ready(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Device:
"""
- Wait for device to be ready
+ Blocks until the device reaches the ready state, then returns the same payload
+ as Get device info. The call returns early with an error if the wait is
+ cancelled or times out.
Args:
extra_headers: Send extra headers
@@ -1200,7 +1248,6 @@ def state(self) -> StateResourceWithRawResponse:
@cached_property
def tasks(self) -> TasksResourceWithRawResponse:
- """Device Management"""
return TasksResourceWithRawResponse(self._devices.tasks)
@cached_property
@@ -1289,7 +1336,6 @@ def state(self) -> AsyncStateResourceWithRawResponse:
@cached_property
def tasks(self) -> AsyncTasksResourceWithRawResponse:
- """Device Management"""
return AsyncTasksResourceWithRawResponse(self._devices.tasks)
@cached_property
@@ -1378,7 +1424,6 @@ def state(self) -> StateResourceWithStreamingResponse:
@cached_property
def tasks(self) -> TasksResourceWithStreamingResponse:
- """Device Management"""
return TasksResourceWithStreamingResponse(self._devices.tasks)
@cached_property
@@ -1467,7 +1512,6 @@ def state(self) -> AsyncStateResourceWithStreamingResponse:
@cached_property
def tasks(self) -> AsyncTasksResourceWithStreamingResponse:
- """Device Management"""
return AsyncTasksResourceWithStreamingResponse(self._devices.tasks)
@cached_property
diff --git a/src/mobilerun_sdk/resources/devices/esim.py b/src/mobilerun_sdk/resources/devices/esim.py
index ba2d38e..06abb25 100644
--- a/src/mobilerun_sdk/resources/devices/esim.py
+++ b/src/mobilerun_sdk/resources/devices/esim.py
@@ -57,7 +57,7 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Optional[EsimListResponse]:
"""
- List eSIM subscriptions
+ Returns the eSIM subscriptions currently provisioned on the device.
Args:
extra_headers: Send extra headers
@@ -101,7 +101,7 @@ def activate(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> EsimActivateResponse:
"""
- Configure eSIM (download profile and/or enable subscription)
+ Download profile and/or enable subscription.
Args:
confirmation_code: Optional carrier-issued confirmation code (the 4th LPA segment). Required only
@@ -155,7 +155,8 @@ def enable(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Enable an eSIM subscription
+ Enables the eSIM subscription identified by the subId in the request body so it
+ becomes the active subscription.
Args:
extra_headers: Send extra headers
@@ -198,7 +199,8 @@ def remove(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Delete eSIM subscription
+ Deletes the eSIM subscription identified by the subId query parameter from the
+ device.
Args:
extra_headers: Send extra headers
@@ -264,7 +266,7 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Optional[EsimListResponse]:
"""
- List eSIM subscriptions
+ Returns the eSIM subscriptions currently provisioned on the device.
Args:
extra_headers: Send extra headers
@@ -308,7 +310,7 @@ async def activate(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> EsimActivateResponse:
"""
- Configure eSIM (download profile and/or enable subscription)
+ Download profile and/or enable subscription.
Args:
confirmation_code: Optional carrier-issued confirmation code (the 4th LPA segment). Required only
@@ -362,7 +364,8 @@ async def enable(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Enable an eSIM subscription
+ Enables the eSIM subscription identified by the subId in the request body so it
+ becomes the active subscription.
Args:
extra_headers: Send extra headers
@@ -405,7 +408,8 @@ async def remove(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Delete eSIM subscription
+ Deletes the eSIM subscription identified by the subId query parameter from the
+ device.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/devices/files.py b/src/mobilerun_sdk/resources/devices/files.py
index ffaba39..d39f4a3 100644
--- a/src/mobilerun_sdk/resources/devices/files.py
+++ b/src/mobilerun_sdk/resources/devices/files.py
@@ -58,7 +58,8 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FileListResponse:
"""
- List files
+ Lists the files at the directory path given in the path query parameter,
+ returning each entry's metadata along with the path and total count.
Args:
extra_headers: Send extra headers
@@ -103,7 +104,7 @@ def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Delete file
+ Deletes the file at the path given in the path query parameter from the device.
Args:
extra_headers: Send extra headers
@@ -149,7 +150,8 @@ def download(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> str:
"""
- Download file
+ Pulls the file at the given path query parameter from the device and returns its
+ raw bytes as an octet-stream.
Args:
extra_headers: Send extra headers
@@ -195,7 +197,8 @@ def upload(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Upload file
+ Uploads a file to the device via multipart form data, writing it into the
+ directory given by the path query parameter using the uploaded file's name.
Args:
extra_headers: Send extra headers
@@ -270,7 +273,8 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FileListResponse:
"""
- List files
+ Lists the files at the directory path given in the path query parameter,
+ returning each entry's metadata along with the path and total count.
Args:
extra_headers: Send extra headers
@@ -315,7 +319,7 @@ async def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Delete file
+ Deletes the file at the path given in the path query parameter from the device.
Args:
extra_headers: Send extra headers
@@ -361,7 +365,8 @@ async def download(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> str:
"""
- Download file
+ Pulls the file at the given path query parameter from the device and returns its
+ raw bytes as an octet-stream.
Args:
extra_headers: Send extra headers
@@ -407,7 +412,8 @@ async def upload(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Upload file
+ Uploads a file to the device via multipart form data, writing it into the
+ directory given by the path query parameter using the uploaded file's name.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/devices/keyboard.py b/src/mobilerun_sdk/resources/devices/keyboard.py
index 97e2695..a1bd8bb 100644
--- a/src/mobilerun_sdk/resources/devices/keyboard.py
+++ b/src/mobilerun_sdk/resources/devices/keyboard.py
@@ -53,7 +53,7 @@ def clear(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Clear input
+ Clears the contents of the currently focused text input field.
Args:
extra_headers: Send extra headers
@@ -95,7 +95,7 @@ def key(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Input key
+ Sends a single Android key event to the device, identified by its key code.
Args:
extra_headers: Send extra headers
@@ -141,12 +141,14 @@ def write(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """Input text
+ """Types the given text into the focused input field.
- Args:
- error_rate: Per-character mistake rate for humantouch typing.
+ Supports optionally clearing
+ the field first and a stealth mode that emulates human typing speed and error
+ rate on supported devices.
- -1 uses server default.
+ Args:
+ error_rate: Per-character mistake rate for humantouch typing. -1 uses server default.
wpm: Words per minute for stealth typing. 0 uses portal default.
@@ -219,7 +221,7 @@ async def clear(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Clear input
+ Clears the contents of the currently focused text input field.
Args:
extra_headers: Send extra headers
@@ -261,7 +263,7 @@ async def key(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Input key
+ Sends a single Android key event to the device, identified by its key code.
Args:
extra_headers: Send extra headers
@@ -307,12 +309,14 @@ async def write(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """Input text
+ """Types the given text into the focused input field.
- Args:
- error_rate: Per-character mistake rate for humantouch typing.
+ Supports optionally clearing
+ the field first and a stealth mode that emulates human typing speed and error
+ rate on supported devices.
- -1 uses server default.
+ Args:
+ error_rate: Per-character mistake rate for humantouch typing. -1 uses server default.
wpm: Words per minute for stealth typing. 0 uses portal default.
diff --git a/src/mobilerun_sdk/resources/devices/language.py b/src/mobilerun_sdk/resources/devices/language.py
index 498c78f..608f612 100644
--- a/src/mobilerun_sdk/resources/devices/language.py
+++ b/src/mobilerun_sdk/resources/devices/language.py
@@ -54,7 +54,7 @@ def get(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> LanguageGetResponse:
"""
- Get device language/locale
+ Returns the device's current language/locale as a BCP-47 locale string.
Args:
extra_headers: Send extra headers
@@ -95,8 +95,11 @@ def set(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Set device language/locale
+ """Sets the device language/locale to the BCP-47 locale in the request body.
+
+ An
+ optional restart flag applies the change immediately by restarting the zygote
+ instead of waiting for the next reboot.
Args:
locale: BCP-47 locale: a 2–3 letter language tag, optionally followed by a 4-letter
@@ -171,7 +174,7 @@ async def get(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> LanguageGetResponse:
"""
- Get device language/locale
+ Returns the device's current language/locale as a BCP-47 locale string.
Args:
extra_headers: Send extra headers
@@ -212,8 +215,11 @@ async def set(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Set device language/locale
+ """Sets the device language/locale to the BCP-47 locale in the request body.
+
+ An
+ optional restart flag applies the change immediately by restarting the zygote
+ instead of waiting for the next reboot.
Args:
locale: BCP-47 locale: a 2–3 letter language tag, optionally followed by a 4-letter
diff --git a/src/mobilerun_sdk/resources/devices/location.py b/src/mobilerun_sdk/resources/devices/location.py
index f9469fc..1316b3f 100644
--- a/src/mobilerun_sdk/resources/devices/location.py
+++ b/src/mobilerun_sdk/resources/devices/location.py
@@ -54,7 +54,8 @@ def get(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Location:
"""
- Get device location
+ Returns the device's current simulated GPS location as latitude and longitude.
+ Devices without geo support return an unsupported-feature error.
Args:
extra_headers: Send extra headers
@@ -96,7 +97,8 @@ def set(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Set device location
+ Sets the device's simulated GPS location to the latitude and longitude in the
+ request body. Devices without geo support return an unsupported-feature error.
Args:
extra_headers: Send extra headers
@@ -165,7 +167,8 @@ async def get(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Location:
"""
- Get device location
+ Returns the device's current simulated GPS location as latitude and longitude.
+ Devices without geo support return an unsupported-feature error.
Args:
extra_headers: Send extra headers
@@ -207,7 +210,8 @@ async def set(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Set device location
+ Sets the device's simulated GPS location to the latitude and longitude in the
+ request body. Devices without geo support return an unsupported-feature error.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/devices/packages.py b/src/mobilerun_sdk/resources/devices/packages.py
index dea5db3..13ff678 100644
--- a/src/mobilerun_sdk/resources/devices/packages.py
+++ b/src/mobilerun_sdk/resources/devices/packages.py
@@ -57,8 +57,10 @@ def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Optional[PackageListResponse]:
- """
- List packages
+ """Returns the package names of apps installed on the device.
+
+ System and protected
+ packages are excluded unless the corresponding query parameters are set.
Args:
extra_headers: Send extra headers
@@ -130,8 +132,10 @@ async def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Optional[PackageListResponse]:
- """
- List packages
+ """Returns the package names of apps installed on the device.
+
+ System and protected
+ packages are excluded unless the corresponding query parameters are set.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/devices/proxy.py b/src/mobilerun_sdk/resources/devices/proxy.py
index 08e0c04..4510147 100644
--- a/src/mobilerun_sdk/resources/devices/proxy.py
+++ b/src/mobilerun_sdk/resources/devices/proxy.py
@@ -61,7 +61,9 @@ def connect(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Connect proxy
+ Routes the device's traffic through a SOCKS5 proxy supplied in the request body,
+ replacing any existing connection. A smartIp option can be used to select an IP
+ automatically; the legacy flat host/port/user/password fields remain supported.
Args:
name: Proxy name
@@ -118,7 +120,8 @@ def disconnect(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Disconnect proxy
+ Disconnects the device's active proxy connection and clears its stored proxy
+ state. Returns successfully if no proxy is connected.
Args:
extra_headers: Send extra headers
@@ -159,7 +162,8 @@ def status(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyStatusResponse:
"""
- Get proxy connection state
+ Returns the device's current proxy connection state, including whether a proxy
+ is connected and its protocol and name.
Args:
extra_headers: Send extra headers
@@ -227,7 +231,9 @@ async def connect(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Connect proxy
+ Routes the device's traffic through a SOCKS5 proxy supplied in the request body,
+ replacing any existing connection. A smartIp option can be used to select an IP
+ automatically; the legacy flat host/port/user/password fields remain supported.
Args:
name: Proxy name
@@ -284,7 +290,8 @@ async def disconnect(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
- Disconnect proxy
+ Disconnects the device's active proxy connection and clears its stored proxy
+ state. Returns successfully if no proxy is connected.
Args:
extra_headers: Send extra headers
@@ -325,7 +332,8 @@ async def status(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyStatusResponse:
"""
- Get proxy connection state
+ Returns the device's current proxy connection state, including whether a proxy
+ is connected and its protocol and name.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/devices/state.py b/src/mobilerun_sdk/resources/devices/state.py
index 789665e..ab30287 100644
--- a/src/mobilerun_sdk/resources/devices/state.py
+++ b/src/mobilerun_sdk/resources/devices/state.py
@@ -54,8 +54,10 @@ def screenshot(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> str:
- """
- Take screenshot
+ """Captures the device screen and returns it as a PNG image.
+
+ An optional
+ hideOverlay query parameter excludes the accessibility overlay from the capture.
Args:
extra_headers: Send extra headers
@@ -99,7 +101,7 @@ def time(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> str:
"""
- Device time
+ Returns the device's current wall-clock time as an RFC 3339 timestamp.
Args:
extra_headers: Send extra headers
@@ -140,7 +142,9 @@ def ui(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> StateUiResponse:
"""
- UI state
+ Returns the current accessibility UI state of the device as a structured tree of
+ on-screen elements. An optional filter query reduces the result to interactive
+ elements.
Args:
extra_headers: Send extra headers
@@ -205,8 +209,10 @@ async def screenshot(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> str:
- """
- Take screenshot
+ """Captures the device screen and returns it as a PNG image.
+
+ An optional
+ hideOverlay query parameter excludes the accessibility overlay from the capture.
Args:
extra_headers: Send extra headers
@@ -252,7 +258,7 @@ async def time(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> str:
"""
- Device time
+ Returns the device's current wall-clock time as an RFC 3339 timestamp.
Args:
extra_headers: Send extra headers
@@ -293,7 +299,9 @@ async def ui(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> StateUiResponse:
"""
- UI state
+ Returns the current accessibility UI state of the device as a structured tree of
+ on-screen elements. An optional filter query reduces the result to interactive
+ elements.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/devices/tasks.py b/src/mobilerun_sdk/resources/devices/tasks.py
index 061d2ca..7267e7a 100644
--- a/src/mobilerun_sdk/resources/devices/tasks.py
+++ b/src/mobilerun_sdk/resources/devices/tasks.py
@@ -24,8 +24,6 @@
class TasksResource(SyncAPIResource):
- """Device Management"""
-
@cached_property
def with_raw_response(self) -> TasksResourceWithRawResponse:
"""
@@ -61,7 +59,8 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TaskListResponse:
"""
- List tasks for a device
+ Returns a paginated list of tasks that have run on the device, along with
+ pagination metadata.
Args:
extra_headers: Send extra headers
@@ -96,8 +95,6 @@ def list(
class AsyncTasksResource(AsyncAPIResource):
- """Device Management"""
-
@cached_property
def with_raw_response(self) -> AsyncTasksResourceWithRawResponse:
"""
@@ -133,7 +130,8 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TaskListResponse:
"""
- List tasks for a device
+ Returns a paginated list of tasks that have run on the device, along with
+ pagination metadata.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/devices/timezone.py b/src/mobilerun_sdk/resources/devices/timezone.py
index a136b2f..0ac8240 100644
--- a/src/mobilerun_sdk/resources/devices/timezone.py
+++ b/src/mobilerun_sdk/resources/devices/timezone.py
@@ -53,8 +53,10 @@ def get(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TimezoneGetResponse:
- """
- Get device timezone
+ """Returns the device's current timezone identifier.
+
+ Devices that do not support
+ timezone control return an unsupported-feature error.
Args:
extra_headers: Send extra headers
@@ -94,8 +96,10 @@ def set(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Set device timezone
+ """Sets the device timezone to the identifier in the request body.
+
+ Devices that do
+ not support timezone control return an unsupported-feature error.
Args:
extra_headers: Send extra headers
@@ -157,8 +161,10 @@ async def get(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TimezoneGetResponse:
- """
- Get device timezone
+ """Returns the device's current timezone identifier.
+
+ Devices that do not support
+ timezone control return an unsupported-feature error.
Args:
extra_headers: Send extra headers
@@ -198,8 +204,10 @@ async def set(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Set device timezone
+ """Sets the device timezone to the identifier in the request body.
+
+ Devices that do
+ not support timezone control return an unsupported-feature error.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/hooks.py b/src/mobilerun_sdk/resources/hooks.py
deleted file mode 100644
index 6f3c43b..0000000
--- a/src/mobilerun_sdk/resources/hooks.py
+++ /dev/null
@@ -1,797 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Dict, Optional
-from typing_extensions import Literal
-
-import httpx
-
-from ..types import hook_list_params, hook_test_params, hook_update_params, hook_perform_params, hook_subscribe_params
-from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given
-from .._utils import path_template, maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.hook_list_response import HookListResponse
-from ..types.hook_test_response import HookTestResponse
-from ..types.hook_update_response import HookUpdateResponse
-from ..types.hook_perform_response import HookPerformResponse
-from ..types.hook_retrieve_response import HookRetrieveResponse
-from ..types.hook_subscribe_response import HookSubscribeResponse
-from ..types.hook_unsubscribe_response import HookUnsubscribeResponse
-from ..types.hook_get_sample_data_response import HookGetSampleDataResponse
-
-__all__ = ["HooksResource", "AsyncHooksResource"]
-
-
-class HooksResource(SyncAPIResource):
- @cached_property
- def with_raw_response(self) -> HooksResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/droidrun/mobilerun-sdk-python#accessing-raw-response-data-eg-headers
- """
- return HooksResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> HooksResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/droidrun/mobilerun-sdk-python#with_streaming_response
- """
- return HooksResourceWithStreamingResponse(self)
-
- def retrieve(
- self,
- hook_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookRetrieveResponse:
- """
- Get a hook subscription by id.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not hook_id:
- raise ValueError(f"Expected a non-empty value for `hook_id` but received {hook_id!r}")
- return self._get(
- path_template("/hooks/{hook_id}", hook_id=hook_id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookRetrieveResponse,
- )
-
- def update(
- self,
- hook_id: str,
- *,
- events: Optional[SequenceNotStr[str]] | Omit = omit,
- state: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookUpdateResponse:
- """
- Edit a hook subscription (events or state).
-
- Allows updating the events filter and/or the state of a hook.
-
- Args:
- events: Updated list of events to subscribe to
-
- state: Updated hook state (active, disabled, deleted)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not hook_id:
- raise ValueError(f"Expected a non-empty value for `hook_id` but received {hook_id!r}")
- return self._post(
- path_template("/hooks/{hook_id}/edit", hook_id=hook_id),
- body=maybe_transform(
- {
- "events": events,
- "state": state,
- },
- hook_update_params.HookUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookUpdateResponse,
- )
-
- def list(
- self,
- *,
- order_by: Optional[str] | Omit = omit,
- order_by_direction: Literal["asc", "desc"] | Omit = omit,
- page: int | Omit = omit,
- page_size: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookListResponse:
- """
- List hooks belonging to the requesting user (paginated).
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/hooks",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "order_by": order_by,
- "order_by_direction": order_by_direction,
- "page": page,
- "page_size": page_size,
- },
- hook_list_params.HookListParams,
- ),
- ),
- cast_to=HookListResponse,
- )
-
- def get_sample_data(
- self,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookGetSampleDataResponse:
- """Get sample hook data for Zapier Perform List (testing/field mapping)."""
- return self._get(
- "/hooks/sample",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookGetSampleDataResponse,
- )
-
- def perform(
- self,
- *,
- body: Dict[str, object],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookPerformResponse:
- """
- Zapier Perform endpoint - processes webhook payloads.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._post(
- "/hooks/perform",
- body=maybe_transform(body, hook_perform_params.HookPerformParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookPerformResponse,
- )
-
- def subscribe(
- self,
- *,
- target_url: str,
- events: Optional[SequenceNotStr[str]] | Omit = omit,
- service: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookSubscribeResponse:
- """Subscribe the current user to a webhook URL.
-
- Returns subscription id.
-
- Args:
- target_url: The webhook URL to send notifications to
-
- events: List of task events to subscribe to (created, running, completed, failed,
- cancelled, paused)
-
- service: Service that receives the webhook
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._post(
- "/hooks/subscribe",
- body=maybe_transform(
- {
- "target_url": target_url,
- "events": events,
- "service": service,
- },
- hook_subscribe_params.HookSubscribeParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookSubscribeResponse,
- )
-
- def test(
- self,
- hook_id: str,
- *,
- event: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookTestResponse:
- """
- Send a test event to a webhook endpoint.
-
- Delivers a sample payload to the hook's URL with a single attempt (no retries)
- for fast feedback.
-
- Args:
- event: Event type to simulate (default: completed)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not hook_id:
- raise ValueError(f"Expected a non-empty value for `hook_id` but received {hook_id!r}")
- return self._post(
- path_template("/hooks/{hook_id}/test", hook_id=hook_id),
- body=maybe_transform({"event": event}, hook_test_params.HookTestParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookTestResponse,
- )
-
- def unsubscribe(
- self,
- hook_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookUnsubscribeResponse:
- """
- Unsubscribe a previously created subscription by id.
-
- Permanently deletes the subscription if it belongs to the user.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not hook_id:
- raise ValueError(f"Expected a non-empty value for `hook_id` but received {hook_id!r}")
- return self._post(
- path_template("/hooks/{hook_id}/unsubscribe", hook_id=hook_id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookUnsubscribeResponse,
- )
-
-
-class AsyncHooksResource(AsyncAPIResource):
- @cached_property
- def with_raw_response(self) -> AsyncHooksResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/droidrun/mobilerun-sdk-python#accessing-raw-response-data-eg-headers
- """
- return AsyncHooksResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncHooksResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/droidrun/mobilerun-sdk-python#with_streaming_response
- """
- return AsyncHooksResourceWithStreamingResponse(self)
-
- async def retrieve(
- self,
- hook_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookRetrieveResponse:
- """
- Get a hook subscription by id.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not hook_id:
- raise ValueError(f"Expected a non-empty value for `hook_id` but received {hook_id!r}")
- return await self._get(
- path_template("/hooks/{hook_id}", hook_id=hook_id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookRetrieveResponse,
- )
-
- async def update(
- self,
- hook_id: str,
- *,
- events: Optional[SequenceNotStr[str]] | Omit = omit,
- state: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookUpdateResponse:
- """
- Edit a hook subscription (events or state).
-
- Allows updating the events filter and/or the state of a hook.
-
- Args:
- events: Updated list of events to subscribe to
-
- state: Updated hook state (active, disabled, deleted)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not hook_id:
- raise ValueError(f"Expected a non-empty value for `hook_id` but received {hook_id!r}")
- return await self._post(
- path_template("/hooks/{hook_id}/edit", hook_id=hook_id),
- body=await async_maybe_transform(
- {
- "events": events,
- "state": state,
- },
- hook_update_params.HookUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookUpdateResponse,
- )
-
- async def list(
- self,
- *,
- order_by: Optional[str] | Omit = omit,
- order_by_direction: Literal["asc", "desc"] | Omit = omit,
- page: int | Omit = omit,
- page_size: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookListResponse:
- """
- List hooks belonging to the requesting user (paginated).
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/hooks",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "order_by": order_by,
- "order_by_direction": order_by_direction,
- "page": page,
- "page_size": page_size,
- },
- hook_list_params.HookListParams,
- ),
- ),
- cast_to=HookListResponse,
- )
-
- async def get_sample_data(
- self,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookGetSampleDataResponse:
- """Get sample hook data for Zapier Perform List (testing/field mapping)."""
- return await self._get(
- "/hooks/sample",
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookGetSampleDataResponse,
- )
-
- async def perform(
- self,
- *,
- body: Dict[str, object],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookPerformResponse:
- """
- Zapier Perform endpoint - processes webhook payloads.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._post(
- "/hooks/perform",
- body=await async_maybe_transform(body, hook_perform_params.HookPerformParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookPerformResponse,
- )
-
- async def subscribe(
- self,
- *,
- target_url: str,
- events: Optional[SequenceNotStr[str]] | Omit = omit,
- service: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookSubscribeResponse:
- """Subscribe the current user to a webhook URL.
-
- Returns subscription id.
-
- Args:
- target_url: The webhook URL to send notifications to
-
- events: List of task events to subscribe to (created, running, completed, failed,
- cancelled, paused)
-
- service: Service that receives the webhook
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._post(
- "/hooks/subscribe",
- body=await async_maybe_transform(
- {
- "target_url": target_url,
- "events": events,
- "service": service,
- },
- hook_subscribe_params.HookSubscribeParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookSubscribeResponse,
- )
-
- async def test(
- self,
- hook_id: str,
- *,
- event: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookTestResponse:
- """
- Send a test event to a webhook endpoint.
-
- Delivers a sample payload to the hook's URL with a single attempt (no retries)
- for fast feedback.
-
- Args:
- event: Event type to simulate (default: completed)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not hook_id:
- raise ValueError(f"Expected a non-empty value for `hook_id` but received {hook_id!r}")
- return await self._post(
- path_template("/hooks/{hook_id}/test", hook_id=hook_id),
- body=await async_maybe_transform({"event": event}, hook_test_params.HookTestParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookTestResponse,
- )
-
- async def unsubscribe(
- self,
- hook_id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> HookUnsubscribeResponse:
- """
- Unsubscribe a previously created subscription by id.
-
- Permanently deletes the subscription if it belongs to the user.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not hook_id:
- raise ValueError(f"Expected a non-empty value for `hook_id` but received {hook_id!r}")
- return await self._post(
- path_template("/hooks/{hook_id}/unsubscribe", hook_id=hook_id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=HookUnsubscribeResponse,
- )
-
-
-class HooksResourceWithRawResponse:
- def __init__(self, hooks: HooksResource) -> None:
- self._hooks = hooks
-
- self.retrieve = to_raw_response_wrapper(
- hooks.retrieve,
- )
- self.update = to_raw_response_wrapper(
- hooks.update,
- )
- self.list = to_raw_response_wrapper(
- hooks.list,
- )
- self.get_sample_data = to_raw_response_wrapper(
- hooks.get_sample_data,
- )
- self.perform = to_raw_response_wrapper(
- hooks.perform,
- )
- self.subscribe = to_raw_response_wrapper(
- hooks.subscribe,
- )
- self.test = to_raw_response_wrapper(
- hooks.test,
- )
- self.unsubscribe = to_raw_response_wrapper(
- hooks.unsubscribe,
- )
-
-
-class AsyncHooksResourceWithRawResponse:
- def __init__(self, hooks: AsyncHooksResource) -> None:
- self._hooks = hooks
-
- self.retrieve = async_to_raw_response_wrapper(
- hooks.retrieve,
- )
- self.update = async_to_raw_response_wrapper(
- hooks.update,
- )
- self.list = async_to_raw_response_wrapper(
- hooks.list,
- )
- self.get_sample_data = async_to_raw_response_wrapper(
- hooks.get_sample_data,
- )
- self.perform = async_to_raw_response_wrapper(
- hooks.perform,
- )
- self.subscribe = async_to_raw_response_wrapper(
- hooks.subscribe,
- )
- self.test = async_to_raw_response_wrapper(
- hooks.test,
- )
- self.unsubscribe = async_to_raw_response_wrapper(
- hooks.unsubscribe,
- )
-
-
-class HooksResourceWithStreamingResponse:
- def __init__(self, hooks: HooksResource) -> None:
- self._hooks = hooks
-
- self.retrieve = to_streamed_response_wrapper(
- hooks.retrieve,
- )
- self.update = to_streamed_response_wrapper(
- hooks.update,
- )
- self.list = to_streamed_response_wrapper(
- hooks.list,
- )
- self.get_sample_data = to_streamed_response_wrapper(
- hooks.get_sample_data,
- )
- self.perform = to_streamed_response_wrapper(
- hooks.perform,
- )
- self.subscribe = to_streamed_response_wrapper(
- hooks.subscribe,
- )
- self.test = to_streamed_response_wrapper(
- hooks.test,
- )
- self.unsubscribe = to_streamed_response_wrapper(
- hooks.unsubscribe,
- )
-
-
-class AsyncHooksResourceWithStreamingResponse:
- def __init__(self, hooks: AsyncHooksResource) -> None:
- self._hooks = hooks
-
- self.retrieve = async_to_streamed_response_wrapper(
- hooks.retrieve,
- )
- self.update = async_to_streamed_response_wrapper(
- hooks.update,
- )
- self.list = async_to_streamed_response_wrapper(
- hooks.list,
- )
- self.get_sample_data = async_to_streamed_response_wrapper(
- hooks.get_sample_data,
- )
- self.perform = async_to_streamed_response_wrapper(
- hooks.perform,
- )
- self.subscribe = async_to_streamed_response_wrapper(
- hooks.subscribe,
- )
- self.test = async_to_streamed_response_wrapper(
- hooks.test,
- )
- self.unsubscribe = async_to_streamed_response_wrapper(
- hooks.unsubscribe,
- )
diff --git a/src/mobilerun_sdk/resources/proxies.py b/src/mobilerun_sdk/resources/proxies.py
index 4abd363..45a990d 100644
--- a/src/mobilerun_sdk/resources/proxies.py
+++ b/src/mobilerun_sdk/resources/proxies.py
@@ -29,8 +29,6 @@
class ProxiesResource(SyncAPIResource):
- """Network Proxies"""
-
@cached_property
def with_raw_response(self) -> ProxiesResourceWithRawResponse:
"""
@@ -67,8 +65,12 @@ def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyCreateResponse:
- """
- Create a new proxy config
+ """Creates a proxy config.
+
+ The body is a discriminated union on `protocol`:
+ `socks5` requires name, host, port, user, and password, while `wireguard`
+ requires name and a config string. Returns the created config with its generated
+ `proxyId`.
Args:
extra_headers: Send extra headers
@@ -95,8 +97,12 @@ def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyCreateResponse:
- """
- Create a new proxy config
+ """Creates a proxy config.
+
+ The body is a discriminated union on `protocol`:
+ `socks5` requires name, host, port, user, and password, while `wireguard`
+ requires name and a config string. Returns the created config with its generated
+ `proxyId`.
Args:
extra_headers: Send extra headers
@@ -158,8 +164,11 @@ def retrieve(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyRetrieveResponse:
- """
- Get a specific proxy config
+ """Fetches a single proxy config by its `proxyId`.
+
+ The response shape depends on
+ the proxy's `protocol` (socks5 or wireguard). Returns not found if no matching
+ config exists.
Args:
extra_headers: Send extra headers
@@ -198,8 +207,11 @@ def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyUpdateResponse:
- """
- Update a proxy config
+ """Replaces the proxy config identified by `proxyId` with the provided body.
+
+ As
+ with creation, the body is a `protocol`-discriminated union of socks5 or
+ wireguard fields. Returns the updated config.
Args:
extra_headers: Send extra headers
@@ -227,8 +239,11 @@ def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyUpdateResponse:
- """
- Update a proxy config
+ """Replaces the proxy config identified by `proxyId` with the provided body.
+
+ As
+ with creation, the body is a `protocol`-discriminated union of socks5 or
+ wireguard fields. Returns the updated config.
Args:
extra_headers: Send extra headers
@@ -293,8 +308,10 @@ def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyListResponse:
- """
- List all proxy configs for the authenticated user
+ """Returns all proxy configs for the authenticated user.
+
+ An optional `protocol`
+ query parameter (`socks5` or `wireguard`) filters the results by proxy type.
Args:
extra_headers: Send extra headers
@@ -329,7 +346,8 @@ def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyDeleteResponse:
"""
- Delete a proxy config
+ Permanently deletes the proxy config identified by `proxyId` and returns the
+ deleted config. Returns not found if no matching config exists.
Args:
extra_headers: Send extra headers
@@ -386,8 +404,6 @@ def lookup(
class AsyncProxiesResource(AsyncAPIResource):
- """Network Proxies"""
-
@cached_property
def with_raw_response(self) -> AsyncProxiesResourceWithRawResponse:
"""
@@ -424,8 +440,12 @@ async def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyCreateResponse:
- """
- Create a new proxy config
+ """Creates a proxy config.
+
+ The body is a discriminated union on `protocol`:
+ `socks5` requires name, host, port, user, and password, while `wireguard`
+ requires name and a config string. Returns the created config with its generated
+ `proxyId`.
Args:
extra_headers: Send extra headers
@@ -452,8 +472,12 @@ async def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyCreateResponse:
- """
- Create a new proxy config
+ """Creates a proxy config.
+
+ The body is a discriminated union on `protocol`:
+ `socks5` requires name, host, port, user, and password, while `wireguard`
+ requires name and a config string. Returns the created config with its generated
+ `proxyId`.
Args:
extra_headers: Send extra headers
@@ -515,8 +539,11 @@ async def retrieve(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyRetrieveResponse:
- """
- Get a specific proxy config
+ """Fetches a single proxy config by its `proxyId`.
+
+ The response shape depends on
+ the proxy's `protocol` (socks5 or wireguard). Returns not found if no matching
+ config exists.
Args:
extra_headers: Send extra headers
@@ -555,8 +582,11 @@ async def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyUpdateResponse:
- """
- Update a proxy config
+ """Replaces the proxy config identified by `proxyId` with the provided body.
+
+ As
+ with creation, the body is a `protocol`-discriminated union of socks5 or
+ wireguard fields. Returns the updated config.
Args:
extra_headers: Send extra headers
@@ -584,8 +614,11 @@ async def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyUpdateResponse:
- """
- Update a proxy config
+ """Replaces the proxy config identified by `proxyId` with the provided body.
+
+ As
+ with creation, the body is a `protocol`-discriminated union of socks5 or
+ wireguard fields. Returns the updated config.
Args:
extra_headers: Send extra headers
@@ -650,8 +683,10 @@ async def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyListResponse:
- """
- List all proxy configs for the authenticated user
+ """Returns all proxy configs for the authenticated user.
+
+ An optional `protocol`
+ query parameter (`socks5` or `wireguard`) filters the results by proxy type.
Args:
extra_headers: Send extra headers
@@ -686,7 +721,8 @@ async def delete(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ProxyDeleteResponse:
"""
- Delete a proxy config
+ Permanently deletes the proxy config identified by `proxyId` and returns the
+ deleted config. Returns not found if no matching config exists.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/webhooks/deliveries.py b/src/mobilerun_sdk/resources/webhooks/deliveries.py
index 6f0e6a3..8ad45fa 100644
--- a/src/mobilerun_sdk/resources/webhooks/deliveries.py
+++ b/src/mobilerun_sdk/resources/webhooks/deliveries.py
@@ -63,7 +63,10 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeliveryListResponse:
"""
- List deliveries across all your webhooks
+ Returns a paginated feed of webhook deliveries across all of your subscriptions,
+ with the originating endpoint URL included on each record. Results can be
+ filtered by delivery status (pending, success, skipped, or dead) and by a
+ `since` timestamp.
Args:
extra_headers: Send extra headers
@@ -108,7 +111,9 @@ def list_for_webhook(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeliveryListForWebhookResponse:
"""
- List deliveries for a webhook
+ Returns a paginated list of deliveries for a single webhook subscription,
+ identified by its id. Each record reports the event, delivery status, attempt
+ count, and the last response code or error.
Args:
extra_headers: Send extra headers
@@ -152,7 +157,9 @@ def retrieve_attempts(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeliveryRetrieveAttemptsResponse:
"""
- Get a delivery with its attempts
+ Returns a single delivery for a webhook subscription along with the full list of
+ captured attempt records. Each attempt includes the request URL, method, headers
+ and body, whether it was signed, and the response status, headers, and snippet.
Args:
extra_headers: Send extra headers
@@ -187,7 +194,10 @@ def stats(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeliveryStatsResponse:
"""
- Aggregate delivery statistics (excludes test sends)
+ Returns aggregate delivery statistics across all of your webhooks, including the
+ total count, a breakdown by status (pending, success, skipped, dead), and the
+ overall success rate. An optional `since` timestamp narrows the reporting
+ window.
Args:
extra_headers: Send extra headers
@@ -246,7 +256,10 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeliveryListResponse:
"""
- List deliveries across all your webhooks
+ Returns a paginated feed of webhook deliveries across all of your subscriptions,
+ with the originating endpoint URL included on each record. Results can be
+ filtered by delivery status (pending, success, skipped, or dead) and by a
+ `since` timestamp.
Args:
extra_headers: Send extra headers
@@ -291,7 +304,9 @@ async def list_for_webhook(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeliveryListForWebhookResponse:
"""
- List deliveries for a webhook
+ Returns a paginated list of deliveries for a single webhook subscription,
+ identified by its id. Each record reports the event, delivery status, attempt
+ count, and the last response code or error.
Args:
extra_headers: Send extra headers
@@ -335,7 +350,9 @@ async def retrieve_attempts(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeliveryRetrieveAttemptsResponse:
"""
- Get a delivery with its attempts
+ Returns a single delivery for a webhook subscription along with the full list of
+ captured attempt records. Each attempt includes the request URL, method, headers
+ and body, whether it was signed, and the response status, headers, and snippet.
Args:
extra_headers: Send extra headers
@@ -370,7 +387,10 @@ async def stats(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DeliveryStatsResponse:
"""
- Aggregate delivery statistics (excludes test sends)
+ Returns aggregate delivery statistics across all of your webhooks, including the
+ total count, a breakdown by status (pending, success, skipped, dead), and the
+ overall success rate. An optional `since` timestamp narrows the reporting
+ window.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/webhooks/webhooks.py b/src/mobilerun_sdk/resources/webhooks/webhooks.py
index 259c19b..524a188 100644
--- a/src/mobilerun_sdk/resources/webhooks/webhooks.py
+++ b/src/mobilerun_sdk/resources/webhooks/webhooks.py
@@ -76,7 +76,10 @@ def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookCreateResponse:
"""
- Register a webhook subscription
+ Creates a webhook subscription with a delivery URL and an optional list of event
+ types to subscribe to (defaults to all when omitted). The response includes the
+ generated signing secret, which is returned only once at creation time and
+ cannot be retrieved later.
Args:
extra_headers: Send extra headers
@@ -115,7 +118,9 @@ def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookRetrieveResponse:
"""
- Get a webhook subscription
+ Returns a single webhook subscription by id, including its URL, subscribed event
+ types, state, and system-observed delivery health. The signing secret is never
+ included.
Args:
extra_headers: Send extra headers
@@ -150,8 +155,12 @@ def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookUpdateResponse:
- """
- Update a webhook subscription
+ """Updates a webhook subscription.
+
+ Any combination of the subscribed event types,
+ state (ACTIVE or DISABLED), and description may be changed, and at least one
+ field must be supplied. Setting state to ACTIVE re-enables a subscription that
+ was auto-blocked after sustained delivery failures.
Args:
extra_headers: Send extra headers
@@ -194,7 +203,9 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookListResponse:
"""
- List your webhook subscriptions
+ Returns a paginated list of your webhook subscriptions, optionally filtered by
+ status (active, failing, blocked, or disabled). The response also includes
+ per-status counts across all of your subscriptions.
Args:
extra_headers: Send extra headers
@@ -235,8 +246,10 @@ def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Delete a webhook subscription
+ """Deletes a webhook subscription so it stops receiving deliveries.
+
+ Returns 204 No
+ Content on success.
Args:
extra_headers: Send extra headers
@@ -268,7 +281,11 @@ def event_types(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookEventTypesResponse:
- """List subscribable event types per source"""
+ """
+ Returns the catalog of event types that webhook subscriptions can subscribe to,
+ grouped by source. Use the returned type identifiers as the `eventTypes` values
+ when creating or updating a webhook.
+ """
return self._get(
"/event-types",
options=make_request_options(
@@ -289,7 +306,9 @@ def rotate_secret(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookRotateSecretResponse:
"""
- Rotate the signing secret (returned once)
+ Generates a new signing secret for the webhook subscription and returns it once
+ in the response. The previous secret is replaced immediately, so any signature
+ verification on your endpoint must be updated to use the new value.
Args:
extra_headers: Send extra headers
@@ -322,7 +341,9 @@ def test_delivery(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookTestDeliveryResponse:
"""
- Send a one-shot test delivery
+ Sends a single test payload to the webhook subscription URL to verify
+ connectivity. The response reports whether the attempt succeeded along with the
+ returned HTTP status code or error, if any.
Args:
extra_headers: Send extra headers
@@ -382,7 +403,10 @@ async def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookCreateResponse:
"""
- Register a webhook subscription
+ Creates a webhook subscription with a delivery URL and an optional list of event
+ types to subscribe to (defaults to all when omitted). The response includes the
+ generated signing secret, which is returned only once at creation time and
+ cannot be retrieved later.
Args:
extra_headers: Send extra headers
@@ -421,7 +445,9 @@ async def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookRetrieveResponse:
"""
- Get a webhook subscription
+ Returns a single webhook subscription by id, including its URL, subscribed event
+ types, state, and system-observed delivery health. The signing secret is never
+ included.
Args:
extra_headers: Send extra headers
@@ -456,8 +482,12 @@ async def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookUpdateResponse:
- """
- Update a webhook subscription
+ """Updates a webhook subscription.
+
+ Any combination of the subscribed event types,
+ state (ACTIVE or DISABLED), and description may be changed, and at least one
+ field must be supplied. Setting state to ACTIVE re-enables a subscription that
+ was auto-blocked after sustained delivery failures.
Args:
extra_headers: Send extra headers
@@ -500,7 +530,9 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookListResponse:
"""
- List your webhook subscriptions
+ Returns a paginated list of your webhook subscriptions, optionally filtered by
+ status (active, failing, blocked, or disabled). The response also includes
+ per-status counts across all of your subscriptions.
Args:
extra_headers: Send extra headers
@@ -541,8 +573,10 @@ async def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
- """
- Delete a webhook subscription
+ """Deletes a webhook subscription so it stops receiving deliveries.
+
+ Returns 204 No
+ Content on success.
Args:
extra_headers: Send extra headers
@@ -574,7 +608,11 @@ async def event_types(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookEventTypesResponse:
- """List subscribable event types per source"""
+ """
+ Returns the catalog of event types that webhook subscriptions can subscribe to,
+ grouped by source. Use the returned type identifiers as the `eventTypes` values
+ when creating or updating a webhook.
+ """
return await self._get(
"/event-types",
options=make_request_options(
@@ -595,7 +633,9 @@ async def rotate_secret(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookRotateSecretResponse:
"""
- Rotate the signing secret (returned once)
+ Generates a new signing secret for the webhook subscription and returns it once
+ in the response. The previous secret is replaced immediately, so any signature
+ verification on your endpoint must be updated to use the new value.
Args:
extra_headers: Send extra headers
@@ -628,7 +668,9 @@ async def test_delivery(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> WebhookTestDeliveryResponse:
"""
- Send a one-shot test delivery
+ Sends a single test payload to the webhook subscription URL to verify
+ connectivity. The response reports whether the attempt succeeded along with the
+ returned HTTP status code or error, if any.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/workflows/action_catalog.py b/src/mobilerun_sdk/resources/workflows/action_catalog.py
index b637dd4..da75896 100644
--- a/src/mobilerun_sdk/resources/workflows/action_catalog.py
+++ b/src/mobilerun_sdk/resources/workflows/action_catalog.py
@@ -56,7 +56,8 @@ def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionCatalogRetrieveResponse:
"""
- Get a catalog entry
+ Fetch a single action catalog entry by its ID, including its service, method,
+ and parameter schema. Returns 404 if no entry matches.
Args:
extra_headers: Send extra headers
@@ -91,7 +92,9 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionCatalogListResponse:
"""
- List action catalog entries
+ Return a paginated list of catalog entries — the service/method templates that
+ actions are created from, each carrying its parameter schema. Supports filtering
+ by `service`.
Args:
extra_headers: Send extra headers
@@ -154,7 +157,8 @@ async def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionCatalogRetrieveResponse:
"""
- Get a catalog entry
+ Fetch a single action catalog entry by its ID, including its service, method,
+ and parameter schema. Returns 404 if no entry matches.
Args:
extra_headers: Send extra headers
@@ -189,7 +193,9 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionCatalogListResponse:
"""
- List action catalog entries
+ Return a paginated list of catalog entries — the service/method templates that
+ actions are created from, each carrying its parameter schema. Supports filtering
+ by `service`.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/workflows/actions/actions.py b/src/mobilerun_sdk/resources/workflows/actions/actions.py
index 2b4723a..d99bbf4 100644
--- a/src/mobilerun_sdk/resources/workflows/actions/actions.py
+++ b/src/mobilerun_sdk/resources/workflows/actions/actions.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from typing import Dict, Optional
+from typing import Dict
from typing_extensions import Literal
import httpx
@@ -66,7 +66,7 @@ def create(
catalog_entry_id: str,
name: str,
description: str | Omit = omit,
- params: Dict[str, Optional[object]] | Omit = omit,
+ params: Dict[str, object] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -75,7 +75,9 @@ def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionCreateResponse:
"""
- Create an action
+ Create a reusable action from a catalog entry (`catalogEntryId`), with an
+ optional `params` object supplying the values for that entry's service method.
+ Returns 400 if the params are invalid for the chosen catalog entry.
Args:
extra_headers: Send extra headers
@@ -115,7 +117,8 @@ def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionRetrieveResponse:
"""
- Get an action
+ Fetch a single action by its ID, including its configured service, method, and
+ params. Returns 404 if no action matches.
Args:
extra_headers: Send extra headers
@@ -142,7 +145,7 @@ def update(
*,
description: str | Omit = omit,
name: str | Omit = omit,
- params: Dict[str, Optional[object]] | Omit = omit,
+ params: Dict[str, object] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -151,7 +154,8 @@ def update(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionUpdateResponse:
"""
- Update an action
+ Partially update an action's name, description, or params; all fields are
+ optional. Returns 404 if the action does not exist.
Args:
extra_headers: Send extra headers
@@ -196,8 +200,10 @@ def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionListResponse:
- """
- List actions
+ """Return a paginated list of actions.
+
+ Supports filtering by `service`, free-text
+ `search`, and ordering by name, createdAt, or updatedAt.
Args:
extra_headers: Send extra headers
@@ -241,8 +247,9 @@ def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionDeleteResponse:
- """
- Delete an action
+ """Delete an action by its ID.
+
+ Returns 404 if no action matches.
Args:
extra_headers: Send extra headers
@@ -294,7 +301,7 @@ async def create(
catalog_entry_id: str,
name: str,
description: str | Omit = omit,
- params: Dict[str, Optional[object]] | Omit = omit,
+ params: Dict[str, object] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -303,7 +310,9 @@ async def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionCreateResponse:
"""
- Create an action
+ Create a reusable action from a catalog entry (`catalogEntryId`), with an
+ optional `params` object supplying the values for that entry's service method.
+ Returns 400 if the params are invalid for the chosen catalog entry.
Args:
extra_headers: Send extra headers
@@ -343,7 +352,8 @@ async def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionRetrieveResponse:
"""
- Get an action
+ Fetch a single action by its ID, including its configured service, method, and
+ params. Returns 404 if no action matches.
Args:
extra_headers: Send extra headers
@@ -370,7 +380,7 @@ async def update(
*,
description: str | Omit = omit,
name: str | Omit = omit,
- params: Dict[str, Optional[object]] | Omit = omit,
+ params: Dict[str, object] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -379,7 +389,8 @@ async def update(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionUpdateResponse:
"""
- Update an action
+ Partially update an action's name, description, or params; all fields are
+ optional. Returns 404 if the action does not exist.
Args:
extra_headers: Send extra headers
@@ -424,8 +435,10 @@ async def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionListResponse:
- """
- List actions
+ """Return a paginated list of actions.
+
+ Supports filtering by `service`, free-text
+ `search`, and ordering by name, createdAt, or updatedAt.
Args:
extra_headers: Send extra headers
@@ -469,8 +482,9 @@ async def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionDeleteResponse:
- """
- Delete an action
+ """Delete an action by its ID.
+
+ Returns 404 if no action matches.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/workflows/actions/services.py b/src/mobilerun_sdk/resources/workflows/actions/services.py
index fd46c48..c96a5ba 100644
--- a/src/mobilerun_sdk/resources/workflows/actions/services.py
+++ b/src/mobilerun_sdk/resources/workflows/actions/services.py
@@ -51,7 +51,11 @@ def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ServiceListResponse:
- """List available services"""
+ """Return the names of the services that actions can be built against.
+
+ Use these
+ values to look up each service's allowed methods.
+ """
return self._get(
"/actions/services",
options=make_request_options(
@@ -72,7 +76,9 @@ def list_methods(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ServiceListMethodsResponse:
"""
- List allowed methods for a service
+ Return the methods allowed for the given service, each with its parameter
+ definitions (name, type, whether required, description, and optional
+ default/example). Returns 404 if the service is unknown.
Args:
extra_headers: Send extra headers
@@ -124,7 +130,11 @@ async def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ServiceListResponse:
- """List available services"""
+ """Return the names of the services that actions can be built against.
+
+ Use these
+ values to look up each service's allowed methods.
+ """
return await self._get(
"/actions/services",
options=make_request_options(
@@ -145,7 +155,9 @@ async def list_methods(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ServiceListMethodsResponse:
"""
- List allowed methods for a service
+ Return the methods allowed for the given service, each with its parameter
+ definitions (name, type, whether required, description, and optional
+ default/example). Returns 404 if the service is unknown.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/workflows/events/events.py b/src/mobilerun_sdk/resources/workflows/events.py
similarity index 82%
rename from src/mobilerun_sdk/resources/workflows/events/events.py
rename to src/mobilerun_sdk/resources/workflows/events.py
index 450f4bb..b585ec6 100644
--- a/src/mobilerun_sdk/resources/workflows/events/events.py
+++ b/src/mobilerun_sdk/resources/workflows/events.py
@@ -2,41 +2,29 @@
from __future__ import annotations
-from typing import Dict, Optional
+from typing import Dict
import httpx
-from .catalog import (
- CatalogResource,
- AsyncCatalogResource,
- CatalogResourceWithRawResponse,
- AsyncCatalogResourceWithRawResponse,
- CatalogResourceWithStreamingResponse,
- AsyncCatalogResourceWithStreamingResponse,
-)
-from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ...._utils import maybe_transform, async_maybe_transform
-from ...._compat import cached_property
-from ...._resource import SyncAPIResource, AsyncAPIResource
-from ...._response import (
+from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from ..._utils import maybe_transform, async_maybe_transform
+from ..._compat import cached_property
+from ..._resource import SyncAPIResource, AsyncAPIResource
+from ..._response import (
to_raw_response_wrapper,
to_streamed_response_wrapper,
async_to_raw_response_wrapper,
async_to_streamed_response_wrapper,
)
-from ...._base_client import make_request_options
-from ....types.workflows import event_ingest_params, event_dry_run_params
-from ....types.workflows.event_ingest_response import EventIngestResponse
-from ....types.workflows.event_dry_run_response import EventDryRunResponse
+from ..._base_client import make_request_options
+from ...types.workflows import event_ingest_params, event_dry_run_params
+from ...types.workflows.event_ingest_response import EventIngestResponse
+from ...types.workflows.event_dry_run_response import EventDryRunResponse
__all__ = ["EventsResource", "AsyncEventsResource"]
class EventsResource(SyncAPIResource):
- @cached_property
- def catalog(self) -> CatalogResource:
- return CatalogResource(self._client)
-
@cached_property
def with_raw_response(self) -> EventsResourceWithRawResponse:
"""
@@ -60,7 +48,8 @@ def dry_run(
self,
*,
event_type: str,
- payload: Dict[str, Optional[object]] | Omit = omit,
+ device_id: str | Omit = omit,
+ payload: Dict[str, object] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -87,6 +76,7 @@ def dry_run(
body=maybe_transform(
{
"event_type": event_type,
+ "device_id": device_id,
"payload": payload,
},
event_dry_run_params.EventDryRunParams,
@@ -101,7 +91,8 @@ def ingest(
self,
*,
event_type: str,
- payload: Dict[str, Optional[object]] | Omit = omit,
+ device_id: str | Omit = omit,
+ payload: Dict[str, object] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -127,6 +118,7 @@ def ingest(
body=maybe_transform(
{
"event_type": event_type,
+ "device_id": device_id,
"payload": payload,
},
event_ingest_params.EventIngestParams,
@@ -139,10 +131,6 @@ def ingest(
class AsyncEventsResource(AsyncAPIResource):
- @cached_property
- def catalog(self) -> AsyncCatalogResource:
- return AsyncCatalogResource(self._client)
-
@cached_property
def with_raw_response(self) -> AsyncEventsResourceWithRawResponse:
"""
@@ -166,7 +154,8 @@ async def dry_run(
self,
*,
event_type: str,
- payload: Dict[str, Optional[object]] | Omit = omit,
+ device_id: str | Omit = omit,
+ payload: Dict[str, object] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -193,6 +182,7 @@ async def dry_run(
body=await async_maybe_transform(
{
"event_type": event_type,
+ "device_id": device_id,
"payload": payload,
},
event_dry_run_params.EventDryRunParams,
@@ -207,7 +197,8 @@ async def ingest(
self,
*,
event_type: str,
- payload: Dict[str, Optional[object]] | Omit = omit,
+ device_id: str | Omit = omit,
+ payload: Dict[str, object] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
@@ -233,6 +224,7 @@ async def ingest(
body=await async_maybe_transform(
{
"event_type": event_type,
+ "device_id": device_id,
"payload": payload,
},
event_ingest_params.EventIngestParams,
@@ -255,10 +247,6 @@ def __init__(self, events: EventsResource) -> None:
events.ingest,
)
- @cached_property
- def catalog(self) -> CatalogResourceWithRawResponse:
- return CatalogResourceWithRawResponse(self._events.catalog)
-
class AsyncEventsResourceWithRawResponse:
def __init__(self, events: AsyncEventsResource) -> None:
@@ -271,10 +259,6 @@ def __init__(self, events: AsyncEventsResource) -> None:
events.ingest,
)
- @cached_property
- def catalog(self) -> AsyncCatalogResourceWithRawResponse:
- return AsyncCatalogResourceWithRawResponse(self._events.catalog)
-
class EventsResourceWithStreamingResponse:
def __init__(self, events: EventsResource) -> None:
@@ -287,10 +271,6 @@ def __init__(self, events: EventsResource) -> None:
events.ingest,
)
- @cached_property
- def catalog(self) -> CatalogResourceWithStreamingResponse:
- return CatalogResourceWithStreamingResponse(self._events.catalog)
-
class AsyncEventsResourceWithStreamingResponse:
def __init__(self, events: AsyncEventsResource) -> None:
@@ -302,7 +282,3 @@ def __init__(self, events: AsyncEventsResource) -> None:
self.ingest = async_to_streamed_response_wrapper(
events.ingest,
)
-
- @cached_property
- def catalog(self) -> AsyncCatalogResourceWithStreamingResponse:
- return AsyncCatalogResourceWithStreamingResponse(self._events.catalog)
diff --git a/src/mobilerun_sdk/resources/workflows/events/__init__.py b/src/mobilerun_sdk/resources/workflows/events/__init__.py
deleted file mode 100644
index 2c1e382..0000000
--- a/src/mobilerun_sdk/resources/workflows/events/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .events import (
- EventsResource,
- AsyncEventsResource,
- EventsResourceWithRawResponse,
- AsyncEventsResourceWithRawResponse,
- EventsResourceWithStreamingResponse,
- AsyncEventsResourceWithStreamingResponse,
-)
-from .catalog import (
- CatalogResource,
- AsyncCatalogResource,
- CatalogResourceWithRawResponse,
- AsyncCatalogResourceWithRawResponse,
- CatalogResourceWithStreamingResponse,
- AsyncCatalogResourceWithStreamingResponse,
-)
-
-__all__ = [
- "CatalogResource",
- "AsyncCatalogResource",
- "CatalogResourceWithRawResponse",
- "AsyncCatalogResourceWithRawResponse",
- "CatalogResourceWithStreamingResponse",
- "AsyncCatalogResourceWithStreamingResponse",
- "EventsResource",
- "AsyncEventsResource",
- "EventsResourceWithRawResponse",
- "AsyncEventsResourceWithRawResponse",
- "EventsResourceWithStreamingResponse",
- "AsyncEventsResourceWithStreamingResponse",
-]
diff --git a/src/mobilerun_sdk/resources/workflows/events/catalog.py b/src/mobilerun_sdk/resources/workflows/events/catalog.py
deleted file mode 100644
index 73c22cc..0000000
--- a/src/mobilerun_sdk/resources/workflows/events/catalog.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Iterable
-from typing_extensions import Literal
-
-import httpx
-
-from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ...._utils import maybe_transform, async_maybe_transform
-from ...._compat import cached_property
-from ...._resource import SyncAPIResource, AsyncAPIResource
-from ...._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from ...._base_client import make_request_options
-from ....types.workflows.events import catalog_list_params, catalog_register_params
-from ....types.workflows.events.catalog_list_response import CatalogListResponse
-from ....types.workflows.events.catalog_register_response import CatalogRegisterResponse
-
-__all__ = ["CatalogResource", "AsyncCatalogResource"]
-
-
-class CatalogResource(SyncAPIResource):
- @cached_property
- def with_raw_response(self) -> CatalogResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/droidrun/mobilerun-sdk-python#accessing-raw-response-data-eg-headers
- """
- return CatalogResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> CatalogResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/droidrun/mobilerun-sdk-python#with_streaming_response
- """
- return CatalogResourceWithStreamingResponse(self)
-
- def list(
- self,
- *,
- page: int | Omit = omit,
- page_size: int | Omit = omit,
- source: Literal["device", "system", "webhook"] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> CatalogListResponse:
- """
- List event catalog
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/events/catalog",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "page": page,
- "page_size": page_size,
- "source": source,
- },
- catalog_list_params.CatalogListParams,
- ),
- ),
- cast_to=CatalogListResponse,
- )
-
- def register(
- self,
- *,
- events: Iterable[catalog_register_params.Event],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> CatalogRegisterResponse:
- """
- Register event types in the catalog
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._post(
- "/events/catalog/register",
- body=maybe_transform({"events": events}, catalog_register_params.CatalogRegisterParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=CatalogRegisterResponse,
- )
-
-
-class AsyncCatalogResource(AsyncAPIResource):
- @cached_property
- def with_raw_response(self) -> AsyncCatalogResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/droidrun/mobilerun-sdk-python#accessing-raw-response-data-eg-headers
- """
- return AsyncCatalogResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncCatalogResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/droidrun/mobilerun-sdk-python#with_streaming_response
- """
- return AsyncCatalogResourceWithStreamingResponse(self)
-
- async def list(
- self,
- *,
- page: int | Omit = omit,
- page_size: int | Omit = omit,
- source: Literal["device", "system", "webhook"] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> CatalogListResponse:
- """
- List event catalog
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/events/catalog",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "page": page,
- "page_size": page_size,
- "source": source,
- },
- catalog_list_params.CatalogListParams,
- ),
- ),
- cast_to=CatalogListResponse,
- )
-
- async def register(
- self,
- *,
- events: Iterable[catalog_register_params.Event],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> CatalogRegisterResponse:
- """
- Register event types in the catalog
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._post(
- "/events/catalog/register",
- body=await async_maybe_transform({"events": events}, catalog_register_params.CatalogRegisterParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=CatalogRegisterResponse,
- )
-
-
-class CatalogResourceWithRawResponse:
- def __init__(self, catalog: CatalogResource) -> None:
- self._catalog = catalog
-
- self.list = to_raw_response_wrapper(
- catalog.list,
- )
- self.register = to_raw_response_wrapper(
- catalog.register,
- )
-
-
-class AsyncCatalogResourceWithRawResponse:
- def __init__(self, catalog: AsyncCatalogResource) -> None:
- self._catalog = catalog
-
- self.list = async_to_raw_response_wrapper(
- catalog.list,
- )
- self.register = async_to_raw_response_wrapper(
- catalog.register,
- )
-
-
-class CatalogResourceWithStreamingResponse:
- def __init__(self, catalog: CatalogResource) -> None:
- self._catalog = catalog
-
- self.list = to_streamed_response_wrapper(
- catalog.list,
- )
- self.register = to_streamed_response_wrapper(
- catalog.register,
- )
-
-
-class AsyncCatalogResourceWithStreamingResponse:
- def __init__(self, catalog: AsyncCatalogResource) -> None:
- self._catalog = catalog
-
- self.list = async_to_streamed_response_wrapper(
- catalog.list,
- )
- self.register = async_to_streamed_response_wrapper(
- catalog.register,
- )
diff --git a/src/mobilerun_sdk/resources/workflows/executions.py b/src/mobilerun_sdk/resources/workflows/executions.py
index 4d12f2d..c8a4840 100644
--- a/src/mobilerun_sdk/resources/workflows/executions.py
+++ b/src/mobilerun_sdk/resources/workflows/executions.py
@@ -58,7 +58,8 @@ def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ExecutionRetrieveResponse:
"""
- Get execution details
+ Fetch a single flow execution by its ID, including its status, kind, result or
+ error, and start/finish timestamps. Returns 404 if no execution matches.
Args:
extra_headers: Send extra headers
@@ -99,8 +100,11 @@ def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ExecutionListResponse:
- """
- List flow executions
+ """Return a paginated history of flow executions.
+
+ Supports filtering by `flowId`,
+ `triggerId`, `status`, and a `from`/`to` time range, plus free-text `search` and
+ ordering by startedAt, finishedAt, or status.
Args:
extra_headers: Send extra headers
@@ -152,7 +156,9 @@ def get_metrics(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ExecutionGetMetricsResponse:
"""
- Get execution metrics
+ Return aggregate execution metrics — total count, counts by status, average
+ duration, and the last execution time. Can be scoped by `flowId`, `triggerId`,
+ and a `from`/`to` time range.
Args:
extra_headers: Send extra headers
@@ -216,7 +222,8 @@ async def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ExecutionRetrieveResponse:
"""
- Get execution details
+ Fetch a single flow execution by its ID, including its status, kind, result or
+ error, and start/finish timestamps. Returns 404 if no execution matches.
Args:
extra_headers: Send extra headers
@@ -257,8 +264,11 @@ async def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ExecutionListResponse:
- """
- List flow executions
+ """Return a paginated history of flow executions.
+
+ Supports filtering by `flowId`,
+ `triggerId`, `status`, and a `from`/`to` time range, plus free-text `search` and
+ ordering by startedAt, finishedAt, or status.
Args:
extra_headers: Send extra headers
@@ -310,7 +320,9 @@ async def get_metrics(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ExecutionGetMetricsResponse:
"""
- Get execution metrics
+ Return aggregate execution metrics — total count, counts by status, average
+ duration, and the last execution time. Can be scoped by `flowId`, `triggerId`,
+ and a `from`/`to` time range.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/workflows/flows/actions.py b/src/mobilerun_sdk/resources/workflows/flows/actions.py
index 06e3278..cec5aa4 100644
--- a/src/mobilerun_sdk/resources/workflows/flows/actions.py
+++ b/src/mobilerun_sdk/resources/workflows/flows/actions.py
@@ -60,7 +60,8 @@ def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionListResponse:
"""
- List actions for a flow
+ Return the ordered list of actions attached to a flow, including any nested
+ child actions. Returns 404 if the flow does not exist.
Args:
extra_headers: Send extra headers
@@ -100,7 +101,10 @@ def add(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionAddResponse:
"""
- Add an action to a flow
+ Append a single action to a flow at the given `position`, optionally nesting it
+ under a `parentFlowActionId` or supplying its own `children`. Supports a
+ `nameOverride`, param `overrides`, and `continueOnError`. Returns 404 if the
+ flow does not exist.
Args:
extra_headers: Send extra headers
@@ -145,8 +149,10 @@ def remove(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionRemoveResponse:
- """
- Remove an action from a flow
+ """Remove a single action from a flow by its `flowActionId`.
+
+ Returns 404 if the
+ flow or flow action does not exist.
Args:
extra_headers: Send extra headers
@@ -182,7 +188,10 @@ def replace(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionReplaceResponse:
"""
- Replace all actions for a flow
+ Replace a flow's entire action list with the supplied set (at least one
+ required). Each action references an `actionId` and a unique `position`, and may
+ include nested `children`, a `nameOverride`, param `overrides`, and a
+ `continueOnError` flag. Returns 404 if the flow does not exist.
Args:
extra_headers: Send extra headers
@@ -237,7 +246,8 @@ async def list(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionListResponse:
"""
- List actions for a flow
+ Return the ordered list of actions attached to a flow, including any nested
+ child actions. Returns 404 if the flow does not exist.
Args:
extra_headers: Send extra headers
@@ -277,7 +287,10 @@ async def add(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionAddResponse:
"""
- Add an action to a flow
+ Append a single action to a flow at the given `position`, optionally nesting it
+ under a `parentFlowActionId` or supplying its own `children`. Supports a
+ `nameOverride`, param `overrides`, and `continueOnError`. Returns 404 if the
+ flow does not exist.
Args:
extra_headers: Send extra headers
@@ -322,8 +335,10 @@ async def remove(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionRemoveResponse:
- """
- Remove an action from a flow
+ """Remove a single action from a flow by its `flowActionId`.
+
+ Returns 404 if the
+ flow or flow action does not exist.
Args:
extra_headers: Send extra headers
@@ -359,7 +374,10 @@ async def replace(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ActionReplaceResponse:
"""
- Replace all actions for a flow
+ Replace a flow's entire action list with the supplied set (at least one
+ required). Each action references an `actionId` and a unique `position`, and may
+ include nested `children`, a `nameOverride`, param `overrides`, and a
+ `continueOnError` flag. Returns 404 if the flow does not exist.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/workflows/flows/flows.py b/src/mobilerun_sdk/resources/workflows/flows/flows.py
index c1acea9..9129d93 100644
--- a/src/mobilerun_sdk/resources/workflows/flows/flows.py
+++ b/src/mobilerun_sdk/resources/workflows/flows/flows.py
@@ -84,7 +84,10 @@ def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowCreateResponse:
"""
- Create a flow
+ Create a flow that binds a trigger (`triggerId`) to an ordered list of actions,
+ with at least one action required. Optional settings include target `deviceIds`,
+ a cooldown (`cooldownSeconds`/`cooldownScope`), and webhook notifications on
+ success or failure.
Args:
extra_headers: Send extra headers
@@ -131,7 +134,8 @@ def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowRetrieveResponse:
"""
- Get a flow
+ Fetch a single flow by its ID, including its trigger binding, configuration, and
+ current status. Returns 404 if no flow matches.
Args:
extra_headers: Send extra headers
@@ -174,7 +178,10 @@ def update(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowUpdateResponse:
"""
- Update a flow
+ Partially update a flow's settings — name, trigger binding, enabled state,
+ target devices, cooldown, or notifications; all fields are optional. Actions are
+ managed through the flow-actions endpoints, not here. Returns 404 if the flow
+ does not exist.
Args:
extra_headers: Send extra headers
@@ -228,8 +235,11 @@ def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowListResponse:
- """
- List flows
+ """Return a paginated list of flows.
+
+ Supports filtering by `triggerId`, `enabled`,
+ and one or more health `status` values (healthy, failing, blocked), plus
+ free-text `search` and ordering.
Args:
extra_headers: Send extra headers
@@ -275,8 +285,9 @@ def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowDeleteResponse:
- """
- Delete a flow
+ """Delete a flow by its ID.
+
+ Returns 404 if no flow matches.
Args:
extra_headers: Send extra headers
@@ -310,8 +321,11 @@ def clone(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowCloneResponse:
- """
- Clone a flow
+ """Create a copy of an existing flow, including its actions and settings.
+
+ The
+ optional body can override the new flow's `name` and target `deviceIds`. Returns
+ 404 if the source flow does not exist.
Args:
extra_headers: Send extra headers
@@ -421,7 +435,10 @@ async def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowCreateResponse:
"""
- Create a flow
+ Create a flow that binds a trigger (`triggerId`) to an ordered list of actions,
+ with at least one action required. Optional settings include target `deviceIds`,
+ a cooldown (`cooldownSeconds`/`cooldownScope`), and webhook notifications on
+ success or failure.
Args:
extra_headers: Send extra headers
@@ -468,7 +485,8 @@ async def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowRetrieveResponse:
"""
- Get a flow
+ Fetch a single flow by its ID, including its trigger binding, configuration, and
+ current status. Returns 404 if no flow matches.
Args:
extra_headers: Send extra headers
@@ -511,7 +529,10 @@ async def update(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowUpdateResponse:
"""
- Update a flow
+ Partially update a flow's settings — name, trigger binding, enabled state,
+ target devices, cooldown, or notifications; all fields are optional. Actions are
+ managed through the flow-actions endpoints, not here. Returns 404 if the flow
+ does not exist.
Args:
extra_headers: Send extra headers
@@ -565,8 +586,11 @@ async def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowListResponse:
- """
- List flows
+ """Return a paginated list of flows.
+
+ Supports filtering by `triggerId`, `enabled`,
+ and one or more health `status` values (healthy, failing, blocked), plus
+ free-text `search` and ordering.
Args:
extra_headers: Send extra headers
@@ -612,8 +636,9 @@ async def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowDeleteResponse:
- """
- Delete a flow
+ """Delete a flow by its ID.
+
+ Returns 404 if no flow matches.
Args:
extra_headers: Send extra headers
@@ -647,8 +672,11 @@ async def clone(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FlowCloneResponse:
- """
- Clone a flow
+ """Create a copy of an existing flow, including its actions and settings.
+
+ The
+ optional body can override the new flow's `name` and target `deviceIds`. Returns
+ 404 if the source flow does not exist.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/workflows/triggers.py b/src/mobilerun_sdk/resources/workflows/triggers.py
index b6a1b4c..ea8794e 100644
--- a/src/mobilerun_sdk/resources/workflows/triggers.py
+++ b/src/mobilerun_sdk/resources/workflows/triggers.py
@@ -68,7 +68,10 @@ def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerCreateResponse:
"""
- Create a trigger
+ Create a trigger with an activation type of `event`, `schedule`, or `custom`.
+ Each type requires its own fields (e.g. `eventType` and optional `conditions`
+ for events, `scheduleRule` and `timezone` for schedules, `customPayloadSchema`
+ for custom triggers); mismatched fields are rejected.
Args:
custom_payload_schema: Optional JSON Schema for validating payloads sent to this custom trigger
@@ -114,7 +117,8 @@ def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerRetrieveResponse:
"""
- Get a trigger
+ Fetch a single trigger by its ID, including its activation type and
+ type-specific configuration. Returns 404 if no trigger matches.
Args:
extra_headers: Send extra headers
@@ -141,7 +145,7 @@ def update(
*,
activation: Literal["event", "schedule", "custom"] | Omit = omit,
conditions: trigger_update_params.Conditions | Omit = omit,
- custom_payload_schema: Optional[Dict[str, object]] | Omit = omit,
+ custom_payload_schema: Dict[str, object] | Omit = omit,
description: str | Omit = omit,
event_type: str | Omit = omit,
name: str | Omit = omit,
@@ -154,12 +158,13 @@ def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerUpdateResponse:
- """
- Update a trigger
+ """Partially update a trigger; all fields are optional.
- Args:
- custom_payload_schema: Optional JSON Schema for validating payloads sent to this custom trigger
+ When `activation` is
+ changed, the type-specific field rules are re-validated. Returns 404 if the
+ trigger does not exist.
+ Args:
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -208,8 +213,10 @@ def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerListResponse:
- """
- List triggers
+ """Return a paginated list of triggers.
+
+ Supports filtering by `activation` and
+ `eventType`, free-text `search`, and ordering by name, createdAt, or updatedAt.
Args:
extra_headers: Send extra headers
@@ -254,8 +261,9 @@ def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerDeleteResponse:
- """
- Delete a trigger
+ """Delete a trigger by its ID.
+
+ Returns 404 if no trigger matches.
Args:
extra_headers: Send extra headers
@@ -371,7 +379,10 @@ async def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerCreateResponse:
"""
- Create a trigger
+ Create a trigger with an activation type of `event`, `schedule`, or `custom`.
+ Each type requires its own fields (e.g. `eventType` and optional `conditions`
+ for events, `scheduleRule` and `timezone` for schedules, `customPayloadSchema`
+ for custom triggers); mismatched fields are rejected.
Args:
custom_payload_schema: Optional JSON Schema for validating payloads sent to this custom trigger
@@ -417,7 +428,8 @@ async def retrieve(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerRetrieveResponse:
"""
- Get a trigger
+ Fetch a single trigger by its ID, including its activation type and
+ type-specific configuration. Returns 404 if no trigger matches.
Args:
extra_headers: Send extra headers
@@ -444,7 +456,7 @@ async def update(
*,
activation: Literal["event", "schedule", "custom"] | Omit = omit,
conditions: trigger_update_params.Conditions | Omit = omit,
- custom_payload_schema: Optional[Dict[str, object]] | Omit = omit,
+ custom_payload_schema: Dict[str, object] | Omit = omit,
description: str | Omit = omit,
event_type: str | Omit = omit,
name: str | Omit = omit,
@@ -457,12 +469,13 @@ async def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerUpdateResponse:
- """
- Update a trigger
+ """Partially update a trigger; all fields are optional.
- Args:
- custom_payload_schema: Optional JSON Schema for validating payloads sent to this custom trigger
+ When `activation` is
+ changed, the type-specific field rules are re-validated. Returns 404 if the
+ trigger does not exist.
+ Args:
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -511,8 +524,10 @@ async def list(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerListResponse:
- """
- List triggers
+ """Return a paginated list of triggers.
+
+ Supports filtering by `activation` and
+ `eventType`, free-text `search`, and ordering by name, createdAt, or updatedAt.
Args:
extra_headers: Send extra headers
@@ -557,8 +572,9 @@ async def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> TriggerDeleteResponse:
- """
- Delete a trigger
+ """Delete a trigger by its ID.
+
+ Returns 404 if no trigger matches.
Args:
extra_headers: Send extra headers
diff --git a/src/mobilerun_sdk/resources/workflows/workflows.py b/src/mobilerun_sdk/resources/workflows/workflows.py
index 99d44df..000d4bf 100644
--- a/src/mobilerun_sdk/resources/workflows/workflows.py
+++ b/src/mobilerun_sdk/resources/workflows/workflows.py
@@ -2,6 +2,14 @@
from __future__ import annotations
+from .events import (
+ EventsResource,
+ AsyncEventsResource,
+ EventsResourceWithRawResponse,
+ AsyncEventsResourceWithRawResponse,
+ EventsResourceWithStreamingResponse,
+ AsyncEventsResourceWithStreamingResponse,
+)
from .triggers import (
TriggersResource,
AsyncTriggersResource,
@@ -36,14 +44,6 @@
FlowsResourceWithStreamingResponse,
AsyncFlowsResourceWithStreamingResponse,
)
-from .events.events import (
- EventsResource,
- AsyncEventsResource,
- EventsResourceWithRawResponse,
- AsyncEventsResourceWithRawResponse,
- EventsResourceWithStreamingResponse,
- AsyncEventsResourceWithStreamingResponse,
-)
from .action_catalog import (
ActionCatalogResource,
AsyncActionCatalogResource,
diff --git a/src/mobilerun_sdk/types/__init__.py b/src/mobilerun_sdk/types/__init__.py
index 47250ab..ecf96d9 100644
--- a/src/mobilerun_sdk/types/__init__.py
+++ b/src/mobilerun_sdk/types/__init__.py
@@ -24,21 +24,15 @@
from .usage_result import UsageResult as UsageResult
from .app_list_params import AppListParams as AppListParams
from .task_run_params import TaskRunParams as TaskRunParams
-from .hook_list_params import HookListParams as HookListParams
-from .hook_test_params import HookTestParams as HookTestParams
from .task_list_params import TaskListParams as TaskListParams
from .app_list_response import AppListResponse as AppListResponse
from .proxy_list_params import ProxyListParams as ProxyListParams
from .task_run_response import TaskRunResponse as TaskRunResponse
from .device_list_params import DeviceListParams as DeviceListParams
-from .hook_list_response import HookListResponse as HookListResponse
-from .hook_test_response import HookTestResponse as HookTestResponse
-from .hook_update_params import HookUpdateParams as HookUpdateParams
from .task_list_response import TaskListResponse as TaskListResponse
from .task_stop_response import TaskStopResponse as TaskStopResponse
from .app_delete_response import AppDeleteResponse as AppDeleteResponse
from .carrier_list_params import CarrierListParams as CarrierListParams
-from .hook_perform_params import HookPerformParams as HookPerformParams
from .model_list_response import ModelListResponse as ModelListResponse
from .package_credentials import PackageCredentials as PackageCredentials
from .profile_list_params import ProfileListParams as ProfileListParams
@@ -49,15 +43,12 @@
from .webhook_list_params import WebhookListParams as WebhookListParams
from .device_create_params import DeviceCreateParams as DeviceCreateParams
from .device_list_response import DeviceListResponse as DeviceListResponse
-from .hook_update_response import HookUpdateResponse as HookUpdateResponse
from .app_retrieve_response import AppRetrieveResponse as AppRetrieveResponse
from .carrier_create_params import CarrierCreateParams as CarrierCreateParams
from .carrier_list_response import CarrierListResponse as CarrierListResponse
from .carrier_lookup_params import CarrierLookupParams as CarrierLookupParams
from .carrier_update_params import CarrierUpdateParams as CarrierUpdateParams
from .device_count_response import DeviceCountResponse as DeviceCountResponse
-from .hook_perform_response import HookPerformResponse as HookPerformResponse
-from .hook_subscribe_params import HookSubscribeParams as HookSubscribeParams
from .profile_create_params import ProfileCreateParams as ProfileCreateParams
from .profile_list_response import ProfileListResponse as ProfileListResponse
from .profile_update_params import ProfileUpdateParams as ProfileUpdateParams
@@ -70,14 +61,12 @@
from .webhook_update_params import WebhookUpdateParams as WebhookUpdateParams
from .credential_list_params import CredentialListParams as CredentialListParams
from .device_set_name_params import DeviceSetNameParams as DeviceSetNameParams
-from .hook_retrieve_response import HookRetrieveResponse as HookRetrieveResponse
from .task_retrieve_response import TaskRetrieveResponse as TaskRetrieveResponse
from .carrier_create_response import CarrierCreateResponse as CarrierCreateResponse
from .carrier_delete_response import CarrierDeleteResponse as CarrierDeleteResponse
from .carrier_lookup_response import CarrierLookupResponse as CarrierLookupResponse
from .carrier_update_response import CarrierUpdateResponse as CarrierUpdateResponse
from .device_terminate_params import DeviceTerminateParams as DeviceTerminateParams
-from .hook_subscribe_response import HookSubscribeResponse as HookSubscribeResponse
from .profile_delete_response import ProfileDeleteResponse as ProfileDeleteResponse
from .proxy_retrieve_response import ProxyRetrieveResponse as ProxyRetrieveResponse
from .webhook_create_response import WebhookCreateResponse as WebhookCreateResponse
@@ -88,7 +77,6 @@
from .task_run_streamed_params import TaskRunStreamedParams as TaskRunStreamedParams
from .task_send_message_params import TaskSendMessageParams as TaskSendMessageParams
from .carrier_retrieve_response import CarrierRetrieveResponse as CarrierRetrieveResponse
-from .hook_unsubscribe_response import HookUnsubscribeResponse as HookUnsubscribeResponse
from .package_credentials_param import PackageCredentialsParam as PackageCredentialsParam
from .webhook_retrieve_response import WebhookRetrieveResponse as WebhookRetrieveResponse
from .app_list_versions_response import AppListVersionsResponse as AppListVersionsResponse
@@ -97,7 +85,6 @@
from .device_fingerprint_response import DeviceFingerprintResponse as DeviceFingerprintResponse
from .task_get_trajectory_response import TaskGetTrajectoryResponse as TaskGetTrajectoryResponse
from .webhook_event_types_response import WebhookEventTypesResponse as WebhookEventTypesResponse
-from .hook_get_sample_data_response import HookGetSampleDataResponse as HookGetSampleDataResponse
from .webhook_rotate_secret_response import WebhookRotateSecretResponse as WebhookRotateSecretResponse
from .webhook_test_delivery_response import WebhookTestDeliveryResponse as WebhookTestDeliveryResponse
from .app_create_signed_upload_url_params import AppCreateSignedUploadURLParams as AppCreateSignedUploadURLParams
diff --git a/src/mobilerun_sdk/types/connect/country_list_params.py b/src/mobilerun_sdk/types/connect/country_list_params.py
index b3819a9..a08049f 100644
--- a/src/mobilerun_sdk/types/connect/country_list_params.py
+++ b/src/mobilerun_sdk/types/connect/country_list_params.py
@@ -16,5 +16,5 @@ class CountryListParams(TypedDict, total=False):
page_size: Annotated[int, PropertyInfo(alias="pageSize")]
"""Number of items per page."""
- type: Literal["residential"]
+ type: Literal["dedicated_residential", "residential", "mobile"]
"""Filter to countries offering this proxy type."""
diff --git a/src/mobilerun_sdk/types/connect/country_list_response.py b/src/mobilerun_sdk/types/connect/country_list_response.py
index cc2b650..ad5dfd6 100644
--- a/src/mobilerun_sdk/types/connect/country_list_response.py
+++ b/src/mobilerun_sdk/types/connect/country_list_response.py
@@ -16,7 +16,7 @@ class Item(BaseModel):
name: str
- proxy_types: List[Literal["residential"]] = FieldInfo(alias="proxyTypes")
+ proxy_types: List[Literal["dedicated_residential", "residential", "mobile"]] = FieldInfo(alias="proxyTypes")
"""Proxy types available to provision in this country."""
diff --git a/src/mobilerun_sdk/types/connect/proxy_buy_params.py b/src/mobilerun_sdk/types/connect/proxy_buy_params.py
index 77b9ded..7bace18 100644
--- a/src/mobilerun_sdk/types/connect/proxy_buy_params.py
+++ b/src/mobilerun_sdk/types/connect/proxy_buy_params.py
@@ -11,4 +11,4 @@ class ProxyBuyParams(TypedDict, total=False):
country: Required[str]
"""ISO 3166-1 alpha-2 country code to provision the proxy in."""
- type: Literal["residential"]
+ type: Literal["dedicated_residential", "residential", "mobile"]
diff --git a/src/mobilerun_sdk/types/connect/proxy_buy_response.py b/src/mobilerun_sdk/types/connect/proxy_buy_response.py
index 52cf24d..403a8d8 100644
--- a/src/mobilerun_sdk/types/connect/proxy_buy_response.py
+++ b/src/mobilerun_sdk/types/connect/proxy_buy_response.py
@@ -37,7 +37,7 @@ class ProxyBuyResponse(BaseModel):
attempt.
"""
- type: Literal["residential"]
+ type: Literal["dedicated_residential", "residential", "mobile"]
username: str
diff --git a/src/mobilerun_sdk/types/connect/proxy_list_response.py b/src/mobilerun_sdk/types/connect/proxy_list_response.py
index b46e7ec..26135dc 100644
--- a/src/mobilerun_sdk/types/connect/proxy_list_response.py
+++ b/src/mobilerun_sdk/types/connect/proxy_list_response.py
@@ -35,7 +35,7 @@ class Item(BaseModel):
attempt.
"""
- type: Literal["residential"]
+ type: Literal["dedicated_residential", "residential", "mobile"]
username: str
diff --git a/src/mobilerun_sdk/types/connect/proxy_retrieve_response.py b/src/mobilerun_sdk/types/connect/proxy_retrieve_response.py
index f594cb5..be8cd87 100644
--- a/src/mobilerun_sdk/types/connect/proxy_retrieve_response.py
+++ b/src/mobilerun_sdk/types/connect/proxy_retrieve_response.py
@@ -37,7 +37,7 @@ class ProxyRetrieveResponse(BaseModel):
attempt.
"""
- type: Literal["residential"]
+ type: Literal["dedicated_residential", "residential", "mobile"]
username: str
diff --git a/src/mobilerun_sdk/types/device.py b/src/mobilerun_sdk/types/device.py
index c4ba3f8..e332501 100644
--- a/src/mobilerun_sdk/types/device.py
+++ b/src/mobilerun_sdk/types/device.py
@@ -38,6 +38,8 @@ class Device(BaseModel):
schema_: Optional[str] = FieldInfo(alias="$schema", default=None)
"""A URL to the JSON Schema for this object."""
+ billing_strategy: Optional[str] = FieldInfo(alias="billingStrategy", default=None)
+
provider_id: Optional[str] = FieldInfo(alias="providerId", default=None)
stream_token: Optional[str] = FieldInfo(alias="streamToken", default=None)
diff --git a/src/mobilerun_sdk/types/device_create_params.py b/src/mobilerun_sdk/types/device_create_params.py
index a631b9c..f6b7a1c 100644
--- a/src/mobilerun_sdk/types/device_create_params.py
+++ b/src/mobilerun_sdk/types/device_create_params.py
@@ -16,6 +16,14 @@
class DeviceCreateParams(TypedDict, total=False):
+ billing: Literal["auto", "subscription", "minute"]
+ """Billing mode.
+
+ 'auto' uses a subscription slot when available and otherwise bills per minute;
+ 'subscription' requires an available subscription slot; 'minute' bills per
+ minute. Only cloud phone and cloud emulator devices support per-minute billing.
+ """
+
query_country: Annotated[str, PropertyInfo(alias="country")]
"""ISO 3166-1 alpha-2 country code.
@@ -23,7 +31,9 @@ class DeviceCreateParams(TypedDict, total=False):
"""
device_type: Annotated[
- Literal["dedicated_physical_device", "dedicated_premium_device", "dedicated_ios_device"],
+ Literal[
+ "dedicated_physical_device", "dedicated_premium_device", "dedicated_ios_device", "dedicated_emulated_device"
+ ],
PropertyInfo(alias="deviceType"),
]
diff --git a/src/mobilerun_sdk/types/devices/__init__.py b/src/mobilerun_sdk/types/devices/__init__.py
index ab80387..dcd2cfa 100644
--- a/src/mobilerun_sdk/types/devices/__init__.py
+++ b/src/mobilerun_sdk/types/devices/__init__.py
@@ -6,6 +6,7 @@
from .file_info import FileInfo as FileInfo
from .a11_y_node import A11YNode as A11YNode
from .app_list_params import AppListParams as AppListParams
+from .app_stop_params import AppStopParams as AppStopParams
from .state_ui_params import StateUiParams as StateUiParams
from .app_start_params import AppStartParams as AppStartParams
from .file_list_params import FileListParams as FileListParams
diff --git a/src/mobilerun_sdk/types/devices/app_stop_params.py b/src/mobilerun_sdk/types/devices/app_stop_params.py
new file mode 100644
index 0000000..08dcece
--- /dev/null
+++ b/src/mobilerun_sdk/types/devices/app_stop_params.py
@@ -0,0 +1,18 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Required, Annotated, TypedDict
+
+from ..._utils import PropertyInfo
+
+__all__ = ["AppStopParams"]
+
+
+class AppStopParams(TypedDict, total=False):
+ device_id: Required[Annotated[str, PropertyInfo(alias="deviceId")]]
+
+ clear_data: Annotated[bool, PropertyInfo(alias="clearData")]
+ """If true, clears all app data (pm clear) in addition to stopping the app."""
+
+ x_device_display_id: Annotated[int, PropertyInfo(alias="X-Device-Display-ID")]
diff --git a/src/mobilerun_sdk/types/hook_get_sample_data_response.py b/src/mobilerun_sdk/types/hook_get_sample_data_response.py
deleted file mode 100644
index ba0a5a2..0000000
--- a/src/mobilerun_sdk/types/hook_get_sample_data_response.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from typing_extensions import TypeAlias
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["HookGetSampleDataResponse", "HookGetSampleDataResponseItem"]
-
-
-class HookGetSampleDataResponseItem(BaseModel):
- """Sample webhook event data for testing/mapping in Zapier."""
-
- id: str
- """The subscription ID"""
-
- created_at: str = FieldInfo(alias="createdAt")
- """ISO timestamp of when the subscription was created"""
-
- events: List[str]
- """List of subscribed events"""
-
- state: str
- """The hook state"""
-
- url: str
- """The webhook URL"""
-
- updated_at: Optional[str] = FieldInfo(alias="updatedAt", default=None)
- """ISO timestamp of the last update"""
-
-
-HookGetSampleDataResponse: TypeAlias = List[HookGetSampleDataResponseItem]
diff --git a/src/mobilerun_sdk/types/hook_list_params.py b/src/mobilerun_sdk/types/hook_list_params.py
deleted file mode 100644
index 5d3fe14..0000000
--- a/src/mobilerun_sdk/types/hook_list_params.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import Literal, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["HookListParams"]
-
-
-class HookListParams(TypedDict, total=False):
- order_by: Annotated[Optional[str], PropertyInfo(alias="orderBy")]
-
- order_by_direction: Annotated[Literal["asc", "desc"], PropertyInfo(alias="orderByDirection")]
-
- page: int
-
- page_size: Annotated[int, PropertyInfo(alias="pageSize")]
diff --git a/src/mobilerun_sdk/types/hook_list_response.py b/src/mobilerun_sdk/types/hook_list_response.py
deleted file mode 100644
index 7ac5695..0000000
--- a/src/mobilerun_sdk/types/hook_list_response.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from datetime import datetime
-from typing_extensions import Literal
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-from .task_status import TaskStatus
-from .shared.pagination_meta import PaginationMeta
-
-__all__ = ["HookListResponse", "Item"]
-
-
-class Item(BaseModel):
- service: Literal["zapier", "n8n", "make", "internal", "other"]
-
- url: str
-
- user_id: str = FieldInfo(alias="userId")
-
- id: Optional[str] = None
-
- created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
-
- events: Optional[List[TaskStatus]] = None
-
- state: Optional[Literal["active", "disabled", "deleted"]] = None
-
- updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
-
-
-class HookListResponse(BaseModel):
- items: List[Item]
- """The paginated items"""
-
- pagination: PaginationMeta
- """Pagination metadata"""
diff --git a/src/mobilerun_sdk/types/hook_perform_params.py b/src/mobilerun_sdk/types/hook_perform_params.py
deleted file mode 100644
index c1e0ed4..0000000
--- a/src/mobilerun_sdk/types/hook_perform_params.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Dict
-from typing_extensions import Required, TypedDict
-
-__all__ = ["HookPerformParams"]
-
-
-class HookPerformParams(TypedDict, total=False):
- body: Required[Dict[str, object]]
diff --git a/src/mobilerun_sdk/types/hook_perform_response.py b/src/mobilerun_sdk/types/hook_perform_response.py
deleted file mode 100644
index fb77ef5..0000000
--- a/src/mobilerun_sdk/types/hook_perform_response.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Dict, List
-from typing_extensions import TypeAlias
-
-__all__ = ["HookPerformResponse"]
-
-HookPerformResponse: TypeAlias = List[Dict[str, object]]
diff --git a/src/mobilerun_sdk/types/hook_retrieve_response.py b/src/mobilerun_sdk/types/hook_retrieve_response.py
deleted file mode 100644
index d09beb2..0000000
--- a/src/mobilerun_sdk/types/hook_retrieve_response.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from datetime import datetime
-from typing_extensions import Literal
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-from .task_status import TaskStatus
-
-__all__ = ["HookRetrieveResponse"]
-
-
-class HookRetrieveResponse(BaseModel):
- service: Literal["zapier", "n8n", "make", "internal", "other"]
-
- url: str
-
- user_id: str = FieldInfo(alias="userId")
-
- id: Optional[str] = None
-
- created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
-
- events: Optional[List[TaskStatus]] = None
-
- state: Optional[Literal["active", "disabled", "deleted"]] = None
-
- updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
diff --git a/src/mobilerun_sdk/types/hook_subscribe_params.py b/src/mobilerun_sdk/types/hook_subscribe_params.py
deleted file mode 100644
index 08412c9..0000000
--- a/src/mobilerun_sdk/types/hook_subscribe_params.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import Required, Annotated, TypedDict
-
-from .._types import SequenceNotStr
-from .._utils import PropertyInfo
-
-__all__ = ["HookSubscribeParams"]
-
-
-class HookSubscribeParams(TypedDict, total=False):
- target_url: Required[Annotated[str, PropertyInfo(alias="targetUrl")]]
- """The webhook URL to send notifications to"""
-
- events: Optional[SequenceNotStr[str]]
- """
- List of task events to subscribe to (created, running, completed, failed,
- cancelled, paused)
- """
-
- service: Optional[str]
- """Service that receives the webhook"""
diff --git a/src/mobilerun_sdk/types/hook_subscribe_response.py b/src/mobilerun_sdk/types/hook_subscribe_response.py
deleted file mode 100644
index 0a830d4..0000000
--- a/src/mobilerun_sdk/types/hook_subscribe_response.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-
-from .._models import BaseModel
-
-__all__ = ["HookSubscribeResponse"]
-
-
-class HookSubscribeResponse(BaseModel):
- """Response model after successful subscription."""
-
- id: str
- """The subscription ID"""
-
- subscribed: bool
- """Whether subscription was successful"""
-
- url: str
- """The webhook URL"""
-
- events: Optional[List[str]] = None
- """List of subscribed events"""
-
- service: Optional[str] = None
- """Service that receives the webhook"""
diff --git a/src/mobilerun_sdk/types/hook_test_params.py b/src/mobilerun_sdk/types/hook_test_params.py
deleted file mode 100644
index af5edff..0000000
--- a/src/mobilerun_sdk/types/hook_test_params.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import TypedDict
-
-__all__ = ["HookTestParams"]
-
-
-class HookTestParams(TypedDict, total=False):
- event: Optional[str]
- """Event type to simulate (default: completed)"""
diff --git a/src/mobilerun_sdk/types/hook_test_response.py b/src/mobilerun_sdk/types/hook_test_response.py
deleted file mode 100644
index 8d22bab..0000000
--- a/src/mobilerun_sdk/types/hook_test_response.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["HookTestResponse"]
-
-
-class HookTestResponse(BaseModel):
- """Response after attempting test delivery."""
-
- id: str
- """The hook ID"""
-
- success: bool
- """Whether delivery succeeded (2xx)"""
-
- error: Optional[str] = None
- """Error message if delivery failed"""
-
- status_code: Optional[int] = FieldInfo(alias="statusCode", default=None)
- """HTTP status from target"""
diff --git a/src/mobilerun_sdk/types/hook_unsubscribe_response.py b/src/mobilerun_sdk/types/hook_unsubscribe_response.py
deleted file mode 100644
index 384d2fa..0000000
--- a/src/mobilerun_sdk/types/hook_unsubscribe_response.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .._models import BaseModel
-
-__all__ = ["HookUnsubscribeResponse"]
-
-
-class HookUnsubscribeResponse(BaseModel):
- """Response model after successful unsubscription."""
-
- id: str
- """The subscription ID"""
-
- unsubscribed: bool
- """Whether unsubscription was successful"""
diff --git a/src/mobilerun_sdk/types/hook_update_params.py b/src/mobilerun_sdk/types/hook_update_params.py
deleted file mode 100644
index 024f44d..0000000
--- a/src/mobilerun_sdk/types/hook_update_params.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-from typing_extensions import TypedDict
-
-from .._types import SequenceNotStr
-
-__all__ = ["HookUpdateParams"]
-
-
-class HookUpdateParams(TypedDict, total=False):
- events: Optional[SequenceNotStr[str]]
- """Updated list of events to subscribe to"""
-
- state: Optional[str]
- """Updated hook state (active, disabled, deleted)"""
diff --git a/src/mobilerun_sdk/types/hook_update_response.py b/src/mobilerun_sdk/types/hook_update_response.py
deleted file mode 100644
index e362514..0000000
--- a/src/mobilerun_sdk/types/hook_update_response.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-
-from .._models import BaseModel
-
-__all__ = ["HookUpdateResponse"]
-
-
-class HookUpdateResponse(BaseModel):
- """Response model after successfully editing a hook."""
-
- id: str
- """The subscription ID"""
-
- state: str
- """The hook state"""
-
- updated: bool
- """Whether the hook was updated"""
-
- url: str
- """The webhook URL"""
-
- events: Optional[List[str]] = None
- """List of subscribed events"""
diff --git a/src/mobilerun_sdk/types/webhook_event_types_response.py b/src/mobilerun_sdk/types/webhook_event_types_response.py
index 2bc0051..11afece 100644
--- a/src/mobilerun_sdk/types/webhook_event_types_response.py
+++ b/src/mobilerun_sdk/types/webhook_event_types_response.py
@@ -1,6 +1,7 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from typing import List
+from typing_extensions import Literal
from pydantic import Field as FieldInfo
@@ -22,7 +23,7 @@ class DataSource(BaseModel):
class Data(BaseModel):
- schema_version: float = FieldInfo(alias="schemaVersion")
+ schema_version: Literal[1] = FieldInfo(alias="schemaVersion")
sources: List[DataSource]
diff --git a/src/mobilerun_sdk/types/workflows/action_create_params.py b/src/mobilerun_sdk/types/workflows/action_create_params.py
index b85ffed..eafc44e 100644
--- a/src/mobilerun_sdk/types/workflows/action_create_params.py
+++ b/src/mobilerun_sdk/types/workflows/action_create_params.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from typing import Dict, Optional
+from typing import Dict
from typing_extensions import Required, Annotated, TypedDict
from ..._utils import PropertyInfo
@@ -17,4 +17,4 @@ class ActionCreateParams(TypedDict, total=False):
description: str
- params: Dict[str, Optional[object]]
+ params: Dict[str, object]
diff --git a/src/mobilerun_sdk/types/workflows/action_update_params.py b/src/mobilerun_sdk/types/workflows/action_update_params.py
index 4644bac..f495468 100644
--- a/src/mobilerun_sdk/types/workflows/action_update_params.py
+++ b/src/mobilerun_sdk/types/workflows/action_update_params.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from typing import Dict, Optional
+from typing import Dict
from typing_extensions import TypedDict
__all__ = ["ActionUpdateParams"]
@@ -13,4 +13,4 @@ class ActionUpdateParams(TypedDict, total=False):
name: str
- params: Dict[str, Optional[object]]
+ params: Dict[str, object]
diff --git a/src/mobilerun_sdk/types/workflows/event_dry_run_params.py b/src/mobilerun_sdk/types/workflows/event_dry_run_params.py
index 42cacb5..bd92f63 100644
--- a/src/mobilerun_sdk/types/workflows/event_dry_run_params.py
+++ b/src/mobilerun_sdk/types/workflows/event_dry_run_params.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from typing import Dict, Optional
+from typing import Dict
from typing_extensions import Required, Annotated, TypedDict
from ..._utils import PropertyInfo
@@ -13,4 +13,6 @@
class EventDryRunParams(TypedDict, total=False):
event_type: Required[Annotated[str, PropertyInfo(alias="eventType")]]
- payload: Dict[str, Optional[object]]
+ device_id: Annotated[str, PropertyInfo(alias="deviceId")]
+
+ payload: Dict[str, object]
diff --git a/src/mobilerun_sdk/types/workflows/event_dry_run_response.py b/src/mobilerun_sdk/types/workflows/event_dry_run_response.py
index b1c8264..e687124 100644
--- a/src/mobilerun_sdk/types/workflows/event_dry_run_response.py
+++ b/src/mobilerun_sdk/types/workflows/event_dry_run_response.py
@@ -15,7 +15,6 @@
"DataMatchedFlowAction",
"DataMatchedFlowGates",
"DataMatchedFlowTrigger",
- "DataMatchedFlowTriggerScheduleRule",
"DataValidation",
"DataValidationError",
]
@@ -30,13 +29,13 @@ class DataMatchedFlowAction(BaseModel):
service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"]
- children: Optional[List[Optional[object]]] = None
+ children: Optional[List[object]] = None
"""
Nested child actions (loop/branch bodies), each the same shape as a
ResolvedAction.
"""
- params: Optional[Dict[str, Optional[object]]] = None
+ params: Optional[Dict[str, object]] = None
class DataMatchedFlowGates(BaseModel):
@@ -51,19 +50,6 @@ class DataMatchedFlowGates(BaseModel):
enabled: bool
-class DataMatchedFlowTriggerScheduleRule(BaseModel):
- type: Literal["once", "cron", "recurring"]
-
- date_time: Optional[str] = FieldInfo(alias="dateTime", default=None)
- """ISO 8601 datetime (for type=once)"""
-
- expression: Optional[str] = None
- """Cron expression (for type=cron)"""
-
- rrule: Optional[str] = None
- """RRULE string (for type=recurring)"""
-
-
class DataMatchedFlowTrigger(BaseModel):
id: str
@@ -79,7 +65,7 @@ class DataMatchedFlowTrigger(BaseModel):
name: str
- schedule_rule: Optional[DataMatchedFlowTriggerScheduleRule] = FieldInfo(alias="scheduleRule", default=None)
+ schedule_rule: object = FieldInfo(alias="scheduleRule")
timezone: Optional[str] = None
diff --git a/src/mobilerun_sdk/types/workflows/event_ingest_params.py b/src/mobilerun_sdk/types/workflows/event_ingest_params.py
index 345113f..02f2a31 100644
--- a/src/mobilerun_sdk/types/workflows/event_ingest_params.py
+++ b/src/mobilerun_sdk/types/workflows/event_ingest_params.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from typing import Dict, Optional
+from typing import Dict
from typing_extensions import Required, Annotated, TypedDict
from ..._utils import PropertyInfo
@@ -13,4 +13,6 @@
class EventIngestParams(TypedDict, total=False):
event_type: Required[Annotated[str, PropertyInfo(alias="eventType")]]
- payload: Dict[str, Optional[object]]
+ device_id: Annotated[str, PropertyInfo(alias="deviceId")]
+
+ payload: Dict[str, object]
diff --git a/src/mobilerun_sdk/types/workflows/events/__init__.py b/src/mobilerun_sdk/types/workflows/events/__init__.py
index 32807f2..f8ee8b1 100644
--- a/src/mobilerun_sdk/types/workflows/events/__init__.py
+++ b/src/mobilerun_sdk/types/workflows/events/__init__.py
@@ -1,8 +1,3 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from __future__ import annotations
-
-from .catalog_list_params import CatalogListParams as CatalogListParams
-from .catalog_list_response import CatalogListResponse as CatalogListResponse
-from .catalog_register_params import CatalogRegisterParams as CatalogRegisterParams
-from .catalog_register_response import CatalogRegisterResponse as CatalogRegisterResponse
diff --git a/src/mobilerun_sdk/types/workflows/events/catalog_list_params.py b/src/mobilerun_sdk/types/workflows/events/catalog_list_params.py
deleted file mode 100644
index ca0def1..0000000
--- a/src/mobilerun_sdk/types/workflows/events/catalog_list_params.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal, Annotated, TypedDict
-
-from ...._utils import PropertyInfo
-
-__all__ = ["CatalogListParams"]
-
-
-class CatalogListParams(TypedDict, total=False):
- page: int
-
- page_size: Annotated[int, PropertyInfo(alias="pageSize")]
-
- source: Literal["device", "system", "webhook"]
diff --git a/src/mobilerun_sdk/types/workflows/events/catalog_list_response.py b/src/mobilerun_sdk/types/workflows/events/catalog_list_response.py
deleted file mode 100644
index 86c96b2..0000000
--- a/src/mobilerun_sdk/types/workflows/events/catalog_list_response.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-
-from pydantic import Field as FieldInfo
-
-from ...._models import BaseModel
-from ...shared.pagination import Pagination
-
-__all__ = ["CatalogListResponse", "Item"]
-
-
-class Item(BaseModel):
- created_at: Optional[str] = FieldInfo(alias="createdAt", default=None)
-
- description: Optional[str] = None
-
- event_type: str = FieldInfo(alias="eventType")
-
- label: str
-
- source: Optional[str] = None
-
- updated_at: Optional[str] = FieldInfo(alias="updatedAt", default=None)
-
- payload_schema: Optional[object] = FieldInfo(alias="payloadSchema", default=None)
-
-
-class CatalogListResponse(BaseModel):
- items: List[Item]
-
- pagination: Pagination
diff --git a/src/mobilerun_sdk/types/workflows/events/catalog_register_params.py b/src/mobilerun_sdk/types/workflows/events/catalog_register_params.py
deleted file mode 100644
index da648c3..0000000
--- a/src/mobilerun_sdk/types/workflows/events/catalog_register_params.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Dict, Iterable, Optional
-from typing_extensions import Literal, Required, Annotated, TypedDict
-
-from ...._utils import PropertyInfo
-
-__all__ = ["CatalogRegisterParams", "Event"]
-
-
-class CatalogRegisterParams(TypedDict, total=False):
- events: Required[Iterable[Event]]
-
-
-class Event(TypedDict, total=False):
- event_type: Required[Annotated[str, PropertyInfo(alias="eventType")]]
-
- label: Required[str]
-
- description: str
-
- payload_schema: Annotated[Dict[str, Optional[object]], PropertyInfo(alias="payloadSchema")]
-
- source: Literal["device", "system", "webhook"]
diff --git a/src/mobilerun_sdk/types/workflows/events/catalog_register_response.py b/src/mobilerun_sdk/types/workflows/events/catalog_register_response.py
deleted file mode 100644
index 116b6cc..0000000
--- a/src/mobilerun_sdk/types/workflows/events/catalog_register_response.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from ...._models import BaseModel
-
-__all__ = ["CatalogRegisterResponse"]
-
-
-class CatalogRegisterResponse(BaseModel):
- message: str
diff --git a/src/mobilerun_sdk/types/workflows/flow_action_overrides_param.py b/src/mobilerun_sdk/types/workflows/flow_action_overrides_param.py
index 5f03d3a..6f74d3f 100644
--- a/src/mobilerun_sdk/types/workflows/flow_action_overrides_param.py
+++ b/src/mobilerun_sdk/types/workflows/flow_action_overrides_param.py
@@ -2,11 +2,11 @@
from __future__ import annotations
-from typing import Dict, Optional
+from typing import Dict
from typing_extensions import TypedDict
__all__ = ["FlowActionOverridesParam"]
class FlowActionOverridesParam(TypedDict, total=False):
- params: Dict[str, Optional[object]]
+ params: Dict[str, object]
diff --git a/src/mobilerun_sdk/types/workflows/flows/flow_action.py b/src/mobilerun_sdk/types/workflows/flows/flow_action.py
index 2ab9154..e273170 100644
--- a/src/mobilerun_sdk/types/workflows/flows/flow_action.py
+++ b/src/mobilerun_sdk/types/workflows/flows/flow_action.py
@@ -10,7 +10,7 @@
class Overrides(BaseModel):
- params: Optional[Dict[str, Optional[object]]] = None
+ params: Optional[Dict[str, object]] = None
class FlowAction(BaseModel):
diff --git a/src/mobilerun_sdk/types/workflows/trigger_create_response.py b/src/mobilerun_sdk/types/workflows/trigger_create_response.py
index b2073b1..afe6fc2 100644
--- a/src/mobilerun_sdk/types/workflows/trigger_create_response.py
+++ b/src/mobilerun_sdk/types/workflows/trigger_create_response.py
@@ -30,7 +30,7 @@ class Data(BaseModel):
created_at: Optional[str] = FieldInfo(alias="createdAt", default=None)
- custom_payload_schema: Optional[Dict[str, Optional[object]]] = FieldInfo(alias="customPayloadSchema", default=None)
+ custom_payload_schema: Optional[Dict[str, object]] = FieldInfo(alias="customPayloadSchema", default=None)
description: Optional[str] = None
diff --git a/src/mobilerun_sdk/types/workflows/trigger_list_response.py b/src/mobilerun_sdk/types/workflows/trigger_list_response.py
index 703fd4c..b21d12a 100644
--- a/src/mobilerun_sdk/types/workflows/trigger_list_response.py
+++ b/src/mobilerun_sdk/types/workflows/trigger_list_response.py
@@ -8,20 +8,7 @@
from ..._models import BaseModel
from ..shared.pagination import Pagination
-__all__ = ["TriggerListResponse", "Item", "ItemScheduleRule"]
-
-
-class ItemScheduleRule(BaseModel):
- type: Literal["once", "cron", "recurring"]
-
- date_time: Optional[str] = FieldInfo(alias="dateTime", default=None)
- """ISO 8601 datetime (for type=once)"""
-
- expression: Optional[str] = None
- """Cron expression (for type=cron)"""
-
- rrule: Optional[str] = None
- """RRULE string (for type=recurring)"""
+__all__ = ["TriggerListResponse", "Item"]
class Item(BaseModel):
@@ -39,7 +26,7 @@ class Item(BaseModel):
name: str
- schedule_rule: Optional[ItemScheduleRule] = FieldInfo(alias="scheduleRule", default=None)
+ schedule_rule: object = FieldInfo(alias="scheduleRule")
timezone: Optional[str] = None
diff --git a/src/mobilerun_sdk/types/workflows/trigger_retrieve_response.py b/src/mobilerun_sdk/types/workflows/trigger_retrieve_response.py
index fc48aa4..2296e33 100644
--- a/src/mobilerun_sdk/types/workflows/trigger_retrieve_response.py
+++ b/src/mobilerun_sdk/types/workflows/trigger_retrieve_response.py
@@ -7,20 +7,7 @@
from ..._models import BaseModel
-__all__ = ["TriggerRetrieveResponse", "Data", "DataScheduleRule"]
-
-
-class DataScheduleRule(BaseModel):
- type: Literal["once", "cron", "recurring"]
-
- date_time: Optional[str] = FieldInfo(alias="dateTime", default=None)
- """ISO 8601 datetime (for type=once)"""
-
- expression: Optional[str] = None
- """Cron expression (for type=cron)"""
-
- rrule: Optional[str] = None
- """RRULE string (for type=recurring)"""
+__all__ = ["TriggerRetrieveResponse", "Data"]
class Data(BaseModel):
@@ -38,7 +25,7 @@ class Data(BaseModel):
name: str
- schedule_rule: Optional[DataScheduleRule] = FieldInfo(alias="scheduleRule", default=None)
+ schedule_rule: object = FieldInfo(alias="scheduleRule")
timezone: Optional[str] = None
diff --git a/src/mobilerun_sdk/types/workflows/trigger_update_params.py b/src/mobilerun_sdk/types/workflows/trigger_update_params.py
index ecf86b7..6d8706f 100644
--- a/src/mobilerun_sdk/types/workflows/trigger_update_params.py
+++ b/src/mobilerun_sdk/types/workflows/trigger_update_params.py
@@ -15,8 +15,7 @@ class TriggerUpdateParams(TypedDict, total=False):
conditions: Conditions
- custom_payload_schema: Annotated[Optional[Dict[str, object]], PropertyInfo(alias="customPayloadSchema")]
- """Optional JSON Schema for validating payloads sent to this custom trigger"""
+ custom_payload_schema: Annotated[Dict[str, object], PropertyInfo(alias="customPayloadSchema")]
description: str
diff --git a/src/mobilerun_sdk/types/workflows/trigger_update_response.py b/src/mobilerun_sdk/types/workflows/trigger_update_response.py
index a5a9418..af2c3cf 100644
--- a/src/mobilerun_sdk/types/workflows/trigger_update_response.py
+++ b/src/mobilerun_sdk/types/workflows/trigger_update_response.py
@@ -7,20 +7,7 @@
from ..._models import BaseModel
-__all__ = ["TriggerUpdateResponse", "Data", "DataScheduleRule"]
-
-
-class DataScheduleRule(BaseModel):
- type: Literal["once", "cron", "recurring"]
-
- date_time: Optional[str] = FieldInfo(alias="dateTime", default=None)
- """ISO 8601 datetime (for type=once)"""
-
- expression: Optional[str] = None
- """Cron expression (for type=cron)"""
-
- rrule: Optional[str] = None
- """RRULE string (for type=recurring)"""
+__all__ = ["TriggerUpdateResponse", "Data"]
class Data(BaseModel):
@@ -38,7 +25,7 @@ class Data(BaseModel):
name: str
- schedule_rule: Optional[DataScheduleRule] = FieldInfo(alias="scheduleRule", default=None)
+ schedule_rule: object = FieldInfo(alias="scheduleRule")
timezone: Optional[str] = None
diff --git a/tests/api_resources/connect/test_countries.py b/tests/api_resources/connect/test_countries.py
index e7d88fc..dc5b792 100644
--- a/tests/api_resources/connect/test_countries.py
+++ b/tests/api_resources/connect/test_countries.py
@@ -29,7 +29,7 @@ def test_method_list_with_all_params(self, client: Mobilerun) -> None:
country = client.connect.countries.list(
page=1,
page_size=1,
- type="residential",
+ type="dedicated_residential",
)
assert_matches_type(CountryListResponse, country, path=["response"])
@@ -73,7 +73,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncMobilerun) -
country = await async_client.connect.countries.list(
page=1,
page_size=1,
- type="residential",
+ type="dedicated_residential",
)
assert_matches_type(CountryListResponse, country, path=["response"])
diff --git a/tests/api_resources/connect/test_proxies.py b/tests/api_resources/connect/test_proxies.py
index 6442710..a3094d5 100644
--- a/tests/api_resources/connect/test_proxies.py
+++ b/tests/api_resources/connect/test_proxies.py
@@ -117,7 +117,7 @@ def test_method_buy(self, client: Mobilerun) -> None:
def test_method_buy_with_all_params(self, client: Mobilerun) -> None:
proxy = client.connect.proxies.buy(
country="country",
- type="residential",
+ type="dedicated_residential",
)
assert_matches_type(ProxyBuyResponse, proxy, path=["response"])
@@ -405,7 +405,7 @@ async def test_method_buy(self, async_client: AsyncMobilerun) -> None:
async def test_method_buy_with_all_params(self, async_client: AsyncMobilerun) -> None:
proxy = await async_client.connect.proxies.buy(
country="country",
- type="residential",
+ type="dedicated_residential",
)
assert_matches_type(ProxyBuyResponse, proxy, path=["response"])
diff --git a/tests/api_resources/devices/test_apps.py b/tests/api_resources/devices/test_apps.py
index 5f86d32..1826542 100644
--- a/tests/api_resources/devices/test_apps.py
+++ b/tests/api_resources/devices/test_apps.py
@@ -9,7 +9,9 @@
from tests.utils import assert_matches_type
from mobilerun_sdk import Mobilerun, AsyncMobilerun
-from mobilerun_sdk.types.devices import AppListResponse
+from mobilerun_sdk.types.devices import (
+ AppListResponse,
+)
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -324,6 +326,7 @@ def test_method_stop_with_all_params(self, client: Mobilerun) -> None:
app = client.devices.apps.stop(
package_name="packageName",
device_id="deviceId",
+ clear_data=True,
x_device_display_id=0,
)
assert app is None
@@ -684,6 +687,7 @@ async def test_method_stop_with_all_params(self, async_client: AsyncMobilerun) -
app = await async_client.devices.apps.stop(
package_name="packageName",
device_id="deviceId",
+ clear_data=True,
x_device_display_id=0,
)
assert app is None
diff --git a/tests/api_resources/test_devices.py b/tests/api_resources/test_devices.py
index c70afb3..8980435 100644
--- a/tests/api_resources/test_devices.py
+++ b/tests/api_resources/test_devices.py
@@ -33,6 +33,7 @@ def test_method_create(self, client: Mobilerun) -> None:
@parametrize
def test_method_create_with_all_params(self, client: Mobilerun) -> None:
device = client.devices.create(
+ billing="auto",
query_country="country",
device_type="dedicated_physical_device",
profile_id="profileId",
@@ -512,6 +513,7 @@ async def test_method_create(self, async_client: AsyncMobilerun) -> None:
@parametrize
async def test_method_create_with_all_params(self, async_client: AsyncMobilerun) -> None:
device = await async_client.devices.create(
+ billing="auto",
query_country="country",
device_type="dedicated_physical_device",
profile_id="profileId",
diff --git a/tests/api_resources/test_hooks.py b/tests/api_resources/test_hooks.py
deleted file mode 100644
index 21548ab..0000000
--- a/tests/api_resources/test_hooks.py
+++ /dev/null
@@ -1,697 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from mobilerun_sdk import Mobilerun, AsyncMobilerun
-from mobilerun_sdk.types import (
- HookListResponse,
- HookTestResponse,
- HookUpdateResponse,
- HookPerformResponse,
- HookRetrieveResponse,
- HookSubscribeResponse,
- HookUnsubscribeResponse,
- HookGetSampleDataResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestHooks:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve(self, client: Mobilerun) -> None:
- hook = client.hooks.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(HookRetrieveResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve(self, client: Mobilerun) -> None:
- response = client.hooks.with_raw_response.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = response.parse()
- assert_matches_type(HookRetrieveResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve(self, client: Mobilerun) -> None:
- with client.hooks.with_streaming_response.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = response.parse()
- assert_matches_type(HookRetrieveResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_retrieve(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `hook_id` but received ''"):
- client.hooks.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update(self, client: Mobilerun) -> None:
- hook = client.hooks.update(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(HookUpdateResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update_with_all_params(self, client: Mobilerun) -> None:
- hook = client.hooks.update(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- events=["string"],
- state="state",
- )
- assert_matches_type(HookUpdateResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_update(self, client: Mobilerun) -> None:
- response = client.hooks.with_raw_response.update(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = response.parse()
- assert_matches_type(HookUpdateResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_update(self, client: Mobilerun) -> None:
- with client.hooks.with_streaming_response.update(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = response.parse()
- assert_matches_type(HookUpdateResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_update(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `hook_id` but received ''"):
- client.hooks.with_raw_response.update(
- hook_id="",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: Mobilerun) -> None:
- hook = client.hooks.list()
- assert_matches_type(HookListResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: Mobilerun) -> None:
- hook = client.hooks.list(
- order_by="orderBy",
- order_by_direction="asc",
- page=1,
- page_size=1,
- )
- assert_matches_type(HookListResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: Mobilerun) -> None:
- response = client.hooks.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = response.parse()
- assert_matches_type(HookListResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: Mobilerun) -> None:
- with client.hooks.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = response.parse()
- assert_matches_type(HookListResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_get_sample_data(self, client: Mobilerun) -> None:
- hook = client.hooks.get_sample_data()
- assert_matches_type(HookGetSampleDataResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_get_sample_data(self, client: Mobilerun) -> None:
- response = client.hooks.with_raw_response.get_sample_data()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = response.parse()
- assert_matches_type(HookGetSampleDataResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_get_sample_data(self, client: Mobilerun) -> None:
- with client.hooks.with_streaming_response.get_sample_data() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = response.parse()
- assert_matches_type(HookGetSampleDataResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_perform(self, client: Mobilerun) -> None:
- hook = client.hooks.perform(
- body={"foo": "bar"},
- )
- assert_matches_type(HookPerformResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_perform(self, client: Mobilerun) -> None:
- response = client.hooks.with_raw_response.perform(
- body={"foo": "bar"},
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = response.parse()
- assert_matches_type(HookPerformResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_perform(self, client: Mobilerun) -> None:
- with client.hooks.with_streaming_response.perform(
- body={"foo": "bar"},
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = response.parse()
- assert_matches_type(HookPerformResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_subscribe(self, client: Mobilerun) -> None:
- hook = client.hooks.subscribe(
- target_url="https://example.com",
- )
- assert_matches_type(HookSubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_subscribe_with_all_params(self, client: Mobilerun) -> None:
- hook = client.hooks.subscribe(
- target_url="https://example.com",
- events=["string"],
- service="service",
- )
- assert_matches_type(HookSubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_subscribe(self, client: Mobilerun) -> None:
- response = client.hooks.with_raw_response.subscribe(
- target_url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = response.parse()
- assert_matches_type(HookSubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_subscribe(self, client: Mobilerun) -> None:
- with client.hooks.with_streaming_response.subscribe(
- target_url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = response.parse()
- assert_matches_type(HookSubscribeResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_test(self, client: Mobilerun) -> None:
- hook = client.hooks.test(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(HookTestResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_test_with_all_params(self, client: Mobilerun) -> None:
- hook = client.hooks.test(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- event="event",
- )
- assert_matches_type(HookTestResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_test(self, client: Mobilerun) -> None:
- response = client.hooks.with_raw_response.test(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = response.parse()
- assert_matches_type(HookTestResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_test(self, client: Mobilerun) -> None:
- with client.hooks.with_streaming_response.test(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = response.parse()
- assert_matches_type(HookTestResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_test(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `hook_id` but received ''"):
- client.hooks.with_raw_response.test(
- hook_id="",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_unsubscribe(self, client: Mobilerun) -> None:
- hook = client.hooks.unsubscribe(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(HookUnsubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_unsubscribe(self, client: Mobilerun) -> None:
- response = client.hooks.with_raw_response.unsubscribe(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = response.parse()
- assert_matches_type(HookUnsubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_unsubscribe(self, client: Mobilerun) -> None:
- with client.hooks.with_streaming_response.unsubscribe(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = response.parse()
- assert_matches_type(HookUnsubscribeResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_unsubscribe(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `hook_id` but received ''"):
- client.hooks.with_raw_response.unsubscribe(
- "",
- )
-
-
-class TestAsyncHooks:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(HookRetrieveResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_retrieve(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.hooks.with_raw_response.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = await response.parse()
- assert_matches_type(HookRetrieveResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_retrieve(self, async_client: AsyncMobilerun) -> None:
- async with async_client.hooks.with_streaming_response.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = await response.parse()
- assert_matches_type(HookRetrieveResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_retrieve(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `hook_id` but received ''"):
- await async_client.hooks.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.update(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(HookUpdateResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update_with_all_params(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.update(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- events=["string"],
- state="state",
- )
- assert_matches_type(HookUpdateResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_update(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.hooks.with_raw_response.update(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = await response.parse()
- assert_matches_type(HookUpdateResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_update(self, async_client: AsyncMobilerun) -> None:
- async with async_client.hooks.with_streaming_response.update(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = await response.parse()
- assert_matches_type(HookUpdateResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_update(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `hook_id` but received ''"):
- await async_client.hooks.with_raw_response.update(
- hook_id="",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.list()
- assert_matches_type(HookListResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_with_all_params(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.list(
- order_by="orderBy",
- order_by_direction="asc",
- page=1,
- page_size=1,
- )
- assert_matches_type(HookListResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.hooks.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = await response.parse()
- assert_matches_type(HookListResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list(self, async_client: AsyncMobilerun) -> None:
- async with async_client.hooks.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = await response.parse()
- assert_matches_type(HookListResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_get_sample_data(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.get_sample_data()
- assert_matches_type(HookGetSampleDataResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_get_sample_data(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.hooks.with_raw_response.get_sample_data()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = await response.parse()
- assert_matches_type(HookGetSampleDataResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_get_sample_data(self, async_client: AsyncMobilerun) -> None:
- async with async_client.hooks.with_streaming_response.get_sample_data() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = await response.parse()
- assert_matches_type(HookGetSampleDataResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_perform(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.perform(
- body={"foo": "bar"},
- )
- assert_matches_type(HookPerformResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_perform(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.hooks.with_raw_response.perform(
- body={"foo": "bar"},
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = await response.parse()
- assert_matches_type(HookPerformResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_perform(self, async_client: AsyncMobilerun) -> None:
- async with async_client.hooks.with_streaming_response.perform(
- body={"foo": "bar"},
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = await response.parse()
- assert_matches_type(HookPerformResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_subscribe(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.subscribe(
- target_url="https://example.com",
- )
- assert_matches_type(HookSubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_subscribe_with_all_params(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.subscribe(
- target_url="https://example.com",
- events=["string"],
- service="service",
- )
- assert_matches_type(HookSubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_subscribe(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.hooks.with_raw_response.subscribe(
- target_url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = await response.parse()
- assert_matches_type(HookSubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_subscribe(self, async_client: AsyncMobilerun) -> None:
- async with async_client.hooks.with_streaming_response.subscribe(
- target_url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = await response.parse()
- assert_matches_type(HookSubscribeResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_test(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.test(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(HookTestResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_test_with_all_params(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.test(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- event="event",
- )
- assert_matches_type(HookTestResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_test(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.hooks.with_raw_response.test(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = await response.parse()
- assert_matches_type(HookTestResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_test(self, async_client: AsyncMobilerun) -> None:
- async with async_client.hooks.with_streaming_response.test(
- hook_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = await response.parse()
- assert_matches_type(HookTestResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_test(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `hook_id` but received ''"):
- await async_client.hooks.with_raw_response.test(
- hook_id="",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_unsubscribe(self, async_client: AsyncMobilerun) -> None:
- hook = await async_client.hooks.unsubscribe(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(HookUnsubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_unsubscribe(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.hooks.with_raw_response.unsubscribe(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- hook = await response.parse()
- assert_matches_type(HookUnsubscribeResponse, hook, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_unsubscribe(self, async_client: AsyncMobilerun) -> None:
- async with async_client.hooks.with_streaming_response.unsubscribe(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- hook = await response.parse()
- assert_matches_type(HookUnsubscribeResponse, hook, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_path_params_unsubscribe(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `hook_id` but received ''"):
- await async_client.hooks.with_raw_response.unsubscribe(
- "",
- )
diff --git a/tests/api_resources/test_webhooks.py b/tests/api_resources/test_webhooks.py
index 8626698..e3747d0 100644
--- a/tests/api_resources/test_webhooks.py
+++ b/tests/api_resources/test_webhooks.py
@@ -39,7 +39,7 @@ def test_method_create_with_all_params(self, client: Mobilerun) -> None:
webhook = client.webhooks.create(
url="https://example.com/webhooks/droidrun",
description="description",
- event_types=["task.completed", "task.failed"],
+ event_types=["task.run.completed", "task.run.failed"],
)
assert_matches_type(WebhookCreateResponse, webhook, path=["response"])
@@ -376,7 +376,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncMobilerun)
webhook = await async_client.webhooks.create(
url="https://example.com/webhooks/droidrun",
description="description",
- event_types=["task.completed", "task.failed"],
+ event_types=["task.run.completed", "task.run.failed"],
)
assert_matches_type(WebhookCreateResponse, webhook, path=["response"])
diff --git a/tests/api_resources/workflows/events/__init__.py b/tests/api_resources/workflows/events/__init__.py
deleted file mode 100644
index fd8019a..0000000
--- a/tests/api_resources/workflows/events/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
diff --git a/tests/api_resources/workflows/events/test_catalog.py b/tests/api_resources/workflows/events/test_catalog.py
deleted file mode 100644
index df97792..0000000
--- a/tests/api_resources/workflows/events/test_catalog.py
+++ /dev/null
@@ -1,201 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from mobilerun_sdk import Mobilerun, AsyncMobilerun
-from mobilerun_sdk.types.workflows.events import (
- CatalogListResponse,
- CatalogRegisterResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestCatalog:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: Mobilerun) -> None:
- catalog = client.workflows.events.catalog.list()
- assert_matches_type(CatalogListResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: Mobilerun) -> None:
- catalog = client.workflows.events.catalog.list(
- page=1,
- page_size=1,
- source="device",
- )
- assert_matches_type(CatalogListResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: Mobilerun) -> None:
- response = client.workflows.events.catalog.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- catalog = response.parse()
- assert_matches_type(CatalogListResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: Mobilerun) -> None:
- with client.workflows.events.catalog.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- catalog = response.parse()
- assert_matches_type(CatalogListResponse, catalog, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_register(self, client: Mobilerun) -> None:
- catalog = client.workflows.events.catalog.register(
- events=[
- {
- "event_type": "x",
- "label": "x",
- }
- ],
- )
- assert_matches_type(CatalogRegisterResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_register(self, client: Mobilerun) -> None:
- response = client.workflows.events.catalog.with_raw_response.register(
- events=[
- {
- "event_type": "x",
- "label": "x",
- }
- ],
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- catalog = response.parse()
- assert_matches_type(CatalogRegisterResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_register(self, client: Mobilerun) -> None:
- with client.workflows.events.catalog.with_streaming_response.register(
- events=[
- {
- "event_type": "x",
- "label": "x",
- }
- ],
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- catalog = response.parse()
- assert_matches_type(CatalogRegisterResponse, catalog, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
-
-class TestAsyncCatalog:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncMobilerun) -> None:
- catalog = await async_client.workflows.events.catalog.list()
- assert_matches_type(CatalogListResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_with_all_params(self, async_client: AsyncMobilerun) -> None:
- catalog = await async_client.workflows.events.catalog.list(
- page=1,
- page_size=1,
- source="device",
- )
- assert_matches_type(CatalogListResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.workflows.events.catalog.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- catalog = await response.parse()
- assert_matches_type(CatalogListResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list(self, async_client: AsyncMobilerun) -> None:
- async with async_client.workflows.events.catalog.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- catalog = await response.parse()
- assert_matches_type(CatalogListResponse, catalog, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_register(self, async_client: AsyncMobilerun) -> None:
- catalog = await async_client.workflows.events.catalog.register(
- events=[
- {
- "event_type": "x",
- "label": "x",
- }
- ],
- )
- assert_matches_type(CatalogRegisterResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_register(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.workflows.events.catalog.with_raw_response.register(
- events=[
- {
- "event_type": "x",
- "label": "x",
- }
- ],
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- catalog = await response.parse()
- assert_matches_type(CatalogRegisterResponse, catalog, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_register(self, async_client: AsyncMobilerun) -> None:
- async with async_client.workflows.events.catalog.with_streaming_response.register(
- events=[
- {
- "event_type": "x",
- "label": "x",
- }
- ],
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- catalog = await response.parse()
- assert_matches_type(CatalogRegisterResponse, catalog, path=["response"])
-
- assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/workflows/test_events.py b/tests/api_resources/workflows/test_events.py
index 687e21b..8ca70fa 100644
--- a/tests/api_resources/workflows/test_events.py
+++ b/tests/api_resources/workflows/test_events.py
@@ -33,6 +33,7 @@ def test_method_dry_run(self, client: Mobilerun) -> None:
def test_method_dry_run_with_all_params(self, client: Mobilerun) -> None:
event = client.workflows.events.dry_run(
event_type="x",
+ device_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
payload={"foo": "bar"},
)
assert_matches_type(EventDryRunResponse, event, path=["response"])
@@ -76,6 +77,7 @@ def test_method_ingest(self, client: Mobilerun) -> None:
def test_method_ingest_with_all_params(self, client: Mobilerun) -> None:
event = client.workflows.events.ingest(
event_type="x",
+ device_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
payload={"foo": "bar"},
)
assert_matches_type(EventIngestResponse, event, path=["response"])
@@ -125,6 +127,7 @@ async def test_method_dry_run(self, async_client: AsyncMobilerun) -> None:
async def test_method_dry_run_with_all_params(self, async_client: AsyncMobilerun) -> None:
event = await async_client.workflows.events.dry_run(
event_type="x",
+ device_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
payload={"foo": "bar"},
)
assert_matches_type(EventDryRunResponse, event, path=["response"])
@@ -168,6 +171,7 @@ async def test_method_ingest(self, async_client: AsyncMobilerun) -> None:
async def test_method_ingest_with_all_params(self, async_client: AsyncMobilerun) -> None:
event = await async_client.workflows.events.ingest(
event_type="x",
+ device_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
payload={"foo": "bar"},
)
assert_matches_type(EventIngestResponse, event, path=["response"])