') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Replace Sphinx Redoc with Swagger API Docs by jscheffl · Pull Request #67390 · apache/airflow · GitHub
Skip to content

Replace Sphinx Redoc with Swagger API Docs - #67390

Merged
jscheffl merged 5 commits into
apache:mainfrom
jscheffl:feature/replace-redoc-with-swagger
May 29, 2026
Merged

Replace Sphinx Redoc with Swagger API Docs#67390
jscheffl merged 5 commits into
apache:mainfrom
jscheffl:feature/replace-redoc-with-swagger

Conversation

@jscheffl

@jscheffljscheffl commented May 23, 2026

Copy link
Copy Markdown
Contributor

As we have the Sphinx-Redoc issue with setuptools still not fixed and it seems the plugin is not maintained (see sphinx-contrib/redoc#54) this PR attempts to replace it with swagger. As this is better maintained.

What is does:

  • Remove redoc, allows to bump setuptools again! (<-- Wohoo!!!)
  • Add swagger rendering from another lib (see https://pypi.org/project/swagger-plugin-for-sphinx/)
  • Adjust to mirror swagger code into the doctree for privacy
  • Adjust core, simple-auth-manager, fab and keycloak to new doc rendering
  • Add Edge REST API generation

Note:

  • Need to reduce cooldown to 8h for swagger-plugin-for-sphinx - or we need to wait for another 3.5. days to merge
  • Is it okay to adjust this or discussion on devlist needed?

Some examples on Staged Docs server:

New look as screenshot:

imageimage
Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@jscheffl
jschefflforce-pushed the feature/replace-redoc-with-swagger branch 2 times, most recently from 022ef55 to fe0248cCompareMay 25, 2026 21:27
@jscheffl
jscheffl marked this pull request as ready for review May 25, 2026 21:36
@jscheffl
jschefflforce-pushed the feature/replace-redoc-with-swagger branch from fe0248c to 8a008a7CompareMay 27, 2026 12:33
@jscheffl
jschefflforce-pushed the feature/replace-redoc-with-swagger branch from 8a008a7 to 20337faCompareMay 27, 2026 17:39
@jscheffl

Copy link
Copy Markdown
ContributorAuthor

Seems no real DISCUSSION on devlist needed, merging therefore.

@jscheffl
jscheffl merged commit dc2e21b into apache:mainMay 29, 2026
292 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: airflow-ctl/v0-1-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
airflow-ctl/v0-1-testCommit Link

You can attempt to backport this manually by running:

cherry_picker dc2e21b airflow-ctl/v0-1-test

This should apply the commit to the airflow-ctl/v0-1-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

@jscheffl

Copy link
Copy Markdown
ContributorAuthor

No need to backport in my view.

potiuk added a commit to potiuk/airflow that referenced this pull request Jun 2, 2026
- amazon: move S3 transfer-operators fix (apache#67378, vincbeck) and EcsRunTaskOperator
log-level fix (apache#67180, jscheffl) from Features to Bug Fixes; beautify the
EksPodOperator entry (apache#65335).
- google: beautify the idle/auto-stop TTL entry (apache#65653) — drop conventional-commit prefix.
- openlineage: beautify the ProcessPoolExecutor self-heal entry (apache#67400).
- edge3: reword the 3.8.0 note — the provider still supports Airflow 3.0+, only the
execute-callback feature (apache#67679) needs 3.3+ (jscheffl); move the Swagger API docs
entry (apache#67390) to Doc-only; beautify the team_name clarification (apache#66718).
- apache/drill: move the flit.sdist housekeeping entry (apache#65861) to the excluded block
to match the kafka convention (jscheffl).
potiuk added a commit that referenced this pull request Jun 3, 2026
* Prepare provider documentation 2026-06-02
* Address review feedback on provider changelogs
- amazon: move S3 transfer-operators fix (#67378, vincbeck) and EcsRunTaskOperator
log-level fix (#67180, jscheffl) from Features to Bug Fixes; beautify the
EksPodOperator entry (#65335).
- google: beautify the idle/auto-stop TTL entry (#65653) — drop conventional-commit prefix.
- openlineage: beautify the ProcessPoolExecutor self-heal entry (#67400).
- edge3: reword the 3.8.0 note — the provider still supports Airflow 3.0+, only the
execute-callback feature (#67679) needs 3.3+ (jscheffl); move the Swagger API docs
entry (#67390) to Doc-only; beautify the team_name clarification (#66718).
- apache/drill: move the flit.sdist housekeeping entry (#65861) to the excluded block
to match the kafka convention (jscheffl).
* Make apache/drill 3.3.3 a doc-only release
The only non-excluded drill change in this wave was the flit.sdist housekeeping
entry, which jscheffl asked to exclude — leaving an empty changelog. Promote the
DAG-to-Dag wording change (#66153) into a Doc-only section so drill 3.3.3 ships as
a legitimate doc-only release instead of an empty one.
* Fold post-prep provider commits into changelogs
Incremental-update pass for commits that landed on main after this wave was prepared:
- amazon: Propogate verify/botocore_config in redshift cluster triggers (#67876) → Features
(mirrors the batch-triggers entry #67508).
- databricks: Lock in workflow depends_on parent-key behavior (#66681) → Bug Fixes.
- edge3: Fix Edge worker fork mode reporting supervisor failures as success (#67887) → Bug Fixes.
- google: Migrate Stackdriver logging config to RemoteLogIO pattern (#66513) → Misc.
@vatsrahul1001vatsrahul1001 added this to the Airflow 3.3.0 milestone Jun 15, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@jscheffl@potiuk@kaxil@bugraoz93@shahar1@vincbeck@vatsrahul1001