From 2add42ec33a0accad90ab5afe8d27ce22629b871 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 26 May 2026 13:14:25 +0000
Subject: [PATCH 1/7] feat(api): api update
---
.stats.yml | 4 ++--
src/mobilerun_sdk/resources/tasks/tasks.py | 16 ++++++++++++----
src/mobilerun_sdk/types/task.py | 2 ++
.../types/task_get_trajectory_response.py | 4 ++--
src/mobilerun_sdk/types/task_list_response.py | 2 ++
src/mobilerun_sdk/types/task_run_params.py | 4 +++-
.../types/task_run_streamed_params.py | 4 +++-
tests/api_resources/test_tasks.py | 4 ++++
8 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 20e38d9..7efea32 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 104
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-9c5542353ace880640fb7e8946c5c8d008480abb8d1952595ba2ee9323aed724.yml
-openapi_spec_hash: afa528f0921063291f66c56c6093f2ab
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-3b1ce47e9ff201fbf4382175970d440f505d04660ab9de1d93258f21a111188d.yml
+openapi_spec_hash: 5a16b9c8eaf044d46459b382457c90b6
config_hash: 27cfddf59d8227e89667fa012952335c
diff --git a/src/mobilerun_sdk/resources/tasks/tasks.py b/src/mobilerun_sdk/resources/tasks/tasks.py
index 47d4c1a..b765073 100644
--- a/src/mobilerun_sdk/resources/tasks/tasks.py
+++ b/src/mobilerun_sdk/resources/tasks/tasks.py
@@ -270,6 +270,7 @@ def run(
*,
device_id: str,
task: str,
+ accessibility: bool | Omit = omit,
agent_id: int | Omit = omit,
apps: SequenceNotStr[str] | Omit = omit,
continue_on_failure: bool | Omit = omit,
@@ -305,7 +306,7 @@ def run(
display_id: The display ID of the device to run the task on.
llm_model: The LLM model identifier to use for the task (e.g.
- 'google/gemini-3.1-flash-lite-preview')
+ 'google/gemini-3.1-flash-lite')
memory_namespace: Memory namespace for cross-task personalization
@@ -325,6 +326,7 @@ def run(
{
"device_id": device_id,
"task": task,
+ "accessibility": accessibility,
"agent_id": agent_id,
"apps": apps,
"continue_on_failure": continue_on_failure,
@@ -356,6 +358,7 @@ def run_streamed(
*,
device_id: str,
task: str,
+ accessibility: bool | Omit = omit,
agent_id: int | Omit = omit,
apps: SequenceNotStr[str] | Omit = omit,
continue_on_failure: bool | Omit = omit,
@@ -390,7 +393,7 @@ def run_streamed(
display_id: The display ID of the device to run the task on.
llm_model: The LLM model identifier to use for the task (e.g.
- 'google/gemini-3.1-flash-lite-preview')
+ 'google/gemini-3.1-flash-lite')
memory_namespace: Memory namespace for cross-task personalization
@@ -410,6 +413,7 @@ def run_streamed(
{
"device_id": device_id,
"task": task,
+ "accessibility": accessibility,
"agent_id": agent_id,
"apps": apps,
"continue_on_failure": continue_on_failure,
@@ -733,6 +737,7 @@ async def run(
*,
device_id: str,
task: str,
+ accessibility: bool | Omit = omit,
agent_id: int | Omit = omit,
apps: SequenceNotStr[str] | Omit = omit,
continue_on_failure: bool | Omit = omit,
@@ -768,7 +773,7 @@ async def run(
display_id: The display ID of the device to run the task on.
llm_model: The LLM model identifier to use for the task (e.g.
- 'google/gemini-3.1-flash-lite-preview')
+ 'google/gemini-3.1-flash-lite')
memory_namespace: Memory namespace for cross-task personalization
@@ -788,6 +793,7 @@ async def run(
{
"device_id": device_id,
"task": task,
+ "accessibility": accessibility,
"agent_id": agent_id,
"apps": apps,
"continue_on_failure": continue_on_failure,
@@ -819,6 +825,7 @@ async def run_streamed(
*,
device_id: str,
task: str,
+ accessibility: bool | Omit = omit,
agent_id: int | Omit = omit,
apps: SequenceNotStr[str] | Omit = omit,
continue_on_failure: bool | Omit = omit,
@@ -853,7 +860,7 @@ async def run_streamed(
display_id: The display ID of the device to run the task on.
llm_model: The LLM model identifier to use for the task (e.g.
- 'google/gemini-3.1-flash-lite-preview')
+ 'google/gemini-3.1-flash-lite')
memory_namespace: Memory namespace for cross-task personalization
@@ -873,6 +880,7 @@ async def run_streamed(
{
"device_id": device_id,
"task": task,
+ "accessibility": accessibility,
"agent_id": agent_id,
"apps": apps,
"continue_on_failure": continue_on_failure,
diff --git a/src/mobilerun_sdk/types/task.py b/src/mobilerun_sdk/types/task.py
index 4a0f115..cc4dab6 100644
--- a/src/mobilerun_sdk/types/task.py
+++ b/src/mobilerun_sdk/types/task.py
@@ -25,6 +25,8 @@ class Task(BaseModel):
id: Optional[str] = None
+ accessibility: Optional[bool] = None
+
agent_id: Optional[int] = FieldInfo(alias="agentId", default=None)
apps: Optional[List[str]] = None
diff --git a/src/mobilerun_sdk/types/task_get_trajectory_response.py b/src/mobilerun_sdk/types/task_get_trajectory_response.py
index 241c5b1..0405cf9 100644
--- a/src/mobilerun_sdk/types/task_get_trajectory_response.py
+++ b/src/mobilerun_sdk/types/task_get_trajectory_response.py
@@ -212,7 +212,7 @@ class TrajectoryTrajectoryManagerInputEvent(BaseModel):
class TrajectoryTrajectoryManagerPlanEventData(BaseModel):
- """Coordination event from ManagerAgent to DroidAgent.
+ """Coordination event from ManagerAgent to MobileAgent.
Used for workflow step routing only (NOT streamed to frontend).
For internal events with memory_update metadata, see ManagerPlanDetailsEvent.
@@ -231,7 +231,7 @@ class TrajectoryTrajectoryManagerPlanEventData(BaseModel):
class TrajectoryTrajectoryManagerPlanEvent(BaseModel):
data: TrajectoryTrajectoryManagerPlanEventData
- """Coordination event from ManagerAgent to DroidAgent.
+ """Coordination event from ManagerAgent to MobileAgent.
Used for workflow step routing only (NOT streamed to frontend). For internal
events with memory_update metadata, see ManagerPlanDetailsEvent.
diff --git a/src/mobilerun_sdk/types/task_list_response.py b/src/mobilerun_sdk/types/task_list_response.py
index 16c8d1d..12a8a4c 100644
--- a/src/mobilerun_sdk/types/task_list_response.py
+++ b/src/mobilerun_sdk/types/task_list_response.py
@@ -34,6 +34,8 @@ class Item(BaseModel):
user_id: str = FieldInfo(alias="userId")
+ accessibility: Optional[bool] = None
+
agent_id: Optional[int] = FieldInfo(alias="agentId", default=None)
apps: Optional[List[str]] = None
diff --git a/src/mobilerun_sdk/types/task_run_params.py b/src/mobilerun_sdk/types/task_run_params.py
index 3a91df8..8fc6144 100644
--- a/src/mobilerun_sdk/types/task_run_params.py
+++ b/src/mobilerun_sdk/types/task_run_params.py
@@ -18,6 +18,8 @@ class TaskRunParams(TypedDict, total=False):
task: Required[str]
+ accessibility: bool
+
agent_id: Annotated[int, PropertyInfo(alias="agentId")]
apps: SequenceNotStr[str]
@@ -36,7 +38,7 @@ class TaskRunParams(TypedDict, total=False):
llm_model: Annotated[str, PropertyInfo(alias="llmModel")]
"""The LLM model identifier to use for the task (e.g.
- 'google/gemini-3.1-flash-lite-preview')
+ 'google/gemini-3.1-flash-lite')
"""
max_steps: Annotated[int, PropertyInfo(alias="maxSteps")]
diff --git a/src/mobilerun_sdk/types/task_run_streamed_params.py b/src/mobilerun_sdk/types/task_run_streamed_params.py
index 8c03add..1c0cfd6 100644
--- a/src/mobilerun_sdk/types/task_run_streamed_params.py
+++ b/src/mobilerun_sdk/types/task_run_streamed_params.py
@@ -18,6 +18,8 @@ class TaskRunStreamedParams(TypedDict, total=False):
task: Required[str]
+ accessibility: bool
+
agent_id: Annotated[int, PropertyInfo(alias="agentId")]
apps: SequenceNotStr[str]
@@ -36,7 +38,7 @@ class TaskRunStreamedParams(TypedDict, total=False):
llm_model: Annotated[str, PropertyInfo(alias="llmModel")]
"""The LLM model identifier to use for the task (e.g.
- 'google/gemini-3.1-flash-lite-preview')
+ 'google/gemini-3.1-flash-lite')
"""
max_steps: Annotated[int, PropertyInfo(alias="maxSteps")]
diff --git a/tests/api_resources/test_tasks.py b/tests/api_resources/test_tasks.py
index 05fcfdd..5dafda7 100644
--- a/tests/api_resources/test_tasks.py
+++ b/tests/api_resources/test_tasks.py
@@ -249,6 +249,7 @@ def test_method_run_with_all_params(self, client: Mobilerun) -> None:
task = client.tasks.run(
device_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
task="x",
+ accessibility=True,
agent_id=0,
apps=["string"],
continue_on_failure=True,
@@ -317,6 +318,7 @@ def test_method_run_streamed_with_all_params(self, client: Mobilerun) -> None:
task = client.tasks.run_streamed(
device_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
task="x",
+ accessibility=True,
agent_id=0,
apps=["string"],
continue_on_failure=True,
@@ -688,6 +690,7 @@ async def test_method_run_with_all_params(self, async_client: AsyncMobilerun) ->
task = await async_client.tasks.run(
device_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
task="x",
+ accessibility=True,
agent_id=0,
apps=["string"],
continue_on_failure=True,
@@ -756,6 +759,7 @@ async def test_method_run_streamed_with_all_params(self, async_client: AsyncMobi
task = await async_client.tasks.run_streamed(
device_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
task="x",
+ accessibility=True,
agent_id=0,
apps=["string"],
continue_on_failure=True,
From 88c9ae09fe4979789e30e859bf9f7d57f39887c2 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 29 May 2026 10:16:56 +0000
Subject: [PATCH 2/7] feat(api): manual updates
---
.stats.yml | 6 +-
api.md | 8 +-
src/mobilerun_sdk/resources/apps.py | 81 +++++
src/mobilerun_sdk/resources/devices/apps.py | 158 +++++-----
src/mobilerun_sdk/resources/hooks.py | 95 +++++-
src/mobilerun_sdk/resources/proxies.py | 83 ++++-
src/mobilerun_sdk/types/__init__.py | 5 +
.../types/app_list_versions_response.py | 296 ++++++++++++++++++
src/mobilerun_sdk/types/hook_test_params.py | 13 +
src/mobilerun_sdk/types/hook_test_response.py | 25 ++
.../types/proxy_lookup_params.py | 24 ++
.../types/proxy_lookup_response.py | 57 ++++
tests/api_resources/devices/test_apps.py | 162 +++++-----
tests/api_resources/test_apps.py | 85 +++++
tests/api_resources/test_hooks.py | 103 ++++++
tests/api_resources/test_proxies.py | 113 +++++++
16 files changed, 1148 insertions(+), 166 deletions(-)
create mode 100644 src/mobilerun_sdk/types/app_list_versions_response.py
create mode 100644 src/mobilerun_sdk/types/hook_test_params.py
create mode 100644 src/mobilerun_sdk/types/hook_test_response.py
create mode 100644 src/mobilerun_sdk/types/proxy_lookup_params.py
create mode 100644 src/mobilerun_sdk/types/proxy_lookup_response.py
diff --git a/.stats.yml b/.stats.yml
index 7efea32..efc2936 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 104
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-3b1ce47e9ff201fbf4382175970d440f505d04660ab9de1d93258f21a111188d.yml
+configured_endpoints: 107
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-93d2d2bea4782e8dfdcad4fa394b5c73b46593bfc11413aeb4c3415e0f09edc3.yml
openapi_spec_hash: 5a16b9c8eaf044d46459b382457c90b6
-config_hash: 27cfddf59d8227e89667fa012952335c
+config_hash: 86398ea1292189c25296aefb64d3137d
diff --git a/api.md b/api.md
index ccda2c7..4b2c442 100644
--- a/api.md
+++ b/api.md
@@ -37,6 +37,7 @@ from mobilerun_sdk.types import (
AppDeleteResponse,
AppConfirmUploadResponse,
AppCreateSignedUploadURLResponse,
+ AppListVersionsResponse,
AppMarkFailedResponse,
)
```
@@ -48,6 +49,7 @@ Methods:
- client.apps.delete(id) -> AppDeleteResponse
- client.apps.confirm_upload(id) -> AppConfirmUploadResponse
- client.apps.create_signed_upload_url(\*\*params) -> AppCreateSignedUploadURLResponse
+- client.apps.list_versions(id) -> AppListVersionsResponse
- client.apps.mark_failed(id) -> AppMarkFailedResponse
# Carriers
@@ -188,11 +190,11 @@ from mobilerun_sdk.types.devices import AppListResponse
Methods:
-- client.devices.apps.update(package_name, \*, device_id) -> None
- client.devices.apps.list(device_id, \*\*params) -> Optional[AppListResponse]
- 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
## Esim
@@ -356,6 +358,7 @@ from mobilerun_sdk.types import (
HookGetSampleDataResponse,
HookPerformResponse,
HookSubscribeResponse,
+ HookTestResponse,
HookUnsubscribeResponse,
)
```
@@ -368,6 +371,7 @@ Methods:
- 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
@@ -410,6 +414,7 @@ from mobilerun_sdk.types import (
ProxyUpdateResponse,
ProxyListResponse,
ProxyDeleteResponse,
+ ProxyLookupResponse,
)
```
@@ -420,6 +425,7 @@ Methods:
- client.proxies.update(proxy_id, \*\*params) -> ProxyUpdateResponse
- client.proxies.list(\*\*params) -> ProxyListResponse
- client.proxies.delete(proxy_id) -> ProxyDeleteResponse
+- client.proxies.lookup(\*\*params) -> ProxyLookupResponse
# Tasks
diff --git a/src/mobilerun_sdk/resources/apps.py b/src/mobilerun_sdk/resources/apps.py
index 2587290..3e2bb8f 100644
--- a/src/mobilerun_sdk/resources/apps.py
+++ b/src/mobilerun_sdk/resources/apps.py
@@ -23,6 +23,7 @@
from ..types.app_delete_response import AppDeleteResponse
from ..types.app_retrieve_response import AppRetrieveResponse
from ..types.app_mark_failed_response import AppMarkFailedResponse
+from ..types.app_list_versions_response import AppListVersionsResponse
from ..types.app_confirm_upload_response import AppConfirmUploadResponse
from ..types.app_create_signed_upload_url_response import AppCreateSignedUploadURLResponse
@@ -266,6 +267,40 @@ def create_signed_upload_url(
cast_to=AppCreateSignedUploadURLResponse,
)
+ def list_versions(
+ self,
+ 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,
+ ) -> AppListVersionsResponse:
+ """
+ Retrieves all versions of an app visible to the user (own uploads + system
+ versions)
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return self._get(
+ path_template("/apps/{id}/versions", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppListVersionsResponse,
+ )
+
def mark_failed(
self,
id: str,
@@ -537,6 +572,40 @@ async def create_signed_upload_url(
cast_to=AppCreateSignedUploadURLResponse,
)
+ async def list_versions(
+ self,
+ 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,
+ ) -> AppListVersionsResponse:
+ """
+ Retrieves all versions of an app visible to the user (own uploads + system
+ versions)
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return await self._get(
+ path_template("/apps/{id}/versions", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppListVersionsResponse,
+ )
+
async def mark_failed(
self,
id: str,
@@ -590,6 +659,9 @@ def __init__(self, apps: AppsResource) -> None:
self.create_signed_upload_url = to_raw_response_wrapper(
apps.create_signed_upload_url,
)
+ self.list_versions = to_raw_response_wrapper(
+ apps.list_versions,
+ )
self.mark_failed = to_raw_response_wrapper(
apps.mark_failed,
)
@@ -614,6 +686,9 @@ def __init__(self, apps: AsyncAppsResource) -> None:
self.create_signed_upload_url = async_to_raw_response_wrapper(
apps.create_signed_upload_url,
)
+ self.list_versions = async_to_raw_response_wrapper(
+ apps.list_versions,
+ )
self.mark_failed = async_to_raw_response_wrapper(
apps.mark_failed,
)
@@ -638,6 +713,9 @@ def __init__(self, apps: AppsResource) -> None:
self.create_signed_upload_url = to_streamed_response_wrapper(
apps.create_signed_upload_url,
)
+ self.list_versions = to_streamed_response_wrapper(
+ apps.list_versions,
+ )
self.mark_failed = to_streamed_response_wrapper(
apps.mark_failed,
)
@@ -662,6 +740,9 @@ def __init__(self, apps: AsyncAppsResource) -> None:
self.create_signed_upload_url = async_to_streamed_response_wrapper(
apps.create_signed_upload_url,
)
+ self.list_versions = async_to_streamed_response_wrapper(
+ apps.list_versions,
+ )
self.mark_failed = async_to_streamed_response_wrapper(
apps.mark_failed,
)
diff --git a/src/mobilerun_sdk/resources/devices/apps.py b/src/mobilerun_sdk/resources/devices/apps.py
index 4541bb5..dbd6985 100644
--- a/src/mobilerun_sdk/resources/devices/apps.py
+++ b/src/mobilerun_sdk/resources/devices/apps.py
@@ -44,50 +44,6 @@ def with_streaming_response(self) -> AppsResourceWithStreamingResponse:
"""
return AppsResourceWithStreamingResponse(self)
- def update(
- self,
- package_name: str,
- *,
- device_id: str,
- 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.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> None:
- """
- Stop app
-
- 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 device_id:
- raise ValueError(f"Expected a non-empty value for `device_id` but received {device_id!r}")
- if not package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- extra_headers = {"Accept": "*/*", **(extra_headers or {})}
- extra_headers = {
- **strip_not_given(
- {"X-Device-Display-ID": str(x_device_display_id) if is_given(x_device_display_id) else not_given}
- ),
- **(extra_headers or {}),
- }
- return self._patch(
- path_template("/devices/{device_id}/apps/{package_name}", device_id=device_id, package_name=package_name),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=NoneType,
- )
-
def list(
self,
device_id: str,
@@ -337,28 +293,7 @@ def start(
cast_to=NoneType,
)
-
-class AsyncAppsResource(AsyncAPIResource):
- @cached_property
- def with_raw_response(self) -> AsyncAppsResourceWithRawResponse:
- """
- 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 AsyncAppsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncAppsResourceWithStreamingResponse:
- """
- 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 AsyncAppsResourceWithStreamingResponse(self)
-
- async def update(
+ def stop(
self,
package_name: str,
*,
@@ -394,7 +329,7 @@ async def update(
),
**(extra_headers or {}),
}
- return await self._patch(
+ return self._patch(
path_template("/devices/{device_id}/apps/{package_name}", device_id=device_id, package_name=package_name),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -402,6 +337,27 @@ async def update(
cast_to=NoneType,
)
+
+class AsyncAppsResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncAppsResourceWithRawResponse:
+ """
+ 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 AsyncAppsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncAppsResourceWithStreamingResponse:
+ """
+ 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 AsyncAppsResourceWithStreamingResponse(self)
+
async def list(
self,
device_id: str,
@@ -651,14 +607,55 @@ async def start(
cast_to=NoneType,
)
+ async def stop(
+ self,
+ package_name: str,
+ *,
+ device_id: str,
+ 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.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> None:
+ """
+ Stop app
+
+ 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 device_id:
+ raise ValueError(f"Expected a non-empty value for `device_id` but received {device_id!r}")
+ if not package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ extra_headers = {"Accept": "*/*", **(extra_headers or {})}
+ extra_headers = {
+ **strip_not_given(
+ {"X-Device-Display-ID": str(x_device_display_id) if is_given(x_device_display_id) else not_given}
+ ),
+ **(extra_headers or {}),
+ }
+ return await self._patch(
+ path_template("/devices/{device_id}/apps/{package_name}", device_id=device_id, package_name=package_name),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=NoneType,
+ )
+
class AppsResourceWithRawResponse:
def __init__(self, apps: AppsResource) -> None:
self._apps = apps
- self.update = to_raw_response_wrapper(
- apps.update,
- )
self.list = to_raw_response_wrapper(
apps.list,
)
@@ -671,15 +668,15 @@ def __init__(self, apps: AppsResource) -> None:
self.start = to_raw_response_wrapper(
apps.start,
)
+ self.stop = to_raw_response_wrapper(
+ apps.stop,
+ )
class AsyncAppsResourceWithRawResponse:
def __init__(self, apps: AsyncAppsResource) -> None:
self._apps = apps
- self.update = async_to_raw_response_wrapper(
- apps.update,
- )
self.list = async_to_raw_response_wrapper(
apps.list,
)
@@ -692,15 +689,15 @@ def __init__(self, apps: AsyncAppsResource) -> None:
self.start = async_to_raw_response_wrapper(
apps.start,
)
+ self.stop = async_to_raw_response_wrapper(
+ apps.stop,
+ )
class AppsResourceWithStreamingResponse:
def __init__(self, apps: AppsResource) -> None:
self._apps = apps
- self.update = to_streamed_response_wrapper(
- apps.update,
- )
self.list = to_streamed_response_wrapper(
apps.list,
)
@@ -713,15 +710,15 @@ def __init__(self, apps: AppsResource) -> None:
self.start = to_streamed_response_wrapper(
apps.start,
)
+ self.stop = to_streamed_response_wrapper(
+ apps.stop,
+ )
class AsyncAppsResourceWithStreamingResponse:
def __init__(self, apps: AsyncAppsResource) -> None:
self._apps = apps
- self.update = async_to_streamed_response_wrapper(
- apps.update,
- )
self.list = async_to_streamed_response_wrapper(
apps.list,
)
@@ -734,3 +731,6 @@ def __init__(self, apps: AsyncAppsResource) -> None:
self.start = async_to_streamed_response_wrapper(
apps.start,
)
+ self.stop = async_to_streamed_response_wrapper(
+ apps.stop,
+ )
diff --git a/src/mobilerun_sdk/resources/hooks.py b/src/mobilerun_sdk/resources/hooks.py
index 185b05e..6f3c43b 100644
--- a/src/mobilerun_sdk/resources/hooks.py
+++ b/src/mobilerun_sdk/resources/hooks.py
@@ -7,7 +7,7 @@
import httpx
-from ..types import hook_list_params, hook_update_params, hook_perform_params, hook_subscribe_params
+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
@@ -20,6 +20,7 @@
)
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
@@ -277,6 +278,46 @@ def subscribe(
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,
@@ -560,6 +601,46 @@ async def subscribe(
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,
@@ -618,6 +699,9 @@ def __init__(self, hooks: HooksResource) -> None:
self.subscribe = to_raw_response_wrapper(
hooks.subscribe,
)
+ self.test = to_raw_response_wrapper(
+ hooks.test,
+ )
self.unsubscribe = to_raw_response_wrapper(
hooks.unsubscribe,
)
@@ -645,6 +729,9 @@ def __init__(self, hooks: AsyncHooksResource) -> None:
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,
)
@@ -672,6 +759,9 @@ def __init__(self, hooks: HooksResource) -> None:
self.subscribe = to_streamed_response_wrapper(
hooks.subscribe,
)
+ self.test = to_streamed_response_wrapper(
+ hooks.test,
+ )
self.unsubscribe = to_streamed_response_wrapper(
hooks.unsubscribe,
)
@@ -699,6 +789,9 @@ def __init__(self, hooks: AsyncHooksResource) -> None:
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 cd4235f..4abd363 100644
--- a/src/mobilerun_sdk/resources/proxies.py
+++ b/src/mobilerun_sdk/resources/proxies.py
@@ -6,7 +6,7 @@
import httpx
-from ..types import proxy_list_params, proxy_create_params, proxy_update_params
+from ..types import proxy_list_params, proxy_create_params, proxy_lookup_params, proxy_update_params
from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
from .._utils import path_template, required_args, maybe_transform, async_maybe_transform
from .._compat import cached_property
@@ -21,6 +21,7 @@
from ..types.proxy_list_response import ProxyListResponse
from ..types.proxy_create_response import ProxyCreateResponse
from ..types.proxy_delete_response import ProxyDeleteResponse
+from ..types.proxy_lookup_response import ProxyLookupResponse
from ..types.proxy_update_response import ProxyUpdateResponse
from ..types.proxy_retrieve_response import ProxyRetrieveResponse
@@ -349,6 +350,40 @@ def delete(
cast_to=ProxyDeleteResponse,
)
+ def lookup(
+ self,
+ *,
+ socks5: proxy_lookup_params.Socks5,
+ # 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,
+ ) -> ProxyLookupResponse:
+ """
+ Lookup proxy location
+
+ Args:
+ socks5: SOCKS5 proxy configuration.
+
+ 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(
+ "/proxies/lookup",
+ body=maybe_transform({"socks5": socks5}, proxy_lookup_params.ProxyLookupParams),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyLookupResponse,
+ )
+
class AsyncProxiesResource(AsyncAPIResource):
"""Network Proxies"""
@@ -672,6 +707,40 @@ async def delete(
cast_to=ProxyDeleteResponse,
)
+ async def lookup(
+ self,
+ *,
+ socks5: proxy_lookup_params.Socks5,
+ # 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,
+ ) -> ProxyLookupResponse:
+ """
+ Lookup proxy location
+
+ Args:
+ socks5: SOCKS5 proxy configuration.
+
+ 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(
+ "/proxies/lookup",
+ body=await async_maybe_transform({"socks5": socks5}, proxy_lookup_params.ProxyLookupParams),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyLookupResponse,
+ )
+
class ProxiesResourceWithRawResponse:
def __init__(self, proxies: ProxiesResource) -> None:
@@ -692,6 +761,9 @@ def __init__(self, proxies: ProxiesResource) -> None:
self.delete = to_raw_response_wrapper(
proxies.delete,
)
+ self.lookup = to_raw_response_wrapper(
+ proxies.lookup,
+ )
class AsyncProxiesResourceWithRawResponse:
@@ -713,6 +785,9 @@ def __init__(self, proxies: AsyncProxiesResource) -> None:
self.delete = async_to_raw_response_wrapper(
proxies.delete,
)
+ self.lookup = async_to_raw_response_wrapper(
+ proxies.lookup,
+ )
class ProxiesResourceWithStreamingResponse:
@@ -734,6 +809,9 @@ def __init__(self, proxies: ProxiesResource) -> None:
self.delete = to_streamed_response_wrapper(
proxies.delete,
)
+ self.lookup = to_streamed_response_wrapper(
+ proxies.lookup,
+ )
class AsyncProxiesResourceWithStreamingResponse:
@@ -755,3 +833,6 @@ def __init__(self, proxies: AsyncProxiesResource) -> None:
self.delete = async_to_streamed_response_wrapper(
proxies.delete,
)
+ self.lookup = async_to_streamed_response_wrapper(
+ proxies.lookup,
+ )
diff --git a/src/mobilerun_sdk/types/__init__.py b/src/mobilerun_sdk/types/__init__.py
index ba767ee..abff37b 100644
--- a/src/mobilerun_sdk/types/__init__.py
+++ b/src/mobilerun_sdk/types/__init__.py
@@ -22,12 +22,14 @@
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
@@ -40,6 +42,7 @@
from .profile_list_params import ProfileListParams as ProfileListParams
from .proxy_create_params import ProxyCreateParams as ProxyCreateParams
from .proxy_list_response import ProxyListResponse as ProxyListResponse
+from .proxy_lookup_params import ProxyLookupParams as ProxyLookupParams
from .proxy_update_params import ProxyUpdateParams as ProxyUpdateParams
from .device_create_params import DeviceCreateParams as DeviceCreateParams
from .device_list_response import DeviceListResponse as DeviceListResponse
@@ -57,6 +60,7 @@
from .profile_update_params import ProfileUpdateParams as ProfileUpdateParams
from .proxy_create_response import ProxyCreateResponse as ProxyCreateResponse
from .proxy_delete_response import ProxyDeleteResponse as ProxyDeleteResponse
+from .proxy_lookup_response import ProxyLookupResponse as ProxyLookupResponse
from .proxy_update_response import ProxyUpdateResponse as ProxyUpdateResponse
from .credential_list_params import CredentialListParams as CredentialListParams
from .device_set_name_params import DeviceSetNameParams as DeviceSetNameParams
@@ -78,6 +82,7 @@
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 .app_list_versions_response import AppListVersionsResponse as AppListVersionsResponse
from .task_send_message_response import TaskSendMessageResponse as TaskSendMessageResponse
from .app_confirm_upload_response import AppConfirmUploadResponse as AppConfirmUploadResponse
from .device_fingerprint_response import DeviceFingerprintResponse as DeviceFingerprintResponse
diff --git a/src/mobilerun_sdk/types/app_list_versions_response.py b/src/mobilerun_sdk/types/app_list_versions_response.py
new file mode 100644
index 0000000..130eab8
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_list_versions_response.py
@@ -0,0 +1,296 @@
+# 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
+
+__all__ = ["AppListVersionsResponse", "Data"]
+
+
+class Data(BaseModel):
+ id: str
+
+ app_id: str = FieldInfo(alias="appId")
+
+ country: Literal[
+ "AF",
+ "AL",
+ "DZ",
+ "AS",
+ "AD",
+ "AO",
+ "AI",
+ "AQ",
+ "AG",
+ "AR",
+ "AM",
+ "AW",
+ "AP",
+ "AU",
+ "AT",
+ "AZ",
+ "BS",
+ "BH",
+ "BD",
+ "BB",
+ "BY",
+ "BE",
+ "BZ",
+ "BJ",
+ "BM",
+ "BT",
+ "BO",
+ "BQ",
+ "BA",
+ "BW",
+ "BV",
+ "BR",
+ "IO",
+ "BN",
+ "BG",
+ "BF",
+ "BI",
+ "KH",
+ "CM",
+ "CA",
+ "CV",
+ "KY",
+ "CF",
+ "TD",
+ "CL",
+ "CN",
+ "CX",
+ "CC",
+ "CO",
+ "KM",
+ "CG",
+ "CD",
+ "CK",
+ "CR",
+ "HR",
+ "CU",
+ "CW",
+ "CY",
+ "CZ",
+ "CI",
+ "DK",
+ "DJ",
+ "DM",
+ "DO",
+ "EC",
+ "EG",
+ "SV",
+ "GQ",
+ "ER",
+ "EE",
+ "ET",
+ "FK",
+ "FO",
+ "FJ",
+ "FI",
+ "FR",
+ "GF",
+ "PF",
+ "TF",
+ "GA",
+ "GM",
+ "GE",
+ "DE",
+ "GH",
+ "GI",
+ "GR",
+ "GL",
+ "GD",
+ "GP",
+ "GU",
+ "GT",
+ "GG",
+ "GN",
+ "GW",
+ "GY",
+ "HT",
+ "HM",
+ "VA",
+ "HN",
+ "HK",
+ "HU",
+ "IS",
+ "IN",
+ "ID",
+ "IR",
+ "IQ",
+ "IE",
+ "IM",
+ "IL",
+ "IT",
+ "JM",
+ "JP",
+ "JE",
+ "JO",
+ "KZ",
+ "KE",
+ "KI",
+ "KR",
+ "KW",
+ "KG",
+ "LA",
+ "LV",
+ "LB",
+ "LS",
+ "LR",
+ "LY",
+ "LI",
+ "LT",
+ "LU",
+ "MO",
+ "MG",
+ "MW",
+ "MY",
+ "MV",
+ "ML",
+ "MT",
+ "MH",
+ "MQ",
+ "MR",
+ "MU",
+ "YT",
+ "MX",
+ "FM",
+ "MD",
+ "MC",
+ "MN",
+ "ME",
+ "MS",
+ "MA",
+ "MZ",
+ "MM",
+ "NA",
+ "NR",
+ "NP",
+ "NL",
+ "AN",
+ "NC",
+ "NZ",
+ "NI",
+ "NE",
+ "NG",
+ "NU",
+ "NF",
+ "KP",
+ "MK",
+ "MP",
+ "NO",
+ "OM",
+ "PK",
+ "PW",
+ "PS",
+ "PA",
+ "PG",
+ "PY",
+ "PE",
+ "PH",
+ "PN",
+ "PL",
+ "PT",
+ "PR",
+ "QA",
+ "RE",
+ "RO",
+ "RU",
+ "RW",
+ "BL",
+ "SH",
+ "KN",
+ "LC",
+ "MF",
+ "PM",
+ "VC",
+ "WS",
+ "SM",
+ "ST",
+ "SA",
+ "SN",
+ "RS",
+ "CS",
+ "SC",
+ "SL",
+ "SG",
+ "SX",
+ "SK",
+ "SI",
+ "SB",
+ "SO",
+ "ZA",
+ "GS",
+ "SS",
+ "ES",
+ "LK",
+ "SD",
+ "SR",
+ "SJ",
+ "SZ",
+ "SE",
+ "CH",
+ "SY",
+ "TW",
+ "TJ",
+ "TZ",
+ "TH",
+ "TL",
+ "TG",
+ "TK",
+ "TO",
+ "TT",
+ "TN",
+ "TR",
+ "TM",
+ "TC",
+ "TV",
+ "UG",
+ "UA",
+ "AE",
+ "GB",
+ "US",
+ "UM",
+ "UY",
+ "UZ",
+ "VU",
+ "VE",
+ "VN",
+ "VG",
+ "VI",
+ "WF",
+ "EH",
+ "YE",
+ "ZM",
+ "ZW",
+ "AX",
+ ]
+
+ created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
+
+ queued_at: Optional[datetime] = FieldInfo(alias="queuedAt", default=None)
+
+ size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None)
+
+ source: Literal["user", "system", "portal"]
+
+ status: Literal["queued", "available", "failed"]
+
+ target_sdk: Optional[int] = FieldInfo(alias="targetSdk", default=None)
+
+ updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
+
+ user_id: Optional[str] = FieldInfo(alias="userId", default=None)
+
+ version_code: int = FieldInfo(alias="versionCode")
+
+ version_name: str = FieldInfo(alias="versionName")
+
+
+class AppListVersionsResponse(BaseModel):
+ data: List[Data]
diff --git a/src/mobilerun_sdk/types/hook_test_params.py b/src/mobilerun_sdk/types/hook_test_params.py
new file mode 100644
index 0000000..af5edff
--- /dev/null
+++ b/src/mobilerun_sdk/types/hook_test_params.py
@@ -0,0 +1,13 @@
+# 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
new file mode 100644
index 0000000..8d22bab
--- /dev/null
+++ b/src/mobilerun_sdk/types/hook_test_response.py
@@ -0,0 +1,25 @@
+# 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/proxy_lookup_params.py b/src/mobilerun_sdk/types/proxy_lookup_params.py
new file mode 100644
index 0000000..43b7464
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_lookup_params.py
@@ -0,0 +1,24 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Required, TypedDict
+
+__all__ = ["ProxyLookupParams", "Socks5"]
+
+
+class ProxyLookupParams(TypedDict, total=False):
+ socks5: Required[Socks5]
+ """SOCKS5 proxy configuration."""
+
+
+class Socks5(TypedDict, total=False):
+ """SOCKS5 proxy configuration."""
+
+ host: Required[str]
+
+ port: Required[int]
+
+ password: str
+
+ user: str
diff --git a/src/mobilerun_sdk/types/proxy_lookup_response.py b/src/mobilerun_sdk/types/proxy_lookup_response.py
new file mode 100644
index 0000000..6e4e88f
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_lookup_response.py
@@ -0,0 +1,57 @@
+# 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__ = ["ProxyLookupResponse", "Carrier"]
+
+
+class Carrier(BaseModel):
+ """Mobile carrier information."""
+
+ mcc: Optional[str] = None
+ """Mobile Country Code."""
+
+ mnc: Optional[str] = None
+ """Mobile Network Code."""
+
+ name: Optional[str] = None
+ """Carrier name."""
+
+
+class ProxyLookupResponse(BaseModel):
+ ip: str
+ """IP address of the proxy."""
+
+ is_mobile: bool = FieldInfo(alias="isMobile")
+ """Whether the IP is a mobile connection."""
+
+ latitude: float
+ """Latitude of the proxy."""
+
+ longitude: float
+ """Longitude of the proxy."""
+
+ schema_: Optional[str] = FieldInfo(alias="$schema", default=None)
+ """A URL to the JSON Schema for this object."""
+
+ carrier: Optional[Carrier] = None
+ """Mobile carrier information."""
+
+ city: Optional[str] = None
+ """City of the proxy."""
+
+ country: Optional[str] = None
+ """Country of the proxy."""
+
+ country_code: Optional[str] = FieldInfo(alias="countryCode", default=None)
+ """ISO country code."""
+
+ region: Optional[str] = None
+ """Region of the proxy."""
+
+ timezone: Optional[str] = None
+ """Timezone of the proxy."""
diff --git a/tests/api_resources/devices/test_apps.py b/tests/api_resources/devices/test_apps.py
index 87c426d..5f86d32 100644
--- a/tests/api_resources/devices/test_apps.py
+++ b/tests/api_resources/devices/test_apps.py
@@ -17,68 +17,6 @@
class TestApps:
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_update(self, client: Mobilerun) -> None:
- app = client.devices.apps.update(
- package_name="packageName",
- device_id="deviceId",
- )
- assert app is None
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update_with_all_params(self, client: Mobilerun) -> None:
- app = client.devices.apps.update(
- package_name="packageName",
- device_id="deviceId",
- x_device_display_id=0,
- )
- assert app is None
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_update(self, client: Mobilerun) -> None:
- response = client.devices.apps.with_raw_response.update(
- package_name="packageName",
- device_id="deviceId",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = response.parse()
- assert app is None
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_update(self, client: Mobilerun) -> None:
- with client.devices.apps.with_streaming_response.update(
- package_name="packageName",
- device_id="deviceId",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = response.parse()
- assert app is None
-
- 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 `device_id` but received ''"):
- client.devices.apps.with_raw_response.update(
- package_name="packageName",
- device_id="",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- client.devices.apps.with_raw_response.update(
- package_name="",
- device_id="deviceId",
- )
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_list(self, client: Mobilerun) -> None:
@@ -371,16 +309,10 @@ def test_path_params_start(self, client: Mobilerun) -> None:
device_id="deviceId",
)
-
-class TestAsyncApps:
- 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_update(self, async_client: AsyncMobilerun) -> None:
- app = await async_client.devices.apps.update(
+ def test_method_stop(self, client: Mobilerun) -> None:
+ app = client.devices.apps.stop(
package_name="packageName",
device_id="deviceId",
)
@@ -388,8 +320,8 @@ async def test_method_update(self, async_client: AsyncMobilerun) -> None:
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_update_with_all_params(self, async_client: AsyncMobilerun) -> None:
- app = await async_client.devices.apps.update(
+ def test_method_stop_with_all_params(self, client: Mobilerun) -> None:
+ app = client.devices.apps.stop(
package_name="packageName",
device_id="deviceId",
x_device_display_id=0,
@@ -398,47 +330,53 @@ async def test_method_update_with_all_params(self, async_client: AsyncMobilerun)
@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.devices.apps.with_raw_response.update(
+ def test_raw_response_stop(self, client: Mobilerun) -> None:
+ response = client.devices.apps.with_raw_response.stop(
package_name="packageName",
device_id="deviceId",
)
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = await response.parse()
+ app = response.parse()
assert app is None
@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.devices.apps.with_streaming_response.update(
+ def test_streaming_response_stop(self, client: Mobilerun) -> None:
+ with client.devices.apps.with_streaming_response.stop(
package_name="packageName",
device_id="deviceId",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = await response.parse()
+ app = response.parse()
assert app is None
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:
+ def test_path_params_stop(self, client: Mobilerun) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `device_id` but received ''"):
- await async_client.devices.apps.with_raw_response.update(
+ client.devices.apps.with_raw_response.stop(
package_name="packageName",
device_id="",
)
with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- await async_client.devices.apps.with_raw_response.update(
+ client.devices.apps.with_raw_response.stop(
package_name="",
device_id="deviceId",
)
+
+class TestAsyncApps:
+ 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:
@@ -730,3 +668,65 @@ async def test_path_params_start(self, async_client: AsyncMobilerun) -> None:
package_name="",
device_id="deviceId",
)
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_stop(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.devices.apps.stop(
+ package_name="packageName",
+ device_id="deviceId",
+ )
+ assert app is None
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_stop_with_all_params(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.devices.apps.stop(
+ package_name="packageName",
+ device_id="deviceId",
+ x_device_display_id=0,
+ )
+ assert app is None
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_stop(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.devices.apps.with_raw_response.stop(
+ package_name="packageName",
+ device_id="deviceId",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = await response.parse()
+ assert app is None
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_stop(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.devices.apps.with_streaming_response.stop(
+ package_name="packageName",
+ device_id="deviceId",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = await response.parse()
+ assert app is None
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_path_params_stop(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `device_id` but received ''"):
+ await async_client.devices.apps.with_raw_response.stop(
+ package_name="packageName",
+ device_id="",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ await async_client.devices.apps.with_raw_response.stop(
+ package_name="",
+ device_id="deviceId",
+ )
diff --git a/tests/api_resources/test_apps.py b/tests/api_resources/test_apps.py
index 887a5ee..7fd88df 100644
--- a/tests/api_resources/test_apps.py
+++ b/tests/api_resources/test_apps.py
@@ -14,6 +14,7 @@
AppDeleteResponse,
AppRetrieveResponse,
AppMarkFailedResponse,
+ AppListVersionsResponse,
AppConfirmUploadResponse,
AppCreateSignedUploadURLResponse,
)
@@ -280,6 +281,48 @@ def test_streaming_response_create_signed_upload_url(self, client: Mobilerun) ->
assert cast(Any, response.is_closed) is True
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_versions(self, client: Mobilerun) -> None:
+ app = client.apps.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list_versions(self, client: Mobilerun) -> None:
+ response = client.apps.with_raw_response.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = response.parse()
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list_versions(self, client: Mobilerun) -> None:
+ with client.apps.with_streaming_response.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = response.parse()
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_list_versions(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ client.apps.with_raw_response.list_versions(
+ "",
+ )
+
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_mark_failed(self, client: Mobilerun) -> None:
@@ -584,6 +627,48 @@ async def test_streaming_response_create_signed_upload_url(self, async_client: A
assert cast(Any, response.is_closed) is True
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list_versions(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.apps.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_list_versions(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.apps.with_raw_response.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = await response.parse()
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_list_versions(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.apps.with_streaming_response.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = await response.parse()
+ assert_matches_type(AppListVersionsResponse, app, 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_list_versions(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ await async_client.apps.with_raw_response.list_versions(
+ "",
+ )
+
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_method_mark_failed(self, async_client: AsyncMobilerun) -> None:
diff --git a/tests/api_resources/test_hooks.py b/tests/api_resources/test_hooks.py
index 5d9a9d9..21548ab 100644
--- a/tests/api_resources/test_hooks.py
+++ b/tests/api_resources/test_hooks.py
@@ -11,6 +11,7 @@
from mobilerun_sdk import Mobilerun, AsyncMobilerun
from mobilerun_sdk.types import (
HookListResponse,
+ HookTestResponse,
HookUpdateResponse,
HookPerformResponse,
HookRetrieveResponse,
@@ -264,6 +265,57 @@ def test_streaming_response_subscribe(self, client: Mobilerun) -> None:
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:
@@ -551,6 +603,57 @@ async def test_streaming_response_subscribe(self, async_client: AsyncMobilerun)
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:
diff --git a/tests/api_resources/test_proxies.py b/tests/api_resources/test_proxies.py
index 6b09e36..b96cc4d 100644
--- a/tests/api_resources/test_proxies.py
+++ b/tests/api_resources/test_proxies.py
@@ -13,6 +13,7 @@
ProxyListResponse,
ProxyCreateResponse,
ProxyDeleteResponse,
+ ProxyLookupResponse,
ProxyUpdateResponse,
ProxyRetrieveResponse,
)
@@ -352,6 +353,62 @@ def test_path_params_delete(self, client: Mobilerun) -> None:
"",
)
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_lookup(self, client: Mobilerun) -> None:
+ proxy = client.proxies.lookup(
+ socks5={
+ "host": "host",
+ "port": 1,
+ },
+ )
+ assert_matches_type(ProxyLookupResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_lookup_with_all_params(self, client: Mobilerun) -> None:
+ proxy = client.proxies.lookup(
+ socks5={
+ "host": "host",
+ "port": 1,
+ "password": "password",
+ "user": "user",
+ },
+ )
+ assert_matches_type(ProxyLookupResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_lookup(self, client: Mobilerun) -> None:
+ response = client.proxies.with_raw_response.lookup(
+ socks5={
+ "host": "host",
+ "port": 1,
+ },
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = response.parse()
+ assert_matches_type(ProxyLookupResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_lookup(self, client: Mobilerun) -> None:
+ with client.proxies.with_streaming_response.lookup(
+ socks5={
+ "host": "host",
+ "port": 1,
+ },
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = response.parse()
+ assert_matches_type(ProxyLookupResponse, proxy, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
class TestAsyncProxies:
parametrize = pytest.mark.parametrize(
@@ -686,3 +743,59 @@ async def test_path_params_delete(self, async_client: AsyncMobilerun) -> None:
await async_client.proxies.with_raw_response.delete(
"",
)
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_lookup(self, async_client: AsyncMobilerun) -> None:
+ proxy = await async_client.proxies.lookup(
+ socks5={
+ "host": "host",
+ "port": 1,
+ },
+ )
+ assert_matches_type(ProxyLookupResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_lookup_with_all_params(self, async_client: AsyncMobilerun) -> None:
+ proxy = await async_client.proxies.lookup(
+ socks5={
+ "host": "host",
+ "port": 1,
+ "password": "password",
+ "user": "user",
+ },
+ )
+ assert_matches_type(ProxyLookupResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_lookup(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.proxies.with_raw_response.lookup(
+ socks5={
+ "host": "host",
+ "port": 1,
+ },
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = await response.parse()
+ assert_matches_type(ProxyLookupResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_lookup(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.proxies.with_streaming_response.lookup(
+ socks5={
+ "host": "host",
+ "port": 1,
+ },
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = await response.parse()
+ assert_matches_type(ProxyLookupResponse, proxy, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
From 3a0956aedece406203dc55228a3ec4549c078d56 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 30 May 2026 11:14:23 +0000
Subject: [PATCH 3/7] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index efc2936..6616e99 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 107
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-93d2d2bea4782e8dfdcad4fa394b5c73b46593bfc11413aeb4c3415e0f09edc3.yml
-openapi_spec_hash: 5a16b9c8eaf044d46459b382457c90b6
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-506128e71e04bea5ce31fd879d4c0ac5a313fc39cf9f39acd1cbb3cee95f74ab.yml
+openapi_spec_hash: b45c764022d18add79f0516691749fa8
config_hash: 86398ea1292189c25296aefb64d3137d
From b58be1c00be168f8719a56d2ce5c1806ac30ef92 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 30 May 2026 12:58:43 +0000
Subject: [PATCH 4/7] feat(api): api update
---
.stats.yml | 6 +-
api.md | 104 +--
src/mobilerun_sdk/_client.py | 112 +--
src/mobilerun_sdk/resources/__init__.py | 28 -
src/mobilerun_sdk/resources/apps.py | 748 ------------------
src/mobilerun_sdk/resources/carriers.py | 4 -
.../resources/credentials/__init__.py | 33 -
.../resources/credentials/credentials.py | 225 ------
.../credentials/packages/__init__.py | 33 -
.../packages/credentials/__init__.py | 33 -
.../packages/credentials/credentials.py | 413 ----------
.../packages/credentials/fields.py | 421 ----------
.../credentials/packages/packages.py | 284 -------
.../resources/devices/devices.py | 18 +-
src/mobilerun_sdk/resources/devices/tasks.py | 4 -
src/mobilerun_sdk/resources/hooks.py | 4 +
src/mobilerun_sdk/resources/models.py | 4 -
src/mobilerun_sdk/resources/proxies.py | 677 +---------------
src/mobilerun_sdk/types/__init__.py | 21 +-
.../types/app_confirm_upload_response.py | 13 -
.../app_create_signed_upload_url_params.py | 43 -
.../app_create_signed_upload_url_response.py | 26 -
.../types/app_delete_response.py | 13 -
src/mobilerun_sdk/types/app_list_params.py | 25 -
src/mobilerun_sdk/types/app_list_response.py | 333 --------
.../types/app_list_versions_response.py | 296 -------
.../types/app_mark_failed_response.py | 13 -
.../types/app_retrieve_response.py | 35 -
.../types/credential_list_params.py | 15 -
.../types/credential_list_response.py | 15 -
.../types/credentials/__init__.py | 4 -
.../credentials/package_create_params.py | 13 -
.../credentials/package_create_response.py | 21 -
.../credentials/package_list_response.py | 12 -
.../types/credentials/packages/__init__.py | 6 -
.../types/credentials/packages/credential.py | 30 -
.../packages/credential_create_params.py | 27 -
.../packages/credential_create_response.py | 16 -
.../packages/credential_delete_response.py | 16 -
.../packages/credential_retrieve_response.py | 10 -
.../packages/credentials/__init__.py | 6 -
.../credentials/field_create_params.py | 22 -
.../credentials/field_create_response.py | 16 -
.../credentials/field_delete_response.py | 16 -
.../credentials/field_update_params.py | 17 -
.../credentials/field_update_response.py | 16 -
.../types/device_create_params.py | 14 +-
.../types/devices/state_ui_response.py | 104 ++-
src/mobilerun_sdk/types/proxy_config.py | 38 +-
src/mobilerun_sdk/types/proxy_config_param.py | 18 +
.../types/proxy_create_params.py | 33 -
.../types/proxy_create_response.py | 16 -
.../types/proxy_delete_response.py | 16 -
src/mobilerun_sdk/types/proxy_list_params.py | 11 -
.../types/proxy_list_response.py | 12 -
.../types/proxy_retrieve_response.py | 10 -
.../types/proxy_update_params.py | 33 -
.../types/proxy_update_response.py | 16 -
src/mobilerun_sdk/types/shared/__init__.py | 1 -
src/mobilerun_sdk/types/shared/device_spec.py | 14 +-
src/mobilerun_sdk/types/shared/pagination.py | 21 -
.../types/shared_params/device_spec.py | 14 +-
tests/api_resources/credentials/__init__.py | 1 -
.../credentials/packages/__init__.py | 1 -
.../packages/credentials/__init__.py | 1 -
.../packages/credentials/test_fields.py | 390 ---------
.../credentials/packages/test_credentials.py | 376 ---------
.../credentials/test_packages.py | 176 -----
tests/api_resources/test_apps.py | 712 -----------------
tests/api_resources/test_credentials.py | 98 ---
tests/api_resources/test_proxies.py | 667 +---------------
71 files changed, 162 insertions(+), 6878 deletions(-)
delete mode 100644 src/mobilerun_sdk/resources/apps.py
delete mode 100644 src/mobilerun_sdk/resources/credentials/__init__.py
delete mode 100644 src/mobilerun_sdk/resources/credentials/credentials.py
delete mode 100644 src/mobilerun_sdk/resources/credentials/packages/__init__.py
delete mode 100644 src/mobilerun_sdk/resources/credentials/packages/credentials/__init__.py
delete mode 100644 src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py
delete mode 100644 src/mobilerun_sdk/resources/credentials/packages/credentials/fields.py
delete mode 100644 src/mobilerun_sdk/resources/credentials/packages/packages.py
delete mode 100644 src/mobilerun_sdk/types/app_confirm_upload_response.py
delete mode 100644 src/mobilerun_sdk/types/app_create_signed_upload_url_params.py
delete mode 100644 src/mobilerun_sdk/types/app_create_signed_upload_url_response.py
delete mode 100644 src/mobilerun_sdk/types/app_delete_response.py
delete mode 100644 src/mobilerun_sdk/types/app_list_params.py
delete mode 100644 src/mobilerun_sdk/types/app_list_response.py
delete mode 100644 src/mobilerun_sdk/types/app_list_versions_response.py
delete mode 100644 src/mobilerun_sdk/types/app_mark_failed_response.py
delete mode 100644 src/mobilerun_sdk/types/app_retrieve_response.py
delete mode 100644 src/mobilerun_sdk/types/credential_list_params.py
delete mode 100644 src/mobilerun_sdk/types/credential_list_response.py
delete mode 100644 src/mobilerun_sdk/types/credentials/package_create_params.py
delete mode 100644 src/mobilerun_sdk/types/credentials/package_create_response.py
delete mode 100644 src/mobilerun_sdk/types/credentials/package_list_response.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credential.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credential_create_params.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credential_create_response.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credential_delete_response.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credential_retrieve_response.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_create_params.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_create_response.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_delete_response.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_update_params.py
delete mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_update_response.py
create mode 100644 src/mobilerun_sdk/types/proxy_config_param.py
delete mode 100644 src/mobilerun_sdk/types/proxy_create_params.py
delete mode 100644 src/mobilerun_sdk/types/proxy_create_response.py
delete mode 100644 src/mobilerun_sdk/types/proxy_delete_response.py
delete mode 100644 src/mobilerun_sdk/types/proxy_list_params.py
delete mode 100644 src/mobilerun_sdk/types/proxy_list_response.py
delete mode 100644 src/mobilerun_sdk/types/proxy_retrieve_response.py
delete mode 100644 src/mobilerun_sdk/types/proxy_update_params.py
delete mode 100644 src/mobilerun_sdk/types/proxy_update_response.py
delete mode 100644 src/mobilerun_sdk/types/shared/pagination.py
delete mode 100644 tests/api_resources/credentials/__init__.py
delete mode 100644 tests/api_resources/credentials/packages/__init__.py
delete mode 100644 tests/api_resources/credentials/packages/credentials/__init__.py
delete mode 100644 tests/api_resources/credentials/packages/credentials/test_fields.py
delete mode 100644 tests/api_resources/credentials/packages/test_credentials.py
delete mode 100644 tests/api_resources/credentials/test_packages.py
delete mode 100644 tests/api_resources/test_apps.py
delete mode 100644 tests/api_resources/test_credentials.py
diff --git a/.stats.yml b/.stats.yml
index 6616e99..6e46968 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 107
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-506128e71e04bea5ce31fd879d4c0ac5a313fc39cf9f39acd1cbb3cee95f74ab.yml
-openapi_spec_hash: b45c764022d18add79f0516691749fa8
+configured_endpoints: 86
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-423b2f04c14fefe08d8c773dc2a025e7775f5ef947a2ba1d8eebbf008106c9fc.yml
+openapi_spec_hash: 7581f9f0e4fc01bad5ca519628671bab
config_hash: 86398ea1292189c25296aefb64d3137d
diff --git a/api.md b/api.md
index 4b2c442..1dd0ca2 100644
--- a/api.md
+++ b/api.md
@@ -7,7 +7,6 @@ from mobilerun_sdk.types import (
DeviceSpec,
Location,
Meta,
- Pagination,
PaginationMeta,
PermissionSet,
Socks5,
@@ -26,32 +25,6 @@ Methods:
- client.agents.list() -> AgentListResponse
-# Apps
-
-Types:
-
-```python
-from mobilerun_sdk.types import (
- AppRetrieveResponse,
- AppListResponse,
- AppDeleteResponse,
- AppConfirmUploadResponse,
- AppCreateSignedUploadURLResponse,
- AppListVersionsResponse,
- AppMarkFailedResponse,
-)
-```
-
-Methods:
-
-- client.apps.retrieve(id) -> AppRetrieveResponse
-- client.apps.list(\*\*params) -> AppListResponse
-- client.apps.delete(id) -> AppDeleteResponse
-- client.apps.confirm_upload(id) -> AppConfirmUploadResponse
-- client.apps.create_signed_upload_url(\*\*params) -> AppCreateSignedUploadURLResponse
-- client.apps.list_versions(id) -> AppListVersionsResponse
-- client.apps.mark_failed(id) -> AppMarkFailedResponse
-
# Carriers
Types:
@@ -76,68 +49,6 @@ Methods:
- client.carriers.delete(carrier_id) -> CarrierDeleteResponse
- client.carriers.lookup(\*\*params) -> CarrierLookupResponse
-# Credentials
-
-Types:
-
-```python
-from mobilerun_sdk.types import CredentialListResponse
-```
-
-Methods:
-
-- client.credentials.list(\*\*params) -> CredentialListResponse
-
-## Packages
-
-Types:
-
-```python
-from mobilerun_sdk.types.credentials import PackageCreateResponse, PackageListResponse
-```
-
-Methods:
-
-- client.credentials.packages.create(\*\*params) -> PackageCreateResponse
-- client.credentials.packages.list(package_name) -> PackageListResponse
-
-### Credentials
-
-Types:
-
-```python
-from mobilerun_sdk.types.credentials.packages import (
- Credential,
- CredentialCreateResponse,
- CredentialRetrieveResponse,
- CredentialDeleteResponse,
-)
-```
-
-Methods:
-
-- client.credentials.packages.credentials.create(package_name, \*\*params) -> CredentialCreateResponse
-- client.credentials.packages.credentials.retrieve(credential_name, \*, package_name) -> CredentialRetrieveResponse
-- client.credentials.packages.credentials.delete(credential_name, \*, package_name) -> CredentialDeleteResponse
-
-#### Fields
-
-Types:
-
-```python
-from mobilerun_sdk.types.credentials.packages.credentials import (
- FieldCreateResponse,
- FieldUpdateResponse,
- FieldDeleteResponse,
-)
-```
-
-Methods:
-
-- client.credentials.packages.credentials.fields.create(credential_name, \*, package_name, \*\*params) -> FieldCreateResponse
-- client.credentials.packages.credentials.fields.update(field_type, \*, package_name, credential_name, \*\*params) -> FieldUpdateResponse
-- client.credentials.packages.credentials.fields.delete(field_type, \*, package_name, credential_name) -> FieldDeleteResponse
-
# Devices
Types:
@@ -407,24 +318,11 @@ Methods:
Types:
```python
-from mobilerun_sdk.types import (
- ProxyConfig,
- ProxyCreateResponse,
- ProxyRetrieveResponse,
- ProxyUpdateResponse,
- ProxyListResponse,
- ProxyDeleteResponse,
- ProxyLookupResponse,
-)
+from mobilerun_sdk.types import ProxyConfig, ProxyLookupResponse
```
Methods:
-- client.proxies.create(\*\*params) -> ProxyCreateResponse
-- client.proxies.retrieve(proxy_id) -> ProxyRetrieveResponse
-- client.proxies.update(proxy_id, \*\*params) -> ProxyUpdateResponse
-- client.proxies.list(\*\*params) -> ProxyListResponse
-- client.proxies.delete(proxy_id) -> ProxyDeleteResponse
- client.proxies.lookup(\*\*params) -> ProxyLookupResponse
# Tasks
diff --git a/src/mobilerun_sdk/_client.py b/src/mobilerun_sdk/_client.py
index 28b10f0..3816717 100644
--- a/src/mobilerun_sdk/_client.py
+++ b/src/mobilerun_sdk/_client.py
@@ -36,8 +36,7 @@
)
if TYPE_CHECKING:
- from .resources import apps, hooks, tasks, agents, models, devices, proxies, carriers, profiles, credentials
- from .resources.apps import AppsResource, AsyncAppsResource
+ from .resources import hooks, tasks, agents, models, devices, proxies, carriers, profiles
from .resources.hooks import HooksResource, AsyncHooksResource
from .resources.agents import AgentsResource, AsyncAgentsResource
from .resources.models import ModelsResource, AsyncModelsResource
@@ -46,7 +45,6 @@
from .resources.profiles import ProfilesResource, AsyncProfilesResource
from .resources.tasks.tasks import TasksResource, AsyncTasksResource
from .resources.devices.devices import DevicesResource, AsyncDevicesResource
- from .resources.credentials.credentials import CredentialsResource, AsyncCredentialsResource
__all__ = [
"Timeout",
@@ -127,27 +125,12 @@ def agents(self) -> AgentsResource:
return AgentsResource(self)
- @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)
-
@cached_property
def devices(self) -> DevicesResource:
from .resources.devices import DevicesResource
@@ -156,13 +139,13 @@ def devices(self) -> DevicesResource:
@cached_property
def hooks(self) -> HooksResource:
+ """Webhooks API"""
from .resources.hooks import HooksResource
return HooksResource(self)
@cached_property
def models(self) -> ModelsResource:
- """LLM Models"""
from .resources.models import ModelsResource
return ModelsResource(self)
@@ -175,7 +158,6 @@ def profiles(self) -> ProfilesResource:
@cached_property
def proxies(self) -> ProxiesResource:
- """Network Proxies"""
from .resources.proxies import ProxiesResource
return ProxiesResource(self)
@@ -378,27 +360,12 @@ def agents(self) -> AsyncAgentsResource:
return AsyncAgentsResource(self)
- @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)
-
@cached_property
def devices(self) -> AsyncDevicesResource:
from .resources.devices import AsyncDevicesResource
@@ -407,13 +374,13 @@ def devices(self) -> AsyncDevicesResource:
@cached_property
def hooks(self) -> AsyncHooksResource:
+ """Webhooks API"""
from .resources.hooks import AsyncHooksResource
return AsyncHooksResource(self)
@cached_property
def models(self) -> AsyncModelsResource:
- """LLM Models"""
from .resources.models import AsyncModelsResource
return AsyncModelsResource(self)
@@ -426,7 +393,6 @@ def profiles(self) -> AsyncProfilesResource:
@cached_property
def proxies(self) -> AsyncProxiesResource:
- """Network Proxies"""
from .resources.proxies import AsyncProxiesResource
return AsyncProxiesResource(self)
@@ -575,27 +541,12 @@ def agents(self) -> agents.AgentsResourceWithRawResponse:
return AgentsResourceWithRawResponse(self._client.agents)
- @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)
-
@cached_property
def devices(self) -> devices.DevicesResourceWithRawResponse:
from .resources.devices import DevicesResourceWithRawResponse
@@ -604,13 +555,13 @@ def devices(self) -> devices.DevicesResourceWithRawResponse:
@cached_property
def hooks(self) -> hooks.HooksResourceWithRawResponse:
+ """Webhooks API"""
from .resources.hooks import HooksResourceWithRawResponse
return HooksResourceWithRawResponse(self._client.hooks)
@cached_property
def models(self) -> models.ModelsResourceWithRawResponse:
- """LLM Models"""
from .resources.models import ModelsResourceWithRawResponse
return ModelsResourceWithRawResponse(self._client.models)
@@ -623,7 +574,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)
@@ -649,27 +599,12 @@ def agents(self) -> agents.AsyncAgentsResourceWithRawResponse:
return AsyncAgentsResourceWithRawResponse(self._client.agents)
- @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)
-
@cached_property
def devices(self) -> devices.AsyncDevicesResourceWithRawResponse:
from .resources.devices import AsyncDevicesResourceWithRawResponse
@@ -678,13 +613,13 @@ def devices(self) -> devices.AsyncDevicesResourceWithRawResponse:
@cached_property
def hooks(self) -> hooks.AsyncHooksResourceWithRawResponse:
+ """Webhooks API"""
from .resources.hooks import AsyncHooksResourceWithRawResponse
return AsyncHooksResourceWithRawResponse(self._client.hooks)
@cached_property
def models(self) -> models.AsyncModelsResourceWithRawResponse:
- """LLM Models"""
from .resources.models import AsyncModelsResourceWithRawResponse
return AsyncModelsResourceWithRawResponse(self._client.models)
@@ -697,7 +632,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)
@@ -723,27 +657,12 @@ def agents(self) -> agents.AgentsResourceWithStreamingResponse:
return AgentsResourceWithStreamingResponse(self._client.agents)
- @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)
-
@cached_property
def devices(self) -> devices.DevicesResourceWithStreamingResponse:
from .resources.devices import DevicesResourceWithStreamingResponse
@@ -752,13 +671,13 @@ def devices(self) -> devices.DevicesResourceWithStreamingResponse:
@cached_property
def hooks(self) -> hooks.HooksResourceWithStreamingResponse:
+ """Webhooks API"""
from .resources.hooks import HooksResourceWithStreamingResponse
return HooksResourceWithStreamingResponse(self._client.hooks)
@cached_property
def models(self) -> models.ModelsResourceWithStreamingResponse:
- """LLM Models"""
from .resources.models import ModelsResourceWithStreamingResponse
return ModelsResourceWithStreamingResponse(self._client.models)
@@ -771,7 +690,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)
@@ -797,27 +715,12 @@ def agents(self) -> agents.AsyncAgentsResourceWithStreamingResponse:
return AsyncAgentsResourceWithStreamingResponse(self._client.agents)
- @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)
-
@cached_property
def devices(self) -> devices.AsyncDevicesResourceWithStreamingResponse:
from .resources.devices import AsyncDevicesResourceWithStreamingResponse
@@ -826,13 +729,13 @@ def devices(self) -> devices.AsyncDevicesResourceWithStreamingResponse:
@cached_property
def hooks(self) -> hooks.AsyncHooksResourceWithStreamingResponse:
+ """Webhooks API"""
from .resources.hooks import AsyncHooksResourceWithStreamingResponse
return AsyncHooksResourceWithStreamingResponse(self._client.hooks)
@cached_property
def models(self) -> models.AsyncModelsResourceWithStreamingResponse:
- """LLM Models"""
from .resources.models import AsyncModelsResourceWithStreamingResponse
return AsyncModelsResourceWithStreamingResponse(self._client.models)
@@ -845,7 +748,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/resources/__init__.py b/src/mobilerun_sdk/resources/__init__.py
index 21f473c..9ebd59d 100644
--- a/src/mobilerun_sdk/resources/__init__.py
+++ b/src/mobilerun_sdk/resources/__init__.py
@@ -1,13 +1,5 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from .apps import (
- AppsResource,
- AsyncAppsResource,
- AppsResourceWithRawResponse,
- AsyncAppsResourceWithRawResponse,
- AppsResourceWithStreamingResponse,
- AsyncAppsResourceWithStreamingResponse,
-)
from .hooks import (
HooksResource,
AsyncHooksResource,
@@ -72,14 +64,6 @@
ProfilesResourceWithStreamingResponse,
AsyncProfilesResourceWithStreamingResponse,
)
-from .credentials import (
- CredentialsResource,
- AsyncCredentialsResource,
- CredentialsResourceWithRawResponse,
- AsyncCredentialsResourceWithRawResponse,
- CredentialsResourceWithStreamingResponse,
- AsyncCredentialsResourceWithStreamingResponse,
-)
__all__ = [
"AgentsResource",
@@ -88,24 +72,12 @@
"AsyncAgentsResourceWithRawResponse",
"AgentsResourceWithStreamingResponse",
"AsyncAgentsResourceWithStreamingResponse",
- "AppsResource",
- "AsyncAppsResource",
- "AppsResourceWithRawResponse",
- "AsyncAppsResourceWithRawResponse",
- "AppsResourceWithStreamingResponse",
- "AsyncAppsResourceWithStreamingResponse",
"CarriersResource",
"AsyncCarriersResource",
"CarriersResourceWithRawResponse",
"AsyncCarriersResourceWithRawResponse",
"CarriersResourceWithStreamingResponse",
"AsyncCarriersResourceWithStreamingResponse",
- "CredentialsResource",
- "AsyncCredentialsResource",
- "CredentialsResourceWithRawResponse",
- "AsyncCredentialsResourceWithRawResponse",
- "CredentialsResourceWithStreamingResponse",
- "AsyncCredentialsResourceWithStreamingResponse",
"DevicesResource",
"AsyncDevicesResource",
"DevicesResourceWithRawResponse",
diff --git a/src/mobilerun_sdk/resources/apps.py b/src/mobilerun_sdk/resources/apps.py
deleted file mode 100644
index 3e2bb8f..0000000
--- a/src/mobilerun_sdk/resources/apps.py
+++ /dev/null
@@ -1,748 +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 app_list_params, app_create_signed_upload_url_params
-from .._types import Body, Omit, Query, Headers, NotGiven, 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.app_list_response import AppListResponse
-from ..types.app_delete_response import AppDeleteResponse
-from ..types.app_retrieve_response import AppRetrieveResponse
-from ..types.app_mark_failed_response import AppMarkFailedResponse
-from ..types.app_list_versions_response import AppListVersionsResponse
-from ..types.app_confirm_upload_response import AppConfirmUploadResponse
-from ..types.app_create_signed_upload_url_response import AppCreateSignedUploadURLResponse
-
-__all__ = ["AppsResource", "AsyncAppsResource"]
-
-
-class AppsResource(SyncAPIResource):
- """App Management"""
-
- @cached_property
- def with_raw_response(self) -> AppsResourceWithRawResponse:
- """
- 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 AppsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AppsResourceWithStreamingResponse:
- """
- 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 AppsResourceWithStreamingResponse(self)
-
- def retrieve(
- self,
- 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,
- ) -> AppRetrieveResponse:
- """
- Retrieves an app by its 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._get(
- path_template("/apps/{id}", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppRetrieveResponse,
- )
-
- def list(
- self,
- *,
- order: Literal["asc", "desc"] | Omit = omit,
- page: int | Omit = omit,
- page_size: int | Omit = omit,
- platform: Literal["all", "android", "ios"] | Omit = omit,
- query: str | Omit = omit,
- sort_by: Literal["createdAt", "name"] | Omit = omit,
- status: Literal["all", "queued", "available", "failed"] | 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,
- ) -> AppListResponse:
- """
- Retrieves a paginated list of apps with filtering and search capabilities
-
- 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(
- "/apps",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "order": order,
- "page": page,
- "page_size": page_size,
- "platform": platform,
- "query": query,
- "sort_by": sort_by,
- "status": status,
- },
- app_list_params.AppListParams,
- ),
- ),
- cast_to=AppListResponse,
- )
-
- def delete(
- self,
- 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,
- ) -> AppDeleteResponse:
- """Deletes an uploaded app by ID.
-
- Removes files from R2 storage and the database
- entry.
-
- 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._delete(
- path_template("/apps/{id}", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppDeleteResponse,
- )
-
- def confirm_upload(
- self,
- 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,
- ) -> AppConfirmUploadResponse:
- """
- Verifies the APK file exists in R2 and sets the app status to available.
-
- 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._post(
- path_template("/apps/{id}/confirm-upload", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppConfirmUploadResponse,
- )
-
- def create_signed_upload_url(
- self,
- *,
- bundle_id: str,
- display_name: str,
- files: Iterable[app_create_signed_upload_url_params.File],
- size_bytes: float,
- version_code: float,
- version_name: str,
- country: str | Omit = omit,
- description: str | Omit = omit,
- developer_name: str | Omit = omit,
- icon_url: str | Omit = omit,
- platform: Literal["android", "ios"] | Omit = omit,
- target_sdk: float | 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,
- ) -> AppCreateSignedUploadURLResponse:
- """
- Creates or updates an app and returns pre-signed Cloudflare R2 upload URLs for
- each file
-
- Args:
- country: Country code for Search Results
-
- 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(
- "/apps/create-signed-upload-url",
- body=maybe_transform(
- {
- "bundle_id": bundle_id,
- "display_name": display_name,
- "files": files,
- "size_bytes": size_bytes,
- "version_code": version_code,
- "version_name": version_name,
- "country": country,
- "description": description,
- "developer_name": developer_name,
- "icon_url": icon_url,
- "platform": platform,
- "target_sdk": target_sdk,
- },
- app_create_signed_upload_url_params.AppCreateSignedUploadURLParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppCreateSignedUploadURLResponse,
- )
-
- def list_versions(
- self,
- 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,
- ) -> AppListVersionsResponse:
- """
- Retrieves all versions of an app visible to the user (own uploads + system
- versions)
-
- 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._get(
- path_template("/apps/{id}/versions", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppListVersionsResponse,
- )
-
- def mark_failed(
- self,
- 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,
- ) -> AppMarkFailedResponse:
- """
- Sets the app status to failed.
-
- 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._post(
- path_template("/apps/{id}/mark-failed", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppMarkFailedResponse,
- )
-
-
-class AsyncAppsResource(AsyncAPIResource):
- """App Management"""
-
- @cached_property
- def with_raw_response(self) -> AsyncAppsResourceWithRawResponse:
- """
- 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 AsyncAppsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncAppsResourceWithStreamingResponse:
- """
- 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 AsyncAppsResourceWithStreamingResponse(self)
-
- async def retrieve(
- self,
- 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,
- ) -> AppRetrieveResponse:
- """
- Retrieves an app by its 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._get(
- path_template("/apps/{id}", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppRetrieveResponse,
- )
-
- async def list(
- self,
- *,
- order: Literal["asc", "desc"] | Omit = omit,
- page: int | Omit = omit,
- page_size: int | Omit = omit,
- platform: Literal["all", "android", "ios"] | Omit = omit,
- query: str | Omit = omit,
- sort_by: Literal["createdAt", "name"] | Omit = omit,
- status: Literal["all", "queued", "available", "failed"] | 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,
- ) -> AppListResponse:
- """
- Retrieves a paginated list of apps with filtering and search capabilities
-
- 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(
- "/apps",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "order": order,
- "page": page,
- "page_size": page_size,
- "platform": platform,
- "query": query,
- "sort_by": sort_by,
- "status": status,
- },
- app_list_params.AppListParams,
- ),
- ),
- cast_to=AppListResponse,
- )
-
- async def delete(
- self,
- 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,
- ) -> AppDeleteResponse:
- """Deletes an uploaded app by ID.
-
- Removes files from R2 storage and the database
- entry.
-
- 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._delete(
- path_template("/apps/{id}", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppDeleteResponse,
- )
-
- async def confirm_upload(
- self,
- 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,
- ) -> AppConfirmUploadResponse:
- """
- Verifies the APK file exists in R2 and sets the app status to available.
-
- 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._post(
- path_template("/apps/{id}/confirm-upload", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppConfirmUploadResponse,
- )
-
- async def create_signed_upload_url(
- self,
- *,
- bundle_id: str,
- display_name: str,
- files: Iterable[app_create_signed_upload_url_params.File],
- size_bytes: float,
- version_code: float,
- version_name: str,
- country: str | Omit = omit,
- description: str | Omit = omit,
- developer_name: str | Omit = omit,
- icon_url: str | Omit = omit,
- platform: Literal["android", "ios"] | Omit = omit,
- target_sdk: float | 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,
- ) -> AppCreateSignedUploadURLResponse:
- """
- Creates or updates an app and returns pre-signed Cloudflare R2 upload URLs for
- each file
-
- Args:
- country: Country code for Search Results
-
- 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(
- "/apps/create-signed-upload-url",
- body=await async_maybe_transform(
- {
- "bundle_id": bundle_id,
- "display_name": display_name,
- "files": files,
- "size_bytes": size_bytes,
- "version_code": version_code,
- "version_name": version_name,
- "country": country,
- "description": description,
- "developer_name": developer_name,
- "icon_url": icon_url,
- "platform": platform,
- "target_sdk": target_sdk,
- },
- app_create_signed_upload_url_params.AppCreateSignedUploadURLParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppCreateSignedUploadURLResponse,
- )
-
- async def list_versions(
- self,
- 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,
- ) -> AppListVersionsResponse:
- """
- Retrieves all versions of an app visible to the user (own uploads + system
- versions)
-
- 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._get(
- path_template("/apps/{id}/versions", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppListVersionsResponse,
- )
-
- async def mark_failed(
- self,
- 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,
- ) -> AppMarkFailedResponse:
- """
- Sets the app status to failed.
-
- 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 id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._post(
- path_template("/apps/{id}/mark-failed", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AppMarkFailedResponse,
- )
-
-
-class AppsResourceWithRawResponse:
- def __init__(self, apps: AppsResource) -> None:
- self._apps = apps
-
- self.retrieve = to_raw_response_wrapper(
- apps.retrieve,
- )
- self.list = to_raw_response_wrapper(
- apps.list,
- )
- self.delete = to_raw_response_wrapper(
- apps.delete,
- )
- self.confirm_upload = to_raw_response_wrapper(
- apps.confirm_upload,
- )
- self.create_signed_upload_url = to_raw_response_wrapper(
- apps.create_signed_upload_url,
- )
- self.list_versions = to_raw_response_wrapper(
- apps.list_versions,
- )
- self.mark_failed = to_raw_response_wrapper(
- apps.mark_failed,
- )
-
-
-class AsyncAppsResourceWithRawResponse:
- def __init__(self, apps: AsyncAppsResource) -> None:
- self._apps = apps
-
- self.retrieve = async_to_raw_response_wrapper(
- apps.retrieve,
- )
- self.list = async_to_raw_response_wrapper(
- apps.list,
- )
- self.delete = async_to_raw_response_wrapper(
- apps.delete,
- )
- self.confirm_upload = async_to_raw_response_wrapper(
- apps.confirm_upload,
- )
- self.create_signed_upload_url = async_to_raw_response_wrapper(
- apps.create_signed_upload_url,
- )
- self.list_versions = async_to_raw_response_wrapper(
- apps.list_versions,
- )
- self.mark_failed = async_to_raw_response_wrapper(
- apps.mark_failed,
- )
-
-
-class AppsResourceWithStreamingResponse:
- def __init__(self, apps: AppsResource) -> None:
- self._apps = apps
-
- self.retrieve = to_streamed_response_wrapper(
- apps.retrieve,
- )
- self.list = to_streamed_response_wrapper(
- apps.list,
- )
- self.delete = to_streamed_response_wrapper(
- apps.delete,
- )
- self.confirm_upload = to_streamed_response_wrapper(
- apps.confirm_upload,
- )
- self.create_signed_upload_url = to_streamed_response_wrapper(
- apps.create_signed_upload_url,
- )
- self.list_versions = to_streamed_response_wrapper(
- apps.list_versions,
- )
- self.mark_failed = to_streamed_response_wrapper(
- apps.mark_failed,
- )
-
-
-class AsyncAppsResourceWithStreamingResponse:
- def __init__(self, apps: AsyncAppsResource) -> None:
- self._apps = apps
-
- self.retrieve = async_to_streamed_response_wrapper(
- apps.retrieve,
- )
- self.list = async_to_streamed_response_wrapper(
- apps.list,
- )
- self.delete = async_to_streamed_response_wrapper(
- apps.delete,
- )
- self.confirm_upload = async_to_streamed_response_wrapper(
- apps.confirm_upload,
- )
- self.create_signed_upload_url = async_to_streamed_response_wrapper(
- apps.create_signed_upload_url,
- )
- self.list_versions = async_to_streamed_response_wrapper(
- apps.list_versions,
- )
- self.mark_failed = async_to_streamed_response_wrapper(
- apps.mark_failed,
- )
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/credentials/__init__.py b/src/mobilerun_sdk/resources/credentials/__init__.py
deleted file mode 100644
index 2ab7903..0000000
--- a/src/mobilerun_sdk/resources/credentials/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .packages import (
- PackagesResource,
- AsyncPackagesResource,
- PackagesResourceWithRawResponse,
- AsyncPackagesResourceWithRawResponse,
- PackagesResourceWithStreamingResponse,
- AsyncPackagesResourceWithStreamingResponse,
-)
-from .credentials import (
- CredentialsResource,
- AsyncCredentialsResource,
- CredentialsResourceWithRawResponse,
- AsyncCredentialsResourceWithRawResponse,
- CredentialsResourceWithStreamingResponse,
- AsyncCredentialsResourceWithStreamingResponse,
-)
-
-__all__ = [
- "PackagesResource",
- "AsyncPackagesResource",
- "PackagesResourceWithRawResponse",
- "AsyncPackagesResourceWithRawResponse",
- "PackagesResourceWithStreamingResponse",
- "AsyncPackagesResourceWithStreamingResponse",
- "CredentialsResource",
- "AsyncCredentialsResource",
- "CredentialsResourceWithRawResponse",
- "AsyncCredentialsResourceWithRawResponse",
- "CredentialsResourceWithStreamingResponse",
- "AsyncCredentialsResourceWithStreamingResponse",
-]
diff --git a/src/mobilerun_sdk/resources/credentials/credentials.py b/src/mobilerun_sdk/resources/credentials/credentials.py
deleted file mode 100644
index 9276d9f..0000000
--- a/src/mobilerun_sdk/resources/credentials/credentials.py
+++ /dev/null
@@ -1,225 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ...types import credential_list_params
-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 .packages.packages import (
- PackagesResource,
- AsyncPackagesResource,
- PackagesResourceWithRawResponse,
- AsyncPackagesResourceWithRawResponse,
- PackagesResourceWithStreamingResponse,
- AsyncPackagesResourceWithStreamingResponse,
-)
-from ...types.credential_list_response import CredentialListResponse
-
-__all__ = ["CredentialsResource", "AsyncCredentialsResource"]
-
-
-class CredentialsResource(SyncAPIResource):
- """Vault & Secrets"""
-
- @cached_property
- def packages(self) -> PackagesResource:
- """Vault & Secrets"""
- return PackagesResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> CredentialsResourceWithRawResponse:
- """
- 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 CredentialsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> CredentialsResourceWithStreamingResponse:
- """
- 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 CredentialsResourceWithStreamingResponse(self)
-
- def list(
- self,
- *,
- 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,
- ) -> CredentialListResponse:
- """
- List all credentials for the authenticated 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
- """
- return self._get(
- "/credentials",
- 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,
- },
- credential_list_params.CredentialListParams,
- ),
- ),
- cast_to=CredentialListResponse,
- )
-
-
-class AsyncCredentialsResource(AsyncAPIResource):
- """Vault & Secrets"""
-
- @cached_property
- def packages(self) -> AsyncPackagesResource:
- """Vault & Secrets"""
- return AsyncPackagesResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> AsyncCredentialsResourceWithRawResponse:
- """
- 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 AsyncCredentialsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncCredentialsResourceWithStreamingResponse:
- """
- 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 AsyncCredentialsResourceWithStreamingResponse(self)
-
- async def list(
- self,
- *,
- 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,
- ) -> CredentialListResponse:
- """
- List all credentials for the authenticated 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
- """
- return await self._get(
- "/credentials",
- 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,
- },
- credential_list_params.CredentialListParams,
- ),
- ),
- cast_to=CredentialListResponse,
- )
-
-
-class CredentialsResourceWithRawResponse:
- def __init__(self, credentials: CredentialsResource) -> None:
- self._credentials = credentials
-
- self.list = to_raw_response_wrapper(
- credentials.list,
- )
-
- @cached_property
- def packages(self) -> PackagesResourceWithRawResponse:
- """Vault & Secrets"""
- return PackagesResourceWithRawResponse(self._credentials.packages)
-
-
-class AsyncCredentialsResourceWithRawResponse:
- def __init__(self, credentials: AsyncCredentialsResource) -> None:
- self._credentials = credentials
-
- self.list = async_to_raw_response_wrapper(
- credentials.list,
- )
-
- @cached_property
- def packages(self) -> AsyncPackagesResourceWithRawResponse:
- """Vault & Secrets"""
- return AsyncPackagesResourceWithRawResponse(self._credentials.packages)
-
-
-class CredentialsResourceWithStreamingResponse:
- def __init__(self, credentials: CredentialsResource) -> None:
- self._credentials = credentials
-
- self.list = to_streamed_response_wrapper(
- credentials.list,
- )
-
- @cached_property
- def packages(self) -> PackagesResourceWithStreamingResponse:
- """Vault & Secrets"""
- return PackagesResourceWithStreamingResponse(self._credentials.packages)
-
-
-class AsyncCredentialsResourceWithStreamingResponse:
- def __init__(self, credentials: AsyncCredentialsResource) -> None:
- self._credentials = credentials
-
- self.list = async_to_streamed_response_wrapper(
- credentials.list,
- )
-
- @cached_property
- def packages(self) -> AsyncPackagesResourceWithStreamingResponse:
- """Vault & Secrets"""
- return AsyncPackagesResourceWithStreamingResponse(self._credentials.packages)
diff --git a/src/mobilerun_sdk/resources/credentials/packages/__init__.py b/src/mobilerun_sdk/resources/credentials/packages/__init__.py
deleted file mode 100644
index 179ec4a..0000000
--- a/src/mobilerun_sdk/resources/credentials/packages/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .packages import (
- PackagesResource,
- AsyncPackagesResource,
- PackagesResourceWithRawResponse,
- AsyncPackagesResourceWithRawResponse,
- PackagesResourceWithStreamingResponse,
- AsyncPackagesResourceWithStreamingResponse,
-)
-from .credentials import (
- CredentialsResource,
- AsyncCredentialsResource,
- CredentialsResourceWithRawResponse,
- AsyncCredentialsResourceWithRawResponse,
- CredentialsResourceWithStreamingResponse,
- AsyncCredentialsResourceWithStreamingResponse,
-)
-
-__all__ = [
- "CredentialsResource",
- "AsyncCredentialsResource",
- "CredentialsResourceWithRawResponse",
- "AsyncCredentialsResourceWithRawResponse",
- "CredentialsResourceWithStreamingResponse",
- "AsyncCredentialsResourceWithStreamingResponse",
- "PackagesResource",
- "AsyncPackagesResource",
- "PackagesResourceWithRawResponse",
- "AsyncPackagesResourceWithRawResponse",
- "PackagesResourceWithStreamingResponse",
- "AsyncPackagesResourceWithStreamingResponse",
-]
diff --git a/src/mobilerun_sdk/resources/credentials/packages/credentials/__init__.py b/src/mobilerun_sdk/resources/credentials/packages/credentials/__init__.py
deleted file mode 100644
index bfa68f3..0000000
--- a/src/mobilerun_sdk/resources/credentials/packages/credentials/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .fields import (
- FieldsResource,
- AsyncFieldsResource,
- FieldsResourceWithRawResponse,
- AsyncFieldsResourceWithRawResponse,
- FieldsResourceWithStreamingResponse,
- AsyncFieldsResourceWithStreamingResponse,
-)
-from .credentials import (
- CredentialsResource,
- AsyncCredentialsResource,
- CredentialsResourceWithRawResponse,
- AsyncCredentialsResourceWithRawResponse,
- CredentialsResourceWithStreamingResponse,
- AsyncCredentialsResourceWithStreamingResponse,
-)
-
-__all__ = [
- "FieldsResource",
- "AsyncFieldsResource",
- "FieldsResourceWithRawResponse",
- "AsyncFieldsResourceWithRawResponse",
- "FieldsResourceWithStreamingResponse",
- "AsyncFieldsResourceWithStreamingResponse",
- "CredentialsResource",
- "AsyncCredentialsResource",
- "CredentialsResourceWithRawResponse",
- "AsyncCredentialsResourceWithRawResponse",
- "CredentialsResourceWithStreamingResponse",
- "AsyncCredentialsResourceWithStreamingResponse",
-]
diff --git a/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py b/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py
deleted file mode 100644
index df12c15..0000000
--- a/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py
+++ /dev/null
@@ -1,413 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Iterable
-
-import httpx
-
-from .fields import (
- FieldsResource,
- AsyncFieldsResource,
- FieldsResourceWithRawResponse,
- AsyncFieldsResourceWithRawResponse,
- FieldsResourceWithStreamingResponse,
- AsyncFieldsResourceWithStreamingResponse,
-)
-from ....._types import Body, Query, Headers, NotGiven, 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.credentials.packages import credential_create_params
-from .....types.credentials.packages.credential_create_response import CredentialCreateResponse
-from .....types.credentials.packages.credential_delete_response import CredentialDeleteResponse
-from .....types.credentials.packages.credential_retrieve_response import CredentialRetrieveResponse
-
-__all__ = ["CredentialsResource", "AsyncCredentialsResource"]
-
-
-class CredentialsResource(SyncAPIResource):
- """Vault & Secrets"""
-
- @cached_property
- def fields(self) -> FieldsResource:
- """Vault & Secrets"""
- return FieldsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> CredentialsResourceWithRawResponse:
- """
- 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 CredentialsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> CredentialsResourceWithStreamingResponse:
- """
- 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 CredentialsResourceWithStreamingResponse(self)
-
- def create(
- self,
- package_name: str,
- *,
- credential_name: str,
- fields: Iterable[credential_create_params.Field],
- # 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,
- ) -> CredentialCreateResponse:
- """
- Create a credential with fields for a package
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- return self._post(
- path_template("/credentials/packages/{package_name}", package_name=package_name),
- body=maybe_transform(
- {
- "credential_name": credential_name,
- "fields": fields,
- },
- credential_create_params.CredentialCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=CredentialCreateResponse,
- )
-
- def retrieve(
- self,
- credential_name: str,
- *,
- package_name: 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,
- ) -> CredentialRetrieveResponse:
- """
- Get a specific credential with its fields
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- return self._get(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}",
- package_name=package_name,
- credential_name=credential_name,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=CredentialRetrieveResponse,
- )
-
- def delete(
- self,
- credential_name: str,
- *,
- package_name: 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,
- ) -> CredentialDeleteResponse:
- """
- Delete a credential and all its fields
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- return self._delete(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}",
- package_name=package_name,
- credential_name=credential_name,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=CredentialDeleteResponse,
- )
-
-
-class AsyncCredentialsResource(AsyncAPIResource):
- """Vault & Secrets"""
-
- @cached_property
- def fields(self) -> AsyncFieldsResource:
- """Vault & Secrets"""
- return AsyncFieldsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> AsyncCredentialsResourceWithRawResponse:
- """
- 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 AsyncCredentialsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncCredentialsResourceWithStreamingResponse:
- """
- 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 AsyncCredentialsResourceWithStreamingResponse(self)
-
- async def create(
- self,
- package_name: str,
- *,
- credential_name: str,
- fields: Iterable[credential_create_params.Field],
- # 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,
- ) -> CredentialCreateResponse:
- """
- Create a credential with fields for a package
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- return await self._post(
- path_template("/credentials/packages/{package_name}", package_name=package_name),
- body=await async_maybe_transform(
- {
- "credential_name": credential_name,
- "fields": fields,
- },
- credential_create_params.CredentialCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=CredentialCreateResponse,
- )
-
- async def retrieve(
- self,
- credential_name: str,
- *,
- package_name: 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,
- ) -> CredentialRetrieveResponse:
- """
- Get a specific credential with its fields
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- return await self._get(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}",
- package_name=package_name,
- credential_name=credential_name,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=CredentialRetrieveResponse,
- )
-
- async def delete(
- self,
- credential_name: str,
- *,
- package_name: 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,
- ) -> CredentialDeleteResponse:
- """
- Delete a credential and all its fields
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- return await self._delete(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}",
- package_name=package_name,
- credential_name=credential_name,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=CredentialDeleteResponse,
- )
-
-
-class CredentialsResourceWithRawResponse:
- def __init__(self, credentials: CredentialsResource) -> None:
- self._credentials = credentials
-
- self.create = to_raw_response_wrapper(
- credentials.create,
- )
- self.retrieve = to_raw_response_wrapper(
- credentials.retrieve,
- )
- self.delete = to_raw_response_wrapper(
- credentials.delete,
- )
-
- @cached_property
- def fields(self) -> FieldsResourceWithRawResponse:
- """Vault & Secrets"""
- return FieldsResourceWithRawResponse(self._credentials.fields)
-
-
-class AsyncCredentialsResourceWithRawResponse:
- def __init__(self, credentials: AsyncCredentialsResource) -> None:
- self._credentials = credentials
-
- self.create = async_to_raw_response_wrapper(
- credentials.create,
- )
- self.retrieve = async_to_raw_response_wrapper(
- credentials.retrieve,
- )
- self.delete = async_to_raw_response_wrapper(
- credentials.delete,
- )
-
- @cached_property
- def fields(self) -> AsyncFieldsResourceWithRawResponse:
- """Vault & Secrets"""
- return AsyncFieldsResourceWithRawResponse(self._credentials.fields)
-
-
-class CredentialsResourceWithStreamingResponse:
- def __init__(self, credentials: CredentialsResource) -> None:
- self._credentials = credentials
-
- self.create = to_streamed_response_wrapper(
- credentials.create,
- )
- self.retrieve = to_streamed_response_wrapper(
- credentials.retrieve,
- )
- self.delete = to_streamed_response_wrapper(
- credentials.delete,
- )
-
- @cached_property
- def fields(self) -> FieldsResourceWithStreamingResponse:
- """Vault & Secrets"""
- return FieldsResourceWithStreamingResponse(self._credentials.fields)
-
-
-class AsyncCredentialsResourceWithStreamingResponse:
- def __init__(self, credentials: AsyncCredentialsResource) -> None:
- self._credentials = credentials
-
- self.create = async_to_streamed_response_wrapper(
- credentials.create,
- )
- self.retrieve = async_to_streamed_response_wrapper(
- credentials.retrieve,
- )
- self.delete = async_to_streamed_response_wrapper(
- credentials.delete,
- )
-
- @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
deleted file mode 100644
index 38ebfd9..0000000
--- a/src/mobilerun_sdk/resources/credentials/packages/credentials/fields.py
+++ /dev/null
@@ -1,421 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal
-
-import httpx
-
-from ....._types import Body, Query, Headers, NotGiven, 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.credentials.packages.credentials import field_create_params, field_update_params
-from .....types.credentials.packages.credentials.field_create_response import FieldCreateResponse
-from .....types.credentials.packages.credentials.field_delete_response import FieldDeleteResponse
-from .....types.credentials.packages.credentials.field_update_response import FieldUpdateResponse
-
-__all__ = ["FieldsResource", "AsyncFieldsResource"]
-
-
-class FieldsResource(SyncAPIResource):
- """Vault & Secrets"""
-
- @cached_property
- def with_raw_response(self) -> FieldsResourceWithRawResponse:
- """
- 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 FieldsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> FieldsResourceWithStreamingResponse:
- """
- 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 FieldsResourceWithStreamingResponse(self)
-
- def create(
- self,
- credential_name: str,
- *,
- package_name: str,
- field_type: Literal[
- "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
- ],
- value: 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,
- ) -> FieldCreateResponse:
- """
- Add a new field to an existing credential
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- return self._post(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}/fields",
- package_name=package_name,
- credential_name=credential_name,
- ),
- body=maybe_transform(
- {
- "field_type": field_type,
- "value": value,
- },
- field_create_params.FieldCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=FieldCreateResponse,
- )
-
- def update(
- self,
- field_type: Literal[
- "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
- ],
- *,
- package_name: str,
- credential_name: str,
- value: 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,
- ) -> FieldUpdateResponse:
- """
- Update the value of a credential field
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- if not field_type:
- raise ValueError(f"Expected a non-empty value for `field_type` but received {field_type!r}")
- return self._patch(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}/fields/{field_type}",
- package_name=package_name,
- credential_name=credential_name,
- field_type=field_type,
- ),
- body=maybe_transform({"value": value}, field_update_params.FieldUpdateParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=FieldUpdateResponse,
- )
-
- def delete(
- self,
- field_type: Literal[
- "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
- ],
- *,
- package_name: str,
- credential_name: 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,
- ) -> FieldDeleteResponse:
- """
- Delete a field from a credential
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- if not field_type:
- raise ValueError(f"Expected a non-empty value for `field_type` but received {field_type!r}")
- return self._delete(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}/fields/{field_type}",
- package_name=package_name,
- credential_name=credential_name,
- field_type=field_type,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=FieldDeleteResponse,
- )
-
-
-class AsyncFieldsResource(AsyncAPIResource):
- """Vault & Secrets"""
-
- @cached_property
- def with_raw_response(self) -> AsyncFieldsResourceWithRawResponse:
- """
- 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 AsyncFieldsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncFieldsResourceWithStreamingResponse:
- """
- 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 AsyncFieldsResourceWithStreamingResponse(self)
-
- async def create(
- self,
- credential_name: str,
- *,
- package_name: str,
- field_type: Literal[
- "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
- ],
- value: 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,
- ) -> FieldCreateResponse:
- """
- Add a new field to an existing credential
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- return await self._post(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}/fields",
- package_name=package_name,
- credential_name=credential_name,
- ),
- body=await async_maybe_transform(
- {
- "field_type": field_type,
- "value": value,
- },
- field_create_params.FieldCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=FieldCreateResponse,
- )
-
- async def update(
- self,
- field_type: Literal[
- "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
- ],
- *,
- package_name: str,
- credential_name: str,
- value: 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,
- ) -> FieldUpdateResponse:
- """
- Update the value of a credential field
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- if not field_type:
- raise ValueError(f"Expected a non-empty value for `field_type` but received {field_type!r}")
- return await self._patch(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}/fields/{field_type}",
- package_name=package_name,
- credential_name=credential_name,
- field_type=field_type,
- ),
- body=await async_maybe_transform({"value": value}, field_update_params.FieldUpdateParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=FieldUpdateResponse,
- )
-
- async def delete(
- self,
- field_type: Literal[
- "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
- ],
- *,
- package_name: str,
- credential_name: 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,
- ) -> FieldDeleteResponse:
- """
- Delete a field from a credential
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- if not credential_name:
- raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
- if not field_type:
- raise ValueError(f"Expected a non-empty value for `field_type` but received {field_type!r}")
- return await self._delete(
- path_template(
- "/credentials/packages/{package_name}/credentials/{credential_name}/fields/{field_type}",
- package_name=package_name,
- credential_name=credential_name,
- field_type=field_type,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=FieldDeleteResponse,
- )
-
-
-class FieldsResourceWithRawResponse:
- def __init__(self, fields: FieldsResource) -> None:
- self._fields = fields
-
- self.create = to_raw_response_wrapper(
- fields.create,
- )
- self.update = to_raw_response_wrapper(
- fields.update,
- )
- self.delete = to_raw_response_wrapper(
- fields.delete,
- )
-
-
-class AsyncFieldsResourceWithRawResponse:
- def __init__(self, fields: AsyncFieldsResource) -> None:
- self._fields = fields
-
- self.create = async_to_raw_response_wrapper(
- fields.create,
- )
- self.update = async_to_raw_response_wrapper(
- fields.update,
- )
- self.delete = async_to_raw_response_wrapper(
- fields.delete,
- )
-
-
-class FieldsResourceWithStreamingResponse:
- def __init__(self, fields: FieldsResource) -> None:
- self._fields = fields
-
- self.create = to_streamed_response_wrapper(
- fields.create,
- )
- self.update = to_streamed_response_wrapper(
- fields.update,
- )
- self.delete = to_streamed_response_wrapper(
- fields.delete,
- )
-
-
-class AsyncFieldsResourceWithStreamingResponse:
- def __init__(self, fields: AsyncFieldsResource) -> None:
- self._fields = fields
-
- self.create = async_to_streamed_response_wrapper(
- fields.create,
- )
- self.update = async_to_streamed_response_wrapper(
- fields.update,
- )
- self.delete = async_to_streamed_response_wrapper(
- fields.delete,
- )
diff --git a/src/mobilerun_sdk/resources/credentials/packages/packages.py b/src/mobilerun_sdk/resources/credentials/packages/packages.py
deleted file mode 100644
index 135ccdd..0000000
--- a/src/mobilerun_sdk/resources/credentials/packages/packages.py
+++ /dev/null
@@ -1,284 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ...._types import Body, Query, Headers, NotGiven, 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.credentials import package_create_params
-from .credentials.credentials import (
- CredentialsResource,
- AsyncCredentialsResource,
- CredentialsResourceWithRawResponse,
- AsyncCredentialsResourceWithRawResponse,
- CredentialsResourceWithStreamingResponse,
- AsyncCredentialsResourceWithStreamingResponse,
-)
-from ....types.credentials.package_list_response import PackageListResponse
-from ....types.credentials.package_create_response import PackageCreateResponse
-
-__all__ = ["PackagesResource", "AsyncPackagesResource"]
-
-
-class PackagesResource(SyncAPIResource):
- """Vault & Secrets"""
-
- @cached_property
- def credentials(self) -> CredentialsResource:
- """Vault & Secrets"""
- return CredentialsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> PackagesResourceWithRawResponse:
- """
- 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 PackagesResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> PackagesResourceWithStreamingResponse:
- """
- 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 PackagesResourceWithStreamingResponse(self)
-
- def create(
- self,
- *,
- package_name: 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,
- ) -> PackageCreateResponse:
- """
- Initialize a new package/app
-
- 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(
- "/credentials/packages",
- body=maybe_transform({"package_name": package_name}, package_create_params.PackageCreateParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PackageCreateResponse,
- )
-
- def list(
- self,
- package_name: 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,
- ) -> PackageListResponse:
- """
- List credentials for a specific package
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- return self._get(
- path_template("/credentials/packages/{package_name}", package_name=package_name),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PackageListResponse,
- )
-
-
-class AsyncPackagesResource(AsyncAPIResource):
- """Vault & Secrets"""
-
- @cached_property
- def credentials(self) -> AsyncCredentialsResource:
- """Vault & Secrets"""
- return AsyncCredentialsResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> AsyncPackagesResourceWithRawResponse:
- """
- 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 AsyncPackagesResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncPackagesResourceWithStreamingResponse:
- """
- 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 AsyncPackagesResourceWithStreamingResponse(self)
-
- async def create(
- self,
- *,
- package_name: 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,
- ) -> PackageCreateResponse:
- """
- Initialize a new package/app
-
- 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(
- "/credentials/packages",
- body=await async_maybe_transform({"package_name": package_name}, package_create_params.PackageCreateParams),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PackageCreateResponse,
- )
-
- async def list(
- self,
- package_name: 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,
- ) -> PackageListResponse:
- """
- List credentials for a specific package
-
- 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 package_name:
- raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
- return await self._get(
- path_template("/credentials/packages/{package_name}", package_name=package_name),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=PackageListResponse,
- )
-
-
-class PackagesResourceWithRawResponse:
- def __init__(self, packages: PackagesResource) -> None:
- self._packages = packages
-
- self.create = to_raw_response_wrapper(
- packages.create,
- )
- self.list = to_raw_response_wrapper(
- packages.list,
- )
-
- @cached_property
- def credentials(self) -> CredentialsResourceWithRawResponse:
- """Vault & Secrets"""
- return CredentialsResourceWithRawResponse(self._packages.credentials)
-
-
-class AsyncPackagesResourceWithRawResponse:
- def __init__(self, packages: AsyncPackagesResource) -> None:
- self._packages = packages
-
- self.create = async_to_raw_response_wrapper(
- packages.create,
- )
- self.list = async_to_raw_response_wrapper(
- packages.list,
- )
-
- @cached_property
- def credentials(self) -> AsyncCredentialsResourceWithRawResponse:
- """Vault & Secrets"""
- return AsyncCredentialsResourceWithRawResponse(self._packages.credentials)
-
-
-class PackagesResourceWithStreamingResponse:
- def __init__(self, packages: PackagesResource) -> None:
- self._packages = packages
-
- self.create = to_streamed_response_wrapper(
- packages.create,
- )
- self.list = to_streamed_response_wrapper(
- packages.list,
- )
-
- @cached_property
- def credentials(self) -> CredentialsResourceWithStreamingResponse:
- """Vault & Secrets"""
- return CredentialsResourceWithStreamingResponse(self._packages.credentials)
-
-
-class AsyncPackagesResourceWithStreamingResponse:
- def __init__(self, packages: AsyncPackagesResource) -> None:
- self._packages = packages
-
- self.create = async_to_streamed_response_wrapper(
- packages.create,
- )
- self.list = async_to_streamed_response_wrapper(
- packages.list,
- )
-
- @cached_property
- def credentials(self) -> AsyncCredentialsResourceWithStreamingResponse:
- """Vault & Secrets"""
- return AsyncCredentialsResourceWithStreamingResponse(self._packages.credentials)
diff --git a/src/mobilerun_sdk/resources/devices/devices.py b/src/mobilerun_sdk/resources/devices/devices.py
index 31c41ed..b70b517 100644
--- a/src/mobilerun_sdk/resources/devices/devices.py
+++ b/src/mobilerun_sdk/resources/devices/devices.py
@@ -48,7 +48,12 @@
TasksResourceWithStreamingResponse,
AsyncTasksResourceWithStreamingResponse,
)
-from ...types import device_list_params, device_create_params, device_set_name_params, device_terminate_params
+from ...types import (
+ device_list_params,
+ device_create_params,
+ device_set_name_params,
+ device_terminate_params,
+)
from .actions import (
ActionsResource,
AsyncActionsResource,
@@ -125,6 +130,7 @@
)
from ..._base_client import make_request_options
from ...types.device import Device
+from ...types.proxy_config_param import ProxyConfigParam
from ...types.device_list_response import DeviceListResponse
from ...types.device_count_response import DeviceCountResponse
from ...types.shared_params.location import Location
@@ -178,7 +184,6 @@ def state(self) -> StateResource:
@cached_property
def tasks(self) -> TasksResource:
- """Device Management"""
return TasksResource(self._client)
@cached_property
@@ -224,7 +229,7 @@ def create(
locale: str | Omit = omit,
location: Location | Omit = omit,
name: str | Omit = omit,
- proxy: device_create_params.Proxy | Omit = omit,
+ proxy: ProxyConfigParam | Omit = omit,
timezone: 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.
@@ -673,7 +678,6 @@ def state(self) -> AsyncStateResource:
@cached_property
def tasks(self) -> AsyncTasksResource:
- """Device Management"""
return AsyncTasksResource(self._client)
@cached_property
@@ -719,7 +723,7 @@ async def create(
locale: str | Omit = omit,
location: Location | Omit = omit,
name: str | Omit = omit,
- proxy: device_create_params.Proxy | Omit = omit,
+ proxy: ProxyConfigParam | Omit = omit,
timezone: 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.
@@ -1202,7 +1206,6 @@ def state(self) -> StateResourceWithRawResponse:
@cached_property
def tasks(self) -> TasksResourceWithRawResponse:
- """Device Management"""
return TasksResourceWithRawResponse(self._devices.tasks)
@cached_property
@@ -1291,7 +1294,6 @@ def state(self) -> AsyncStateResourceWithRawResponse:
@cached_property
def tasks(self) -> AsyncTasksResourceWithRawResponse:
- """Device Management"""
return AsyncTasksResourceWithRawResponse(self._devices.tasks)
@cached_property
@@ -1380,7 +1382,6 @@ def state(self) -> StateResourceWithStreamingResponse:
@cached_property
def tasks(self) -> TasksResourceWithStreamingResponse:
- """Device Management"""
return TasksResourceWithStreamingResponse(self._devices.tasks)
@cached_property
@@ -1469,7 +1470,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/tasks.py b/src/mobilerun_sdk/resources/devices/tasks.py
index 061d2ca..62c8d6f 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:
"""
@@ -96,8 +94,6 @@ def list(
class AsyncTasksResource(AsyncAPIResource):
- """Device Management"""
-
@cached_property
def with_raw_response(self) -> AsyncTasksResourceWithRawResponse:
"""
diff --git a/src/mobilerun_sdk/resources/hooks.py b/src/mobilerun_sdk/resources/hooks.py
index 6f3c43b..39a730c 100644
--- a/src/mobilerun_sdk/resources/hooks.py
+++ b/src/mobilerun_sdk/resources/hooks.py
@@ -32,6 +32,8 @@
class HooksResource(SyncAPIResource):
+ """Webhooks API"""
+
@cached_property
def with_raw_response(self) -> HooksResourceWithRawResponse:
"""
@@ -355,6 +357,8 @@ def unsubscribe(
class AsyncHooksResource(AsyncAPIResource):
+ """Webhooks API"""
+
@cached_property
def with_raw_response(self) -> AsyncHooksResourceWithRawResponse:
"""
diff --git a/src/mobilerun_sdk/resources/models.py b/src/mobilerun_sdk/resources/models.py
index 4bb2764..d1edbdd 100644
--- a/src/mobilerun_sdk/resources/models.py
+++ b/src/mobilerun_sdk/resources/models.py
@@ -20,8 +20,6 @@
class ModelsResource(SyncAPIResource):
- """LLM Models"""
-
@cached_property
def with_raw_response(self) -> ModelsResourceWithRawResponse:
"""
@@ -62,8 +60,6 @@ def list(
class AsyncModelsResource(AsyncAPIResource):
- """LLM Models"""
-
@cached_property
def with_raw_response(self) -> AsyncModelsResourceWithRawResponse:
"""
diff --git a/src/mobilerun_sdk/resources/proxies.py b/src/mobilerun_sdk/resources/proxies.py
index 4abd363..1e8cfed 100644
--- a/src/mobilerun_sdk/resources/proxies.py
+++ b/src/mobilerun_sdk/resources/proxies.py
@@ -2,13 +2,11 @@
from __future__ import annotations
-from typing_extensions import Literal, overload
-
import httpx
-from ..types import proxy_list_params, proxy_create_params, proxy_lookup_params, proxy_update_params
-from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import path_template, required_args, maybe_transform, async_maybe_transform
+from ..types import proxy_lookup_params
+from .._types import Body, Query, Headers, NotGiven, not_given
+from .._utils import maybe_transform, async_maybe_transform
from .._compat import cached_property
from .._resource import SyncAPIResource, AsyncAPIResource
from .._response import (
@@ -18,19 +16,12 @@
async_to_streamed_response_wrapper,
)
from .._base_client import make_request_options
-from ..types.proxy_list_response import ProxyListResponse
-from ..types.proxy_create_response import ProxyCreateResponse
-from ..types.proxy_delete_response import ProxyDeleteResponse
from ..types.proxy_lookup_response import ProxyLookupResponse
-from ..types.proxy_update_response import ProxyUpdateResponse
-from ..types.proxy_retrieve_response import ProxyRetrieveResponse
__all__ = ["ProxiesResource", "AsyncProxiesResource"]
class ProxiesResource(SyncAPIResource):
- """Network Proxies"""
-
@cached_property
def with_raw_response(self) -> ProxiesResourceWithRawResponse:
"""
@@ -50,306 +41,6 @@ def with_streaming_response(self) -> ProxiesResourceWithStreamingResponse:
"""
return ProxiesResourceWithStreamingResponse(self)
- @overload
- def create(
- self,
- *,
- host: str,
- name: str,
- password: str,
- port: int,
- protocol: Literal["socks5"],
- user: 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,
- ) -> ProxyCreateResponse:
- """
- Create a new proxy config
-
- 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
- """
- ...
-
- @overload
- def create(
- self,
- *,
- config: str,
- name: str,
- protocol: Literal["wireguard"],
- # 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,
- ) -> ProxyCreateResponse:
- """
- Create a new proxy config
-
- 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
- """
- ...
-
- @required_args(["host", "name", "password", "port", "protocol", "user"], ["config", "name", "protocol"])
- def create(
- self,
- *,
- host: str | Omit = omit,
- name: str,
- password: str | Omit = omit,
- port: int | Omit = omit,
- protocol: Literal["socks5"] | Literal["wireguard"],
- user: str | Omit = omit,
- config: 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,
- ) -> ProxyCreateResponse:
- return self._post(
- "/proxies",
- body=maybe_transform(
- {
- "host": host,
- "name": name,
- "password": password,
- "port": port,
- "protocol": protocol,
- "user": user,
- "config": config,
- },
- proxy_create_params.ProxyCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ProxyCreateResponse,
- )
-
- def retrieve(
- self,
- proxy_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,
- ) -> ProxyRetrieveResponse:
- """
- Get a specific proxy config
-
- 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 proxy_id:
- raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
- return self._get(
- path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ProxyRetrieveResponse,
- )
-
- @overload
- def update(
- self,
- proxy_id: str,
- *,
- host: str,
- name: str,
- password: str,
- port: int,
- protocol: Literal["socks5"],
- user: 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,
- ) -> ProxyUpdateResponse:
- """
- Update a proxy config
-
- 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
- """
- ...
-
- @overload
- def update(
- self,
- proxy_id: str,
- *,
- config: str,
- name: str,
- protocol: Literal["wireguard"],
- # 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,
- ) -> ProxyUpdateResponse:
- """
- Update a proxy config
-
- 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
- """
- ...
-
- @required_args(["host", "name", "password", "port", "protocol", "user"], ["config", "name", "protocol"])
- def update(
- self,
- proxy_id: str,
- *,
- host: str | Omit = omit,
- name: str,
- password: str | Omit = omit,
- port: int | Omit = omit,
- protocol: Literal["socks5"] | Literal["wireguard"],
- user: str | Omit = omit,
- config: 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,
- ) -> ProxyUpdateResponse:
- if not proxy_id:
- raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
- return self._put(
- path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
- body=maybe_transform(
- {
- "host": host,
- "name": name,
- "password": password,
- "port": port,
- "protocol": protocol,
- "user": user,
- "config": config,
- },
- proxy_update_params.ProxyUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ProxyUpdateResponse,
- )
-
- def list(
- self,
- *,
- protocol: Literal["socks5", "wireguard"] | 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,
- ) -> ProxyListResponse:
- """
- List all proxy configs for the authenticated 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
- """
- return self._get(
- "/proxies",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform({"protocol": protocol}, proxy_list_params.ProxyListParams),
- ),
- cast_to=ProxyListResponse,
- )
-
- def delete(
- self,
- proxy_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,
- ) -> ProxyDeleteResponse:
- """
- Delete a proxy config
-
- 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 proxy_id:
- raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
- return self._delete(
- path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ProxyDeleteResponse,
- )
-
def lookup(
self,
*,
@@ -386,8 +77,6 @@ def lookup(
class AsyncProxiesResource(AsyncAPIResource):
- """Network Proxies"""
-
@cached_property
def with_raw_response(self) -> AsyncProxiesResourceWithRawResponse:
"""
@@ -407,306 +96,6 @@ def with_streaming_response(self) -> AsyncProxiesResourceWithStreamingResponse:
"""
return AsyncProxiesResourceWithStreamingResponse(self)
- @overload
- async def create(
- self,
- *,
- host: str,
- name: str,
- password: str,
- port: int,
- protocol: Literal["socks5"],
- user: 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,
- ) -> ProxyCreateResponse:
- """
- Create a new proxy config
-
- 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
- """
- ...
-
- @overload
- async def create(
- self,
- *,
- config: str,
- name: str,
- protocol: Literal["wireguard"],
- # 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,
- ) -> ProxyCreateResponse:
- """
- Create a new proxy config
-
- 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
- """
- ...
-
- @required_args(["host", "name", "password", "port", "protocol", "user"], ["config", "name", "protocol"])
- async def create(
- self,
- *,
- host: str | Omit = omit,
- name: str,
- password: str | Omit = omit,
- port: int | Omit = omit,
- protocol: Literal["socks5"] | Literal["wireguard"],
- user: str | Omit = omit,
- config: 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,
- ) -> ProxyCreateResponse:
- return await self._post(
- "/proxies",
- body=await async_maybe_transform(
- {
- "host": host,
- "name": name,
- "password": password,
- "port": port,
- "protocol": protocol,
- "user": user,
- "config": config,
- },
- proxy_create_params.ProxyCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ProxyCreateResponse,
- )
-
- async def retrieve(
- self,
- proxy_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,
- ) -> ProxyRetrieveResponse:
- """
- Get a specific proxy config
-
- 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 proxy_id:
- raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
- return await self._get(
- path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ProxyRetrieveResponse,
- )
-
- @overload
- async def update(
- self,
- proxy_id: str,
- *,
- host: str,
- name: str,
- password: str,
- port: int,
- protocol: Literal["socks5"],
- user: 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,
- ) -> ProxyUpdateResponse:
- """
- Update a proxy config
-
- 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
- """
- ...
-
- @overload
- async def update(
- self,
- proxy_id: str,
- *,
- config: str,
- name: str,
- protocol: Literal["wireguard"],
- # 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,
- ) -> ProxyUpdateResponse:
- """
- Update a proxy config
-
- 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
- """
- ...
-
- @required_args(["host", "name", "password", "port", "protocol", "user"], ["config", "name", "protocol"])
- async def update(
- self,
- proxy_id: str,
- *,
- host: str | Omit = omit,
- name: str,
- password: str | Omit = omit,
- port: int | Omit = omit,
- protocol: Literal["socks5"] | Literal["wireguard"],
- user: str | Omit = omit,
- config: 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,
- ) -> ProxyUpdateResponse:
- if not proxy_id:
- raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
- return await self._put(
- path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
- body=await async_maybe_transform(
- {
- "host": host,
- "name": name,
- "password": password,
- "port": port,
- "protocol": protocol,
- "user": user,
- "config": config,
- },
- proxy_update_params.ProxyUpdateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ProxyUpdateResponse,
- )
-
- async def list(
- self,
- *,
- protocol: Literal["socks5", "wireguard"] | 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,
- ) -> ProxyListResponse:
- """
- List all proxy configs for the authenticated 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
- """
- return await self._get(
- "/proxies",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform({"protocol": protocol}, proxy_list_params.ProxyListParams),
- ),
- cast_to=ProxyListResponse,
- )
-
- async def delete(
- self,
- proxy_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,
- ) -> ProxyDeleteResponse:
- """
- Delete a proxy config
-
- 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 proxy_id:
- raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
- return await self._delete(
- path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ProxyDeleteResponse,
- )
-
async def lookup(
self,
*,
@@ -746,21 +135,6 @@ class ProxiesResourceWithRawResponse:
def __init__(self, proxies: ProxiesResource) -> None:
self._proxies = proxies
- self.create = to_raw_response_wrapper(
- proxies.create,
- )
- self.retrieve = to_raw_response_wrapper(
- proxies.retrieve,
- )
- self.update = to_raw_response_wrapper(
- proxies.update,
- )
- self.list = to_raw_response_wrapper(
- proxies.list,
- )
- self.delete = to_raw_response_wrapper(
- proxies.delete,
- )
self.lookup = to_raw_response_wrapper(
proxies.lookup,
)
@@ -770,21 +144,6 @@ class AsyncProxiesResourceWithRawResponse:
def __init__(self, proxies: AsyncProxiesResource) -> None:
self._proxies = proxies
- self.create = async_to_raw_response_wrapper(
- proxies.create,
- )
- self.retrieve = async_to_raw_response_wrapper(
- proxies.retrieve,
- )
- self.update = async_to_raw_response_wrapper(
- proxies.update,
- )
- self.list = async_to_raw_response_wrapper(
- proxies.list,
- )
- self.delete = async_to_raw_response_wrapper(
- proxies.delete,
- )
self.lookup = async_to_raw_response_wrapper(
proxies.lookup,
)
@@ -794,21 +153,6 @@ class ProxiesResourceWithStreamingResponse:
def __init__(self, proxies: ProxiesResource) -> None:
self._proxies = proxies
- self.create = to_streamed_response_wrapper(
- proxies.create,
- )
- self.retrieve = to_streamed_response_wrapper(
- proxies.retrieve,
- )
- self.update = to_streamed_response_wrapper(
- proxies.update,
- )
- self.list = to_streamed_response_wrapper(
- proxies.list,
- )
- self.delete = to_streamed_response_wrapper(
- proxies.delete,
- )
self.lookup = to_streamed_response_wrapper(
proxies.lookup,
)
@@ -818,21 +162,6 @@ class AsyncProxiesResourceWithStreamingResponse:
def __init__(self, proxies: AsyncProxiesResource) -> None:
self._proxies = proxies
- self.create = async_to_streamed_response_wrapper(
- proxies.create,
- )
- self.retrieve = async_to_streamed_response_wrapper(
- proxies.retrieve,
- )
- self.update = async_to_streamed_response_wrapper(
- proxies.update,
- )
- self.list = async_to_streamed_response_wrapper(
- proxies.list,
- )
- self.delete = async_to_streamed_response_wrapper(
- proxies.delete,
- )
self.lookup = async_to_streamed_response_wrapper(
proxies.lookup,
)
diff --git a/src/mobilerun_sdk/types/__init__.py b/src/mobilerun_sdk/types/__init__.py
index abff37b..94667ef 100644
--- a/src/mobilerun_sdk/types/__init__.py
+++ b/src/mobilerun_sdk/types/__init__.py
@@ -9,7 +9,6 @@
Socks5 as Socks5,
Location as Location,
DeviceSpec as DeviceSpec,
- Pagination as Pagination,
DeviceCarrier as DeviceCarrier,
PermissionSet as PermissionSet,
PaginationMeta as PaginationMeta,
@@ -19,35 +18,28 @@
from .task_status import TaskStatus as TaskStatus
from .proxy_config import ProxyConfig as ProxyConfig
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 .proxy_config_param import ProxyConfigParam as ProxyConfigParam
from .task_list_response import TaskListResponse as TaskListResponse
from .task_stop_response import TaskStopResponse as TaskStopResponse
from .agent_list_response import AgentListResponse as AgentListResponse
-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
-from .proxy_create_params import ProxyCreateParams as ProxyCreateParams
-from .proxy_list_response import ProxyListResponse as ProxyListResponse
from .proxy_lookup_params import ProxyLookupParams as ProxyLookupParams
-from .proxy_update_params import ProxyUpdateParams as ProxyUpdateParams
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
@@ -58,11 +50,7 @@
from .profile_create_params import ProfileCreateParams as ProfileCreateParams
from .profile_list_response import ProfileListResponse as ProfileListResponse
from .profile_update_params import ProfileUpdateParams as ProfileUpdateParams
-from .proxy_create_response import ProxyCreateResponse as ProxyCreateResponse
-from .proxy_delete_response import ProxyDeleteResponse as ProxyDeleteResponse
from .proxy_lookup_response import ProxyLookupResponse as ProxyLookupResponse
-from .proxy_update_response import ProxyUpdateResponse as ProxyUpdateResponse
-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
@@ -73,20 +61,13 @@
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 .app_mark_failed_response import AppMarkFailedResponse as AppMarkFailedResponse
-from .credential_list_response import CredentialListResponse as CredentialListResponse
from .task_get_status_response import TaskGetStatusResponse as TaskGetStatusResponse
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 .app_list_versions_response import AppListVersionsResponse as AppListVersionsResponse
from .task_send_message_response import TaskSendMessageResponse as TaskSendMessageResponse
-from .app_confirm_upload_response import AppConfirmUploadResponse as AppConfirmUploadResponse
from .device_fingerprint_response import DeviceFingerprintResponse as DeviceFingerprintResponse
from .task_get_trajectory_response import TaskGetTrajectoryResponse as TaskGetTrajectoryResponse
from .hook_get_sample_data_response import HookGetSampleDataResponse as HookGetSampleDataResponse
-from .app_create_signed_upload_url_params import AppCreateSignedUploadURLParams as AppCreateSignedUploadURLParams
-from .app_create_signed_upload_url_response import AppCreateSignedUploadURLResponse as AppCreateSignedUploadURLResponse
diff --git a/src/mobilerun_sdk/types/app_confirm_upload_response.py b/src/mobilerun_sdk/types/app_confirm_upload_response.py
deleted file mode 100644
index da579dc..0000000
--- a/src/mobilerun_sdk/types/app_confirm_upload_response.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from .._models import BaseModel
-
-__all__ = ["AppConfirmUploadResponse"]
-
-
-class AppConfirmUploadResponse(BaseModel):
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/app_create_signed_upload_url_params.py b/src/mobilerun_sdk/types/app_create_signed_upload_url_params.py
deleted file mode 100644
index a374c4b..0000000
--- a/src/mobilerun_sdk/types/app_create_signed_upload_url_params.py
+++ /dev/null
@@ -1,43 +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, Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["AppCreateSignedUploadURLParams", "File"]
-
-
-class AppCreateSignedUploadURLParams(TypedDict, total=False):
- bundle_id: Required[Annotated[str, PropertyInfo(alias="bundleId")]]
-
- display_name: Required[Annotated[str, PropertyInfo(alias="displayName")]]
-
- files: Required[Iterable[File]]
-
- size_bytes: Required[Annotated[float, PropertyInfo(alias="sizeBytes")]]
-
- version_code: Required[Annotated[float, PropertyInfo(alias="versionCode")]]
-
- version_name: Required[Annotated[str, PropertyInfo(alias="versionName")]]
-
- country: str
- """Country code for Search Results"""
-
- description: str
-
- developer_name: Annotated[str, PropertyInfo(alias="developerName")]
-
- icon_url: Annotated[str, PropertyInfo(alias="iconURL")]
-
- platform: Literal["android", "ios"]
-
- target_sdk: Annotated[float, PropertyInfo(alias="targetSdk")]
-
-
-class File(TypedDict, total=False):
- content_type: Required[Annotated[str, PropertyInfo(alias="contentType")]]
-
- file_name: Required[Annotated[str, PropertyInfo(alias="fileName")]]
diff --git a/src/mobilerun_sdk/types/app_create_signed_upload_url_response.py b/src/mobilerun_sdk/types/app_create_signed_upload_url_response.py
deleted file mode 100644
index 8d15581..0000000
--- a/src/mobilerun_sdk/types/app_create_signed_upload_url_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
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["AppCreateSignedUploadURLResponse", "R2UploadURL"]
-
-
-class R2UploadURL(BaseModel):
- file_name: str = FieldInfo(alias="fileName")
-
- r2_upload_url: str = FieldInfo(alias="r2UploadUrl")
-
-
-class AppCreateSignedUploadURLResponse(BaseModel):
- app_id: str = FieldInfo(alias="appId")
- """App ID in the database"""
-
- r2_upload_urls: List[R2UploadURL] = FieldInfo(alias="r2UploadUrls")
- """Pre-signed Cloudflare R2 URLs for uploading app files"""
-
- version_id: str = FieldInfo(alias="versionId")
- """App version ID in the database"""
diff --git a/src/mobilerun_sdk/types/app_delete_response.py b/src/mobilerun_sdk/types/app_delete_response.py
deleted file mode 100644
index 5dce5fa..0000000
--- a/src/mobilerun_sdk/types/app_delete_response.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from .._models import BaseModel
-
-__all__ = ["AppDeleteResponse"]
-
-
-class AppDeleteResponse(BaseModel):
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/app_list_params.py b/src/mobilerun_sdk/types/app_list_params.py
deleted file mode 100644
index 319c937..0000000
--- a/src/mobilerun_sdk/types/app_list_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_extensions import Literal, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["AppListParams"]
-
-
-class AppListParams(TypedDict, total=False):
- order: Literal["asc", "desc"]
-
- page: int
-
- page_size: Annotated[int, PropertyInfo(alias="pageSize")]
-
- platform: Literal["all", "android", "ios"]
-
- query: str
-
- sort_by: Annotated[Literal["createdAt", "name"], PropertyInfo(alias="sortBy")]
-
- status: Literal["all", "queued", "available", "failed"]
diff --git a/src/mobilerun_sdk/types/app_list_response.py b/src/mobilerun_sdk/types/app_list_response.py
deleted file mode 100644
index f7e2394..0000000
--- a/src/mobilerun_sdk/types/app_list_response.py
+++ /dev/null
@@ -1,333 +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 .shared.pagination import Pagination
-
-__all__ = ["AppListResponse", "Count", "Item", "ItemVersion"]
-
-
-class Count(BaseModel):
- available_count: float = FieldInfo(alias="availableCount")
-
- failed_count: float = FieldInfo(alias="failedCount")
-
- queued_count: float = FieldInfo(alias="queuedCount")
-
- total_count: float = FieldInfo(alias="totalCount")
-
-
-class ItemVersion(BaseModel):
- id: str
-
- app_id: str = FieldInfo(alias="appId")
-
- country: Literal[
- "AF",
- "AL",
- "DZ",
- "AS",
- "AD",
- "AO",
- "AI",
- "AQ",
- "AG",
- "AR",
- "AM",
- "AW",
- "AP",
- "AU",
- "AT",
- "AZ",
- "BS",
- "BH",
- "BD",
- "BB",
- "BY",
- "BE",
- "BZ",
- "BJ",
- "BM",
- "BT",
- "BO",
- "BQ",
- "BA",
- "BW",
- "BV",
- "BR",
- "IO",
- "BN",
- "BG",
- "BF",
- "BI",
- "KH",
- "CM",
- "CA",
- "CV",
- "KY",
- "CF",
- "TD",
- "CL",
- "CN",
- "CX",
- "CC",
- "CO",
- "KM",
- "CG",
- "CD",
- "CK",
- "CR",
- "HR",
- "CU",
- "CW",
- "CY",
- "CZ",
- "CI",
- "DK",
- "DJ",
- "DM",
- "DO",
- "EC",
- "EG",
- "SV",
- "GQ",
- "ER",
- "EE",
- "ET",
- "FK",
- "FO",
- "FJ",
- "FI",
- "FR",
- "GF",
- "PF",
- "TF",
- "GA",
- "GM",
- "GE",
- "DE",
- "GH",
- "GI",
- "GR",
- "GL",
- "GD",
- "GP",
- "GU",
- "GT",
- "GG",
- "GN",
- "GW",
- "GY",
- "HT",
- "HM",
- "VA",
- "HN",
- "HK",
- "HU",
- "IS",
- "IN",
- "ID",
- "IR",
- "IQ",
- "IE",
- "IM",
- "IL",
- "IT",
- "JM",
- "JP",
- "JE",
- "JO",
- "KZ",
- "KE",
- "KI",
- "KR",
- "KW",
- "KG",
- "LA",
- "LV",
- "LB",
- "LS",
- "LR",
- "LY",
- "LI",
- "LT",
- "LU",
- "MO",
- "MG",
- "MW",
- "MY",
- "MV",
- "ML",
- "MT",
- "MH",
- "MQ",
- "MR",
- "MU",
- "YT",
- "MX",
- "FM",
- "MD",
- "MC",
- "MN",
- "ME",
- "MS",
- "MA",
- "MZ",
- "MM",
- "NA",
- "NR",
- "NP",
- "NL",
- "AN",
- "NC",
- "NZ",
- "NI",
- "NE",
- "NG",
- "NU",
- "NF",
- "KP",
- "MK",
- "MP",
- "NO",
- "OM",
- "PK",
- "PW",
- "PS",
- "PA",
- "PG",
- "PY",
- "PE",
- "PH",
- "PN",
- "PL",
- "PT",
- "PR",
- "QA",
- "RE",
- "RO",
- "RU",
- "RW",
- "BL",
- "SH",
- "KN",
- "LC",
- "MF",
- "PM",
- "VC",
- "WS",
- "SM",
- "ST",
- "SA",
- "SN",
- "RS",
- "CS",
- "SC",
- "SL",
- "SG",
- "SX",
- "SK",
- "SI",
- "SB",
- "SO",
- "ZA",
- "GS",
- "SS",
- "ES",
- "LK",
- "SD",
- "SR",
- "SJ",
- "SZ",
- "SE",
- "CH",
- "SY",
- "TW",
- "TJ",
- "TZ",
- "TH",
- "TL",
- "TG",
- "TK",
- "TO",
- "TT",
- "TN",
- "TR",
- "TM",
- "TC",
- "TV",
- "UG",
- "UA",
- "AE",
- "GB",
- "US",
- "UM",
- "UY",
- "UZ",
- "VU",
- "VE",
- "VN",
- "VG",
- "VI",
- "WF",
- "EH",
- "YE",
- "ZM",
- "ZW",
- "AX",
- ]
-
- created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
-
- queued_at: Optional[datetime] = FieldInfo(alias="queuedAt", default=None)
-
- size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None)
-
- source: Literal["user", "system", "portal"]
-
- status: Literal["queued", "available", "failed"]
-
- target_sdk: Optional[int] = FieldInfo(alias="targetSdk", default=None)
-
- updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
-
- user_id: Optional[str] = FieldInfo(alias="userId", default=None)
-
- version_code: int = FieldInfo(alias="versionCode")
-
- version_name: str = FieldInfo(alias="versionName")
-
-
-class Item(BaseModel):
- id: str
-
- bundle_id: str = FieldInfo(alias="bundleId")
-
- created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
-
- description: Optional[str] = None
-
- developer_name: Optional[str] = FieldInfo(alias="developerName", default=None)
-
- display_name: str = FieldInfo(alias="displayName")
-
- icon_url: str = FieldInfo(alias="iconURL")
-
- platform: Literal["android", "ios"]
-
- updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
-
- version: ItemVersion
-
-
-class AppListResponse(BaseModel):
- count: Count
-
- items: List[Item]
-
- pagination: Pagination
diff --git a/src/mobilerun_sdk/types/app_list_versions_response.py b/src/mobilerun_sdk/types/app_list_versions_response.py
deleted file mode 100644
index 130eab8..0000000
--- a/src/mobilerun_sdk/types/app_list_versions_response.py
+++ /dev/null
@@ -1,296 +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
-
-__all__ = ["AppListVersionsResponse", "Data"]
-
-
-class Data(BaseModel):
- id: str
-
- app_id: str = FieldInfo(alias="appId")
-
- country: Literal[
- "AF",
- "AL",
- "DZ",
- "AS",
- "AD",
- "AO",
- "AI",
- "AQ",
- "AG",
- "AR",
- "AM",
- "AW",
- "AP",
- "AU",
- "AT",
- "AZ",
- "BS",
- "BH",
- "BD",
- "BB",
- "BY",
- "BE",
- "BZ",
- "BJ",
- "BM",
- "BT",
- "BO",
- "BQ",
- "BA",
- "BW",
- "BV",
- "BR",
- "IO",
- "BN",
- "BG",
- "BF",
- "BI",
- "KH",
- "CM",
- "CA",
- "CV",
- "KY",
- "CF",
- "TD",
- "CL",
- "CN",
- "CX",
- "CC",
- "CO",
- "KM",
- "CG",
- "CD",
- "CK",
- "CR",
- "HR",
- "CU",
- "CW",
- "CY",
- "CZ",
- "CI",
- "DK",
- "DJ",
- "DM",
- "DO",
- "EC",
- "EG",
- "SV",
- "GQ",
- "ER",
- "EE",
- "ET",
- "FK",
- "FO",
- "FJ",
- "FI",
- "FR",
- "GF",
- "PF",
- "TF",
- "GA",
- "GM",
- "GE",
- "DE",
- "GH",
- "GI",
- "GR",
- "GL",
- "GD",
- "GP",
- "GU",
- "GT",
- "GG",
- "GN",
- "GW",
- "GY",
- "HT",
- "HM",
- "VA",
- "HN",
- "HK",
- "HU",
- "IS",
- "IN",
- "ID",
- "IR",
- "IQ",
- "IE",
- "IM",
- "IL",
- "IT",
- "JM",
- "JP",
- "JE",
- "JO",
- "KZ",
- "KE",
- "KI",
- "KR",
- "KW",
- "KG",
- "LA",
- "LV",
- "LB",
- "LS",
- "LR",
- "LY",
- "LI",
- "LT",
- "LU",
- "MO",
- "MG",
- "MW",
- "MY",
- "MV",
- "ML",
- "MT",
- "MH",
- "MQ",
- "MR",
- "MU",
- "YT",
- "MX",
- "FM",
- "MD",
- "MC",
- "MN",
- "ME",
- "MS",
- "MA",
- "MZ",
- "MM",
- "NA",
- "NR",
- "NP",
- "NL",
- "AN",
- "NC",
- "NZ",
- "NI",
- "NE",
- "NG",
- "NU",
- "NF",
- "KP",
- "MK",
- "MP",
- "NO",
- "OM",
- "PK",
- "PW",
- "PS",
- "PA",
- "PG",
- "PY",
- "PE",
- "PH",
- "PN",
- "PL",
- "PT",
- "PR",
- "QA",
- "RE",
- "RO",
- "RU",
- "RW",
- "BL",
- "SH",
- "KN",
- "LC",
- "MF",
- "PM",
- "VC",
- "WS",
- "SM",
- "ST",
- "SA",
- "SN",
- "RS",
- "CS",
- "SC",
- "SL",
- "SG",
- "SX",
- "SK",
- "SI",
- "SB",
- "SO",
- "ZA",
- "GS",
- "SS",
- "ES",
- "LK",
- "SD",
- "SR",
- "SJ",
- "SZ",
- "SE",
- "CH",
- "SY",
- "TW",
- "TJ",
- "TZ",
- "TH",
- "TL",
- "TG",
- "TK",
- "TO",
- "TT",
- "TN",
- "TR",
- "TM",
- "TC",
- "TV",
- "UG",
- "UA",
- "AE",
- "GB",
- "US",
- "UM",
- "UY",
- "UZ",
- "VU",
- "VE",
- "VN",
- "VG",
- "VI",
- "WF",
- "EH",
- "YE",
- "ZM",
- "ZW",
- "AX",
- ]
-
- created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
-
- queued_at: Optional[datetime] = FieldInfo(alias="queuedAt", default=None)
-
- size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None)
-
- source: Literal["user", "system", "portal"]
-
- status: Literal["queued", "available", "failed"]
-
- target_sdk: Optional[int] = FieldInfo(alias="targetSdk", default=None)
-
- updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
-
- user_id: Optional[str] = FieldInfo(alias="userId", default=None)
-
- version_code: int = FieldInfo(alias="versionCode")
-
- version_name: str = FieldInfo(alias="versionName")
-
-
-class AppListVersionsResponse(BaseModel):
- data: List[Data]
diff --git a/src/mobilerun_sdk/types/app_mark_failed_response.py b/src/mobilerun_sdk/types/app_mark_failed_response.py
deleted file mode 100644
index 4df598b..0000000
--- a/src/mobilerun_sdk/types/app_mark_failed_response.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from .._models import BaseModel
-
-__all__ = ["AppMarkFailedResponse"]
-
-
-class AppMarkFailedResponse(BaseModel):
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/app_retrieve_response.py b/src/mobilerun_sdk/types/app_retrieve_response.py
deleted file mode 100644
index 57fd551..0000000
--- a/src/mobilerun_sdk/types/app_retrieve_response.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-from datetime import datetime
-from typing_extensions import Literal
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["AppRetrieveResponse", "Data"]
-
-
-class Data(BaseModel):
- id: str
-
- bundle_id: str = FieldInfo(alias="bundleId")
-
- created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
-
- description: Optional[str] = None
-
- developer_name: Optional[str] = FieldInfo(alias="developerName", default=None)
-
- display_name: str = FieldInfo(alias="displayName")
-
- icon_url: str = FieldInfo(alias="iconURL")
-
- platform: Literal["android", "ios"]
-
- updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
-
-
-class AppRetrieveResponse(BaseModel):
- data: Data
diff --git a/src/mobilerun_sdk/types/credential_list_params.py b/src/mobilerun_sdk/types/credential_list_params.py
deleted file mode 100644
index 1f94a2e..0000000
--- a/src/mobilerun_sdk/types/credential_list_params.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["CredentialListParams"]
-
-
-class CredentialListParams(TypedDict, total=False):
- page: int
-
- page_size: Annotated[int, PropertyInfo(alias="pageSize")]
diff --git a/src/mobilerun_sdk/types/credential_list_response.py b/src/mobilerun_sdk/types/credential_list_response.py
deleted file mode 100644
index 0721b2b..0000000
--- a/src/mobilerun_sdk/types/credential_list_response.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List
-
-from .._models import BaseModel
-from .shared.pagination import Pagination
-from .credentials.packages.credential import Credential
-
-__all__ = ["CredentialListResponse"]
-
-
-class CredentialListResponse(BaseModel):
- items: List[Credential]
-
- pagination: Pagination
diff --git a/src/mobilerun_sdk/types/credentials/__init__.py b/src/mobilerun_sdk/types/credentials/__init__.py
index d2b799c..f8ee8b1 100644
--- a/src/mobilerun_sdk/types/credentials/__init__.py
+++ b/src/mobilerun_sdk/types/credentials/__init__.py
@@ -1,7 +1,3 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from __future__ import annotations
-
-from .package_create_params import PackageCreateParams as PackageCreateParams
-from .package_list_response import PackageListResponse as PackageListResponse
-from .package_create_response import PackageCreateResponse as PackageCreateResponse
diff --git a/src/mobilerun_sdk/types/credentials/package_create_params.py b/src/mobilerun_sdk/types/credentials/package_create_params.py
deleted file mode 100644
index 50dad4a..0000000
--- a/src/mobilerun_sdk/types/credentials/package_create_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_extensions import Required, Annotated, TypedDict
-
-from ..._utils import PropertyInfo
-
-__all__ = ["PackageCreateParams"]
-
-
-class PackageCreateParams(TypedDict, total=False):
- package_name: Required[Annotated[str, PropertyInfo(alias="packageName")]]
diff --git a/src/mobilerun_sdk/types/credentials/package_create_response.py b/src/mobilerun_sdk/types/credentials/package_create_response.py
deleted file mode 100644
index 8ff9fa8..0000000
--- a/src/mobilerun_sdk/types/credentials/package_create_response.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from pydantic import Field as FieldInfo
-
-from ..._models import BaseModel
-
-__all__ = ["PackageCreateResponse", "Data"]
-
-
-class Data(BaseModel):
- package_name: str = FieldInfo(alias="packageName")
-
-
-class PackageCreateResponse(BaseModel):
- data: Data
-
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/package_list_response.py b/src/mobilerun_sdk/types/credentials/package_list_response.py
deleted file mode 100644
index c9567e1..0000000
--- a/src/mobilerun_sdk/types/credentials/package_list_response.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List
-
-from ..._models import BaseModel
-from .packages.credential import Credential
-
-__all__ = ["PackageListResponse"]
-
-
-class PackageListResponse(BaseModel):
- data: List[Credential]
diff --git a/src/mobilerun_sdk/types/credentials/packages/__init__.py b/src/mobilerun_sdk/types/credentials/packages/__init__.py
index a3bddb0..f8ee8b1 100644
--- a/src/mobilerun_sdk/types/credentials/packages/__init__.py
+++ b/src/mobilerun_sdk/types/credentials/packages/__init__.py
@@ -1,9 +1,3 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from __future__ import annotations
-
-from .credential import Credential as Credential
-from .credential_create_params import CredentialCreateParams as CredentialCreateParams
-from .credential_create_response import CredentialCreateResponse as CredentialCreateResponse
-from .credential_delete_response import CredentialDeleteResponse as CredentialDeleteResponse
-from .credential_retrieve_response import CredentialRetrieveResponse as CredentialRetrieveResponse
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential.py b/src/mobilerun_sdk/types/credentials/packages/credential.py
deleted file mode 100644
index 686342d..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credential.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# 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
-
-from ...._models import BaseModel
-
-__all__ = ["Credential", "Field"]
-
-
-class Field(BaseModel):
- field_type: Literal[
- "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
- ] = FieldInfo(alias="fieldType")
-
- value: str
-
-
-class Credential(BaseModel):
- credential_name: str = FieldInfo(alias="credentialName")
-
- fields: List[Field]
-
- package_name: str = FieldInfo(alias="packageName")
-
- secret_path: str = FieldInfo(alias="secretPath")
-
- user_id: str = FieldInfo(alias="userId")
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential_create_params.py b/src/mobilerun_sdk/types/credentials/packages/credential_create_params.py
deleted file mode 100644
index 7925fa5..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credential_create_params.py
+++ /dev/null
@@ -1,27 +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, Required, Annotated, TypedDict
-
-from ...._utils import PropertyInfo
-
-__all__ = ["CredentialCreateParams", "Field"]
-
-
-class CredentialCreateParams(TypedDict, total=False):
- credential_name: Required[Annotated[str, PropertyInfo(alias="credentialName")]]
-
- fields: Required[Iterable[Field]]
-
-
-class Field(TypedDict, total=False):
- field_type: Required[
- Annotated[
- Literal["email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"],
- PropertyInfo(alias="fieldType"),
- ]
- ]
-
- value: Required[str]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential_create_response.py b/src/mobilerun_sdk/types/credentials/packages/credential_create_response.py
deleted file mode 100644
index 56749ca..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credential_create_response.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from ...._models import BaseModel
-from .credential import Credential
-
-__all__ = ["CredentialCreateResponse"]
-
-
-class CredentialCreateResponse(BaseModel):
- data: Credential
-
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential_delete_response.py b/src/mobilerun_sdk/types/credentials/packages/credential_delete_response.py
deleted file mode 100644
index 9fc9bf4..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credential_delete_response.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from ...._models import BaseModel
-from .credential import Credential
-
-__all__ = ["CredentialDeleteResponse"]
-
-
-class CredentialDeleteResponse(BaseModel):
- data: Credential
-
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential_retrieve_response.py b/src/mobilerun_sdk/types/credentials/packages/credential_retrieve_response.py
deleted file mode 100644
index ea546cc..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credential_retrieve_response.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from ...._models import BaseModel
-from .credential import Credential
-
-__all__ = ["CredentialRetrieveResponse"]
-
-
-class CredentialRetrieveResponse(BaseModel):
- data: Credential
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/__init__.py b/src/mobilerun_sdk/types/credentials/packages/credentials/__init__.py
index f3e7873..f8ee8b1 100644
--- a/src/mobilerun_sdk/types/credentials/packages/credentials/__init__.py
+++ b/src/mobilerun_sdk/types/credentials/packages/credentials/__init__.py
@@ -1,9 +1,3 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from __future__ import annotations
-
-from .field_create_params import FieldCreateParams as FieldCreateParams
-from .field_update_params import FieldUpdateParams as FieldUpdateParams
-from .field_create_response import FieldCreateResponse as FieldCreateResponse
-from .field_delete_response import FieldDeleteResponse as FieldDeleteResponse
-from .field_update_response import FieldUpdateResponse as FieldUpdateResponse
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_params.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_params.py
deleted file mode 100644
index debabf7..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_params.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal, Required, Annotated, TypedDict
-
-from ....._utils import PropertyInfo
-
-__all__ = ["FieldCreateParams"]
-
-
-class FieldCreateParams(TypedDict, total=False):
- package_name: Required[Annotated[str, PropertyInfo(alias="packageName")]]
-
- field_type: Required[
- Annotated[
- Literal["email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"],
- PropertyInfo(alias="fieldType"),
- ]
- ]
-
- value: Required[str]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_response.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_response.py
deleted file mode 100644
index 2d7f2d0..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_response.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from ....._models import BaseModel
-from ..credential import Credential
-
-__all__ = ["FieldCreateResponse"]
-
-
-class FieldCreateResponse(BaseModel):
- data: Credential
-
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_delete_response.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_delete_response.py
deleted file mode 100644
index 67e99f8..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credentials/field_delete_response.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from ....._models import BaseModel
-from ..credential import Credential
-
-__all__ = ["FieldDeleteResponse"]
-
-
-class FieldDeleteResponse(BaseModel):
- data: Credential
-
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_params.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_params.py
deleted file mode 100644
index ed62fb1..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_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 Required, Annotated, TypedDict
-
-from ....._utils import PropertyInfo
-
-__all__ = ["FieldUpdateParams"]
-
-
-class FieldUpdateParams(TypedDict, total=False):
- package_name: Required[Annotated[str, PropertyInfo(alias="packageName")]]
-
- credential_name: Required[Annotated[str, PropertyInfo(alias="credentialName")]]
-
- value: Required[str]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_response.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_response.py
deleted file mode 100644
index 8676ce3..0000000
--- a/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_response.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from ....._models import BaseModel
-from ..credential import Credential
-
-__all__ = ["FieldUpdateResponse"]
-
-
-class FieldUpdateResponse(BaseModel):
- data: Credential
-
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/device_create_params.py b/src/mobilerun_sdk/types/device_create_params.py
index a631b9c..6d5b9b0 100644
--- a/src/mobilerun_sdk/types/device_create_params.py
+++ b/src/mobilerun_sdk/types/device_create_params.py
@@ -7,12 +7,12 @@
from .._types import SequenceNotStr
from .._utils import PropertyInfo
-from .shared_params.socks5 import Socks5
+from .proxy_config_param import ProxyConfigParam
from .shared_params.location import Location
from .shared_params.device_carrier import DeviceCarrier
from .shared_params.device_identifiers import DeviceIdentifiers
-__all__ = ["DeviceCreateParams", "Proxy"]
+__all__ = ["DeviceCreateParams"]
class DeviceCreateParams(TypedDict, total=False):
@@ -48,14 +48,6 @@ class DeviceCreateParams(TypedDict, total=False):
name: str
- proxy: Proxy
+ proxy: ProxyConfigParam
timezone: str
-
-
-class Proxy(TypedDict, total=False):
- name: str
-
- smart_ip: Annotated[bool, PropertyInfo(alias="smartIp")]
-
- socks5: Socks5
diff --git a/src/mobilerun_sdk/types/devices/state_ui_response.py b/src/mobilerun_sdk/types/devices/state_ui_response.py
index bdddd0c..80cbe44 100644
--- a/src/mobilerun_sdk/types/devices/state_ui_response.py
+++ b/src/mobilerun_sdk/types/devices/state_ui_response.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import Optional
+from typing import List, Optional
from pydantic import Field as FieldInfo
@@ -9,14 +9,64 @@
__all__ = [
"StateUiResponse",
+ "A11yTree",
+ "A11yTreeBoundsInScreen",
"DeviceContext",
"DeviceContextDisplayMetrics",
"DeviceContextFilteringParams",
+ "ImeTree",
+ "ImeTreeBoundsInScreen",
"PhoneState",
"PhoneStateFocusedElement",
]
+class A11yTreeBoundsInScreen(BaseModel):
+ bottom: int
+
+ left: int
+
+ right: int
+
+ top: int
+
+
+class A11yTree(BaseModel):
+ bounds_in_screen: A11yTreeBoundsInScreen = FieldInfo(alias="boundsInScreen")
+
+ children: Optional[List[object]] = None
+
+ class_name: str = FieldInfo(alias="className")
+
+ content_description: str = FieldInfo(alias="contentDescription")
+
+ is_checkable: bool = FieldInfo(alias="isCheckable")
+
+ is_checked: bool = FieldInfo(alias="isChecked")
+
+ is_clickable: bool = FieldInfo(alias="isClickable")
+
+ is_enabled: bool = FieldInfo(alias="isEnabled")
+
+ is_focusable: bool = FieldInfo(alias="isFocusable")
+
+ is_focused: bool = FieldInfo(alias="isFocused")
+
+ is_long_clickable: bool = FieldInfo(alias="isLongClickable")
+
+ is_password: bool = FieldInfo(alias="isPassword")
+
+ is_scrollable: bool = FieldInfo(alias="isScrollable")
+
+ is_selected: bool = FieldInfo(alias="isSelected")
+
+ package_name: str = FieldInfo(alias="packageName")
+
+ resource_id: str = FieldInfo(alias="resourceId")
+
+ text: str
+
+
class DeviceContextDisplayMetrics(BaseModel):
density: float
@@ -42,7 +92,51 @@ class DeviceContext(BaseModel):
screen_bounds: Rect
- screen_size: Rect = FieldInfo(alias="screenSize")
+
+class ImeTreeBoundsInScreen(BaseModel):
+ bottom: int
+
+ left: int
+
+ right: int
+
+ top: int
+
+
+class ImeTree(BaseModel):
+ bounds_in_screen: ImeTreeBoundsInScreen = FieldInfo(alias="boundsInScreen")
+
+ children: Optional[List[object]] = None
+
+ class_name: str = FieldInfo(alias="className")
+
+ content_description: str = FieldInfo(alias="contentDescription")
+
+ is_checkable: bool = FieldInfo(alias="isCheckable")
+
+ is_checked: bool = FieldInfo(alias="isChecked")
+
+ is_clickable: bool = FieldInfo(alias="isClickable")
+
+ is_enabled: bool = FieldInfo(alias="isEnabled")
+
+ is_focusable: bool = FieldInfo(alias="isFocusable")
+
+ is_focused: bool = FieldInfo(alias="isFocused")
+
+ is_long_clickable: bool = FieldInfo(alias="isLongClickable")
+
+ is_password: bool = FieldInfo(alias="isPassword")
+
+ is_scrollable: bool = FieldInfo(alias="isScrollable")
+
+ is_selected: bool = FieldInfo(alias="isSelected")
+
+ package_name: str = FieldInfo(alias="packageName")
+
+ resource_id: str = FieldInfo(alias="resourceId")
+
+ text: str
class PhoneStateFocusedElement(BaseModel):
@@ -68,13 +162,13 @@ class PhoneState(BaseModel):
class StateUiResponse(BaseModel):
- a11y_tree: object
+ a11y_tree: A11yTree
device_context: DeviceContext
+ ime_tree: ImeTree
+
phone_state: PhoneState
schema_: Optional[str] = FieldInfo(alias="$schema", default=None)
"""A URL to the JSON Schema for this object."""
-
- ime_tree: Optional[object] = None
diff --git a/src/mobilerun_sdk/types/proxy_config.py b/src/mobilerun_sdk/types/proxy_config.py
index 52d651c..5a5715b 100644
--- a/src/mobilerun_sdk/types/proxy_config.py
+++ b/src/mobilerun_sdk/types/proxy_config.py
@@ -1,42 +1,18 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import Union
-from typing_extensions import Literal, Annotated, TypeAlias
+from typing import Optional
from pydantic import Field as FieldInfo
-from .._utils import PropertyInfo
from .._models import BaseModel
+from .shared.socks5 import Socks5
-__all__ = ["ProxyConfig", "Socks5ProxyConfig", "WireguardProxyConfig"]
+__all__ = ["ProxyConfig"]
-class Socks5ProxyConfig(BaseModel):
- host: str
+class ProxyConfig(BaseModel):
+ name: Optional[str] = None
- name: str
+ smart_ip: Optional[bool] = FieldInfo(alias="smartIp", default=None)
- password: str
-
- port: int
-
- protocol: Literal["socks5"]
-
- proxy_id: str = FieldInfo(alias="proxyId")
-
- user: str
-
-
-class WireguardProxyConfig(BaseModel):
- config: str
-
- name: str
-
- protocol: Literal["wireguard"]
-
- proxy_id: str = FieldInfo(alias="proxyId")
-
-
-ProxyConfig: TypeAlias = Annotated[
- Union[Socks5ProxyConfig, WireguardProxyConfig], PropertyInfo(discriminator="protocol")
-]
+ socks5: Optional[Socks5] = None
diff --git a/src/mobilerun_sdk/types/proxy_config_param.py b/src/mobilerun_sdk/types/proxy_config_param.py
new file mode 100644
index 0000000..c169125
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_config_param.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 Annotated, TypedDict
+
+from .._utils import PropertyInfo
+from .shared_params.socks5 import Socks5
+
+__all__ = ["ProxyConfigParam"]
+
+
+class ProxyConfigParam(TypedDict, total=False):
+ name: str
+
+ smart_ip: Annotated[bool, PropertyInfo(alias="smartIp")]
+
+ socks5: Socks5
diff --git a/src/mobilerun_sdk/types/proxy_create_params.py b/src/mobilerun_sdk/types/proxy_create_params.py
deleted file mode 100644
index 1d9fdf4..0000000
--- a/src/mobilerun_sdk/types/proxy_create_params.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union
-from typing_extensions import Literal, Required, TypeAlias, TypedDict
-
-__all__ = ["ProxyCreateParams", "CreateSocks5Proxy", "CreateWireguardProxy"]
-
-
-class CreateSocks5Proxy(TypedDict, total=False):
- host: Required[str]
-
- name: Required[str]
-
- password: Required[str]
-
- port: Required[int]
-
- protocol: Required[Literal["socks5"]]
-
- user: Required[str]
-
-
-class CreateWireguardProxy(TypedDict, total=False):
- config: Required[str]
-
- name: Required[str]
-
- protocol: Required[Literal["wireguard"]]
-
-
-ProxyCreateParams: TypeAlias = Union[CreateSocks5Proxy, CreateWireguardProxy]
diff --git a/src/mobilerun_sdk/types/proxy_create_response.py b/src/mobilerun_sdk/types/proxy_create_response.py
deleted file mode 100644
index 72a8d2c..0000000
--- a/src/mobilerun_sdk/types/proxy_create_response.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from .._models import BaseModel
-from .proxy_config import ProxyConfig
-
-__all__ = ["ProxyCreateResponse"]
-
-
-class ProxyCreateResponse(BaseModel):
- data: ProxyConfig
-
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/proxy_delete_response.py b/src/mobilerun_sdk/types/proxy_delete_response.py
deleted file mode 100644
index 872567b..0000000
--- a/src/mobilerun_sdk/types/proxy_delete_response.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from .._models import BaseModel
-from .proxy_config import ProxyConfig
-
-__all__ = ["ProxyDeleteResponse"]
-
-
-class ProxyDeleteResponse(BaseModel):
- data: ProxyConfig
-
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/proxy_list_params.py b/src/mobilerun_sdk/types/proxy_list_params.py
deleted file mode 100644
index 6b3d14f..0000000
--- a/src/mobilerun_sdk/types/proxy_list_params.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal, TypedDict
-
-__all__ = ["ProxyListParams"]
-
-
-class ProxyListParams(TypedDict, total=False):
- protocol: Literal["socks5", "wireguard"]
diff --git a/src/mobilerun_sdk/types/proxy_list_response.py b/src/mobilerun_sdk/types/proxy_list_response.py
deleted file mode 100644
index ff49af0..0000000
--- a/src/mobilerun_sdk/types/proxy_list_response.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List
-
-from .._models import BaseModel
-from .proxy_config import ProxyConfig
-
-__all__ = ["ProxyListResponse"]
-
-
-class ProxyListResponse(BaseModel):
- data: List[ProxyConfig]
diff --git a/src/mobilerun_sdk/types/proxy_retrieve_response.py b/src/mobilerun_sdk/types/proxy_retrieve_response.py
deleted file mode 100644
index 6c6a1c5..0000000
--- a/src/mobilerun_sdk/types/proxy_retrieve_response.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .._models import BaseModel
-from .proxy_config import ProxyConfig
-
-__all__ = ["ProxyRetrieveResponse"]
-
-
-class ProxyRetrieveResponse(BaseModel):
- data: ProxyConfig
diff --git a/src/mobilerun_sdk/types/proxy_update_params.py b/src/mobilerun_sdk/types/proxy_update_params.py
deleted file mode 100644
index ab81ede..0000000
--- a/src/mobilerun_sdk/types/proxy_update_params.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union
-from typing_extensions import Literal, Required, TypeAlias, TypedDict
-
-__all__ = ["ProxyUpdateParams", "UpdateSocks5Proxy", "UpdateWireguardProxy"]
-
-
-class UpdateSocks5Proxy(TypedDict, total=False):
- host: Required[str]
-
- name: Required[str]
-
- password: Required[str]
-
- port: Required[int]
-
- protocol: Required[Literal["socks5"]]
-
- user: Required[str]
-
-
-class UpdateWireguardProxy(TypedDict, total=False):
- config: Required[str]
-
- name: Required[str]
-
- protocol: Required[Literal["wireguard"]]
-
-
-ProxyUpdateParams: TypeAlias = Union[UpdateSocks5Proxy, UpdateWireguardProxy]
diff --git a/src/mobilerun_sdk/types/proxy_update_response.py b/src/mobilerun_sdk/types/proxy_update_response.py
deleted file mode 100644
index f1578b4..0000000
--- a/src/mobilerun_sdk/types/proxy_update_response.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal
-
-from .._models import BaseModel
-from .proxy_config import ProxyConfig
-
-__all__ = ["ProxyUpdateResponse"]
-
-
-class ProxyUpdateResponse(BaseModel):
- data: ProxyConfig
-
- message: str
-
- success: Literal[True]
diff --git a/src/mobilerun_sdk/types/shared/__init__.py b/src/mobilerun_sdk/types/shared/__init__.py
index 7d0f116..92ac387 100644
--- a/src/mobilerun_sdk/types/shared/__init__.py
+++ b/src/mobilerun_sdk/types/shared/__init__.py
@@ -3,7 +3,6 @@
from .meta import Meta as Meta
from .socks5 import Socks5 as Socks5
from .location import Location as Location
-from .pagination import Pagination as Pagination
from .device_spec import DeviceSpec as DeviceSpec
from .device_carrier import DeviceCarrier as DeviceCarrier
from .permission_set import PermissionSet as PermissionSet
diff --git a/src/mobilerun_sdk/types/shared/device_spec.py b/src/mobilerun_sdk/types/shared/device_spec.py
index 64614c9..0cbc319 100644
--- a/src/mobilerun_sdk/types/shared/device_spec.py
+++ b/src/mobilerun_sdk/types/shared/device_spec.py
@@ -4,21 +4,13 @@
from pydantic import Field as FieldInfo
-from .socks5 import Socks5
from .location import Location
from ..._models import BaseModel
+from ..proxy_config import ProxyConfig
from .device_carrier import DeviceCarrier
from .device_identifiers import DeviceIdentifiers
-__all__ = ["DeviceSpec", "Proxy"]
-
-
-class Proxy(BaseModel):
- name: Optional[str] = None
-
- smart_ip: Optional[bool] = FieldInfo(alias="smartIp", default=None)
-
- socks5: Optional[Socks5] = None
+__all__ = ["DeviceSpec"]
class DeviceSpec(BaseModel):
@@ -43,6 +35,6 @@ class DeviceSpec(BaseModel):
name: Optional[str] = None
- proxy: Optional[Proxy] = None
+ proxy: Optional[ProxyConfig] = None
timezone: Optional[str] = None
diff --git a/src/mobilerun_sdk/types/shared/pagination.py b/src/mobilerun_sdk/types/shared/pagination.py
deleted file mode 100644
index d5a8b19..0000000
--- a/src/mobilerun_sdk/types/shared/pagination.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from pydantic import Field as FieldInfo
-
-from ..._models import BaseModel
-
-__all__ = ["Pagination"]
-
-
-class Pagination(BaseModel):
- has_next: bool = FieldInfo(alias="hasNext")
-
- has_prev: bool = FieldInfo(alias="hasPrev")
-
- page: int
-
- pages: int
-
- page_size: int = FieldInfo(alias="pageSize")
-
- total: int
diff --git a/src/mobilerun_sdk/types/shared_params/device_spec.py b/src/mobilerun_sdk/types/shared_params/device_spec.py
index 7d1a43e..90a7c89 100644
--- a/src/mobilerun_sdk/types/shared_params/device_spec.py
+++ b/src/mobilerun_sdk/types/shared_params/device_spec.py
@@ -5,22 +5,14 @@
from typing import Optional
from typing_extensions import Annotated, TypedDict
-from .socks5 import Socks5
from ..._types import SequenceNotStr
from ..._utils import PropertyInfo
from .location import Location
from .device_carrier import DeviceCarrier
from .device_identifiers import DeviceIdentifiers
+from ..proxy_config_param import ProxyConfigParam
-__all__ = ["DeviceSpec", "Proxy"]
-
-
-class Proxy(TypedDict, total=False):
- name: str
-
- smart_ip: Annotated[bool, PropertyInfo(alias="smartIp")]
-
- socks5: Socks5
+__all__ = ["DeviceSpec"]
class DeviceSpec(TypedDict, total=False):
@@ -42,6 +34,6 @@ class DeviceSpec(TypedDict, total=False):
name: str
- proxy: Proxy
+ proxy: ProxyConfigParam
timezone: str
diff --git a/tests/api_resources/credentials/__init__.py b/tests/api_resources/credentials/__init__.py
deleted file mode 100644
index fd8019a..0000000
--- a/tests/api_resources/credentials/__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/credentials/packages/__init__.py b/tests/api_resources/credentials/packages/__init__.py
deleted file mode 100644
index fd8019a..0000000
--- a/tests/api_resources/credentials/packages/__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/credentials/packages/credentials/__init__.py b/tests/api_resources/credentials/packages/credentials/__init__.py
deleted file mode 100644
index fd8019a..0000000
--- a/tests/api_resources/credentials/packages/credentials/__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/credentials/packages/credentials/test_fields.py b/tests/api_resources/credentials/packages/credentials/test_fields.py
deleted file mode 100644
index b16a174..0000000
--- a/tests/api_resources/credentials/packages/credentials/test_fields.py
+++ /dev/null
@@ -1,390 +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.credentials.packages.credentials import (
- FieldCreateResponse,
- FieldDeleteResponse,
- FieldUpdateResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestFields:
- 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_create(self, client: Mobilerun) -> None:
- field = client.credentials.packages.credentials.fields.create(
- credential_name="credentialName",
- package_name="packageName",
- field_type="email",
- value="x",
- )
- assert_matches_type(FieldCreateResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_create(self, client: Mobilerun) -> None:
- response = client.credentials.packages.credentials.fields.with_raw_response.create(
- credential_name="credentialName",
- package_name="packageName",
- field_type="email",
- value="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- field = response.parse()
- assert_matches_type(FieldCreateResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_create(self, client: Mobilerun) -> None:
- with client.credentials.packages.credentials.fields.with_streaming_response.create(
- credential_name="credentialName",
- package_name="packageName",
- field_type="email",
- value="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- field = response.parse()
- assert_matches_type(FieldCreateResponse, field, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_create(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- client.credentials.packages.credentials.fields.with_raw_response.create(
- credential_name="credentialName",
- package_name="",
- field_type="email",
- value="x",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- client.credentials.packages.credentials.fields.with_raw_response.create(
- credential_name="",
- package_name="packageName",
- field_type="email",
- value="x",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update(self, client: Mobilerun) -> None:
- field = client.credentials.packages.credentials.fields.update(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- value="x",
- )
- assert_matches_type(FieldUpdateResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_update(self, client: Mobilerun) -> None:
- response = client.credentials.packages.credentials.fields.with_raw_response.update(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- value="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- field = response.parse()
- assert_matches_type(FieldUpdateResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_update(self, client: Mobilerun) -> None:
- with client.credentials.packages.credentials.fields.with_streaming_response.update(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- value="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- field = response.parse()
- assert_matches_type(FieldUpdateResponse, field, 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 `package_name` but received ''"):
- client.credentials.packages.credentials.fields.with_raw_response.update(
- field_type="email",
- package_name="",
- credential_name="credentialName",
- value="x",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- client.credentials.packages.credentials.fields.with_raw_response.update(
- field_type="email",
- package_name="packageName",
- credential_name="",
- value="x",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_delete(self, client: Mobilerun) -> None:
- field = client.credentials.packages.credentials.fields.delete(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- )
- assert_matches_type(FieldDeleteResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_delete(self, client: Mobilerun) -> None:
- response = client.credentials.packages.credentials.fields.with_raw_response.delete(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- field = response.parse()
- assert_matches_type(FieldDeleteResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_delete(self, client: Mobilerun) -> None:
- with client.credentials.packages.credentials.fields.with_streaming_response.delete(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- field = response.parse()
- assert_matches_type(FieldDeleteResponse, field, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_delete(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- client.credentials.packages.credentials.fields.with_raw_response.delete(
- field_type="email",
- package_name="",
- credential_name="credentialName",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- client.credentials.packages.credentials.fields.with_raw_response.delete(
- field_type="email",
- package_name="packageName",
- credential_name="",
- )
-
-
-class TestAsyncFields:
- 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_create(self, async_client: AsyncMobilerun) -> None:
- field = await async_client.credentials.packages.credentials.fields.create(
- credential_name="credentialName",
- package_name="packageName",
- field_type="email",
- value="x",
- )
- assert_matches_type(FieldCreateResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_create(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.credentials.packages.credentials.fields.with_raw_response.create(
- credential_name="credentialName",
- package_name="packageName",
- field_type="email",
- value="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- field = await response.parse()
- assert_matches_type(FieldCreateResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_create(self, async_client: AsyncMobilerun) -> None:
- async with async_client.credentials.packages.credentials.fields.with_streaming_response.create(
- credential_name="credentialName",
- package_name="packageName",
- field_type="email",
- value="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- field = await response.parse()
- assert_matches_type(FieldCreateResponse, field, 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_create(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- await async_client.credentials.packages.credentials.fields.with_raw_response.create(
- credential_name="credentialName",
- package_name="",
- field_type="email",
- value="x",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- await async_client.credentials.packages.credentials.fields.with_raw_response.create(
- credential_name="",
- package_name="packageName",
- field_type="email",
- value="x",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update(self, async_client: AsyncMobilerun) -> None:
- field = await async_client.credentials.packages.credentials.fields.update(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- value="x",
- )
- assert_matches_type(FieldUpdateResponse, field, 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.credentials.packages.credentials.fields.with_raw_response.update(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- value="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- field = await response.parse()
- assert_matches_type(FieldUpdateResponse, field, 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.credentials.packages.credentials.fields.with_streaming_response.update(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- value="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- field = await response.parse()
- assert_matches_type(FieldUpdateResponse, field, 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 `package_name` but received ''"):
- await async_client.credentials.packages.credentials.fields.with_raw_response.update(
- field_type="email",
- package_name="",
- credential_name="credentialName",
- value="x",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- await async_client.credentials.packages.credentials.fields.with_raw_response.update(
- field_type="email",
- package_name="packageName",
- credential_name="",
- value="x",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_delete(self, async_client: AsyncMobilerun) -> None:
- field = await async_client.credentials.packages.credentials.fields.delete(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- )
- assert_matches_type(FieldDeleteResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_delete(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.credentials.packages.credentials.fields.with_raw_response.delete(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- field = await response.parse()
- assert_matches_type(FieldDeleteResponse, field, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_delete(self, async_client: AsyncMobilerun) -> None:
- async with async_client.credentials.packages.credentials.fields.with_streaming_response.delete(
- field_type="email",
- package_name="packageName",
- credential_name="credentialName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- field = await response.parse()
- assert_matches_type(FieldDeleteResponse, field, 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_delete(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- await async_client.credentials.packages.credentials.fields.with_raw_response.delete(
- field_type="email",
- package_name="",
- credential_name="credentialName",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- await async_client.credentials.packages.credentials.fields.with_raw_response.delete(
- field_type="email",
- package_name="packageName",
- credential_name="",
- )
diff --git a/tests/api_resources/credentials/packages/test_credentials.py b/tests/api_resources/credentials/packages/test_credentials.py
deleted file mode 100644
index 991d557..0000000
--- a/tests/api_resources/credentials/packages/test_credentials.py
+++ /dev/null
@@ -1,376 +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.credentials.packages import (
- CredentialCreateResponse,
- CredentialDeleteResponse,
- CredentialRetrieveResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestCredentials:
- 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_create(self, client: Mobilerun) -> None:
- credential = client.credentials.packages.credentials.create(
- package_name="packageName",
- credential_name="26f1kl_-n-71",
- fields=[
- {
- "field_type": "email",
- "value": "x",
- }
- ],
- )
- assert_matches_type(CredentialCreateResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_create(self, client: Mobilerun) -> None:
- response = client.credentials.packages.credentials.with_raw_response.create(
- package_name="packageName",
- credential_name="26f1kl_-n-71",
- fields=[
- {
- "field_type": "email",
- "value": "x",
- }
- ],
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- credential = response.parse()
- assert_matches_type(CredentialCreateResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_create(self, client: Mobilerun) -> None:
- with client.credentials.packages.credentials.with_streaming_response.create(
- package_name="packageName",
- credential_name="26f1kl_-n-71",
- fields=[
- {
- "field_type": "email",
- "value": "x",
- }
- ],
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- credential = response.parse()
- assert_matches_type(CredentialCreateResponse, credential, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_create(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- client.credentials.packages.credentials.with_raw_response.create(
- package_name="",
- credential_name="26f1kl_-n-71",
- fields=[
- {
- "field_type": "email",
- "value": "x",
- }
- ],
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve(self, client: Mobilerun) -> None:
- credential = client.credentials.packages.credentials.retrieve(
- credential_name="credentialName",
- package_name="packageName",
- )
- assert_matches_type(CredentialRetrieveResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve(self, client: Mobilerun) -> None:
- response = client.credentials.packages.credentials.with_raw_response.retrieve(
- credential_name="credentialName",
- package_name="packageName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- credential = response.parse()
- assert_matches_type(CredentialRetrieveResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve(self, client: Mobilerun) -> None:
- with client.credentials.packages.credentials.with_streaming_response.retrieve(
- credential_name="credentialName",
- package_name="packageName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- credential = response.parse()
- assert_matches_type(CredentialRetrieveResponse, credential, 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 `package_name` but received ''"):
- client.credentials.packages.credentials.with_raw_response.retrieve(
- credential_name="credentialName",
- package_name="",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- client.credentials.packages.credentials.with_raw_response.retrieve(
- credential_name="",
- package_name="packageName",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_delete(self, client: Mobilerun) -> None:
- credential = client.credentials.packages.credentials.delete(
- credential_name="credentialName",
- package_name="packageName",
- )
- assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_delete(self, client: Mobilerun) -> None:
- response = client.credentials.packages.credentials.with_raw_response.delete(
- credential_name="credentialName",
- package_name="packageName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- credential = response.parse()
- assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_delete(self, client: Mobilerun) -> None:
- with client.credentials.packages.credentials.with_streaming_response.delete(
- credential_name="credentialName",
- package_name="packageName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- credential = response.parse()
- assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_delete(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- client.credentials.packages.credentials.with_raw_response.delete(
- credential_name="credentialName",
- package_name="",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- client.credentials.packages.credentials.with_raw_response.delete(
- credential_name="",
- package_name="packageName",
- )
-
-
-class TestAsyncCredentials:
- 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_create(self, async_client: AsyncMobilerun) -> None:
- credential = await async_client.credentials.packages.credentials.create(
- package_name="packageName",
- credential_name="26f1kl_-n-71",
- fields=[
- {
- "field_type": "email",
- "value": "x",
- }
- ],
- )
- assert_matches_type(CredentialCreateResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_create(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.credentials.packages.credentials.with_raw_response.create(
- package_name="packageName",
- credential_name="26f1kl_-n-71",
- fields=[
- {
- "field_type": "email",
- "value": "x",
- }
- ],
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- credential = await response.parse()
- assert_matches_type(CredentialCreateResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_create(self, async_client: AsyncMobilerun) -> None:
- async with async_client.credentials.packages.credentials.with_streaming_response.create(
- package_name="packageName",
- credential_name="26f1kl_-n-71",
- fields=[
- {
- "field_type": "email",
- "value": "x",
- }
- ],
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- credential = await response.parse()
- assert_matches_type(CredentialCreateResponse, credential, 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_create(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- await async_client.credentials.packages.credentials.with_raw_response.create(
- package_name="",
- credential_name="26f1kl_-n-71",
- fields=[
- {
- "field_type": "email",
- "value": "x",
- }
- ],
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncMobilerun) -> None:
- credential = await async_client.credentials.packages.credentials.retrieve(
- credential_name="credentialName",
- package_name="packageName",
- )
- assert_matches_type(CredentialRetrieveResponse, credential, 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.credentials.packages.credentials.with_raw_response.retrieve(
- credential_name="credentialName",
- package_name="packageName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- credential = await response.parse()
- assert_matches_type(CredentialRetrieveResponse, credential, 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.credentials.packages.credentials.with_streaming_response.retrieve(
- credential_name="credentialName",
- package_name="packageName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- credential = await response.parse()
- assert_matches_type(CredentialRetrieveResponse, credential, 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 `package_name` but received ''"):
- await async_client.credentials.packages.credentials.with_raw_response.retrieve(
- credential_name="credentialName",
- package_name="",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- await async_client.credentials.packages.credentials.with_raw_response.retrieve(
- credential_name="",
- package_name="packageName",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_delete(self, async_client: AsyncMobilerun) -> None:
- credential = await async_client.credentials.packages.credentials.delete(
- credential_name="credentialName",
- package_name="packageName",
- )
- assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_delete(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.credentials.packages.credentials.with_raw_response.delete(
- credential_name="credentialName",
- package_name="packageName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- credential = await response.parse()
- assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_delete(self, async_client: AsyncMobilerun) -> None:
- async with async_client.credentials.packages.credentials.with_streaming_response.delete(
- credential_name="credentialName",
- package_name="packageName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- credential = await response.parse()
- assert_matches_type(CredentialDeleteResponse, credential, 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_delete(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- await async_client.credentials.packages.credentials.with_raw_response.delete(
- credential_name="credentialName",
- package_name="",
- )
-
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
- await async_client.credentials.packages.credentials.with_raw_response.delete(
- credential_name="",
- package_name="packageName",
- )
diff --git a/tests/api_resources/credentials/test_packages.py b/tests/api_resources/credentials/test_packages.py
deleted file mode 100644
index fe14887..0000000
--- a/tests/api_resources/credentials/test_packages.py
+++ /dev/null
@@ -1,176 +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.credentials import PackageListResponse, PackageCreateResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestPackages:
- 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_create(self, client: Mobilerun) -> None:
- package = client.credentials.packages.create(
- package_name="packageName",
- )
- assert_matches_type(PackageCreateResponse, package, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_create(self, client: Mobilerun) -> None:
- response = client.credentials.packages.with_raw_response.create(
- package_name="packageName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- package = response.parse()
- assert_matches_type(PackageCreateResponse, package, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_create(self, client: Mobilerun) -> None:
- with client.credentials.packages.with_streaming_response.create(
- package_name="packageName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- package = response.parse()
- assert_matches_type(PackageCreateResponse, package, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: Mobilerun) -> None:
- package = client.credentials.packages.list(
- "packageName",
- )
- assert_matches_type(PackageListResponse, package, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: Mobilerun) -> None:
- response = client.credentials.packages.with_raw_response.list(
- "packageName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- package = response.parse()
- assert_matches_type(PackageListResponse, package, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: Mobilerun) -> None:
- with client.credentials.packages.with_streaming_response.list(
- "packageName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- package = response.parse()
- assert_matches_type(PackageListResponse, package, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_list(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- client.credentials.packages.with_raw_response.list(
- "",
- )
-
-
-class TestAsyncPackages:
- 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_create(self, async_client: AsyncMobilerun) -> None:
- package = await async_client.credentials.packages.create(
- package_name="packageName",
- )
- assert_matches_type(PackageCreateResponse, package, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_create(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.credentials.packages.with_raw_response.create(
- package_name="packageName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- package = await response.parse()
- assert_matches_type(PackageCreateResponse, package, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_create(self, async_client: AsyncMobilerun) -> None:
- async with async_client.credentials.packages.with_streaming_response.create(
- package_name="packageName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- package = await response.parse()
- assert_matches_type(PackageCreateResponse, package, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncMobilerun) -> None:
- package = await async_client.credentials.packages.list(
- "packageName",
- )
- assert_matches_type(PackageListResponse, package, 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.credentials.packages.with_raw_response.list(
- "packageName",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- package = await response.parse()
- assert_matches_type(PackageListResponse, package, 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.credentials.packages.with_streaming_response.list(
- "packageName",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- package = await response.parse()
- assert_matches_type(PackageListResponse, package, 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_list(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
- await async_client.credentials.packages.with_raw_response.list(
- "",
- )
diff --git a/tests/api_resources/test_apps.py b/tests/api_resources/test_apps.py
deleted file mode 100644
index 7fd88df..0000000
--- a/tests/api_resources/test_apps.py
+++ /dev/null
@@ -1,712 +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 (
- AppListResponse,
- AppDeleteResponse,
- AppRetrieveResponse,
- AppMarkFailedResponse,
- AppListVersionsResponse,
- AppConfirmUploadResponse,
- AppCreateSignedUploadURLResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestApps:
- 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:
- app = client.apps.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppRetrieveResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve(self, client: Mobilerun) -> None:
- response = client.apps.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"
- app = response.parse()
- assert_matches_type(AppRetrieveResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve(self, client: Mobilerun) -> None:
- with client.apps.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"
-
- app = response.parse()
- assert_matches_type(AppRetrieveResponse, app, 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 `id` but received ''"):
- client.apps.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: Mobilerun) -> None:
- app = client.apps.list()
- assert_matches_type(AppListResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: Mobilerun) -> None:
- app = client.apps.list(
- order="asc",
- page=1,
- page_size=1,
- platform="all",
- query="query",
- sort_by="createdAt",
- status="all",
- )
- assert_matches_type(AppListResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: Mobilerun) -> None:
- response = client.apps.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = response.parse()
- assert_matches_type(AppListResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: Mobilerun) -> None:
- with client.apps.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = response.parse()
- assert_matches_type(AppListResponse, app, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_delete(self, client: Mobilerun) -> None:
- app = client.apps.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppDeleteResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_delete(self, client: Mobilerun) -> None:
- response = client.apps.with_raw_response.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = response.parse()
- assert_matches_type(AppDeleteResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_delete(self, client: Mobilerun) -> None:
- with client.apps.with_streaming_response.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = response.parse()
- assert_matches_type(AppDeleteResponse, app, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_delete(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- client.apps.with_raw_response.delete(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_confirm_upload(self, client: Mobilerun) -> None:
- app = client.apps.confirm_upload(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_confirm_upload(self, client: Mobilerun) -> None:
- response = client.apps.with_raw_response.confirm_upload(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = response.parse()
- assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_confirm_upload(self, client: Mobilerun) -> None:
- with client.apps.with_streaming_response.confirm_upload(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = response.parse()
- assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_confirm_upload(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- client.apps.with_raw_response.confirm_upload(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_create_signed_upload_url(self, client: Mobilerun) -> None:
- app = client.apps.create_signed_upload_url(
- bundle_id="x",
- display_name="x",
- files=[
- {
- "content_type": "x",
- "file_name": "x",
- }
- ],
- size_bytes=0,
- version_code=0,
- version_name="x",
- )
- assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_create_signed_upload_url_with_all_params(self, client: Mobilerun) -> None:
- app = client.apps.create_signed_upload_url(
- bundle_id="x",
- display_name="x",
- files=[
- {
- "content_type": "x",
- "file_name": "x",
- }
- ],
- size_bytes=0,
- version_code=0,
- version_name="x",
- country="US",
- description="description",
- developer_name="developerName",
- icon_url="iconURL",
- platform="android",
- target_sdk=0,
- )
- assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_create_signed_upload_url(self, client: Mobilerun) -> None:
- response = client.apps.with_raw_response.create_signed_upload_url(
- bundle_id="x",
- display_name="x",
- files=[
- {
- "content_type": "x",
- "file_name": "x",
- }
- ],
- size_bytes=0,
- version_code=0,
- version_name="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = response.parse()
- assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_create_signed_upload_url(self, client: Mobilerun) -> None:
- with client.apps.with_streaming_response.create_signed_upload_url(
- bundle_id="x",
- display_name="x",
- files=[
- {
- "content_type": "x",
- "file_name": "x",
- }
- ],
- size_bytes=0,
- version_code=0,
- version_name="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = response.parse()
- assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_versions(self, client: Mobilerun) -> None:
- app = client.apps.list_versions(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppListVersionsResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list_versions(self, client: Mobilerun) -> None:
- response = client.apps.with_raw_response.list_versions(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = response.parse()
- assert_matches_type(AppListVersionsResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list_versions(self, client: Mobilerun) -> None:
- with client.apps.with_streaming_response.list_versions(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = response.parse()
- assert_matches_type(AppListVersionsResponse, app, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_list_versions(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- client.apps.with_raw_response.list_versions(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_mark_failed(self, client: Mobilerun) -> None:
- app = client.apps.mark_failed(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppMarkFailedResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_mark_failed(self, client: Mobilerun) -> None:
- response = client.apps.with_raw_response.mark_failed(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = response.parse()
- assert_matches_type(AppMarkFailedResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_mark_failed(self, client: Mobilerun) -> None:
- with client.apps.with_streaming_response.mark_failed(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = response.parse()
- assert_matches_type(AppMarkFailedResponse, app, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_mark_failed(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- client.apps.with_raw_response.mark_failed(
- "",
- )
-
-
-class TestAsyncApps:
- 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:
- app = await async_client.apps.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppRetrieveResponse, app, 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.apps.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"
- app = await response.parse()
- assert_matches_type(AppRetrieveResponse, app, 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.apps.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"
-
- app = await response.parse()
- assert_matches_type(AppRetrieveResponse, app, 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 `id` but received ''"):
- await async_client.apps.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncMobilerun) -> None:
- app = await async_client.apps.list()
- assert_matches_type(AppListResponse, app, 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:
- app = await async_client.apps.list(
- order="asc",
- page=1,
- page_size=1,
- platform="all",
- query="query",
- sort_by="createdAt",
- status="all",
- )
- assert_matches_type(AppListResponse, app, 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.apps.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = await response.parse()
- assert_matches_type(AppListResponse, app, 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.apps.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = await response.parse()
- assert_matches_type(AppListResponse, app, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_delete(self, async_client: AsyncMobilerun) -> None:
- app = await async_client.apps.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppDeleteResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_delete(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.apps.with_raw_response.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = await response.parse()
- assert_matches_type(AppDeleteResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_delete(self, async_client: AsyncMobilerun) -> None:
- async with async_client.apps.with_streaming_response.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = await response.parse()
- assert_matches_type(AppDeleteResponse, app, 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_delete(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- await async_client.apps.with_raw_response.delete(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_confirm_upload(self, async_client: AsyncMobilerun) -> None:
- app = await async_client.apps.confirm_upload(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_confirm_upload(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.apps.with_raw_response.confirm_upload(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = await response.parse()
- assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_confirm_upload(self, async_client: AsyncMobilerun) -> None:
- async with async_client.apps.with_streaming_response.confirm_upload(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = await response.parse()
- assert_matches_type(AppConfirmUploadResponse, app, 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_confirm_upload(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- await async_client.apps.with_raw_response.confirm_upload(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_create_signed_upload_url(self, async_client: AsyncMobilerun) -> None:
- app = await async_client.apps.create_signed_upload_url(
- bundle_id="x",
- display_name="x",
- files=[
- {
- "content_type": "x",
- "file_name": "x",
- }
- ],
- size_bytes=0,
- version_code=0,
- version_name="x",
- )
- assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_create_signed_upload_url_with_all_params(self, async_client: AsyncMobilerun) -> None:
- app = await async_client.apps.create_signed_upload_url(
- bundle_id="x",
- display_name="x",
- files=[
- {
- "content_type": "x",
- "file_name": "x",
- }
- ],
- size_bytes=0,
- version_code=0,
- version_name="x",
- country="US",
- description="description",
- developer_name="developerName",
- icon_url="iconURL",
- platform="android",
- target_sdk=0,
- )
- assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_create_signed_upload_url(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.apps.with_raw_response.create_signed_upload_url(
- bundle_id="x",
- display_name="x",
- files=[
- {
- "content_type": "x",
- "file_name": "x",
- }
- ],
- size_bytes=0,
- version_code=0,
- version_name="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = await response.parse()
- assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_create_signed_upload_url(self, async_client: AsyncMobilerun) -> None:
- async with async_client.apps.with_streaming_response.create_signed_upload_url(
- bundle_id="x",
- display_name="x",
- files=[
- {
- "content_type": "x",
- "file_name": "x",
- }
- ],
- size_bytes=0,
- version_code=0,
- version_name="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = await response.parse()
- assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list_versions(self, async_client: AsyncMobilerun) -> None:
- app = await async_client.apps.list_versions(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppListVersionsResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_list_versions(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.apps.with_raw_response.list_versions(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = await response.parse()
- assert_matches_type(AppListVersionsResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_list_versions(self, async_client: AsyncMobilerun) -> None:
- async with async_client.apps.with_streaming_response.list_versions(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = await response.parse()
- assert_matches_type(AppListVersionsResponse, app, 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_list_versions(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- await async_client.apps.with_raw_response.list_versions(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_mark_failed(self, async_client: AsyncMobilerun) -> None:
- app = await async_client.apps.mark_failed(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(AppMarkFailedResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_mark_failed(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.apps.with_raw_response.mark_failed(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- app = await response.parse()
- assert_matches_type(AppMarkFailedResponse, app, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_mark_failed(self, async_client: AsyncMobilerun) -> None:
- async with async_client.apps.with_streaming_response.mark_failed(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- app = await response.parse()
- assert_matches_type(AppMarkFailedResponse, app, 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_mark_failed(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- await async_client.apps.with_raw_response.mark_failed(
- "",
- )
diff --git a/tests/api_resources/test_credentials.py b/tests/api_resources/test_credentials.py
deleted file mode 100644
index d125d22..0000000
--- a/tests/api_resources/test_credentials.py
+++ /dev/null
@@ -1,98 +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 CredentialListResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestCredentials:
- 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:
- credential = client.credentials.list()
- assert_matches_type(CredentialListResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: Mobilerun) -> None:
- credential = client.credentials.list(
- page=1,
- page_size=1,
- )
- assert_matches_type(CredentialListResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: Mobilerun) -> None:
- response = client.credentials.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- credential = response.parse()
- assert_matches_type(CredentialListResponse, credential, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: Mobilerun) -> None:
- with client.credentials.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- credential = response.parse()
- assert_matches_type(CredentialListResponse, credential, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
-
-class TestAsyncCredentials:
- 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:
- credential = await async_client.credentials.list()
- assert_matches_type(CredentialListResponse, credential, 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:
- credential = await async_client.credentials.list(
- page=1,
- page_size=1,
- )
- assert_matches_type(CredentialListResponse, credential, 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.credentials.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- credential = await response.parse()
- assert_matches_type(CredentialListResponse, credential, 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.credentials.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- credential = await response.parse()
- assert_matches_type(CredentialListResponse, credential, path=["response"])
-
- assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_proxies.py b/tests/api_resources/test_proxies.py
index b96cc4d..1a6fc78 100644
--- a/tests/api_resources/test_proxies.py
+++ b/tests/api_resources/test_proxies.py
@@ -9,14 +9,7 @@
from tests.utils import assert_matches_type
from mobilerun_sdk import Mobilerun, AsyncMobilerun
-from mobilerun_sdk.types import (
- ProxyListResponse,
- ProxyCreateResponse,
- ProxyDeleteResponse,
- ProxyLookupResponse,
- ProxyUpdateResponse,
- ProxyRetrieveResponse,
-)
+from mobilerun_sdk.types import ProxyLookupResponse
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -24,335 +17,6 @@
class TestProxies:
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_create_overload_1(self, client: Mobilerun) -> None:
- proxy = client.proxies.create(
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_create_overload_1(self, client: Mobilerun) -> None:
- response = client.proxies.with_raw_response.create(
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = response.parse()
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_create_overload_1(self, client: Mobilerun) -> None:
- with client.proxies.with_streaming_response.create(
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = response.parse()
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_create_overload_2(self, client: Mobilerun) -> None:
- proxy = client.proxies.create(
- config="x",
- name="xxx",
- protocol="wireguard",
- )
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_create_overload_2(self, client: Mobilerun) -> None:
- response = client.proxies.with_raw_response.create(
- config="x",
- name="xxx",
- protocol="wireguard",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = response.parse()
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_create_overload_2(self, client: Mobilerun) -> None:
- with client.proxies.with_streaming_response.create(
- config="x",
- name="xxx",
- protocol="wireguard",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = response.parse()
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve(self, client: Mobilerun) -> None:
- proxy = client.proxies.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(ProxyRetrieveResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve(self, client: Mobilerun) -> None:
- response = client.proxies.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"
- proxy = response.parse()
- assert_matches_type(ProxyRetrieveResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve(self, client: Mobilerun) -> None:
- with client.proxies.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"
-
- proxy = response.parse()
- assert_matches_type(ProxyRetrieveResponse, proxy, 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 `proxy_id` but received ''"):
- client.proxies.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update_overload_1(self, client: Mobilerun) -> None:
- proxy = client.proxies.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
- assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_update_overload_1(self, client: Mobilerun) -> None:
- response = client.proxies.with_raw_response.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = response.parse()
- assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_update_overload_1(self, client: Mobilerun) -> None:
- with client.proxies.with_streaming_response.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = response.parse()
- assert_matches_type(ProxyUpdateResponse, proxy, 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_overload_1(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
- client.proxies.with_raw_response.update(
- proxy_id="",
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_update_overload_2(self, client: Mobilerun) -> None:
- proxy = client.proxies.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- config="x",
- name="xxx",
- protocol="wireguard",
- )
- assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_update_overload_2(self, client: Mobilerun) -> None:
- response = client.proxies.with_raw_response.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- config="x",
- name="xxx",
- protocol="wireguard",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = response.parse()
- assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_update_overload_2(self, client: Mobilerun) -> None:
- with client.proxies.with_streaming_response.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- config="x",
- name="xxx",
- protocol="wireguard",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = response.parse()
- assert_matches_type(ProxyUpdateResponse, proxy, 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_overload_2(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
- client.proxies.with_raw_response.update(
- proxy_id="",
- config="x",
- name="xxx",
- protocol="wireguard",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list(self, client: Mobilerun) -> None:
- proxy = client.proxies.list()
- assert_matches_type(ProxyListResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_list_with_all_params(self, client: Mobilerun) -> None:
- proxy = client.proxies.list(
- protocol="socks5",
- )
- assert_matches_type(ProxyListResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_list(self, client: Mobilerun) -> None:
- response = client.proxies.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = response.parse()
- assert_matches_type(ProxyListResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_list(self, client: Mobilerun) -> None:
- with client.proxies.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = response.parse()
- assert_matches_type(ProxyListResponse, proxy, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_delete(self, client: Mobilerun) -> None:
- proxy = client.proxies.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_delete(self, client: Mobilerun) -> None:
- response = client.proxies.with_raw_response.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = response.parse()
- assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_delete(self, client: Mobilerun) -> None:
- with client.proxies.with_streaming_response.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = response.parse()
- assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_path_params_delete(self, client: Mobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
- client.proxies.with_raw_response.delete(
- "",
- )
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_lookup(self, client: Mobilerun) -> None:
@@ -415,335 +79,6 @@ class TestAsyncProxies:
"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_create_overload_1(self, async_client: AsyncMobilerun) -> None:
- proxy = await async_client.proxies.create(
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_create_overload_1(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.proxies.with_raw_response.create(
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = await response.parse()
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_create_overload_1(self, async_client: AsyncMobilerun) -> None:
- async with async_client.proxies.with_streaming_response.create(
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = await response.parse()
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_create_overload_2(self, async_client: AsyncMobilerun) -> None:
- proxy = await async_client.proxies.create(
- config="x",
- name="xxx",
- protocol="wireguard",
- )
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_create_overload_2(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.proxies.with_raw_response.create(
- config="x",
- name="xxx",
- protocol="wireguard",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = await response.parse()
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_create_overload_2(self, async_client: AsyncMobilerun) -> None:
- async with async_client.proxies.with_streaming_response.create(
- config="x",
- name="xxx",
- protocol="wireguard",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = await response.parse()
- assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncMobilerun) -> None:
- proxy = await async_client.proxies.retrieve(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(ProxyRetrieveResponse, proxy, 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.proxies.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"
- proxy = await response.parse()
- assert_matches_type(ProxyRetrieveResponse, proxy, 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.proxies.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"
-
- proxy = await response.parse()
- assert_matches_type(ProxyRetrieveResponse, proxy, 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 `proxy_id` but received ''"):
- await async_client.proxies.with_raw_response.retrieve(
- "",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update_overload_1(self, async_client: AsyncMobilerun) -> None:
- proxy = await async_client.proxies.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
- assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_update_overload_1(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.proxies.with_raw_response.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = await response.parse()
- assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_update_overload_1(self, async_client: AsyncMobilerun) -> None:
- async with async_client.proxies.with_streaming_response.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = await response.parse()
- assert_matches_type(ProxyUpdateResponse, proxy, 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_overload_1(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
- await async_client.proxies.with_raw_response.update(
- proxy_id="",
- host="x",
- name="xxx",
- password="x",
- port=1,
- protocol="socks5",
- user="x",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_update_overload_2(self, async_client: AsyncMobilerun) -> None:
- proxy = await async_client.proxies.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- config="x",
- name="xxx",
- protocol="wireguard",
- )
- assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_update_overload_2(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.proxies.with_raw_response.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- config="x",
- name="xxx",
- protocol="wireguard",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = await response.parse()
- assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_update_overload_2(self, async_client: AsyncMobilerun) -> None:
- async with async_client.proxies.with_streaming_response.update(
- proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- config="x",
- name="xxx",
- protocol="wireguard",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = await response.parse()
- assert_matches_type(ProxyUpdateResponse, proxy, 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_overload_2(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
- await async_client.proxies.with_raw_response.update(
- proxy_id="",
- config="x",
- name="xxx",
- protocol="wireguard",
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_list(self, async_client: AsyncMobilerun) -> None:
- proxy = await async_client.proxies.list()
- assert_matches_type(ProxyListResponse, proxy, 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:
- proxy = await async_client.proxies.list(
- protocol="socks5",
- )
- assert_matches_type(ProxyListResponse, proxy, 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.proxies.with_raw_response.list()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = await response.parse()
- assert_matches_type(ProxyListResponse, proxy, 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.proxies.with_streaming_response.list() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = await response.parse()
- assert_matches_type(ProxyListResponse, proxy, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_delete(self, async_client: AsyncMobilerun) -> None:
- proxy = await async_client.proxies.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
- assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_delete(self, async_client: AsyncMobilerun) -> None:
- response = await async_client.proxies.with_raw_response.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- proxy = await response.parse()
- assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_delete(self, async_client: AsyncMobilerun) -> None:
- async with async_client.proxies.with_streaming_response.delete(
- "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- proxy = await response.parse()
- assert_matches_type(ProxyDeleteResponse, proxy, 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_delete(self, async_client: AsyncMobilerun) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
- await async_client.proxies.with_raw_response.delete(
- "",
- )
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_method_lookup(self, async_client: AsyncMobilerun) -> None:
From 472689f40d0225edcedb331fabda5d9b5ddbe390 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 30 May 2026 12:59:06 +0000
Subject: [PATCH 5/7] feat(api): api update
---
.stats.yml | 6 +-
api.md | 104 ++-
src/mobilerun_sdk/_client.py | 112 ++-
src/mobilerun_sdk/resources/__init__.py | 28 +
src/mobilerun_sdk/resources/apps.py | 748 ++++++++++++++++++
src/mobilerun_sdk/resources/carriers.py | 4 +
.../resources/credentials/__init__.py | 33 +
.../resources/credentials/credentials.py | 225 ++++++
.../credentials/packages/__init__.py | 33 +
.../packages/credentials/__init__.py | 33 +
.../packages/credentials/credentials.py | 413 ++++++++++
.../packages/credentials/fields.py | 421 ++++++++++
.../credentials/packages/packages.py | 284 +++++++
.../resources/devices/devices.py | 18 +-
src/mobilerun_sdk/resources/devices/tasks.py | 4 +
src/mobilerun_sdk/resources/hooks.py | 4 -
src/mobilerun_sdk/resources/models.py | 4 +
src/mobilerun_sdk/resources/proxies.py | 677 +++++++++++++++-
src/mobilerun_sdk/types/__init__.py | 21 +-
.../types/app_confirm_upload_response.py | 13 +
.../app_create_signed_upload_url_params.py | 43 +
.../app_create_signed_upload_url_response.py | 26 +
.../types/app_delete_response.py | 13 +
src/mobilerun_sdk/types/app_list_params.py | 25 +
src/mobilerun_sdk/types/app_list_response.py | 333 ++++++++
.../types/app_list_versions_response.py | 296 +++++++
.../types/app_mark_failed_response.py | 13 +
.../types/app_retrieve_response.py | 35 +
.../types/credential_list_params.py | 15 +
.../types/credential_list_response.py | 15 +
.../types/credentials/__init__.py | 4 +
.../credentials/package_create_params.py | 13 +
.../credentials/package_create_response.py | 21 +
.../credentials/package_list_response.py | 12 +
.../types/credentials/packages/__init__.py | 6 +
.../types/credentials/packages/credential.py | 30 +
.../packages/credential_create_params.py | 27 +
.../packages/credential_create_response.py | 16 +
.../packages/credential_delete_response.py | 16 +
.../packages/credential_retrieve_response.py | 10 +
.../packages/credentials/__init__.py | 6 +
.../credentials/field_create_params.py | 22 +
.../credentials/field_create_response.py | 16 +
.../credentials/field_delete_response.py | 16 +
.../credentials/field_update_params.py | 17 +
.../credentials/field_update_response.py | 16 +
.../types/device_create_params.py | 14 +-
.../types/devices/state_ui_response.py | 104 +--
src/mobilerun_sdk/types/proxy_config.py | 38 +-
src/mobilerun_sdk/types/proxy_config_param.py | 18 -
.../types/proxy_create_params.py | 33 +
.../types/proxy_create_response.py | 16 +
.../types/proxy_delete_response.py | 16 +
src/mobilerun_sdk/types/proxy_list_params.py | 11 +
.../types/proxy_list_response.py | 12 +
.../types/proxy_retrieve_response.py | 10 +
.../types/proxy_update_params.py | 33 +
.../types/proxy_update_response.py | 16 +
src/mobilerun_sdk/types/shared/__init__.py | 1 +
src/mobilerun_sdk/types/shared/device_spec.py | 14 +-
src/mobilerun_sdk/types/shared/pagination.py | 21 +
.../types/shared_params/device_spec.py | 14 +-
tests/api_resources/credentials/__init__.py | 1 +
.../credentials/packages/__init__.py | 1 +
.../packages/credentials/__init__.py | 1 +
.../packages/credentials/test_fields.py | 390 +++++++++
.../credentials/packages/test_credentials.py | 376 +++++++++
.../credentials/test_packages.py | 176 +++++
tests/api_resources/test_apps.py | 712 +++++++++++++++++
tests/api_resources/test_credentials.py | 98 +++
tests/api_resources/test_proxies.py | 667 +++++++++++++++-
71 files changed, 6878 insertions(+), 162 deletions(-)
create mode 100644 src/mobilerun_sdk/resources/apps.py
create mode 100644 src/mobilerun_sdk/resources/credentials/__init__.py
create mode 100644 src/mobilerun_sdk/resources/credentials/credentials.py
create mode 100644 src/mobilerun_sdk/resources/credentials/packages/__init__.py
create mode 100644 src/mobilerun_sdk/resources/credentials/packages/credentials/__init__.py
create mode 100644 src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py
create mode 100644 src/mobilerun_sdk/resources/credentials/packages/credentials/fields.py
create mode 100644 src/mobilerun_sdk/resources/credentials/packages/packages.py
create mode 100644 src/mobilerun_sdk/types/app_confirm_upload_response.py
create mode 100644 src/mobilerun_sdk/types/app_create_signed_upload_url_params.py
create mode 100644 src/mobilerun_sdk/types/app_create_signed_upload_url_response.py
create mode 100644 src/mobilerun_sdk/types/app_delete_response.py
create mode 100644 src/mobilerun_sdk/types/app_list_params.py
create mode 100644 src/mobilerun_sdk/types/app_list_response.py
create mode 100644 src/mobilerun_sdk/types/app_list_versions_response.py
create mode 100644 src/mobilerun_sdk/types/app_mark_failed_response.py
create mode 100644 src/mobilerun_sdk/types/app_retrieve_response.py
create mode 100644 src/mobilerun_sdk/types/credential_list_params.py
create mode 100644 src/mobilerun_sdk/types/credential_list_response.py
create mode 100644 src/mobilerun_sdk/types/credentials/package_create_params.py
create mode 100644 src/mobilerun_sdk/types/credentials/package_create_response.py
create mode 100644 src/mobilerun_sdk/types/credentials/package_list_response.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credential.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credential_create_params.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credential_create_response.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credential_delete_response.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credential_retrieve_response.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_create_params.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_create_response.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_delete_response.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_update_params.py
create mode 100644 src/mobilerun_sdk/types/credentials/packages/credentials/field_update_response.py
delete mode 100644 src/mobilerun_sdk/types/proxy_config_param.py
create mode 100644 src/mobilerun_sdk/types/proxy_create_params.py
create mode 100644 src/mobilerun_sdk/types/proxy_create_response.py
create mode 100644 src/mobilerun_sdk/types/proxy_delete_response.py
create mode 100644 src/mobilerun_sdk/types/proxy_list_params.py
create mode 100644 src/mobilerun_sdk/types/proxy_list_response.py
create mode 100644 src/mobilerun_sdk/types/proxy_retrieve_response.py
create mode 100644 src/mobilerun_sdk/types/proxy_update_params.py
create mode 100644 src/mobilerun_sdk/types/proxy_update_response.py
create mode 100644 src/mobilerun_sdk/types/shared/pagination.py
create mode 100644 tests/api_resources/credentials/__init__.py
create mode 100644 tests/api_resources/credentials/packages/__init__.py
create mode 100644 tests/api_resources/credentials/packages/credentials/__init__.py
create mode 100644 tests/api_resources/credentials/packages/credentials/test_fields.py
create mode 100644 tests/api_resources/credentials/packages/test_credentials.py
create mode 100644 tests/api_resources/credentials/test_packages.py
create mode 100644 tests/api_resources/test_apps.py
create mode 100644 tests/api_resources/test_credentials.py
diff --git a/.stats.yml b/.stats.yml
index 6e46968..6616e99 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 86
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-423b2f04c14fefe08d8c773dc2a025e7775f5ef947a2ba1d8eebbf008106c9fc.yml
-openapi_spec_hash: 7581f9f0e4fc01bad5ca519628671bab
+configured_endpoints: 107
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-506128e71e04bea5ce31fd879d4c0ac5a313fc39cf9f39acd1cbb3cee95f74ab.yml
+openapi_spec_hash: b45c764022d18add79f0516691749fa8
config_hash: 86398ea1292189c25296aefb64d3137d
diff --git a/api.md b/api.md
index 1dd0ca2..4b2c442 100644
--- a/api.md
+++ b/api.md
@@ -7,6 +7,7 @@ from mobilerun_sdk.types import (
DeviceSpec,
Location,
Meta,
+ Pagination,
PaginationMeta,
PermissionSet,
Socks5,
@@ -25,6 +26,32 @@ Methods:
- client.agents.list() -> AgentListResponse
+# Apps
+
+Types:
+
+```python
+from mobilerun_sdk.types import (
+ AppRetrieveResponse,
+ AppListResponse,
+ AppDeleteResponse,
+ AppConfirmUploadResponse,
+ AppCreateSignedUploadURLResponse,
+ AppListVersionsResponse,
+ AppMarkFailedResponse,
+)
+```
+
+Methods:
+
+- client.apps.retrieve(id) -> AppRetrieveResponse
+- client.apps.list(\*\*params) -> AppListResponse
+- client.apps.delete(id) -> AppDeleteResponse
+- client.apps.confirm_upload(id) -> AppConfirmUploadResponse
+- client.apps.create_signed_upload_url(\*\*params) -> AppCreateSignedUploadURLResponse
+- client.apps.list_versions(id) -> AppListVersionsResponse
+- client.apps.mark_failed(id) -> AppMarkFailedResponse
+
# Carriers
Types:
@@ -49,6 +76,68 @@ Methods:
- client.carriers.delete(carrier_id) -> CarrierDeleteResponse
- client.carriers.lookup(\*\*params) -> CarrierLookupResponse
+# Credentials
+
+Types:
+
+```python
+from mobilerun_sdk.types import CredentialListResponse
+```
+
+Methods:
+
+- client.credentials.list(\*\*params) -> CredentialListResponse
+
+## Packages
+
+Types:
+
+```python
+from mobilerun_sdk.types.credentials import PackageCreateResponse, PackageListResponse
+```
+
+Methods:
+
+- client.credentials.packages.create(\*\*params) -> PackageCreateResponse
+- client.credentials.packages.list(package_name) -> PackageListResponse
+
+### Credentials
+
+Types:
+
+```python
+from mobilerun_sdk.types.credentials.packages import (
+ Credential,
+ CredentialCreateResponse,
+ CredentialRetrieveResponse,
+ CredentialDeleteResponse,
+)
+```
+
+Methods:
+
+- client.credentials.packages.credentials.create(package_name, \*\*params) -> CredentialCreateResponse
+- client.credentials.packages.credentials.retrieve(credential_name, \*, package_name) -> CredentialRetrieveResponse
+- client.credentials.packages.credentials.delete(credential_name, \*, package_name) -> CredentialDeleteResponse
+
+#### Fields
+
+Types:
+
+```python
+from mobilerun_sdk.types.credentials.packages.credentials import (
+ FieldCreateResponse,
+ FieldUpdateResponse,
+ FieldDeleteResponse,
+)
+```
+
+Methods:
+
+- client.credentials.packages.credentials.fields.create(credential_name, \*, package_name, \*\*params) -> FieldCreateResponse
+- client.credentials.packages.credentials.fields.update(field_type, \*, package_name, credential_name, \*\*params) -> FieldUpdateResponse
+- client.credentials.packages.credentials.fields.delete(field_type, \*, package_name, credential_name) -> FieldDeleteResponse
+
# Devices
Types:
@@ -318,11 +407,24 @@ Methods:
Types:
```python
-from mobilerun_sdk.types import ProxyConfig, ProxyLookupResponse
+from mobilerun_sdk.types import (
+ ProxyConfig,
+ ProxyCreateResponse,
+ ProxyRetrieveResponse,
+ ProxyUpdateResponse,
+ ProxyListResponse,
+ ProxyDeleteResponse,
+ ProxyLookupResponse,
+)
```
Methods:
+- client.proxies.create(\*\*params) -> ProxyCreateResponse
+- client.proxies.retrieve(proxy_id) -> ProxyRetrieveResponse
+- client.proxies.update(proxy_id, \*\*params) -> ProxyUpdateResponse
+- client.proxies.list(\*\*params) -> ProxyListResponse
+- client.proxies.delete(proxy_id) -> ProxyDeleteResponse
- client.proxies.lookup(\*\*params) -> ProxyLookupResponse
# Tasks
diff --git a/src/mobilerun_sdk/_client.py b/src/mobilerun_sdk/_client.py
index 3816717..28b10f0 100644
--- a/src/mobilerun_sdk/_client.py
+++ b/src/mobilerun_sdk/_client.py
@@ -36,7 +36,8 @@
)
if TYPE_CHECKING:
- from .resources import hooks, tasks, agents, models, devices, proxies, carriers, profiles
+ from .resources import apps, hooks, tasks, agents, models, devices, proxies, carriers, profiles, credentials
+ from .resources.apps import AppsResource, AsyncAppsResource
from .resources.hooks import HooksResource, AsyncHooksResource
from .resources.agents import AgentsResource, AsyncAgentsResource
from .resources.models import ModelsResource, AsyncModelsResource
@@ -45,6 +46,7 @@
from .resources.profiles import ProfilesResource, AsyncProfilesResource
from .resources.tasks.tasks import TasksResource, AsyncTasksResource
from .resources.devices.devices import DevicesResource, AsyncDevicesResource
+ from .resources.credentials.credentials import CredentialsResource, AsyncCredentialsResource
__all__ = [
"Timeout",
@@ -125,12 +127,27 @@ def agents(self) -> AgentsResource:
return AgentsResource(self)
+ @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)
+
@cached_property
def devices(self) -> DevicesResource:
from .resources.devices import DevicesResource
@@ -139,13 +156,13 @@ def devices(self) -> DevicesResource:
@cached_property
def hooks(self) -> HooksResource:
- """Webhooks API"""
from .resources.hooks import HooksResource
return HooksResource(self)
@cached_property
def models(self) -> ModelsResource:
+ """LLM Models"""
from .resources.models import ModelsResource
return ModelsResource(self)
@@ -158,6 +175,7 @@ def profiles(self) -> ProfilesResource:
@cached_property
def proxies(self) -> ProxiesResource:
+ """Network Proxies"""
from .resources.proxies import ProxiesResource
return ProxiesResource(self)
@@ -360,12 +378,27 @@ def agents(self) -> AsyncAgentsResource:
return AsyncAgentsResource(self)
+ @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)
+
@cached_property
def devices(self) -> AsyncDevicesResource:
from .resources.devices import AsyncDevicesResource
@@ -374,13 +407,13 @@ def devices(self) -> AsyncDevicesResource:
@cached_property
def hooks(self) -> AsyncHooksResource:
- """Webhooks API"""
from .resources.hooks import AsyncHooksResource
return AsyncHooksResource(self)
@cached_property
def models(self) -> AsyncModelsResource:
+ """LLM Models"""
from .resources.models import AsyncModelsResource
return AsyncModelsResource(self)
@@ -393,6 +426,7 @@ def profiles(self) -> AsyncProfilesResource:
@cached_property
def proxies(self) -> AsyncProxiesResource:
+ """Network Proxies"""
from .resources.proxies import AsyncProxiesResource
return AsyncProxiesResource(self)
@@ -541,12 +575,27 @@ def agents(self) -> agents.AgentsResourceWithRawResponse:
return AgentsResourceWithRawResponse(self._client.agents)
+ @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)
+
@cached_property
def devices(self) -> devices.DevicesResourceWithRawResponse:
from .resources.devices import DevicesResourceWithRawResponse
@@ -555,13 +604,13 @@ def devices(self) -> devices.DevicesResourceWithRawResponse:
@cached_property
def hooks(self) -> hooks.HooksResourceWithRawResponse:
- """Webhooks API"""
from .resources.hooks import HooksResourceWithRawResponse
return HooksResourceWithRawResponse(self._client.hooks)
@cached_property
def models(self) -> models.ModelsResourceWithRawResponse:
+ """LLM Models"""
from .resources.models import ModelsResourceWithRawResponse
return ModelsResourceWithRawResponse(self._client.models)
@@ -574,6 +623,7 @@ def profiles(self) -> profiles.ProfilesResourceWithRawResponse:
@cached_property
def proxies(self) -> proxies.ProxiesResourceWithRawResponse:
+ """Network Proxies"""
from .resources.proxies import ProxiesResourceWithRawResponse
return ProxiesResourceWithRawResponse(self._client.proxies)
@@ -599,12 +649,27 @@ def agents(self) -> agents.AsyncAgentsResourceWithRawResponse:
return AsyncAgentsResourceWithRawResponse(self._client.agents)
+ @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)
+
@cached_property
def devices(self) -> devices.AsyncDevicesResourceWithRawResponse:
from .resources.devices import AsyncDevicesResourceWithRawResponse
@@ -613,13 +678,13 @@ def devices(self) -> devices.AsyncDevicesResourceWithRawResponse:
@cached_property
def hooks(self) -> hooks.AsyncHooksResourceWithRawResponse:
- """Webhooks API"""
from .resources.hooks import AsyncHooksResourceWithRawResponse
return AsyncHooksResourceWithRawResponse(self._client.hooks)
@cached_property
def models(self) -> models.AsyncModelsResourceWithRawResponse:
+ """LLM Models"""
from .resources.models import AsyncModelsResourceWithRawResponse
return AsyncModelsResourceWithRawResponse(self._client.models)
@@ -632,6 +697,7 @@ def profiles(self) -> profiles.AsyncProfilesResourceWithRawResponse:
@cached_property
def proxies(self) -> proxies.AsyncProxiesResourceWithRawResponse:
+ """Network Proxies"""
from .resources.proxies import AsyncProxiesResourceWithRawResponse
return AsyncProxiesResourceWithRawResponse(self._client.proxies)
@@ -657,12 +723,27 @@ def agents(self) -> agents.AgentsResourceWithStreamingResponse:
return AgentsResourceWithStreamingResponse(self._client.agents)
+ @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)
+
@cached_property
def devices(self) -> devices.DevicesResourceWithStreamingResponse:
from .resources.devices import DevicesResourceWithStreamingResponse
@@ -671,13 +752,13 @@ def devices(self) -> devices.DevicesResourceWithStreamingResponse:
@cached_property
def hooks(self) -> hooks.HooksResourceWithStreamingResponse:
- """Webhooks API"""
from .resources.hooks import HooksResourceWithStreamingResponse
return HooksResourceWithStreamingResponse(self._client.hooks)
@cached_property
def models(self) -> models.ModelsResourceWithStreamingResponse:
+ """LLM Models"""
from .resources.models import ModelsResourceWithStreamingResponse
return ModelsResourceWithStreamingResponse(self._client.models)
@@ -690,6 +771,7 @@ def profiles(self) -> profiles.ProfilesResourceWithStreamingResponse:
@cached_property
def proxies(self) -> proxies.ProxiesResourceWithStreamingResponse:
+ """Network Proxies"""
from .resources.proxies import ProxiesResourceWithStreamingResponse
return ProxiesResourceWithStreamingResponse(self._client.proxies)
@@ -715,12 +797,27 @@ def agents(self) -> agents.AsyncAgentsResourceWithStreamingResponse:
return AsyncAgentsResourceWithStreamingResponse(self._client.agents)
+ @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)
+
@cached_property
def devices(self) -> devices.AsyncDevicesResourceWithStreamingResponse:
from .resources.devices import AsyncDevicesResourceWithStreamingResponse
@@ -729,13 +826,13 @@ def devices(self) -> devices.AsyncDevicesResourceWithStreamingResponse:
@cached_property
def hooks(self) -> hooks.AsyncHooksResourceWithStreamingResponse:
- """Webhooks API"""
from .resources.hooks import AsyncHooksResourceWithStreamingResponse
return AsyncHooksResourceWithStreamingResponse(self._client.hooks)
@cached_property
def models(self) -> models.AsyncModelsResourceWithStreamingResponse:
+ """LLM Models"""
from .resources.models import AsyncModelsResourceWithStreamingResponse
return AsyncModelsResourceWithStreamingResponse(self._client.models)
@@ -748,6 +845,7 @@ 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/resources/__init__.py b/src/mobilerun_sdk/resources/__init__.py
index 9ebd59d..21f473c 100644
--- a/src/mobilerun_sdk/resources/__init__.py
+++ b/src/mobilerun_sdk/resources/__init__.py
@@ -1,5 +1,13 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+from .apps import (
+ AppsResource,
+ AsyncAppsResource,
+ AppsResourceWithRawResponse,
+ AsyncAppsResourceWithRawResponse,
+ AppsResourceWithStreamingResponse,
+ AsyncAppsResourceWithStreamingResponse,
+)
from .hooks import (
HooksResource,
AsyncHooksResource,
@@ -64,6 +72,14 @@
ProfilesResourceWithStreamingResponse,
AsyncProfilesResourceWithStreamingResponse,
)
+from .credentials import (
+ CredentialsResource,
+ AsyncCredentialsResource,
+ CredentialsResourceWithRawResponse,
+ AsyncCredentialsResourceWithRawResponse,
+ CredentialsResourceWithStreamingResponse,
+ AsyncCredentialsResourceWithStreamingResponse,
+)
__all__ = [
"AgentsResource",
@@ -72,12 +88,24 @@
"AsyncAgentsResourceWithRawResponse",
"AgentsResourceWithStreamingResponse",
"AsyncAgentsResourceWithStreamingResponse",
+ "AppsResource",
+ "AsyncAppsResource",
+ "AppsResourceWithRawResponse",
+ "AsyncAppsResourceWithRawResponse",
+ "AppsResourceWithStreamingResponse",
+ "AsyncAppsResourceWithStreamingResponse",
"CarriersResource",
"AsyncCarriersResource",
"CarriersResourceWithRawResponse",
"AsyncCarriersResourceWithRawResponse",
"CarriersResourceWithStreamingResponse",
"AsyncCarriersResourceWithStreamingResponse",
+ "CredentialsResource",
+ "AsyncCredentialsResource",
+ "CredentialsResourceWithRawResponse",
+ "AsyncCredentialsResourceWithRawResponse",
+ "CredentialsResourceWithStreamingResponse",
+ "AsyncCredentialsResourceWithStreamingResponse",
"DevicesResource",
"AsyncDevicesResource",
"DevicesResourceWithRawResponse",
diff --git a/src/mobilerun_sdk/resources/apps.py b/src/mobilerun_sdk/resources/apps.py
new file mode 100644
index 0000000..3e2bb8f
--- /dev/null
+++ b/src/mobilerun_sdk/resources/apps.py
@@ -0,0 +1,748 @@
+# 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 app_list_params, app_create_signed_upload_url_params
+from .._types import Body, Omit, Query, Headers, NotGiven, 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.app_list_response import AppListResponse
+from ..types.app_delete_response import AppDeleteResponse
+from ..types.app_retrieve_response import AppRetrieveResponse
+from ..types.app_mark_failed_response import AppMarkFailedResponse
+from ..types.app_list_versions_response import AppListVersionsResponse
+from ..types.app_confirm_upload_response import AppConfirmUploadResponse
+from ..types.app_create_signed_upload_url_response import AppCreateSignedUploadURLResponse
+
+__all__ = ["AppsResource", "AsyncAppsResource"]
+
+
+class AppsResource(SyncAPIResource):
+ """App Management"""
+
+ @cached_property
+ def with_raw_response(self) -> AppsResourceWithRawResponse:
+ """
+ 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 AppsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AppsResourceWithStreamingResponse:
+ """
+ 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 AppsResourceWithStreamingResponse(self)
+
+ def retrieve(
+ self,
+ 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,
+ ) -> AppRetrieveResponse:
+ """
+ Retrieves an app by its 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return self._get(
+ path_template("/apps/{id}", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppRetrieveResponse,
+ )
+
+ def list(
+ self,
+ *,
+ order: Literal["asc", "desc"] | Omit = omit,
+ page: int | Omit = omit,
+ page_size: int | Omit = omit,
+ platform: Literal["all", "android", "ios"] | Omit = omit,
+ query: str | Omit = omit,
+ sort_by: Literal["createdAt", "name"] | Omit = omit,
+ status: Literal["all", "queued", "available", "failed"] | 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,
+ ) -> AppListResponse:
+ """
+ Retrieves a paginated list of apps with filtering and search capabilities
+
+ 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(
+ "/apps",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "order": order,
+ "page": page,
+ "page_size": page_size,
+ "platform": platform,
+ "query": query,
+ "sort_by": sort_by,
+ "status": status,
+ },
+ app_list_params.AppListParams,
+ ),
+ ),
+ cast_to=AppListResponse,
+ )
+
+ def delete(
+ self,
+ 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,
+ ) -> AppDeleteResponse:
+ """Deletes an uploaded app by ID.
+
+ Removes files from R2 storage and the database
+ entry.
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return self._delete(
+ path_template("/apps/{id}", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppDeleteResponse,
+ )
+
+ def confirm_upload(
+ self,
+ 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,
+ ) -> AppConfirmUploadResponse:
+ """
+ Verifies the APK file exists in R2 and sets the app status to available.
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return self._post(
+ path_template("/apps/{id}/confirm-upload", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppConfirmUploadResponse,
+ )
+
+ def create_signed_upload_url(
+ self,
+ *,
+ bundle_id: str,
+ display_name: str,
+ files: Iterable[app_create_signed_upload_url_params.File],
+ size_bytes: float,
+ version_code: float,
+ version_name: str,
+ country: str | Omit = omit,
+ description: str | Omit = omit,
+ developer_name: str | Omit = omit,
+ icon_url: str | Omit = omit,
+ platform: Literal["android", "ios"] | Omit = omit,
+ target_sdk: float | 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,
+ ) -> AppCreateSignedUploadURLResponse:
+ """
+ Creates or updates an app and returns pre-signed Cloudflare R2 upload URLs for
+ each file
+
+ Args:
+ country: Country code for Search Results
+
+ 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(
+ "/apps/create-signed-upload-url",
+ body=maybe_transform(
+ {
+ "bundle_id": bundle_id,
+ "display_name": display_name,
+ "files": files,
+ "size_bytes": size_bytes,
+ "version_code": version_code,
+ "version_name": version_name,
+ "country": country,
+ "description": description,
+ "developer_name": developer_name,
+ "icon_url": icon_url,
+ "platform": platform,
+ "target_sdk": target_sdk,
+ },
+ app_create_signed_upload_url_params.AppCreateSignedUploadURLParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppCreateSignedUploadURLResponse,
+ )
+
+ def list_versions(
+ self,
+ 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,
+ ) -> AppListVersionsResponse:
+ """
+ Retrieves all versions of an app visible to the user (own uploads + system
+ versions)
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return self._get(
+ path_template("/apps/{id}/versions", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppListVersionsResponse,
+ )
+
+ def mark_failed(
+ self,
+ 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,
+ ) -> AppMarkFailedResponse:
+ """
+ Sets the app status to failed.
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return self._post(
+ path_template("/apps/{id}/mark-failed", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppMarkFailedResponse,
+ )
+
+
+class AsyncAppsResource(AsyncAPIResource):
+ """App Management"""
+
+ @cached_property
+ def with_raw_response(self) -> AsyncAppsResourceWithRawResponse:
+ """
+ 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 AsyncAppsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncAppsResourceWithStreamingResponse:
+ """
+ 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 AsyncAppsResourceWithStreamingResponse(self)
+
+ async def retrieve(
+ self,
+ 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,
+ ) -> AppRetrieveResponse:
+ """
+ Retrieves an app by its 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return await self._get(
+ path_template("/apps/{id}", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppRetrieveResponse,
+ )
+
+ async def list(
+ self,
+ *,
+ order: Literal["asc", "desc"] | Omit = omit,
+ page: int | Omit = omit,
+ page_size: int | Omit = omit,
+ platform: Literal["all", "android", "ios"] | Omit = omit,
+ query: str | Omit = omit,
+ sort_by: Literal["createdAt", "name"] | Omit = omit,
+ status: Literal["all", "queued", "available", "failed"] | 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,
+ ) -> AppListResponse:
+ """
+ Retrieves a paginated list of apps with filtering and search capabilities
+
+ 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(
+ "/apps",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {
+ "order": order,
+ "page": page,
+ "page_size": page_size,
+ "platform": platform,
+ "query": query,
+ "sort_by": sort_by,
+ "status": status,
+ },
+ app_list_params.AppListParams,
+ ),
+ ),
+ cast_to=AppListResponse,
+ )
+
+ async def delete(
+ self,
+ 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,
+ ) -> AppDeleteResponse:
+ """Deletes an uploaded app by ID.
+
+ Removes files from R2 storage and the database
+ entry.
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return await self._delete(
+ path_template("/apps/{id}", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppDeleteResponse,
+ )
+
+ async def confirm_upload(
+ self,
+ 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,
+ ) -> AppConfirmUploadResponse:
+ """
+ Verifies the APK file exists in R2 and sets the app status to available.
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return await self._post(
+ path_template("/apps/{id}/confirm-upload", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppConfirmUploadResponse,
+ )
+
+ async def create_signed_upload_url(
+ self,
+ *,
+ bundle_id: str,
+ display_name: str,
+ files: Iterable[app_create_signed_upload_url_params.File],
+ size_bytes: float,
+ version_code: float,
+ version_name: str,
+ country: str | Omit = omit,
+ description: str | Omit = omit,
+ developer_name: str | Omit = omit,
+ icon_url: str | Omit = omit,
+ platform: Literal["android", "ios"] | Omit = omit,
+ target_sdk: float | 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,
+ ) -> AppCreateSignedUploadURLResponse:
+ """
+ Creates or updates an app and returns pre-signed Cloudflare R2 upload URLs for
+ each file
+
+ Args:
+ country: Country code for Search Results
+
+ 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(
+ "/apps/create-signed-upload-url",
+ body=await async_maybe_transform(
+ {
+ "bundle_id": bundle_id,
+ "display_name": display_name,
+ "files": files,
+ "size_bytes": size_bytes,
+ "version_code": version_code,
+ "version_name": version_name,
+ "country": country,
+ "description": description,
+ "developer_name": developer_name,
+ "icon_url": icon_url,
+ "platform": platform,
+ "target_sdk": target_sdk,
+ },
+ app_create_signed_upload_url_params.AppCreateSignedUploadURLParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppCreateSignedUploadURLResponse,
+ )
+
+ async def list_versions(
+ self,
+ 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,
+ ) -> AppListVersionsResponse:
+ """
+ Retrieves all versions of an app visible to the user (own uploads + system
+ versions)
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return await self._get(
+ path_template("/apps/{id}/versions", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppListVersionsResponse,
+ )
+
+ async def mark_failed(
+ self,
+ 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,
+ ) -> AppMarkFailedResponse:
+ """
+ Sets the app status to failed.
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return await self._post(
+ path_template("/apps/{id}/mark-failed", id=id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AppMarkFailedResponse,
+ )
+
+
+class AppsResourceWithRawResponse:
+ def __init__(self, apps: AppsResource) -> None:
+ self._apps = apps
+
+ self.retrieve = to_raw_response_wrapper(
+ apps.retrieve,
+ )
+ self.list = to_raw_response_wrapper(
+ apps.list,
+ )
+ self.delete = to_raw_response_wrapper(
+ apps.delete,
+ )
+ self.confirm_upload = to_raw_response_wrapper(
+ apps.confirm_upload,
+ )
+ self.create_signed_upload_url = to_raw_response_wrapper(
+ apps.create_signed_upload_url,
+ )
+ self.list_versions = to_raw_response_wrapper(
+ apps.list_versions,
+ )
+ self.mark_failed = to_raw_response_wrapper(
+ apps.mark_failed,
+ )
+
+
+class AsyncAppsResourceWithRawResponse:
+ def __init__(self, apps: AsyncAppsResource) -> None:
+ self._apps = apps
+
+ self.retrieve = async_to_raw_response_wrapper(
+ apps.retrieve,
+ )
+ self.list = async_to_raw_response_wrapper(
+ apps.list,
+ )
+ self.delete = async_to_raw_response_wrapper(
+ apps.delete,
+ )
+ self.confirm_upload = async_to_raw_response_wrapper(
+ apps.confirm_upload,
+ )
+ self.create_signed_upload_url = async_to_raw_response_wrapper(
+ apps.create_signed_upload_url,
+ )
+ self.list_versions = async_to_raw_response_wrapper(
+ apps.list_versions,
+ )
+ self.mark_failed = async_to_raw_response_wrapper(
+ apps.mark_failed,
+ )
+
+
+class AppsResourceWithStreamingResponse:
+ def __init__(self, apps: AppsResource) -> None:
+ self._apps = apps
+
+ self.retrieve = to_streamed_response_wrapper(
+ apps.retrieve,
+ )
+ self.list = to_streamed_response_wrapper(
+ apps.list,
+ )
+ self.delete = to_streamed_response_wrapper(
+ apps.delete,
+ )
+ self.confirm_upload = to_streamed_response_wrapper(
+ apps.confirm_upload,
+ )
+ self.create_signed_upload_url = to_streamed_response_wrapper(
+ apps.create_signed_upload_url,
+ )
+ self.list_versions = to_streamed_response_wrapper(
+ apps.list_versions,
+ )
+ self.mark_failed = to_streamed_response_wrapper(
+ apps.mark_failed,
+ )
+
+
+class AsyncAppsResourceWithStreamingResponse:
+ def __init__(self, apps: AsyncAppsResource) -> None:
+ self._apps = apps
+
+ self.retrieve = async_to_streamed_response_wrapper(
+ apps.retrieve,
+ )
+ self.list = async_to_streamed_response_wrapper(
+ apps.list,
+ )
+ self.delete = async_to_streamed_response_wrapper(
+ apps.delete,
+ )
+ self.confirm_upload = async_to_streamed_response_wrapper(
+ apps.confirm_upload,
+ )
+ self.create_signed_upload_url = async_to_streamed_response_wrapper(
+ apps.create_signed_upload_url,
+ )
+ self.list_versions = async_to_streamed_response_wrapper(
+ apps.list_versions,
+ )
+ self.mark_failed = async_to_streamed_response_wrapper(
+ apps.mark_failed,
+ )
diff --git a/src/mobilerun_sdk/resources/carriers.py b/src/mobilerun_sdk/resources/carriers.py
index a674b8f..d627159 100644
--- a/src/mobilerun_sdk/resources/carriers.py
+++ b/src/mobilerun_sdk/resources/carriers.py
@@ -29,6 +29,8 @@
class CarriersResource(SyncAPIResource):
+ """Mobile Carriers"""
+
@cached_property
def with_raw_response(self) -> CarriersResourceWithRawResponse:
"""
@@ -417,6 +419,8 @@ def lookup(
class AsyncCarriersResource(AsyncAPIResource):
+ """Mobile Carriers"""
+
@cached_property
def with_raw_response(self) -> AsyncCarriersResourceWithRawResponse:
"""
diff --git a/src/mobilerun_sdk/resources/credentials/__init__.py b/src/mobilerun_sdk/resources/credentials/__init__.py
new file mode 100644
index 0000000..2ab7903
--- /dev/null
+++ b/src/mobilerun_sdk/resources/credentials/__init__.py
@@ -0,0 +1,33 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from .packages import (
+ PackagesResource,
+ AsyncPackagesResource,
+ PackagesResourceWithRawResponse,
+ AsyncPackagesResourceWithRawResponse,
+ PackagesResourceWithStreamingResponse,
+ AsyncPackagesResourceWithStreamingResponse,
+)
+from .credentials import (
+ CredentialsResource,
+ AsyncCredentialsResource,
+ CredentialsResourceWithRawResponse,
+ AsyncCredentialsResourceWithRawResponse,
+ CredentialsResourceWithStreamingResponse,
+ AsyncCredentialsResourceWithStreamingResponse,
+)
+
+__all__ = [
+ "PackagesResource",
+ "AsyncPackagesResource",
+ "PackagesResourceWithRawResponse",
+ "AsyncPackagesResourceWithRawResponse",
+ "PackagesResourceWithStreamingResponse",
+ "AsyncPackagesResourceWithStreamingResponse",
+ "CredentialsResource",
+ "AsyncCredentialsResource",
+ "CredentialsResourceWithRawResponse",
+ "AsyncCredentialsResourceWithRawResponse",
+ "CredentialsResourceWithStreamingResponse",
+ "AsyncCredentialsResourceWithStreamingResponse",
+]
diff --git a/src/mobilerun_sdk/resources/credentials/credentials.py b/src/mobilerun_sdk/resources/credentials/credentials.py
new file mode 100644
index 0000000..9276d9f
--- /dev/null
+++ b/src/mobilerun_sdk/resources/credentials/credentials.py
@@ -0,0 +1,225 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import httpx
+
+from ...types import credential_list_params
+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 .packages.packages import (
+ PackagesResource,
+ AsyncPackagesResource,
+ PackagesResourceWithRawResponse,
+ AsyncPackagesResourceWithRawResponse,
+ PackagesResourceWithStreamingResponse,
+ AsyncPackagesResourceWithStreamingResponse,
+)
+from ...types.credential_list_response import CredentialListResponse
+
+__all__ = ["CredentialsResource", "AsyncCredentialsResource"]
+
+
+class CredentialsResource(SyncAPIResource):
+ """Vault & Secrets"""
+
+ @cached_property
+ def packages(self) -> PackagesResource:
+ """Vault & Secrets"""
+ return PackagesResource(self._client)
+
+ @cached_property
+ def with_raw_response(self) -> CredentialsResourceWithRawResponse:
+ """
+ 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 CredentialsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> CredentialsResourceWithStreamingResponse:
+ """
+ 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 CredentialsResourceWithStreamingResponse(self)
+
+ def list(
+ self,
+ *,
+ 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,
+ ) -> CredentialListResponse:
+ """
+ List all credentials for the authenticated 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
+ """
+ return self._get(
+ "/credentials",
+ 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,
+ },
+ credential_list_params.CredentialListParams,
+ ),
+ ),
+ cast_to=CredentialListResponse,
+ )
+
+
+class AsyncCredentialsResource(AsyncAPIResource):
+ """Vault & Secrets"""
+
+ @cached_property
+ def packages(self) -> AsyncPackagesResource:
+ """Vault & Secrets"""
+ return AsyncPackagesResource(self._client)
+
+ @cached_property
+ def with_raw_response(self) -> AsyncCredentialsResourceWithRawResponse:
+ """
+ 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 AsyncCredentialsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncCredentialsResourceWithStreamingResponse:
+ """
+ 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 AsyncCredentialsResourceWithStreamingResponse(self)
+
+ async def list(
+ self,
+ *,
+ 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,
+ ) -> CredentialListResponse:
+ """
+ List all credentials for the authenticated 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
+ """
+ return await self._get(
+ "/credentials",
+ 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,
+ },
+ credential_list_params.CredentialListParams,
+ ),
+ ),
+ cast_to=CredentialListResponse,
+ )
+
+
+class CredentialsResourceWithRawResponse:
+ def __init__(self, credentials: CredentialsResource) -> None:
+ self._credentials = credentials
+
+ self.list = to_raw_response_wrapper(
+ credentials.list,
+ )
+
+ @cached_property
+ def packages(self) -> PackagesResourceWithRawResponse:
+ """Vault & Secrets"""
+ return PackagesResourceWithRawResponse(self._credentials.packages)
+
+
+class AsyncCredentialsResourceWithRawResponse:
+ def __init__(self, credentials: AsyncCredentialsResource) -> None:
+ self._credentials = credentials
+
+ self.list = async_to_raw_response_wrapper(
+ credentials.list,
+ )
+
+ @cached_property
+ def packages(self) -> AsyncPackagesResourceWithRawResponse:
+ """Vault & Secrets"""
+ return AsyncPackagesResourceWithRawResponse(self._credentials.packages)
+
+
+class CredentialsResourceWithStreamingResponse:
+ def __init__(self, credentials: CredentialsResource) -> None:
+ self._credentials = credentials
+
+ self.list = to_streamed_response_wrapper(
+ credentials.list,
+ )
+
+ @cached_property
+ def packages(self) -> PackagesResourceWithStreamingResponse:
+ """Vault & Secrets"""
+ return PackagesResourceWithStreamingResponse(self._credentials.packages)
+
+
+class AsyncCredentialsResourceWithStreamingResponse:
+ def __init__(self, credentials: AsyncCredentialsResource) -> None:
+ self._credentials = credentials
+
+ self.list = async_to_streamed_response_wrapper(
+ credentials.list,
+ )
+
+ @cached_property
+ def packages(self) -> AsyncPackagesResourceWithStreamingResponse:
+ """Vault & Secrets"""
+ return AsyncPackagesResourceWithStreamingResponse(self._credentials.packages)
diff --git a/src/mobilerun_sdk/resources/credentials/packages/__init__.py b/src/mobilerun_sdk/resources/credentials/packages/__init__.py
new file mode 100644
index 0000000..179ec4a
--- /dev/null
+++ b/src/mobilerun_sdk/resources/credentials/packages/__init__.py
@@ -0,0 +1,33 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from .packages import (
+ PackagesResource,
+ AsyncPackagesResource,
+ PackagesResourceWithRawResponse,
+ AsyncPackagesResourceWithRawResponse,
+ PackagesResourceWithStreamingResponse,
+ AsyncPackagesResourceWithStreamingResponse,
+)
+from .credentials import (
+ CredentialsResource,
+ AsyncCredentialsResource,
+ CredentialsResourceWithRawResponse,
+ AsyncCredentialsResourceWithRawResponse,
+ CredentialsResourceWithStreamingResponse,
+ AsyncCredentialsResourceWithStreamingResponse,
+)
+
+__all__ = [
+ "CredentialsResource",
+ "AsyncCredentialsResource",
+ "CredentialsResourceWithRawResponse",
+ "AsyncCredentialsResourceWithRawResponse",
+ "CredentialsResourceWithStreamingResponse",
+ "AsyncCredentialsResourceWithStreamingResponse",
+ "PackagesResource",
+ "AsyncPackagesResource",
+ "PackagesResourceWithRawResponse",
+ "AsyncPackagesResourceWithRawResponse",
+ "PackagesResourceWithStreamingResponse",
+ "AsyncPackagesResourceWithStreamingResponse",
+]
diff --git a/src/mobilerun_sdk/resources/credentials/packages/credentials/__init__.py b/src/mobilerun_sdk/resources/credentials/packages/credentials/__init__.py
new file mode 100644
index 0000000..bfa68f3
--- /dev/null
+++ b/src/mobilerun_sdk/resources/credentials/packages/credentials/__init__.py
@@ -0,0 +1,33 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from .fields import (
+ FieldsResource,
+ AsyncFieldsResource,
+ FieldsResourceWithRawResponse,
+ AsyncFieldsResourceWithRawResponse,
+ FieldsResourceWithStreamingResponse,
+ AsyncFieldsResourceWithStreamingResponse,
+)
+from .credentials import (
+ CredentialsResource,
+ AsyncCredentialsResource,
+ CredentialsResourceWithRawResponse,
+ AsyncCredentialsResourceWithRawResponse,
+ CredentialsResourceWithStreamingResponse,
+ AsyncCredentialsResourceWithStreamingResponse,
+)
+
+__all__ = [
+ "FieldsResource",
+ "AsyncFieldsResource",
+ "FieldsResourceWithRawResponse",
+ "AsyncFieldsResourceWithRawResponse",
+ "FieldsResourceWithStreamingResponse",
+ "AsyncFieldsResourceWithStreamingResponse",
+ "CredentialsResource",
+ "AsyncCredentialsResource",
+ "CredentialsResourceWithRawResponse",
+ "AsyncCredentialsResourceWithRawResponse",
+ "CredentialsResourceWithStreamingResponse",
+ "AsyncCredentialsResourceWithStreamingResponse",
+]
diff --git a/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py b/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py
new file mode 100644
index 0000000..df12c15
--- /dev/null
+++ b/src/mobilerun_sdk/resources/credentials/packages/credentials/credentials.py
@@ -0,0 +1,413 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Iterable
+
+import httpx
+
+from .fields import (
+ FieldsResource,
+ AsyncFieldsResource,
+ FieldsResourceWithRawResponse,
+ AsyncFieldsResourceWithRawResponse,
+ FieldsResourceWithStreamingResponse,
+ AsyncFieldsResourceWithStreamingResponse,
+)
+from ....._types import Body, Query, Headers, NotGiven, 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.credentials.packages import credential_create_params
+from .....types.credentials.packages.credential_create_response import CredentialCreateResponse
+from .....types.credentials.packages.credential_delete_response import CredentialDeleteResponse
+from .....types.credentials.packages.credential_retrieve_response import CredentialRetrieveResponse
+
+__all__ = ["CredentialsResource", "AsyncCredentialsResource"]
+
+
+class CredentialsResource(SyncAPIResource):
+ """Vault & Secrets"""
+
+ @cached_property
+ def fields(self) -> FieldsResource:
+ """Vault & Secrets"""
+ return FieldsResource(self._client)
+
+ @cached_property
+ def with_raw_response(self) -> CredentialsResourceWithRawResponse:
+ """
+ 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 CredentialsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> CredentialsResourceWithStreamingResponse:
+ """
+ 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 CredentialsResourceWithStreamingResponse(self)
+
+ def create(
+ self,
+ package_name: str,
+ *,
+ credential_name: str,
+ fields: Iterable[credential_create_params.Field],
+ # 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,
+ ) -> CredentialCreateResponse:
+ """
+ Create a credential with fields for a package
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ return self._post(
+ path_template("/credentials/packages/{package_name}", package_name=package_name),
+ body=maybe_transform(
+ {
+ "credential_name": credential_name,
+ "fields": fields,
+ },
+ credential_create_params.CredentialCreateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=CredentialCreateResponse,
+ )
+
+ def retrieve(
+ self,
+ credential_name: str,
+ *,
+ package_name: 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,
+ ) -> CredentialRetrieveResponse:
+ """
+ Get a specific credential with its fields
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ return self._get(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}",
+ package_name=package_name,
+ credential_name=credential_name,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=CredentialRetrieveResponse,
+ )
+
+ def delete(
+ self,
+ credential_name: str,
+ *,
+ package_name: 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,
+ ) -> CredentialDeleteResponse:
+ """
+ Delete a credential and all its fields
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ return self._delete(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}",
+ package_name=package_name,
+ credential_name=credential_name,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=CredentialDeleteResponse,
+ )
+
+
+class AsyncCredentialsResource(AsyncAPIResource):
+ """Vault & Secrets"""
+
+ @cached_property
+ def fields(self) -> AsyncFieldsResource:
+ """Vault & Secrets"""
+ return AsyncFieldsResource(self._client)
+
+ @cached_property
+ def with_raw_response(self) -> AsyncCredentialsResourceWithRawResponse:
+ """
+ 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 AsyncCredentialsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncCredentialsResourceWithStreamingResponse:
+ """
+ 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 AsyncCredentialsResourceWithStreamingResponse(self)
+
+ async def create(
+ self,
+ package_name: str,
+ *,
+ credential_name: str,
+ fields: Iterable[credential_create_params.Field],
+ # 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,
+ ) -> CredentialCreateResponse:
+ """
+ Create a credential with fields for a package
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ return await self._post(
+ path_template("/credentials/packages/{package_name}", package_name=package_name),
+ body=await async_maybe_transform(
+ {
+ "credential_name": credential_name,
+ "fields": fields,
+ },
+ credential_create_params.CredentialCreateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=CredentialCreateResponse,
+ )
+
+ async def retrieve(
+ self,
+ credential_name: str,
+ *,
+ package_name: 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,
+ ) -> CredentialRetrieveResponse:
+ """
+ Get a specific credential with its fields
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ return await self._get(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}",
+ package_name=package_name,
+ credential_name=credential_name,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=CredentialRetrieveResponse,
+ )
+
+ async def delete(
+ self,
+ credential_name: str,
+ *,
+ package_name: 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,
+ ) -> CredentialDeleteResponse:
+ """
+ Delete a credential and all its fields
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ return await self._delete(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}",
+ package_name=package_name,
+ credential_name=credential_name,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=CredentialDeleteResponse,
+ )
+
+
+class CredentialsResourceWithRawResponse:
+ def __init__(self, credentials: CredentialsResource) -> None:
+ self._credentials = credentials
+
+ self.create = to_raw_response_wrapper(
+ credentials.create,
+ )
+ self.retrieve = to_raw_response_wrapper(
+ credentials.retrieve,
+ )
+ self.delete = to_raw_response_wrapper(
+ credentials.delete,
+ )
+
+ @cached_property
+ def fields(self) -> FieldsResourceWithRawResponse:
+ """Vault & Secrets"""
+ return FieldsResourceWithRawResponse(self._credentials.fields)
+
+
+class AsyncCredentialsResourceWithRawResponse:
+ def __init__(self, credentials: AsyncCredentialsResource) -> None:
+ self._credentials = credentials
+
+ self.create = async_to_raw_response_wrapper(
+ credentials.create,
+ )
+ self.retrieve = async_to_raw_response_wrapper(
+ credentials.retrieve,
+ )
+ self.delete = async_to_raw_response_wrapper(
+ credentials.delete,
+ )
+
+ @cached_property
+ def fields(self) -> AsyncFieldsResourceWithRawResponse:
+ """Vault & Secrets"""
+ return AsyncFieldsResourceWithRawResponse(self._credentials.fields)
+
+
+class CredentialsResourceWithStreamingResponse:
+ def __init__(self, credentials: CredentialsResource) -> None:
+ self._credentials = credentials
+
+ self.create = to_streamed_response_wrapper(
+ credentials.create,
+ )
+ self.retrieve = to_streamed_response_wrapper(
+ credentials.retrieve,
+ )
+ self.delete = to_streamed_response_wrapper(
+ credentials.delete,
+ )
+
+ @cached_property
+ def fields(self) -> FieldsResourceWithStreamingResponse:
+ """Vault & Secrets"""
+ return FieldsResourceWithStreamingResponse(self._credentials.fields)
+
+
+class AsyncCredentialsResourceWithStreamingResponse:
+ def __init__(self, credentials: AsyncCredentialsResource) -> None:
+ self._credentials = credentials
+
+ self.create = async_to_streamed_response_wrapper(
+ credentials.create,
+ )
+ self.retrieve = async_to_streamed_response_wrapper(
+ credentials.retrieve,
+ )
+ self.delete = async_to_streamed_response_wrapper(
+ credentials.delete,
+ )
+
+ @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
new file mode 100644
index 0000000..38ebfd9
--- /dev/null
+++ b/src/mobilerun_sdk/resources/credentials/packages/credentials/fields.py
@@ -0,0 +1,421 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal
+
+import httpx
+
+from ....._types import Body, Query, Headers, NotGiven, 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.credentials.packages.credentials import field_create_params, field_update_params
+from .....types.credentials.packages.credentials.field_create_response import FieldCreateResponse
+from .....types.credentials.packages.credentials.field_delete_response import FieldDeleteResponse
+from .....types.credentials.packages.credentials.field_update_response import FieldUpdateResponse
+
+__all__ = ["FieldsResource", "AsyncFieldsResource"]
+
+
+class FieldsResource(SyncAPIResource):
+ """Vault & Secrets"""
+
+ @cached_property
+ def with_raw_response(self) -> FieldsResourceWithRawResponse:
+ """
+ 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 FieldsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> FieldsResourceWithStreamingResponse:
+ """
+ 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 FieldsResourceWithStreamingResponse(self)
+
+ def create(
+ self,
+ credential_name: str,
+ *,
+ package_name: str,
+ field_type: Literal[
+ "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
+ ],
+ value: 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,
+ ) -> FieldCreateResponse:
+ """
+ Add a new field to an existing credential
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ return self._post(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}/fields",
+ package_name=package_name,
+ credential_name=credential_name,
+ ),
+ body=maybe_transform(
+ {
+ "field_type": field_type,
+ "value": value,
+ },
+ field_create_params.FieldCreateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=FieldCreateResponse,
+ )
+
+ def update(
+ self,
+ field_type: Literal[
+ "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
+ ],
+ *,
+ package_name: str,
+ credential_name: str,
+ value: 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,
+ ) -> FieldUpdateResponse:
+ """
+ Update the value of a credential field
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ if not field_type:
+ raise ValueError(f"Expected a non-empty value for `field_type` but received {field_type!r}")
+ return self._patch(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}/fields/{field_type}",
+ package_name=package_name,
+ credential_name=credential_name,
+ field_type=field_type,
+ ),
+ body=maybe_transform({"value": value}, field_update_params.FieldUpdateParams),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=FieldUpdateResponse,
+ )
+
+ def delete(
+ self,
+ field_type: Literal[
+ "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
+ ],
+ *,
+ package_name: str,
+ credential_name: 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,
+ ) -> FieldDeleteResponse:
+ """
+ Delete a field from a credential
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ if not field_type:
+ raise ValueError(f"Expected a non-empty value for `field_type` but received {field_type!r}")
+ return self._delete(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}/fields/{field_type}",
+ package_name=package_name,
+ credential_name=credential_name,
+ field_type=field_type,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=FieldDeleteResponse,
+ )
+
+
+class AsyncFieldsResource(AsyncAPIResource):
+ """Vault & Secrets"""
+
+ @cached_property
+ def with_raw_response(self) -> AsyncFieldsResourceWithRawResponse:
+ """
+ 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 AsyncFieldsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncFieldsResourceWithStreamingResponse:
+ """
+ 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 AsyncFieldsResourceWithStreamingResponse(self)
+
+ async def create(
+ self,
+ credential_name: str,
+ *,
+ package_name: str,
+ field_type: Literal[
+ "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
+ ],
+ value: 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,
+ ) -> FieldCreateResponse:
+ """
+ Add a new field to an existing credential
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ return await self._post(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}/fields",
+ package_name=package_name,
+ credential_name=credential_name,
+ ),
+ body=await async_maybe_transform(
+ {
+ "field_type": field_type,
+ "value": value,
+ },
+ field_create_params.FieldCreateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=FieldCreateResponse,
+ )
+
+ async def update(
+ self,
+ field_type: Literal[
+ "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
+ ],
+ *,
+ package_name: str,
+ credential_name: str,
+ value: 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,
+ ) -> FieldUpdateResponse:
+ """
+ Update the value of a credential field
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ if not field_type:
+ raise ValueError(f"Expected a non-empty value for `field_type` but received {field_type!r}")
+ return await self._patch(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}/fields/{field_type}",
+ package_name=package_name,
+ credential_name=credential_name,
+ field_type=field_type,
+ ),
+ body=await async_maybe_transform({"value": value}, field_update_params.FieldUpdateParams),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=FieldUpdateResponse,
+ )
+
+ async def delete(
+ self,
+ field_type: Literal[
+ "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
+ ],
+ *,
+ package_name: str,
+ credential_name: 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,
+ ) -> FieldDeleteResponse:
+ """
+ Delete a field from a credential
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ if not credential_name:
+ raise ValueError(f"Expected a non-empty value for `credential_name` but received {credential_name!r}")
+ if not field_type:
+ raise ValueError(f"Expected a non-empty value for `field_type` but received {field_type!r}")
+ return await self._delete(
+ path_template(
+ "/credentials/packages/{package_name}/credentials/{credential_name}/fields/{field_type}",
+ package_name=package_name,
+ credential_name=credential_name,
+ field_type=field_type,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=FieldDeleteResponse,
+ )
+
+
+class FieldsResourceWithRawResponse:
+ def __init__(self, fields: FieldsResource) -> None:
+ self._fields = fields
+
+ self.create = to_raw_response_wrapper(
+ fields.create,
+ )
+ self.update = to_raw_response_wrapper(
+ fields.update,
+ )
+ self.delete = to_raw_response_wrapper(
+ fields.delete,
+ )
+
+
+class AsyncFieldsResourceWithRawResponse:
+ def __init__(self, fields: AsyncFieldsResource) -> None:
+ self._fields = fields
+
+ self.create = async_to_raw_response_wrapper(
+ fields.create,
+ )
+ self.update = async_to_raw_response_wrapper(
+ fields.update,
+ )
+ self.delete = async_to_raw_response_wrapper(
+ fields.delete,
+ )
+
+
+class FieldsResourceWithStreamingResponse:
+ def __init__(self, fields: FieldsResource) -> None:
+ self._fields = fields
+
+ self.create = to_streamed_response_wrapper(
+ fields.create,
+ )
+ self.update = to_streamed_response_wrapper(
+ fields.update,
+ )
+ self.delete = to_streamed_response_wrapper(
+ fields.delete,
+ )
+
+
+class AsyncFieldsResourceWithStreamingResponse:
+ def __init__(self, fields: AsyncFieldsResource) -> None:
+ self._fields = fields
+
+ self.create = async_to_streamed_response_wrapper(
+ fields.create,
+ )
+ self.update = async_to_streamed_response_wrapper(
+ fields.update,
+ )
+ self.delete = async_to_streamed_response_wrapper(
+ fields.delete,
+ )
diff --git a/src/mobilerun_sdk/resources/credentials/packages/packages.py b/src/mobilerun_sdk/resources/credentials/packages/packages.py
new file mode 100644
index 0000000..135ccdd
--- /dev/null
+++ b/src/mobilerun_sdk/resources/credentials/packages/packages.py
@@ -0,0 +1,284 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import httpx
+
+from ...._types import Body, Query, Headers, NotGiven, 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.credentials import package_create_params
+from .credentials.credentials import (
+ CredentialsResource,
+ AsyncCredentialsResource,
+ CredentialsResourceWithRawResponse,
+ AsyncCredentialsResourceWithRawResponse,
+ CredentialsResourceWithStreamingResponse,
+ AsyncCredentialsResourceWithStreamingResponse,
+)
+from ....types.credentials.package_list_response import PackageListResponse
+from ....types.credentials.package_create_response import PackageCreateResponse
+
+__all__ = ["PackagesResource", "AsyncPackagesResource"]
+
+
+class PackagesResource(SyncAPIResource):
+ """Vault & Secrets"""
+
+ @cached_property
+ def credentials(self) -> CredentialsResource:
+ """Vault & Secrets"""
+ return CredentialsResource(self._client)
+
+ @cached_property
+ def with_raw_response(self) -> PackagesResourceWithRawResponse:
+ """
+ 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 PackagesResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> PackagesResourceWithStreamingResponse:
+ """
+ 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 PackagesResourceWithStreamingResponse(self)
+
+ def create(
+ self,
+ *,
+ package_name: 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,
+ ) -> PackageCreateResponse:
+ """
+ Initialize a new package/app
+
+ 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(
+ "/credentials/packages",
+ body=maybe_transform({"package_name": package_name}, package_create_params.PackageCreateParams),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=PackageCreateResponse,
+ )
+
+ def list(
+ self,
+ package_name: 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,
+ ) -> PackageListResponse:
+ """
+ List credentials for a specific package
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ return self._get(
+ path_template("/credentials/packages/{package_name}", package_name=package_name),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=PackageListResponse,
+ )
+
+
+class AsyncPackagesResource(AsyncAPIResource):
+ """Vault & Secrets"""
+
+ @cached_property
+ def credentials(self) -> AsyncCredentialsResource:
+ """Vault & Secrets"""
+ return AsyncCredentialsResource(self._client)
+
+ @cached_property
+ def with_raw_response(self) -> AsyncPackagesResourceWithRawResponse:
+ """
+ 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 AsyncPackagesResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncPackagesResourceWithStreamingResponse:
+ """
+ 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 AsyncPackagesResourceWithStreamingResponse(self)
+
+ async def create(
+ self,
+ *,
+ package_name: 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,
+ ) -> PackageCreateResponse:
+ """
+ Initialize a new package/app
+
+ 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(
+ "/credentials/packages",
+ body=await async_maybe_transform({"package_name": package_name}, package_create_params.PackageCreateParams),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=PackageCreateResponse,
+ )
+
+ async def list(
+ self,
+ package_name: 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,
+ ) -> PackageListResponse:
+ """
+ List credentials for a specific package
+
+ 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 package_name:
+ raise ValueError(f"Expected a non-empty value for `package_name` but received {package_name!r}")
+ return await self._get(
+ path_template("/credentials/packages/{package_name}", package_name=package_name),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=PackageListResponse,
+ )
+
+
+class PackagesResourceWithRawResponse:
+ def __init__(self, packages: PackagesResource) -> None:
+ self._packages = packages
+
+ self.create = to_raw_response_wrapper(
+ packages.create,
+ )
+ self.list = to_raw_response_wrapper(
+ packages.list,
+ )
+
+ @cached_property
+ def credentials(self) -> CredentialsResourceWithRawResponse:
+ """Vault & Secrets"""
+ return CredentialsResourceWithRawResponse(self._packages.credentials)
+
+
+class AsyncPackagesResourceWithRawResponse:
+ def __init__(self, packages: AsyncPackagesResource) -> None:
+ self._packages = packages
+
+ self.create = async_to_raw_response_wrapper(
+ packages.create,
+ )
+ self.list = async_to_raw_response_wrapper(
+ packages.list,
+ )
+
+ @cached_property
+ def credentials(self) -> AsyncCredentialsResourceWithRawResponse:
+ """Vault & Secrets"""
+ return AsyncCredentialsResourceWithRawResponse(self._packages.credentials)
+
+
+class PackagesResourceWithStreamingResponse:
+ def __init__(self, packages: PackagesResource) -> None:
+ self._packages = packages
+
+ self.create = to_streamed_response_wrapper(
+ packages.create,
+ )
+ self.list = to_streamed_response_wrapper(
+ packages.list,
+ )
+
+ @cached_property
+ def credentials(self) -> CredentialsResourceWithStreamingResponse:
+ """Vault & Secrets"""
+ return CredentialsResourceWithStreamingResponse(self._packages.credentials)
+
+
+class AsyncPackagesResourceWithStreamingResponse:
+ def __init__(self, packages: AsyncPackagesResource) -> None:
+ self._packages = packages
+
+ self.create = async_to_streamed_response_wrapper(
+ packages.create,
+ )
+ self.list = async_to_streamed_response_wrapper(
+ packages.list,
+ )
+
+ @cached_property
+ def credentials(self) -> AsyncCredentialsResourceWithStreamingResponse:
+ """Vault & Secrets"""
+ return AsyncCredentialsResourceWithStreamingResponse(self._packages.credentials)
diff --git a/src/mobilerun_sdk/resources/devices/devices.py b/src/mobilerun_sdk/resources/devices/devices.py
index b70b517..31c41ed 100644
--- a/src/mobilerun_sdk/resources/devices/devices.py
+++ b/src/mobilerun_sdk/resources/devices/devices.py
@@ -48,12 +48,7 @@
TasksResourceWithStreamingResponse,
AsyncTasksResourceWithStreamingResponse,
)
-from ...types import (
- device_list_params,
- device_create_params,
- device_set_name_params,
- device_terminate_params,
-)
+from ...types import device_list_params, device_create_params, device_set_name_params, device_terminate_params
from .actions import (
ActionsResource,
AsyncActionsResource,
@@ -130,7 +125,6 @@
)
from ..._base_client import make_request_options
from ...types.device import Device
-from ...types.proxy_config_param import ProxyConfigParam
from ...types.device_list_response import DeviceListResponse
from ...types.device_count_response import DeviceCountResponse
from ...types.shared_params.location import Location
@@ -184,6 +178,7 @@ def state(self) -> StateResource:
@cached_property
def tasks(self) -> TasksResource:
+ """Device Management"""
return TasksResource(self._client)
@cached_property
@@ -229,7 +224,7 @@ def create(
locale: str | Omit = omit,
location: Location | Omit = omit,
name: str | Omit = omit,
- proxy: ProxyConfigParam | Omit = omit,
+ proxy: device_create_params.Proxy | Omit = omit,
timezone: 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.
@@ -678,6 +673,7 @@ def state(self) -> AsyncStateResource:
@cached_property
def tasks(self) -> AsyncTasksResource:
+ """Device Management"""
return AsyncTasksResource(self._client)
@cached_property
@@ -723,7 +719,7 @@ async def create(
locale: str | Omit = omit,
location: Location | Omit = omit,
name: str | Omit = omit,
- proxy: ProxyConfigParam | Omit = omit,
+ proxy: device_create_params.Proxy | Omit = omit,
timezone: 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.
@@ -1206,6 +1202,7 @@ def state(self) -> StateResourceWithRawResponse:
@cached_property
def tasks(self) -> TasksResourceWithRawResponse:
+ """Device Management"""
return TasksResourceWithRawResponse(self._devices.tasks)
@cached_property
@@ -1294,6 +1291,7 @@ def state(self) -> AsyncStateResourceWithRawResponse:
@cached_property
def tasks(self) -> AsyncTasksResourceWithRawResponse:
+ """Device Management"""
return AsyncTasksResourceWithRawResponse(self._devices.tasks)
@cached_property
@@ -1382,6 +1380,7 @@ def state(self) -> StateResourceWithStreamingResponse:
@cached_property
def tasks(self) -> TasksResourceWithStreamingResponse:
+ """Device Management"""
return TasksResourceWithStreamingResponse(self._devices.tasks)
@cached_property
@@ -1470,6 +1469,7 @@ 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/tasks.py b/src/mobilerun_sdk/resources/devices/tasks.py
index 62c8d6f..061d2ca 100644
--- a/src/mobilerun_sdk/resources/devices/tasks.py
+++ b/src/mobilerun_sdk/resources/devices/tasks.py
@@ -24,6 +24,8 @@
class TasksResource(SyncAPIResource):
+ """Device Management"""
+
@cached_property
def with_raw_response(self) -> TasksResourceWithRawResponse:
"""
@@ -94,6 +96,8 @@ def list(
class AsyncTasksResource(AsyncAPIResource):
+ """Device Management"""
+
@cached_property
def with_raw_response(self) -> AsyncTasksResourceWithRawResponse:
"""
diff --git a/src/mobilerun_sdk/resources/hooks.py b/src/mobilerun_sdk/resources/hooks.py
index 39a730c..6f3c43b 100644
--- a/src/mobilerun_sdk/resources/hooks.py
+++ b/src/mobilerun_sdk/resources/hooks.py
@@ -32,8 +32,6 @@
class HooksResource(SyncAPIResource):
- """Webhooks API"""
-
@cached_property
def with_raw_response(self) -> HooksResourceWithRawResponse:
"""
@@ -357,8 +355,6 @@ def unsubscribe(
class AsyncHooksResource(AsyncAPIResource):
- """Webhooks API"""
-
@cached_property
def with_raw_response(self) -> AsyncHooksResourceWithRawResponse:
"""
diff --git a/src/mobilerun_sdk/resources/models.py b/src/mobilerun_sdk/resources/models.py
index d1edbdd..4bb2764 100644
--- a/src/mobilerun_sdk/resources/models.py
+++ b/src/mobilerun_sdk/resources/models.py
@@ -20,6 +20,8 @@
class ModelsResource(SyncAPIResource):
+ """LLM Models"""
+
@cached_property
def with_raw_response(self) -> ModelsResourceWithRawResponse:
"""
@@ -60,6 +62,8 @@ def list(
class AsyncModelsResource(AsyncAPIResource):
+ """LLM Models"""
+
@cached_property
def with_raw_response(self) -> AsyncModelsResourceWithRawResponse:
"""
diff --git a/src/mobilerun_sdk/resources/proxies.py b/src/mobilerun_sdk/resources/proxies.py
index 1e8cfed..4abd363 100644
--- a/src/mobilerun_sdk/resources/proxies.py
+++ b/src/mobilerun_sdk/resources/proxies.py
@@ -2,11 +2,13 @@
from __future__ import annotations
+from typing_extensions import Literal, overload
+
import httpx
-from ..types import proxy_lookup_params
-from .._types import Body, Query, Headers, NotGiven, not_given
-from .._utils import maybe_transform, async_maybe_transform
+from ..types import proxy_list_params, proxy_create_params, proxy_lookup_params, proxy_update_params
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import path_template, required_args, maybe_transform, async_maybe_transform
from .._compat import cached_property
from .._resource import SyncAPIResource, AsyncAPIResource
from .._response import (
@@ -16,12 +18,19 @@
async_to_streamed_response_wrapper,
)
from .._base_client import make_request_options
+from ..types.proxy_list_response import ProxyListResponse
+from ..types.proxy_create_response import ProxyCreateResponse
+from ..types.proxy_delete_response import ProxyDeleteResponse
from ..types.proxy_lookup_response import ProxyLookupResponse
+from ..types.proxy_update_response import ProxyUpdateResponse
+from ..types.proxy_retrieve_response import ProxyRetrieveResponse
__all__ = ["ProxiesResource", "AsyncProxiesResource"]
class ProxiesResource(SyncAPIResource):
+ """Network Proxies"""
+
@cached_property
def with_raw_response(self) -> ProxiesResourceWithRawResponse:
"""
@@ -41,6 +50,306 @@ def with_streaming_response(self) -> ProxiesResourceWithStreamingResponse:
"""
return ProxiesResourceWithStreamingResponse(self)
+ @overload
+ def create(
+ self,
+ *,
+ host: str,
+ name: str,
+ password: str,
+ port: int,
+ protocol: Literal["socks5"],
+ user: 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,
+ ) -> ProxyCreateResponse:
+ """
+ Create a new proxy config
+
+ 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
+ """
+ ...
+
+ @overload
+ def create(
+ self,
+ *,
+ config: str,
+ name: str,
+ protocol: Literal["wireguard"],
+ # 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,
+ ) -> ProxyCreateResponse:
+ """
+ Create a new proxy config
+
+ 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
+ """
+ ...
+
+ @required_args(["host", "name", "password", "port", "protocol", "user"], ["config", "name", "protocol"])
+ def create(
+ self,
+ *,
+ host: str | Omit = omit,
+ name: str,
+ password: str | Omit = omit,
+ port: int | Omit = omit,
+ protocol: Literal["socks5"] | Literal["wireguard"],
+ user: str | Omit = omit,
+ config: 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,
+ ) -> ProxyCreateResponse:
+ return self._post(
+ "/proxies",
+ body=maybe_transform(
+ {
+ "host": host,
+ "name": name,
+ "password": password,
+ "port": port,
+ "protocol": protocol,
+ "user": user,
+ "config": config,
+ },
+ proxy_create_params.ProxyCreateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyCreateResponse,
+ )
+
+ def retrieve(
+ self,
+ proxy_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,
+ ) -> ProxyRetrieveResponse:
+ """
+ Get a specific proxy config
+
+ 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 proxy_id:
+ raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
+ return self._get(
+ path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyRetrieveResponse,
+ )
+
+ @overload
+ def update(
+ self,
+ proxy_id: str,
+ *,
+ host: str,
+ name: str,
+ password: str,
+ port: int,
+ protocol: Literal["socks5"],
+ user: 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,
+ ) -> ProxyUpdateResponse:
+ """
+ Update a proxy config
+
+ 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
+ """
+ ...
+
+ @overload
+ def update(
+ self,
+ proxy_id: str,
+ *,
+ config: str,
+ name: str,
+ protocol: Literal["wireguard"],
+ # 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,
+ ) -> ProxyUpdateResponse:
+ """
+ Update a proxy config
+
+ 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
+ """
+ ...
+
+ @required_args(["host", "name", "password", "port", "protocol", "user"], ["config", "name", "protocol"])
+ def update(
+ self,
+ proxy_id: str,
+ *,
+ host: str | Omit = omit,
+ name: str,
+ password: str | Omit = omit,
+ port: int | Omit = omit,
+ protocol: Literal["socks5"] | Literal["wireguard"],
+ user: str | Omit = omit,
+ config: 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,
+ ) -> ProxyUpdateResponse:
+ if not proxy_id:
+ raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
+ return self._put(
+ path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
+ body=maybe_transform(
+ {
+ "host": host,
+ "name": name,
+ "password": password,
+ "port": port,
+ "protocol": protocol,
+ "user": user,
+ "config": config,
+ },
+ proxy_update_params.ProxyUpdateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyUpdateResponse,
+ )
+
+ def list(
+ self,
+ *,
+ protocol: Literal["socks5", "wireguard"] | 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,
+ ) -> ProxyListResponse:
+ """
+ List all proxy configs for the authenticated 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
+ """
+ return self._get(
+ "/proxies",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform({"protocol": protocol}, proxy_list_params.ProxyListParams),
+ ),
+ cast_to=ProxyListResponse,
+ )
+
+ def delete(
+ self,
+ proxy_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,
+ ) -> ProxyDeleteResponse:
+ """
+ Delete a proxy config
+
+ 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 proxy_id:
+ raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
+ return self._delete(
+ path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyDeleteResponse,
+ )
+
def lookup(
self,
*,
@@ -77,6 +386,8 @@ def lookup(
class AsyncProxiesResource(AsyncAPIResource):
+ """Network Proxies"""
+
@cached_property
def with_raw_response(self) -> AsyncProxiesResourceWithRawResponse:
"""
@@ -96,6 +407,306 @@ def with_streaming_response(self) -> AsyncProxiesResourceWithStreamingResponse:
"""
return AsyncProxiesResourceWithStreamingResponse(self)
+ @overload
+ async def create(
+ self,
+ *,
+ host: str,
+ name: str,
+ password: str,
+ port: int,
+ protocol: Literal["socks5"],
+ user: 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,
+ ) -> ProxyCreateResponse:
+ """
+ Create a new proxy config
+
+ 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
+ """
+ ...
+
+ @overload
+ async def create(
+ self,
+ *,
+ config: str,
+ name: str,
+ protocol: Literal["wireguard"],
+ # 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,
+ ) -> ProxyCreateResponse:
+ """
+ Create a new proxy config
+
+ 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
+ """
+ ...
+
+ @required_args(["host", "name", "password", "port", "protocol", "user"], ["config", "name", "protocol"])
+ async def create(
+ self,
+ *,
+ host: str | Omit = omit,
+ name: str,
+ password: str | Omit = omit,
+ port: int | Omit = omit,
+ protocol: Literal["socks5"] | Literal["wireguard"],
+ user: str | Omit = omit,
+ config: 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,
+ ) -> ProxyCreateResponse:
+ return await self._post(
+ "/proxies",
+ body=await async_maybe_transform(
+ {
+ "host": host,
+ "name": name,
+ "password": password,
+ "port": port,
+ "protocol": protocol,
+ "user": user,
+ "config": config,
+ },
+ proxy_create_params.ProxyCreateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyCreateResponse,
+ )
+
+ async def retrieve(
+ self,
+ proxy_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,
+ ) -> ProxyRetrieveResponse:
+ """
+ Get a specific proxy config
+
+ 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 proxy_id:
+ raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
+ return await self._get(
+ path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyRetrieveResponse,
+ )
+
+ @overload
+ async def update(
+ self,
+ proxy_id: str,
+ *,
+ host: str,
+ name: str,
+ password: str,
+ port: int,
+ protocol: Literal["socks5"],
+ user: 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,
+ ) -> ProxyUpdateResponse:
+ """
+ Update a proxy config
+
+ 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
+ """
+ ...
+
+ @overload
+ async def update(
+ self,
+ proxy_id: str,
+ *,
+ config: str,
+ name: str,
+ protocol: Literal["wireguard"],
+ # 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,
+ ) -> ProxyUpdateResponse:
+ """
+ Update a proxy config
+
+ 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
+ """
+ ...
+
+ @required_args(["host", "name", "password", "port", "protocol", "user"], ["config", "name", "protocol"])
+ async def update(
+ self,
+ proxy_id: str,
+ *,
+ host: str | Omit = omit,
+ name: str,
+ password: str | Omit = omit,
+ port: int | Omit = omit,
+ protocol: Literal["socks5"] | Literal["wireguard"],
+ user: str | Omit = omit,
+ config: 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,
+ ) -> ProxyUpdateResponse:
+ if not proxy_id:
+ raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
+ return await self._put(
+ path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
+ body=await async_maybe_transform(
+ {
+ "host": host,
+ "name": name,
+ "password": password,
+ "port": port,
+ "protocol": protocol,
+ "user": user,
+ "config": config,
+ },
+ proxy_update_params.ProxyUpdateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyUpdateResponse,
+ )
+
+ async def list(
+ self,
+ *,
+ protocol: Literal["socks5", "wireguard"] | 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,
+ ) -> ProxyListResponse:
+ """
+ List all proxy configs for the authenticated 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
+ """
+ return await self._get(
+ "/proxies",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform({"protocol": protocol}, proxy_list_params.ProxyListParams),
+ ),
+ cast_to=ProxyListResponse,
+ )
+
+ async def delete(
+ self,
+ proxy_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,
+ ) -> ProxyDeleteResponse:
+ """
+ Delete a proxy config
+
+ 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 proxy_id:
+ raise ValueError(f"Expected a non-empty value for `proxy_id` but received {proxy_id!r}")
+ return await self._delete(
+ path_template("/proxies/{proxy_id}", proxy_id=proxy_id),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=ProxyDeleteResponse,
+ )
+
async def lookup(
self,
*,
@@ -135,6 +746,21 @@ class ProxiesResourceWithRawResponse:
def __init__(self, proxies: ProxiesResource) -> None:
self._proxies = proxies
+ self.create = to_raw_response_wrapper(
+ proxies.create,
+ )
+ self.retrieve = to_raw_response_wrapper(
+ proxies.retrieve,
+ )
+ self.update = to_raw_response_wrapper(
+ proxies.update,
+ )
+ self.list = to_raw_response_wrapper(
+ proxies.list,
+ )
+ self.delete = to_raw_response_wrapper(
+ proxies.delete,
+ )
self.lookup = to_raw_response_wrapper(
proxies.lookup,
)
@@ -144,6 +770,21 @@ class AsyncProxiesResourceWithRawResponse:
def __init__(self, proxies: AsyncProxiesResource) -> None:
self._proxies = proxies
+ self.create = async_to_raw_response_wrapper(
+ proxies.create,
+ )
+ self.retrieve = async_to_raw_response_wrapper(
+ proxies.retrieve,
+ )
+ self.update = async_to_raw_response_wrapper(
+ proxies.update,
+ )
+ self.list = async_to_raw_response_wrapper(
+ proxies.list,
+ )
+ self.delete = async_to_raw_response_wrapper(
+ proxies.delete,
+ )
self.lookup = async_to_raw_response_wrapper(
proxies.lookup,
)
@@ -153,6 +794,21 @@ class ProxiesResourceWithStreamingResponse:
def __init__(self, proxies: ProxiesResource) -> None:
self._proxies = proxies
+ self.create = to_streamed_response_wrapper(
+ proxies.create,
+ )
+ self.retrieve = to_streamed_response_wrapper(
+ proxies.retrieve,
+ )
+ self.update = to_streamed_response_wrapper(
+ proxies.update,
+ )
+ self.list = to_streamed_response_wrapper(
+ proxies.list,
+ )
+ self.delete = to_streamed_response_wrapper(
+ proxies.delete,
+ )
self.lookup = to_streamed_response_wrapper(
proxies.lookup,
)
@@ -162,6 +818,21 @@ class AsyncProxiesResourceWithStreamingResponse:
def __init__(self, proxies: AsyncProxiesResource) -> None:
self._proxies = proxies
+ self.create = async_to_streamed_response_wrapper(
+ proxies.create,
+ )
+ self.retrieve = async_to_streamed_response_wrapper(
+ proxies.retrieve,
+ )
+ self.update = async_to_streamed_response_wrapper(
+ proxies.update,
+ )
+ self.list = async_to_streamed_response_wrapper(
+ proxies.list,
+ )
+ self.delete = async_to_streamed_response_wrapper(
+ proxies.delete,
+ )
self.lookup = async_to_streamed_response_wrapper(
proxies.lookup,
)
diff --git a/src/mobilerun_sdk/types/__init__.py b/src/mobilerun_sdk/types/__init__.py
index 94667ef..abff37b 100644
--- a/src/mobilerun_sdk/types/__init__.py
+++ b/src/mobilerun_sdk/types/__init__.py
@@ -9,6 +9,7 @@
Socks5 as Socks5,
Location as Location,
DeviceSpec as DeviceSpec,
+ Pagination as Pagination,
DeviceCarrier as DeviceCarrier,
PermissionSet as PermissionSet,
PaginationMeta as PaginationMeta,
@@ -18,28 +19,35 @@
from .task_status import TaskStatus as TaskStatus
from .proxy_config import ProxyConfig as ProxyConfig
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 .proxy_config_param import ProxyConfigParam as ProxyConfigParam
from .task_list_response import TaskListResponse as TaskListResponse
from .task_stop_response import TaskStopResponse as TaskStopResponse
from .agent_list_response import AgentListResponse as AgentListResponse
+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
+from .proxy_create_params import ProxyCreateParams as ProxyCreateParams
+from .proxy_list_response import ProxyListResponse as ProxyListResponse
from .proxy_lookup_params import ProxyLookupParams as ProxyLookupParams
+from .proxy_update_params import ProxyUpdateParams as ProxyUpdateParams
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
@@ -50,7 +58,11 @@
from .profile_create_params import ProfileCreateParams as ProfileCreateParams
from .profile_list_response import ProfileListResponse as ProfileListResponse
from .profile_update_params import ProfileUpdateParams as ProfileUpdateParams
+from .proxy_create_response import ProxyCreateResponse as ProxyCreateResponse
+from .proxy_delete_response import ProxyDeleteResponse as ProxyDeleteResponse
from .proxy_lookup_response import ProxyLookupResponse as ProxyLookupResponse
+from .proxy_update_response import ProxyUpdateResponse as ProxyUpdateResponse
+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
@@ -61,13 +73,20 @@
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 .app_mark_failed_response import AppMarkFailedResponse as AppMarkFailedResponse
+from .credential_list_response import CredentialListResponse as CredentialListResponse
from .task_get_status_response import TaskGetStatusResponse as TaskGetStatusResponse
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 .app_list_versions_response import AppListVersionsResponse as AppListVersionsResponse
from .task_send_message_response import TaskSendMessageResponse as TaskSendMessageResponse
+from .app_confirm_upload_response import AppConfirmUploadResponse as AppConfirmUploadResponse
from .device_fingerprint_response import DeviceFingerprintResponse as DeviceFingerprintResponse
from .task_get_trajectory_response import TaskGetTrajectoryResponse as TaskGetTrajectoryResponse
from .hook_get_sample_data_response import HookGetSampleDataResponse as HookGetSampleDataResponse
+from .app_create_signed_upload_url_params import AppCreateSignedUploadURLParams as AppCreateSignedUploadURLParams
+from .app_create_signed_upload_url_response import AppCreateSignedUploadURLResponse as AppCreateSignedUploadURLResponse
diff --git a/src/mobilerun_sdk/types/app_confirm_upload_response.py b/src/mobilerun_sdk/types/app_confirm_upload_response.py
new file mode 100644
index 0000000..da579dc
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_confirm_upload_response.py
@@ -0,0 +1,13 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["AppConfirmUploadResponse"]
+
+
+class AppConfirmUploadResponse(BaseModel):
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/app_create_signed_upload_url_params.py b/src/mobilerun_sdk/types/app_create_signed_upload_url_params.py
new file mode 100644
index 0000000..a374c4b
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_create_signed_upload_url_params.py
@@ -0,0 +1,43 @@
+# 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, Required, Annotated, TypedDict
+
+from .._utils import PropertyInfo
+
+__all__ = ["AppCreateSignedUploadURLParams", "File"]
+
+
+class AppCreateSignedUploadURLParams(TypedDict, total=False):
+ bundle_id: Required[Annotated[str, PropertyInfo(alias="bundleId")]]
+
+ display_name: Required[Annotated[str, PropertyInfo(alias="displayName")]]
+
+ files: Required[Iterable[File]]
+
+ size_bytes: Required[Annotated[float, PropertyInfo(alias="sizeBytes")]]
+
+ version_code: Required[Annotated[float, PropertyInfo(alias="versionCode")]]
+
+ version_name: Required[Annotated[str, PropertyInfo(alias="versionName")]]
+
+ country: str
+ """Country code for Search Results"""
+
+ description: str
+
+ developer_name: Annotated[str, PropertyInfo(alias="developerName")]
+
+ icon_url: Annotated[str, PropertyInfo(alias="iconURL")]
+
+ platform: Literal["android", "ios"]
+
+ target_sdk: Annotated[float, PropertyInfo(alias="targetSdk")]
+
+
+class File(TypedDict, total=False):
+ content_type: Required[Annotated[str, PropertyInfo(alias="contentType")]]
+
+ file_name: Required[Annotated[str, PropertyInfo(alias="fileName")]]
diff --git a/src/mobilerun_sdk/types/app_create_signed_upload_url_response.py b/src/mobilerun_sdk/types/app_create_signed_upload_url_response.py
new file mode 100644
index 0000000..8d15581
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_create_signed_upload_url_response.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List
+
+from pydantic import Field as FieldInfo
+
+from .._models import BaseModel
+
+__all__ = ["AppCreateSignedUploadURLResponse", "R2UploadURL"]
+
+
+class R2UploadURL(BaseModel):
+ file_name: str = FieldInfo(alias="fileName")
+
+ r2_upload_url: str = FieldInfo(alias="r2UploadUrl")
+
+
+class AppCreateSignedUploadURLResponse(BaseModel):
+ app_id: str = FieldInfo(alias="appId")
+ """App ID in the database"""
+
+ r2_upload_urls: List[R2UploadURL] = FieldInfo(alias="r2UploadUrls")
+ """Pre-signed Cloudflare R2 URLs for uploading app files"""
+
+ version_id: str = FieldInfo(alias="versionId")
+ """App version ID in the database"""
diff --git a/src/mobilerun_sdk/types/app_delete_response.py b/src/mobilerun_sdk/types/app_delete_response.py
new file mode 100644
index 0000000..5dce5fa
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_delete_response.py
@@ -0,0 +1,13 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["AppDeleteResponse"]
+
+
+class AppDeleteResponse(BaseModel):
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/app_list_params.py b/src/mobilerun_sdk/types/app_list_params.py
new file mode 100644
index 0000000..319c937
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_list_params.py
@@ -0,0 +1,25 @@
+# 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__ = ["AppListParams"]
+
+
+class AppListParams(TypedDict, total=False):
+ order: Literal["asc", "desc"]
+
+ page: int
+
+ page_size: Annotated[int, PropertyInfo(alias="pageSize")]
+
+ platform: Literal["all", "android", "ios"]
+
+ query: str
+
+ sort_by: Annotated[Literal["createdAt", "name"], PropertyInfo(alias="sortBy")]
+
+ status: Literal["all", "queued", "available", "failed"]
diff --git a/src/mobilerun_sdk/types/app_list_response.py b/src/mobilerun_sdk/types/app_list_response.py
new file mode 100644
index 0000000..f7e2394
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_list_response.py
@@ -0,0 +1,333 @@
+# 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 .shared.pagination import Pagination
+
+__all__ = ["AppListResponse", "Count", "Item", "ItemVersion"]
+
+
+class Count(BaseModel):
+ available_count: float = FieldInfo(alias="availableCount")
+
+ failed_count: float = FieldInfo(alias="failedCount")
+
+ queued_count: float = FieldInfo(alias="queuedCount")
+
+ total_count: float = FieldInfo(alias="totalCount")
+
+
+class ItemVersion(BaseModel):
+ id: str
+
+ app_id: str = FieldInfo(alias="appId")
+
+ country: Literal[
+ "AF",
+ "AL",
+ "DZ",
+ "AS",
+ "AD",
+ "AO",
+ "AI",
+ "AQ",
+ "AG",
+ "AR",
+ "AM",
+ "AW",
+ "AP",
+ "AU",
+ "AT",
+ "AZ",
+ "BS",
+ "BH",
+ "BD",
+ "BB",
+ "BY",
+ "BE",
+ "BZ",
+ "BJ",
+ "BM",
+ "BT",
+ "BO",
+ "BQ",
+ "BA",
+ "BW",
+ "BV",
+ "BR",
+ "IO",
+ "BN",
+ "BG",
+ "BF",
+ "BI",
+ "KH",
+ "CM",
+ "CA",
+ "CV",
+ "KY",
+ "CF",
+ "TD",
+ "CL",
+ "CN",
+ "CX",
+ "CC",
+ "CO",
+ "KM",
+ "CG",
+ "CD",
+ "CK",
+ "CR",
+ "HR",
+ "CU",
+ "CW",
+ "CY",
+ "CZ",
+ "CI",
+ "DK",
+ "DJ",
+ "DM",
+ "DO",
+ "EC",
+ "EG",
+ "SV",
+ "GQ",
+ "ER",
+ "EE",
+ "ET",
+ "FK",
+ "FO",
+ "FJ",
+ "FI",
+ "FR",
+ "GF",
+ "PF",
+ "TF",
+ "GA",
+ "GM",
+ "GE",
+ "DE",
+ "GH",
+ "GI",
+ "GR",
+ "GL",
+ "GD",
+ "GP",
+ "GU",
+ "GT",
+ "GG",
+ "GN",
+ "GW",
+ "GY",
+ "HT",
+ "HM",
+ "VA",
+ "HN",
+ "HK",
+ "HU",
+ "IS",
+ "IN",
+ "ID",
+ "IR",
+ "IQ",
+ "IE",
+ "IM",
+ "IL",
+ "IT",
+ "JM",
+ "JP",
+ "JE",
+ "JO",
+ "KZ",
+ "KE",
+ "KI",
+ "KR",
+ "KW",
+ "KG",
+ "LA",
+ "LV",
+ "LB",
+ "LS",
+ "LR",
+ "LY",
+ "LI",
+ "LT",
+ "LU",
+ "MO",
+ "MG",
+ "MW",
+ "MY",
+ "MV",
+ "ML",
+ "MT",
+ "MH",
+ "MQ",
+ "MR",
+ "MU",
+ "YT",
+ "MX",
+ "FM",
+ "MD",
+ "MC",
+ "MN",
+ "ME",
+ "MS",
+ "MA",
+ "MZ",
+ "MM",
+ "NA",
+ "NR",
+ "NP",
+ "NL",
+ "AN",
+ "NC",
+ "NZ",
+ "NI",
+ "NE",
+ "NG",
+ "NU",
+ "NF",
+ "KP",
+ "MK",
+ "MP",
+ "NO",
+ "OM",
+ "PK",
+ "PW",
+ "PS",
+ "PA",
+ "PG",
+ "PY",
+ "PE",
+ "PH",
+ "PN",
+ "PL",
+ "PT",
+ "PR",
+ "QA",
+ "RE",
+ "RO",
+ "RU",
+ "RW",
+ "BL",
+ "SH",
+ "KN",
+ "LC",
+ "MF",
+ "PM",
+ "VC",
+ "WS",
+ "SM",
+ "ST",
+ "SA",
+ "SN",
+ "RS",
+ "CS",
+ "SC",
+ "SL",
+ "SG",
+ "SX",
+ "SK",
+ "SI",
+ "SB",
+ "SO",
+ "ZA",
+ "GS",
+ "SS",
+ "ES",
+ "LK",
+ "SD",
+ "SR",
+ "SJ",
+ "SZ",
+ "SE",
+ "CH",
+ "SY",
+ "TW",
+ "TJ",
+ "TZ",
+ "TH",
+ "TL",
+ "TG",
+ "TK",
+ "TO",
+ "TT",
+ "TN",
+ "TR",
+ "TM",
+ "TC",
+ "TV",
+ "UG",
+ "UA",
+ "AE",
+ "GB",
+ "US",
+ "UM",
+ "UY",
+ "UZ",
+ "VU",
+ "VE",
+ "VN",
+ "VG",
+ "VI",
+ "WF",
+ "EH",
+ "YE",
+ "ZM",
+ "ZW",
+ "AX",
+ ]
+
+ created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
+
+ queued_at: Optional[datetime] = FieldInfo(alias="queuedAt", default=None)
+
+ size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None)
+
+ source: Literal["user", "system", "portal"]
+
+ status: Literal["queued", "available", "failed"]
+
+ target_sdk: Optional[int] = FieldInfo(alias="targetSdk", default=None)
+
+ updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
+
+ user_id: Optional[str] = FieldInfo(alias="userId", default=None)
+
+ version_code: int = FieldInfo(alias="versionCode")
+
+ version_name: str = FieldInfo(alias="versionName")
+
+
+class Item(BaseModel):
+ id: str
+
+ bundle_id: str = FieldInfo(alias="bundleId")
+
+ created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
+
+ description: Optional[str] = None
+
+ developer_name: Optional[str] = FieldInfo(alias="developerName", default=None)
+
+ display_name: str = FieldInfo(alias="displayName")
+
+ icon_url: str = FieldInfo(alias="iconURL")
+
+ platform: Literal["android", "ios"]
+
+ updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
+
+ version: ItemVersion
+
+
+class AppListResponse(BaseModel):
+ count: Count
+
+ items: List[Item]
+
+ pagination: Pagination
diff --git a/src/mobilerun_sdk/types/app_list_versions_response.py b/src/mobilerun_sdk/types/app_list_versions_response.py
new file mode 100644
index 0000000..130eab8
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_list_versions_response.py
@@ -0,0 +1,296 @@
+# 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
+
+__all__ = ["AppListVersionsResponse", "Data"]
+
+
+class Data(BaseModel):
+ id: str
+
+ app_id: str = FieldInfo(alias="appId")
+
+ country: Literal[
+ "AF",
+ "AL",
+ "DZ",
+ "AS",
+ "AD",
+ "AO",
+ "AI",
+ "AQ",
+ "AG",
+ "AR",
+ "AM",
+ "AW",
+ "AP",
+ "AU",
+ "AT",
+ "AZ",
+ "BS",
+ "BH",
+ "BD",
+ "BB",
+ "BY",
+ "BE",
+ "BZ",
+ "BJ",
+ "BM",
+ "BT",
+ "BO",
+ "BQ",
+ "BA",
+ "BW",
+ "BV",
+ "BR",
+ "IO",
+ "BN",
+ "BG",
+ "BF",
+ "BI",
+ "KH",
+ "CM",
+ "CA",
+ "CV",
+ "KY",
+ "CF",
+ "TD",
+ "CL",
+ "CN",
+ "CX",
+ "CC",
+ "CO",
+ "KM",
+ "CG",
+ "CD",
+ "CK",
+ "CR",
+ "HR",
+ "CU",
+ "CW",
+ "CY",
+ "CZ",
+ "CI",
+ "DK",
+ "DJ",
+ "DM",
+ "DO",
+ "EC",
+ "EG",
+ "SV",
+ "GQ",
+ "ER",
+ "EE",
+ "ET",
+ "FK",
+ "FO",
+ "FJ",
+ "FI",
+ "FR",
+ "GF",
+ "PF",
+ "TF",
+ "GA",
+ "GM",
+ "GE",
+ "DE",
+ "GH",
+ "GI",
+ "GR",
+ "GL",
+ "GD",
+ "GP",
+ "GU",
+ "GT",
+ "GG",
+ "GN",
+ "GW",
+ "GY",
+ "HT",
+ "HM",
+ "VA",
+ "HN",
+ "HK",
+ "HU",
+ "IS",
+ "IN",
+ "ID",
+ "IR",
+ "IQ",
+ "IE",
+ "IM",
+ "IL",
+ "IT",
+ "JM",
+ "JP",
+ "JE",
+ "JO",
+ "KZ",
+ "KE",
+ "KI",
+ "KR",
+ "KW",
+ "KG",
+ "LA",
+ "LV",
+ "LB",
+ "LS",
+ "LR",
+ "LY",
+ "LI",
+ "LT",
+ "LU",
+ "MO",
+ "MG",
+ "MW",
+ "MY",
+ "MV",
+ "ML",
+ "MT",
+ "MH",
+ "MQ",
+ "MR",
+ "MU",
+ "YT",
+ "MX",
+ "FM",
+ "MD",
+ "MC",
+ "MN",
+ "ME",
+ "MS",
+ "MA",
+ "MZ",
+ "MM",
+ "NA",
+ "NR",
+ "NP",
+ "NL",
+ "AN",
+ "NC",
+ "NZ",
+ "NI",
+ "NE",
+ "NG",
+ "NU",
+ "NF",
+ "KP",
+ "MK",
+ "MP",
+ "NO",
+ "OM",
+ "PK",
+ "PW",
+ "PS",
+ "PA",
+ "PG",
+ "PY",
+ "PE",
+ "PH",
+ "PN",
+ "PL",
+ "PT",
+ "PR",
+ "QA",
+ "RE",
+ "RO",
+ "RU",
+ "RW",
+ "BL",
+ "SH",
+ "KN",
+ "LC",
+ "MF",
+ "PM",
+ "VC",
+ "WS",
+ "SM",
+ "ST",
+ "SA",
+ "SN",
+ "RS",
+ "CS",
+ "SC",
+ "SL",
+ "SG",
+ "SX",
+ "SK",
+ "SI",
+ "SB",
+ "SO",
+ "ZA",
+ "GS",
+ "SS",
+ "ES",
+ "LK",
+ "SD",
+ "SR",
+ "SJ",
+ "SZ",
+ "SE",
+ "CH",
+ "SY",
+ "TW",
+ "TJ",
+ "TZ",
+ "TH",
+ "TL",
+ "TG",
+ "TK",
+ "TO",
+ "TT",
+ "TN",
+ "TR",
+ "TM",
+ "TC",
+ "TV",
+ "UG",
+ "UA",
+ "AE",
+ "GB",
+ "US",
+ "UM",
+ "UY",
+ "UZ",
+ "VU",
+ "VE",
+ "VN",
+ "VG",
+ "VI",
+ "WF",
+ "EH",
+ "YE",
+ "ZM",
+ "ZW",
+ "AX",
+ ]
+
+ created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
+
+ queued_at: Optional[datetime] = FieldInfo(alias="queuedAt", default=None)
+
+ size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None)
+
+ source: Literal["user", "system", "portal"]
+
+ status: Literal["queued", "available", "failed"]
+
+ target_sdk: Optional[int] = FieldInfo(alias="targetSdk", default=None)
+
+ updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
+
+ user_id: Optional[str] = FieldInfo(alias="userId", default=None)
+
+ version_code: int = FieldInfo(alias="versionCode")
+
+ version_name: str = FieldInfo(alias="versionName")
+
+
+class AppListVersionsResponse(BaseModel):
+ data: List[Data]
diff --git a/src/mobilerun_sdk/types/app_mark_failed_response.py b/src/mobilerun_sdk/types/app_mark_failed_response.py
new file mode 100644
index 0000000..4df598b
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_mark_failed_response.py
@@ -0,0 +1,13 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["AppMarkFailedResponse"]
+
+
+class AppMarkFailedResponse(BaseModel):
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/app_retrieve_response.py b/src/mobilerun_sdk/types/app_retrieve_response.py
new file mode 100644
index 0000000..57fd551
--- /dev/null
+++ b/src/mobilerun_sdk/types/app_retrieve_response.py
@@ -0,0 +1,35 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+from datetime import datetime
+from typing_extensions import Literal
+
+from pydantic import Field as FieldInfo
+
+from .._models import BaseModel
+
+__all__ = ["AppRetrieveResponse", "Data"]
+
+
+class Data(BaseModel):
+ id: str
+
+ bundle_id: str = FieldInfo(alias="bundleId")
+
+ created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
+
+ description: Optional[str] = None
+
+ developer_name: Optional[str] = FieldInfo(alias="developerName", default=None)
+
+ display_name: str = FieldInfo(alias="displayName")
+
+ icon_url: str = FieldInfo(alias="iconURL")
+
+ platform: Literal["android", "ios"]
+
+ updated_at: Optional[datetime] = FieldInfo(alias="updatedAt", default=None)
+
+
+class AppRetrieveResponse(BaseModel):
+ data: Data
diff --git a/src/mobilerun_sdk/types/credential_list_params.py b/src/mobilerun_sdk/types/credential_list_params.py
new file mode 100644
index 0000000..1f94a2e
--- /dev/null
+++ b/src/mobilerun_sdk/types/credential_list_params.py
@@ -0,0 +1,15 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Annotated, TypedDict
+
+from .._utils import PropertyInfo
+
+__all__ = ["CredentialListParams"]
+
+
+class CredentialListParams(TypedDict, total=False):
+ page: int
+
+ page_size: Annotated[int, PropertyInfo(alias="pageSize")]
diff --git a/src/mobilerun_sdk/types/credential_list_response.py b/src/mobilerun_sdk/types/credential_list_response.py
new file mode 100644
index 0000000..0721b2b
--- /dev/null
+++ b/src/mobilerun_sdk/types/credential_list_response.py
@@ -0,0 +1,15 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List
+
+from .._models import BaseModel
+from .shared.pagination import Pagination
+from .credentials.packages.credential import Credential
+
+__all__ = ["CredentialListResponse"]
+
+
+class CredentialListResponse(BaseModel):
+ items: List[Credential]
+
+ pagination: Pagination
diff --git a/src/mobilerun_sdk/types/credentials/__init__.py b/src/mobilerun_sdk/types/credentials/__init__.py
index f8ee8b1..d2b799c 100644
--- a/src/mobilerun_sdk/types/credentials/__init__.py
+++ b/src/mobilerun_sdk/types/credentials/__init__.py
@@ -1,3 +1,7 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from __future__ import annotations
+
+from .package_create_params import PackageCreateParams as PackageCreateParams
+from .package_list_response import PackageListResponse as PackageListResponse
+from .package_create_response import PackageCreateResponse as PackageCreateResponse
diff --git a/src/mobilerun_sdk/types/credentials/package_create_params.py b/src/mobilerun_sdk/types/credentials/package_create_params.py
new file mode 100644
index 0000000..50dad4a
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/package_create_params.py
@@ -0,0 +1,13 @@
+# 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__ = ["PackageCreateParams"]
+
+
+class PackageCreateParams(TypedDict, total=False):
+ package_name: Required[Annotated[str, PropertyInfo(alias="packageName")]]
diff --git a/src/mobilerun_sdk/types/credentials/package_create_response.py b/src/mobilerun_sdk/types/credentials/package_create_response.py
new file mode 100644
index 0000000..8ff9fa8
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/package_create_response.py
@@ -0,0 +1,21 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from pydantic import Field as FieldInfo
+
+from ..._models import BaseModel
+
+__all__ = ["PackageCreateResponse", "Data"]
+
+
+class Data(BaseModel):
+ package_name: str = FieldInfo(alias="packageName")
+
+
+class PackageCreateResponse(BaseModel):
+ data: Data
+
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/package_list_response.py b/src/mobilerun_sdk/types/credentials/package_list_response.py
new file mode 100644
index 0000000..c9567e1
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/package_list_response.py
@@ -0,0 +1,12 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List
+
+from ..._models import BaseModel
+from .packages.credential import Credential
+
+__all__ = ["PackageListResponse"]
+
+
+class PackageListResponse(BaseModel):
+ data: List[Credential]
diff --git a/src/mobilerun_sdk/types/credentials/packages/__init__.py b/src/mobilerun_sdk/types/credentials/packages/__init__.py
index f8ee8b1..a3bddb0 100644
--- a/src/mobilerun_sdk/types/credentials/packages/__init__.py
+++ b/src/mobilerun_sdk/types/credentials/packages/__init__.py
@@ -1,3 +1,9 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from __future__ import annotations
+
+from .credential import Credential as Credential
+from .credential_create_params import CredentialCreateParams as CredentialCreateParams
+from .credential_create_response import CredentialCreateResponse as CredentialCreateResponse
+from .credential_delete_response import CredentialDeleteResponse as CredentialDeleteResponse
+from .credential_retrieve_response import CredentialRetrieveResponse as CredentialRetrieveResponse
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential.py b/src/mobilerun_sdk/types/credentials/packages/credential.py
new file mode 100644
index 0000000..686342d
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credential.py
@@ -0,0 +1,30 @@
+# 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
+
+from ...._models import BaseModel
+
+__all__ = ["Credential", "Field"]
+
+
+class Field(BaseModel):
+ field_type: Literal[
+ "email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"
+ ] = FieldInfo(alias="fieldType")
+
+ value: str
+
+
+class Credential(BaseModel):
+ credential_name: str = FieldInfo(alias="credentialName")
+
+ fields: List[Field]
+
+ package_name: str = FieldInfo(alias="packageName")
+
+ secret_path: str = FieldInfo(alias="secretPath")
+
+ user_id: str = FieldInfo(alias="userId")
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential_create_params.py b/src/mobilerun_sdk/types/credentials/packages/credential_create_params.py
new file mode 100644
index 0000000..7925fa5
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credential_create_params.py
@@ -0,0 +1,27 @@
+# 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, Required, Annotated, TypedDict
+
+from ...._utils import PropertyInfo
+
+__all__ = ["CredentialCreateParams", "Field"]
+
+
+class CredentialCreateParams(TypedDict, total=False):
+ credential_name: Required[Annotated[str, PropertyInfo(alias="credentialName")]]
+
+ fields: Required[Iterable[Field]]
+
+
+class Field(TypedDict, total=False):
+ field_type: Required[
+ Annotated[
+ Literal["email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"],
+ PropertyInfo(alias="fieldType"),
+ ]
+ ]
+
+ value: Required[str]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential_create_response.py b/src/mobilerun_sdk/types/credentials/packages/credential_create_response.py
new file mode 100644
index 0000000..56749ca
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credential_create_response.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from ...._models import BaseModel
+from .credential import Credential
+
+__all__ = ["CredentialCreateResponse"]
+
+
+class CredentialCreateResponse(BaseModel):
+ data: Credential
+
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential_delete_response.py b/src/mobilerun_sdk/types/credentials/packages/credential_delete_response.py
new file mode 100644
index 0000000..9fc9bf4
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credential_delete_response.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from ...._models import BaseModel
+from .credential import Credential
+
+__all__ = ["CredentialDeleteResponse"]
+
+
+class CredentialDeleteResponse(BaseModel):
+ data: Credential
+
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credential_retrieve_response.py b/src/mobilerun_sdk/types/credentials/packages/credential_retrieve_response.py
new file mode 100644
index 0000000..ea546cc
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credential_retrieve_response.py
@@ -0,0 +1,10 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from ...._models import BaseModel
+from .credential import Credential
+
+__all__ = ["CredentialRetrieveResponse"]
+
+
+class CredentialRetrieveResponse(BaseModel):
+ data: Credential
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/__init__.py b/src/mobilerun_sdk/types/credentials/packages/credentials/__init__.py
index f8ee8b1..f3e7873 100644
--- a/src/mobilerun_sdk/types/credentials/packages/credentials/__init__.py
+++ b/src/mobilerun_sdk/types/credentials/packages/credentials/__init__.py
@@ -1,3 +1,9 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from __future__ import annotations
+
+from .field_create_params import FieldCreateParams as FieldCreateParams
+from .field_update_params import FieldUpdateParams as FieldUpdateParams
+from .field_create_response import FieldCreateResponse as FieldCreateResponse
+from .field_delete_response import FieldDeleteResponse as FieldDeleteResponse
+from .field_update_response import FieldUpdateResponse as FieldUpdateResponse
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_params.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_params.py
new file mode 100644
index 0000000..debabf7
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_params.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, Required, Annotated, TypedDict
+
+from ....._utils import PropertyInfo
+
+__all__ = ["FieldCreateParams"]
+
+
+class FieldCreateParams(TypedDict, total=False):
+ package_name: Required[Annotated[str, PropertyInfo(alias="packageName")]]
+
+ field_type: Required[
+ Annotated[
+ Literal["email", "username", "password", "api_token", "phone_number", "two_factor_secret", "backup_codes"],
+ PropertyInfo(alias="fieldType"),
+ ]
+ ]
+
+ value: Required[str]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_response.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_response.py
new file mode 100644
index 0000000..2d7f2d0
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credentials/field_create_response.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from ....._models import BaseModel
+from ..credential import Credential
+
+__all__ = ["FieldCreateResponse"]
+
+
+class FieldCreateResponse(BaseModel):
+ data: Credential
+
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_delete_response.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_delete_response.py
new file mode 100644
index 0000000..67e99f8
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credentials/field_delete_response.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from ....._models import BaseModel
+from ..credential import Credential
+
+__all__ = ["FieldDeleteResponse"]
+
+
+class FieldDeleteResponse(BaseModel):
+ data: Credential
+
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_params.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_params.py
new file mode 100644
index 0000000..ed62fb1
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_params.py
@@ -0,0 +1,17 @@
+# 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__ = ["FieldUpdateParams"]
+
+
+class FieldUpdateParams(TypedDict, total=False):
+ package_name: Required[Annotated[str, PropertyInfo(alias="packageName")]]
+
+ credential_name: Required[Annotated[str, PropertyInfo(alias="credentialName")]]
+
+ value: Required[str]
diff --git a/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_response.py b/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_response.py
new file mode 100644
index 0000000..8676ce3
--- /dev/null
+++ b/src/mobilerun_sdk/types/credentials/packages/credentials/field_update_response.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from ....._models import BaseModel
+from ..credential import Credential
+
+__all__ = ["FieldUpdateResponse"]
+
+
+class FieldUpdateResponse(BaseModel):
+ data: Credential
+
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/device_create_params.py b/src/mobilerun_sdk/types/device_create_params.py
index 6d5b9b0..a631b9c 100644
--- a/src/mobilerun_sdk/types/device_create_params.py
+++ b/src/mobilerun_sdk/types/device_create_params.py
@@ -7,12 +7,12 @@
from .._types import SequenceNotStr
from .._utils import PropertyInfo
-from .proxy_config_param import ProxyConfigParam
+from .shared_params.socks5 import Socks5
from .shared_params.location import Location
from .shared_params.device_carrier import DeviceCarrier
from .shared_params.device_identifiers import DeviceIdentifiers
-__all__ = ["DeviceCreateParams"]
+__all__ = ["DeviceCreateParams", "Proxy"]
class DeviceCreateParams(TypedDict, total=False):
@@ -48,6 +48,14 @@ class DeviceCreateParams(TypedDict, total=False):
name: str
- proxy: ProxyConfigParam
+ proxy: Proxy
timezone: str
+
+
+class Proxy(TypedDict, total=False):
+ name: str
+
+ smart_ip: Annotated[bool, PropertyInfo(alias="smartIp")]
+
+ socks5: Socks5
diff --git a/src/mobilerun_sdk/types/devices/state_ui_response.py b/src/mobilerun_sdk/types/devices/state_ui_response.py
index 80cbe44..bdddd0c 100644
--- a/src/mobilerun_sdk/types/devices/state_ui_response.py
+++ b/src/mobilerun_sdk/types/devices/state_ui_response.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List, Optional
+from typing import Optional
from pydantic import Field as FieldInfo
@@ -9,64 +9,14 @@
__all__ = [
"StateUiResponse",
- "A11yTree",
- "A11yTreeBoundsInScreen",
"DeviceContext",
"DeviceContextDisplayMetrics",
"DeviceContextFilteringParams",
- "ImeTree",
- "ImeTreeBoundsInScreen",
"PhoneState",
"PhoneStateFocusedElement",
]
-class A11yTreeBoundsInScreen(BaseModel):
- bottom: int
-
- left: int
-
- right: int
-
- top: int
-
-
-class A11yTree(BaseModel):
- bounds_in_screen: A11yTreeBoundsInScreen = FieldInfo(alias="boundsInScreen")
-
- children: Optional[List[object]] = None
-
- class_name: str = FieldInfo(alias="className")
-
- content_description: str = FieldInfo(alias="contentDescription")
-
- is_checkable: bool = FieldInfo(alias="isCheckable")
-
- is_checked: bool = FieldInfo(alias="isChecked")
-
- is_clickable: bool = FieldInfo(alias="isClickable")
-
- is_enabled: bool = FieldInfo(alias="isEnabled")
-
- is_focusable: bool = FieldInfo(alias="isFocusable")
-
- is_focused: bool = FieldInfo(alias="isFocused")
-
- is_long_clickable: bool = FieldInfo(alias="isLongClickable")
-
- is_password: bool = FieldInfo(alias="isPassword")
-
- is_scrollable: bool = FieldInfo(alias="isScrollable")
-
- is_selected: bool = FieldInfo(alias="isSelected")
-
- package_name: str = FieldInfo(alias="packageName")
-
- resource_id: str = FieldInfo(alias="resourceId")
-
- text: str
-
-
class DeviceContextDisplayMetrics(BaseModel):
density: float
@@ -92,51 +42,7 @@ class DeviceContext(BaseModel):
screen_bounds: Rect
-
-class ImeTreeBoundsInScreen(BaseModel):
- bottom: int
-
- left: int
-
- right: int
-
- top: int
-
-
-class ImeTree(BaseModel):
- bounds_in_screen: ImeTreeBoundsInScreen = FieldInfo(alias="boundsInScreen")
-
- children: Optional[List[object]] = None
-
- class_name: str = FieldInfo(alias="className")
-
- content_description: str = FieldInfo(alias="contentDescription")
-
- is_checkable: bool = FieldInfo(alias="isCheckable")
-
- is_checked: bool = FieldInfo(alias="isChecked")
-
- is_clickable: bool = FieldInfo(alias="isClickable")
-
- is_enabled: bool = FieldInfo(alias="isEnabled")
-
- is_focusable: bool = FieldInfo(alias="isFocusable")
-
- is_focused: bool = FieldInfo(alias="isFocused")
-
- is_long_clickable: bool = FieldInfo(alias="isLongClickable")
-
- is_password: bool = FieldInfo(alias="isPassword")
-
- is_scrollable: bool = FieldInfo(alias="isScrollable")
-
- is_selected: bool = FieldInfo(alias="isSelected")
-
- package_name: str = FieldInfo(alias="packageName")
-
- resource_id: str = FieldInfo(alias="resourceId")
-
- text: str
+ screen_size: Rect = FieldInfo(alias="screenSize")
class PhoneStateFocusedElement(BaseModel):
@@ -162,13 +68,13 @@ class PhoneState(BaseModel):
class StateUiResponse(BaseModel):
- a11y_tree: A11yTree
+ a11y_tree: object
device_context: DeviceContext
- ime_tree: ImeTree
-
phone_state: PhoneState
schema_: Optional[str] = FieldInfo(alias="$schema", default=None)
"""A URL to the JSON Schema for this object."""
+
+ ime_tree: Optional[object] = None
diff --git a/src/mobilerun_sdk/types/proxy_config.py b/src/mobilerun_sdk/types/proxy_config.py
index 5a5715b..52d651c 100644
--- a/src/mobilerun_sdk/types/proxy_config.py
+++ b/src/mobilerun_sdk/types/proxy_config.py
@@ -1,18 +1,42 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import Optional
+from typing import Union
+from typing_extensions import Literal, Annotated, TypeAlias
from pydantic import Field as FieldInfo
+from .._utils import PropertyInfo
from .._models import BaseModel
-from .shared.socks5 import Socks5
-__all__ = ["ProxyConfig"]
+__all__ = ["ProxyConfig", "Socks5ProxyConfig", "WireguardProxyConfig"]
-class ProxyConfig(BaseModel):
- name: Optional[str] = None
+class Socks5ProxyConfig(BaseModel):
+ host: str
- smart_ip: Optional[bool] = FieldInfo(alias="smartIp", default=None)
+ name: str
- socks5: Optional[Socks5] = None
+ password: str
+
+ port: int
+
+ protocol: Literal["socks5"]
+
+ proxy_id: str = FieldInfo(alias="proxyId")
+
+ user: str
+
+
+class WireguardProxyConfig(BaseModel):
+ config: str
+
+ name: str
+
+ protocol: Literal["wireguard"]
+
+ proxy_id: str = FieldInfo(alias="proxyId")
+
+
+ProxyConfig: TypeAlias = Annotated[
+ Union[Socks5ProxyConfig, WireguardProxyConfig], PropertyInfo(discriminator="protocol")
+]
diff --git a/src/mobilerun_sdk/types/proxy_config_param.py b/src/mobilerun_sdk/types/proxy_config_param.py
deleted file mode 100644
index c169125..0000000
--- a/src/mobilerun_sdk/types/proxy_config_param.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_extensions import Annotated, TypedDict
-
-from .._utils import PropertyInfo
-from .shared_params.socks5 import Socks5
-
-__all__ = ["ProxyConfigParam"]
-
-
-class ProxyConfigParam(TypedDict, total=False):
- name: str
-
- smart_ip: Annotated[bool, PropertyInfo(alias="smartIp")]
-
- socks5: Socks5
diff --git a/src/mobilerun_sdk/types/proxy_create_params.py b/src/mobilerun_sdk/types/proxy_create_params.py
new file mode 100644
index 0000000..1d9fdf4
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_create_params.py
@@ -0,0 +1,33 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union
+from typing_extensions import Literal, Required, TypeAlias, TypedDict
+
+__all__ = ["ProxyCreateParams", "CreateSocks5Proxy", "CreateWireguardProxy"]
+
+
+class CreateSocks5Proxy(TypedDict, total=False):
+ host: Required[str]
+
+ name: Required[str]
+
+ password: Required[str]
+
+ port: Required[int]
+
+ protocol: Required[Literal["socks5"]]
+
+ user: Required[str]
+
+
+class CreateWireguardProxy(TypedDict, total=False):
+ config: Required[str]
+
+ name: Required[str]
+
+ protocol: Required[Literal["wireguard"]]
+
+
+ProxyCreateParams: TypeAlias = Union[CreateSocks5Proxy, CreateWireguardProxy]
diff --git a/src/mobilerun_sdk/types/proxy_create_response.py b/src/mobilerun_sdk/types/proxy_create_response.py
new file mode 100644
index 0000000..72a8d2c
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_create_response.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .proxy_config import ProxyConfig
+
+__all__ = ["ProxyCreateResponse"]
+
+
+class ProxyCreateResponse(BaseModel):
+ data: ProxyConfig
+
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/proxy_delete_response.py b/src/mobilerun_sdk/types/proxy_delete_response.py
new file mode 100644
index 0000000..872567b
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_delete_response.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .proxy_config import ProxyConfig
+
+__all__ = ["ProxyDeleteResponse"]
+
+
+class ProxyDeleteResponse(BaseModel):
+ data: ProxyConfig
+
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/proxy_list_params.py b/src/mobilerun_sdk/types/proxy_list_params.py
new file mode 100644
index 0000000..6b3d14f
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_list_params.py
@@ -0,0 +1,11 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, TypedDict
+
+__all__ = ["ProxyListParams"]
+
+
+class ProxyListParams(TypedDict, total=False):
+ protocol: Literal["socks5", "wireguard"]
diff --git a/src/mobilerun_sdk/types/proxy_list_response.py b/src/mobilerun_sdk/types/proxy_list_response.py
new file mode 100644
index 0000000..ff49af0
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_list_response.py
@@ -0,0 +1,12 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List
+
+from .._models import BaseModel
+from .proxy_config import ProxyConfig
+
+__all__ = ["ProxyListResponse"]
+
+
+class ProxyListResponse(BaseModel):
+ data: List[ProxyConfig]
diff --git a/src/mobilerun_sdk/types/proxy_retrieve_response.py b/src/mobilerun_sdk/types/proxy_retrieve_response.py
new file mode 100644
index 0000000..6c6a1c5
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_retrieve_response.py
@@ -0,0 +1,10 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from .._models import BaseModel
+from .proxy_config import ProxyConfig
+
+__all__ = ["ProxyRetrieveResponse"]
+
+
+class ProxyRetrieveResponse(BaseModel):
+ data: ProxyConfig
diff --git a/src/mobilerun_sdk/types/proxy_update_params.py b/src/mobilerun_sdk/types/proxy_update_params.py
new file mode 100644
index 0000000..ab81ede
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_update_params.py
@@ -0,0 +1,33 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union
+from typing_extensions import Literal, Required, TypeAlias, TypedDict
+
+__all__ = ["ProxyUpdateParams", "UpdateSocks5Proxy", "UpdateWireguardProxy"]
+
+
+class UpdateSocks5Proxy(TypedDict, total=False):
+ host: Required[str]
+
+ name: Required[str]
+
+ password: Required[str]
+
+ port: Required[int]
+
+ protocol: Required[Literal["socks5"]]
+
+ user: Required[str]
+
+
+class UpdateWireguardProxy(TypedDict, total=False):
+ config: Required[str]
+
+ name: Required[str]
+
+ protocol: Required[Literal["wireguard"]]
+
+
+ProxyUpdateParams: TypeAlias = Union[UpdateSocks5Proxy, UpdateWireguardProxy]
diff --git a/src/mobilerun_sdk/types/proxy_update_response.py b/src/mobilerun_sdk/types/proxy_update_response.py
new file mode 100644
index 0000000..f1578b4
--- /dev/null
+++ b/src/mobilerun_sdk/types/proxy_update_response.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .proxy_config import ProxyConfig
+
+__all__ = ["ProxyUpdateResponse"]
+
+
+class ProxyUpdateResponse(BaseModel):
+ data: ProxyConfig
+
+ message: str
+
+ success: Literal[True]
diff --git a/src/mobilerun_sdk/types/shared/__init__.py b/src/mobilerun_sdk/types/shared/__init__.py
index 92ac387..7d0f116 100644
--- a/src/mobilerun_sdk/types/shared/__init__.py
+++ b/src/mobilerun_sdk/types/shared/__init__.py
@@ -3,6 +3,7 @@
from .meta import Meta as Meta
from .socks5 import Socks5 as Socks5
from .location import Location as Location
+from .pagination import Pagination as Pagination
from .device_spec import DeviceSpec as DeviceSpec
from .device_carrier import DeviceCarrier as DeviceCarrier
from .permission_set import PermissionSet as PermissionSet
diff --git a/src/mobilerun_sdk/types/shared/device_spec.py b/src/mobilerun_sdk/types/shared/device_spec.py
index 0cbc319..64614c9 100644
--- a/src/mobilerun_sdk/types/shared/device_spec.py
+++ b/src/mobilerun_sdk/types/shared/device_spec.py
@@ -4,13 +4,21 @@
from pydantic import Field as FieldInfo
+from .socks5 import Socks5
from .location import Location
from ..._models import BaseModel
-from ..proxy_config import ProxyConfig
from .device_carrier import DeviceCarrier
from .device_identifiers import DeviceIdentifiers
-__all__ = ["DeviceSpec"]
+__all__ = ["DeviceSpec", "Proxy"]
+
+
+class Proxy(BaseModel):
+ name: Optional[str] = None
+
+ smart_ip: Optional[bool] = FieldInfo(alias="smartIp", default=None)
+
+ socks5: Optional[Socks5] = None
class DeviceSpec(BaseModel):
@@ -35,6 +43,6 @@ class DeviceSpec(BaseModel):
name: Optional[str] = None
- proxy: Optional[ProxyConfig] = None
+ proxy: Optional[Proxy] = None
timezone: Optional[str] = None
diff --git a/src/mobilerun_sdk/types/shared/pagination.py b/src/mobilerun_sdk/types/shared/pagination.py
new file mode 100644
index 0000000..d5a8b19
--- /dev/null
+++ b/src/mobilerun_sdk/types/shared/pagination.py
@@ -0,0 +1,21 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from pydantic import Field as FieldInfo
+
+from ..._models import BaseModel
+
+__all__ = ["Pagination"]
+
+
+class Pagination(BaseModel):
+ has_next: bool = FieldInfo(alias="hasNext")
+
+ has_prev: bool = FieldInfo(alias="hasPrev")
+
+ page: int
+
+ pages: int
+
+ page_size: int = FieldInfo(alias="pageSize")
+
+ total: int
diff --git a/src/mobilerun_sdk/types/shared_params/device_spec.py b/src/mobilerun_sdk/types/shared_params/device_spec.py
index 90a7c89..7d1a43e 100644
--- a/src/mobilerun_sdk/types/shared_params/device_spec.py
+++ b/src/mobilerun_sdk/types/shared_params/device_spec.py
@@ -5,14 +5,22 @@
from typing import Optional
from typing_extensions import Annotated, TypedDict
+from .socks5 import Socks5
from ..._types import SequenceNotStr
from ..._utils import PropertyInfo
from .location import Location
from .device_carrier import DeviceCarrier
from .device_identifiers import DeviceIdentifiers
-from ..proxy_config_param import ProxyConfigParam
-__all__ = ["DeviceSpec"]
+__all__ = ["DeviceSpec", "Proxy"]
+
+
+class Proxy(TypedDict, total=False):
+ name: str
+
+ smart_ip: Annotated[bool, PropertyInfo(alias="smartIp")]
+
+ socks5: Socks5
class DeviceSpec(TypedDict, total=False):
@@ -34,6 +42,6 @@ class DeviceSpec(TypedDict, total=False):
name: str
- proxy: ProxyConfigParam
+ proxy: Proxy
timezone: str
diff --git a/tests/api_resources/credentials/__init__.py b/tests/api_resources/credentials/__init__.py
new file mode 100644
index 0000000..fd8019a
--- /dev/null
+++ b/tests/api_resources/credentials/__init__.py
@@ -0,0 +1 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
diff --git a/tests/api_resources/credentials/packages/__init__.py b/tests/api_resources/credentials/packages/__init__.py
new file mode 100644
index 0000000..fd8019a
--- /dev/null
+++ b/tests/api_resources/credentials/packages/__init__.py
@@ -0,0 +1 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
diff --git a/tests/api_resources/credentials/packages/credentials/__init__.py b/tests/api_resources/credentials/packages/credentials/__init__.py
new file mode 100644
index 0000000..fd8019a
--- /dev/null
+++ b/tests/api_resources/credentials/packages/credentials/__init__.py
@@ -0,0 +1 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
diff --git a/tests/api_resources/credentials/packages/credentials/test_fields.py b/tests/api_resources/credentials/packages/credentials/test_fields.py
new file mode 100644
index 0000000..b16a174
--- /dev/null
+++ b/tests/api_resources/credentials/packages/credentials/test_fields.py
@@ -0,0 +1,390 @@
+# 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.credentials.packages.credentials import (
+ FieldCreateResponse,
+ FieldDeleteResponse,
+ FieldUpdateResponse,
+)
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestFields:
+ 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_create(self, client: Mobilerun) -> None:
+ field = client.credentials.packages.credentials.fields.create(
+ credential_name="credentialName",
+ package_name="packageName",
+ field_type="email",
+ value="x",
+ )
+ assert_matches_type(FieldCreateResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_create(self, client: Mobilerun) -> None:
+ response = client.credentials.packages.credentials.fields.with_raw_response.create(
+ credential_name="credentialName",
+ package_name="packageName",
+ field_type="email",
+ value="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ field = response.parse()
+ assert_matches_type(FieldCreateResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_create(self, client: Mobilerun) -> None:
+ with client.credentials.packages.credentials.fields.with_streaming_response.create(
+ credential_name="credentialName",
+ package_name="packageName",
+ field_type="email",
+ value="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ field = response.parse()
+ assert_matches_type(FieldCreateResponse, field, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_create(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ client.credentials.packages.credentials.fields.with_raw_response.create(
+ credential_name="credentialName",
+ package_name="",
+ field_type="email",
+ value="x",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ client.credentials.packages.credentials.fields.with_raw_response.create(
+ credential_name="",
+ package_name="packageName",
+ field_type="email",
+ value="x",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_update(self, client: Mobilerun) -> None:
+ field = client.credentials.packages.credentials.fields.update(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ value="x",
+ )
+ assert_matches_type(FieldUpdateResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_update(self, client: Mobilerun) -> None:
+ response = client.credentials.packages.credentials.fields.with_raw_response.update(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ value="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ field = response.parse()
+ assert_matches_type(FieldUpdateResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_update(self, client: Mobilerun) -> None:
+ with client.credentials.packages.credentials.fields.with_streaming_response.update(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ value="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ field = response.parse()
+ assert_matches_type(FieldUpdateResponse, field, 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 `package_name` but received ''"):
+ client.credentials.packages.credentials.fields.with_raw_response.update(
+ field_type="email",
+ package_name="",
+ credential_name="credentialName",
+ value="x",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ client.credentials.packages.credentials.fields.with_raw_response.update(
+ field_type="email",
+ package_name="packageName",
+ credential_name="",
+ value="x",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_delete(self, client: Mobilerun) -> None:
+ field = client.credentials.packages.credentials.fields.delete(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ )
+ assert_matches_type(FieldDeleteResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_delete(self, client: Mobilerun) -> None:
+ response = client.credentials.packages.credentials.fields.with_raw_response.delete(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ field = response.parse()
+ assert_matches_type(FieldDeleteResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_delete(self, client: Mobilerun) -> None:
+ with client.credentials.packages.credentials.fields.with_streaming_response.delete(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ field = response.parse()
+ assert_matches_type(FieldDeleteResponse, field, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_delete(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ client.credentials.packages.credentials.fields.with_raw_response.delete(
+ field_type="email",
+ package_name="",
+ credential_name="credentialName",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ client.credentials.packages.credentials.fields.with_raw_response.delete(
+ field_type="email",
+ package_name="packageName",
+ credential_name="",
+ )
+
+
+class TestAsyncFields:
+ 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_create(self, async_client: AsyncMobilerun) -> None:
+ field = await async_client.credentials.packages.credentials.fields.create(
+ credential_name="credentialName",
+ package_name="packageName",
+ field_type="email",
+ value="x",
+ )
+ assert_matches_type(FieldCreateResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_create(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.credentials.packages.credentials.fields.with_raw_response.create(
+ credential_name="credentialName",
+ package_name="packageName",
+ field_type="email",
+ value="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ field = await response.parse()
+ assert_matches_type(FieldCreateResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_create(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.credentials.packages.credentials.fields.with_streaming_response.create(
+ credential_name="credentialName",
+ package_name="packageName",
+ field_type="email",
+ value="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ field = await response.parse()
+ assert_matches_type(FieldCreateResponse, field, 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_create(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ await async_client.credentials.packages.credentials.fields.with_raw_response.create(
+ credential_name="credentialName",
+ package_name="",
+ field_type="email",
+ value="x",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ await async_client.credentials.packages.credentials.fields.with_raw_response.create(
+ credential_name="",
+ package_name="packageName",
+ field_type="email",
+ value="x",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_update(self, async_client: AsyncMobilerun) -> None:
+ field = await async_client.credentials.packages.credentials.fields.update(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ value="x",
+ )
+ assert_matches_type(FieldUpdateResponse, field, 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.credentials.packages.credentials.fields.with_raw_response.update(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ value="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ field = await response.parse()
+ assert_matches_type(FieldUpdateResponse, field, 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.credentials.packages.credentials.fields.with_streaming_response.update(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ value="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ field = await response.parse()
+ assert_matches_type(FieldUpdateResponse, field, 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 `package_name` but received ''"):
+ await async_client.credentials.packages.credentials.fields.with_raw_response.update(
+ field_type="email",
+ package_name="",
+ credential_name="credentialName",
+ value="x",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ await async_client.credentials.packages.credentials.fields.with_raw_response.update(
+ field_type="email",
+ package_name="packageName",
+ credential_name="",
+ value="x",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_delete(self, async_client: AsyncMobilerun) -> None:
+ field = await async_client.credentials.packages.credentials.fields.delete(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ )
+ assert_matches_type(FieldDeleteResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_delete(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.credentials.packages.credentials.fields.with_raw_response.delete(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ field = await response.parse()
+ assert_matches_type(FieldDeleteResponse, field, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_delete(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.credentials.packages.credentials.fields.with_streaming_response.delete(
+ field_type="email",
+ package_name="packageName",
+ credential_name="credentialName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ field = await response.parse()
+ assert_matches_type(FieldDeleteResponse, field, 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_delete(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ await async_client.credentials.packages.credentials.fields.with_raw_response.delete(
+ field_type="email",
+ package_name="",
+ credential_name="credentialName",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ await async_client.credentials.packages.credentials.fields.with_raw_response.delete(
+ field_type="email",
+ package_name="packageName",
+ credential_name="",
+ )
diff --git a/tests/api_resources/credentials/packages/test_credentials.py b/tests/api_resources/credentials/packages/test_credentials.py
new file mode 100644
index 0000000..991d557
--- /dev/null
+++ b/tests/api_resources/credentials/packages/test_credentials.py
@@ -0,0 +1,376 @@
+# 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.credentials.packages import (
+ CredentialCreateResponse,
+ CredentialDeleteResponse,
+ CredentialRetrieveResponse,
+)
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestCredentials:
+ 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_create(self, client: Mobilerun) -> None:
+ credential = client.credentials.packages.credentials.create(
+ package_name="packageName",
+ credential_name="26f1kl_-n-71",
+ fields=[
+ {
+ "field_type": "email",
+ "value": "x",
+ }
+ ],
+ )
+ assert_matches_type(CredentialCreateResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_create(self, client: Mobilerun) -> None:
+ response = client.credentials.packages.credentials.with_raw_response.create(
+ package_name="packageName",
+ credential_name="26f1kl_-n-71",
+ fields=[
+ {
+ "field_type": "email",
+ "value": "x",
+ }
+ ],
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ credential = response.parse()
+ assert_matches_type(CredentialCreateResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_create(self, client: Mobilerun) -> None:
+ with client.credentials.packages.credentials.with_streaming_response.create(
+ package_name="packageName",
+ credential_name="26f1kl_-n-71",
+ fields=[
+ {
+ "field_type": "email",
+ "value": "x",
+ }
+ ],
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ credential = response.parse()
+ assert_matches_type(CredentialCreateResponse, credential, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_create(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ client.credentials.packages.credentials.with_raw_response.create(
+ package_name="",
+ credential_name="26f1kl_-n-71",
+ fields=[
+ {
+ "field_type": "email",
+ "value": "x",
+ }
+ ],
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_retrieve(self, client: Mobilerun) -> None:
+ credential = client.credentials.packages.credentials.retrieve(
+ credential_name="credentialName",
+ package_name="packageName",
+ )
+ assert_matches_type(CredentialRetrieveResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_retrieve(self, client: Mobilerun) -> None:
+ response = client.credentials.packages.credentials.with_raw_response.retrieve(
+ credential_name="credentialName",
+ package_name="packageName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ credential = response.parse()
+ assert_matches_type(CredentialRetrieveResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_retrieve(self, client: Mobilerun) -> None:
+ with client.credentials.packages.credentials.with_streaming_response.retrieve(
+ credential_name="credentialName",
+ package_name="packageName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ credential = response.parse()
+ assert_matches_type(CredentialRetrieveResponse, credential, 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 `package_name` but received ''"):
+ client.credentials.packages.credentials.with_raw_response.retrieve(
+ credential_name="credentialName",
+ package_name="",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ client.credentials.packages.credentials.with_raw_response.retrieve(
+ credential_name="",
+ package_name="packageName",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_delete(self, client: Mobilerun) -> None:
+ credential = client.credentials.packages.credentials.delete(
+ credential_name="credentialName",
+ package_name="packageName",
+ )
+ assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_delete(self, client: Mobilerun) -> None:
+ response = client.credentials.packages.credentials.with_raw_response.delete(
+ credential_name="credentialName",
+ package_name="packageName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ credential = response.parse()
+ assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_delete(self, client: Mobilerun) -> None:
+ with client.credentials.packages.credentials.with_streaming_response.delete(
+ credential_name="credentialName",
+ package_name="packageName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ credential = response.parse()
+ assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_delete(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ client.credentials.packages.credentials.with_raw_response.delete(
+ credential_name="credentialName",
+ package_name="",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ client.credentials.packages.credentials.with_raw_response.delete(
+ credential_name="",
+ package_name="packageName",
+ )
+
+
+class TestAsyncCredentials:
+ 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_create(self, async_client: AsyncMobilerun) -> None:
+ credential = await async_client.credentials.packages.credentials.create(
+ package_name="packageName",
+ credential_name="26f1kl_-n-71",
+ fields=[
+ {
+ "field_type": "email",
+ "value": "x",
+ }
+ ],
+ )
+ assert_matches_type(CredentialCreateResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_create(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.credentials.packages.credentials.with_raw_response.create(
+ package_name="packageName",
+ credential_name="26f1kl_-n-71",
+ fields=[
+ {
+ "field_type": "email",
+ "value": "x",
+ }
+ ],
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ credential = await response.parse()
+ assert_matches_type(CredentialCreateResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_create(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.credentials.packages.credentials.with_streaming_response.create(
+ package_name="packageName",
+ credential_name="26f1kl_-n-71",
+ fields=[
+ {
+ "field_type": "email",
+ "value": "x",
+ }
+ ],
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ credential = await response.parse()
+ assert_matches_type(CredentialCreateResponse, credential, 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_create(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ await async_client.credentials.packages.credentials.with_raw_response.create(
+ package_name="",
+ credential_name="26f1kl_-n-71",
+ fields=[
+ {
+ "field_type": "email",
+ "value": "x",
+ }
+ ],
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_retrieve(self, async_client: AsyncMobilerun) -> None:
+ credential = await async_client.credentials.packages.credentials.retrieve(
+ credential_name="credentialName",
+ package_name="packageName",
+ )
+ assert_matches_type(CredentialRetrieveResponse, credential, 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.credentials.packages.credentials.with_raw_response.retrieve(
+ credential_name="credentialName",
+ package_name="packageName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ credential = await response.parse()
+ assert_matches_type(CredentialRetrieveResponse, credential, 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.credentials.packages.credentials.with_streaming_response.retrieve(
+ credential_name="credentialName",
+ package_name="packageName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ credential = await response.parse()
+ assert_matches_type(CredentialRetrieveResponse, credential, 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 `package_name` but received ''"):
+ await async_client.credentials.packages.credentials.with_raw_response.retrieve(
+ credential_name="credentialName",
+ package_name="",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ await async_client.credentials.packages.credentials.with_raw_response.retrieve(
+ credential_name="",
+ package_name="packageName",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_delete(self, async_client: AsyncMobilerun) -> None:
+ credential = await async_client.credentials.packages.credentials.delete(
+ credential_name="credentialName",
+ package_name="packageName",
+ )
+ assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_delete(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.credentials.packages.credentials.with_raw_response.delete(
+ credential_name="credentialName",
+ package_name="packageName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ credential = await response.parse()
+ assert_matches_type(CredentialDeleteResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_delete(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.credentials.packages.credentials.with_streaming_response.delete(
+ credential_name="credentialName",
+ package_name="packageName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ credential = await response.parse()
+ assert_matches_type(CredentialDeleteResponse, credential, 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_delete(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ await async_client.credentials.packages.credentials.with_raw_response.delete(
+ credential_name="credentialName",
+ package_name="",
+ )
+
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `credential_name` but received ''"):
+ await async_client.credentials.packages.credentials.with_raw_response.delete(
+ credential_name="",
+ package_name="packageName",
+ )
diff --git a/tests/api_resources/credentials/test_packages.py b/tests/api_resources/credentials/test_packages.py
new file mode 100644
index 0000000..fe14887
--- /dev/null
+++ b/tests/api_resources/credentials/test_packages.py
@@ -0,0 +1,176 @@
+# 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.credentials import PackageListResponse, PackageCreateResponse
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestPackages:
+ 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_create(self, client: Mobilerun) -> None:
+ package = client.credentials.packages.create(
+ package_name="packageName",
+ )
+ assert_matches_type(PackageCreateResponse, package, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_create(self, client: Mobilerun) -> None:
+ response = client.credentials.packages.with_raw_response.create(
+ package_name="packageName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ package = response.parse()
+ assert_matches_type(PackageCreateResponse, package, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_create(self, client: Mobilerun) -> None:
+ with client.credentials.packages.with_streaming_response.create(
+ package_name="packageName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ package = response.parse()
+ assert_matches_type(PackageCreateResponse, package, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list(self, client: Mobilerun) -> None:
+ package = client.credentials.packages.list(
+ "packageName",
+ )
+ assert_matches_type(PackageListResponse, package, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list(self, client: Mobilerun) -> None:
+ response = client.credentials.packages.with_raw_response.list(
+ "packageName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ package = response.parse()
+ assert_matches_type(PackageListResponse, package, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list(self, client: Mobilerun) -> None:
+ with client.credentials.packages.with_streaming_response.list(
+ "packageName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ package = response.parse()
+ assert_matches_type(PackageListResponse, package, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_list(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ client.credentials.packages.with_raw_response.list(
+ "",
+ )
+
+
+class TestAsyncPackages:
+ 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_create(self, async_client: AsyncMobilerun) -> None:
+ package = await async_client.credentials.packages.create(
+ package_name="packageName",
+ )
+ assert_matches_type(PackageCreateResponse, package, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_create(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.credentials.packages.with_raw_response.create(
+ package_name="packageName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ package = await response.parse()
+ assert_matches_type(PackageCreateResponse, package, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_create(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.credentials.packages.with_streaming_response.create(
+ package_name="packageName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ package = await response.parse()
+ assert_matches_type(PackageCreateResponse, package, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list(self, async_client: AsyncMobilerun) -> None:
+ package = await async_client.credentials.packages.list(
+ "packageName",
+ )
+ assert_matches_type(PackageListResponse, package, 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.credentials.packages.with_raw_response.list(
+ "packageName",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ package = await response.parse()
+ assert_matches_type(PackageListResponse, package, 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.credentials.packages.with_streaming_response.list(
+ "packageName",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ package = await response.parse()
+ assert_matches_type(PackageListResponse, package, 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_list(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `package_name` but received ''"):
+ await async_client.credentials.packages.with_raw_response.list(
+ "",
+ )
diff --git a/tests/api_resources/test_apps.py b/tests/api_resources/test_apps.py
new file mode 100644
index 0000000..7fd88df
--- /dev/null
+++ b/tests/api_resources/test_apps.py
@@ -0,0 +1,712 @@
+# 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 (
+ AppListResponse,
+ AppDeleteResponse,
+ AppRetrieveResponse,
+ AppMarkFailedResponse,
+ AppListVersionsResponse,
+ AppConfirmUploadResponse,
+ AppCreateSignedUploadURLResponse,
+)
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestApps:
+ 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:
+ app = client.apps.retrieve(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppRetrieveResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_retrieve(self, client: Mobilerun) -> None:
+ response = client.apps.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"
+ app = response.parse()
+ assert_matches_type(AppRetrieveResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_retrieve(self, client: Mobilerun) -> None:
+ with client.apps.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"
+
+ app = response.parse()
+ assert_matches_type(AppRetrieveResponse, app, 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 `id` but received ''"):
+ client.apps.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list(self, client: Mobilerun) -> None:
+ app = client.apps.list()
+ assert_matches_type(AppListResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_with_all_params(self, client: Mobilerun) -> None:
+ app = client.apps.list(
+ order="asc",
+ page=1,
+ page_size=1,
+ platform="all",
+ query="query",
+ sort_by="createdAt",
+ status="all",
+ )
+ assert_matches_type(AppListResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list(self, client: Mobilerun) -> None:
+ response = client.apps.with_raw_response.list()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = response.parse()
+ assert_matches_type(AppListResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list(self, client: Mobilerun) -> None:
+ with client.apps.with_streaming_response.list() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = response.parse()
+ assert_matches_type(AppListResponse, app, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_delete(self, client: Mobilerun) -> None:
+ app = client.apps.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppDeleteResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_delete(self, client: Mobilerun) -> None:
+ response = client.apps.with_raw_response.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = response.parse()
+ assert_matches_type(AppDeleteResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_delete(self, client: Mobilerun) -> None:
+ with client.apps.with_streaming_response.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = response.parse()
+ assert_matches_type(AppDeleteResponse, app, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_delete(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ client.apps.with_raw_response.delete(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_confirm_upload(self, client: Mobilerun) -> None:
+ app = client.apps.confirm_upload(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_confirm_upload(self, client: Mobilerun) -> None:
+ response = client.apps.with_raw_response.confirm_upload(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = response.parse()
+ assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_confirm_upload(self, client: Mobilerun) -> None:
+ with client.apps.with_streaming_response.confirm_upload(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = response.parse()
+ assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_confirm_upload(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ client.apps.with_raw_response.confirm_upload(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_create_signed_upload_url(self, client: Mobilerun) -> None:
+ app = client.apps.create_signed_upload_url(
+ bundle_id="x",
+ display_name="x",
+ files=[
+ {
+ "content_type": "x",
+ "file_name": "x",
+ }
+ ],
+ size_bytes=0,
+ version_code=0,
+ version_name="x",
+ )
+ assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_create_signed_upload_url_with_all_params(self, client: Mobilerun) -> None:
+ app = client.apps.create_signed_upload_url(
+ bundle_id="x",
+ display_name="x",
+ files=[
+ {
+ "content_type": "x",
+ "file_name": "x",
+ }
+ ],
+ size_bytes=0,
+ version_code=0,
+ version_name="x",
+ country="US",
+ description="description",
+ developer_name="developerName",
+ icon_url="iconURL",
+ platform="android",
+ target_sdk=0,
+ )
+ assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_create_signed_upload_url(self, client: Mobilerun) -> None:
+ response = client.apps.with_raw_response.create_signed_upload_url(
+ bundle_id="x",
+ display_name="x",
+ files=[
+ {
+ "content_type": "x",
+ "file_name": "x",
+ }
+ ],
+ size_bytes=0,
+ version_code=0,
+ version_name="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = response.parse()
+ assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_create_signed_upload_url(self, client: Mobilerun) -> None:
+ with client.apps.with_streaming_response.create_signed_upload_url(
+ bundle_id="x",
+ display_name="x",
+ files=[
+ {
+ "content_type": "x",
+ "file_name": "x",
+ }
+ ],
+ size_bytes=0,
+ version_code=0,
+ version_name="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = response.parse()
+ assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_versions(self, client: Mobilerun) -> None:
+ app = client.apps.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list_versions(self, client: Mobilerun) -> None:
+ response = client.apps.with_raw_response.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = response.parse()
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list_versions(self, client: Mobilerun) -> None:
+ with client.apps.with_streaming_response.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = response.parse()
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_list_versions(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ client.apps.with_raw_response.list_versions(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_mark_failed(self, client: Mobilerun) -> None:
+ app = client.apps.mark_failed(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppMarkFailedResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_mark_failed(self, client: Mobilerun) -> None:
+ response = client.apps.with_raw_response.mark_failed(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = response.parse()
+ assert_matches_type(AppMarkFailedResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_mark_failed(self, client: Mobilerun) -> None:
+ with client.apps.with_streaming_response.mark_failed(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = response.parse()
+ assert_matches_type(AppMarkFailedResponse, app, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_mark_failed(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ client.apps.with_raw_response.mark_failed(
+ "",
+ )
+
+
+class TestAsyncApps:
+ 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:
+ app = await async_client.apps.retrieve(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppRetrieveResponse, app, 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.apps.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"
+ app = await response.parse()
+ assert_matches_type(AppRetrieveResponse, app, 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.apps.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"
+
+ app = await response.parse()
+ assert_matches_type(AppRetrieveResponse, app, 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 `id` but received ''"):
+ await async_client.apps.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.apps.list()
+ assert_matches_type(AppListResponse, app, 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:
+ app = await async_client.apps.list(
+ order="asc",
+ page=1,
+ page_size=1,
+ platform="all",
+ query="query",
+ sort_by="createdAt",
+ status="all",
+ )
+ assert_matches_type(AppListResponse, app, 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.apps.with_raw_response.list()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = await response.parse()
+ assert_matches_type(AppListResponse, app, 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.apps.with_streaming_response.list() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = await response.parse()
+ assert_matches_type(AppListResponse, app, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_delete(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.apps.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppDeleteResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_delete(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.apps.with_raw_response.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = await response.parse()
+ assert_matches_type(AppDeleteResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_delete(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.apps.with_streaming_response.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = await response.parse()
+ assert_matches_type(AppDeleteResponse, app, 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_delete(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ await async_client.apps.with_raw_response.delete(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_confirm_upload(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.apps.confirm_upload(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_confirm_upload(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.apps.with_raw_response.confirm_upload(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = await response.parse()
+ assert_matches_type(AppConfirmUploadResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_confirm_upload(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.apps.with_streaming_response.confirm_upload(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = await response.parse()
+ assert_matches_type(AppConfirmUploadResponse, app, 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_confirm_upload(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ await async_client.apps.with_raw_response.confirm_upload(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_create_signed_upload_url(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.apps.create_signed_upload_url(
+ bundle_id="x",
+ display_name="x",
+ files=[
+ {
+ "content_type": "x",
+ "file_name": "x",
+ }
+ ],
+ size_bytes=0,
+ version_code=0,
+ version_name="x",
+ )
+ assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_create_signed_upload_url_with_all_params(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.apps.create_signed_upload_url(
+ bundle_id="x",
+ display_name="x",
+ files=[
+ {
+ "content_type": "x",
+ "file_name": "x",
+ }
+ ],
+ size_bytes=0,
+ version_code=0,
+ version_name="x",
+ country="US",
+ description="description",
+ developer_name="developerName",
+ icon_url="iconURL",
+ platform="android",
+ target_sdk=0,
+ )
+ assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_create_signed_upload_url(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.apps.with_raw_response.create_signed_upload_url(
+ bundle_id="x",
+ display_name="x",
+ files=[
+ {
+ "content_type": "x",
+ "file_name": "x",
+ }
+ ],
+ size_bytes=0,
+ version_code=0,
+ version_name="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = await response.parse()
+ assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_create_signed_upload_url(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.apps.with_streaming_response.create_signed_upload_url(
+ bundle_id="x",
+ display_name="x",
+ files=[
+ {
+ "content_type": "x",
+ "file_name": "x",
+ }
+ ],
+ size_bytes=0,
+ version_code=0,
+ version_name="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = await response.parse()
+ assert_matches_type(AppCreateSignedUploadURLResponse, app, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list_versions(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.apps.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_list_versions(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.apps.with_raw_response.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = await response.parse()
+ assert_matches_type(AppListVersionsResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_list_versions(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.apps.with_streaming_response.list_versions(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = await response.parse()
+ assert_matches_type(AppListVersionsResponse, app, 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_list_versions(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ await async_client.apps.with_raw_response.list_versions(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_mark_failed(self, async_client: AsyncMobilerun) -> None:
+ app = await async_client.apps.mark_failed(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(AppMarkFailedResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_mark_failed(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.apps.with_raw_response.mark_failed(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ app = await response.parse()
+ assert_matches_type(AppMarkFailedResponse, app, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_mark_failed(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.apps.with_streaming_response.mark_failed(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ app = await response.parse()
+ assert_matches_type(AppMarkFailedResponse, app, 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_mark_failed(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ await async_client.apps.with_raw_response.mark_failed(
+ "",
+ )
diff --git a/tests/api_resources/test_credentials.py b/tests/api_resources/test_credentials.py
new file mode 100644
index 0000000..d125d22
--- /dev/null
+++ b/tests/api_resources/test_credentials.py
@@ -0,0 +1,98 @@
+# 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 CredentialListResponse
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestCredentials:
+ 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:
+ credential = client.credentials.list()
+ assert_matches_type(CredentialListResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_with_all_params(self, client: Mobilerun) -> None:
+ credential = client.credentials.list(
+ page=1,
+ page_size=1,
+ )
+ assert_matches_type(CredentialListResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list(self, client: Mobilerun) -> None:
+ response = client.credentials.with_raw_response.list()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ credential = response.parse()
+ assert_matches_type(CredentialListResponse, credential, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list(self, client: Mobilerun) -> None:
+ with client.credentials.with_streaming_response.list() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ credential = response.parse()
+ assert_matches_type(CredentialListResponse, credential, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncCredentials:
+ 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:
+ credential = await async_client.credentials.list()
+ assert_matches_type(CredentialListResponse, credential, 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:
+ credential = await async_client.credentials.list(
+ page=1,
+ page_size=1,
+ )
+ assert_matches_type(CredentialListResponse, credential, 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.credentials.with_raw_response.list()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ credential = await response.parse()
+ assert_matches_type(CredentialListResponse, credential, 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.credentials.with_streaming_response.list() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ credential = await response.parse()
+ assert_matches_type(CredentialListResponse, credential, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_proxies.py b/tests/api_resources/test_proxies.py
index 1a6fc78..b96cc4d 100644
--- a/tests/api_resources/test_proxies.py
+++ b/tests/api_resources/test_proxies.py
@@ -9,7 +9,14 @@
from tests.utils import assert_matches_type
from mobilerun_sdk import Mobilerun, AsyncMobilerun
-from mobilerun_sdk.types import ProxyLookupResponse
+from mobilerun_sdk.types import (
+ ProxyListResponse,
+ ProxyCreateResponse,
+ ProxyDeleteResponse,
+ ProxyLookupResponse,
+ ProxyUpdateResponse,
+ ProxyRetrieveResponse,
+)
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -17,6 +24,335 @@
class TestProxies:
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_create_overload_1(self, client: Mobilerun) -> None:
+ proxy = client.proxies.create(
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_create_overload_1(self, client: Mobilerun) -> None:
+ response = client.proxies.with_raw_response.create(
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = response.parse()
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_create_overload_1(self, client: Mobilerun) -> None:
+ with client.proxies.with_streaming_response.create(
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = response.parse()
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_create_overload_2(self, client: Mobilerun) -> None:
+ proxy = client.proxies.create(
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_create_overload_2(self, client: Mobilerun) -> None:
+ response = client.proxies.with_raw_response.create(
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = response.parse()
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_create_overload_2(self, client: Mobilerun) -> None:
+ with client.proxies.with_streaming_response.create(
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = response.parse()
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_retrieve(self, client: Mobilerun) -> None:
+ proxy = client.proxies.retrieve(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(ProxyRetrieveResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_retrieve(self, client: Mobilerun) -> None:
+ response = client.proxies.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"
+ proxy = response.parse()
+ assert_matches_type(ProxyRetrieveResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_retrieve(self, client: Mobilerun) -> None:
+ with client.proxies.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"
+
+ proxy = response.parse()
+ assert_matches_type(ProxyRetrieveResponse, proxy, 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 `proxy_id` but received ''"):
+ client.proxies.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_update_overload_1(self, client: Mobilerun) -> None:
+ proxy = client.proxies.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+ assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_update_overload_1(self, client: Mobilerun) -> None:
+ response = client.proxies.with_raw_response.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = response.parse()
+ assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_update_overload_1(self, client: Mobilerun) -> None:
+ with client.proxies.with_streaming_response.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = response.parse()
+ assert_matches_type(ProxyUpdateResponse, proxy, 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_overload_1(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
+ client.proxies.with_raw_response.update(
+ proxy_id="",
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_update_overload_2(self, client: Mobilerun) -> None:
+ proxy = client.proxies.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+ assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_update_overload_2(self, client: Mobilerun) -> None:
+ response = client.proxies.with_raw_response.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = response.parse()
+ assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_update_overload_2(self, client: Mobilerun) -> None:
+ with client.proxies.with_streaming_response.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = response.parse()
+ assert_matches_type(ProxyUpdateResponse, proxy, 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_overload_2(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
+ client.proxies.with_raw_response.update(
+ proxy_id="",
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list(self, client: Mobilerun) -> None:
+ proxy = client.proxies.list()
+ assert_matches_type(ProxyListResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_list_with_all_params(self, client: Mobilerun) -> None:
+ proxy = client.proxies.list(
+ protocol="socks5",
+ )
+ assert_matches_type(ProxyListResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_list(self, client: Mobilerun) -> None:
+ response = client.proxies.with_raw_response.list()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = response.parse()
+ assert_matches_type(ProxyListResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_list(self, client: Mobilerun) -> None:
+ with client.proxies.with_streaming_response.list() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = response.parse()
+ assert_matches_type(ProxyListResponse, proxy, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_delete(self, client: Mobilerun) -> None:
+ proxy = client.proxies.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_delete(self, client: Mobilerun) -> None:
+ response = client.proxies.with_raw_response.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = response.parse()
+ assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_delete(self, client: Mobilerun) -> None:
+ with client.proxies.with_streaming_response.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = response.parse()
+ assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_path_params_delete(self, client: Mobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
+ client.proxies.with_raw_response.delete(
+ "",
+ )
+
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_lookup(self, client: Mobilerun) -> None:
@@ -79,6 +415,335 @@ class TestAsyncProxies:
"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_create_overload_1(self, async_client: AsyncMobilerun) -> None:
+ proxy = await async_client.proxies.create(
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_create_overload_1(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.proxies.with_raw_response.create(
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = await response.parse()
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_create_overload_1(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.proxies.with_streaming_response.create(
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = await response.parse()
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_create_overload_2(self, async_client: AsyncMobilerun) -> None:
+ proxy = await async_client.proxies.create(
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_create_overload_2(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.proxies.with_raw_response.create(
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = await response.parse()
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_create_overload_2(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.proxies.with_streaming_response.create(
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = await response.parse()
+ assert_matches_type(ProxyCreateResponse, proxy, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_retrieve(self, async_client: AsyncMobilerun) -> None:
+ proxy = await async_client.proxies.retrieve(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(ProxyRetrieveResponse, proxy, 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.proxies.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"
+ proxy = await response.parse()
+ assert_matches_type(ProxyRetrieveResponse, proxy, 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.proxies.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"
+
+ proxy = await response.parse()
+ assert_matches_type(ProxyRetrieveResponse, proxy, 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 `proxy_id` but received ''"):
+ await async_client.proxies.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_update_overload_1(self, async_client: AsyncMobilerun) -> None:
+ proxy = await async_client.proxies.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+ assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_update_overload_1(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.proxies.with_raw_response.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = await response.parse()
+ assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_update_overload_1(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.proxies.with_streaming_response.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = await response.parse()
+ assert_matches_type(ProxyUpdateResponse, proxy, 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_overload_1(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
+ await async_client.proxies.with_raw_response.update(
+ proxy_id="",
+ host="x",
+ name="xxx",
+ password="x",
+ port=1,
+ protocol="socks5",
+ user="x",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_update_overload_2(self, async_client: AsyncMobilerun) -> None:
+ proxy = await async_client.proxies.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+ assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_update_overload_2(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.proxies.with_raw_response.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = await response.parse()
+ assert_matches_type(ProxyUpdateResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_update_overload_2(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.proxies.with_streaming_response.update(
+ proxy_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = await response.parse()
+ assert_matches_type(ProxyUpdateResponse, proxy, 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_overload_2(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
+ await async_client.proxies.with_raw_response.update(
+ proxy_id="",
+ config="x",
+ name="xxx",
+ protocol="wireguard",
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_list(self, async_client: AsyncMobilerun) -> None:
+ proxy = await async_client.proxies.list()
+ assert_matches_type(ProxyListResponse, proxy, 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:
+ proxy = await async_client.proxies.list(
+ protocol="socks5",
+ )
+ assert_matches_type(ProxyListResponse, proxy, 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.proxies.with_raw_response.list()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = await response.parse()
+ assert_matches_type(ProxyListResponse, proxy, 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.proxies.with_streaming_response.list() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = await response.parse()
+ assert_matches_type(ProxyListResponse, proxy, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_delete(self, async_client: AsyncMobilerun) -> None:
+ proxy = await async_client.proxies.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+ assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_delete(self, async_client: AsyncMobilerun) -> None:
+ response = await async_client.proxies.with_raw_response.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ proxy = await response.parse()
+ assert_matches_type(ProxyDeleteResponse, proxy, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_delete(self, async_client: AsyncMobilerun) -> None:
+ async with async_client.proxies.with_streaming_response.delete(
+ "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ proxy = await response.parse()
+ assert_matches_type(ProxyDeleteResponse, proxy, 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_delete(self, async_client: AsyncMobilerun) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `proxy_id` but received ''"):
+ await async_client.proxies.with_raw_response.delete(
+ "",
+ )
+
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_method_lookup(self, async_client: AsyncMobilerun) -> None:
From 6413e60d73b86fab265de2f2fba94dba21e89d4d Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 30 May 2026 13:00:32 +0000
Subject: [PATCH 6/7] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 6616e99..8930df3 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 107
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-506128e71e04bea5ce31fd879d4c0ac5a313fc39cf9f39acd1cbb3cee95f74ab.yml
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/droidrun/droidrun-cloud-e96db2fc0746ff1c11c2e36e7c3bc2e3765b194d9901897d24a376528208e816.yml
openapi_spec_hash: b45c764022d18add79f0516691749fa8
-config_hash: 86398ea1292189c25296aefb64d3137d
+config_hash: e6de87b533e3e7e6470b59c22d61752a
From 728e88c1a8312dcc1d240592ea80b1f852b13ab8 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 30 May 2026 13:00:53 +0000
Subject: [PATCH 7/7] release: 3.3.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 11 +++++++++++
pyproject.toml | 2 +-
src/mobilerun_sdk/_version.py | 2 +-
4 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 1f73031..ff1c7af 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "3.2.0"
+ ".": "3.3.0"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 91e1a63..17bb129 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,16 @@
# Changelog
+## 3.3.0 (2026-05-30)
+
+Full Changelog: [v3.2.0...v3.3.0](https://github.com/droidrun/mobilerun-sdk-python/compare/v3.2.0...v3.3.0)
+
+### Features
+
+* **api:** api update ([472689f](https://github.com/droidrun/mobilerun-sdk-python/commit/472689f40d0225edcedb331fabda5d9b5ddbe390))
+* **api:** api update ([b58be1c](https://github.com/droidrun/mobilerun-sdk-python/commit/b58be1c00be168f8719a56d2ce5c1806ac30ef92))
+* **api:** api update ([2add42e](https://github.com/droidrun/mobilerun-sdk-python/commit/2add42ec33a0accad90ab5afe8d27ce22629b871))
+* **api:** manual updates ([88c9ae0](https://github.com/droidrun/mobilerun-sdk-python/commit/88c9ae09fe4979789e30e859bf9f7d57f39887c2))
+
## 3.2.0 (2026-05-21)
Full Changelog: [v3.1.0...v3.2.0](https://github.com/droidrun/mobilerun-sdk-python/compare/v3.1.0...v3.2.0)
diff --git a/pyproject.toml b/pyproject.toml
index b097c23..902a0c7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "mobilerun-sdk"
-version = "3.2.0"
+version = "3.3.0"
description = "The official Python library for the mobilerun API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/mobilerun_sdk/_version.py b/src/mobilerun_sdk/_version.py
index a3beadb..fa98252 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__ = "3.2.0" # x-release-please-version
+__version__ = "3.3.0" # x-release-please-version