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 <steveahn...@g.ucla.edu>
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>`_.

Reply via email to