Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .env.test
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ PYTEST_ADMIN_PASSWORD=start123
PYTEST_DEFAULT_MASTER_IMAGE=python/base
PYTEST_ASYNC_MAX_RETRIES=5
PYTEST_ASYNC_RETRY_DELAY_MILLIS=500
PYTEST_HUB_VERSION=0.12.5
PYTEST_HUB_VERSION=0.13.0
PYTEST_RESPONSE_TIMEOUT=5
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[![PyPI](https://img.shields.io/pypi/v/flame-hub-client?label=PyPI&cacheSeconds=0)](https://pypi.org/project/flame-hub-client/)
![Code Coverage](https://img.shields.io/badge/Coverage-98%25-brightgreen.svg)
![Code Coverage](https://img.shields.io/badge/Coverage-97%25-brightgreen.svg)
![Python versions](https://img.shields.io/badge/Python->=3.10-blue)
[![License](https://img.shields.io/pypi/l/flame-hub-client?label=License&cacheSeconds=0)](https://pypi.org/project/flame-hub-client/)
[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-%23FE5196?logo=conventionalcommits&logoColor=white)](https://conventionalcommits.org)
Expand Down Expand Up @@ -74,22 +74,22 @@ print(my_node.model_dump_json(indent=2))

```console
{
"external_name": null,
"externalName": null,
"hidden": false,
"name": "my-node",
"realm_id": "794f2375-f043-4789-bd0c-e5534e8deeaa",
"registry_id": null,
"realmId": "794f2375-f043-4789-bd0c-e5534e8deeaa",
"registryId": null,
"type": "default",
"id": "03636152-e6a8-4e01-994e-18b2b0c3a935",
"public_key": null,
"publicKey": null,
"online": false,
"registry": null,
"registry_project_id": null,
"registry_project": null,
"robot_id": null,
"client_id": "2d3e19b4-6708-4279-b2a7-34ad42638e4b",
"created_at": "2025-05-19T15:43:57.859000Z",
"updated_at": "2025-05-19T15:43:57.859000Z"
"registryProjectId": null,
"registryProject": null,
"robotId": null,
"clientId": "2d3e19b4-6708-4279-b2a7-34ad42638e4b",
"createdAt": "2025-05-19T15:43:57.859000Z",
"updatedAt": "2025-05-19T15:43:57.859000Z"
}
```

Expand Down
3 changes: 2 additions & 1 deletion docs/clients_api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ Clients

.. autoclass:: flame_hub._base_client.BaseClient
:private-members: _get_all_resources, _find_all_resources, _create_resource, _get_single_resource, _update_resource,
_delete_resource
_delete_resource, _unwrap_single_resource

.. autoclass:: flame_hub.AuthClient
:members:
:undoc-members:
:private-members: _unwrap_single_resource

.. autoclass:: flame_hub.CoreClient
:members:
Expand Down
12 changes: 6 additions & 6 deletions docs/user_guide.rst
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,8 @@ left unset, the client will sort in ascending order by default.

.. code-block:: python

nodes = core_client.find_nodes(sort={"by": "created_at"})
sedon = core_client.find_nodes(sort={"by": "created_at", "order": "descending"})
nodes = core_client.find_nodes(sort={"by": "createdAt"})
sedon = core_client.find_nodes(sort={"by": "createdAt", "order": "descending"})

assert nodes == sedon[::-1]

Expand Down Expand Up @@ -322,7 +322,7 @@ It is also possible to retrieve all names of includable properties for a specifi

.. code-block::

('registry', 'registry_project')
('registry', 'registryProject')


Overriding authentication per request
Expand Down Expand Up @@ -379,11 +379,11 @@ possible, including status code and additional information in the response body.

.. code-block:: console

received status code 400 (undefined): Can't find realm entity by realm_id
received status code 400 (undefined): Can't find realm entity by realmId
{
"status_code": 400,
"code": "undefined",
"message": "Can't find realm entity by realm_id"
"message": "Can't find realm entity by realmId"
}

In this example a :py:exc:`.HubAPIError` is raised because there is no realm with an ID that matches the dynamically
Expand Down Expand Up @@ -413,7 +413,7 @@ Hub instance.

{
"hidden": false,
"external_name": null
"externalName": null
}

Check out all implemented models :doc:`here <models_api>`.
Expand Down
38 changes: 21 additions & 17 deletions flame_hub/_auth_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
import typing as t

import typing_extensions as te
from pydantic import BaseModel, Field, WrapValidator, EmailStr, ConfigDict
from pydantic.alias_generators import to_camel
from pydantic import Field, WrapValidator, EmailStr

from flame_hub._base_client import (
BaseClient,
Expand All @@ -20,17 +19,14 @@
ResourceListResult,
AuthParam,
BaseKwargs,
ConfigBaseModel,
SingleResourceResult,
)
from flame_hub._defaults import DEFAULT_AUTH_BASE_URL


class AuthBaseModel(BaseModel):
model_config = ConfigDict(
alias_generator=to_camel,
validate_by_alias=True,
validate_by_name=True,
serialize_by_alias=True,
)
class AuthBaseModel(ConfigBaseModel):
pass


class CreateRealm(AuthBaseModel):
Expand Down Expand Up @@ -283,7 +279,11 @@ def create_realm(
def delete_realm(self, realm_id: Realm | uuid.UUID | str, **params: te.Unpack[BaseKwargs]):
self._delete_resource("realms", realm_id, **params)

def get_realm(self, realm_id: Realm | uuid.UUID | str, **params: te.Unpack[GetKwargs]) -> Realm | None:
def get_realm(
self,
realm_id: Realm | uuid.UUID | str,
**params: te.Unpack[GetKwargs],
) -> SingleResourceResult[Realm]:
return self._get_single_resource(Realm, "realms", realm_id, **params)

def update_realm(
Expand Down Expand Up @@ -329,7 +329,7 @@ def create_permission(

def get_permission(
self, permission_id: Permission | uuid.UUID | str, **params: te.Unpack[GetKwargs]
) -> Permission | None:
) -> SingleResourceResult[Permission]:
return self._get_single_resource(
Permission, "permissions", permission_id, include=get_includable_names(Permission), **params
)
Expand Down Expand Up @@ -374,7 +374,7 @@ def create_role(
**params,
)

def get_role(self, role_id: Role | uuid.UUID | str, **params: te.Unpack[GetKwargs]) -> Role | None:
def get_role(self, role_id: Role | uuid.UUID | str, **params: te.Unpack[GetKwargs]) -> SingleResourceResult[Role]:
return self._get_single_resource(Role, "roles", role_id, include=get_includable_names(Role), **params)

def delete_role(self, role_id: Role | uuid.UUID | str, **params: te.Unpack[BaseKwargs]):
Expand Down Expand Up @@ -417,7 +417,7 @@ def create_role_permission(

def get_role_permission(
self, role_permission_id: RolePermission | uuid.UUID | str, **params: te.Unpack[GetKwargs]
) -> RolePermission | None:
) -> SingleResourceResult[RolePermission]:
return self._get_single_resource(
RolePermission,
"role-permissions",
Expand Down Expand Up @@ -475,7 +475,7 @@ def create_user(
**params,
)

def get_user(self, user_id: User | uuid.UUID | str, **params: te.Unpack[GetKwargs]) -> User | None:
def get_user(self, user_id: User | uuid.UUID | str, **params: te.Unpack[GetKwargs]) -> SingleResourceResult[User]:
return self._get_single_resource(User, "users", user_id, include=get_includable_names(User), **params)

def delete_user(self, user_id: User | uuid.UUID | str, **params: te.Unpack[BaseKwargs]):
Expand Down Expand Up @@ -530,7 +530,7 @@ def create_user_permission(

def get_user_permission(
self, user_permission_id: UserPermission | uuid.UUID | str, **params: te.Unpack[GetKwargs]
) -> UserPermission | None:
) -> SingleResourceResult[UserPermission]:
return self._get_single_resource(
UserPermission,
"user-permissions",
Expand Down Expand Up @@ -577,7 +577,7 @@ def create_user_role(

def get_user_role(
self, user_role_id: UserRole | uuid.UUID | str, **params: te.Unpack[GetKwargs]
) -> UserRole | None:
) -> SingleResourceResult[UserRole]:
return self._get_single_resource(
UserRole, "user-roles", user_role_id, include=get_includable_names(UserRole), **params
)
Expand Down Expand Up @@ -630,7 +630,11 @@ def create_client(
def delete_client(self, client_id: Client | uuid.UUID | str, **params: te.Unpack[BaseKwargs]):
self._delete_resource("clients", client_id, **params)

def get_client(self, client_id: Client | uuid.UUID | str, **params: te.Unpack[GetKwargs]) -> Client | None:
def get_client(
self,
client_id: Client | uuid.UUID | str,
**params: te.Unpack[GetKwargs],
) -> SingleResourceResult[Client]:
return self._get_single_resource(Client, "clients", client_id, include=get_includable_names(Client), **params)

def get_clients(self, **params: te.Unpack[GetKwargs]) -> ResourceListResult[Client]:
Expand Down
Loading