Lee-W commented on code in PR #72939:
URL: https://github.com/apache/airflow/pull/72939#discussion_r4052613504


##########
devel-common/src/sphinx_exts/providers_extensions.py:
##########
@@ -515,8 +514,93 @@ def render_content(self, *, tags: set[str] | None, 
header_separator: str = DEFAU
         return _render_openlineage_supported_classes_content()
 
 
+def _find_provider_package_data(package_name: str) -> dict[str, Any]:
+    for provider in load_package_data():
+        if provider["package-name"] == package_name:
+            return provider
+    raise ValueError(f"No provider.yaml found for package '{package_name}'")
+
+
+def _render_connection_services_content(package_name: str) -> str:
+    provider = _find_provider_package_data(package_name)
+    rows = [
+        {
+            "hook_name": conn["hook-name"],
+            "services": conn.get("external-services") or [],
+            "ref": f"howto/connection:{conn['connection-type']}",
+        }
+        for conn in provider.get("connection-types", [])
+    ]
+    return _render_template("provider_connection_services.rst.jinja2", 
rows=rows)
+
+
+# Display name for each toolset module: the class name for modules that map to 
one
+# (`toolsets.rst` documents each under a `` ``ClassName`` `` heading), or a 
short
+# descriptive name for the two that don't (`managed_agent` documents a family 
of
+# provider-specific subclasses under "Managed Agent Toolsets"; 
`langchain_bridge` is a
+# function, documented under "Working with LangChain"). Kept here rather than 
in
+# `provider.yaml` because it is presentation-only, not metadata the registry 
also needs.
+#
+# Deliberately no `.get(basename, default)` fallback below: every module in
+# `python-modules` must have an entry here, the same way `LABELS` and the 
anchor check
+# in `test_provider_metadata.py` require full coverage. A `KeyError` on a new 
toolset
+# module is the intended failure mode, not a silently rendered basename.
+_TOOLSET_DISPLAY_NAMES = {
+    "hook": "HookToolset",
+    "sql": "SQLToolset",
+    "datafusion": "DataFusionToolset",
+    "logging": "LoggingToolset",
+    "mcp": "MCPToolset",
+    "skills": "AgentSkillsToolset",
+    "sandbox": "SandboxToolset",
+    "langchain_bridge": "LangChain Bridge",
+    "managed_agent": "Managed Agent Toolsets",
+}
+
+
+def _render_toolset_services_content(package_name: str) -> str:
+    provider = _find_provider_package_data(package_name)
+    rows = []
+    for toolset in provider.get("toolsets", []):
+        services_by_module = {
+            entry["module"]: entry["services"] for entry in 
toolset.get("external-services") or []
+        }
+        for module in toolset.get("python-modules", []):
+            basename = module.rsplit(".", 1)[-1]
+            rows.append(
+                {
+                    "display_name": _TOOLSET_DISPLAY_NAMES[basename],

Review Comment:
   `_render_toolset_services_content` now catches the `KeyError` and raises a 
`ValueError` naming the provider package and the full dotted module path, and 
saying to add an entry to `_TOOLSET_DISPLAY_NAMES`.
   
   Deriving the name from `provider.yaml` didn't work: `integration-name` is in 
`toolsets` entry, not per module, so all 9 modules would collapse to 1 name.
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to