diff --git a/docs/types_api.rst b/docs/types_api.rst index 74f48cc..519ce88 100644 --- a/docs/types_api.rst +++ b/docs/types_api.rst @@ -5,6 +5,10 @@ Types .. autodata:: flame_hub._base_client.ResourceT :annotation: = typing.TypeVar +.. autoclass:: flame_hub._base_client.ResourceListResult + :members: + :undoc-members: + .. autoclass:: flame_hub.types.FieldParams .. autoclass:: flame_hub.types.IncludeParams diff --git a/flame_hub/_auth_client.py b/flame_hub/_auth_client.py index f15e280..ac45a87 100644 --- a/flame_hub/_auth_client.py +++ b/flame_hub/_auth_client.py @@ -16,6 +16,7 @@ get_includable_names, UNSET, UNSET_T, + ResourceListResult, ) from flame_hub._defaults import DEFAULT_AUTH_BASE_URL from flame_hub._auth_flows import ClientAuth, PasswordAuth @@ -229,18 +230,18 @@ class AuthClient(BaseClient): def __init__( self, base_url=DEFAULT_AUTH_BASE_URL, - auth: ClientAuth | PasswordAuth = None, + auth: ClientAuth | PasswordAuth | None = None, **kwargs: te.Unpack[ClientKwargs], ): super().__init__(base_url, auth, **kwargs) - def get_realms(self, **params: te.Unpack[GetKwargs]) -> list[Realm]: + def get_realms(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Realm]: return self._get_all_resources(Realm, "realms", **params) - def find_realms(self, **params: te.Unpack[FindAllKwargs]) -> list[Realm]: + def find_realms(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Realm]: return self._find_all_resources(Realm, "realms", **params) - def create_realm(self, name: str, display_name: str = None, description: str = None) -> Realm: + def create_realm(self, name: str, display_name: str | None = None, description: str | None = None) -> Realm: return self._create_resource( Realm, CreateRealm( @@ -278,9 +279,9 @@ def update_realm( def create_permission( self, name: str, - display_name: str = None, - description: str = None, - realm_id: Realm | uuid.UUID | str = None, + display_name: str | None = None, + description: str | None = None, + realm_id: Realm | uuid.UUID | str | None = None, ) -> Permission: return self._create_resource( Permission, @@ -319,13 +320,13 @@ def update_permission( permission_id, ) - def get_permissions(self, **params: te.Unpack[GetKwargs]) -> list[Permission]: + def get_permissions(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Permission]: return self._get_all_resources(Permission, "permissions", include=get_includable_names(Permission), **params) - def find_permissions(self, **params: te.Unpack[FindAllKwargs]) -> list[Permission]: + def find_permissions(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Permission]: return self._find_all_resources(Permission, "permissions", include=get_includable_names(Permission), **params) - def create_role(self, name: str, display_name: str = None, description: str = None) -> Role: + def create_role(self, name: str, display_name: str | None = None, description: str | None = None) -> Role: return self._create_resource( Role, CreateRole(name=name, display_name=display_name, description=description), @@ -352,10 +353,10 @@ def update_role( role_id, ) - def get_roles(self, **params: te.Unpack[GetKwargs]) -> list[Role]: + def get_roles(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Role]: return self._get_all_resources(Role, "roles", include=get_includable_names(Role), **params) - def find_roles(self, **params: te.Unpack[FindAllKwargs]) -> list[Role]: + def find_roles(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Role]: return self._find_all_resources(Role, "roles", include=get_includable_names(Role), **params) def create_role_permission( @@ -381,7 +382,7 @@ def get_role_permission( def delete_role_permission(self, role_permission_id: RolePermission | uuid.UUID | str): self._delete_resource("role-permissions", role_permission_id) - def get_role_permissions(self, **params: te.Unpack[GetKwargs]) -> list[RolePermission]: + def get_role_permissions(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[RolePermission]: return self._get_all_resources( RolePermission, "role-permissions", @@ -389,7 +390,7 @@ def get_role_permissions(self, **params: te.Unpack[GetKwargs]) -> list[RolePermi **params, ) - def find_role_permissions(self, **params: te.Unpack[FindAllKwargs]) -> list[RolePermission]: + def find_role_permissions(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[RolePermission]: return self._find_all_resources( RolePermission, "role-permissions", @@ -401,11 +402,11 @@ def create_user( self, name: str, email: str, - display_name: str = None, + display_name: str | None = None, active: bool = True, name_locked: bool = False, - first_name: str = None, - last_name: str = None, + first_name: str | None = None, + last_name: str | None = None, ) -> User: return self._create_resource( User, @@ -453,10 +454,10 @@ def update_user( user_id, ) - def get_users(self, **params: te.Unpack[GetKwargs]) -> list[User]: + def get_users(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[User]: return self._get_all_resources(User, "users", include=get_includable_names(User), **params) - def find_users(self, **params: te.Unpack[FindAllKwargs]) -> list[User]: + def find_users(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[User]: return self._find_all_resources(User, "users", include=get_includable_names(User), **params) def create_user_permission( @@ -484,7 +485,7 @@ def get_user_permission( def delete_user_permission(self, user_permission_id: UserPermission | uuid.UUID | str): self._delete_resource("user-permissions", user_permission_id) - def get_user_permissions(self, **params: te.Unpack[GetKwargs]) -> list[UserPermission]: + def get_user_permissions(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[UserPermission]: return self._get_all_resources( UserPermission, "user-permissions", @@ -492,7 +493,7 @@ def get_user_permissions(self, **params: te.Unpack[GetKwargs]) -> list[UserPermi **params, ) - def find_user_permissions(self, **params: te.Unpack[FindAllKwargs]) -> list[UserPermission]: + def find_user_permissions(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[UserPermission]: return self._find_all_resources( UserPermission, "user-permissions", @@ -517,24 +518,24 @@ def get_user_role( def delete_user_role(self, user_role_id: UserRole | uuid.UUID | str): self._delete_resource("user-roles", user_role_id) - def get_user_roles(self, **params: te.Unpack[GetKwargs]) -> list[UserRole]: + def get_user_roles(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[UserRole]: return self._get_all_resources(UserRole, "user-roles", include=get_includable_names(UserRole), **params) - def find_user_roles(self, **params: te.Unpack[FindAllKwargs]) -> list[UserRole]: + def find_user_roles(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[UserRole]: return self._find_all_resources(UserRole, "user-roles", include=get_includable_names(UserRole), **params) def create_client( self, name: str, realm_id: Realm | str | uuid.UUID, - secret: str = None, - display_name: str = None, - description: str = None, - redirect_uri: str = None, + secret: str | None = None, + display_name: str | None = None, + description: str | None = None, + redirect_uri: str | None = None, active: bool = True, is_confidential: bool = True, secret_hashed: bool = False, - grant_types: str = None, + grant_types: str | None = None, ) -> Client: return self._create_resource( Client, @@ -559,10 +560,10 @@ def delete_client(self, client_id: Client | uuid.UUID | str): def get_client(self, client_id: Client | uuid.UUID | str, **params: te.Unpack[GetKwargs]) -> Client | None: return self._get_single_resource(Client, "clients", client_id, include=get_includable_names(Client), **params) - def get_clients(self, **params: te.Unpack[GetKwargs]) -> list[Client]: + def get_clients(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Client]: return self._get_all_resources(Client, "clients", include=get_includable_names(Client), **params) - def find_clients(self, **params: te.Unpack[FindAllKwargs]) -> list[Client]: + def find_clients(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Client]: return self._find_all_resources(Client, "clients", include=get_includable_names(Client), **params) def update_client( diff --git a/flame_hub/_base_client.py b/flame_hub/_base_client.py index 8d171be..4518d57 100644 --- a/flame_hub/_base_client.py +++ b/flame_hub/_base_client.py @@ -28,9 +28,12 @@ class UuidModel(t.Protocol[ResourceT]): id: uuid.UUID + def __str__(self) -> str: + return str(self.id) + # union which encompasses all types where a UUID can be extracted from -UuidIdentifiable = UuidModel | uuid.UUID | str +UuidIdentifiable: t.TypeAlias = UuidModel | uuid.UUID | str def obtain_uuid_from(uuid_identifiable: UuidIdentifiable) -> uuid.UUID: @@ -115,6 +118,10 @@ class ResourceList(BaseModel, t.Generic[ResourceT]): """Attribute which holds meta information about the result and the requested resource type.""" +# Generic type alias for all get and find methods. +ResourceListResult: t.TypeAlias = list[ResourceT] | tuple[list[ResourceT], ResourceListMeta] + + class SortParams(te.TypedDict, total=False): """Dict shape for specifying parameters for sorted queries. @@ -285,7 +292,7 @@ def build_page_params(page_params: PageParams | None = None, default_page_params page_params: PageParams = {} # overwrite default values with user-defined ones - page_params = default_page_params | page_params + page_params = {**default_page_params, **page_params} return {f"page[{k}]": v for k, v in page_params.items()} @@ -332,7 +339,7 @@ def build_sort_params(sort_params: SortParams | None = None) -> dict: # property gets a "-" prepended if sorting in descending order param_sort_prefix = "-" if param_sort_order == "descending" else "" # construct the actual query params - query_params["sort"] = param_sort_prefix + param_sort_by + query_params["sort"] = f"{param_sort_prefix}{param_sort_by}" return query_params @@ -417,7 +424,7 @@ def _get_all_resources( include: IncludeParams | None = None, expected_code: int = httpx.codes.OK.value, **params: te.Unpack[GetKwargs], - ) -> list[ResourceT] | tuple[list[ResourceT], ResourceListMeta]: + ) -> ResourceListResult[ResourceT]: """Retrieve all resources of a certain type at the specified path from the FLAME Hub. This method passes its arguments through to :py:meth:`_find_all_resources`. Check the documentation of that @@ -441,7 +448,7 @@ def _find_all_resources( include: IncludeParams | None = None, expected_code: int = httpx.codes.OK.value, **params: te.Unpack[FindAllKwargs], - ) -> list[ResourceT] | tuple[list[ResourceT], ResourceListMeta]: + ) -> ResourceListResult[ResourceT]: """Find all resources at the specified path on the FLAME Hub that match certain criteria. This method accesses the endpoint ``*path`` and returns all resources of type ``resource_type`` that match @@ -492,7 +499,7 @@ def _find_all_resources( filter_params = params.get("filter", None) sort_params = params.get("sort", None) field_params = params.get("fields", None) - meta = params.get("meta", False) + meta_flag = params.get("meta", False) request_params = ( build_page_params(page_params) @@ -509,7 +516,7 @@ def _find_all_resources( resource_list = ResourceList[resource_type](**r.json()) - if meta: + if meta_flag: return resource_list.data, resource_list.meta else: return resource_list.data diff --git a/flame_hub/_core_client.py b/flame_hub/_core_client.py index f3efeb1..588582f 100644 --- a/flame_hub/_core_client.py +++ b/flame_hub/_core_client.py @@ -21,6 +21,7 @@ IsIncludable, get_includable_names, build_filter_params, + ResourceListResult, ) from flame_hub._exceptions import new_hub_api_error_from_response from flame_hub._defaults import DEFAULT_CORE_BASE_URL @@ -414,22 +415,22 @@ class CoreClient(BaseClient): def __init__( self, base_url: str = DEFAULT_CORE_BASE_URL, - auth: PasswordAuth | ClientAuth = None, + auth: PasswordAuth | ClientAuth | None = None, **kwargs: te.Unpack[ClientKwargs], ): super().__init__(base_url, auth, **kwargs) - def get_nodes(self, **params: te.Unpack[GetKwargs]) -> list[Node]: + def get_nodes(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Node]: return self._get_all_resources(Node, "nodes", include=get_includable_names(Node), **params) - def find_nodes(self, **params: te.Unpack[FindAllKwargs]) -> list[Node]: + def find_nodes(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Node]: return self._find_all_resources(Node, "nodes", include=get_includable_names(Node), **params) def create_node( self, name: str, - realm_id: Realm | str | uuid.UUID = None, - registry_id: Registry | uuid.UUID | str = None, + realm_id: Realm | str | uuid.UUID | None = None, + registry_id: Registry | uuid.UUID | str | None = None, external_name: str | None = None, node_type: NodeType = "default", hidden: bool = False, @@ -523,7 +524,7 @@ def update_node_client_credentials( expected_code=httpx.codes.OK.value, ) - def get_master_image_groups(self, **params: te.Unpack[GetKwargs]) -> list[MasterImageGroup]: + def get_master_image_groups(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[MasterImageGroup]: return self._get_all_resources(MasterImageGroup, "master-image-groups", **params) def get_master_image_group( @@ -531,10 +532,10 @@ def get_master_image_group( ) -> MasterImageGroup | None: return self._get_single_resource(MasterImageGroup, "master-image-groups", master_image_group_id, **params) - def find_master_image_groups(self, **params: te.Unpack[FindAllKwargs]) -> list[MasterImageGroup]: + def find_master_image_groups(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[MasterImageGroup]: return self._find_all_resources(MasterImageGroup, "master-image-groups", **params) - def get_master_images(self, **params: te.Unpack[GetKwargs]) -> list[MasterImage]: + def get_master_images(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[MasterImage]: return self._get_all_resources(MasterImage, "master-images", **params) def get_master_image( @@ -542,13 +543,13 @@ def get_master_image( ) -> MasterImage | None: return self._get_single_resource(MasterImage, "master-images", master_image_id, **params) - def find_master_images(self, **params: te.Unpack[FindAllKwargs]) -> list[MasterImage]: + def find_master_images(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[MasterImage]: return self._find_all_resources(MasterImage, "master-images", **params) - def get_projects(self, **params: te.Unpack[GetKwargs]) -> list[Project]: + def get_projects(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Project]: return self._get_all_resources(Project, "projects", include=get_includable_names(Project), **params) - def find_projects(self, **params: te.Unpack[FindAllKwargs]) -> list[Project]: + def find_projects(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Project]: return self._find_all_resources(Project, "projects", include=get_includable_names(Project), **params) def sync_master_images(self): @@ -575,9 +576,9 @@ def build_master_image(self, master_image_id: MasterImage | uuid.UUID | str): def create_project( self, name: str, - display_name: str = None, - master_image_id: MasterImage | uuid.UUID | str = None, - description: str = None, + display_name: str | None = None, + master_image_id: MasterImage | uuid.UUID | str | None = None, + description: str | None = None, ) -> Project: return self._create_resource( Project, @@ -627,12 +628,12 @@ def create_project_node( def delete_project_node(self, project_node_id: ProjectNode | uuid.UUID | str): self._delete_resource("project-nodes", project_node_id) - def get_project_nodes(self, **params: te.Unpack[GetKwargs]) -> list[ProjectNode]: + def get_project_nodes(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[ProjectNode]: return self._get_all_resources( ProjectNode, "project-nodes", include=get_includable_names(ProjectNode), **params ) - def find_project_nodes(self, **params: te.Unpack[FindAllKwargs]) -> list[ProjectNode]: + def find_project_nodes(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[ProjectNode]: return self._find_all_resources( ProjectNode, "project-nodes", include=get_includable_names(ProjectNode), **params ) @@ -660,12 +661,12 @@ def update_project_node( def create_analysis( self, project_id: Project | uuid.UUID | str, - name: str = None, - display_name: str = None, - description: str = None, - master_image_id: MasterImage | uuid.UUID | str = None, - registry_id: Registry | uuid.UUID | str = None, - image_command_arguments: list[MasterImageCommandArgument] = None, + name: str | None = None, + display_name: str | None = None, + description: str | None = None, + master_image_id: MasterImage | uuid.UUID | str | None = None, + registry_id: Registry | uuid.UUID | str | None = None, + image_command_arguments: list[MasterImageCommandArgument] | None = None, ) -> Analysis: return self._create_resource( Analysis, @@ -684,10 +685,10 @@ def create_analysis( def delete_analysis(self, analysis_id: Analysis | uuid.UUID | str): self._delete_resource("analyses", analysis_id) - def get_analyses(self, **params: te.Unpack[GetKwargs]) -> list[Analysis]: + def get_analyses(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Analysis]: return self._get_all_resources(Analysis, "analyses", include=get_includable_names(Analysis), **params) - def find_analyses(self, **params: te.Unpack[FindAllKwargs]) -> list[Analysis]: + def find_analyses(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Analysis]: return self._find_all_resources(Analysis, "analyses", include=get_includable_names(Analysis), **params) def get_analysis(self, analysis_id: Analysis | uuid.UUID | str, **params: te.Unpack[GetKwargs]) -> Analysis | None: @@ -799,12 +800,12 @@ def get_analysis_node( AnalysisNode, "analysis-nodes", analysis_node_id, include=get_includable_names(AnalysisNode), **params ) - def get_analysis_nodes(self, **params: te.Unpack[GetKwargs]) -> list[AnalysisNode]: + def get_analysis_nodes(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[AnalysisNode]: return self._get_all_resources( AnalysisNode, "analysis-nodes", include=get_includable_names(AnalysisNode), **params ) - def find_analysis_nodes(self, **params: te.Unpack[FindAllKwargs]) -> list[AnalysisNode]: + def find_analysis_nodes(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[AnalysisNode]: return self._find_all_resources( AnalysisNode, "analysis-nodes", include=get_includable_names(AnalysisNode), **params ) @@ -815,8 +816,8 @@ def create_analysis_node_log( node_id: Node | uuid.UUID | str, level: LogLevel, message: str, - status: str = None, - code: str = None, + status: str | None = None, + code: str | None = None, ) -> Log: return self._create_resource( Log, @@ -843,7 +844,7 @@ def delete_analysis_node_logs(self, analysis_id: Analysis | uuid.UUID | str, nod if r.status_code != httpx.codes.ACCEPTED.value: raise new_hub_api_error_from_response(r) - def find_analysis_node_logs(self, **params: te.Unpack[FindAllKwargs]) -> list[Log]: + def find_analysis_node_logs(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Log]: return self._find_all_resources(Log, "analysis-node-logs", **params) def create_analysis_bucket( @@ -865,12 +866,12 @@ def create_analysis_bucket( def delete_analysis_bucket(self, analysis_bucket_id: AnalysisBucket | uuid.UUID | str): self._delete_resource("analysis-buckets", analysis_bucket_id) - def get_analysis_buckets(self, **params: te.Unpack[GetKwargs]) -> list[AnalysisBucket]: + def get_analysis_buckets(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[AnalysisBucket]: return self._get_all_resources( AnalysisBucket, "analysis-buckets", include=get_includable_names(AnalysisBucket), **params ) - def find_analysis_buckets(self, **params: te.Unpack[FindAllKwargs]) -> list[AnalysisBucket]: + def find_analysis_buckets(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[AnalysisBucket]: return self._find_all_resources( AnalysisBucket, "analysis-buckets", include=get_includable_names(AnalysisBucket), **params ) @@ -886,12 +887,12 @@ def get_analysis_bucket( **params, ) - def get_analysis_bucket_files(self, **params: te.Unpack[GetKwargs]) -> list[AnalysisBucketFile]: + def get_analysis_bucket_files(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[AnalysisBucketFile]: return self._get_all_resources( AnalysisBucketFile, "analysis-bucket-files", include=get_includable_names(AnalysisBucketFile), **params ) - def find_analysis_bucket_files(self, **params: te.Unpack[FindAllKwargs]) -> list[AnalysisBucketFile]: + def find_analysis_bucket_files(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[AnalysisBucketFile]: return self._find_all_resources( AnalysisBucketFile, "analysis-bucket-files", include=get_includable_names(AnalysisBucketFile), **params ) @@ -940,7 +941,13 @@ def update_analysis_bucket_file( analysis_bucket_file_id, ) - def create_registry(self, name: str, host: str, account_name: str = None, account_secret: str = None) -> Registry: + def create_registry( + self, + name: str, + host: str, + account_name: str | None = None, + account_secret: str | None = None, + ) -> Registry: return self._create_resource( Registry, CreateRegistry(name=name, host=host, account_name=account_name, account_secret=account_secret), @@ -968,10 +975,10 @@ def update_registry( registry_id, ) - def get_registries(self, **params: te.Unpack[GetKwargs]) -> list[Registry]: + def get_registries(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Registry]: return self._get_all_resources(Registry, "registries", **params) - def find_registries(self, **params: te.Unpack[FindAllKwargs]) -> list[Registry]: + def find_registries(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Registry]: return self._find_all_resources(Registry, "registries", **params) def send_registry_command(self, registry_id: Registry | uuid.UUID | str, command: RegistryCommand): @@ -988,8 +995,8 @@ def create_registry_project( registry_project_type: RegistryProjectType, registry_id: Registry | uuid.UUID | str, external_name: str, - account_name: str = None, - account_secret: str = None, + account_name: str | None = None, + account_secret: str | None = None, ) -> RegistryProject: return self._create_resource( RegistryProject, @@ -1042,7 +1049,7 @@ def update_registry_project( registry_project_id, ) - def get_registry_projects(self, **params: te.Unpack[GetKwargs]) -> list[RegistryProject]: + def get_registry_projects(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[RegistryProject]: return self._get_all_resources( RegistryProject, "registry-projects", @@ -1050,7 +1057,7 @@ def get_registry_projects(self, **params: te.Unpack[GetKwargs]) -> list[Registry **params, ) - def find_registry_projects(self, **params: te.Unpack[FindAllKwargs]) -> list[RegistryProject]: + def find_registry_projects(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[RegistryProject]: return self._find_all_resources( RegistryProject, "registry-projects", @@ -1067,5 +1074,5 @@ def delete_analysis_logs(self, analysis_id: Analysis | uuid.UUID | str): if r.status_code != httpx.codes.ACCEPTED.value: raise new_hub_api_error_from_response(r) - def find_analysis_logs(self, **params: te.Unpack[FindAllKwargs]) -> list[Log]: + def find_analysis_logs(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Log]: return self._find_all_resources(Log, "analysis-logs", **params) diff --git a/flame_hub/_exceptions.py b/flame_hub/_exceptions.py index 08e4045..95f101f 100644 --- a/flame_hub/_exceptions.py +++ b/flame_hub/_exceptions.py @@ -36,7 +36,7 @@ class HubAPIError(httpx.HTTPError): :py:exc:`.HubAPIError`, :py:func:`.new_hub_api_error_from_response` """ - def __init__(self, message: str, request: httpx.Request, error: ErrorResponse = None) -> None: + def __init__(self, message: str, request: httpx.Request, error: ErrorResponse | None = None) -> None: super().__init__(message) self._request = request self.error_response = error diff --git a/flame_hub/_storage_client.py b/flame_hub/_storage_client.py index 6c26f72..c6bd660 100644 --- a/flame_hub/_storage_client.py +++ b/flame_hub/_storage_client.py @@ -16,6 +16,7 @@ ClientKwargs, IsIncludable, get_includable_names, + ResourceListResult, ) from flame_hub._defaults import DEFAULT_STORAGE_BASE_URL from flame_hub._exceptions import new_hub_api_error_from_response @@ -82,21 +83,21 @@ class StorageClient(BaseClient): def __init__( self, base_url: str = DEFAULT_STORAGE_BASE_URL, - auth: PasswordAuth | ClientAuth = None, + auth: PasswordAuth | ClientAuth | None = None, **kwargs: te.Unpack[ClientKwargs], ): super().__init__(base_url, auth, **kwargs) - def create_bucket(self, name: str, region: str = None) -> Bucket: + def create_bucket(self, name: str, region: str | None = None) -> Bucket: return self._create_resource(Bucket, CreateBucket(name=name, region=region), "buckets") def delete_bucket(self, bucket_id: Bucket | str | uuid.UUID): self._delete_resource("buckets", bucket_id) - def get_buckets(self, **params: te.Unpack[GetKwargs]) -> list[Bucket]: + def get_buckets(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Bucket]: return self._get_all_resources(Bucket, "buckets", **params) - def find_buckets(self, **params: te.Unpack[FindAllKwargs]) -> list[Bucket]: + def find_buckets(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[Bucket]: return self._find_all_resources(Bucket, "buckets", **params) def get_bucket(self, bucket_id: Bucket | str | uuid.UUID, **params: te.Unpack[GetKwargs]) -> Bucket | None: @@ -133,10 +134,10 @@ def get_bucket_file( BucketFile, "bucket-files", bucket_file_id, include=get_includable_names(BucketFile), **params ) - def get_bucket_files(self, **params: te.Unpack[GetKwargs]) -> list[BucketFile]: + def get_bucket_files(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[BucketFile]: return self._get_all_resources(BucketFile, "bucket-files", include=get_includable_names(BucketFile), **params) - def find_bucket_files(self, **params: te.Unpack[FindAllKwargs]) -> list[BucketFile]: + def find_bucket_files(self, **params: te.Unpack[FindAllKwargs]) -> ResourceListResult[BucketFile]: return self._find_all_resources(BucketFile, "bucket-files", include=get_includable_names(BucketFile), **params) def stream_bucket_file(self, bucket_file_id: BucketFile | str | uuid.UUID, chunk_size=1024) -> t.Iterator[bytes]: diff --git a/flame_hub/types.py b/flame_hub/types.py index f6fdbc9..8532068 100644 --- a/flame_hub/types.py +++ b/flame_hub/types.py @@ -23,6 +23,7 @@ "ProcessStatus", "LogChannel", "ReadableBinary", + "ResourceListResult", ] from ._base_client import ( @@ -37,6 +38,7 @@ GetKwargs, ResourceT, UNSET_T, + ResourceListResult, ) from ._core_client import ( NodeType,