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 @@ -109,6 +109,7 @@
fix_ownership_using_docker,
perform_environment_checks,
)
from airflow_breeze.utils.docs_publisher import DocsPublisher
from airflow_breeze.utils.github import download_constraints_file, get_active_airflow_versions
from airflow_breeze.utils.packages import (
PackageSuspendedException,
Expand Down Expand Up @@ -139,7 +140,6 @@
generate_providers_metadata_for_package,
get_related_providers,
)
from airflow_breeze.utils.publish_docs_builder import PublishDocsBuilder
from airflow_breeze.utils.python_versions import get_python_version_list
from airflow_breeze.utils.run_utils import (
clean_www_assets,
Expand Down Expand Up @@ -1084,7 +1084,7 @@ def run_docs_publishing(
verbose: bool,
output: Output | None,
) -> tuple[int, str]:
builder = PublishDocsBuilder(package_name=package_name, output=output, verbose=verbose)
builder = DocsPublisher(package_name=package_name, output=output, verbose=verbose)
builder.publish(override_versioned=override_versioned, airflow_site_dir=airflow_site_directory)
return (
0,
Expand Down
101 changes: 101 additions & 0 deletions dev/breeze/src/airflow_breeze/utils/docs_publisher.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# 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

import os
import shutil
from pathlib import Path

from airflow_breeze.global_constants import get_airflow_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_packages_metadata, get_short_package_name
from airflow_breeze.utils.publish_docs_helpers import pretty_format_path

PROCESS_TIMEOUT = 15 * 60

ROOT_PROJECT_DIR = Path(__file__).parents[5].resolve()
DOCS_DIR = os.path.join(ROOT_PROJECT_DIR, "docs")


class DocsPublisher:
"""Documentation builder for Airflow Docs Publishing."""

def __init__(self, package_name: str, output: Output | None, verbose: bool):
self.package_name = package_name
self.output = output
self.verbose = verbose

@property
def is_versioned(self):
"""Is current documentation package versioned?"""
# Disable versioning. This documentation does not apply to any released product and we can update
# it as needed, i.e. with each new package of providers.
return self.package_name not in ("apache-airflow-providers", "docker-stack")

@property
def _build_dir(self) -> str:
if self.is_versioned:
version = "stable"
return f"{DOCS_DIR}/_build/docs/{self.package_name}/{version}"
else:
return f"{DOCS_DIR}/_build/docs/{self.package_name}"

@property
def _current_version(self):
if not self.is_versioned:
raise Exception("This documentation package is not versioned")
if self.package_name == "apache-airflow":
return get_airflow_version()
if self.package_name.startswith("apache-airflow-providers-"):
provider = get_provider_packages_metadata().get(get_short_package_name(self.package_name))
return provider["versions"][0]
if self.package_name == "helm-chart":
return chart_version()
return Exception(f"Unsupported package: {self.package_name}")

@property
def _publish_dir(self) -> str:
if self.is_versioned:
return f"docs-archive/{self.package_name}/{self._current_version}"
else:
return f"docs-archive/{self.package_name}"

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}")
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)
get_console(output=self.output).print(f"Copy directory: {pretty_source} => {pretty_target}")
if os.path.exists(output_dir):
if self.is_versioned:
if override_versioned:
get_console(output=self.output).print(f"Overriding previously existing {output_dir}! ")
else:
get_console(output=self.output).print(
f"Skipping previously existing {output_dir}! "
f"Delete it manually if you want to regenerate it!"
)
get_console(output=self.output).print()
return
shutil.rmtree(output_dir)
shutil.copytree(self._build_dir, output_dir)
if self.is_versioned:
with open(os.path.join(output_dir, "..", "stable.txt"), "w") as stable_file:
stable_file.write(self._current_version)
get_console(output=self.output).print()
Loading