Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
7add289
chore: migrate to speakeasy workflows
simplesagar Apr 5, 2024
10bb5d6
Merge pull request #71 from speakeasy-sdks/chore/migrate-speakeasy-wo…
aaronsteers Apr 8, 2024
a439ef8
Change (breaking!): Rename import to `airbyte_api`, flatten hierarchy…
aaronsteers Apr 8, 2024
d80a8db
Refactor: Regenerate with new name (`airbyte_api`) and consolidated m…
aaronsteers Apr 11, 2024
1a42d21
chore: 🐝 Update SDK - Generate (#62)
github-actions[bot] Apr 11, 2024
e84563f
Update to support client credentials
JonsSpaghetti May 9, 2024
d919c53
Update spec file to include permission Create & org ID for workspace …
JonsSpaghetti May 14, 2024
ad915a5
chore: 🐝 Update SDK - Generate (#74)
github-actions[bot] May 14, 2024
b1ca9ac
chore: 🐝 Update SDK - Generate (#80)
github-actions[bot] May 15, 2024
b798d83
Dedupe requests and add Health and Permissions (#82)
JonsSpaghetti May 15, 2024
ea664d6
Set groups and aliases properly for permissions (#83)
JonsSpaghetti May 15, 2024
fc7d5c4
chore: 🐝 Update SDK - Generate (#84)
github-actions[bot] May 15, 2024
2795548
chore: update sdk spec (#90)
May 31, 2024
9317ad8
chore: 🐝 Update SDK - Generate (#85)
github-actions[bot] Jun 3, 2024
202f326
chore(public-api): update public-api sdk (#94)
Jun 22, 2024
d13ece1
Update token endpoint (#96)
JonsSpaghetti Jul 15, 2024
653e758
Fix stash conflicts (#97)
JonsSpaghetti Jul 15, 2024
59c5e7f
chore: 🐝 Update SDK - Generate (#98)
github-actions[bot] Jul 15, 2024
57e2cdf
chore: update openapi spec (#100)
malikdiarra Sep 4, 2024
87f7e7b
Remove discriminators, flag secrets (#102)
JonsSpaghetti Sep 10, 2024
1eac185
chore: 🐝 Update SDK - Generate 0.52.0 (#103)
github-actions[bot] Sep 11, 2024
817601f
fix: use oss catalog instead of cloud (#104)
JonsSpaghetti Sep 24, 2024
140e083
chore: 🐝 Update SDK - Generate 0.52.1 (#105)
github-actions[bot] Sep 25, 2024
048c847
chore: use the main repository api spec (#107)
malikdiarra Oct 11, 2024
7884557
chore: 🐝 Update SDK - Generate 0.52.2 (#109)
github-actions[bot] Dec 11, 2024
ae27a67
chore: pin speakeasy cli version to maintain python v1 functionality …
walker-tx Feb 28, 2025
3d186cd
chore: 🐝 Update SDK - Generate 0.53.0 (#129)
github-actions[bot] Oct 2, 2025
9f75c79
Pin GitHub Actions to SHA1 for supply chain security (#131)
wennergr Oct 3, 2025
9da996c
ci: add workflow stubs to enable workflow_dispatch on feature branche…
aaronsteers Jun 22, 2026
48df0cd
feat!: migrate to Speakeasy Python v2 generator infrastructure (#146)
aaronsteers Jun 22, 2026
0e771a3
chore: regenerate SDK with Speakeasy (#147)
github-actions[bot] Jun 22, 2026
edac0ec
ci: add CI validation, release automation, and Dependabot (#144)
aaronsteers Jun 22, 2026
e7f2325
docs: add CONTRIBUTING.md, AGENTS.md with generation lineage and guid…
aaronsteers Jun 22, 2026
ae5c56a
chore: regenerate SDK with Speakeasy (#156)
octavia-bot[bot] Jun 22, 2026
6b2f771
chore: regenerate SDK with Speakeasy (#157)
octavia-bot[bot] Jun 22, 2026
bec127c
chore: regenerate SDK with Speakeasy (#159)
octavia-bot[bot] Jun 22, 2026
6a64593
chore: regenerate SDK with Speakeasy (#161)
octavia-bot[bot] Jun 22, 2026
f3a2cf6
chore: regenerate SDK with Speakeasy (#162)
octavia-bot[bot] Jun 22, 2026
16f4c3f
chore: regenerate SDK with Speakeasy (#163)
octavia-bot[bot] Jun 23, 2026
f5ed31a
chore: regenerate SDK with Speakeasy (#164)
octavia-bot[bot] Jun 23, 2026
1784582
chore: regenerate SDK with Speakeasy (#165)
octavia-bot[bot] Jun 23, 2026
b21005b
ci: use PYPI_TOKEN for publishing and fix infinite generate loop (#160)
aaronsteers Jun 23, 2026
3bb9d70
ci: bump actions/upload-artifact from 4 to 7 (#158)
dependabot[bot] Jun 23, 2026
a804b84
ci: take ownership of pyproject.toml, add dynamic versioning and poe …
aaronsteers Jun 23, 2026
a20a373
ci: add GITHUB_TOKEN fallback when GitHub App secrets are unavailable…
aaronsteers Jun 23, 2026
5d1136d
ci: switch Dependabot from pip to uv ecosystem for proper uv.lock upd…
aaronsteers Jun 23, 2026
dc28e38
ci: scope generation validation to generation-affecting files only (#…
aaronsteers Jun 23, 2026
ae43fd6
chore: bump pylint from 3.2.3 to 4.0.6 (#172)
dependabot[bot] Jun 23, 2026
cf44939
ci: remove generate-command.yml from generation path filter (#174)
aaronsteers Jun 23, 2026
25fde42
ci: bump astral-sh/setup-uv from 5 to 7 (#151)
dependabot[bot] Jun 23, 2026
32e0d16
ci: bump actions/checkout from 4 to 7 (#169)
dependabot[bot] Jun 23, 2026
e93b1e3
ci: bump peter-evans/find-comment from 3 to 4 (#152)
dependabot[bot] Jun 23, 2026
c563a62
ci: bump peter-evans/create-pull-request from 6 to 8 (#148)
dependabot[bot] Jun 23, 2026
b95c4fe
ci: bump aaronsteers/semantic-pr-release-drafter from 1.1.0 to 2.0.1 …
dependabot[bot] Jun 23, 2026
50d9aeb
chore: bump pyright from 1.1.398 to 1.1.410 (#171)
dependabot[bot] Jun 23, 2026
492ae67
chore: bump mypy from 1.15.0 to 2.1.0 (#170)
dependabot[bot] Jun 23, 2026
35eb6eb
ci: switch dynamic versioning from file-based to git tag-based (#175)
aaronsteers Jun 23, 2026
abdb7d7
ci: fix pre-release workflow to use UV_DYNAMIC_VERSIONING_BYPASS (#176)
aaronsteers Jun 23, 2026
90501fe
ci: remove hardcoded version from _version.py via post_generate.py (#…
aaronsteers Jun 23, 2026
a1d6b45
fix: enable Speakeasy fix flags to resolve forward-reference NameErro…
aaronsteers Jun 23, 2026
84a46e5
Do not merge: experiment — overlay rename RowFilteringOperationNot to…
aaronsteers Jun 23, 2026
ad179fe
chore: remove stale RowFilteringOperationNot1 files from prior genera…
aaronsteers Jun 23, 2026
d37fdfd
chore: regenerate SDK with Speakeasy (#189)
octavia-bot[bot] Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
2 changes: 1 addition & 1 deletion .genignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
.github
pyproject.toml
47 changes: 47 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Dependabot configuration for airbyte-api-python-sdk.
#
# `.speakeasy/workflow.yaml` uses `speakeasyVersion: pinned`, so the actual CLI
# version is pinned in `.github/speakeasy/dummy-compose.yml` and bumped by the
# docker-compose ecosystem entry below.

version: 2
updates:
# Speakeasy CLI version pin (image: tag in .github/speakeasy/dummy-compose.yml).
# See that file for the full explanation.
- package-ecosystem: docker-compose
directory: /.github/speakeasy
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 5
commit-message:
prefix: ci(speakeasy)
labels:
- dependencies
- speakeasy

# GitHub Actions used in .github/workflows/*.yml
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 5
commit-message:
prefix: ci
labels:
- dependencies
- github-actions

# Python dependencies (uv / pyproject.toml + uv.lock)
- package-ecosystem: uv
directory: /
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 5
commit-message:
prefix: chore
labels:
- dependencies
- python
8 changes: 8 additions & 0 deletions .github/speakeasy/dummy-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Speakeasy CLI version pin. Bumped by Dependabot's `docker-compose`
# ecosystem; never invoked via `docker compose` (hence `dummy-`).
# Consumed by `.github/workflows/generate-command.yml`, which pulls the
# image and copies `/usr/local/bin/speakeasy` onto the runner.

services:
speakeasy:
image: ghcr.io/speakeasy-api/speakeasy:v1.784.0
303 changes: 303 additions & 0 deletions .github/workflows/generate-command.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,303 @@
# Speakeasy SDK Generation Workflow
#
# This workflow regenerates the Python SDK code using Speakeasy.
# It can create a new PR, update an existing PR branch, or run in dry-run mode for validation.
#
# Triggers:
# - On push to main: Auto-generates after every merge to ensure SDK stays up-to-date (auto-merge enabled)
# - Daily schedule (5 AM & 5 PM America/Los_Angeles): Catches upstream API spec changes (auto-merge enabled)
# - Manual workflow_dispatch: For on-demand generation
# - Slash command (/generate): Regenerates and pushes results back to the PR branch
# - workflow_call: For validation from other workflows (e.g., PR checks)
#
# Generation Process:
# 1. Install Speakeasy CLI from pinned Docker image
# 2. Run Speakeasy to generate the Python SDK code
# 3. Run post-generation patches (currently no-op)
# 4. (If PR context) Commit and push regenerated code back to the PR branch
# 5. (If no PR context and not dry_run) Create a new PR with the regenerated code
# 6. (If dry_run) Verify the generated code is valid
#
# How to use:
# - From a PR: Comment `/generate` to regenerate and push to the PR branch
# - From Actions: Go to Actions > Generate > Run workflow (creates a new PR)
# - Optionally check "Dry run" to validate generation without committing

name: Generate SDK

"on":
push:
branches:
- main
schedule:
- cron: '0 5 * * *'
timezone: America/Los_Angeles
- cron: '0 17 * * *'
timezone: America/Los_Angeles
workflow_dispatch:
inputs:
dry_run:
description: Validate generation without creating a PR
type: boolean
default: false
pr:
description: 'PR number (if set, pushes results to the PR branch instead of creating a new PR)'
type: string
required: false
comment-id:
description: 'Comment ID (for slash command triggers)'
type: string
required: false
workflow_call:
inputs:
dry_run:
description: Validate generation without creating a PR
type: boolean
default: false
outputs:
has_changes:
description: Whether the generation produced changes vs committed code
value: ${{ jobs.generate.outputs.has_changes }}
drift_summary:
description: Git diff stat summary when drift is detected
value: ${{ jobs.generate.outputs.drift_summary }}

concurrency:
group: ${{ (github.event_name == 'push' || github.event_name == 'schedule') && 'generate-new-pr' || format('generate-{0}', github.run_id) }}
cancel-in-progress: true

jobs:
check-paths:
name: Check Generation Paths
if: ${{ inputs.dry_run }}
runs-on: ubuntu-latest
outputs:
should_run: ${{ github.event_name == 'workflow_dispatch' || steps.filter.outputs.generation == 'true' }}
steps:
- name: Checkout repository
uses: actions/checkout@v7
- name: Filter changed paths
uses: dorny/paths-filter@v4
id: filter
with:
filters: |
generation:
- '.speakeasy/**'
- '.genignore'
- '.github/speakeasy/**'
- 'gen.yaml'
- 'overlays/**'
- 'README.md'
- 'scripts/**'
- 'poe_tasks.toml'
- 'src/**'

generate:
name: Generate SDK
needs: [check-paths]
if: ${{ always() && (!inputs.dry_run || needs.check-paths.outputs.should_run == 'true') }}
runs-on: ubuntu-latest
timeout-minutes: 30
outputs:
has_changes: ${{ steps.changes.outputs.has_changes }}
drift_summary: ${{ steps.changes.outputs.drift_summary }}
permissions:
contents: write
pull-requests: write
steps:
- name: Authenticate as GitHub App
uses: actions/create-github-app-token@v3
id: app-token
continue-on-error: ${{ github.actor == 'dependabot[bot]' }}
with:
app-id: ${{ secrets.OCTAVIA_BOT_APP_ID }}
private-key: ${{ secrets.OCTAVIA_BOT_PRIVATE_KEY }}

- name: Warn on GitHub App auth fallback
if: steps.app-token.outcome == 'failure'
run: |
echo "::warning::GitHub App authentication failed (secrets may not be available in this context). Falling back to GITHUB_TOKEN."

- name: Post or append starting comment
if: ${{ !inputs.dry_run && github.event.inputs.pr != '' }}
id: start-comment
uses: peter-evans/create-or-update-comment@v5
with:
token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.inputs.pr }}
comment-id: ${{ github.event.inputs.comment-id || '' }}
body: |
> **Generate SDK Job Info**
>
> Running Speakeasy SDK generation.

> Job started... [Check job output.](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})

- name: Resolve PR head branch
if: ${{ !inputs.dry_run && github.event.inputs.pr != '' }}
id: pr-branch
env:
GH_TOKEN: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.inputs.pr }}
run: |
PR_JSON=$(gh api repos/${{ github.repository }}/pulls/${PR_NUMBER})
HEAD_REF=$(echo "$PR_JSON" | jq -r '.head.ref')
IS_FORK=$(echo "$PR_JSON" | jq -r '.head.repo.fork')
if [ "$IS_FORK" = "true" ]; then
echo "::error::Cannot run /generate on fork PRs. Please regenerate locally."
exit 1
fi
echo "head_ref=${HEAD_REF}" >> $GITHUB_OUTPUT

- name: Checkout repository
uses: actions/checkout@v7
with:
fetch-depth: 0
ref: ${{ steps.pr-branch.outputs.head_ref || '' }}
token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}

- name: Install uv
uses: astral-sh/setup-uv@v7

- name: Get next version from release drafter
id: get-version
uses: aaronsteers/[email protected]
with:
dry-run: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Install Speakeasy CLI
run: |
SPEAKEASY_IMAGE=$(yq '.services.speakeasy.image' .github/speakeasy/dummy-compose.yml)
echo "Pinned Speakeasy image: $SPEAKEASY_IMAGE"
docker pull "$SPEAKEASY_IMAGE"
CONTAINER_ID=$(docker create "$SPEAKEASY_IMAGE")
sudo docker cp "$CONTAINER_ID:/usr/local/bin/speakeasy" /usr/local/bin/speakeasy
docker rm "$CONTAINER_ID" >/dev/null
speakeasy --version

- name: Resolve SDK version
id: resolve-version
env:
DRAFTER_VERSION: ${{ steps.get-version.outputs.resolved-version }}
run: |
GENYAML_VERSION=$(yq '.python.version' gen.yaml)
echo "Release drafter version: ${DRAFTER_VERSION:-<empty>}"
echo "gen.yaml version: ${GENYAML_VERSION:-<empty>}"
# Use gen.yaml version if it is a higher major than the drafter
# (handles initial major-version bumps before the first release).
# Otherwise, prefer the release drafter's resolved version.
DRAFTER_MAJOR=${DRAFTER_VERSION%%.*}
GENYAML_MAJOR=${GENYAML_VERSION%%.*}
if [ -n "$GENYAML_VERSION" ] && [ "${GENYAML_MAJOR:-0}" -gt "${DRAFTER_MAJOR:-0}" ]; then
echo "version=${GENYAML_VERSION}" | tee -a $GITHUB_OUTPUT
echo "Using gen.yaml version (higher major: ${GENYAML_MAJOR} > ${DRAFTER_MAJOR})"
elif [ -n "$DRAFTER_VERSION" ]; then
echo "version=${DRAFTER_VERSION}" | tee -a $GITHUB_OUTPUT
echo "Using release drafter version"
elif [ -n "$GENYAML_VERSION" ]; then
echo "version=${GENYAML_VERSION}" | tee -a $GITHUB_OUTPUT
echo "Falling back to gen.yaml version"
else
echo "::error::No version could be resolved from release drafter or gen.yaml."
exit 1
fi

- name: Generate SDK
env:
SPEAKEASY_API_KEY: ${{ secrets.SPEAKEASY_API_KEY }}
VERSION: ${{ steps.resolve-version.outputs.version }}
run: |
echo "Generating with version: $VERSION"
uv run poe generate-full

- name: Generation Summary
run: |
echo "=== Generation Summary ==="
echo "Source files: $(find src/ -name '*.py' 2>/dev/null | wc -l)"
echo "Model files: $(find src/ -path '*/models/*' -name '*.py' 2>/dev/null | wc -l)"
if [ -f "pyproject.toml" ]; then
echo "Package version: $(grep 'version' pyproject.toml | head -1)"
fi

- name: Check for changes
id: changes
run: |
# Restore non-deterministic Speakeasy lock files to HEAD
# to ignore digest changes that cause infinite generate→merge loops.
git checkout HEAD -- .speakeasy/workflow.lock 2>/dev/null || true
git checkout HEAD -- .speakeasy/gen.lock 2>/dev/null || true
if [ -n "$(git status --porcelain)" ]; then
echo "has_changes=true" | tee -a $GITHUB_OUTPUT
echo "=== Changed files ==="
git status --porcelain
echo
echo "=== Diff stat ==="
SUMMARY=$(git diff --stat)
echo "$SUMMARY"
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
{
echo "drift_summary<<$EOF"
echo "$SUMMARY"
echo "$EOF"
} | tee -a "$GITHUB_OUTPUT"
else
echo "has_changes=false" | tee -a $GITHUB_OUTPUT
fi

# --- PR branch mode: commit and push to the existing PR branch ---
- name: Push regenerated code to PR branch
if: ${{ !inputs.dry_run && github.event.inputs.pr != '' && steps.changes.outputs.has_changes == 'true' }}
run: |
git config user.name "octavia-bot[bot]"
git config user.email "octavia-bot[bot]@users.noreply.github.com"
git add -A
git commit -m "chore: regenerate SDK with Speakeasy"
git push

# --- New PR mode: create a PR to main ---
- name: Create Pull Request
if: ${{ !inputs.dry_run && steps.changes.outputs.has_changes == 'true' && github.event.inputs.pr == '' }}
id: create-pr
uses: peter-evans/create-pull-request@v8
with:
token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
commit-message: "chore: regenerate SDK with Speakeasy"
title: "chore: regenerate SDK with Speakeasy"
body: |
This PR was automatically generated by the Speakeasy SDK generation workflow.

Please review the changes and merge if they look correct.
branch: speakeasy-sdk-regen
base: main
delete-branch: true

- name: Enable auto-merge (new PR only)
if: |
(github.event_name == 'push'
|| github.event_name == 'schedule'
) && steps.create-pr.outputs.pull-request-operation == 'created'
env:
GH_TOKEN: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
run: gh pr merge ${{ steps.create-pr.outputs.pull-request-number }} --auto --squash

- name: Append success comment
if: ${{ success() && !inputs.dry_run && github.event.inputs.pr != '' }}
uses: peter-evans/create-or-update-comment@v5
with:
token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
comment-id: ${{ steps.start-comment.outputs.comment-id }}
reactions: hooray
body: |
> SDK generation completed successfully.

- name: Append failure comment
if: ${{ failure() && !inputs.dry_run && github.event.inputs.pr != '' }}
uses: peter-evans/create-or-update-comment@v5
with:
token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
comment-id: ${{ steps.start-comment.outputs.comment-id }}
reactions: confused
body: |
> SDK generation failed. Check the [job output](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.
Loading