From fd296fe7b21c62d430485de3fedfda51821aafad Mon Sep 17 00:00:00 2001 From: jake-valsamis Date: Tue, 31 Dec 2024 12:33:47 -0500 Subject: [PATCH 1/8] add next_token to SearchParams and SearchResults --- src/codeocean/data_asset.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/codeocean/data_asset.py b/src/codeocean/data_asset.py index 7b8e10c..839fe5c 100644 --- a/src/codeocean/data_asset.py +++ b/src/codeocean/data_asset.py @@ -204,6 +204,7 @@ class DataAssetSearchParams: archived: bool favorite: bool query: Optional[str] = None + next_token: Optional[str] = None sort_field: Optional[DataAssetSortBy] = None sort_order: Optional[SortOrder] = None type: Optional[DataAssetType] = None @@ -217,6 +218,7 @@ class DataAssetSearchParams: class DataAssetSearchResults: has_more: bool results: list[DataAsset] + next_token: Optional[str] = None @dataclass_json From f92ba17aa2aba26048c794c4b5f204e23dfb5122 Mon Sep 17 00:00:00 2001 From: jake-valsamis Date: Tue, 31 Dec 2024 15:16:11 -0500 Subject: [PATCH 2/8] Make all DataAssetSearchParams optional --- src/codeocean/data_asset.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/codeocean/data_asset.py b/src/codeocean/data_asset.py index 839fe5c..f2b6530 100644 --- a/src/codeocean/data_asset.py +++ b/src/codeocean/data_asset.py @@ -199,10 +199,10 @@ class DataAssetSearchOrigin(StrEnum): @dataclass_json @dataclass(frozen=True) class DataAssetSearchParams: - limit: int - offset: int - archived: bool - favorite: bool + limit: Optional[int] = None + offset: Optional[int] = None + archived: Optional[bool] = None + favorite: Optional[bool] = None query: Optional[str] = None next_token: Optional[str] = None sort_field: Optional[DataAssetSortBy] = None From ebae2492b2fcb071cda07c5070e6307b9acea1e1 Mon Sep 17 00:00:00 2001 From: jake-valsamis Date: Tue, 31 Dec 2024 15:31:08 -0500 Subject: [PATCH 3/8] add model as DataAssetType --- src/codeocean/data_asset.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/codeocean/data_asset.py b/src/codeocean/data_asset.py index f2b6530..09a3054 100644 --- a/src/codeocean/data_asset.py +++ b/src/codeocean/data_asset.py @@ -15,6 +15,7 @@ class DataAssetType(StrEnum): Dataset = "dataset" Result = "result" Combined = "combined" + Model = "model" class DataAssetState(StrEnum): From d35f5aa467965fdd9dbbf4af8eb2406b55fbff02 Mon Sep 17 00:00:00 2001 From: jake-valsamis Date: Tue, 31 Dec 2024 15:56:38 -0500 Subject: [PATCH 4/8] add search_capsules function, CapsuleSearchParams and CapsuleSearchResults classes --- src/codeocean/capsule.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/codeocean/capsule.py b/src/codeocean/capsule.py index 3d9b2d9..fea5883 100644 --- a/src/codeocean/capsule.py +++ b/src/codeocean/capsule.py @@ -49,6 +49,30 @@ class Capsule: versions: Optional[list[dict]] = None +@dataclass_json +@dataclass(frozen=True) +class CapsuleSearchParams: + query: Optional[str] = None + next_token: Optional[str] = None + offset: Optional[int] = None + limit: Optional[int] = None + sort_field: Optional[CapsuleSortBy] = None + sort_order: Optional[SortOrder] = None + ownership: Optional[CapsuleOwnership] = None + status: Optional[CapsuleStatus] = None + favorite: Optional[bool] = None + archived: Optional[bool] = None + filters: Optional[list[SearchFilter]] = None + + +@dataclass_json +@dataclass(frozen=True) +class CapsuleSearchResults: + has_more: bool + results: list[Capsule] + next_token: Optional[str] = None + + @dataclass class Capsules: @@ -80,3 +104,8 @@ def detach_data_assets(self, capsule_id: str, data_assets: list[str]): f"capsules/{capsule_id}/data_assets/", json=data_assets, ) + + def search_capsules(self, search_params: CapsuleSearchParams) -> CapsuleSearchResults: + res = self.client.post("capsules/search", json=search_params.to_dict()) + + return CapsuleSearchResults.from_dict(res.json()) From 2e0a3387edba6ed9eeae630ab8595c79d633cb34 Mon Sep 17 00:00:00 2001 From: jake-valsamis Date: Tue, 31 Dec 2024 16:02:26 -0500 Subject: [PATCH 5/8] add CapsuleSortBy class --- src/codeocean/capsule.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/codeocean/capsule.py b/src/codeocean/capsule.py index fea5883..b89af0d 100644 --- a/src/codeocean/capsule.py +++ b/src/codeocean/capsule.py @@ -17,6 +17,10 @@ class CapsuleStatus(StrEnum): Published = "published" Verified = "verified" +class CapsuleSortBy(StrEnum): + Created = "created" + LastAccessed = "last_accessed" + Name = "name" @dataclass_json @dataclass(frozen=True) @@ -58,7 +62,7 @@ class CapsuleSearchParams: limit: Optional[int] = None sort_field: Optional[CapsuleSortBy] = None sort_order: Optional[SortOrder] = None - ownership: Optional[CapsuleOwnership] = None + ownership: Optional[Ownership] = None status: Optional[CapsuleStatus] = None favorite: Optional[bool] = None archived: Optional[bool] = None From 0392117b9cd548d2695bcfe8ecf9bc6a23fb5087 Mon Sep 17 00:00:00 2001 From: jake-valsamis Date: Tue, 31 Dec 2024 16:32:47 -0500 Subject: [PATCH 6/8] add CapsuleOwnership class, import SortOrder, SearchFilter --- src/codeocean/capsule.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/codeocean/capsule.py b/src/codeocean/capsule.py index b89af0d..a9b48e0 100644 --- a/src/codeocean/capsule.py +++ b/src/codeocean/capsule.py @@ -5,6 +5,7 @@ from typing import Optional from requests_toolbelt.sessions import BaseUrlSession +from codeocean.components import SortOrder, SearchFilter from codeocean.computation import Computation from codeocean.data_asset import DataAssetAttachParams, DataAssetAttachResults from codeocean.enum import StrEnum @@ -17,11 +18,19 @@ class CapsuleStatus(StrEnum): Published = "published" Verified = "verified" + class CapsuleSortBy(StrEnum): Created = "created" LastAccessed = "last_accessed" Name = "name" + +class CapsuleOwnership(StrEnum): + Private = "private" + Shared = "shared" + Created = "created" + + @dataclass_json @dataclass(frozen=True) class OriginalCapsuleInfo: @@ -62,7 +71,7 @@ class CapsuleSearchParams: limit: Optional[int] = None sort_field: Optional[CapsuleSortBy] = None sort_order: Optional[SortOrder] = None - ownership: Optional[Ownership] = None + ownership: Optional[CapsuleOwnership] = None status: Optional[CapsuleStatus] = None favorite: Optional[bool] = None archived: Optional[bool] = None From 75d4b890cb65ac900f628d419ee24467ea00af0c Mon Sep 17 00:00:00 2001 From: jake-valsamis Date: Tue, 31 Dec 2024 16:45:35 -0500 Subject: [PATCH 7/8] update Capsule and CapsuleStatus fields according to 3.1 changes --- src/codeocean/capsule.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/codeocean/capsule.py b/src/codeocean/capsule.py index a9b48e0..47d3566 100644 --- a/src/codeocean/capsule.py +++ b/src/codeocean/capsule.py @@ -12,11 +12,8 @@ class CapsuleStatus(StrEnum): - NonPublished = "non-published" - Submitted = "submitted" - Publishing = "publishing" - Published = "published" - Verified = "verified" + NonRelease = "non_release" + Release = "release" class CapsuleSortBy(StrEnum): @@ -55,9 +52,9 @@ class Capsule: cloned_from_url: Optional[str] = None description: Optional[str] = None field: Optional[str] = None - keywords: Optional[list[str]] = None + tags: Optional[list[str]] = None original_capsule: Optional[OriginalCapsuleInfo] = None - published_capsule: Optional[str] = None + release_capsule: Optional[str] = None submission: Optional[dict] = None versions: Optional[list[dict]] = None From 51c033e9919b9c6cd3dba658c042d3bc2927bc00 Mon Sep 17 00:00:00 2001 From: jake-valsamis Date: Tue, 31 Dec 2024 16:48:04 -0500 Subject: [PATCH 8/8] fix formatting issue --- src/codeocean/capsule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codeocean/capsule.py b/src/codeocean/capsule.py index 47d3566..e58e1dd 100644 --- a/src/codeocean/capsule.py +++ b/src/codeocean/capsule.py @@ -114,7 +114,7 @@ def detach_data_assets(self, capsule_id: str, data_assets: list[str]): f"capsules/{capsule_id}/data_assets/", json=data_assets, ) - + def search_capsules(self, search_params: CapsuleSearchParams) -> CapsuleSearchResults: res = self.client.post("capsules/search", json=search_params.to_dict())