Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class ProviderResponse(BaseModel):
package_name: str
description: str
version: str
documentation_url: str | None


class ProviderCollectionResponse(BaseModel):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12014,11 +12014,17 @@ components:
version:
type: string
title: Version
documentation_url:
anyOf:
- type: string
- type: 'null'
title: Documentation Url
type: object
required:
- package_name
- description
- version
- documentation_url
title: ProviderResponse
description: Provider serializer for responses.
QueuedEventCollectionResponse:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,5 @@ def _provider_mapper(provider: ProviderInfo) -> ProviderResponse:
package_name=provider.data["package-name"],
description=_remove_rst_syntax(provider.data["description"]),
version=provider.version,
documentation_url=provider.data["documentation-url"],
)
15 changes: 15 additions & 0 deletions airflow-core/src/airflow/providers_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -601,6 +601,21 @@ def _discover_all_providers_from_packages(self) -> None:
f"The package '{package_name}' from packaging information "
f"{provider_info_package_name} do not match. Please make sure they are aligned"
)

# issue-59576: Retrieve the project.urls.documentation from dist.metadata
project_urls = dist.metadata.get_all("Project-URL")
documentation_url: str | None = None

if project_urls:
for entry in project_urls:
if "," in entry:
name, url = entry.split(",")
if name.strip().lower() == "documentation":
documentation_url = url
break

provider_info["documentation-url"] = documentation_url

if package_name not in self._provider_dict:
self._provider_dict[package_name] = ProviderInfo(version, provider_info)
else:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4782,10 +4782,21 @@ export const $ProviderResponse = {
version: {
type: 'string',
title: 'Version'
},
documentation_url: {
anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Documentation Url'
}
},
type: 'object',
required: ['package_name', 'description', 'version'],
required: ['package_name', 'description', 'version', 'documentation_url'],
title: 'ProviderResponse',
description: 'Provider serializer for responses.'
} as const;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1246,6 +1246,7 @@ export type ProviderResponse = {
package_name: string;
description: string;
version: string;
documentation_url: string | null;
};

/**
Expand Down
5 changes: 4 additions & 1 deletion airflow-core/src/airflow/ui/src/pages/Providers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@ const createColumns = (translate: TFunction): Array<ColumnDef<ProviderResponse>>
<Link
aria-label={original.package_name}
color="fg.info"
href={`https://airflow.apache.org/docs/${original.package_name}/${original.version}/`}
href={
original.documentation_url ??
`https://airflow.apache.org/docs/${original.package_name}/${original.version}/`
}
rel="noopener noreferrer"
target="_blank"
>
Expand Down
2 changes: 2 additions & 0 deletions airflow-core/tests/unit/always/test_providers_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,10 @@ def test_providers_are_loaded(self):
for provider in provider_list:
package_name = provider_manager.providers[provider].data["package-name"]
version = provider_manager.providers[provider].version
documentation_url = provider_manager.providers[provider].data["documentation-url"]
assert re.search(r"[0-9]*\.[0-9]*\.[0-9]*.*", version)
assert package_name == provider
assert isinstance(documentation_url, str)
# just a coherence check - no exact number as otherwise we would have to update
# several tests if we add new connections/provider which is not ideal
assert len(provider_list) > 65
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"name": "Amazon",
"description": "`Amazon Web Services (AWS) <https://aws.amazon.com/>`__.\n",
"versions": ["1.0.0"],
"documentation-url": "https://airflow.apache.org/docs/apache-airflow-providers-amazon/1.0.0/",
},
),
"apache-airflow-providers-apache-cassandra": ProviderInfo(
Expand All @@ -43,6 +44,7 @@
"name": "Apache Cassandra",
"description": "`Apache Cassandra <http://cassandra.apache.org/>`__.\n",
"versions": ["1.0.0"],
"documentation-url": "https://airflow.apache.org/docs/apache-airflow-providers-apache-cassandra/1.0.0/",
},
),
}
Expand Down
1 change: 1 addition & 0 deletions airflow-ctl/src/airflowctl/api/datamodels/generated.py
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,7 @@ class ProviderResponse(BaseModel):
package_name: Annotated[str, Field(title="Package Name")]
description: Annotated[str, Field(title="Description")]
version: Annotated[str, Field(title="Version")]
documentation_url: Annotated[str | None, Field(title="Documentation Url")] = None


class QueuedEventResponse(BaseModel):
Expand Down
Loading