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