diff --git a/example/example.py b/example/example.py index 528f78ab..47928b49 100644 --- a/example/example.py +++ b/example/example.py @@ -172,6 +172,7 @@ async def main(): await client.items.delete(created_item.vault_id, updated_item.id) # [developer-docs.sdk.python.delete-item]-end + ## NOTE: this is in a separate function to avoid creating a new item ## NOTE: just for the sake of archiving it. This is because the SDK ## NOTE: only works with active items, so archiving and then deleting @@ -207,14 +208,15 @@ async def share_item(client: Client, vault_id: str, item_id: str): item, policy, ItemShareParams( - recipients = valid_recipients, - expireAfter= ItemShareDuration.ONEHOUR, - oneTimeOnly= False, + recipients=valid_recipients, + expireAfter=ItemShareDuration.ONEHOUR, + oneTimeOnly=False, ), ) print(share_link) # [developer-docs.sdk.python.item-share-create-share]-end + if __name__ == "__main__": asyncio.run(main()) diff --git a/src/onepassword/__init__.py b/src/onepassword/__init__.py index a605b0a8..040ae01c 100644 --- a/src/onepassword/__init__.py +++ b/src/onepassword/__init__.py @@ -3,6 +3,7 @@ from .client import Client from .defaults import DEFAULT_INTEGRATION_NAME, DEFAULT_INTEGRATION_VERSION from .types import * # noqa F403 +from .errors import * # noqa F403 from .secrets import Secrets from .items import Items from .vaults import Vaults @@ -32,3 +33,11 @@ or type(obj) == typing._LiteralGenericAlias ): __all__.append(name) + +for name, obj in inspect.getmembers(sys.modules["onepassword.errors"]): + # Add all classes defined in errors.py. + if ( + inspect.isclass(obj) + and inspect.getmodule(obj) == sys.modules["onepassword.errors"] + ): + __all__.append(name) diff --git a/src/onepassword/core.py b/src/onepassword/core.py index c3cf8e68..be67d383 100644 --- a/src/onepassword/core.py +++ b/src/onepassword/core.py @@ -1,6 +1,8 @@ import json import platform +from onepassword.errors import raise_typed_exception + machine_arch = platform.machine().lower() @@ -16,17 +18,26 @@ # InitClient creates a client instance in the current core module and returns its unique ID. async def _init_client(client_config): - return await core.init_client(json.dumps(client_config)) + try: + return await core.init_client(json.dumps(client_config)) + except Exception as e: + raise_typed_exception(e) # Invoke calls specified business logic from the SDK core. async def _invoke(invoke_config): - return await core.invoke(json.dumps(invoke_config)) + try: + return await core.invoke(json.dumps(invoke_config)) + except Exception as e: + raise_typed_exception(e) # Invoke calls specified business logic from the SDK core. def _invoke_sync(invoke_config): - return core.invoke_sync(json.dumps(invoke_config)) + try: + return core.invoke_sync(json.dumps(invoke_config)) + except Exception as e: + raise_typed_exception(e) # ReleaseClient releases memory in the SDK core associated with the given client ID. diff --git a/src/onepassword/errors.py b/src/onepassword/errors.py new file mode 100644 index 00000000..f802da9b --- /dev/null +++ b/src/onepassword/errors.py @@ -0,0 +1,25 @@ +# Code generated by op-codegen - DO NO EDIT MANUALLY + +import json + + +class RateLimitExceededException(Exception): + def __init__(self, message): + self.message = message + super().__init__(self.message) + + +def raise_typed_exception(e: Exception): + try: + typed_error = json.loads(e.msg) + except Exception: + raise e + + message = typed_error.get("message") + error_name = typed_error.get("name") + if error_name == "RateLimitExceeded": + raise RateLimitExceededException(message) + elif message is not None: + raise Exception(message) + else: + raise e diff --git a/src/onepassword/items.py b/src/onepassword/items.py index 60112050..cfff2634 100644 --- a/src/onepassword/items.py +++ b/src/onepassword/items.py @@ -1,7 +1,8 @@ # Code generated by op-codegen - DO NO EDIT MANUALLY -from .core import _invoke +from .core import _invoke, _invoke_sync from .iterator import SDKIterator +from typing import Optional, List from pydantic import TypeAdapter from .items_shares import ItemsShares from .types import Item, ItemCreateParams, ItemOverview @@ -73,7 +74,7 @@ async def put(self, item: Item) -> Item: response = TypeAdapter(Item).validate_json(response) return response - async def delete(self, vault_id: str, item_id: str): + async def delete(self, vault_id: str, item_id: str) -> None: """ Delete an item. """ @@ -91,7 +92,7 @@ async def delete(self, vault_id: str, item_id: str): return None - async def archive(self, vault_id: str, item_id: str): + async def archive(self, vault_id: str, item_id: str) -> None: """ Archive an item. """ @@ -125,5 +126,5 @@ async def list_all(self, vault_id: str) -> SDKIterator[ItemOverview]: } ) - response = TypeAdapter(list[ItemOverview]).validate_json(response) + response = TypeAdapter(List[ItemOverview]).validate_json(response) return SDKIterator(response) diff --git a/src/onepassword/items_shares.py b/src/onepassword/items_shares.py index 93939681..c0cabaae 100644 --- a/src/onepassword/items_shares.py +++ b/src/onepassword/items_shares.py @@ -1,6 +1,8 @@ # Code generated by op-codegen - DO NO EDIT MANUALLY -from .core import _invoke +from .core import _invoke, _invoke_sync +from .iterator import SDKIterator +from typing import Optional, List from pydantic import TypeAdapter from .types import Item, ItemShareAccountPolicy, ItemShareParams, ValidRecipient @@ -31,8 +33,8 @@ async def get_account_policy( return response async def validate_recipients( - self, policy: ItemShareAccountPolicy, recipients: list[str] - ) -> list[ValidRecipient]: + self, policy: ItemShareAccountPolicy, recipients: List[str] + ) -> List[ValidRecipient]: """ Validate the recipients of an item sharing link. """ @@ -51,7 +53,7 @@ async def validate_recipients( } ) - response = TypeAdapter(list[ValidRecipient]).validate_json(response) + response = TypeAdapter(List[ValidRecipient]).validate_json(response) return response async def create( diff --git a/src/onepassword/lib/aarch64/libop_uniffi_core.dylib b/src/onepassword/lib/aarch64/libop_uniffi_core.dylib index 3c68bd12..b5cecbf3 100755 Binary files a/src/onepassword/lib/aarch64/libop_uniffi_core.dylib and b/src/onepassword/lib/aarch64/libop_uniffi_core.dylib differ diff --git a/src/onepassword/lib/aarch64/libop_uniffi_core.so b/src/onepassword/lib/aarch64/libop_uniffi_core.so index e62007d8..b6969e9a 100755 Binary files a/src/onepassword/lib/aarch64/libop_uniffi_core.so and b/src/onepassword/lib/aarch64/libop_uniffi_core.so differ diff --git a/src/onepassword/lib/x86_64/libop_uniffi_core.dylib b/src/onepassword/lib/x86_64/libop_uniffi_core.dylib index 45f17654..7b6137a9 100755 Binary files a/src/onepassword/lib/x86_64/libop_uniffi_core.dylib and b/src/onepassword/lib/x86_64/libop_uniffi_core.dylib differ diff --git a/src/onepassword/lib/x86_64/libop_uniffi_core.so b/src/onepassword/lib/x86_64/libop_uniffi_core.so index c663906d..c980d2bc 100755 Binary files a/src/onepassword/lib/x86_64/libop_uniffi_core.so and b/src/onepassword/lib/x86_64/libop_uniffi_core.so differ diff --git a/src/onepassword/lib/x86_64/op_uniffi_core.dll b/src/onepassword/lib/x86_64/op_uniffi_core.dll index c7fe3786..6c5371d3 100644 Binary files a/src/onepassword/lib/x86_64/op_uniffi_core.dll and b/src/onepassword/lib/x86_64/op_uniffi_core.dll differ diff --git a/src/onepassword/secrets.py b/src/onepassword/secrets.py index dc0bb6a3..7a2a004c 100644 --- a/src/onepassword/secrets.py +++ b/src/onepassword/secrets.py @@ -1,6 +1,8 @@ # Code generated by op-codegen - DO NO EDIT MANUALLY from .core import _invoke, _invoke_sync +from .iterator import SDKIterator +from typing import Optional, List from pydantic import TypeAdapter from .types import GeneratePasswordResponse, PasswordRecipe @@ -34,7 +36,7 @@ async def resolve(self, secret_reference: str) -> str: return response @staticmethod - def validate_secret_reference(secret_reference: str): + def validate_secret_reference(secret_reference: str) -> None: """ Validate the secret reference to ensure there are no syntax errors. """ diff --git a/src/onepassword/vaults.py b/src/onepassword/vaults.py index 84e7555e..738e8b6c 100644 --- a/src/onepassword/vaults.py +++ b/src/onepassword/vaults.py @@ -1,7 +1,8 @@ # Code generated by op-codegen - DO NO EDIT MANUALLY -from .core import _invoke +from .core import _invoke, _invoke_sync from .iterator import SDKIterator +from typing import Optional, List from pydantic import TypeAdapter from .types import VaultOverview @@ -27,5 +28,5 @@ async def list_all(self) -> SDKIterator[VaultOverview]: } ) - response = TypeAdapter(list[VaultOverview]).validate_json(response) + response = TypeAdapter(List[VaultOverview]).validate_json(response) return SDKIterator(response)