Skip to content

feat(destination-smoke-test): add smoke test destination connector#72441

Draft
Aaron ("AJ") Steers (aaronsteers) wants to merge 7 commits intomasterfrom
devin/1769653264-destination-pyairbyte-universal
Draft

feat(destination-smoke-test): add smoke test destination connector#72441
Aaron ("AJ") Steers (aaronsteers) wants to merge 7 commits intomasterfrom
devin/1769653264-destination-pyairbyte-universal

Conversation

@aaronsteers
Copy link
Collaborator

@aaronsteers Aaron ("AJ") Steers (aaronsteers) commented Jan 29, 2026

What

Registers a new destination-smoke-test connector that uses PyAirbyte's cache system to write data to various backends (DuckDB, PostgreSQL, Snowflake, BigQuery, MotherDuck). This connector is designed for testing and validation purposes.

This is part 2 of 2 - the implementation lives in PyAirbyte: airbytehq/PyAirbyte#969

How

This PR adds a thin wrapper connector that imports the DestinationPyAirbyteUniversal class from the PyAirbyte library. The connector:

  • Declares airbyte >= 0.20.0 as a dependency to get the destination implementation
  • Uses the standard python-connector-base:4.0.2 Docker image
  • Is registered for OSS only (cloud disabled) at alpha release stage

Review guide

  1. metadata.yaml - Connector registration with definitionId, resource requirements, and registry settings
  2. pyproject.toml - Dependencies including airbyte >= 0.20.0 which provides the implementation
  3. destination_smoke_test/run.py - Entry point that imports from PyAirbyte

Key items to verify:

User Impact

Users will be able to use a single destination connector to write to multiple backend types (DuckDB, Postgres, Snowflake, BigQuery, MotherDuck) by selecting the destination_type in configuration.

Note: This connector depends on PyAirbyte PR #969 being merged first. CI will fail until the PyAirbyte changes are published.

Can this PR be safely reverted and rolled back?

  • YES 💚

Requested by: Aaron ("AJ") Steers (@aaronsteers) (AJ)
Devin session: https://app.devin.ai/sessions/46cd19c4793a4e1ea32bb660de9c1fe0

…ector

This registers a new destination connector that uses PyAirbyte's cache
system to write data to various backends (DuckDB, Postgres, Snowflake,
BigQuery, MotherDuck).

The connector implementation lives in the PyAirbyte repository and is
imported as a dependency. This connector entry provides the metadata
and thin wrapper needed to run it as an Airbyte destination.

Co-Authored-By: AJ Steers <aj@airbyte.io>
@devin-ai-integration
Copy link
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@github-actions
Copy link
Contributor

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

💡 Show Tips and Tricks

PR Slash Commands

Airbyte Maintainers (that's you!) can execute the following slash commands on your PR:

  • 🛠️ Quick Fixes
    • /format-fix - Fixes most formatting issues.
    • /bump-version - Bumps connector versions, scraping changelog description from the PR title.
  • ❇️ AI Testing and Review:
    • /ai-docs-review - Provides AI-powered documentation recommendations for PRs with connector changes.
    • /ai-prove-fix - Runs prerelease readiness checks, including testing against customer connections.
    • /ai-canary-prerelease - Rolls out prerelease to 5-10 connections for canary testing.
    • /ai-review - AI-powered PR review for connector safety and quality gates.
  • 🚀 Connector Releases:
    • /publish-connectors-prerelease - Publishes pre-release connector builds (tagged as {version}-preview.{git-sha}) for all modified connectors in the PR.
    • /bump-progressive-rollout-version - Bumps connector version with an RC suffix (2.16.10-rc.1) for progressive rollouts (enableProgressiveRollout: true).
      • Example: /bump-progressive-rollout-version changelog="Add new feature for progressive rollout"
  • ☕️ JVM connectors:
    • /update-connector-cdk-version connector=<CONNECTOR_NAME> - Updates the specified connector to the latest CDK version.
      Example: /update-connector-cdk-version connector=destination-bigquery
    • /bump-bulk-cdk-version bump=patch changelog='foo' - Bump the Bulk CDK's version. bump can be major/minor/patch.
  • 🐍 Python connectors:
    • /poe connector source-example lock - Run the Poe lock task on the source-example connector, committing the results back to the branch.
    • /poe source example lock - Alias for /poe connector source-example lock.
    • /poe source example use-cdk-branch my/branch - Pin the source-example CDK reference to the branch name specified.
    • /poe source example use-cdk-latest - Update the source-example CDK dependency to the latest available version.
  • ⚙️ Admin commands:
    • /force-merge reason="<REASON>" - Force merges the PR using admin privileges, bypassing CI checks. Requires a reason.
      Example: /force-merge reason="CI is flaky, tests pass locally"
📚 Show Repo Guidance

Helpful Resources

📝 Edit this welcome message.

Co-Authored-By: AJ Steers <aj@airbyte.io>
@github-actions
Copy link
Contributor

github-actions bot commented Jan 29, 2026

destination-pyairbyte-universal Connector Test Results

4 tests   0 ✅  4m 30s ⏱️
1 suites  3 💤
1 files    1 ❌

For more details on these failures, see this check.

Results for commit 8dc1da3.

♻️ This comment has been updated with latest results.

devin-ai-integration bot and others added 2 commits January 29, 2026 02:31
PyAirbyte (airbyte package) already includes airbyte-cdk as a dependency,
so specifying it explicitly causes a version conflict during poetry install.

Co-Authored-By: AJ Steers <aj@airbyte.io>
Copy link
Contributor

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
"""Universal destination using PyAirbyte caches as backends."""

from airbyte.destinations.universal import DestinationPyAirbyteUniversal
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Inconsistent import paths for DestinationPyAirbyteUniversal between __init__.py and run.py

The __init__.py imports DestinationPyAirbyteUniversal from airbyte.destinations.universal, while run.py (the actual entry point) imports it from airbyte.cli.universal_connector. These are two completely different module paths within the airbyte package.

Root Cause and Impact

In __init__.py (line 4):

from airbyte.destinations.universal import DestinationPyAirbyteUniversal

In run.py (line 6):

from airbyte.cli.universal_connector import DestinationPyAirbyteUniversal

At most one of these import paths can be correct. If airbyte.cli.universal_connector is the correct module (as used in the entry point run.py), then importing the package (destination_pyairbyte_universal) will fail with an ImportError because airbyte.destinations.universal doesn't exist (or vice versa).

The convention in other destination connectors (e.g., destination-duckdb) is for run.py to import from the package's own __init__.py rather than directly from the external library. Here, run.py bypasses __init__.py entirely and uses a different import path, so the two files are not even consistent about where the class lives.

Impact: Either importing the package or running the connector entry point will fail with an ImportError at runtime, depending on which path is actually valid in the airbyte library.

Prompt for agents
In file airbyte-integrations/connectors/destination-pyairbyte-universal/destination_pyairbyte_universal/__init__.py line 4 and file airbyte-integrations/connectors/destination-pyairbyte-universal/destination_pyairbyte_universal/run.py line 6: The import paths for DestinationPyAirbyteUniversal are inconsistent. __init__.py uses 'airbyte.destinations.universal' while run.py uses 'airbyte.cli.universal_connector'. Determine which module path is correct in the airbyte (PyAirbyte) package and update both files to use the same correct path. Additionally, following the convention of other destination connectors (like destination-duckdb), run.py should import from the package's own __init__.py (i.e., 'from destination_pyairbyte_universal import DestinationPyAirbyteUniversal') rather than directly from the external library.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 8dc1da3. The import path in __init__.py has been updated from airbyte.destinations.universal to airbyte.cli.universal_connector to match run.py. Both files now use the correct path that matches the actual location in the PyAirbyte package after the directory rename.


Devin session

devin-ai-integration bot and others added 2 commits February 26, 2026 06:39
…te.cli.universal_connector

Co-Authored-By: AJ Steers <aj@airbyte.io>
…-test

Co-Authored-By: AJ Steers <aj@airbyte.io>
Co-Authored-By: AJ Steers <aj@airbyte.io>
@devin-ai-integration devin-ai-integration bot changed the title feat(destination-pyairbyte-universal): add universal destination connector feat(destination-smoke-test): add smoke test destination connector Feb 26, 2026
@github-actions
Copy link
Contributor

destination-smoke-test Connector Test Results

4 tests   0 ✅  4m 21s ⏱️
1 suites  3 💤
1 files    1 ❌

For more details on these failures, see this check.

Results for commit 6ed1c89.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants