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 23b87534e6 Better handling build errors when building docs with
--spellcheck-only (#36336)
23b87534e6 is described below
commit 23b87534e636e407f3f68107d442f55b771216f3
Author: Jarek Potiuk <[email protected]>
AuthorDate: Wed Dec 20 20:49:18 2023 +0100
Better handling build errors when building docs with --spellcheck-only
(#36336)
When running docs building with --spellcheck-only and building docs
fails, the errors which were not spelling errors were not handled
well - first of all, the build errors were not printted separately
as errors (you only saw generaic spellchecking failed), but more
importantly, when building docs failed it has not been repeated
again. This caused problems if there were changes that required to
rebuild another packag - which happens when you add related changes
to several packages.
This PR fixes it by:
* allowing spellchecking to contribute build errors when the
--spellcheck-only flag is used
* when build is retried, spellcheck-only flag is ignored - so that
the documentation for related packages can be actually rebuilt,
not only spell-checked
* when --spellcheck-only is used to build packages, all original
packages are rebuilt not only the failed one - this allows to
rebuild dependent packages
---
docs/build_docs.py | 33 ++++++++++++++++++++++++---------
docs/exts/docs_build/docs_builder.py | 18 ++++++++++++------
2 files changed, 36 insertions(+), 15 deletions(-)
diff --git a/docs/build_docs.py b/docs/build_docs.py
index aaba029b60..6eac628b96 100755
--- a/docs/build_docs.py
+++ b/docs/build_docs.py
@@ -183,7 +183,8 @@ class SpellCheckResult(NamedTuple):
package_name: str
log_file_name: str
- errors: list[SpellingError]
+ spelling_errors: list[SpellingError]
+ build_errors: list[DocBuildError]
def perform_docs_build_for_single_package(build_specification:
BuildSpecification) -> BuildDocsResult:
@@ -204,11 +205,13 @@ def
perform_spell_check_for_single_package(build_specification: BuildSpecificati
"""Performs single package spell check."""
builder = AirflowDocsBuilder(package_name=build_specification.package_name)
console.print(f"[info]{build_specification.package_name:60}:[/] Checking
spelling started")
+ spelling_errors, build_errors = builder.check_spelling(
+ verbose=build_specification.verbose,
+ )
result = SpellCheckResult(
package_name=build_specification.package_name,
- errors=builder.check_spelling(
- verbose=build_specification.verbose,
- ),
+ spelling_errors=spelling_errors,
+ build_errors=build_errors,
log_file_name=builder.log_spelling_filename,
)
console.print(f"[info]{build_specification.package_name:60}:[/] Checking
spelling completed")
@@ -280,8 +283,10 @@ def run_sequentially(
verbose=verbose,
)
)
- if spellcheck_result.errors:
-
all_spelling_errors[package_name].extend(spellcheck_result.errors)
+ if spellcheck_result.spelling_errors:
+
all_spelling_errors[package_name].extend(spellcheck_result.spelling_errors)
+ if spellcheck_only:
+
all_build_errors[package_name].extend(spellcheck_result.build_errors)
print_spelling_output(spellcheck_result)
@@ -306,6 +311,7 @@ def run_in_parallel(
if not docs_only:
run_spell_check_in_parallel(
all_spelling_errors=all_spelling_errors,
+ all_build_errors=all_build_errors,
current_packages=current_packages,
verbose=verbose,
pool=pool,
@@ -363,6 +369,7 @@ def print_spelling_output(result: SpellCheckResult):
def run_spell_check_in_parallel(
all_spelling_errors: dict[str, list[SpellingError]],
+ all_build_errors: dict[str, list[DocBuildError]],
current_packages: list[str],
verbose: bool,
pool,
@@ -377,8 +384,9 @@ def run_spell_check_in_parallel(
console.print()
result_list = pool.map(perform_spell_check_for_single_package,
spell_check_specifications)
for result in result_list:
- if result.errors:
- all_spelling_errors[result.package_name].extend(result.errors)
+ if result.spelling_errors:
+
all_spelling_errors[result.package_name].extend(result.spelling_errors)
+ all_build_errors[result.package_name].extend(result.build_errors)
print_spelling_output(result)
@@ -495,6 +503,7 @@ def main():
jobs,
package_build_errors,
package_spelling_errors,
+ current_packages,
spellcheck_only,
)
@@ -507,6 +516,7 @@ def main():
jobs,
package_build_errors,
package_spelling_errors,
+ current_packages,
spellcheck_only,
)
@@ -537,6 +547,7 @@ def retry_building_docs_if_needed(
jobs,
package_build_errors,
package_spelling_errors,
+ current_packages,
spellcheck_only,
):
to_retry_packages = [
@@ -544,6 +555,10 @@ def retry_building_docs_if_needed(
for package_name, errors in package_build_errors.items()
if any(any((m in e.message) for m in ERRORS_ELIGIBLE_TO_REBUILD) for e
in errors)
]
+ if to_retry_packages and spellcheck_only:
+ # in case spellchecking fails with retry all packages should be
rebuilt without spell-checking
+ # in case the failed package refers to another package
+ to_retry_packages = current_packages
if to_retry_packages:
for package_name in to_retry_packages:
if package_name in all_build_errors:
@@ -554,7 +569,7 @@ def retry_building_docs_if_needed(
package_build_errors, package_spelling_errors =
build_docs_for_packages(
current_packages=to_retry_packages,
docs_only=docs_only,
- spellcheck_only=spellcheck_only,
+ spellcheck_only=False,
jobs=jobs,
verbose=args.verbose,
)
diff --git a/docs/exts/docs_build/docs_builder.py
b/docs/exts/docs_build/docs_builder.py
index d72c8941f6..e44b5544ca 100644
--- a/docs/exts/docs_build/docs_builder.py
+++ b/docs/exts/docs_build/docs_builder.py
@@ -125,7 +125,7 @@ class AirflowDocsBuilder:
os.makedirs(api_dir, exist_ok=True)
os.makedirs(self._build_dir, exist_ok=True)
- def check_spelling(self, verbose: bool) -> list[SpellingError]:
+ def check_spelling(self, verbose: bool) -> tuple[list[SpellingError],
list[DocBuildError]]:
"""
Checks spelling
@@ -133,6 +133,7 @@ class AirflowDocsBuilder:
:return: list of errors
"""
spelling_errors = []
+ build_errors = []
os.makedirs(self._build_dir, exist_ok=True)
shutil.rmtree(self.log_spelling_output_dir, ignore_errors=True)
os.makedirs(self.log_spelling_output_dir, exist_ok=True)
@@ -182,12 +183,17 @@ class AirflowDocsBuilder:
),
)
)
- warning_text = ""
+ spelling_warning_text = ""
for filepath in
glob(f"{self.log_spelling_output_dir}/**/*.spelling", recursive=True):
with open(filepath) as spelling_file:
- warning_text += spelling_file.read()
-
- spelling_errors.extend(parse_spelling_warnings(warning_text,
self._src_dir))
+ spelling_warning_text += spelling_file.read()
+
spelling_errors.extend(parse_spelling_warnings(spelling_warning_text,
self._src_dir))
+ if os.path.isfile(self.log_spelling_filename):
+ with open(self.log_spelling_filename) as warning_file:
+ warning_text = warning_file.read()
+ # Remove 7-bit C1 ANSI escape sequences
+ warning_text = re.sub(r"\x1B[@-_][0-?]*[ -/]*[@-~]", "",
warning_text)
+ build_errors.extend(parse_sphinx_warnings(warning_text,
self._src_dir))
console.print(f"[info]{self.package_name:60}:[/] [red]Finished
spell-checking with errors[/]")
else:
if spelling_errors:
@@ -198,7 +204,7 @@ class AirflowDocsBuilder:
console.print(
f"[info]{self.package_name:60}:[/] [green]Finished
spell-checking successfully[/]"
)
- return spelling_errors
+ return spelling_errors, build_errors
def build_sphinx_docs(self, verbose: bool) -> list[DocBuildError]:
"""