diff --git a/.github/workflows/publish-docs-to-s3.yml b/.github/workflows/publish-docs-to-s3.yml index 262a452c9b7c6..e70c25377e0e3 100644 --- a/.github/workflows/publish-docs-to-s3.yml +++ b/.github/workflows/publish-docs-to-s3.yml @@ -322,15 +322,34 @@ jobs: key: cache-docs-inventory-v1 id: restore-docs-inventory-cache - name: "Building docs with --docs-only flag using ${{ inputs.ref }} reference breeze" + id: build-sphinx-docs env: INCLUDE_DOCS: ${{ needs.build-info.outputs.include-docs }} INCLUDE_COMMITS: ${{ startsWith(inputs.ref, 'providers') && 'true' || 'false' }} FAIL_ON_INVENTORIES: ${{ inputs.ignore-missing-inventories != true && '--fail-on-missing-third-party-inventories' || '' }} - run: > - breeze build-docs ${INCLUDE_DOCS} --docs-only ${FAIL_ON_INVENTORIES} + run: | + # The Java SDK docs are built with Dokka by the separate build-java-sdk-docs job; + # java-sdk is not a Sphinx package, so it must not be passed to breeze build-docs. + SPHINX_INCLUDE_DOCS="" + for package in ${INCLUDE_DOCS}; do + if [[ "${package}" != "java-sdk" ]]; then + SPHINX_INCLUDE_DOCS="${SPHINX_INCLUDE_DOCS} ${package}" + fi + done + if [[ -n "${INCLUDE_DOCS}" && -z "${SPHINX_INCLUDE_DOCS// /}" ]]; then + echo "Only java-sdk docs were requested - skipping the Sphinx docs build." + mkdir -p generated/_build/docs + echo "The Sphinx docs build was skipped: only java-sdk docs were requested." \ + > generated/_build/docs/sphinx-build-skipped.txt + echo "sphinx-build-skipped=true" >> "${GITHUB_OUTPUT}" + else + breeze build-docs ${SPHINX_INCLUDE_DOCS} --docs-only ${FAIL_ON_INVENTORIES} + fi - name: "Save docs inventory cache" uses: apache/infrastructure-actions/stash/save@49df447b39b18354895520e0a63731b7cad7cbec - if: steps.restore-docs-inventory-cache.outputs.stash-hit != 'true' + if: >- + steps.restore-docs-inventory-cache.outputs.stash-hit != 'true' && + steps.build-sphinx-docs.outputs.sphinx-build-skipped != 'true' with: path: ./generated/_inventory_cache/ key: cache-docs-inventory-v1 @@ -414,8 +433,8 @@ jobs: # builds (include-docs == 'all') or when 'java-sdk' is explicitly listed. # When a specific list of packages is passed (e.g. a provider release # wave like "amazon cncf.kubernetes ..."), the Java SDK must NOT be added - # automatically — otherwise the publish step drags java-sdk into a - # providers-only publish and the S3 publish fails. + # automatically — a providers-only publish should not suddenly refresh the + # java-sdk docs as a side effect. if [[ "${INCLUDE_DOCS}" != "all" && " ${INCLUDE_DOCS} " != *" java-sdk "* ]]; then echo "exists=false" >> "${GITHUB_OUTPUT}" echo "include-docs='${INCLUDE_DOCS}' is a specific package list without 'java-sdk' — skipping Javadoc build." @@ -518,10 +537,9 @@ jobs: - name: "Publish docs to /mnt/airflow-site directory using ${{ inputs.ref }} reference breeze" env: INCLUDE_DOCS: ${{ needs.build-info.outputs.include-docs }} - JAVA_SDK_DOCS: ${{ needs.build-java-sdk-docs.outputs.built == 'true' && 'java-sdk' || '' }} run: > breeze release-management publish-docs --override-versioned --run-in-parallel - ${INCLUDE_DOCS} ${JAVA_SDK_DOCS} + ${INCLUDE_DOCS} - name: Check disk space available run: df -H - name: "Update watermarks" diff --git a/dev/breeze/doc/images/output-commands.svg b/dev/breeze/doc/images/output-commands.svg index 4891c30ed5124..6dfe7e09c52c4 100644 --- a/dev/breeze/doc/images/output-commands.svg +++ b/dev/breeze/doc/images/output-commands.svg @@ -367,7 +367,7 @@ -Usage:breeze[OPTIONS] COMMAND [ARGS]... +Usage:breeze[OPTIONS] [COMMAND] [ARGS]... ╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ │--answer -aForce answer to questions. (y | n | q | yes | no | quit)│ diff --git a/dev/breeze/doc/images/output_build-docs.svg b/dev/breeze/doc/images/output_build-docs.svg index 21272cc62296c..ca5cb1775bcc0 100644 --- a/dev/breeze/doc/images/output_build-docs.svg +++ b/dev/breeze/doc/images/output_build-docs.svg @@ -246,12 +246,12 @@ | apache.tinkerpop | apprise | arangodb | asana | atlassian.jira | celery | clickhousedb | cloudant | cncf.kubernetes | cohere | common.ai | common.compat | common.io | common.messaging | common.sql | databricks | datadog | dbt.cloud |  dingding | discord | docker | docker-stack | edge3 | elasticsearch | exasol | fab | facebook | ftp | git | github |    -google | grpc | hashicorp | helm-chart | http | ibm.mq | imap | influxdb | informatica | jdbc | jenkins | keycloak |   -microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc | openai |         -openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone | postgres |     -presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp | snowflake |    -sqlite | ssh | standard | tableau | task-sdk | telegram | teradata | trino | vertica | vespa | weaviate | yandex | ydb -| zendesk]...                                                                                                          +google | grpc | hashicorp | helm-chart | http | ibm.mq | imap | influxdb | informatica | java-sdk | jdbc | jenkins |   +keycloak | microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc |       +openai | openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone |       +postgres | presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp |     +snowflake | sqlite | ssh | standard | tableau | task-sdk | telegram | teradata | trino | vertica | vespa | weaviate |  +yandex | ydb | zendesk]...                                                                                             Build documents. diff --git a/dev/breeze/doc/images/output_build-docs.txt b/dev/breeze/doc/images/output_build-docs.txt index 48b11286965d5..7e86964622680 100644 --- a/dev/breeze/doc/images/output_build-docs.txt +++ b/dev/breeze/doc/images/output_build-docs.txt @@ -1 +1 @@ -28c9a42f6270c2fa37c15cca78a8c38b +22cd66d36e80473f4fac0fa311c5e846 diff --git a/dev/breeze/doc/images/output_release-management_add-back-references.svg b/dev/breeze/doc/images/output_release-management_add-back-references.svg index 814f0d28ea328..09e78ba88111a 100644 --- a/dev/breeze/doc/images/output_release-management_add-back-references.svg +++ b/dev/breeze/doc/images/output_release-management_add-back-references.svg @@ -155,12 +155,12 @@ | apache.tinkerpop | apprise | arangodb | asana | atlassian.jira | celery | clickhousedb | cloudant | cncf.kubernetes | cohere | common.ai | common.compat | common.io | common.messaging | common.sql | databricks | datadog | dbt.cloud |  dingding | discord | docker | docker-stack | edge3 | elasticsearch | exasol | fab | facebook | ftp | git | github |    -google | grpc | hashicorp | helm-chart | http | ibm.mq | imap | influxdb | informatica | jdbc | jenkins | keycloak |   -microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc | openai |         -openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone | postgres |     -presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp | snowflake |    -sqlite | ssh | standard | tableau | task-sdk | telegram | teradata | trino | vertica | vespa | weaviate | yandex | ydb -| zendesk]...                                                                                                          +google | grpc | hashicorp | helm-chart | http | ibm.mq | imap | influxdb | informatica | java-sdk | jdbc | jenkins |   +keycloak | microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc |       +openai | openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone |       +postgres | presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp |     +snowflake | sqlite | ssh | standard | tableau | task-sdk | telegram | teradata | trino | vertica | vespa | weaviate |  +yandex | ydb | zendesk]...                                                                                             Command to add back references for documentation to make it backward compatible. diff --git a/dev/breeze/doc/images/output_release-management_add-back-references.txt b/dev/breeze/doc/images/output_release-management_add-back-references.txt index 8562a83f6d21c..672e05eb6b26f 100644 --- a/dev/breeze/doc/images/output_release-management_add-back-references.txt +++ b/dev/breeze/doc/images/output_release-management_add-back-references.txt @@ -1 +1 @@ -a100217703deb9fddf97c53ef7e959a5 +2700b8a52b9a04bb3cf5e365e70c2f40 diff --git a/dev/breeze/doc/images/output_release-management_publish-docs.svg b/dev/breeze/doc/images/output_release-management_publish-docs.svg index 6c08dc6c566d0..9416d6183c582 100644 --- a/dev/breeze/doc/images/output_release-management_publish-docs.svg +++ b/dev/breeze/doc/images/output_release-management_publish-docs.svg @@ -194,12 +194,12 @@ | apache.tinkerpop | apprise | arangodb | asana | atlassian.jira | celery | clickhousedb | cloudant | cncf.kubernetes | cohere | common.ai | common.compat | common.io | common.messaging | common.sql | databricks | datadog | dbt.cloud |  dingding | discord | docker | docker-stack | edge3 | elasticsearch | exasol | fab | facebook | ftp | git | github |    -google | grpc | hashicorp | helm-chart | http | ibm.mq | imap | influxdb | informatica | jdbc | jenkins | keycloak |   -microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc | openai |         -openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone | postgres |     -presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp | snowflake |    -sqlite | ssh | standard | tableau | task-sdk | telegram | teradata | trino | vertica | vespa | weaviate | yandex | ydb -| zendesk]...                                                                                                          +google | grpc | hashicorp | helm-chart | http | ibm.mq | imap | influxdb | informatica | java-sdk | jdbc | jenkins |   +keycloak | microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc |       +openai | openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone |       +postgres | presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp |     +snowflake | sqlite | ssh | standard | tableau | task-sdk | telegram | teradata | trino | vertica | vespa | weaviate |  +yandex | ydb | zendesk]...                                                                                             Command to publish generated documentation to airflow-site diff --git a/dev/breeze/doc/images/output_release-management_publish-docs.txt b/dev/breeze/doc/images/output_release-management_publish-docs.txt index 9c2563d46b87b..b6433c39bb9be 100644 --- a/dev/breeze/doc/images/output_release-management_publish-docs.txt +++ b/dev/breeze/doc/images/output_release-management_publish-docs.txt @@ -1 +1 @@ -71cd889146297a3b78c71773b6bb5bcd +cc4ad6886b5ff0da1d4f819d2c5dc80d diff --git a/dev/breeze/doc/images/output_workflow-run_publish-docs.svg b/dev/breeze/doc/images/output_workflow-run_publish-docs.svg index ff1db47a5f239..dfb0027b3d7ef 100644 --- a/dev/breeze/doc/images/output_workflow-run_publish-docs.svg +++ b/dev/breeze/doc/images/output_workflow-run_publish-docs.svg @@ -209,12 +209,12 @@ | apache.tinkerpop | apprise | arangodb | asana | atlassian.jira | celery | clickhousedb | cloudant | cncf.kubernetes | cohere | common.ai | common.compat | common.io | common.messaging | common.sql | databricks | datadog | dbt.cloud |  dingding | discord | docker | docker-stack | edge3 | elasticsearch | exasol | fab | facebook | ftp | git | github |    -google | grpc | hashicorp | helm-chart | http | ibm.mq | imap | influxdb | informatica | jdbc | jenkins | keycloak |   -microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc | openai |         -openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone | postgres |     -presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp | snowflake |    -sqlite | ssh | standard | tableau | task-sdk | telegram | teradata | trino | vertica | vespa | weaviate | yandex | ydb -| zendesk]...                                                                                                          +google | grpc | hashicorp | helm-chart | http | ibm.mq | imap | influxdb | informatica | java-sdk | jdbc | jenkins |   +keycloak | microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | mysql | neo4j | odbc |       +openai | openfaas | openlineage | opensearch | opsgenie | oracle | pagerduty | papermill | pgvector | pinecone |       +postgres | presto | qdrant | redis | salesforce | samba | segment | sendgrid | sftp | singularity | slack | smtp |     +snowflake | sqlite | ssh | standard | tableau | task-sdk | telegram | teradata | trino | vertica | vespa | weaviate |  +yandex | ydb | zendesk]...                                                                                             Trigger publish docs to S3 workflow diff --git a/dev/breeze/doc/images/output_workflow-run_publish-docs.txt b/dev/breeze/doc/images/output_workflow-run_publish-docs.txt index 01d247c731835..4c6ec79dba124 100644 --- a/dev/breeze/doc/images/output_workflow-run_publish-docs.txt +++ b/dev/breeze/doc/images/output_workflow-run_publish-docs.txt @@ -1 +1 @@ -6a419bdaebbe36070dfea872c87a2a23 +e784b5234a05d958f84df96cd5d8d562 diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py index 4c53d7522368d..29df6c2111b09 100644 --- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py +++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py @@ -107,6 +107,7 @@ MOUNT_ALL, START_AIRFLOW_ALLOWED_EXECUTORS, START_AIRFLOW_DEFAULT_ALLOWED_EXECUTOR, + get_java_sdk_version, ) from airflow_breeze.params.build_ci_params import BuildCiParams from airflow_breeze.params.doc_build_params import DocBuildParams @@ -753,15 +754,6 @@ def start_airflow( sys.exit(result.returncode) -def _get_java_sdk_version() -> str: - """Read the Java SDK version from 'java-sdk/gradle.properties'.""" - props_path = AIRFLOW_ROOT_PATH / "java-sdk" / "gradle.properties" - for line in props_path.read_text().splitlines(): - if match := re.match(r"^projectVersion\s*=\s*(\S+)$", line.strip()): - return match.group(1) - raise RuntimeError(f"Java SDK version not found in {props_path}") - - def _build_java_sdk_docs(generated_path: Path) -> int: """Run Dokka for the Java SDK and stage its output for the publish pipeline. @@ -811,7 +803,7 @@ def _build_java_sdk_docs(generated_path: Path) -> int: # Write stable.txt so breeze release-management publish-docs treats this as a # versioned package and places it at docs-archive/java-sdk/{version}/. - sdk_version = _get_java_sdk_version() + sdk_version = get_java_sdk_version() stable_txt = generated_path / "_build" / "docs" / "java-sdk" / "stable.txt" stable_txt.write_text(sdk_version + "\n") console_print(f"[success]Java SDK docs staged at {dst} (version: {sdk_version})") diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py index c866d903ed39c..a2e79615057cb 100644 --- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py +++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py @@ -2035,7 +2035,8 @@ def get_package_version_possibly_from_stable_txt(package_name: str) -> str | Non if package_name == "helm-chart": return chart_version() - if package_name in ("docker-stack", "apache-airflow-providers"): + if package_name in ("docker-stack", "apache-airflow-providers", "java-sdk"): + # Non-versioned packages; java-sdk is versioned but only via a staged stable.txt. return None if package_name.startswith("apache-airflow-providers-"): diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py index da34091a36d4c..31c282952f17d 100644 --- a/dev/breeze/src/airflow_breeze/global_constants.py +++ b/dev/breeze/src/airflow_breeze/global_constants.py @@ -21,6 +21,7 @@ from __future__ import annotations import platform +import re from enum import Enum from pathlib import Path @@ -308,6 +309,7 @@ "docker-stack", "helm-chart", "apache-airflow-providers", + "java-sdk", "task-sdk", "apache-airflow-ctl", ] @@ -730,6 +732,15 @@ def get_task_sdk_version(): return task_sdk_version +def get_java_sdk_version() -> str: + """Read the Java SDK version from 'java-sdk/gradle.properties'.""" + props_path = AIRFLOW_ROOT_PATH / "java-sdk" / "gradle.properties" + for line in props_path.read_text().splitlines(): + if match := re.match(r"^projectVersion\s*=\s*(\S+)$", line.strip()): + return match.group(1) + raise RuntimeError(f"Java SDK version not found in {props_path}") + + @clearable_cache def get_airflow_extras(): airflow_dockerfile = AIRFLOW_ROOT_PATH / "Dockerfile" diff --git a/dev/breeze/src/airflow_breeze/utils/docs_publisher.py b/dev/breeze/src/airflow_breeze/utils/docs_publisher.py index 068d73d5b6f93..1596b3ab8572a 100644 --- a/dev/breeze/src/airflow_breeze/utils/docs_publisher.py +++ b/dev/breeze/src/airflow_breeze/utils/docs_publisher.py @@ -19,7 +19,12 @@ import os import shutil -from airflow_breeze.global_constants import get_airflow_version, get_airflowctl_version, get_task_sdk_version +from airflow_breeze.global_constants import ( + get_airflow_version, + get_airflowctl_version, + get_java_sdk_version, + get_task_sdk_version, +) from airflow_breeze.utils.console import Output, get_console from airflow_breeze.utils.helm_chart_utils import chart_version from airflow_breeze.utils.packages import get_provider_distributions_metadata, get_short_package_name @@ -80,6 +85,8 @@ def _current_version(self): return chart_version() if self.package_name == "apache-airflow-ctl": return get_airflowctl_version() + if self.package_name == "java-sdk": + return get_java_sdk_version() raise SystemExit(f"Unsupported package: {self.package_name}") @property @@ -91,6 +98,13 @@ def _publish_dir(self) -> str: def publish(self, override_versioned: bool, airflow_site_dir: str): """Copy documentation packages files to airflow-site repository.""" get_console(output=self.output).print(f"Publishing docs for {self.package_name}") + # Nothing staged for this package: skip before _publish_dir resolves a version + # that may not be resolvable, and before an existing output dir is deleted below + # with nothing to replace it. + if not os.path.exists(self._build_dir): + get_console(output=self.output).print(f"Build directory {self._build_dir} does not exist!") + get_console(output=self.output).print() + return 0, f"Skipping {self.package_name}: Build directory does not exist" output_dir = os.path.join(airflow_site_dir, self._publish_dir) pretty_source = pretty_format_path(self._build_dir, os.getcwd()) pretty_target = pretty_format_path(output_dir, airflow_site_dir) @@ -108,10 +122,6 @@ def publish(self, override_versioned: bool, airflow_site_dir: str): return 1, f"Skipping {self.package_name}: Previously existing directory" # If output directory exists and is not versioned, delete it shutil.rmtree(output_dir) - if not os.path.exists(self._build_dir): - get_console(output=self.output).print(f"Build directory {self._build_dir} does not exist!") - get_console(output=self.output).print() - return 0, f"Skipping {self.package_name}: Build directory does not exist" shutil.copytree(self._build_dir, output_dir) if self.is_versioned: with open(os.path.join(output_dir, "..", "stable.txt"), "w") as stable_file: diff --git a/dev/breeze/tests/test_docs_publisher.py b/dev/breeze/tests/test_docs_publisher.py new file mode 100644 index 0000000000000..45aa8a5228f33 --- /dev/null +++ b/dev/breeze/tests/test_docs_publisher.py @@ -0,0 +1,106 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +from pathlib import Path + +import pytest + +from airflow_breeze.utils import docs_publisher +from airflow_breeze.utils.docs_publisher import DocsPublisher + + +@pytest.fixture +def generated_path(tmp_path, monkeypatch): + generated = tmp_path / "generated" + monkeypatch.setattr(docs_publisher, "GENERATED_PATH", generated) + return generated + + +@pytest.fixture +def airflow_site_dir(tmp_path): + site_dir = tmp_path / "airflow-site" + site_dir.mkdir() + return str(site_dir) + + +def _stage_java_sdk_docs(generated_path: Path, version: str | None) -> None: + build_dir = generated_path / "_build" / "docs" / "java-sdk" + (build_dir / "stable").mkdir(parents=True) + (build_dir / "stable" / "index.html").write_text("docs") + if version: + (build_dir / "stable.txt").write_text(version + "\n") + + +def test_publish_skips_package_without_staged_docs_before_resolving_version( + generated_path, airflow_site_dir, monkeypatch +): + def fail_version_resolution(): + raise SystemExit("Version must not be resolved when the docs were not staged") + + monkeypatch.setattr(docs_publisher, "get_java_sdk_version", fail_version_resolution) + publisher = DocsPublisher(package_name="java-sdk", output=None, verbose=False) + + return_code, message = publisher.publish(override_versioned=False, airflow_site_dir=airflow_site_dir) + + assert return_code == 0 + assert message == "Skipping java-sdk: Build directory does not exist" + + +def test_publish_preserves_existing_docs_when_build_dir_missing( + generated_path, airflow_site_dir, monkeypatch +): + # A previous version is already published to airflow-site, but nothing is staged + # for this run (build dir missing). Publishing with --override-versioned must not + # delete the existing docs when there is nothing to copy in their place. + monkeypatch.setattr(docs_publisher, "get_java_sdk_version", lambda: "1.2.3") + existing = Path(airflow_site_dir) / "docs-archive" / "java-sdk" / "1.2.3" + existing.mkdir(parents=True) + (existing / "index.html").write_text("previously published") + + publisher = DocsPublisher(package_name="java-sdk", output=None, verbose=False) + return_code, message = publisher.publish(override_versioned=True, airflow_site_dir=airflow_site_dir) + + assert (return_code, message) == (0, "Skipping java-sdk: Build directory does not exist") + assert (existing / "index.html").read_text() == "previously published" + + +def test_publish_java_sdk_docs_with_staged_stable_txt(generated_path, airflow_site_dir): + _stage_java_sdk_docs(generated_path, version="1.2.3") + publisher = DocsPublisher(package_name="java-sdk", output=None, verbose=False) + + return_code, message = publisher.publish(override_versioned=False, airflow_site_dir=airflow_site_dir) + + assert (return_code, message) == (0, "Docs published: java-sdk") + java_sdk_archive = Path(airflow_site_dir) / "docs-archive" / "java-sdk" + assert (java_sdk_archive / "1.2.3" / "index.html").read_text() == "docs" + assert (java_sdk_archive / "stable.txt").read_text() == "1.2.3\n" + + +def test_publish_java_sdk_version_falls_back_to_gradle_properties( + generated_path, airflow_site_dir, monkeypatch +): + monkeypatch.setattr(docs_publisher, "get_java_sdk_version", lambda: "9.9.9") + _stage_java_sdk_docs(generated_path, version=None) + publisher = DocsPublisher(package_name="java-sdk", output=None, verbose=False) + + return_code, message = publisher.publish(override_versioned=False, airflow_site_dir=airflow_site_dir) + + assert (return_code, message) == (0, "Docs published: java-sdk") + java_sdk_archive = Path(airflow_site_dir) / "docs-archive" / "java-sdk" + assert (java_sdk_archive / "9.9.9" / "index.html").read_text() == "docs" + assert (java_sdk_archive / "stable.txt").read_text() == "9.9.9\n" diff --git a/dev/breeze/tests/test_packages.py b/dev/breeze/tests/test_packages.py index 2d54ffdfe5168..7fefdd46ae7f0 100644 --- a/dev/breeze/tests/test_packages.py +++ b/dev/breeze/tests/test_packages.py @@ -86,6 +86,7 @@ def test_get_short_package_name(): assert get_short_package_name("apache-airflow") == "apache-airflow" assert get_short_package_name("docker-stack") == "docker-stack" assert get_short_package_name("task-sdk") == "task-sdk" + assert get_short_package_name("java-sdk") == "java-sdk" assert get_short_package_name("apache-airflow-providers-amazon") == "amazon" assert get_short_package_name("apache-airflow-providers-apache-hdfs") == "apache.hdfs" @@ -99,6 +100,7 @@ def test_get_long_package_name(): assert get_long_package_name("apache-airflow") == "apache-airflow" assert get_long_package_name("docker-stack") == "docker-stack" assert get_long_package_name("task-sdk") == "task-sdk" + assert get_long_package_name("java-sdk") == "java-sdk" assert get_long_package_name("amazon") == "apache-airflow-providers-amazon" assert get_long_package_name("apache.hdfs") == "apache-airflow-providers-apache-hdfs" @@ -131,6 +133,7 @@ def test_get_suspended_provider_folders(): ("short_packages", "filters", "long_packages"), [ (("amazon",), (), ("apache-airflow-providers-amazon",)), + (("java-sdk",), (), ("java-sdk",)), (("apache.hdfs",), (), ("apache-airflow-providers-apache-hdfs",)), ( ("apache.hdfs",), diff --git a/dev/breeze/tests/test_release_management_commands.py b/dev/breeze/tests/test_release_management_commands.py index 15148871f43b9..3e735222c22e3 100644 --- a/dev/breeze/tests/test_release_management_commands.py +++ b/dev/breeze/tests/test_release_management_commands.py @@ -21,10 +21,12 @@ import pytest +from airflow_breeze.commands import release_management_commands from airflow_breeze.commands.release_management_commands import ( _ensure_default_python_for_reproducible_client, _is_initial_provider_release, _should_include_provider_in_issue, + get_package_version_possibly_from_stable_txt, get_prs_from_git_log_for_new_provider, get_suffix_from_package_in_dist, is_package_in_dist, @@ -202,3 +204,22 @@ def test_is_package_in_dist(dist_files: list[str], package: str, expected: bool) ) def test_get_suffix_from_package_in_dist(dist_files: list[str], package: str, expected: str | None): assert get_suffix_from_package_in_dist(dist_files, package) == expected + + +@pytest.mark.parametrize( + ("stable_txt_content", "expected_version"), + [ + # No stable.txt staged (docs not built for this ref) -> None, not an error + (None, None), + ("0.1.0\n", "0.1.0"), + ], +) +def test_get_package_version_possibly_from_stable_txt_for_java_sdk( + tmp_path: Path, monkeypatch, stable_txt_content: str | None, expected_version: str | None +): + monkeypatch.setattr(release_management_commands, "AIRFLOW_ROOT_PATH", tmp_path) + if stable_txt_content is not None: + stable_txt = tmp_path / "generated" / "_build" / "docs" / "java-sdk" / "stable.txt" + stable_txt.parent.mkdir(parents=True) + stable_txt.write_text(stable_txt_content) + assert get_package_version_possibly_from_stable_txt("java-sdk") == expected_version