diff --git a/.github/workflows/stlc-promote.yml b/.github/workflows/stlc-promote.yml deleted file mode 100644 index 0640088..0000000 --- a/.github/workflows/stlc-promote.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: Promote SDKs - -on: - workflow_dispatch: - push: - branches: [main] - -permissions: - contents: read - -jobs: - promote: - runs-on: ubuntu-latest - if: github.repository == 'autorender/autorender-python-staging' - env: - PRODUCTION_REPO: autorender/autorender-python - GH_TOKEN: ${{ secrets.PRODUCTION_REPO_TOKEN }} - steps: - - name: Check out staging - uses: actions/checkout@v4 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Fetch production main - run: | - git remote add production \ - "https://x-access-token:${GH_TOKEN}@github.com/${PRODUCTION_REPO}.git" - git fetch production main - - - name: Check if production is already in sync - id: diff - run: | - MERGED=$(git merge-tree --write-tree production/main origin/main 2>/dev/null) || MERGED=conflict - PRODUCTION_TREE=$(git rev-parse 'production/main^{tree}') - if [ "$MERGED" = "$PRODUCTION_TREE" ]; then - echo "Production already contains staging content. Nothing to release." - echo "synced=true" >> "$GITHUB_OUTPUT" - else - echo "synced=false" >> "$GITHUB_OUTPUT" - fi - - - name: Push staging main to the release branch on production - if: steps.diff.outputs.synced == 'false' - run: | - git push production origin/main:refs/heads/stainless/release --force - - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git checkout -b stlc-patch-release origin/main - - # Strip staging-only workflows — must not exist in production - git rm -f .github/workflows/stlc-promote.yml \ - .github/workflows/stlc-sync-from-production.yml 2>/dev/null || true - - # Overlay files production owns so stlc regeneration never causes conflicts - for f in CHANGELOG.md pyproject.toml; do - if git ls-tree production/main -- "$f" | grep -q .; then - PROD_BLOB=$(git ls-tree production/main -- "$f" | awk '{print $3}') - STAGE_BLOB=$(git ls-tree HEAD -- "$f" | awk '{print $3}') - if [ "$PROD_BLOB" != "$STAGE_BLOB" ]; then - git checkout production/main -- "$f" - fi - fi - done - - git commit -m "chore: strip internal workflows; preserve production-managed files" || true - git push production HEAD:refs/heads/stainless/release --force - - - name: Open or update the release PR on production - if: steps.diff.outputs.synced == 'false' - run: | - EXISTING_PR=$(gh pr list \ - --repo "${PRODUCTION_REPO}" \ - --head stainless/release \ - --state open \ - --json number \ - --jq '.[0].number') - if [ -z "${EXISTING_PR}" ]; then - gh pr create \ - --repo "${PRODUCTION_REPO}" \ - --base main \ - --head stainless/release \ - --title "Release SDK updates" \ - --body "$(git log --oneline production/main..origin/main)" - else - echo "Release PR #${EXISTING_PR} already exists. Force-push has updated it." - fi diff --git a/.github/workflows/stlc-sync-from-production.yml b/.github/workflows/stlc-sync-from-production.yml deleted file mode 100644 index 642b8c2..0000000 --- a/.github/workflows/stlc-sync-from-production.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Sync from production - -on: - schedule: - - cron: '0 */6 * * *' - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - sync: - runs-on: ubuntu-latest - if: github.repository == 'autorender/autorender-python-staging' - env: - PRODUCTION_REPO: autorender/autorender-python - steps: - - name: Check out staging - uses: actions/checkout@v4 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Fetch production main - env: - PRODUCTION_REPO_TOKEN: ${{ secrets.PRODUCTION_REPO_TOKEN }} - run: | - git remote add production \ - "https://x-access-token:${PRODUCTION_REPO_TOKEN}@github.com/${PRODUCTION_REPO}.git" - git fetch production main - - - name: Check if staging is behind production - id: check - run: | - MERGED=$(git merge-tree --write-tree origin/main production/main 2>/dev/null) || MERGED=conflict - STAGING_TREE=$(git rev-parse 'origin/main^{tree}') - if [ "$MERGED" = "$STAGING_TREE" ] || [ "$MERGED" = "conflict" ]; then - echo "Staging is up to date with production." - echo "needs_sync=false" >> "$GITHUB_OUTPUT" - else - echo "Production has commits not in staging. Back-sync needed." - echo "needs_sync=true" >> "$GITHUB_OUTPUT" - fi - - - name: Create back-sync branch and PR - if: steps.check.outputs.needs_sync == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git checkout -b stlc/from-prod - git merge production/main --no-edit -m "chore: sync release commits from production" - git remote set-url origin \ - "https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git" - git push origin stlc/from-prod --force - - EXISTING_PR=$(gh pr list \ - --repo "${{ github.repository }}" \ - --head stlc/from-prod \ - --state open \ - --json number \ - --jq '.[0].number') - if [ -z "${EXISTING_PR}" ]; then - gh pr create \ - --repo "${{ github.repository }}" \ - --base main \ - --head stlc/from-prod \ - --title "chore: sync release commits from production" \ - --body "Pulls version bump and changelog commits from production back to staging so the next stlc build reseals cleanly." - else - echo "Back-sync PR #${EXISTING_PR} already exists." - fi diff --git a/CHANGELOG.md b/CHANGELOG.md index 37798ea..407a547 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,117 @@ # Changelog +## [0.2.4](https://github.com/autorender/autorender-python/compare/v0.2.3...v0.2.4) (2026-07-12) + + +### Chores + +* rename autorenderhq -> autorender references (GitHub org rename) ([#16](https://github.com/autorender/autorender-python/issues/16)) ([6d6648b](https://github.com/autorender/autorender-python/commit/6d6648bb02999718d81afaea6f8abd220cae49fe)) + +## [0.2.3](https://github.com/autorender/autorender-python/compare/v0.2.2...v0.2.3) (2026-06-29) + + +### Chores + +* remove Stainless attribution from README and SECURITY ([d0947e2](https://github.com/autorender/autorender-python/commit/d0947e288000a296dab8f61ee30a47c35bf8cf91)) +* strip internal workflows; preserve production-managed files ([ac1c0d9](https://github.com/autorender/autorender-python/commit/ac1c0d97235de3b8613f9f661a7ae61defa916d0)) + +## [0.2.2](https://github.com/autorender/autorender-python/compare/v0.2.1...v0.2.2) (2026-06-12) + + +### Bug Fixes + +* preserve production-managed files in release branch ([df62271](https://github.com/autorender/autorender-python/commit/df62271022fe248a89d687cf75b72ad7ad04f533)) +* strip internal workflows from production release branch ([eff96da](https://github.com/autorender/autorender-python/commit/eff96da6776b37be28cba791ab8c79b37cea04b0)) +* update promote workflow and add back-sync from production ([480e3d3](https://github.com/autorender/autorender-python/commit/480e3d33cb70eb0064ff352e15197d3f628936a8)) +* use blob comparison in overlay; add language-specific version files ([8201cbf](https://github.com/autorender/autorender-python/commit/8201cbff752bb9df08d4f606fb593a7cebebb06a)) +* use persist-credentials: false in sync workflow ([6f8e8a0](https://github.com/autorender/autorender-python/commit/6f8e8a0ffc5f06760479249a630338387c8c61e2)) + + +### Chores + +* preserve production-managed files ([a4eebf3](https://github.com/autorender/autorender-python/commit/a4eebf3483db6c5fefb8ccfe6e187812894902ce)) +* remove staging-only workflows from production ([6fd7d39](https://github.com/autorender/autorender-python/commit/6fd7d39d32178cfeac47a6534a82be7c1809e131)) +* remove staging-only workflows from production ([53464a4](https://github.com/autorender/autorender-python/commit/53464a4f6f535ebce37aae6089d230c7bd782235)) +* strip internal workflows; preserve production-managed files ([51d2e56](https://github.com/autorender/autorender-python/commit/51d2e5686fe80673ce44c6be53d90c6bbb43f02a)) + + +### Documentation + +* add auto-generated notice to CONTRIBUTING.md ([88b420c](https://github.com/autorender/autorender-python/commit/88b420c07c39698625b03dce06a45bdcf8076816)) + +## [0.2.1](https://github.com/autorender/autorender-python/compare/v0.2.0...v0.2.1) (2026-05-25) + + +### Bug Fixes + +* publish to correct PyPI package name (autorender) ([5bb8f32](https://github.com/autorender/autorender-python/commit/5bb8f32faae2a3f48b5696b8517b4a6dfd686163)) + +## [0.2.0](https://github.com/autorender/autorender-python/compare/v0.1.0...v0.2.0) (2026-05-25) + + +### Features + +* add test CI job ([2c25e3a](https://github.com/autorender/autorender-python/commit/2c25e3ad8ffe7ff44d5e7781e37de7c2598550df)) +* initial stlc build ([0bdb709](https://github.com/autorender/autorender-python/commit/0bdb709b1d8e670a795f867f71fab9c3ef6be539)) + + +### Bug Fixes + +* install rye for Python SDK bootstrap ([5f089bf](https://github.com/autorender/autorender-python/commit/5f089bf37c183b4d41b1eb1787c5b7390d93b0f2)) +* **python:** rename pagination field has_next_page -> has_next to fix pyright lint ([729d204](https://github.com/autorender/autorender-python/commit/729d20471bdfe545acdea2e443cfb2b8436ba08a)) + + +### Chores + +* trigger release-please ([8db5acc](https://github.com/autorender/autorender-python/commit/8db5acc865fce568f3ebb33c2e2536d9e84a41a6)) +* update stlc custom-code tracking files ([505f95e](https://github.com/autorender/autorender-python/commit/505f95e9e6b66928d05ffa5b630102fdfe3b5e3e)) + +## [0.1.0](https://github.com/autorender/autorender-python/compare/v0.0.1...v0.1.0) (2026-05-25) + + +### Features + +* add test CI job ([2c25e3a](https://github.com/autorender/autorender-python/commit/2c25e3ad8ffe7ff44d5e7781e37de7c2598550df)) +* **api:** api update ([84d1942](https://github.com/autorender/autorender-python/commit/84d19422bdd7a80d8c0d52fe6bb0e989f7b2abe7)) +* **api:** api update ([9dc8482](https://github.com/autorender/autorender-python/commit/9dc848263fbf6509dd3e84a3a7963a897d14991b)) +* **api:** api update ([04c1163](https://github.com/autorender/autorender-python/commit/04c116350cc7a2f5f288a8fd9febd020083cf536)) +* **api:** api update ([b4d6dbe](https://github.com/autorender/autorender-python/commit/b4d6dbee14ac3e753968ce90388eaf01d2af4b94)) +* **api:** api update ([3932736](https://github.com/autorender/autorender-python/commit/393273609afc67cc8b30d33bb27861edb1e20988)) +* **api:** api update ([58346bd](https://github.com/autorender/autorender-python/commit/58346bdeba4b11a33fd1e63c69fceb432424bdf0)) +* **api:** api update ([7fdb60a](https://github.com/autorender/autorender-python/commit/7fdb60a62af1ae9fd716c3a9939d2cc128bd4a85)) +* **api:** api update ([79c95b0](https://github.com/autorender/autorender-python/commit/79c95b0a55d59e214f0b00936a5b517c0f66ca13)) +* **api:** api update ([b43e6a1](https://github.com/autorender/autorender-python/commit/b43e6a1b4b157808d3ef2606552df4e68c1524e7)) +* **api:** api update ([658511c](https://github.com/autorender/autorender-python/commit/658511ca294a346646139b0c4c5e0f4e151115e4)) +* initial stlc build ([0bdb709](https://github.com/autorender/autorender-python/commit/0bdb709b1d8e670a795f867f71fab9c3ef6be539)) +* **internal/types:** support eagerly validating pydantic iterators ([477052f](https://github.com/autorender/autorender-python/commit/477052fa9cd1ff89c96ee4b8febf010851c6501e)) +* support setting headers via env ([749df21](https://github.com/autorender/autorender-python/commit/749df21f7ac657d44cb297707a5ec2506bcb0df9)) + + +### Bug Fixes + +* **client:** add missing f-string prefix in file type error message ([0f93e15](https://github.com/autorender/autorender-python/commit/0f93e15723c120a2f409cf2884d085f7966d5d0c)) +* **examples:** use timestamp names and correct response shape in files.py ([b4d13a7](https://github.com/autorender/autorender-python/commit/b4d13a7d72784c4448424db46495c985276773d3)) +* install rye for Python SDK bootstrap ([5f089bf](https://github.com/autorender/autorender-python/commit/5f089bf37c183b4d41b1eb1787c5b7390d93b0f2)) +* **pagination:** resolve pyright incompatible override for has_next_page ([5cf6e56](https://github.com/autorender/autorender-python/commit/5cf6e565ac0aeecdc5e59b887b1e008892eed1ce)) +* **python:** rename pagination field has_next_page -> has_next to fix pyright lint ([729d204](https://github.com/autorender/autorender-python/commit/729d20471bdfe545acdea2e443cfb2b8436ba08a)) +* strip Content-Type header for body-less requests; add examples ([c3591d0](https://github.com/autorender/autorender-python/commit/c3591d02910ded15e21a7ed7da402bf149f46857)) +* use correct field name format for multipart file arrays ([f968ef9](https://github.com/autorender/autorender-python/commit/f968ef95330967c6b888ea3fc89c85f12ee926d1)) + + +### Performance Improvements + +* **client:** optimize file structure copying in multipart requests ([498d621](https://github.com/autorender/autorender-python/commit/498d621cc46637650c03f1ed9d00749dbcab9c99)) + + +### Chores + +* **internal:** more robust bootstrap script ([798e8b7](https://github.com/autorender/autorender-python/commit/798e8b79c22e0173d4f30a80924dcad627cc838f)) +* **internal:** reformat pyproject.toml ([fcc4169](https://github.com/autorender/autorender-python/commit/fcc4169f137c6f4e6305bd0b8133658ad5337aa6)) +* remove examples from SDK (moved to stainless-examples runner) ([12a383e](https://github.com/autorender/autorender-python/commit/12a383e16ab6e856905dd8ce8f3f666ff914c43c)) +* **tests:** bump steady to v0.22.1 ([30a0e81](https://github.com/autorender/autorender-python/commit/30a0e8184adf8271f879cb9e5175ed52404a0043)) +* update SDK settings ([aead4ee](https://github.com/autorender/autorender-python/commit/aead4ee8dd9504134612b1845cd18576b7c58848)) +* update stlc custom-code tracking files ([505f95e](https://github.com/autorender/autorender-python/commit/505f95e9e6b66928d05ffa5b630102fdfe3b5e3e)) + ## 0.1.0 (2026-05-15) Full Changelog: [v0.0.1...v0.1.0](https://github.com/autorender/autorender-python/compare/v0.0.1...v0.1.0) diff --git a/pyproject.toml b/pyproject.toml index 95cc2df..1d127c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "autorender" -version = "0.0.1" +version = "0.2.4" description = "The official Python library for the autorender API" dynamic = ["readme"] license = "MIT" diff --git a/scripts/mock b/scripts/mock index f898145..d619859 100755 --- a/scripts/mock +++ b/scripts/mock @@ -11,7 +11,7 @@ elif [ -n "$STAINLESS_OPENAPI_SPEC_URL" ]; then URL="$STAINLESS_OPENAPI_SPEC_URL" else # Embedded OpenAPI spec (base64-encoded, gzipped) - EMBEDDED_SPEC="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" + EMBEDDED_SPEC="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" SPEC_TMPFILE="$(mktemp)" trap 'rm -f "$SPEC_TMPFILE"' EXIT echo "$EMBEDDED_SPEC" | base64 --decode | gunzip > "$SPEC_TMPFILE"