feat: add pyi attributes/fields, original source fields - #2538

Merged
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources
Dec 31, 2024
Merged

feat: add pyi attributes/fields, original source fields#2538
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources

Conversation

@rickeylev

@rickeylevrickeylev commented Dec 27, 2024

Copy link
Copy Markdown
Collaborator

This adds attributes and fields of use to static analysis.

For type definition files (usually .pyi files), the pyi_srcs and pyi_deps
fields are added to the rules. They end up in the PyInfo fields direct_pyi_files
and transitive_pyi_files.

So that static analysis tools can retain access to a target's Python source files,
even if precompiling is enabled, direct_original_sources and
transitive_original_sources fields are added to PyInfo.

Work towards #2537, #296

@rickeylev
rickeylevforce-pushed the feat.orig.sources branch 4 times, most recently from 150941c to 4a4475aCompareDecember 27, 2024 07:07
@rickeylev
rickeylev marked this pull request as ready for review December 27, 2024 07:22
@rickeylevrickeylev changed the title feat: add PyInfo fields for storing original sources of a targetfeat: add PyInfo fields for original sources and pyi of a targetDec 29, 2024
@rickeylevrickeylev changed the title feat: add PyInfo fields for original sources and pyi of a targetfeat: add pyi attributes/fields, original source fieldsDec 29, 2024

@aignasaignas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Gazelle support can come in a later PR.

FYI @ewianda, @dougthor42.


These are dependencies that satisfy imports guarded by `typing.TYPE_CHECKING`.
These are build-time only dependencies and not included as part of a runnable
program (packaging rules may include them, however).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Gazelle has a feature that populates the deps or data field for the pyi packages that one may have in the requirement file. I am not sure how big of a lift it is to accommodate for that but it raises some questions.

  1. What happens if pyi sources propagate through deps vs pyi_deps.
  2. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

@aignas
aignas added this pull request to the merge queueDec 31, 2024
Merged via the queue into bazel-contrib:main with commit c8346f9Dec 31, 2024
@rickeylev

Copy link
Copy Markdown
CollaboratorAuthor
  1. What happens if pyi sources propagate through deps vs pyi_deps.

The deps attribute will try to include things into the final output for runtime. The pyi_deps attribute won't.

Given a target with only pyi files (i.e it only has things for build time, nothing for runtime), it doesn't matter much if something is put into deps or pyi_deps.

Given a target with e.g. both py and pyi files (i.e it has things for build time and things for runtime), putting it in pyi_deps means none of it will end up in the final output. This is useful if a source file has something guarded by typing.TYPE_CHECKING (the type checker needs the additional dependencies, but the runtime doesn't). Putting it in the deps attribute means the py files will be included in the final output (like normal), and the pyi files won't.

  1. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

It'll be fetched, but it won't cause any actions to actually run. The analysis phase will need to resolve the target, but (assuming there is no type checker using the pyi files) none of the files/actions will be executed.

@rickeylev
rickeylev deleted the feat.orig.sources branch December 31, 2024 23:25
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 12, 2025
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 13, 2025
CheckmkCI pushed a commit to Checkmk/checkmk that referenced this pull request Feb 13, 2025
Introduced in rules_python 1.0.
See:
* https://github.com/bazelbuild/rules_python/releases/tag/1.1.0
* bazel-contrib/rules_python#2538
CMK-20994
Change-Id: I22b07e6d9711bfe50670c1498a886efb15f020ac
apalmer-theorem pushed a commit to bazel-contrib/rules_mypy that referenced this pull request Feb 13, 2025
github-merge-queueBot pushed a commit that referenced this pull request Mar 6, 2025
1.1.0 introduced separate attributes for the type definitions (`.pyi`
files) and type checking. This patch adds those files to the wheel to
ensure that they are distributed and available to users.
#2538 introduced
`pyi_srcs`.
---------
Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com>
github-merge-queueBot pushed a commit that referenced this pull request Jun 26, 2025
#2538 added the
attribute `pyi_deps` to python rules, intended to be used for
dependencies that are only used for type-checking purposes. This PR adds
a new directive, `gazelle:python_generate_pyi_deps`, which, when
enabled:
- When a dependency is added only to satisfy type-checking only imports
(in a `if TYPE_CHECKING:` block), the dependency is added to `pyi_deps`
instead of `deps`;
- Third-party stub packages (eg. `boto3-stubs`) are now added to
`pyi_deps` instead of `deps`.
---------
Co-authored-by: Douglas Thor <dougthor42@users.noreply.github.com>
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.

2 participants

@rickeylev@aignas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: add pyi attributes/fields, original source fields - #2538

Merged
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources
Dec 31, 2024
Merged

feat: add pyi attributes/fields, original source fields#2538
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources

Conversation

@rickeylev

@rickeylevrickeylev commented Dec 27, 2024

Copy link
Copy Markdown
Collaborator

This adds attributes and fields of use to static analysis.

For type definition files (usually .pyi files), the pyi_srcs and pyi_deps
fields are added to the rules. They end up in the PyInfo fields direct_pyi_files
and transitive_pyi_files.

So that static analysis tools can retain access to a target's Python source files,
even if precompiling is enabled, direct_original_sources and
transitive_original_sources fields are added to PyInfo.

Work towards #2537, #296

@rickeylev
rickeylevforce-pushed the feat.orig.sources branch 4 times, most recently from 150941c to 4a4475aCompareDecember 27, 2024 07:07
@rickeylev
rickeylev marked this pull request as ready for review December 27, 2024 07:22
@rickeylevrickeylev changed the title feat: add PyInfo fields for storing original sources of a targetfeat: add PyInfo fields for original sources and pyi of a targetDec 29, 2024
@rickeylevrickeylev changed the title feat: add PyInfo fields for original sources and pyi of a targetfeat: add pyi attributes/fields, original source fieldsDec 29, 2024

@aignasaignas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Gazelle support can come in a later PR.

FYI @ewianda, @dougthor42.


These are dependencies that satisfy imports guarded by `typing.TYPE_CHECKING`.
These are build-time only dependencies and not included as part of a runnable
program (packaging rules may include them, however).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Gazelle has a feature that populates the deps or data field for the pyi packages that one may have in the requirement file. I am not sure how big of a lift it is to accommodate for that but it raises some questions.

  1. What happens if pyi sources propagate through deps vs pyi_deps.
  2. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

@aignas
aignas added this pull request to the merge queueDec 31, 2024
Merged via the queue into bazel-contrib:main with commit c8346f9Dec 31, 2024
@rickeylev

Copy link
Copy Markdown
CollaboratorAuthor
  1. What happens if pyi sources propagate through deps vs pyi_deps.

The deps attribute will try to include things into the final output for runtime. The pyi_deps attribute won't.

Given a target with only pyi files (i.e it only has things for build time, nothing for runtime), it doesn't matter much if something is put into deps or pyi_deps.

Given a target with e.g. both py and pyi files (i.e it has things for build time and things for runtime), putting it in pyi_deps means none of it will end up in the final output. This is useful if a source file has something guarded by typing.TYPE_CHECKING (the type checker needs the additional dependencies, but the runtime doesn't). Putting it in the deps attribute means the py files will be included in the final output (like normal), and the pyi files won't.

  1. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

It'll be fetched, but it won't cause any actions to actually run. The analysis phase will need to resolve the target, but (assuming there is no type checker using the pyi files) none of the files/actions will be executed.

@rickeylev
rickeylev deleted the feat.orig.sources branch December 31, 2024 23:25
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 12, 2025
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 13, 2025
CheckmkCI pushed a commit to Checkmk/checkmk that referenced this pull request Feb 13, 2025
Introduced in rules_python 1.0.
See:
* https://github.com/bazelbuild/rules_python/releases/tag/1.1.0
* bazel-contrib/rules_python#2538
CMK-20994
Change-Id: I22b07e6d9711bfe50670c1498a886efb15f020ac
apalmer-theorem pushed a commit to bazel-contrib/rules_mypy that referenced this pull request Feb 13, 2025
github-merge-queueBot pushed a commit that referenced this pull request Mar 6, 2025
1.1.0 introduced separate attributes for the type definitions (`.pyi`
files) and type checking. This patch adds those files to the wheel to
ensure that they are distributed and available to users.
#2538 introduced
`pyi_srcs`.
---------
Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com>
github-merge-queueBot pushed a commit that referenced this pull request Jun 26, 2025
#2538 added the
attribute `pyi_deps` to python rules, intended to be used for
dependencies that are only used for type-checking purposes. This PR adds
a new directive, `gazelle:python_generate_pyi_deps`, which, when
enabled:
- When a dependency is added only to satisfy type-checking only imports
(in a `if TYPE_CHECKING:` block), the dependency is added to `pyi_deps`
instead of `deps`;
- Third-party stub packages (eg. `boto3-stubs`) are now added to
`pyi_deps` instead of `deps`.
---------
Co-authored-by: Douglas Thor <dougthor42@users.noreply.github.com>
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.

2 participants

@rickeylev@aignas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add pyi attributes/fields, original source fields - #2538

Merged
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources
Dec 31, 2024
Merged

feat: add pyi attributes/fields, original source fields#2538
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources

Conversation

@rickeylev

@rickeylevrickeylev commented Dec 27, 2024

Copy link
Copy Markdown
Collaborator

This adds attributes and fields of use to static analysis.

For type definition files (usually .pyi files), the pyi_srcs and pyi_deps
fields are added to the rules. They end up in the PyInfo fields direct_pyi_files
and transitive_pyi_files.

So that static analysis tools can retain access to a target's Python source files,
even if precompiling is enabled, direct_original_sources and
transitive_original_sources fields are added to PyInfo.

Work towards #2537, #296

@rickeylev
rickeylevforce-pushed the feat.orig.sources branch 4 times, most recently from 150941c to 4a4475aCompareDecember 27, 2024 07:07
@rickeylev
rickeylev marked this pull request as ready for review December 27, 2024 07:22
@rickeylevrickeylev changed the title feat: add PyInfo fields for storing original sources of a targetfeat: add PyInfo fields for original sources and pyi of a targetDec 29, 2024
@rickeylevrickeylev changed the title feat: add PyInfo fields for original sources and pyi of a targetfeat: add pyi attributes/fields, original source fieldsDec 29, 2024

@aignasaignas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Gazelle support can come in a later PR.

FYI @ewianda, @dougthor42.


These are dependencies that satisfy imports guarded by `typing.TYPE_CHECKING`.
These are build-time only dependencies and not included as part of a runnable
program (packaging rules may include them, however).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Gazelle has a feature that populates the deps or data field for the pyi packages that one may have in the requirement file. I am not sure how big of a lift it is to accommodate for that but it raises some questions.

  1. What happens if pyi sources propagate through deps vs pyi_deps.
  2. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

@aignas
aignas added this pull request to the merge queueDec 31, 2024
Merged via the queue into bazel-contrib:main with commit c8346f9Dec 31, 2024
@rickeylev

Copy link
Copy Markdown
CollaboratorAuthor
  1. What happens if pyi sources propagate through deps vs pyi_deps.

The deps attribute will try to include things into the final output for runtime. The pyi_deps attribute won't.

Given a target with only pyi files (i.e it only has things for build time, nothing for runtime), it doesn't matter much if something is put into deps or pyi_deps.

Given a target with e.g. both py and pyi files (i.e it has things for build time and things for runtime), putting it in pyi_deps means none of it will end up in the final output. This is useful if a source file has something guarded by typing.TYPE_CHECKING (the type checker needs the additional dependencies, but the runtime doesn't). Putting it in the deps attribute means the py files will be included in the final output (like normal), and the pyi files won't.

  1. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

It'll be fetched, but it won't cause any actions to actually run. The analysis phase will need to resolve the target, but (assuming there is no type checker using the pyi files) none of the files/actions will be executed.

@rickeylev
rickeylev deleted the feat.orig.sources branch December 31, 2024 23:25
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 12, 2025
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 13, 2025
CheckmkCI pushed a commit to Checkmk/checkmk that referenced this pull request Feb 13, 2025
Introduced in rules_python 1.0.
See:
* https://github.com/bazelbuild/rules_python/releases/tag/1.1.0
* bazel-contrib/rules_python#2538
CMK-20994
Change-Id: I22b07e6d9711bfe50670c1498a886efb15f020ac
apalmer-theorem pushed a commit to bazel-contrib/rules_mypy that referenced this pull request Feb 13, 2025
github-merge-queueBot pushed a commit that referenced this pull request Mar 6, 2025
1.1.0 introduced separate attributes for the type definitions (`.pyi`
files) and type checking. This patch adds those files to the wheel to
ensure that they are distributed and available to users.
#2538 introduced
`pyi_srcs`.
---------
Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com>
github-merge-queueBot pushed a commit that referenced this pull request Jun 26, 2025
#2538 added the
attribute `pyi_deps` to python rules, intended to be used for
dependencies that are only used for type-checking purposes. This PR adds
a new directive, `gazelle:python_generate_pyi_deps`, which, when
enabled:
- When a dependency is added only to satisfy type-checking only imports
(in a `if TYPE_CHECKING:` block), the dependency is added to `pyi_deps`
instead of `deps`;
- Third-party stub packages (eg. `boto3-stubs`) are now added to
`pyi_deps` instead of `deps`.
---------
Co-authored-by: Douglas Thor <dougthor42@users.noreply.github.com>
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.

2 participants

@rickeylev@aignas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add pyi attributes/fields, original source fields - #2538

Merged
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources
Dec 31, 2024
Merged

feat: add pyi attributes/fields, original source fields#2538
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources

Conversation

@rickeylev

@rickeylevrickeylev commented Dec 27, 2024

Copy link
Copy Markdown
Collaborator

This adds attributes and fields of use to static analysis.

For type definition files (usually .pyi files), the pyi_srcs and pyi_deps
fields are added to the rules. They end up in the PyInfo fields direct_pyi_files
and transitive_pyi_files.

So that static analysis tools can retain access to a target's Python source files,
even if precompiling is enabled, direct_original_sources and
transitive_original_sources fields are added to PyInfo.

Work towards #2537, #296

@rickeylev
rickeylevforce-pushed the feat.orig.sources branch 4 times, most recently from 150941c to 4a4475aCompareDecember 27, 2024 07:07
@rickeylev
rickeylev marked this pull request as ready for review December 27, 2024 07:22
@rickeylevrickeylev changed the title feat: add PyInfo fields for storing original sources of a targetfeat: add PyInfo fields for original sources and pyi of a targetDec 29, 2024
@rickeylevrickeylev changed the title feat: add PyInfo fields for original sources and pyi of a targetfeat: add pyi attributes/fields, original source fieldsDec 29, 2024

@aignasaignas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Gazelle support can come in a later PR.

FYI @ewianda, @dougthor42.


These are dependencies that satisfy imports guarded by `typing.TYPE_CHECKING`.
These are build-time only dependencies and not included as part of a runnable
program (packaging rules may include them, however).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Gazelle has a feature that populates the deps or data field for the pyi packages that one may have in the requirement file. I am not sure how big of a lift it is to accommodate for that but it raises some questions.

  1. What happens if pyi sources propagate through deps vs pyi_deps.
  2. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

@aignas
aignas added this pull request to the merge queueDec 31, 2024
Merged via the queue into bazel-contrib:main with commit c8346f9Dec 31, 2024
@rickeylev

Copy link
Copy Markdown
CollaboratorAuthor
  1. What happens if pyi sources propagate through deps vs pyi_deps.

The deps attribute will try to include things into the final output for runtime. The pyi_deps attribute won't.

Given a target with only pyi files (i.e it only has things for build time, nothing for runtime), it doesn't matter much if something is put into deps or pyi_deps.

Given a target with e.g. both py and pyi files (i.e it has things for build time and things for runtime), putting it in pyi_deps means none of it will end up in the final output. This is useful if a source file has something guarded by typing.TYPE_CHECKING (the type checker needs the additional dependencies, but the runtime doesn't). Putting it in the deps attribute means the py files will be included in the final output (like normal), and the pyi files won't.

  1. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

It'll be fetched, but it won't cause any actions to actually run. The analysis phase will need to resolve the target, but (assuming there is no type checker using the pyi files) none of the files/actions will be executed.

@rickeylev
rickeylev deleted the feat.orig.sources branch December 31, 2024 23:25
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 12, 2025
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 13, 2025
CheckmkCI pushed a commit to Checkmk/checkmk that referenced this pull request Feb 13, 2025
Introduced in rules_python 1.0.
See:
* https://github.com/bazelbuild/rules_python/releases/tag/1.1.0
* bazel-contrib/rules_python#2538
CMK-20994
Change-Id: I22b07e6d9711bfe50670c1498a886efb15f020ac
apalmer-theorem pushed a commit to bazel-contrib/rules_mypy that referenced this pull request Feb 13, 2025
github-merge-queueBot pushed a commit that referenced this pull request Mar 6, 2025
1.1.0 introduced separate attributes for the type definitions (`.pyi`
files) and type checking. This patch adds those files to the wheel to
ensure that they are distributed and available to users.
#2538 introduced
`pyi_srcs`.
---------
Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com>
github-merge-queueBot pushed a commit that referenced this pull request Jun 26, 2025
#2538 added the
attribute `pyi_deps` to python rules, intended to be used for
dependencies that are only used for type-checking purposes. This PR adds
a new directive, `gazelle:python_generate_pyi_deps`, which, when
enabled:
- When a dependency is added only to satisfy type-checking only imports
(in a `if TYPE_CHECKING:` block), the dependency is added to `pyi_deps`
instead of `deps`;
- Third-party stub packages (eg. `boto3-stubs`) are now added to
`pyi_deps` instead of `deps`.
---------
Co-authored-by: Douglas Thor <dougthor42@users.noreply.github.com>
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.

2 participants

@rickeylev@aignas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: add pyi attributes/fields, original source fields - #2538

Merged
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources
Dec 31, 2024
Merged

feat: add pyi attributes/fields, original source fields#2538
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources

Conversation

@rickeylev

@rickeylevrickeylev commented Dec 27, 2024

Copy link
Copy Markdown
Collaborator

This adds attributes and fields of use to static analysis.

For type definition files (usually .pyi files), the pyi_srcs and pyi_deps
fields are added to the rules. They end up in the PyInfo fields direct_pyi_files
and transitive_pyi_files.

So that static analysis tools can retain access to a target's Python source files,
even if precompiling is enabled, direct_original_sources and
transitive_original_sources fields are added to PyInfo.

Work towards #2537, #296

@rickeylev
rickeylevforce-pushed the feat.orig.sources branch 4 times, most recently from 150941c to 4a4475aCompareDecember 27, 2024 07:07
@rickeylev
rickeylev marked this pull request as ready for review December 27, 2024 07:22
@rickeylevrickeylev changed the title feat: add PyInfo fields for storing original sources of a targetfeat: add PyInfo fields for original sources and pyi of a targetDec 29, 2024
@rickeylevrickeylev changed the title feat: add PyInfo fields for original sources and pyi of a targetfeat: add pyi attributes/fields, original source fieldsDec 29, 2024

@aignasaignas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Gazelle support can come in a later PR.

FYI @ewianda, @dougthor42.


These are dependencies that satisfy imports guarded by `typing.TYPE_CHECKING`.
These are build-time only dependencies and not included as part of a runnable
program (packaging rules may include them, however).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Gazelle has a feature that populates the deps or data field for the pyi packages that one may have in the requirement file. I am not sure how big of a lift it is to accommodate for that but it raises some questions.

  1. What happens if pyi sources propagate through deps vs pyi_deps.
  2. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

@aignas
aignas added this pull request to the merge queueDec 31, 2024
Merged via the queue into bazel-contrib:main with commit c8346f9Dec 31, 2024
@rickeylev

Copy link
Copy Markdown
CollaboratorAuthor
  1. What happens if pyi sources propagate through deps vs pyi_deps.

The deps attribute will try to include things into the final output for runtime. The pyi_deps attribute won't.

Given a target with only pyi files (i.e it only has things for build time, nothing for runtime), it doesn't matter much if something is put into deps or pyi_deps.

Given a target with e.g. both py and pyi files (i.e it has things for build time and things for runtime), putting it in pyi_deps means none of it will end up in the final output. This is useful if a source file has something guarded by typing.TYPE_CHECKING (the type checker needs the additional dependencies, but the runtime doesn't). Putting it in the deps attribute means the py files will be included in the final output (like normal), and the pyi files won't.

  1. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

It'll be fetched, but it won't cause any actions to actually run. The analysis phase will need to resolve the target, but (assuming there is no type checker using the pyi files) none of the files/actions will be executed.

@rickeylev
rickeylev deleted the feat.orig.sources branch December 31, 2024 23:25
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 12, 2025
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 13, 2025
CheckmkCI pushed a commit to Checkmk/checkmk that referenced this pull request Feb 13, 2025
Introduced in rules_python 1.0.
See:
* https://github.com/bazelbuild/rules_python/releases/tag/1.1.0
* bazel-contrib/rules_python#2538
CMK-20994
Change-Id: I22b07e6d9711bfe50670c1498a886efb15f020ac
apalmer-theorem pushed a commit to bazel-contrib/rules_mypy that referenced this pull request Feb 13, 2025
github-merge-queueBot pushed a commit that referenced this pull request Mar 6, 2025
1.1.0 introduced separate attributes for the type definitions (`.pyi`
files) and type checking. This patch adds those files to the wheel to
ensure that they are distributed and available to users.
#2538 introduced
`pyi_srcs`.
---------
Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com>
github-merge-queueBot pushed a commit that referenced this pull request Jun 26, 2025
#2538 added the
attribute `pyi_deps` to python rules, intended to be used for
dependencies that are only used for type-checking purposes. This PR adds
a new directive, `gazelle:python_generate_pyi_deps`, which, when
enabled:
- When a dependency is added only to satisfy type-checking only imports
(in a `if TYPE_CHECKING:` block), the dependency is added to `pyi_deps`
instead of `deps`;
- Third-party stub packages (eg. `boto3-stubs`) are now added to
`pyi_deps` instead of `deps`.
---------
Co-authored-by: Douglas Thor <dougthor42@users.noreply.github.com>
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.

2 participants

@rickeylev@aignas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add pyi attributes/fields, original source fields - #2538

Merged
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources
Dec 31, 2024
Merged

feat: add pyi attributes/fields, original source fields#2538
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources

Conversation

@rickeylev

@rickeylevrickeylev commented Dec 27, 2024

Copy link
Copy Markdown
Collaborator

This adds attributes and fields of use to static analysis.

For type definition files (usually .pyi files), the pyi_srcs and pyi_deps
fields are added to the rules. They end up in the PyInfo fields direct_pyi_files
and transitive_pyi_files.

So that static analysis tools can retain access to a target's Python source files,
even if precompiling is enabled, direct_original_sources and
transitive_original_sources fields are added to PyInfo.

Work towards #2537, #296

@rickeylev
rickeylevforce-pushed the feat.orig.sources branch 4 times, most recently from 150941c to 4a4475aCompareDecember 27, 2024 07:07
@rickeylev
rickeylev marked this pull request as ready for review December 27, 2024 07:22
@rickeylevrickeylev changed the title feat: add PyInfo fields for storing original sources of a targetfeat: add PyInfo fields for original sources and pyi of a targetDec 29, 2024
@rickeylevrickeylev changed the title feat: add PyInfo fields for original sources and pyi of a targetfeat: add pyi attributes/fields, original source fieldsDec 29, 2024

@aignasaignas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Gazelle support can come in a later PR.

FYI @ewianda, @dougthor42.


These are dependencies that satisfy imports guarded by `typing.TYPE_CHECKING`.
These are build-time only dependencies and not included as part of a runnable
program (packaging rules may include them, however).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Gazelle has a feature that populates the deps or data field for the pyi packages that one may have in the requirement file. I am not sure how big of a lift it is to accommodate for that but it raises some questions.

  1. What happens if pyi sources propagate through deps vs pyi_deps.
  2. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

@aignas
aignas added this pull request to the merge queueDec 31, 2024
Merged via the queue into bazel-contrib:main with commit c8346f9Dec 31, 2024
@rickeylev

Copy link
Copy Markdown
CollaboratorAuthor
  1. What happens if pyi sources propagate through deps vs pyi_deps.

The deps attribute will try to include things into the final output for runtime. The pyi_deps attribute won't.

Given a target with only pyi files (i.e it only has things for build time, nothing for runtime), it doesn't matter much if something is put into deps or pyi_deps.

Given a target with e.g. both py and pyi files (i.e it has things for build time and things for runtime), putting it in pyi_deps means none of it will end up in the final output. This is useful if a source file has something guarded by typing.TYPE_CHECKING (the type checker needs the additional dependencies, but the runtime doesn't). Putting it in the deps attribute means the py files will be included in the final output (like normal), and the pyi files won't.

  1. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

It'll be fetched, but it won't cause any actions to actually run. The analysis phase will need to resolve the target, but (assuming there is no type checker using the pyi files) none of the files/actions will be executed.

@rickeylev
rickeylev deleted the feat.orig.sources branch December 31, 2024 23:25
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 12, 2025
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 13, 2025
CheckmkCI pushed a commit to Checkmk/checkmk that referenced this pull request Feb 13, 2025
Introduced in rules_python 1.0.
See:
* https://github.com/bazelbuild/rules_python/releases/tag/1.1.0
* bazel-contrib/rules_python#2538
CMK-20994
Change-Id: I22b07e6d9711bfe50670c1498a886efb15f020ac
apalmer-theorem pushed a commit to bazel-contrib/rules_mypy that referenced this pull request Feb 13, 2025
github-merge-queueBot pushed a commit that referenced this pull request Mar 6, 2025
1.1.0 introduced separate attributes for the type definitions (`.pyi`
files) and type checking. This patch adds those files to the wheel to
ensure that they are distributed and available to users.
#2538 introduced
`pyi_srcs`.
---------
Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com>
github-merge-queueBot pushed a commit that referenced this pull request Jun 26, 2025
#2538 added the
attribute `pyi_deps` to python rules, intended to be used for
dependencies that are only used for type-checking purposes. This PR adds
a new directive, `gazelle:python_generate_pyi_deps`, which, when
enabled:
- When a dependency is added only to satisfy type-checking only imports
(in a `if TYPE_CHECKING:` block), the dependency is added to `pyi_deps`
instead of `deps`;
- Third-party stub packages (eg. `boto3-stubs`) are now added to
`pyi_deps` instead of `deps`.
---------
Co-authored-by: Douglas Thor <dougthor42@users.noreply.github.com>
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.

2 participants

@rickeylev@aignas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add pyi attributes/fields, original source fields - #2538

Merged
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources
Dec 31, 2024
Merged

feat: add pyi attributes/fields, original source fields#2538
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources

Conversation

@rickeylev

@rickeylevrickeylev commented Dec 27, 2024

Copy link
Copy Markdown
Collaborator

This adds attributes and fields of use to static analysis.

For type definition files (usually .pyi files), the pyi_srcs and pyi_deps
fields are added to the rules. They end up in the PyInfo fields direct_pyi_files
and transitive_pyi_files.

So that static analysis tools can retain access to a target's Python source files,
even if precompiling is enabled, direct_original_sources and
transitive_original_sources fields are added to PyInfo.

Work towards #2537, #296

@rickeylev
rickeylevforce-pushed the feat.orig.sources branch 4 times, most recently from 150941c to 4a4475aCompareDecember 27, 2024 07:07
@rickeylev
rickeylev marked this pull request as ready for review December 27, 2024 07:22
@rickeylevrickeylev changed the title feat: add PyInfo fields for storing original sources of a targetfeat: add PyInfo fields for original sources and pyi of a targetDec 29, 2024
@rickeylevrickeylev changed the title feat: add PyInfo fields for original sources and pyi of a targetfeat: add pyi attributes/fields, original source fieldsDec 29, 2024

@aignasaignas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Gazelle support can come in a later PR.

FYI @ewianda, @dougthor42.


These are dependencies that satisfy imports guarded by `typing.TYPE_CHECKING`.
These are build-time only dependencies and not included as part of a runnable
program (packaging rules may include them, however).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Gazelle has a feature that populates the deps or data field for the pyi packages that one may have in the requirement file. I am not sure how big of a lift it is to accommodate for that but it raises some questions.

  1. What happens if pyi sources propagate through deps vs pyi_deps.
  2. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

@aignas
aignas added this pull request to the merge queueDec 31, 2024
Merged via the queue into bazel-contrib:main with commit c8346f9Dec 31, 2024
@rickeylev

Copy link
Copy Markdown
CollaboratorAuthor
  1. What happens if pyi sources propagate through deps vs pyi_deps.

The deps attribute will try to include things into the final output for runtime. The pyi_deps attribute won't.

Given a target with only pyi files (i.e it only has things for build time, nothing for runtime), it doesn't matter much if something is put into deps or pyi_deps.

Given a target with e.g. both py and pyi files (i.e it has things for build time and things for runtime), putting it in pyi_deps means none of it will end up in the final output. This is useful if a source file has something guarded by typing.TYPE_CHECKING (the type checker needs the additional dependencies, but the runtime doesn't). Putting it in the deps attribute means the py files will be included in the final output (like normal), and the pyi files won't.

  1. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

It'll be fetched, but it won't cause any actions to actually run. The analysis phase will need to resolve the target, but (assuming there is no type checker using the pyi files) none of the files/actions will be executed.

@rickeylev
rickeylev deleted the feat.orig.sources branch December 31, 2024 23:25
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 12, 2025
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 13, 2025
CheckmkCI pushed a commit to Checkmk/checkmk that referenced this pull request Feb 13, 2025
Introduced in rules_python 1.0.
See:
* https://github.com/bazelbuild/rules_python/releases/tag/1.1.0
* bazel-contrib/rules_python#2538
CMK-20994
Change-Id: I22b07e6d9711bfe50670c1498a886efb15f020ac
apalmer-theorem pushed a commit to bazel-contrib/rules_mypy that referenced this pull request Feb 13, 2025
github-merge-queueBot pushed a commit that referenced this pull request Mar 6, 2025
1.1.0 introduced separate attributes for the type definitions (`.pyi`
files) and type checking. This patch adds those files to the wheel to
ensure that they are distributed and available to users.
#2538 introduced
`pyi_srcs`.
---------
Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com>
github-merge-queueBot pushed a commit that referenced this pull request Jun 26, 2025
#2538 added the
attribute `pyi_deps` to python rules, intended to be used for
dependencies that are only used for type-checking purposes. This PR adds
a new directive, `gazelle:python_generate_pyi_deps`, which, when
enabled:
- When a dependency is added only to satisfy type-checking only imports
(in a `if TYPE_CHECKING:` block), the dependency is added to `pyi_deps`
instead of `deps`;
- Third-party stub packages (eg. `boto3-stubs`) are now added to
`pyi_deps` instead of `deps`.
---------
Co-authored-by: Douglas Thor <dougthor42@users.noreply.github.com>
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.

2 participants

@rickeylev@aignas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: add pyi attributes/fields, original source fields - #2538

Merged
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources
Dec 31, 2024
Merged

feat: add pyi attributes/fields, original source fields#2538
aignas merged 5 commits into
bazel-contrib:mainfrom
rickeylev:feat.orig.sources

Conversation

@rickeylev

@rickeylevrickeylev commented Dec 27, 2024

Copy link
Copy Markdown
Collaborator

This adds attributes and fields of use to static analysis.

For type definition files (usually .pyi files), the pyi_srcs and pyi_deps
fields are added to the rules. They end up in the PyInfo fields direct_pyi_files
and transitive_pyi_files.

So that static analysis tools can retain access to a target's Python source files,
even if precompiling is enabled, direct_original_sources and
transitive_original_sources fields are added to PyInfo.

Work towards #2537, #296

@rickeylev
rickeylevforce-pushed the feat.orig.sources branch 4 times, most recently from 150941c to 4a4475aCompareDecember 27, 2024 07:07
@rickeylev
rickeylev marked this pull request as ready for review December 27, 2024 07:22
@rickeylevrickeylev changed the title feat: add PyInfo fields for storing original sources of a targetfeat: add PyInfo fields for original sources and pyi of a targetDec 29, 2024
@rickeylevrickeylev changed the title feat: add PyInfo fields for original sources and pyi of a targetfeat: add pyi attributes/fields, original source fieldsDec 29, 2024

@aignasaignas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Gazelle support can come in a later PR.

FYI @ewianda, @dougthor42.


These are dependencies that satisfy imports guarded by `typing.TYPE_CHECKING`.
These are build-time only dependencies and not included as part of a runnable
program (packaging rules may include them, however).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Gazelle has a feature that populates the deps or data field for the pyi packages that one may have in the requirement file. I am not sure how big of a lift it is to accommodate for that but it raises some questions.

  1. What happens if pyi sources propagate through deps vs pyi_deps.
  2. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

@aignas
aignas added this pull request to the merge queueDec 31, 2024
Merged via the queue into bazel-contrib:main with commit c8346f9Dec 31, 2024
@rickeylev

Copy link
Copy Markdown
CollaboratorAuthor
  1. What happens if pyi sources propagate through deps vs pyi_deps.

The deps attribute will try to include things into the final output for runtime. The pyi_deps attribute won't.

Given a target with only pyi files (i.e it only has things for build time, nothing for runtime), it doesn't matter much if something is put into deps or pyi_deps.

Given a target with e.g. both py and pyi files (i.e it has things for build time and things for runtime), putting it in pyi_deps means none of it will end up in the final output. This is useful if a source file has something guarded by typing.TYPE_CHECKING (the type checker needs the additional dependencies, but the runtime doesn't). Putting it in the deps attribute means the py files will be included in the final output (like normal), and the pyi files won't.

  1. Do I understand correctly that the pyi_deps will not be fetched if none of the actions consumes them?

It'll be fetched, but it won't cause any actions to actually run. The analysis phase will need to resolve the target, but (assuming there is no type checker using the pyi files) none of the files/actions will be executed.

@rickeylev
rickeylev deleted the feat.orig.sources branch December 31, 2024 23:25
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 12, 2025
Synss added a commit to Synss/rules_mypy.orig that referenced this pull request Feb 13, 2025
CheckmkCI pushed a commit to Checkmk/checkmk that referenced this pull request Feb 13, 2025
Introduced in rules_python 1.0.
See:
* https://github.com/bazelbuild/rules_python/releases/tag/1.1.0
* bazel-contrib/rules_python#2538
CMK-20994
Change-Id: I22b07e6d9711bfe50670c1498a886efb15f020ac
apalmer-theorem pushed a commit to bazel-contrib/rules_mypy that referenced this pull request Feb 13, 2025
github-merge-queueBot pushed a commit that referenced this pull request Mar 6, 2025
1.1.0 introduced separate attributes for the type definitions (`.pyi`
files) and type checking. This patch adds those files to the wheel to
ensure that they are distributed and available to users.
#2538 introduced
`pyi_srcs`.
---------
Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com>
github-merge-queueBot pushed a commit that referenced this pull request Jun 26, 2025
#2538 added the
attribute `pyi_deps` to python rules, intended to be used for
dependencies that are only used for type-checking purposes. This PR adds
a new directive, `gazelle:python_generate_pyi_deps`, which, when
enabled:
- When a dependency is added only to satisfy type-checking only imports
(in a `if TYPE_CHECKING:` block), the dependency is added to `pyi_deps`
instead of `deps`;
- Third-party stub packages (eg. `boto3-stubs`) are now added to
`pyi_deps` instead of `deps`.
---------
Co-authored-by: Douglas Thor <dougthor42@users.noreply.github.com>
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.

2 participants

@rickeylev@aignas