Metadata-Version: 2.4
Name: yaci-client
Version: 1.0.1
Summary: A client library for accessing the Yaci Store API
Keywords: cardano,yaci,yaci-store,yaci-devkit,openapi
Author: Hareem Adderley
Author-email: Hareem Adderley <hadderley@kingpinapps.com>
License-Expression: MIT
License-File: LICENSE
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3.15
Classifier: Typing :: Typed
Requires-Dist: attrs>=22.2.0
Requires-Dist: httpx>=0.25.1,<0.29.0
Requires-Dist: python-dateutil>=2.8.0
Requires-Python: >=3.11
Project-URL: Homepage, https://github.com/Kingpin-Apps/Yaci-client
Project-URL: Source, https://github.com/Kingpin-Apps/Yaci-client
Project-URL: Issues, https://github.com/Kingpin-Apps/Yaci-client/issues
Project-URL: Changelog, https://github.com/Kingpin-Apps/Yaci-client/blob/main/CHANGELOG.md
Description-Content-Type: text/markdown

# yaci-store-api-client
A client library for accessing [Yaci](https://devkit.yaci.xyz) Store API.

This library is  mostly generated using [OpenAPI Generator](https://github.com/openapi-generators/openapi-python-client/).

## Usage
First, create a client:

```python
from yaci_client import Client

client = Client(base_url="http://localhost:8080", raise_on_unexpected_status=True)
```

If the endpoints you're going to hit require authentication, use `AuthenticatedClient` instead:

```python
from yaci_client import AuthenticatedClient

client = AuthenticatedClient(base_url="https://localhost:8080", token="SuperSecretToken")
```

Now call your endpoint and use your models:

```python
import json
from yaci_client.api.local_epoch_service import (
    get_latest_protocol_params,
)
from yaci_client import Client
from yaci_client.models import (
    ProtocolParamsDto,
)
from yaci_client.types import Response

client = Client(base_url="http://localhost:8080", raise_on_unexpected_status=True)

with client as client:
    params: ProtocolParamsDto = get_latest_protocol_params.sync(client=client)
    print(params)

    response: Response[ProtocolParamsDto] = get_latest_protocol_params.sync_detailed(client=client)
    protocol_params_json = json.loads(response.content)
    print(protocol_params_json)
```

Or do the same thing with an async version:

```python
import json
from yaci_client.api.local_epoch_service import (
    get_latest_protocol_params,
)
from yaci_client import Client
from yaci_client.models import (
    ProtocolParamsDto,
)
from yaci_client.types import Response

client = Client(base_url="http://localhost:8080", raise_on_unexpected_status=True)

async with client as client:
    params: ProtocolParamsDto = await get_latest_protocol_params.asyncio(client=client)
    response: Response[ProtocolParamsDto] = await get_latest_protocol_params.asyncio_detailed(client=client)
```

By default, when you're calling an HTTPS API it will attempt to verify that SSL is working correctly. Using certificate verification is highly recommended most of the time, but sometimes you may need to authenticate to a server (especially an internal server) using a custom certificate bundle.

```python
import ssl

from yaci_client import AuthenticatedClient

client = AuthenticatedClient(
    base_url="https://localhost:8080",
    token="SuperSecretToken",
    verify_ssl=ssl.create_default_context(cafile="/path/to/certificate_bundle.pem"),
)
```

You can also disable certificate validation altogether, but beware that **this is a security risk**.

```python
from yaci_client import AuthenticatedClient

client = AuthenticatedClient(base_url="https://localhost:8080", token="SuperSecretToken", verify_ssl=False)
```

Things to know:
1. Every path/method combo becomes a Python module with four functions:
    1. `sync`: Blocking request that returns parsed data (if successful) or `None`
    1. `sync_detailed`: Blocking request that always returns a `Request`, optionally with `parsed` set if the request was successful.
    1. `asyncio`: Like `sync` but async instead of blocking
    1. `asyncio_detailed`: Like `sync_detailed` but async instead of blocking

1. All path/query params, and bodies become method arguments.
1. If your endpoint had any tags on it, the first tag will be used as a module name for the function (my_tag above)
1. Any endpoint which did not have a tag will be in `yaci_client.api.default`

## Advanced customizations

There are more settings on the generated `Client` class which let you control more runtime behavior, check out the docstring on that class for more info. You can also customize the underlying `httpx.Client` or `httpx.AsyncClient` (depending on your use-case):

```python
from yaci_client import Client


def log_request(request):
    print(f"Request event hook: {request.method} {request.url} - Waiting for response")


def log_response(response):
    request = response.request
    print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}")


client = Client(
    base_url="https://api.example.com",
    httpx_args={"event_hooks": {"request": [log_request], "response": [log_response]}},
)

# Or get the underlying httpx client to modify directly with client.get_httpx_client() or client.get_async_httpx_client()
```

You can even set the httpx client directly, but beware that this will override any existing settings (e.g., base_url):

```python
import httpx
from yaci_client import Client

client = Client(
    base_url="https://localhost:8080",
)
# Note that base_url needs to be re-set, as would any shared cookies, headers, etc.
client.set_httpx_client(httpx.Client(base_url="https://localhost:8080", proxy="http://localhost:8030"))
```

## Installation

```bash
pip install yaci-client
```

It needs Python 3.11 or newer and works with httpx 0.25.1 up to 0.28.

## Development

The project uses [uv](https://docs.astral.sh/uv/), [ruff](https://docs.astral.sh/ruff/),
[ty](https://docs.astral.sh/ty/) and [just](https://just.systems/). Run `just` to list every task.

```bash
just sync       # install the project and its development tools
just check      # lint, type-check and test
just test-all   # the tests on every supported Python
```

`yaci_client` is generated from the Yaci Store OpenAPI spec in `yaci_api.json` by
[openapi-python-client](https://github.com/openapi-generators/openapi-python-client). After
updating the spec, run `just regenerate`; ruff then formats the result, so it passes `just lint`.
Review the diff before committing: newer generators rename fields (for example `type` to `type_`), which
breaks callers, so a rename belongs in a major release.

Commits follow [Conventional Commits](https://www.conventionalcommits.org/). Run
`uv run pre-commit install` once to check messages and formatting on each commit.

## Releasing

1. `just bump` sets the version and the changelog from the commits since the last release, and tags it `vX.Y.Z`.
1. Push the commit and the tag: `git push --follow-tags`.
1. The tag starts the [Release workflow](.github/workflows/release.yml), which builds the package, publishes it
   to [PyPI](https://pypi.org/project/yaci-client/) with Trusted Publishing (no token in the repository) and
   creates the GitHub release.
