Skip to content

Commit affd6e8

Browse files
release: 3.0.0 (#254)
* perf(client): optimize file structure copying in multipart requests * chore(tests): bump steady to v0.22.1 * chore(internal): more robust bootstrap script * fix: use correct field name format for multipart file arrays * feat: support setting headers via env * codegen metadata * codegen metadata * chore(internal): reformat pyproject.toml * fix(client): add missing f-string prefix in file type error message * feat(internal/types): support eagerly validating pydantic iterators * ci: pin GitHub Actions to commit SHAs Pin all GitHub Actions referenced in generated workflows (both first-party `actions/*` and third-party) to immutable commit SHAs. Updating pinned actions is now a deliberate codegen-side bump rather than implicit on every workflow run. * fix: treat text/plan with format: binary as raw upload * release: 3.0.0 --------- Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com>
1 parent 1ebd7bb commit affd6e8

27 files changed

Lines changed: 1779 additions & 161 deletions

‎.github/workflows/ci.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
runs-on: ${{ github.repository == 'stainless-sdks/writer-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
2222
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
2323
steps:
24-
- uses: actions/checkout@v6
24+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
2525

2626
- name: Install Rye
2727
run: |
@@ -46,7 +46,7 @@ jobs:
4646
id-token: write
4747
runs-on: ${{ github.repository == 'stainless-sdks/writer-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
4848
steps:
49-
- uses: actions/checkout@v6
49+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
5050

5151
- name: Install Rye
5252
run: |
@@ -67,7 +67,7 @@ jobs:
6767
github.repository == 'stainless-sdks/writer-python' &&
6868
!startsWith(github.ref, 'refs/heads/stl/')
6969
id: github-oidc
70-
uses: actions/github-script@v8
70+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
7171
with:
7272
script: core.setOutput('github_token', await core.getIDToken());
7373

@@ -87,7 +87,7 @@ jobs:
8787
runs-on: ${{ github.repository == 'stainless-sdks/writer-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
8888
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
8989
steps:
90-
- uses: actions/checkout@v6
90+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
9191

9292
- name: Install Rye
9393
run: |

‎.github/workflows/publish-pypi.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
runs-on: ubuntu-latest
1515

1616
steps:
17-
- uses: actions/checkout@v6
17+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
1818

1919
- name: Install Rye
2020
run: |

‎.github/workflows/release-doctor.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
if: github.repository == 'writer/writer-python' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')
1313

1414
steps:
15-
- uses: actions/checkout@v6
15+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
1616

1717
- name: Check release environment
1818
run: |

‎.release-please-manifest.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "3.0.0-rc1"
2+
".": "3.0.0"
33
}

‎.stats.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 30
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/writerai%2Fwriter-ea6b4de3976794a02ea8fc01669d901cd7b159ba0d598cc9653e01c987a2f806.yml
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/writerai/writer-275de8f7afa2d37404ebebc082dda35e70ab94437de270b5bc6e2fdc94c9fdae.yml
33
openapi_spec_hash: 4d4a9ba232d19a6180e6d4a7d5566103
44
config_hash: 8701b1a467238f1afdeceeb7feb1adc6

‎CHANGELOG.md‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
# Changelog
22

3+
## 3.0.0 (2026-06-02)
4+
5+
Full Changelog: [v3.0.0-rc1...v3.0.0](https://github.com/writer/writer-python/compare/v3.0.0-rc1...v3.0.0)
6+
7+
### Features
8+
9+
* **internal/types:** support eagerly validating pydantic iterators ([324b108](https://github.com/writer/writer-python/commit/324b1081959e99879dca3ff2e26681904e83963a))
10+
* support setting headers via env ([78f3187](https://github.com/writer/writer-python/commit/78f3187470d4e515c1c6f7d05b6eb1ea5bc52c7c))
11+
12+
13+
### Bug Fixes
14+
15+
* **client:** add missing f-string prefix in file type error message ([958f3ee](https://github.com/writer/writer-python/commit/958f3eee1c5a1e719871f2c8bb3cd56384107756))
16+
* treat text/plan with format: binary as raw upload ([71e3e9e](https://github.com/writer/writer-python/commit/71e3e9eced88dc65ff3e19375f9396b4ee39f76e))
17+
* use correct field name format for multipart file arrays ([0fc449c](https://github.com/writer/writer-python/commit/0fc449c31140dc028795b5dec9e96108d383e644))
18+
19+
20+
### Performance Improvements
21+
22+
* **client:** optimize file structure copying in multipart requests ([9f217a1](https://github.com/writer/writer-python/commit/9f217a150d0f2035bd3d84256886bb3fe23b9db4))
23+
24+
25+
### Chores
26+
27+
* **internal:** more robust bootstrap script ([cec8c09](https://github.com/writer/writer-python/commit/cec8c0965b639b633a5d53a1a5a33780cd00af48))
28+
* **internal:** reformat pyproject.toml ([ddec191](https://github.com/writer/writer-python/commit/ddec1911c7f2bf22dbc508da84081f787a22293a))
29+
* **tests:** bump steady to v0.22.1 ([8989979](https://github.com/writer/writer-python/commit/898997940ea34e3d3eddaf69556195ad64a17ab3))
30+
331
## 3.0.0-rc1 (2026-04-13)
432

533
Full Changelog: [v2.4.0...v3.0.0-rc1](https://github.com/writer/writer-python/compare/v2.4.0...v3.0.0-rc1)

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ To install the package from PyPI, use `pip`:
2828

2929
```sh
3030
# install from PyPI
31-
pip install --pre writer-sdk
31+
pip install writer-sdk
3232
```
3333

3434
## Prequisites
@@ -125,7 +125,7 @@ You can enable this by installing `aiohttp`:
125125

126126
```sh
127127
# install from PyPI
128-
pip install --pre writer-sdk[aiohttp]
128+
pip install writer-sdk[aiohttp]
129129
```
130130

131131
Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:

‎api.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ Methods:
155155
- <code title="delete /v1/files/{file_id}">client.files.<a href="./src/writerai/resources/files.py">delete</a>(file_id) -> <a href="./src/writerai/types/file_delete_response.py">FileDeleteResponse</a></code>
156156
- <code title="get /v1/files/{file_id}/download">client.files.<a href="./src/writerai/resources/files.py">download</a>(file_id) -> BinaryAPIResponse</code>
157157
- <code title="post /v1/files/retry">client.files.<a href="./src/writerai/resources/files.py">retry</a>(\*\*<a href="src/writerai/types/file_retry_params.py">params</a>) -> <a href="./src/writerai/types/file_retry_response.py">FileRetryResponse</a></code>
158-
- <code title="post /v1/files">client.files.<a href="./src/writerai/resources/files.py">upload</a>(\*\*<a href="src/writerai/types/file_upload_params.py">params</a>) -> <a href="./src/writerai/types/file.py">File</a></code>
158+
- <code title="post /v1/files">client.files.<a href="./src/writerai/resources/files.py">upload</a>(content, \*\*<a href="src/writerai/types/file_upload_params.py">params</a>) -> <a href="./src/writerai/types/file.py">File</a></code>
159159

160160
# Tools
161161

‎pyproject.toml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "writer-sdk"
3-
version = "3.0.0-rc1"
3+
version = "3.0.0"
44
description = "The official Python library for the writer API"
55
dynamic = ["readme"]
66
license = "Apache-2.0"
@@ -172,7 +172,7 @@ show_error_codes = true
172172
#
173173
# We also exclude our `tests` as mypy doesn't always infer
174174
# types correctly and Pyright will still catch any type errors.
175-
exclude = ['src/writerai/_files.py', '_dev/.*.py', 'tests/.*']
175+
exclude = ["src/writerai/_files.py", "_dev/.*.py", "tests/.*"]
176176

177177
strict_equality = true
178178
implicit_reexport = true

‎scripts/bootstrap‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ set -e
44

55
cd "$(dirname "$0")/.."
66

7-
if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then
7+
if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "${SKIP_BREW:-}" != "1" ] && [ -t 0 ]; then
88
brew bundle check >/dev/null 2>&1 || {
99
echo -n "==> Install Homebrew dependencies? (y/N): "
1010
read -r response

0 commit comments

Comments
 (0)