Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
0a46f0a
feat(client): add support for binary request streaming
stainless-app[bot] Jan 14, 2026
3f2ef54
chore(internal): update `actions/checkout` version
stainless-app[bot] Jan 17, 2026
5e006c2
chore(ci): upgrade `actions/github-script`
stainless-app[bot] Jan 24, 2026
c02699e
feat(client): add custom JSON encoder for extended type support
stainless-app[bot] Jan 30, 2026
e6b7ec8
chore(internal): bump dependencies
stainless-app[bot] Feb 10, 2026
34988f7
chore(internal): fix lint error on Python 3.14
stainless-app[bot] Feb 12, 2026
3d045e8
chore: format all `api.md` files
stainless-app[bot] Feb 13, 2026
6d1b141
chore(internal): remove mock server code
stainless-app[bot] Feb 20, 2026
b1c88e2
chore: update mock server docs
stainless-app[bot] Feb 20, 2026
3d004d8
chore(internal): add request options to SSE classes
stainless-app[bot] Feb 24, 2026
fa78df3
chore(internal): make `test_proxy_environment_variables` more resilient
stainless-app[bot] Feb 24, 2026
a70f1e5
chore(internal): make `test_proxy_environment_variables` more resilie…
stainless-app[bot] Feb 25, 2026
bdc07aa
chore(internal): codegen related update
stainless-app[bot] Mar 3, 2026
9d3f025
feat(api): manual updates
stainless-app[bot] Apr 30, 2026
d02f331
chore: update SDK settings
stainless-app[bot] Apr 30, 2026
1ba058b
codegen metadata
stainless-app[bot] Apr 30, 2026
5a97bc2
codegen metadata
stainless-app[bot] Apr 30, 2026
6779d95
codegen metadata
stainless-app[bot] Apr 30, 2026
4a31da6
chore: update SDK settings
stainless-app[bot] Apr 30, 2026
95ed2a4
release: 1.1.0
stainless-app[bot] Apr 30, 2026
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: 1 addition & 2 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ FROM mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT}

USER vscode

RUN curl -sSf https://rye.astral.sh/get | RYE_VERSION="0.44.0" RYE_INSTALL_OPTION="--yes" bash
ENV PATH=/home/vscode/.rye/shims:$PATH
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/

RUN echo "[[ -d .venv ]] && source .venv/bin/activate || export PATH=\$PATH" >> /home/vscode/.bashrc
4 changes: 2 additions & 2 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"context": ".."
},

"postStartCommand": "rye sync --all-features",
"postStartCommand": "uv sync --all-extras",

"customizations": {
"vscode": {
Expand All @@ -20,7 +20,7 @@
"python.defaultInterpreterPath": ".venv/bin/python",
"python.typeChecking": "basic",
"terminal.integrated.env.linux": {
"PATH": "/home/vscode/.rye/shims:${env:PATH}"
"PATH": "${env:PATH}"
}
}
}
Expand Down
73 changes: 35 additions & 38 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
name: CI
on:
push:
branches-ignore:
- 'generated'
- 'codegen/**'
- 'integrated/**'
- 'stl-preview-head/**'
- 'stl-preview-base/**'
branches:
- '**'
- '!integrated/**'
- '!stl-preview-head/**'
- '!stl-preview-base/**'
- '!generated'
- '!codegen/**'
- 'codegen/stl/**'
pull_request:
branches-ignore:
- 'stl-preview-head/**'
Expand All @@ -17,58 +19,56 @@ jobs:
timeout-minutes: 10
name: lint
runs-on: ${{ github.repository == 'stainless-sdks/blooio-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Install Rye
run: |
curl -sSf https://rye.astral.sh/get | bash
echo "$HOME/.rye/shims" >> $GITHUB_PATH
env:
RYE_VERSION: '0.44.0'
RYE_INSTALL_OPTION: '--yes'
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: '0.10.2'

- name: Install dependencies
run: rye sync --all-features
run: uv sync --all-extras

- name: Run lints
run: ./scripts/lint

build:
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
timeout-minutes: 10
name: build
permissions:
contents: read
id-token: write
runs-on: ${{ github.repository == 'stainless-sdks/blooio-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Install Rye
run: |
curl -sSf https://rye.astral.sh/get | bash
echo "$HOME/.rye/shims" >> $GITHUB_PATH
env:
RYE_VERSION: '0.44.0'
RYE_INSTALL_OPTION: '--yes'
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: '0.10.2'

- name: Install dependencies
run: rye sync --all-features
run: uv sync --all-extras

- name: Run build
run: rye build
run: uv build

- name: Get GitHub OIDC Token
if: github.repository == 'stainless-sdks/blooio-python'
if: |-
github.repository == 'stainless-sdks/blooio-python' &&
!startsWith(github.ref, 'refs/heads/stl/')
id: github-oidc
uses: actions/github-script@v6
uses: actions/github-script@v8
with:
script: core.setOutput('github_token', await core.getIDToken());

- name: Upload tarball
if: github.repository == 'stainless-sdks/blooio-python'
if: |-
github.repository == 'stainless-sdks/blooio-python' &&
!startsWith(github.ref, 'refs/heads/stl/')
env:
URL: https://pkg.stainless.com/s
AUTH: ${{ steps.github-oidc.outputs.github_token }}
Expand All @@ -81,15 +81,12 @@ jobs:
runs-on: ${{ github.repository == 'stainless-sdks/blooio-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Install Rye
run: |
curl -sSf https://rye.astral.sh/get | bash
echo "$HOME/.rye/shims" >> $GITHUB_PATH
env:
RYE_VERSION: '0.44.0'
RYE_INSTALL_OPTION: '--yes'
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: '0.10.2'

- name: Bootstrap
run: ./scripts/bootstrap
Expand Down
13 changes: 5 additions & 8 deletions .github/workflows/publish-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,12 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Install Rye
run: |
curl -sSf https://rye.astral.sh/get | bash
echo "$HOME/.rye/shims" >> $GITHUB_PATH
env:
RYE_VERSION: '0.44.0'
RYE_INSTALL_OPTION: '--yes'
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: '0.9.13'

- name: Publish to PyPI
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-doctor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
if: github.repository == 'Blooio/blooio-python-sdk' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Check release environment
run: |
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.prism.log
.stdy.log
_dev

__pycache__
Expand Down
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "1.0.5"
".": "1.1.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 12
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/blooio%2Fblooio-2d1e4d94ef5b48617299b653eb3509f32fe4e9d6315ee9f3bac50b83635d736b.yml
openapi_spec_hash: 27229154f39588fcc348a91e6b293664
config_hash: 8cae0b4155e1a7413f8d8693d7253e37
configured_endpoints: 54
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/blooio/blooio-da8c56bcab4e4ad076aacfdd5f7d5650de8ad6c3a4bb4be17ee3dca2e14724bc.yml
openapi_spec_hash: 11d9b0407bffe03ac9ca3a91f11b2c3d
config_hash: cade0be519ddc10336c13b95a97fa66b
2 changes: 1 addition & 1 deletion Brewfile
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
brew "rye"
brew "uv"

27 changes: 27 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,32 @@
# Changelog

## 1.1.0 (2026-04-30)

Full Changelog: [v1.0.5...v1.1.0](https://github.com/Blooio/blooio-python-sdk/compare/v1.0.5...v1.1.0)

### Features

* **api:** manual updates ([9d3f025](https://github.com/Blooio/blooio-python-sdk/commit/9d3f02507a83ab0e91689709e85ba1dccefba362))
* **client:** add custom JSON encoder for extended type support ([c02699e](https://github.com/Blooio/blooio-python-sdk/commit/c02699e0bb5a7411efe9ba37898f74bce58fc4a8))
* **client:** add support for binary request streaming ([0a46f0a](https://github.com/Blooio/blooio-python-sdk/commit/0a46f0a17f78a2a21aae637af66fb6b5671c12c5))


### Chores

* **ci:** upgrade `actions/github-script` ([5e006c2](https://github.com/Blooio/blooio-python-sdk/commit/5e006c28777fae0e393b573d148432644a5d181b))
* format all `api.md` files ([3d045e8](https://github.com/Blooio/blooio-python-sdk/commit/3d045e8d5b9cc2afca1d6c85ded4b0e531c28228))
* **internal:** add request options to SSE classes ([3d004d8](https://github.com/Blooio/blooio-python-sdk/commit/3d004d8b3892f4f8a212ef00745919dc59a2e099))
* **internal:** bump dependencies ([e6b7ec8](https://github.com/Blooio/blooio-python-sdk/commit/e6b7ec8b91ed416baf78c830519f226a4a361a98))
* **internal:** codegen related update ([bdc07aa](https://github.com/Blooio/blooio-python-sdk/commit/bdc07aa8716f9de74bebb431a448dbf1f19a0837))
* **internal:** fix lint error on Python 3.14 ([34988f7](https://github.com/Blooio/blooio-python-sdk/commit/34988f7b47fd8e01bbb8a0ba61abf52d66a9598a))
* **internal:** make `test_proxy_environment_variables` more resilient ([fa78df3](https://github.com/Blooio/blooio-python-sdk/commit/fa78df3c42ab33e1f47de28ff366be72c2732134))
* **internal:** make `test_proxy_environment_variables` more resilient to env ([a70f1e5](https://github.com/Blooio/blooio-python-sdk/commit/a70f1e597d63bd7c03f5262d29b32a16ca7eff4f))
* **internal:** remove mock server code ([6d1b141](https://github.com/Blooio/blooio-python-sdk/commit/6d1b141349ac7e1eefe21ef50dc3b5d8de6707d6))
* **internal:** update `actions/checkout` version ([3f2ef54](https://github.com/Blooio/blooio-python-sdk/commit/3f2ef546ebf7281cfca3d17255de0cdc288e1013))
* update mock server docs ([b1c88e2](https://github.com/Blooio/blooio-python-sdk/commit/b1c88e2d8f1aac114dac3b288d540cae6f35d70c))
* update SDK settings ([4a31da6](https://github.com/Blooio/blooio-python-sdk/commit/4a31da6cf0415becb34c3a5f83e6616a34d3f18f))
* update SDK settings ([d02f331](https://github.com/Blooio/blooio-python-sdk/commit/d02f3312e2cd11a7e5492653d7950df76a4e6c36))

## 1.0.5 (2025-12-19)

Full Changelog: [v1.0.4...v1.0.5](https://github.com/Blooio/blooio-python-sdk/compare/v1.0.4...v1.0.5)
Expand Down
29 changes: 11 additions & 18 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
## Setting up the environment

### With Rye
### With `uv`

We use [Rye](https://rye.astral.sh/) to manage dependencies because it will automatically provision a Python environment with the expected Python version. To set it up, run:
We use [uv](https://docs.astral.sh/uv/) to manage dependencies because it will automatically provision a Python environment with the expected Python version. To set it up, run:

```sh
$ ./scripts/bootstrap
```

Or [install Rye manually](https://rye.astral.sh/guide/installation/) and run:
Or [install uv manually](https://docs.astral.sh/uv/getting-started/installation/) and run:

```sh
$ rye sync --all-features
$ uv sync --all-extras
```

You can then run scripts using `rye run python script.py` or by activating the virtual environment:
You can then run scripts using `uv run python script.py` or by manually activating the virtual environment:

```sh
# Activate the virtual environment - https://docs.python.org/3/library/venv.html#how-venvs-work
# manually activate - https://docs.python.org/3/library/venv.html#how-venvs-work
$ source .venv/bin/activate

# now you can omit the `rye run` prefix
# now you can omit the `uv run` prefix
$ python script.py
```

### Without Rye
### Without `uv`

Alternatively if you don't want to install `Rye`, you can stick with the standard `pip` setup by ensuring you have the Python version specified in `.python-version`, create a virtual environment however you desire and then install dependencies using this command:
Alternatively if you don't want to install `uv`, you can stick with the standard `pip` setup by ensuring you have the Python version specified in `.python-version`, create a virtual environment however you desire and then install dependencies using this command:

```sh
$ pip install -r requirements-dev.lock
Expand All @@ -45,7 +45,7 @@ All files in the `examples/` directory are not modified by the generator and can
```py
# add an example to examples/<your-example>.py

#!/usr/bin/env -S rye run python
#!/usr/bin/env -S uv run python
```

Expand All @@ -72,7 +72,7 @@ Building this package will create two files in the `dist/` directory, a `.tar.gz
To create a distributable version of the library, all you have to do is run this command:

```sh
$ rye build
$ uv build
# or
$ python -m build
```
Expand All @@ -85,13 +85,6 @@ $ pip install ./path-to-wheel-file.whl

## Running tests

Most tests require you to [set up a mock server](https://github.com/stoplightio/prism) against the OpenAPI spec to run the tests.

```sh
# you will need npm installed
$ npx prism mock path/to/your/openapi.yml
```

```sh
$ ./scripts/test
```
Expand Down
44 changes: 39 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ It is generated with [Stainless](https://www.stainless.com/).

## Documentation

The full API of this library can be found in [api.md](api.md).
The REST API documentation can be found on [blooio.com](https://blooio.com). The full API of this library can be found in [api.md](api.md).

## Installation

Expand All @@ -33,7 +33,7 @@ client = Blooio(
)

me = client.me.retrieve()
print(me.valid)
print(me.organization_id)
```

While you can provide an `api_key` keyword argument,
Expand All @@ -57,7 +57,7 @@ client = AsyncBlooio(

async def main() -> None:
me = await client.me.retrieve()
print(me.valid)
print(me.organization_id)


asyncio.run(main())
Expand Down Expand Up @@ -91,7 +91,7 @@ async def main() -> None:
http_client=DefaultAioHttpClient(),
) as client:
me = await client.me.retrieve()
print(me.valid)
print(me.organization_id)


asyncio.run(main())
Expand All @@ -106,6 +106,40 @@ Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typ

Typed requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.

## Nested params

Nested parameters are dictionaries, typed using `TypedDict`, for example:

```python
from blooio import Blooio

client = Blooio()

contact_card = client.me.numbers.contact_card.update(
number="number",
sharing={},
)
print(contact_card.sharing)
```

## File uploads

Request parameters that correspond to file uploads can be passed as `bytes`, or a [`PathLike`](https://docs.python.org/3/library/os.html#os.PathLike) instance or a tuple of `(filename, contents, media type)`.

```python
from pathlib import Path
from blooio import Blooio

client = Blooio()

client.groups.icon.set(
group_id="grp_abc123def456",
icon=Path("/path/to/file"),
)
```

The async client uses the exact same interface. If you pass a [`PathLike`](https://docs.python.org/3/library/os.html#os.PathLike) instance, the file contents will be read asynchronously automatically.

## Handling errors

When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `blooio.APIConnectionError` is raised.
Expand Down Expand Up @@ -233,7 +267,7 @@ response = client.me.with_raw_response.retrieve()
print(response.headers.get('X-My-Header'))

me = response.parse() # get the object that `me.retrieve()` would have returned
print(me.valid)
print(me.organization_id)
```

These methods return an [`APIResponse`](https://github.com/Blooio/blooio-python-sdk/tree/main/src/blooio/_response.py) object.
Expand Down
Loading
Loading