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"])