This is an automated email from the ASF dual-hosted git repository. kaxilnaik pushed a commit to branch fix/registry-blank-lines in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 62e4fe1ebe7b03e25e9314e5a3042ebad736ba8a Author: Kaxil Naik <[email protected]> AuthorDate: Thu Mar 19 14:50:17 2026 +0000 Fix 299 blank lines in registry homepage HTML The Nunjucks loop that filters providers with first_released dates emits blank lines for each iteration (~99 providers x 3 lines). Use whitespace-trimming delimiters ({%- -%}) on the data-processing loop to eliminate blank lines from the rendered HTML. --- .../versions/head/test_task_instances.py | 41 ++++++++++++++++++++++ registry/src/index.njk | 14 ++++---- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_task_instances.py b/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_task_instances.py index 7cc7aa85594..217f34847d2 100644 --- a/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_task_instances.py +++ b/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_task_instances.py @@ -1632,6 +1632,47 @@ class TestTISkipDownstream: assert response.status_code == 204 assert ti1.state == State.SKIPPED + @pytest.mark.parametrize( + ("initial_state", "expected_state"), + [ + pytest.param(State.RUNNING, State.RUNNING, id="running_preserved"), + pytest.param(State.SUCCESS, State.SUCCESS, id="success_preserved"), + pytest.param(State.FAILED, State.FAILED, id="failed_preserved"), + pytest.param(State.QUEUED, State.SKIPPED, id="queued_skipped"), + pytest.param(None, State.SKIPPED, id="none_skipped"), + ], + ) + def test_ti_skip_downstream_state_guard( + self, client, session, create_task_instance, dag_maker, initial_state, expected_state + ): + """State guard prevents overwriting RUNNING/SUCCESS/FAILED with SKIPPED (HA race condition).""" + with dag_maker("skip_downstream_guard_dag", session=session): + t0 = EmptyOperator(task_id="t0") + t1 = EmptyOperator(task_id="t1") + t0 >> t1 + dr = dag_maker.create_dagrun(run_id="run") + + ti0 = dr.get_task_instance("t0") + ti0.set_state(State.SUCCESS) + + ti1 = dr.get_task_instance("t1") + if initial_state is not None: + ti1.set_state(initial_state) + else: + ti1.state = None + session.merge(ti1) + session.commit() + + response = client.patch( + f"/execution/task-instances/{ti0.id}/skip-downstream", + json={"tasks": ["t1"]}, + ) + + assert response.status_code == 204 + session.expire_all() + ti1 = dr.get_task_instance("t1") + assert ti1.state == expected_state + class TestTISkipDownstreamRaceCondition: """Regression tests for #59378: state guard in ti_skip_downstream().""" diff --git a/registry/src/index.njk b/registry/src/index.njk index e8d6a475c7c..a57b5177fb1 100644 --- a/registry/src/index.njk +++ b/registry/src/index.njk @@ -99,13 +99,13 @@ title: Discover Providers, Operators & Hooks for Apache Airflow </section> <!-- New Providers --> -{% set allWithDate = [] %} -{% for provider in providers.providers %} - {% if provider.first_released %} - {% set allWithDate = (allWithDate.push(provider), allWithDate) %} - {% endif %} -{% endfor %} -{% set newProviders = allWithDate | sort(false, false, 'first_released') | reverse | slice(0, 4) %} +{%- set allWithDate = [] -%} +{%- for provider in providers.providers -%} + {%- if provider.first_released -%} + {%- set allWithDate = (allWithDate.push(provider), allWithDate) -%} + {%- endif -%} +{%- endfor -%} +{%- set newProviders = allWithDate | sort(false, false, 'first_released') | reverse | slice(0, 4) -%} {% if newProviders.length > 0 %} <section id="new-providers"> <div class="container">
