Skip to content

Commit 4ee4621

Browse files
committed
Drop the toolset half of the registry External Services card
The provider.yaml schema does not allow `external-services` on a toolset, so `toolset_services` was empty for every provider. - Remove `toolset_services` from the extractors, the contract models, and the version page template - Show connection types only, so the "Source type" column is dropped
1 parent 007d384 commit 4ee4621

8 files changed

Lines changed: 1 addition & 145 deletions

‎dev/registry/extract_metadata.py‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,6 @@ class Provider:
373373
default_factory=list
374374
) # {conn_type, hook_class, docs_url, external_services}
375375
uri_schemes: list[dict] = field(default_factory=list) # {scheme, filesystem?, asset?, remote_logging?}
376-
toolset_services: list[dict] = field(default_factory=list) # {module, services}
377376
requires_python: str = "" # e.g., ">=3.11"
378377
dependencies: list[str] = field(default_factory=list) # from pyproject.toml
379378
optional_extras: dict[str, list[str]] = field(default_factory=dict) # {extra_name: [deps]}
@@ -805,15 +804,6 @@ def main():
805804
}
806805
)
807806

808-
toolset_services = [
809-
{
810-
"module": entry.get("module", ""),
811-
"services": entry.get("services", []),
812-
}
813-
for toolset in provider_yaml.get("toolsets", [])
814-
for entry in toolset.get("external-services", [])
815-
]
816-
817807
# Pre-fetched in parallel before this loop; missing entries fall back
818808
# to zero-value defaults so a never-published provider doesn't crash.
819809
pypi_downloads, pypi_dates = pypi_data.get(
@@ -843,7 +833,6 @@ def main():
843833
categories=[asdict(c) for c in categories],
844834
connection_types=connection_types,
845835
uri_schemes=collect_uri_schemes(provider_yaml, module_source_reader(provider_path)),
846-
toolset_services=toolset_services,
847836
requires_python=pyproject_data["requires_python"],
848837
dependencies=pyproject_data["dependencies"],
849838
optional_extras=pyproject_data.get("optional_extras", {}),

‎dev/registry/extract_versions.py‎

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -539,14 +539,6 @@ def extract_version_data(
539539
uri_schemes = collect_uri_schemes(
540540
provider_yaml, lambda module_path: git_show(tag, get_source_file_path(layout, dir_path, module_path))
541541
)
542-
toolset_services = [
543-
{
544-
"module": entry.get("module", ""),
545-
"services": entry.get("services", []),
546-
}
547-
for toolset in provider_yaml.get("toolsets", [])
548-
for entry in toolset.get("external-services", [])
549-
]
550542

551543
# Extract modules from source files
552544
modules = extract_modules_from_yaml(provider_yaml, tag, layout, dir_path, provider_id, version)
@@ -562,7 +554,6 @@ def extract_version_data(
562554
"optional_extras": pyproject_data["optional_extras"],
563555
"connection_types": connection_types,
564556
"uri_schemes": uri_schemes,
565-
"toolset_services": toolset_services,
566557
"module_counts": module_counts,
567558
"modules": modules,
568559
}

‎dev/registry/registry_contract_models.py‎

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,6 @@ class UriSchemeContract(BaseModel):
8787
)
8888

8989

90-
class ToolsetServicesContract(BaseModel):
91-
model_config = ConfigDict(extra="forbid")
92-
93-
module: str
94-
services: list[str] = Field(default_factory=list)
95-
96-
9790
class ProviderContract(BaseModel):
9891
"""Top-level provider entry in providers.json."""
9992

@@ -113,7 +106,6 @@ class ProviderContract(BaseModel):
113106
categories: list[CategoryContract] = Field(default_factory=list)
114107
connection_types: list[ConnectionTypeContract] = Field(default_factory=list)
115108
uri_schemes: list[UriSchemeContract] = Field(default_factory=list)
116-
toolset_services: list[ToolsetServicesContract] = Field(default_factory=list)
117109
requires_python: str = ""
118110
dependencies: list[str] = Field(default_factory=list)
119111
optional_extras: dict[str, list[str]] = Field(default_factory=dict)
@@ -258,7 +250,6 @@ class ProviderVersionMetadataContract(BaseModel):
258250
optional_extras: dict[str, list[str]]
259251
connection_types: list[ConnectionTypeContract]
260252
uri_schemes: list[UriSchemeContract] = Field(default_factory=list)
261-
toolset_services: list[ToolsetServicesContract] = Field(default_factory=list)
262253
module_counts: dict[str, int]
263254
modules: list[ModuleContract]
264255

‎dev/registry/tests/test_extract_metadata.py‎

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -904,56 +904,6 @@ def test_external_services_propagates_to_providers_json(self, tmp_path):
904904

905905
assert provider["connection_types"][0]["external_services"] == ["openai", "anthropic"]
906906

907-
@patch("extract_metadata.fetch_provider_inventory", autospec=True, return_value=None)
908-
@patch("extract_metadata.fetch_pypi_data_parallel", autospec=True, return_value={})
909-
@patch("extract_metadata.load_release_tags", autospec=True, return_value=set())
910-
def test_toolset_external_services_propagates_to_providers_json(
911-
self, _load_release_tags, _fetch_pypi_data_parallel, _fetch_provider_inventory, tmp_path
912-
):
913-
"""Same drift-guard as above (`ToolsetServicesContract`, extra="forbid"), for the
914-
`toolsets.external-services` sub-key added alongside `python-modules`.
915-
"""
916-
providers_dir = tmp_path / "providers"
917-
provider_dir = providers_dir / "testprov"
918-
provider_dir.mkdir(parents=True)
919-
(provider_dir / "provider.yaml").write_text(
920-
textwrap.dedent("""\
921-
name: Test Provider
922-
description: A test provider.
923-
versions:
924-
- 1.0.0
925-
toolsets:
926-
- integration-name: Test Provider
927-
python-modules:
928-
- airflow.providers.test.toolsets.hook
929-
external-services:
930-
- module: airflow.providers.test.toolsets.hook
931-
services:
932-
- Any Airflow connection, through its provider hook
933-
""")
934-
)
935-
output_dir = tmp_path / "output"
936-
script_dir = tmp_path / "script"
937-
output_dir.mkdir()
938-
script_dir.mkdir()
939-
940-
with (
941-
patch("extract_metadata.PROVIDERS_DIR", providers_dir),
942-
patch("extract_metadata.OUTPUT_DIR", output_dir),
943-
patch("extract_metadata.SCRIPT_DIR", script_dir),
944-
patch.object(sys, "argv", ["extract_metadata.py"]),
945-
):
946-
main()
947-
948-
written = json.loads((output_dir / "providers.json").read_text())
949-
provider = next(p for p in written["providers"] if p["id"] == "testprov")
950-
assert provider["toolset_services"] == [
951-
{
952-
"module": "airflow.providers.test.toolsets.hook",
953-
"services": ["Any Airflow connection, through its provider hook"],
954-
}
955-
]
956-
957907

958908
class TestMainUriSchemes:
959909
"""main() must read filesystem schemes from the provider's src/ tree, skip a

‎dev/registry/tests/test_extract_versions.py‎

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -457,45 +457,3 @@ def test_all_missing_returns_empty_dict(self):
457457
result = git_cat_file_batch(tag, paths)
458458

459459
assert result == {}
460-
461-
462-
class TestExtractVersionDataToolsetServices:
463-
"""Same drift-guard as `TestExtractVersionDataConnectionTypes`, for
464-
`toolsets.external-services` -- this is the touchpoint memory
465-
`reference_registry_connection_field_touchpoints` names as most-missed: skip it and the
466-
toolsets table silently disappears once a version is no longer `pv.isLatest`.
467-
"""
468-
469-
PROVIDER_YAML = textwrap.dedent("""\
470-
name: Test Provider
471-
toolsets:
472-
- integration-name: Test Provider
473-
python-modules:
474-
- airflow.providers.test.toolsets.hook
475-
external-services:
476-
- module: airflow.providers.test.toolsets.hook
477-
services:
478-
- Any Airflow connection, through its provider hook
479-
""")
480-
481-
@patch("extract_versions.extract_modules_from_yaml", autospec=True, return_value=[])
482-
@patch("extract_versions.fetch_provider_inventory", autospec=True, return_value=None)
483-
@patch("extract_versions.git_show", autospec=True)
484-
@patch("extract_versions.detect_layout", autospec=True, return_value="new")
485-
@patch("extract_versions.git_tag_exists", autospec=True, return_value=True)
486-
def test_toolset_external_services_propagates_to_version_metadata(
487-
self, _tag_exists, _layout, mock_git_show, _inventory, _modules
488-
):
489-
mock_git_show.side_effect = lambda tag, path: (
490-
self.PROVIDER_YAML if path.endswith("provider.yaml") else None
491-
)
492-
493-
result = extract_version_data("test", "1.0.0", "test")
494-
495-
assert result is not None
496-
assert result["toolset_services"] == [
497-
{
498-
"module": "airflow.providers.test.toolsets.hook",
499-
"services": ["Any Airflow connection, through its provider hook"],
500-
}
501-
]

‎dev/registry/tests/test_registry_contract_models.py‎

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from registry_contract_models import (
2424
ConnectionTypeContract,
2525
ModuleContract,
26-
ToolsetServicesContract,
2726
build_openapi_document,
2827
validate_modules_catalog,
2928
validate_provider_parameters,
@@ -142,18 +141,6 @@ def test_connection_type_contract_round_trips_external_services():
142141
assert validated.external_services == ["openai", "anthropic"]
143142

144143

145-
def test_toolset_services_contract_defaults_services_to_empty_list():
146-
validated = ToolsetServicesContract.model_validate({"module": "airflow.providers.test.toolsets.hook"})
147-
assert validated.services == []
148-
149-
150-
def test_toolset_services_contract_rejects_unknown_fields():
151-
with pytest.raises(ValidationError):
152-
ToolsetServicesContract.model_validate(
153-
{"module": "airflow.providers.test.toolsets.hook", "services": [], "unexpected": "x"}
154-
)
155-
156-
157144
def test_validate_version_metadata_accepts_legacy_version_modules_without_ids():
158145
payload = {
159146
"provider_id": "test",

‎registry/src/css/main.css‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3839,7 +3839,6 @@ main {
38393839
vertical-align: top;
38403840
}
38413841

3842-
.provider-detail-page .external-services-card .external-services-type,
38433842
.provider-detail-page .external-services-card .external-services-name {
38443843
white-space: nowrap;
38453844
}

‎registry/src/provider-version.njk‎

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ eleventyComputed:
1919
{% set extras = pv.provider.optional_extras or {} %}
2020
{% set conns = pv.provider.connection_types or [] %}
2121
{% set uriSchemes = pv.provider.uri_schemes or [] %}
22-
{% set toolsetServices = pv.provider.toolset_services or [] %}
2322
{% set providerModules = pv.modules %}
2423
{% set currentVersion = pv.provider.version %}
2524
{% set pythonVersion = pv.provider.requires_python %}
@@ -31,7 +30,6 @@ eleventyComputed:
3130
{% set extras = pv.versionData.optional_extras or {} %}
3231
{% set conns = pv.versionData.connection_types or [] %}
3332
{% set uriSchemes = pv.versionData.uri_schemes or [] %}
34-
{% set toolsetServices = pv.versionData.toolset_services or [] %}
3533
{% set providerModules = pv.versionData.modules or [] %}
3634
{% set currentVersion = pv.version %}
3735
{% set pythonVersion = pv.versionData.requires_python %}
@@ -42,12 +40,7 @@ eleventyComputed:
4240
{% set externalServiceRows = [] %}
4341
{% for conn in conns %}
4442
{% if conn.external_services and conn.external_services.length > 0 %}
45-
{% set externalServiceRows = (externalServiceRows.push({sourceType: "Connection", name: conn.conn_type or conn.connection_type, services: conn.external_services}), externalServiceRows) %}
46-
{% endif %}
47-
{% endfor %}
48-
{% for entry in toolsetServices %}
49-
{% if entry.services and entry.services.length > 0 %}
50-
{% set externalServiceRows = (externalServiceRows.push({sourceType: "Toolset", name: entry.module, services: entry.services}), externalServiceRows) %}
43+
{% set externalServiceRows = (externalServiceRows.push({name: conn.conn_type or conn.connection_type, services: conn.external_services}), externalServiceRows) %}
5144
{% endif %}
5245
{% endfor %}
5346

@@ -335,15 +328,13 @@ eleventyComputed:
335328
<table class="external-services-table">
336329
<thead>
337330
<tr class="external-services-header">
338-
<th>Source type</th>
339331
<th>Name</th>
340332
<th>External services (examples)</th>
341333
</tr>
342334
</thead>
343335
<tbody>
344336
{% for row in externalServiceRows %}
345337
<tr class="external-services-row">
346-
<td class="external-services-type">{{ row.sourceType }}</td>
347338
<td class="external-services-name"><code>{{ row.name }}</code></td>
348339
<td class="external-services-list">{{ row.services | join(", ") }}</td>
349340
</tr>

0 commit comments

Comments
 (0)