') + ')', '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); } })(); })(); Add check for break/continue/return in finally blocks by johnslavik · Pull Request #59019 · apache/airflow · GitHub
Skip to content

Add check for break/continue/return in finally blocks - #59019

Closed
johnslavik wants to merge 1 commit into
apache:mainfrom
johnslavik:lint-jumps-in-finally
Closed

Add check for break/continue/return in finally blocks#59019
johnslavik wants to merge 1 commit into
apache:mainfrom
johnslavik:lint-jumps-in-finally

Conversation

@johnslavik

@johnslavikjohnslavik commented Dec 3, 2025

Copy link
Copy Markdown
Contributor

https://docs.astral.sh/ruff/rules/jump-statement-in-finally/

This is a follow up to #58488 (comment), where enabling SIM017 was initially proposed.

This PR, however, enables B012, which is a more general rule that, in addition to return, also catches break and continue in finally blocks -- an exhaustive list of what PEP 765 prohibits.

CC @jscheffl


^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in airflow-core/newsfragments.

@johnslavik

Copy link
Copy Markdown
ContributorAuthor

3 fixes needed -- not bad!

@johnslavik

johnslavik commented Dec 3, 2025

Copy link
Copy Markdown
ContributorAuthor

@jscheffl How would you like this resolved?

I'd fix B012 errors in separate PRs, then merge this one in. Just so that all the changes in different areas are reviewed by proper owners. To track, I'll file 3 to-do issues from this tomorrow.

@jscheffl

Copy link
Copy Markdown
Contributor

Cool! Thanks for the initiative in enabling!

So in total I see (only) 3 errors, would have expected more. 1 of them is fixed with the PR from @AutomationDev85, the second is in a similar area. And the one in Fab should also be easily fixable in my view.

As there is no harm in B012 and actually I agree it is a bad practice I have nothing against it and would rather favor it to enable it as well. But it is valid, there might be other opinions. Therefore we have pull requests! If we wait that the other PR is opened and the other two are fixed (either in this PR or in separate in parallel, then rebase this one...) then we just leave it open for a few days for others to object.
It is not in a complexity that it would require a VOTE on devlist in my view.

@jscheffl

Copy link
Copy Markdown
Contributor

(I'd say similar like I am incrementally enabling all PLW rules in #58116 with parallel PRs...)

@johnslavikjohnslavik closed this by deleting the head repository Dec 4, 2025
@johnslavik

Copy link
Copy Markdown
ContributorAuthor

I've had to delete the head repo -- will reopen this once the lints are fixed. Sorry for the hassle, had to move around stuff.

@potiuk

Copy link
Copy Markdown
Member

Cool find and waiting for reopening. That's an important rule to have.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@johnslavik@jscheffl@potiuk