This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new d8da1f96e8b README optional dependencies template (#55280)
d8da1f96e8b is described below
commit d8da1f96e8b89510e96145992b57b35a79d83007
Author: Steve Ahn <[email protected]>
AuthorDate: Sun Sep 7 15:26:46 2025 -0700
README optional dependencies template (#55280)
* readme optional dependencies
* optional dependencies on repo standard
---
.../templates/PROVIDER_README_TEMPLATE.rst.jinja2 | 8 ++++++
dev/breeze/src/airflow_breeze/utils/packages.py | 33 ++++++++++++++++++++++
providers/amazon/README.rst | 25 ++++++++++++++++
3 files changed, 66 insertions(+)
diff --git
a/dev/breeze/src/airflow_breeze/templates/PROVIDER_README_TEMPLATE.rst.jinja2
b/dev/breeze/src/airflow_breeze/templates/PROVIDER_README_TEMPLATE.rst.jinja2
index a0a94aa6e65..c64fcc18df6 100644
---
a/dev/breeze/src/airflow_breeze/templates/PROVIDER_README_TEMPLATE.rst.jinja2
+++
b/dev/breeze/src/airflow_breeze/templates/PROVIDER_README_TEMPLATE.rst.jinja2
@@ -101,6 +101,14 @@ You can install such cross-provider dependencies when
installing from PyPI. For
{{ CROSS_PROVIDERS_DEPENDENCIES_TABLE_RST | safe }}
+{%- endif %}
+{%- if OPTIONAL_DEPENDENCIES %}
+
+Optional dependencies
+----------------------
+
+{{ OPTIONAL_DEPENDENCIES_TABLE_RST | safe }}
+
{%- endif %}
The changelog for the provider package can be found in the
diff --git a/dev/breeze/src/airflow_breeze/utils/packages.py
b/dev/breeze/src/airflow_breeze/utils/packages.py
index 4ed79573e4b..340831d6b6e 100644
--- a/dev/breeze/src/airflow_breeze/utils/packages.py
+++ b/dev/breeze/src/airflow_breeze/utils/packages.py
@@ -292,6 +292,11 @@ def get_provider_requirements(provider_id: str) ->
list[str]:
return package_metadata["dependencies"] if package_metadata else []
+def get_provider_optional_dependencies(provider_id: str) -> dict[str,
list[str]]:
+ package_metadata = get_provider_distributions_metadata().get(provider_id)
+ return package_metadata.get("optional-dependencies", {}) if
package_metadata else {}
+
+
@lru_cache
def get_available_distributions(
include_non_provider_doc_packages: bool = False,
@@ -626,6 +631,30 @@ def convert_cross_package_dependencies_to_table(
return tabulate(table_data, headers=headers, tablefmt="pipe" if markdown
else "rst")
+def convert_optional_dependencies_to_table(
+ optional_dependencies: dict[str, list[str]],
+ markdown: bool = True,
+) -> str:
+ """
+ Converts optional dependencies to a Markdown/RST table
+ :param optional_dependencies: dict of optional dependencies
+ :param markdown: if True, Markdown format is used else rst
+ :return: formatted table
+ """
+ import html
+
+ from tabulate import tabulate
+
+ headers = ["Extra", "Dependencies"]
+ table_data = []
+ for extra_name, dependencies in optional_dependencies.items():
+ decoded_deps = [html.unescape(dep) for dep in dependencies]
+ formatted_deps = ", ".join(f"`{dep}`" if markdown else f"``{dep}``"
for dep in decoded_deps)
+ extra_col = f"`{extra_name}`" if markdown else f"``{extra_name}``"
+ table_data.append((extra_col, formatted_deps))
+ return tabulate(table_data, headers=headers, tablefmt="pipe" if markdown
else "rst")
+
+
def get_cross_provider_dependent_packages(provider_id: str) -> list[str]:
if provider_id in get_removed_provider_ids():
return []
@@ -679,6 +708,10 @@ def get_provider_jinja_context(
),
"REQUIRES_PYTHON": requires_python_version,
"EXTRA_PROJECT_METADATA": provider_details.extra_project_metadata,
+ "OPTIONAL_DEPENDENCIES":
get_provider_optional_dependencies(provider_id),
+ "OPTIONAL_DEPENDENCIES_TABLE_RST":
convert_optional_dependencies_to_table(
+ get_provider_optional_dependencies(provider_id), markdown=False
+ ),
}
return context
diff --git a/providers/amazon/README.rst b/providers/amazon/README.rst
index cb4edfa9949..eb3781085f7 100644
--- a/providers/amazon/README.rst
+++ b/providers/amazon/README.rst
@@ -103,5 +103,30 @@ Dependent package
`apache-airflow-providers-ssh
<https://airflow.apache.org/docs/apache-airflow-providers-ssh>`_
``ssh``
========================================================================================================================
====================
+Optional dependencies
+----------------------
+
+====================
========================================================================================================================================
+Extra Dependencies
+====================
========================================================================================================================================
+``aiobotocore`` ``aiobotocore[boto3]>=2.21.1``
+``cncf.kubernetes`` ``apache-airflow-providers-cncf-kubernetes>=7.2.0``
+``s3fs`` ``s3fs>=2023.10.0``
+``python3-saml`` ``python3-saml>=1.16.0; python_version < '3.13'``,
``xmlsec>=1.3.14; python_version < '3.13'``, ``lxml>=6.0.0; python_version <
'3.13'``
+``apache.hive`` ``apache-airflow-providers-apache-hive``
+``exasol`` ``apache-airflow-providers-exasol``
+``fab`` ``apache-airflow-providers-fab>=2.2.0; python_version <
'3.13'``
+``ftp`` ``apache-airflow-providers-ftp``
+``google`` ``apache-airflow-providers-google``
+``imap`` ``apache-airflow-providers-imap``
+``microsoft.azure`` ``apache-airflow-providers-microsoft-azure``
+``mongo`` ``apache-airflow-providers-mongo``
+``openlineage`` ``apache-airflow-providers-openlineage>=2.3.0``
+``salesforce`` ``apache-airflow-providers-salesforce``
+``ssh`` ``apache-airflow-providers-ssh``
+``standard`` ``apache-airflow-providers-standard``
+``common.messaging`` ``apache-airflow-providers-common-messaging>=1.0.3``
+====================
========================================================================================================================================
+
The changelog for the provider package can be found in the
`changelog
<https://airflow.apache.org/docs/apache-airflow-providers-amazon/9.13.0/changelog.html>`_.