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>`_.