Skip to content

fix(registry): Fall back to registry commit timestamp for connector release_date - #1382

Merged
Aaron ("AJ") Steers (aaronsteers) merged 1 commit into
release-candidate/v1from
devin/1792014336-connector-release-date
Oct 16, 2026
Merged

Aaron ("AJ") Steers (aaronsteers) merged 1 commit into
release-candidate/v1from
devin/1792014336-connector-release-date

Conversation

@aaronsteers

Copy link
Copy Markdown
Member

Overview

👉 TL;DR: Connector info often showed no release date even though the registry has one. Release dates now fall back to the date of the commit recorded in the published registry entry.

Specifically, _registry_entry_to_connector_metadata and fetch_registry_version_date now use the new registry_entry_commit_date() helper, which reads generated.git.commit_timestamp.

Changes

  • ConnectorMetadata.release_date = releaseDate, or else the date part of the entry's generated.git.commit_timestamp (example: source-faker 7.2.1 → 2026-07-10). No extra HTTP call.
  • fetch_registry_version_date checks the connector's current version (dockerImageTag == version) before looking in releases.releaseCandidates. It used to check only release candidates.

Test plan

  • New unit tests cover both fallback paths and the null case, using fixture dicts (no network). Lint and the touched tests pass locally.

Link to Devin session: https://app.devin.ai/sessions/a51d808f26c9402fafc93e7640648187
Open in Devin Desktop: https://app.devin.ai/desktop/session/a51d808f26c9402fafc93e7640648187?variant=devin
Requested by: Aaron ("AJ") Steers (@aaronsteers)

Registry entries without a top-level releaseDate left
ConnectorMetadata.release_date null even though the entry's
generated.git.commit_timestamp is present. The entry-to-metadata
conversion now uses the commit timestamp date as a fallback, and
fetch_registry_version_date resolves the connector's current version
from its own entry before checking releaseCandidates.

Co-Authored-By: AJ Steers <[email protected]>
@devin-ai-integration

Copy link
Copy Markdown
Contributor

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@github-actions

Copy link
Copy Markdown

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

💡 Show Tips and Tricks

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/1792014336-connector-release-date' pyairbyte --help

# Install PyAirbyte from this branch for development:
pip install 'git+https://github.com/airbytehq/PyAirbyte.git@devin/1792014336-connector-release-date'

PR Slash Commands

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

  • /fix-pr - Fixes most formatting and linting issues
  • /uv-lock - Updates uv.lock file
  • /test-pr - Runs tests with the updated PyAirbyte
  • /prerelease - Builds and publishes a prerelease version to PyPI
📚 Show Repo Guidance

Helpful Resources

Community Support

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

📝 Edit this welcome message.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

The focused changes match the intended behavior, include relevant unit coverage, and have no identified blocking issues.

0 open findings

What changed in this PR

Adds a registry commit-date fallback so connector metadata can report release dates without extra HTTP requests.

Changes:

  • Preserves explicit releaseDate values, falling back to the commit date.
  • Checks current versions before release candidates during version-date lookup.
  • Adds tests for fallback, precedence, and missing-date behavior.
File Description
tests/​unit_tests/​test_mcp_connector_registry.py Tests metadata and version-date fallback behavior.
airbyte/​registry.py Adds the connector metadata release-date fallback.
airbyte/​_registry_utils.py Extracts commit dates and supports current-version lookup.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@github-code-quality

github-code-quality Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Code coverage overview

Languages: Python

Python / code-coverage/pytest-no-creds

release-candidate/v1 d9f652f devin/1792014336-con... be59994 +/-
65% 79% +14%
View coverage of the 10 most impacted files.
File release-candidate/v1 d9f652f devin/1792014336-con... be59994 +/-
airbyte/mcp/cloud.py 52% 83% +31%
airbyte/_util/api_util.py 36% 68% +32%
airbyte/cloud/connectors.py 34% 75% +41%
airbyte/mcp/_datadog.py 0% 50% +50%
airbyte/mcp/_user_identity.py 0% 93% +93%
airbyte/_direct...ctors/models.py 0% 94% +94%
airbyte/mcp/_telemetry.py 0% 94% +94%
airbyte/mcp/_sso_auth.py 0% 96% +96%
airbyte/cloud/models.py 0% 97% +97%
airbyte/mcp/int...nc_status_ui.py 0% 97% +97%

Python / code-coverage/pytest

release-candidate/v1 d9f652f devin/1792014336-con... be59994 +/-
71% 82% +11%
View coverage of the 10 most impacted files.
File release-candidate/v1 d9f652f devin/1792014336-con... be59994 +/-
airbyte/cloud/connectors.py 51% 80% +29%
airbyte/mcp/cloud.py 52% 83% +31%
airbyte/mcp/_datadog.py 0% 50% +50%
airbyte/mcp/int..._registry_ui.py 0% 92% +92%
airbyte/mcp/_user_identity.py 0% 93% +93%
airbyte/_direct...ctors/models.py 0% 94% +94%
airbyte/mcp/_telemetry.py 0% 94% +94%
airbyte/mcp/_sso_auth.py 0% 96% +96%
airbyte/cloud/models.py 0% 97% +97%
airbyte/mcp/int...nc_status_ui.py 0% 97% +97%

Python / code-coverage/pytest-unit

release-candidate/v1 devin/1792014336-con... be59994 +/-
— 76% —

Line coverage data for the release-candidate/v1 branch is not yet available.

View coverage of the 10 most covered files.
File release-candidate/v1 devin/1792014336-con... be59994 +/-
airbyte/cloud/models.py — 97% —
airbyte/mcp/_sso_auth.py — 96% —
airbyte/_direct...ctors/models.py — 94% —
airbyte/cloud/client.py — 90% —
airbyte/exceptions.py — 89% —
airbyte/mcp/cloud.py — 83% —
airbyte/progress.py — 80% —
airbyte/cloud/connectors.py — 75% —
airbyte/_util/api_util.py — 68% —
airbyte/shared/...ql_processor.py — 68% —

ℹ️ Calculations represent line coverage. Results may change as calculations are updated.


Updated October 14, 2026 22:08 UTC

@aaronsteers
Aaron ("AJ") Steers (aaronsteers) marked this pull request as ready for review October 16, 2026 01:23
@aaronsteers
Aaron ("AJ") Steers (aaronsteers) merged commit 1981bc2 into release-candidate/v1 Oct 16, 2026
33 of 34 checks passed
@aaronsteers
Aaron ("AJ") Steers (aaronsteers) deleted the devin/1792014336-connector-release-date branch October 16, 2026 01:24

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 2 potential issues.

Devin Review


def registry_entry_commit_date(entry: dict) -> str | None:
"""Return the YYYY-MM-DD date of a registry entry's git commit timestamp."""
commit_timestamp = entry.get("generated", {}).get("git", {}).get("commit_timestamp")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔴 Null metadata blocks the connector catalog

When releaseDate is absent and generated or generated.git is null, registry_entry_commit_date raises instead of returning no date. One such entry aborts the entire registry load.

Learn more

The registry cache converts every connector entry with _registry_entry_to_connector_metadata. That conversion now calls this helper whenever releaseDate is absent. A JSON null for generated or generated.git bypasses the empty-dict default and raises before the cache is assigned in _get_registry_cache. An optional date field then makes all connector lookups fail.

Example: A local registry contains one connector with "generated": null and no releaseDate. Loading any connector from that registry fails instead of returning metadata with release_date=None.

Recommended fix: Treat null generated and git sections as missing before reading commit_timestamp; retain None as the fallback when no usable timestamp exists.

Suggested change
commit_timestamp = entry.get("generated", {}).get("git", {}).get("commit_timestamp")
commit_timestamp = (entry.get("generated") or {}).get("git") or {}
commit_timestamp = commit_timestamp.get("commit_timestamp")

Devin Review


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Confirmed. If an entry has "generated": null or "git": null and no releaseDate, .get(..., {}) returns None and the next .get raises AttributeError. Because that happens inside _get_registry_cache, one bad entry breaks every connector lookup. The fix is (entry.get("generated") or {}).get("git") or {}, plus a test with a null entry. This PR is already merged, so I've asked AJ about a follow-up PR.

Comment on lines +112 to +115
if connector.get("dockerImageTag") == version:
current_version_date = registry_entry_commit_date(connector)
if current_version_date:
return current_version_date

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Explicit current-version release dates are overridden

When releaseDate differs from the current version's commit date, fetch_registry_version_date returns the commit date instead. get_connector_version_history then replaces the changelog date with that value.

Learn more

The connector metadata path already prefers releaseDate over the generated timestamp in _registry_entry_to_connector_metadata. The version-history path instead uses the generated timestamp for the current tag and overwrites the changelog date in get_connector_version_history. The two public results therefore disagree for the same current version whenever those dates differ.

Example: An entry has dockerImageTag="7.2.1", releaseDate="2026-07-12", and generated.git.commit_timestamp="2026-07-10T14:26:59Z". Metadata reports July 12, but version history reports July 10.

Recommended fix: Prefer the entry's nonempty releaseDate before falling back to registry_entry_commit_date for the current version, matching metadata conversion.

Suggested change
if connector.get("dockerImageTag") == version:
current_version_date = registry_entry_commit_date(connector)
if current_version_date:
return current_version_date
if connector.get("dockerImageTag") == version:
current_version_date = connector.get("releaseDate") or registry_entry_commit_date(
connector
)
if current_version_date:
return current_version_date

Devin Review


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Confirmed. For the current version, fetch_registry_version_date uses the commit timestamp even when the entry has an explicit releaseDate, while the metadata path prefers releaseDate, so the two disagree when those dates differ. The fix is to use connector.get("releaseDate") or registry_entry_commit_date(connector) there too, plus a test. This PR is already merged, so it would go in the same follow-up as the null-generated fix, pending AJ's OK.

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.

2 participants