') + ')', '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); } })(); })(); Fix completion/linting/type checking with VSCode/pyright by ashb · Pull Request #43899 · apache/airflow · GitHub
Skip to content

Fix completion/linting/type checking with VSCode/pyright - #43899

Merged
ashb merged 2 commits into
mainfrom
fix-vscode-ns-packages
Nov 12, 2024
Merged

Fix completion/linting/type checking with VSCode/pyright#43899
ashb merged 2 commits into
mainfrom
fix-vscode-ns-packages

Conversation

@ashb

@ashbashb commented Nov 11, 2024

Copy link
Copy Markdown
Member

Pyright (the type engine powering VSCode's python extension) doesn't treat
airflow as a namespace package because of the airflow/__init__.py and it
doesn't want to/can't support detecting the __path__ = ... method of making
it an explicit namespace package, so we are left with no option but to create
Yet Another Stub File.

Tested by pytting reveal_type(FAB_VERSION); reveal_type(TaskSDKDag) inside
_upgrade_outdated_dag_access_control in airflow/model/dag.py -- before
this change it was reporting both as Unknown.

@ashb

ashb commented Nov 11, 2024

Copy link
Copy Markdown
MemberAuthor

cc @JDarDagran

@JDarDagranJDarDagran left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As for VSCode user with Pylance enabled - it fixed the issue. Thank you a lot @ashb 🚀

@ashb

ashb commented Nov 12, 2024

Copy link
Copy Markdown
MemberAuthor

Okay sadly we can't do this. By creating this empty file pycharm thinks airflow is an empty module.

Okay, think I might have it fixed now.

@ashb
ashbforce-pushed the fix-vscode-ns-packages branch 2 times, most recently from c3c9847 to a8f5231CompareNovember 12, 2024 09:54
Pyright (the type engine powering VSCode's python extension) doesn't treat
`airflow` as a namespace package because of the `airflow/__init__.py` and it
doesn't want to/can't support detecting the `__path__ = ...` method of making
it an explicit namespace package, so we are left with no option but to create
Yet Another Stub File.
Tested by pytting `reveal_type(FAB_VERSION); reveal_type(TaskSDKDag)` inside
`_upgrade_outdated_dag_access_control` in `airflow/model/dag.py` -- before
this change it was reporting both as Unknown.
And to continue to keep Pycharm happy we have to have the `__path__` stanzas
without future annotations in all the "empty" files.
Ugly, but at least it works
@ashb
ashbforce-pushed the fix-vscode-ns-packages branch from a8f5231 to 73eb25bCompareNovember 12, 2024 10:29
@ashb
ashb requested a review from potiuk as a code ownerNovember 12, 2024 11:11
Comment threadDockerfile.ci
# Similarly we need _a_ file for task_sdk too
mkdir -p ./task_sdk/src/airflow/sdk/
touch ./task_sdk/src/airflow/__init__.py
touch ./task_sdk/src/airflow/sdk/__init__.py

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This path was okay before, but since I added exclude = ["src/airflow/__init__.py"] in this PR this path now needs to change.

@amoghrajeshamoghrajesh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pycharm test works as expected as discussed offline. LGTM

@ashb

ashb commented Nov 12, 2024

Copy link
Copy Markdown
MemberAuthor

Static check failure unrelated and will be fixed by #43923

@potiukpotiuk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool. Getting it right with PyCharm, VSCode namespace packages and static checks and CLI seems like an interesting game :)

@ashb
ashb merged commit 86aa5ef into mainNov 12, 2024
@ashb
ashb deleted the fix-vscode-ns-packages branch November 12, 2024 12:09
sunank200 pushed a commit to astronomer/airflow that referenced this pull request Nov 12, 2024
Pyright (the type engine powering VSCode's python extension) doesn't treat
`airflow` as a namespace package because of the `airflow/__init__.py` and it
doesn't want to/can't support detecting the `__path__ = ...` method of making
it an explicit namespace package, so we are left with no option but to create
Yet Another Stub File.
Tested by pytting `reveal_type(FAB_VERSION); reveal_type(TaskSDKDag)` inside
`_upgrade_outdated_dag_access_control` in `airflow/model/dag.py` -- before
this change it was reporting both as Unknown.
And to continue to keep Pycharm happy we have to have the `__path__` stanzas
without future annotations in all the "empty" files.
Ugly, but at least it works
ellisms pushed a commit to ellisms/airflow that referenced this pull request Nov 13, 2024
Pyright (the type engine powering VSCode's python extension) doesn't treat
`airflow` as a namespace package because of the `airflow/__init__.py` and it
doesn't want to/can't support detecting the `__path__ = ...` method of making
it an explicit namespace package, so we are left with no option but to create
Yet Another Stub File.
Tested by pytting `reveal_type(FAB_VERSION); reveal_type(TaskSDKDag)` inside
`_upgrade_outdated_dag_access_control` in `airflow/model/dag.py` -- before
this change it was reporting both as Unknown.
And to continue to keep Pycharm happy we have to have the `__path__` stanzas
without future annotations in all the "empty" files.
Ugly, but at least it works
kaxil added a commit to astronomer/airflow that referenced this pull request Nov 15, 2024
same as Task SDK change in apache#43899 -- but for providers
kaxil added a commit that referenced this pull request Nov 15, 2024
same as Task SDK change in #43899 -- but for providers
kandharvishnu pushed a commit to kandharvishnu/airflow that referenced this pull request Nov 19, 2024
kosteev pushed a commit to GoogleCloudPlatform/composer-airflow that referenced this pull request May 27, 2025
same as Task SDK change in apache/airflow#43899 -- but for providers
GitOrigin-RevId: eed59f1e96f590edcc95327b2874dd95bb8137ca
kosteev pushed a commit to GoogleCloudPlatform/composer-airflow that referenced this pull request Sep 23, 2025
same as Task SDK change in apache/airflow#43899 -- but for providers
GitOrigin-RevId: eed59f1e96f590edcc95327b2874dd95bb8137ca
kosteev pushed a commit to GoogleCloudPlatform/composer-airflow that referenced this pull request Oct 20, 2025
same as Task SDK change in apache/airflow#43899 -- but for providers
GitOrigin-RevId: eed59f1e96f590edcc95327b2874dd95bb8137ca
kosteev pushed a commit to GoogleCloudPlatform/composer-airflow that referenced this pull request Feb 26, 2026
same as Task SDK change in apache/airflow#43899 -- but for providers
GitOrigin-RevId: eed59f1e96f590edcc95327b2874dd95bb8137ca
kosteev pushed a commit to GoogleCloudPlatform/composer-airflow that referenced this pull request Jul 27, 2026
same as Task SDK change in apache/airflow#43899 -- but for providers
GitOrigin-RevId: eed59f1e96f590edcc95327b2874dd95bb8137ca
kosteev pushed a commit to GoogleCloudPlatform/composer-airflow that referenced this pull request Jul 29, 2026
same as Task SDK change in apache/airflow#43899 -- but for providers
GitOrigin-RevId: eed59f1e96f590edcc95327b2874dd95bb8137ca
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.

6 participants

@ashb@potiuk@JDarDagran@kaxil@pierrejeambrun@amoghrajesh