Skip to content

feat: Add capability to set testing values on custom connector projects in Builder UI#896

Merged
Aaron ("AJ") Steers (aaronsteers) merged 5 commits intomainfrom
devin/1765135139-add-testing-values-to-builder
Dec 9, 2025
Merged

feat: Add capability to set testing values on custom connector projects in Builder UI#896
Aaron ("AJ") Steers (aaronsteers) merged 5 commits intomainfrom
devin/1765135139-add-testing-values-to-builder

Conversation

@aaronsteers
Copy link
Member

@aaronsteers Aaron ("AJ") Steers (aaronsteers) commented Dec 7, 2025

feat: Add capability to set testing values on custom connector projects

Summary

This PR adds the ability to set input values (testing values) when deploying custom YAML source definitions to the Connector Builder UI. This addresses the friction described in #895 where users couldn't immediately run test read operations after deploying a custom source to Builder.

Changes:

  • Added update_connector_builder_project_testing_values() API function in api_util.py that calls the Config API endpoint /v1/connector_builder_projects/update_testing_values
  • Added set_testing_values() method to CustomCloudSourceDefinition for setting testing values on an existing definition
  • Added optional testing_values parameter to CloudWorkspace.publish_custom_source_definition() for one-shot publish + configure

Updates since last revision:

  • Added MCP tool support with testing_values and testing_values_secret_name parameters to both publish_custom_source_definition and update_custom_source_definition tools
  • Made manifest_yaml optional in update_custom_source_definition MCP tool (can now update just testing values)
  • Added guard statement requiring at least one of manifest_yaml, testing_values, or testing_values_secret_name
  • Integrated resolve_config() for secret handling, following existing PyAirbyte MCP conventions (agents can reference secrets without passing raw values)
  • Updated docstrings to clarify that testing values replace the entire object (not merge)
  • Fixed spec construction to include all three fields matching the Builder UI pattern: documentationUrl, connectionSpecification, and advancedAuth
  • Fixed fallback logic for missing connection_specification (now defaults to {} instead of the entire manifest spec)
  • Fixed FastMCP optional parameter handling by removing redundant = None from MCP tool parameters (was causing validation errors treating optional params as required)

Review & Testing Checklist for Human

  • Test end-to-end flow: Publish a custom YAML source with testing_values parameter and verify the values appear in the Connector Builder UI and allow immediate test reads. This is the most important validation since the spec construction was derived from code analysis, not live testing.
  • Test updating testing values without manifest: Call update_custom_source_definition MCP tool with just testing_values (no manifest_yaml) to verify the code correctly fetches the manifest from the server to derive the spec.
  • Test secret resolution: Verify that testing_values_secret_name correctly resolves secrets via resolve_config() when used in MCP tools.

Recommended test plan:

workspace = CloudWorkspace(workspace_id="...", client_id="...", client_secret="...")
custom_def = workspace.publish_custom_source_definition(
    name="test-source-delete-me",
    manifest_yaml=my_manifest,
    testing_values={"api_key": "test123", "start_date": "2024-01-01"},
)
# Navigate to Builder UI and verify testing values are populated

# Test updating just testing values via MCP tool (no manifest change)
# update_custom_source_definition(definition_id=..., testing_values={"api_key": "new_value"})

Notes

Closes #895

Link to Devin run: https://app.devin.ai/sessions/da20573387b04e8b84371218ef63bf1a
Requested by: AJ Steers (Aaron ("AJ") Steers (@aaronsteers))

Summary by CodeRabbit

  • New Features
    • Set and update testing values for connector builder projects via cloud APIs.
    • Publish and update flows for cloud custom sources accept testing values (inline or via secret name).
    • Cloud custom source objects expose a chainable method to attach testing values after creation (YAML-based sources supported).

✏️ Tip: You can customize this high-level summary in your review settings.

Important

Auto-merge enabled.

This PR is set to merge automatically when all requirements are met.

Note

Auto-merge may have been disabled. Please check the PR status to confirm.

…ts in Builder UI

This adds the ability to set input values (testing values) when deploying
custom YAML source definitions to the Connector Builder UI. This reduces
friction by allowing users to immediately run test read operations after
deploying a custom source.

Changes:
- Add update_connector_builder_project_testing_values() in api_util.py
- Add set_testing_values() method to CustomCloudSourceDefinition
- Add testing_values parameter to publish_custom_source_definition()

Closes #895

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

Original prompt from AJ Steers
Received message in Slack channel #ask-devin-ai:

@Devin - Can you help with this? <https://github.com/airbytehq/PyAirbyte/issues/895>
Thread URL: https://airbytehq-team.slack.com/archives/C08BHPUMEPJ/p1765134684132489

@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

github-actions bot commented Dec 7, 2025

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

Testing This PyAirbyte Version

You can test this version of PyAirbyte using the following:

# Run PyAirbyte CLI from this branch:
uvx --from 'git+https://github.com/airbytehq/PyAirbyte.git@devin/1765135139-add-testing-values-to-builder' pyairbyte --help

# Install PyAirbyte from this branch for development:
pip install 'git+https://github.com/airbytehq/PyAirbyte.git@devin/1765135139-add-testing-values-to-builder'

Helpful Resources

PR Slash Commands

Airbyte Maintainers can execute the following slash commands on your PR:

  • /fix-pr - Fixes most formatting and linting issues
  • /poetry-lock - Updates poetry.lock file
  • /test-pr - Runs tests with the updated PyAirbyte

Community Support

Questions? Join the #pyairbyte channel in our Slack workspace.

📝 Edit this welcome message.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 7, 2025

📝 Walkthrough

Walkthrough

Adds support for persisting testing values for connector builder projects: new API helper, a setter on CustomCloudSourceDefinition, propagation of optional testing_values through CloudWorkspace and MCP publish/update flows, and Config API calls to store the testing-values blob.

Changes

Cohort / File(s) Summary
API Utility Enhancement
airbyte/_util/api_util.py
Added update_connector_builder_project_testing_values() → calls Config API /connector_builder_projects/update_testing_values with workspaceId, builderProjectId, testingValues, and spec, returns response as dict.
CustomCloudSourceDefinition Enhancement
airbyte/cloud/connectors.py
Added set_testing_values(self, testing_values: dict[str, Any]) -> CustomCloudSourceDefinition. Supports only YAML-based custom sources (Docker raises NotImplementedError), requires builder_project_id (raises PyAirbyteInputError if missing), lazily loads manifest/spec, derives spec from manifest when present, calls API util to persist testing values, and returns self.
Cloud Workspace Publish API
airbyte/cloud/workspaces.py
Extended publish_custom_source_definition(...) signature to accept optional testing_values. For YAML publishes, constructs CustomCloudSourceDefinition then conditionally calls set_testing_values(testing_values) before returning the definition.
MCP Publish / Update Flows
airbyte/mcp/cloud_ops.py
Added keyword-only params testing_values and testing_values_secret_name to publish_custom_source_definition and update_custom_source_definition. Resolves inline or secret testing values, allows manifest_yaml to be None for update-only testing-value changes, enforces at least one of manifest_yaml, testing_values, or testing_values_secret_name on update, and applies testing values via set_testing_values() when appropriate.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Client as Client (SDK/CLI)
  participant Workspace as CloudWorkspace / MCP
  participant Definition as CustomCloudSourceDefinition
  participant APIUtil as api_util
  participant Config as Config API

  Client->>Workspace: publish_custom_source_definition(..., testing_values?)
  Workspace->>Definition: construct from API response (YAML path)
  alt testing_values provided
    Definition->>Definition: ensure manifest/spec present (lazy load)
    Definition->>APIUtil: update_connector_builder_project_testing_values(workspaceId, builderProjectId, testingValues, spec)
    APIUtil->>Config: POST /connector_builder_projects/update_testing_values {workspaceId, builderProjectId, testingValues, spec}
    Config-->>APIUtil: 200 OK / response
    APIUtil-->>Definition: response dict
  end
  Workspace-->>Client: return CustomCloudSourceDefinition
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Please verify spec extraction/mapping from manifest to connectionSpecification in set_testing_values() — are edge cases (missing or differently shaped manifest spec) handled correctly, wdyt?
  • Confirm error handling: NotImplementedError for non-YAML definitions and PyAirbyteInputError when builder_project_id is missing.
  • Check MCP parameter resolution (inline vs secret) and the validation that update requires at least one of manifest_yaml, testing_values, or testing_values_secret_name, wdyt?

Pre-merge checks and finishing touches

✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main feature: adding the capability to set testing values on custom connector projects in the Builder UI.
Linked Issues check ✅ Passed The PR comprehensively addresses issue #895 by implementing testing values support across API utilities, cloud connectors, workspaces, and MCP tools, enabling users to set input values at deploy time or via follow-up updates.
Out of Scope Changes check ✅ Passed All changes are directly scoped to implementing testing values support: API helper, CustomCloudSourceDefinition method, CloudWorkspace parameter, and MCP tool updates. No unrelated modifications detected.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch devin/1765135139-add-testing-values-to-builder

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 69f6c96 and b5f3cd2.

📒 Files selected for processing (3)
  • airbyte/_util/api_util.py (1 hunks)
  • airbyte/cloud/connectors.py (1 hunks)
  • airbyte/cloud/workspaces.py (3 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
airbyte/cloud/connectors.py (2)
airbyte/exceptions.py (1)
  • PyAirbyteInputError (201-210)
airbyte/_util/api_util.py (1)
  • update_connector_builder_project_testing_values (1567-1605)
airbyte/cloud/workspaces.py (1)
airbyte/cloud/connectors.py (3)
  • CustomCloudSourceDefinition (343-756)
  • _from_yaml_response (628-640)
  • set_testing_values (694-756)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: Pytest (All, Python 3.11, Ubuntu)
  • GitHub Check: Pytest (All, Python 3.11, Windows)
  • GitHub Check: Pytest (All, Python 3.10, Ubuntu)
  • GitHub Check: Pytest (All, Python 3.10, Windows)
  • GitHub Check: Pytest (Fast)
  • GitHub Check: Pytest (No Creds)
🔇 Additional comments (9)
airbyte/cloud/workspaces.py (3)

509-509: LGTM!

The optional testing_values parameter is well-placed and properly typed, enabling the one-shot publish + configure workflow described in the PR objectives.


523-525: LGTM!

Clear documentation that explains the purpose and benefit of the testing_values parameter.


590-598: LGTM!

The implementation correctly constructs the CustomCloudSourceDefinition from the API response and conditionally applies testing values when provided. The method chaining pattern is clean and appropriate.

airbyte/cloud/connectors.py (5)

694-714: LGTM!

The method signature is clean, and the docstring provides comprehensive documentation about the purpose, parameters, return value, and exceptions.


715-719: LGTM!

The guard clause correctly restricts this functionality to YAML definitions with a clear error message.


721-729: LGTM!

The validation for builder_project_id is appropriate with a clear error message and helpful context for debugging.


746-754: LGTM!

The API call correctly passes all required parameters to the utility function with appropriate values from the workspace and method context.


756-756: LGTM!

Returning self enables method chaining, which is consistent with other methods in this class.

airbyte/_util/api_util.py (1)

1567-1606: Confirm the API payload format is accepted by the deprecated Config API endpoint.

The spec construction in connectors.py (lines 735–750) can result in an empty dict when the manifest lacks a spec section. The /connector_builder_projects/update_testing_values endpoint is part of the deprecated Config API with no published documentation. Consider verifying that the payload structure—particularly with an empty spec field—is accepted by the actual API, or document why this is acceptable for the deprecated endpoint.

@github-actions
Copy link

github-actions bot commented Dec 7, 2025

PyTest Results (Fast Tests Only, No Creds)

348 tests  ±0   348 ✅ ±0   6m 19s ⏱️ +22s
  1 suites ±0     0 💤 ±0 
  1 files   ±0     0 ❌ ±0 

Results for commit b13baa4. ± Comparison against base commit 69f6c96.

♻️ This comment has been updated with latest results.

@github-actions
Copy link

github-actions bot commented Dec 7, 2025

PyTest Results (Full)

416 tests  ±0   399 ✅  - 1   23m 51s ⏱️ - 2m 28s
  1 suites ±0    16 💤 ±0 
  1 files   ±0     1 ❌ +1 

For more details on these failures, see this check.

Results for commit b13baa4. ± Comparison against base commit 69f6c96.

♻️ This comment has been updated with latest results.

- Add testing_values and testing_values_secret_name parameters to publish_custom_source_definition MCP tool
- Add testing_values and testing_values_secret_name parameters to update_custom_source_definition MCP tool
- Make manifest_yaml optional in update_custom_source_definition (can now update just testing values)
- Add guard statement to ensure at least one of manifest_yaml, testing_values, or testing_values_secret_name is provided
- Use resolve_config() to handle secret resolution following existing PyAirbyte MCP conventions
- Update docstrings to clarify that testing values replace the entire object (not merge)

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

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (1)
airbyte/cloud/connectors.py (1)

738-747: The fallback when connection_specification is missing could include unwanted keys - would an empty dict be safer here?

If manifest_spec doesn't contain the connection_specification key, the current fallback uses the entire manifest_spec object as the value for connectionSpecification. This could leak extra keys like documentationUrl into the spec payload.

Would it make sense to use {} as the fallback instead, or raise an explicit error if the key is expected but missing? Something like:

 spec = {
     "connectionSpecification": manifest_spec.get(
-        "connection_specification", manifest_spec
+        "connection_specification", {}
     ),
 }

What do you think?

🧹 Nitpick comments (1)
airbyte/mcp/cloud_ops.py (1)

1531-1556: Minor edge case: what happens if testing_values_secret_name is provided but resolves to an empty dict?

The validation at line 1531 checks if the parameter is provided (not None), but after resolution, testing_values_dict could still be None (line 1555-1556 with or None).

If someone provides only testing_values_secret_name="some_secret" and that secret resolves to {}:

  1. Validation passes (parameter was provided)
  2. testing_values_dict becomes None
  3. Neither manifest nor testing values are updated
  4. Success message is returned

This might be rare in practice, but could be confusing. Would it be worth adding a secondary check after resolution to warn or error if nothing will actually be updated? Something like:

if processed_manifest is None and testing_values_dict is None:
    raise PyAirbyteInputError(
        message="No changes to apply: manifest_yaml was not provided and testing_values resolved to empty.",
        ...
    )

Totally optional - just flagging for awareness, wdyt?

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b5f3cd2 and 92c6372.

📒 Files selected for processing (4)
  • airbyte/_util/api_util.py (1 hunks)
  • airbyte/cloud/connectors.py (1 hunks)
  • airbyte/cloud/workspaces.py (3 hunks)
  • airbyte/mcp/cloud_ops.py (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • airbyte/cloud/workspaces.py
  • airbyte/_util/api_util.py
🧰 Additional context used
🧬 Code graph analysis (1)
airbyte/mcp/cloud_ops.py (4)
airbyte/mcp/_util.py (1)
  • resolve_config (129-226)
airbyte/cloud/workspaces.py (3)
  • CloudWorkspace (64-664)
  • publish_custom_source_definition (500-604)
  • get_custom_source_definition (636-664)
airbyte/cloud/connectors.py (5)
  • name (113-121)
  • name (387-391)
  • CustomCloudSourceDefinition (343-759)
  • update_definition (521-588)
  • set_testing_values (694-759)
airbyte/exceptions.py (1)
  • PyAirbyteInputError (201-210)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: Pytest (All, Python 3.11, Windows)
  • GitHub Check: Pytest (All, Python 3.11, Ubuntu)
  • GitHub Check: Pytest (All, Python 3.10, Windows)
  • GitHub Check: Pytest (All, Python 3.10, Ubuntu)
  • GitHub Check: Pytest (No Creds)
  • GitHub Check: Pytest (Fast)
🔇 Additional comments (5)
airbyte/cloud/connectors.py (1)

694-759: Nice addition - the method structure and error handling look good to me!

The implementation follows the existing class patterns well:

  • Proper YAML-only guard with clear error message
  • Good contextual information in the PyAirbyteInputError
  • Lazy loading of definition info
  • Return self for chaining

One small observation: the spec construction at lines 739-747 only populates connectionSpecification when manifest_spec is truthy. If the manifest has no spec section at all, an empty spec={} is passed to the API. Is that the intended behavior, or should it raise an error in that case? Just want to confirm this is expected, wdyt?

airbyte/mcp/cloud_ops.py (4)

1359-1383: Clear documentation on the new parameters!

The descriptions nicely explain that testing values are replaced entirely (not merged), and that secret values take precedence. This should help users understand the behavior. Looks good to me!


1394-1411: LGTM!

The resolution pattern and conditional check are clean. The or None ensures that an empty resolved dict doesn't trigger an unnecessary API call. Good approach!


1470-1479: Nice flexibility - making manifest_yaml optional is a good UX improvement!

This allows users to update just testing values without having to re-provide the manifest. The updated description clearly explains this. 👍


1562-1578: Clean conditional logic!

The flow handles both scenarios well:

  • Manifest update only → new object from update_definition
  • Testing values only → original definition object
  • Both → testing values applied to the new object

The method chaining with set_testing_values returning self works nicely here.

Explicitly document that testing_values supports inline secret refs
via 'secret_reference::ENV_VAR_NAME' syntax in both MCP tools.

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

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
airbyte/mcp/cloud_ops.py (2)

1560-1573: Consider noting potential partial failure scenario in docstring?

The manifest and testing values are updated via separate API calls. If the manifest update succeeds but set_testing_values fails, the user ends up with a partially updated state. Since these are independent operations, this is probably acceptable behavior—but would it be helpful to mention this in the docstring so callers know these aren't applied atomically, wdyt?

Otherwise, the logic looks correct—custom_source is properly reassigned after the manifest update so set_testing_values operates on the latest definition.


1549-1558: Optional: Consider extracting duplicated testing values resolution

This resolution block is identical to lines 1395-1404 in publish_custom_source_definition. If you anticipate adding this pattern to more functions, you could extract a small helper like _resolve_testing_values(testing_values, testing_values_secret_name). Just a thought for future maintainability—totally fine to leave as-is for now, wdyt?

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 92c6372 and aa3bd65.

📒 Files selected for processing (1)
  • airbyte/mcp/cloud_ops.py (4 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
airbyte/mcp/cloud_ops.py (2)
airbyte/mcp/_util.py (1)
  • resolve_config (129-226)
airbyte/exceptions.py (1)
  • PyAirbyteInputError (201-210)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: Pytest (All, Python 3.11, Windows)
  • GitHub Check: Pytest (All, Python 3.11, Ubuntu)
  • GitHub Check: Pytest (All, Python 3.10, Ubuntu)
  • GitHub Check: Pytest (All, Python 3.10, Windows)
  • GitHub Check: Pytest (Fast)
  • GitHub Check: Pytest (No Creds)
🔇 Additional comments (4)
airbyte/mcp/cloud_ops.py (4)

1359-1384: LGTM on the new parameter declarations!

The new testing_values and testing_values_secret_name parameters are well-typed and documented, following the established pattern of config/config_secret_name pairs used elsewhere in this file. The description clearly communicates that values replace (not merge) existing testing values.


1395-1404: Minor edge case: empty dict becomes None

The or None pattern means if a user passes testing_values={}, it becomes None and won't actually clear existing testing values. Is this the intended behavior? If users should be able to explicitly clear testing values by passing an empty dict, you might want to differentiate between "not provided" (None) and "explicitly empty" ({}), wdyt?

That said, for a publish operation this is likely fine since there are no pre-existing values to clear.


1471-1480: Nice flexibility improvement!

Making manifest_yaml optional is a good UX enhancement—users can now update testing values without having to re-provide the manifest. The guard at line 1533 ensures at least one meaningful parameter is provided.


1530-1543: Good defensive validation!

The guard clause clearly prevents no-op update calls, and the error message with context (definition_id, workspace_id) will help users understand what went wrong. Well done!

@aaronsteers
Copy link
Member Author

Devin, check the deptry issue or any other ci issues.

@aaronsteers
Copy link
Member Author

Oh. Looks like that job just needs a retry

@devin-ai-integration
Copy link
Contributor

Confirmed - the Deptry failure was a transient TLS connection error in GitHub Actions infrastructure ("Client network socket disconnected before secure TLS connection was established"). All other CI checks passed (19/20). A retry should resolve it.

…r UI pattern

Co-Authored-By: AJ Steers <aj@airbyte.io>
FastMCP was treating optional parameters as required when they had both
Field(default=None) and = None at the end. Matching the pattern used by
other optional parameters in the file (only Field(default=None)) fixes
the issue.

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

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
airbyte/mcp/cloud_ops.py (1)

1395-1405: Explicit empty testing_values ({}) are treated as “no update” — intentional?

In both publish_custom_source_definition (Lines 1395–1405) and update_custom_source_definition (Lines 1549–1558, 1572–1573), testing_values_dict is computed as:

testing_values_dict = (
    resolve_config(
        config=testing_values,
        config_secret_name=testing_values_secret_name,
    )
    or None
)

Because of the or None, an explicit empty object (e.g., testing_values={} or testing_values="{}") becomes None, so set_testing_values is never called. That means there’s currently no way from the MCP side to intentionally “clear” previously‑stored testing values by setting them to {}; the call becomes a no‑op even though the docstrings say the entire testing values object is replaced by what’s provided.

Would it be worth treating {} as a valid, explicit update so that callers can clear testing values, by dropping the or None and letting {} flow through? For example:

-    testing_values_dict = (
-        resolve_config(
-            config=testing_values,
-            config_secret_name=testing_values_secret_name,
-        )
-        or None
-    )
+    testing_values_dict = resolve_config(
+        config=testing_values,
+        config_secret_name=testing_values_secret_name,
+    )

(Apply in both functions; the existing if testing_values is not None or testing_values_secret_name is not None: guard already prevents accidental calls when nothing was supplied.) This would align behavior more closely with the “entire testing values object is overwritten” wording and still keep the API straightforward — wdyt?

Also applies to: 1549-1558, 1572-1573

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8ec69f7 and b13baa4.

📒 Files selected for processing (1)
  • airbyte/mcp/cloud_ops.py (4 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
airbyte/mcp/cloud_ops.py (3)
airbyte/mcp/_util.py (1)
  • resolve_config (129-226)
airbyte/cloud/connectors.py (4)
  • name (113-121)
  • name (387-391)
  • CustomCloudSourceDefinition (343-759)
  • set_testing_values (694-759)
airbyte/exceptions.py (1)
  • PyAirbyteInputError (201-210)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: Pytest (All, Python 3.11, Windows)
  • GitHub Check: Pytest (All, Python 3.11, Ubuntu)
  • GitHub Check: Pytest (All, Python 3.10, Windows)
  • GitHub Check: Pytest (All, Python 3.10, Ubuntu)
  • GitHub Check: Pytest (Fast)
  • GitHub Check: Pytest (No Creds)
🔇 Additional comments (1)
airbyte/mcp/cloud_ops.py (1)

1359-1384: Testing values parameters and wiring look consistent and well‑documented

The addition of testing_values / testing_values_secret_name (Lines 1359–1384) and the resolution via resolve_config into testing_values_dict passed through to CloudWorkspace.publish_custom_source_definition (Line 1412) matches the patterns used elsewhere for config + secret handling and lines up with CustomCloudSourceDefinition.set_testing_values semantics in airbyte/cloud/connectors.py (full replacement, not merge). I don’t see any functional issues here and the docstrings clearly state the overwrite behavior and secret‑ref usage.

Also applies to: 1395-1413

@aaronsteers Aaron ("AJ") Steers (aaronsteers) merged commit ff0f427 into main Dec 9, 2025
22 of 24 checks passed
@aaronsteers Aaron ("AJ") Steers (aaronsteers) deleted the devin/1765135139-add-testing-values-to-builder branch December 9, 2025 02:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feat: Add capability to set input values on a custom connector project in Builder UI

1 participant