Modern typed Python client for Hubuum server v0.0.3
Project description
Hubuum client library (Python)
hubuum-client is a modern, fully typed Python client for the
Hubuum asset-management API. It provides
matching synchronous and asynchronous clients, Pydantic v2 models, typed
resource IDs, immutable queries, cursor pagination, structured errors, and a
contract-checked interface for all 196 operations in the server's OpenAPI
surface.
Version 0.0.1 targets Hubuum server v0.0.3. Compatibility is tested against the tag-and-digest server image recorded in the compatibility matrix.
Installation
python -m pip install hubuum-client
Python 3.11 or newer is required. The runtime dependencies are only HTTPX and Pydantic.
Quick start
from hubuum_client import ClassCreate, Client, Credentials, Query
with Client("https://hubuum.example.com") as client:
client.login(Credentials("alice", "correct-horse-battery-staple"))
classes = client.classes.list(
Query().where("name", "server").limit(25).include_total()
)
created = client.classes.create(
ClassCreate(
name="server",
collection_id=1,
description="Server inventory",
)
)
print(created.id, len(classes))
The asynchronous API has the same shape:
import asyncio
from hubuum_client import AsyncClient, Credentials, Query
async def main() -> None:
async with AsyncClient("https://hubuum.example.com") as client:
await client.login(Credentials("alice", "secret"))
page = await client.classes.by_name("Servers").objects.page(
Query().where("name", "web-01").include_total()
)
print(page.total_count, page.items)
asyncio.run(main())
Context-managed clients remain open for the entire block and reuse their HTTP connection pools. Applications that manage startup and shutdown explicitly can keep the same client for their full lifetime:
client = Client("https://hubuum.example.com")
try:
client.login(Credentials("alice", "secret"))
run_application(client)
finally:
client.close()
The async equivalent uses await client.close(). Reuse a client instead of
constructing one per request so eligible TCP/TLS connections can be reused; see
Client setup for synchronous and asynchronous lifetime
examples.
Credentials and bearer tokens have redacted representations. TLS certificate validation is enabled by default; disabling it is an explicit client option and should be limited to disposable development systems.
Resource services
The typed surface currently covers the most common Hubuum workflows:
- collections, hierarchy traversal, and parent moves;
- classes and class-scoped objects, including exact-name addressing and nested
datafiltering and atomic JSON Patch; - users, groups, memberships, and user anonymization;
- class relations and object relations;
- cursor pagination and task polling;
- health, readiness, and public server configuration.
Every v0.0.3 OpenAPI operation is registered by its stable operationId:
from hubuum_client import OpenAPIOptions
result = client.openapi.call(
"getApiV1Search",
options=OpenAPIOptions(params={"q": "server", "limit_per_kind": 10}),
)
The checked-in manifest covers all 196 methods, paths, path variables, body
media types, public/authenticated policies, JSON responses, rendered text
exports, and the search event stream. request() remains available for
server extensions outside the pinned specification. Both interfaces are
constrained to the configured origin.
Querying and pagination
Queries are immutable and reusable:
from hubuum_client import FilterOperator, Query
base = Query().where("name", "server", FilterOperator.ICONTAINS)
first_page = client.classes.page(base.limit(25).include_total())
all_matches = client.classes.all(base, max_items=5_000)
active_web_servers = client.classes.by_name("Servers").objects.all(
Query()
.data("status")
.equals("active")
.data("tags")
.contains_all("web", "api")
)
Page exposes items, next_cursor, total_count, and the effective
page_limit. Automatic pagination detects repeated cursors and enforces page
and item limits. The fluent data() selector supports nested paths, typed
comparisons, arrays, nulls, object keys, and IP/network operators; see
Queries and pagination.
Group membership uses the same typed, cursor-aware interface:
member_page = client.groups.members_page(group_id, Query().limit(25).include_total())
all_members = client.groups.all_members(group_id, max_items=5_000)
Documentation
- Client setup
- Queries and pagination
- API reference
- Compatibility policy
- Docker-backed end-to-end tests
- Changelog
Development
uv sync --extra dev
uv run ruff format --check .
uv run ruff check .
uv run mypy
uv run bandit -q -r src scripts
uv run zizmor .
uv run pytest --cov
uv run mkdocs build --strict
The full pinned-server workflow is:
./scripts/run-e2e-tests.sh
See AGENTS.md for repository conventions and the exact e2e stack. Contributions are welcome; see CONTRIBUTING.md for the development and pull-request workflow. Maintainers can find the release process in the release guide.
Please report security issues according to SECURITY.md, rather than in a public issue.
License
Distributed under the MIT License. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hubuum_client-0.0.1.tar.gz.
File metadata
- Download URL: hubuum_client-0.0.1.tar.gz
- Upload date:
- Size: 145.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
31dc9f587f1edb50efaf6bb0fea898ec5555a30101a004dd88db48761774a6e0
|
|
| MD5 |
35a8fd66173fd483e32f5f1cd5f0b579
|
|
| BLAKE2b-256 |
309195ce4f29703a7ed05f165dae5e2d6d426a0f89308be1188c3001edaf8773
|
Provenance
The following attestation bundles were made for hubuum_client-0.0.1.tar.gz:
Publisher:
release.yml on hubuum/hubuum-client-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hubuum_client-0.0.1.tar.gz -
Subject digest:
31dc9f587f1edb50efaf6bb0fea898ec5555a30101a004dd88db48761774a6e0 - Sigstore transparency entry: 2240928370
- Sigstore integration time:
-
Permalink:
hubuum/hubuum-client-python@a429379f9a4e579255cbad12e26b8ef1079c3737 -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/hubuum
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a429379f9a4e579255cbad12e26b8ef1079c3737 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hubuum_client-0.0.1-py3-none-any.whl.
File metadata
- Download URL: hubuum_client-0.0.1-py3-none-any.whl
- Upload date:
- Size: 37.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7b860776eb48e1db2e9a7cd9e2613341c3876384688a59d216ea83c0a519a4d
|
|
| MD5 |
c545ed24784f72b35c2d8e6f6e5e8a9c
|
|
| BLAKE2b-256 |
38b4a1fb571ae8249061fe6e0b613d74d0e2c25b85c663c70c55f28b47af5e17
|
Provenance
The following attestation bundles were made for hubuum_client-0.0.1-py3-none-any.whl:
Publisher:
release.yml on hubuum/hubuum-client-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hubuum_client-0.0.1-py3-none-any.whl -
Subject digest:
b7b860776eb48e1db2e9a7cd9e2613341c3876384688a59d216ea83c0a519a4d - Sigstore transparency entry: 2240928714
- Sigstore integration time:
-
Permalink:
hubuum/hubuum-client-python@a429379f9a4e579255cbad12e26b8ef1079c3737 -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/hubuum
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a429379f9a4e579255cbad12e26b8ef1079c3737 -
Trigger Event:
push
-
Statement type: