Implement py_proto_library - #832

Merged
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library
Jan 18, 2023
Merged

Implement py_proto_library#832
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library

Conversation

@comius

@comiuscomius commented Sep 20, 2022

Copy link
Copy Markdown
Contributor

py_proto_library was tested manually on Bazel repository using Bazel 6.0.0 with and without using bzlmod.

Extend README.md to mention also py_proto_library.

With bzlmod py_proto_library just works. Users without bzlmod, need to import rules_proto and protobuf repositories into their WORKSPACE file.

py_proto_library is compatible with Bazel >=5.4.0 and >=6.0.0.

@comius

Copy link
Copy Markdown
ContributorAuthor

cc @rickeylev@haberman

Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated

@meteorcloudymeteorcloudy 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.

LGTM, from dependencies management perspective.

Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
@aaliddell

aaliddell commented Sep 21, 2022

Copy link
Copy Markdown
Contributor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

@comius
comiusforce-pushed the add-py_proto_library branch from a7233d3 to 94c2b4bCompareSeptember 21, 2022 08:16
@comius

comius commented Sep 21, 2022

Copy link
Copy Markdown
ContributorAuthor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that you're 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Comment threadproto/python/private/py_proto_library.bzl Outdated
@rickeylev

Copy link
Copy Markdown
Collaborator

https://rules-proto-grpc.com/en/latest/transitivity.html says

In hindsight, [recursive aspect] was not the correct behaviour and led to many bugs, since you may end up creating a library that contains compiled proto files from a third party, where you should instead be depending on a proper library for that third party’s protos.

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

@aaliddell

Copy link
Copy Markdown
Contributor

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

You can email me or put it in a new discussion here; not sure I’ll be much help though with SWIG. Or put it on the bazel-discuss mailing list if you want a wider audience. Or slack. Too many options 😵‍💫

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that your 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Ok, I thought I’d check your weren’t just blindly copying some of the other language rulesets’ behaviour without knowing the implications; seems like you’re on top of it 👍

@rickeylev

Copy link
Copy Markdown
Collaborator

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

@tpudlik

Copy link
Copy Markdown
Collaborator

I just ran into an interesting bug in the unofficial py_proto_library from https://github.com/protocolbuffers/protobuf/: it doesn't respect tags = ["manual"]. No tags are forwarded to the code generation rule, so the code generation runs unconditionally. So I thought I'd confirm: this "official" implementation doesn't suffer from this bug, does it?

@jiawen

Copy link
Copy Markdown

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

@hrfuller

Copy link
Copy Markdown
Contributor

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

@comius
comius marked this pull request as draft December 5, 2022 17:34
@comius
comiusforce-pushed the add-py_proto_library branch from f9b5fff to 8981c4bCompareDecember 5, 2022 17:36
@comius

Copy link
Copy Markdown
ContributorAuthor

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

Yes, this is the implementation. It will work with Bazel 5.3 and Bazel 6. And also without bzlmod.

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

I fixed the PR, so that the users only need to depend on rules_python. And proto repositories are fetched only if you use py_proto_library,

@comius
comiusforce-pushed the add-py_proto_library branch from 8981c4b to 1e24ebbCompareDecember 5, 2022 17:55
@comius
comiusforce-pushed the add-py_proto_library branch from 1e24ebb to 4ab5a5dCompareDecember 30, 2022 06:10
@comius
comius marked this pull request as ready for review December 30, 2022 07:45
@comius

comius commented Dec 30, 2022

Copy link
Copy Markdown
ContributorAuthor

@rickeylev:

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

The PR is now ready.

@aignasaignas mentioned this pull request Jan 3, 2023
12 tasks
@rickeylev
rickeylev merged commit 0d3c4f7 into bazel-contrib:mainJan 18, 2023
@alexeagle

Copy link
Copy Markdown
Contributor

This forgot to update the docs/ folder so that the new stardoc comments are published for users to find.

eed3si9n pushed a commit to eed3si9n/rules_python that referenced this pull request Aug 16, 2023
* Add py_proto_library
* Bump versions of rules_proto and protobuf
* Update documentation
* Bump rules_pkg version
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.

9 participants

@comius@aaliddell@rickeylev@tpudlik@jiawen@hrfuller@alexeagle@meteorcloudy@UebelAndre
, '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

Implement py_proto_library - #832

Merged
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library
Jan 18, 2023
Merged

Implement py_proto_library#832
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library

Conversation

@comius

@comiuscomius commented Sep 20, 2022

Copy link
Copy Markdown
Contributor

py_proto_library was tested manually on Bazel repository using Bazel 6.0.0 with and without using bzlmod.

Extend README.md to mention also py_proto_library.

With bzlmod py_proto_library just works. Users without bzlmod, need to import rules_proto and protobuf repositories into their WORKSPACE file.

py_proto_library is compatible with Bazel >=5.4.0 and >=6.0.0.

@comius

Copy link
Copy Markdown
ContributorAuthor

cc @rickeylev@haberman

Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated

@meteorcloudymeteorcloudy 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.

LGTM, from dependencies management perspective.

Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
@aaliddell

aaliddell commented Sep 21, 2022

Copy link
Copy Markdown
Contributor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

@comius
comiusforce-pushed the add-py_proto_library branch from a7233d3 to 94c2b4bCompareSeptember 21, 2022 08:16
@comius

comius commented Sep 21, 2022

Copy link
Copy Markdown
ContributorAuthor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that you're 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Comment threadproto/python/private/py_proto_library.bzl Outdated
@rickeylev

Copy link
Copy Markdown
Collaborator

https://rules-proto-grpc.com/en/latest/transitivity.html says

In hindsight, [recursive aspect] was not the correct behaviour and led to many bugs, since you may end up creating a library that contains compiled proto files from a third party, where you should instead be depending on a proper library for that third party’s protos.

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

@aaliddell

Copy link
Copy Markdown
Contributor

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

You can email me or put it in a new discussion here; not sure I’ll be much help though with SWIG. Or put it on the bazel-discuss mailing list if you want a wider audience. Or slack. Too many options 😵‍💫

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that your 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Ok, I thought I’d check your weren’t just blindly copying some of the other language rulesets’ behaviour without knowing the implications; seems like you’re on top of it 👍

@rickeylev

Copy link
Copy Markdown
Collaborator

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

@tpudlik

Copy link
Copy Markdown
Collaborator

I just ran into an interesting bug in the unofficial py_proto_library from https://github.com/protocolbuffers/protobuf/: it doesn't respect tags = ["manual"]. No tags are forwarded to the code generation rule, so the code generation runs unconditionally. So I thought I'd confirm: this "official" implementation doesn't suffer from this bug, does it?

@jiawen

Copy link
Copy Markdown

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

@hrfuller

Copy link
Copy Markdown
Contributor

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

@comius
comius marked this pull request as draft December 5, 2022 17:34
@comius
comiusforce-pushed the add-py_proto_library branch from f9b5fff to 8981c4bCompareDecember 5, 2022 17:36
@comius

Copy link
Copy Markdown
ContributorAuthor

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

Yes, this is the implementation. It will work with Bazel 5.3 and Bazel 6. And also without bzlmod.

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

I fixed the PR, so that the users only need to depend on rules_python. And proto repositories are fetched only if you use py_proto_library,

@comius
comiusforce-pushed the add-py_proto_library branch from 8981c4b to 1e24ebbCompareDecember 5, 2022 17:55
@comius
comiusforce-pushed the add-py_proto_library branch from 1e24ebb to 4ab5a5dCompareDecember 30, 2022 06:10
@comius
comius marked this pull request as ready for review December 30, 2022 07:45
@comius

comius commented Dec 30, 2022

Copy link
Copy Markdown
ContributorAuthor

@rickeylev:

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

The PR is now ready.

@aignasaignas mentioned this pull request Jan 3, 2023
12 tasks
@rickeylev
rickeylev merged commit 0d3c4f7 into bazel-contrib:mainJan 18, 2023
@alexeagle

Copy link
Copy Markdown
Contributor

This forgot to update the docs/ folder so that the new stardoc comments are published for users to find.

eed3si9n pushed a commit to eed3si9n/rules_python that referenced this pull request Aug 16, 2023
* Add py_proto_library
* Bump versions of rules_proto and protobuf
* Update documentation
* Bump rules_pkg version
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.

9 participants

@comius@aaliddell@rickeylev@tpudlik@jiawen@hrfuller@alexeagle@meteorcloudy@UebelAndre
, '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

Implement py_proto_library - #832

Merged
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library
Jan 18, 2023
Merged

Implement py_proto_library#832
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library

Conversation

@comius

@comiuscomius commented Sep 20, 2022

Copy link
Copy Markdown
Contributor

py_proto_library was tested manually on Bazel repository using Bazel 6.0.0 with and without using bzlmod.

Extend README.md to mention also py_proto_library.

With bzlmod py_proto_library just works. Users without bzlmod, need to import rules_proto and protobuf repositories into their WORKSPACE file.

py_proto_library is compatible with Bazel >=5.4.0 and >=6.0.0.

@comius

Copy link
Copy Markdown
ContributorAuthor

cc @rickeylev@haberman

Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated

@meteorcloudymeteorcloudy 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.

LGTM, from dependencies management perspective.

Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
@aaliddell

aaliddell commented Sep 21, 2022

Copy link
Copy Markdown
Contributor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

@comius
comiusforce-pushed the add-py_proto_library branch from a7233d3 to 94c2b4bCompareSeptember 21, 2022 08:16
@comius

comius commented Sep 21, 2022

Copy link
Copy Markdown
ContributorAuthor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that you're 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Comment threadproto/python/private/py_proto_library.bzl Outdated
@rickeylev

Copy link
Copy Markdown
Collaborator

https://rules-proto-grpc.com/en/latest/transitivity.html says

In hindsight, [recursive aspect] was not the correct behaviour and led to many bugs, since you may end up creating a library that contains compiled proto files from a third party, where you should instead be depending on a proper library for that third party’s protos.

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

@aaliddell

Copy link
Copy Markdown
Contributor

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

You can email me or put it in a new discussion here; not sure I’ll be much help though with SWIG. Or put it on the bazel-discuss mailing list if you want a wider audience. Or slack. Too many options 😵‍💫

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that your 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Ok, I thought I’d check your weren’t just blindly copying some of the other language rulesets’ behaviour without knowing the implications; seems like you’re on top of it 👍

@rickeylev

Copy link
Copy Markdown
Collaborator

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

@tpudlik

Copy link
Copy Markdown
Collaborator

I just ran into an interesting bug in the unofficial py_proto_library from https://github.com/protocolbuffers/protobuf/: it doesn't respect tags = ["manual"]. No tags are forwarded to the code generation rule, so the code generation runs unconditionally. So I thought I'd confirm: this "official" implementation doesn't suffer from this bug, does it?

@jiawen

Copy link
Copy Markdown

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

@hrfuller

Copy link
Copy Markdown
Contributor

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

@comius
comius marked this pull request as draft December 5, 2022 17:34
@comius
comiusforce-pushed the add-py_proto_library branch from f9b5fff to 8981c4bCompareDecember 5, 2022 17:36
@comius

Copy link
Copy Markdown
ContributorAuthor

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

Yes, this is the implementation. It will work with Bazel 5.3 and Bazel 6. And also without bzlmod.

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

I fixed the PR, so that the users only need to depend on rules_python. And proto repositories are fetched only if you use py_proto_library,

@comius
comiusforce-pushed the add-py_proto_library branch from 8981c4b to 1e24ebbCompareDecember 5, 2022 17:55
@comius
comiusforce-pushed the add-py_proto_library branch from 1e24ebb to 4ab5a5dCompareDecember 30, 2022 06:10
@comius
comius marked this pull request as ready for review December 30, 2022 07:45
@comius

comius commented Dec 30, 2022

Copy link
Copy Markdown
ContributorAuthor

@rickeylev:

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

The PR is now ready.

@aignasaignas mentioned this pull request Jan 3, 2023
12 tasks
@rickeylev
rickeylev merged commit 0d3c4f7 into bazel-contrib:mainJan 18, 2023
@alexeagle

Copy link
Copy Markdown
Contributor

This forgot to update the docs/ folder so that the new stardoc comments are published for users to find.

eed3si9n pushed a commit to eed3si9n/rules_python that referenced this pull request Aug 16, 2023
* Add py_proto_library
* Bump versions of rules_proto and protobuf
* Update documentation
* Bump rules_pkg version
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.

9 participants

@comius@aaliddell@rickeylev@tpudlik@jiawen@hrfuller@alexeagle@meteorcloudy@UebelAndre
, '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

Implement py_proto_library - #832

Merged
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library
Jan 18, 2023
Merged

Implement py_proto_library#832
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library

Conversation

@comius

@comiuscomius commented Sep 20, 2022

Copy link
Copy Markdown
Contributor

py_proto_library was tested manually on Bazel repository using Bazel 6.0.0 with and without using bzlmod.

Extend README.md to mention also py_proto_library.

With bzlmod py_proto_library just works. Users without bzlmod, need to import rules_proto and protobuf repositories into their WORKSPACE file.

py_proto_library is compatible with Bazel >=5.4.0 and >=6.0.0.

@comius

Copy link
Copy Markdown
ContributorAuthor

cc @rickeylev@haberman

Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated

@meteorcloudymeteorcloudy 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.

LGTM, from dependencies management perspective.

Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
@aaliddell

aaliddell commented Sep 21, 2022

Copy link
Copy Markdown
Contributor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

@comius
comiusforce-pushed the add-py_proto_library branch from a7233d3 to 94c2b4bCompareSeptember 21, 2022 08:16
@comius

comius commented Sep 21, 2022

Copy link
Copy Markdown
ContributorAuthor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that you're 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Comment threadproto/python/private/py_proto_library.bzl Outdated
@rickeylev

Copy link
Copy Markdown
Collaborator

https://rules-proto-grpc.com/en/latest/transitivity.html says

In hindsight, [recursive aspect] was not the correct behaviour and led to many bugs, since you may end up creating a library that contains compiled proto files from a third party, where you should instead be depending on a proper library for that third party’s protos.

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

@aaliddell

Copy link
Copy Markdown
Contributor

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

You can email me or put it in a new discussion here; not sure I’ll be much help though with SWIG. Or put it on the bazel-discuss mailing list if you want a wider audience. Or slack. Too many options 😵‍💫

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that your 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Ok, I thought I’d check your weren’t just blindly copying some of the other language rulesets’ behaviour without knowing the implications; seems like you’re on top of it 👍

@rickeylev

Copy link
Copy Markdown
Collaborator

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

@tpudlik

Copy link
Copy Markdown
Collaborator

I just ran into an interesting bug in the unofficial py_proto_library from https://github.com/protocolbuffers/protobuf/: it doesn't respect tags = ["manual"]. No tags are forwarded to the code generation rule, so the code generation runs unconditionally. So I thought I'd confirm: this "official" implementation doesn't suffer from this bug, does it?

@jiawen

Copy link
Copy Markdown

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

@hrfuller

Copy link
Copy Markdown
Contributor

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

@comius
comius marked this pull request as draft December 5, 2022 17:34
@comius
comiusforce-pushed the add-py_proto_library branch from f9b5fff to 8981c4bCompareDecember 5, 2022 17:36
@comius

Copy link
Copy Markdown
ContributorAuthor

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

Yes, this is the implementation. It will work with Bazel 5.3 and Bazel 6. And also without bzlmod.

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

I fixed the PR, so that the users only need to depend on rules_python. And proto repositories are fetched only if you use py_proto_library,

@comius
comiusforce-pushed the add-py_proto_library branch from 8981c4b to 1e24ebbCompareDecember 5, 2022 17:55
@comius
comiusforce-pushed the add-py_proto_library branch from 1e24ebb to 4ab5a5dCompareDecember 30, 2022 06:10
@comius
comius marked this pull request as ready for review December 30, 2022 07:45
@comius

comius commented Dec 30, 2022

Copy link
Copy Markdown
ContributorAuthor

@rickeylev:

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

The PR is now ready.

@aignasaignas mentioned this pull request Jan 3, 2023
12 tasks
@rickeylev
rickeylev merged commit 0d3c4f7 into bazel-contrib:mainJan 18, 2023
@alexeagle

Copy link
Copy Markdown
Contributor

This forgot to update the docs/ folder so that the new stardoc comments are published for users to find.

eed3si9n pushed a commit to eed3si9n/rules_python that referenced this pull request Aug 16, 2023
* Add py_proto_library
* Bump versions of rules_proto and protobuf
* Update documentation
* Bump rules_pkg version
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.

9 participants

@comius@aaliddell@rickeylev@tpudlik@jiawen@hrfuller@alexeagle@meteorcloudy@UebelAndre
, '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

Implement py_proto_library - #832

Merged
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library
Jan 18, 2023
Merged

Implement py_proto_library#832
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library

Conversation

@comius

@comiuscomius commented Sep 20, 2022

Copy link
Copy Markdown
Contributor

py_proto_library was tested manually on Bazel repository using Bazel 6.0.0 with and without using bzlmod.

Extend README.md to mention also py_proto_library.

With bzlmod py_proto_library just works. Users without bzlmod, need to import rules_proto and protobuf repositories into their WORKSPACE file.

py_proto_library is compatible with Bazel >=5.4.0 and >=6.0.0.

@comius

Copy link
Copy Markdown
ContributorAuthor

cc @rickeylev@haberman

Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated

@meteorcloudymeteorcloudy 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.

LGTM, from dependencies management perspective.

Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
@aaliddell

aaliddell commented Sep 21, 2022

Copy link
Copy Markdown
Contributor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

@comius
comiusforce-pushed the add-py_proto_library branch from a7233d3 to 94c2b4bCompareSeptember 21, 2022 08:16
@comius

comius commented Sep 21, 2022

Copy link
Copy Markdown
ContributorAuthor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that you're 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Comment threadproto/python/private/py_proto_library.bzl Outdated
@rickeylev

Copy link
Copy Markdown
Collaborator

https://rules-proto-grpc.com/en/latest/transitivity.html says

In hindsight, [recursive aspect] was not the correct behaviour and led to many bugs, since you may end up creating a library that contains compiled proto files from a third party, where you should instead be depending on a proper library for that third party’s protos.

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

@aaliddell

Copy link
Copy Markdown
Contributor

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

You can email me or put it in a new discussion here; not sure I’ll be much help though with SWIG. Or put it on the bazel-discuss mailing list if you want a wider audience. Or slack. Too many options 😵‍💫

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that your 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Ok, I thought I’d check your weren’t just blindly copying some of the other language rulesets’ behaviour without knowing the implications; seems like you’re on top of it 👍

@rickeylev

Copy link
Copy Markdown
Collaborator

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

@tpudlik

Copy link
Copy Markdown
Collaborator

I just ran into an interesting bug in the unofficial py_proto_library from https://github.com/protocolbuffers/protobuf/: it doesn't respect tags = ["manual"]. No tags are forwarded to the code generation rule, so the code generation runs unconditionally. So I thought I'd confirm: this "official" implementation doesn't suffer from this bug, does it?

@jiawen

Copy link
Copy Markdown

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

@hrfuller

Copy link
Copy Markdown
Contributor

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

@comius
comius marked this pull request as draft December 5, 2022 17:34
@comius
comiusforce-pushed the add-py_proto_library branch from f9b5fff to 8981c4bCompareDecember 5, 2022 17:36
@comius

Copy link
Copy Markdown
ContributorAuthor

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

Yes, this is the implementation. It will work with Bazel 5.3 and Bazel 6. And also without bzlmod.

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

I fixed the PR, so that the users only need to depend on rules_python. And proto repositories are fetched only if you use py_proto_library,

@comius
comiusforce-pushed the add-py_proto_library branch from 8981c4b to 1e24ebbCompareDecember 5, 2022 17:55
@comius
comiusforce-pushed the add-py_proto_library branch from 1e24ebb to 4ab5a5dCompareDecember 30, 2022 06:10
@comius
comius marked this pull request as ready for review December 30, 2022 07:45
@comius

comius commented Dec 30, 2022

Copy link
Copy Markdown
ContributorAuthor

@rickeylev:

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

The PR is now ready.

@aignasaignas mentioned this pull request Jan 3, 2023
12 tasks
@rickeylev
rickeylev merged commit 0d3c4f7 into bazel-contrib:mainJan 18, 2023
@alexeagle

Copy link
Copy Markdown
Contributor

This forgot to update the docs/ folder so that the new stardoc comments are published for users to find.

eed3si9n pushed a commit to eed3si9n/rules_python that referenced this pull request Aug 16, 2023
* Add py_proto_library
* Bump versions of rules_proto and protobuf
* Update documentation
* Bump rules_pkg version
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.

9 participants

@comius@aaliddell@rickeylev@tpudlik@jiawen@hrfuller@alexeagle@meteorcloudy@UebelAndre
, '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

Implement py_proto_library - #832

Merged
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library
Jan 18, 2023
Merged

Implement py_proto_library#832
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library

Conversation

@comius

@comiuscomius commented Sep 20, 2022

Copy link
Copy Markdown
Contributor

py_proto_library was tested manually on Bazel repository using Bazel 6.0.0 with and without using bzlmod.

Extend README.md to mention also py_proto_library.

With bzlmod py_proto_library just works. Users without bzlmod, need to import rules_proto and protobuf repositories into their WORKSPACE file.

py_proto_library is compatible with Bazel >=5.4.0 and >=6.0.0.

@comius

Copy link
Copy Markdown
ContributorAuthor

cc @rickeylev@haberman

Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated

@meteorcloudymeteorcloudy 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.

LGTM, from dependencies management perspective.

Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
@aaliddell

aaliddell commented Sep 21, 2022

Copy link
Copy Markdown
Contributor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

@comius
comiusforce-pushed the add-py_proto_library branch from a7233d3 to 94c2b4bCompareSeptember 21, 2022 08:16
@comius

comius commented Sep 21, 2022

Copy link
Copy Markdown
ContributorAuthor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that you're 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Comment threadproto/python/private/py_proto_library.bzl Outdated
@rickeylev

Copy link
Copy Markdown
Collaborator

https://rules-proto-grpc.com/en/latest/transitivity.html says

In hindsight, [recursive aspect] was not the correct behaviour and led to many bugs, since you may end up creating a library that contains compiled proto files from a third party, where you should instead be depending on a proper library for that third party’s protos.

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

@aaliddell

Copy link
Copy Markdown
Contributor

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

You can email me or put it in a new discussion here; not sure I’ll be much help though with SWIG. Or put it on the bazel-discuss mailing list if you want a wider audience. Or slack. Too many options 😵‍💫

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that your 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Ok, I thought I’d check your weren’t just blindly copying some of the other language rulesets’ behaviour without knowing the implications; seems like you’re on top of it 👍

@rickeylev

Copy link
Copy Markdown
Collaborator

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

@tpudlik

Copy link
Copy Markdown
Collaborator

I just ran into an interesting bug in the unofficial py_proto_library from https://github.com/protocolbuffers/protobuf/: it doesn't respect tags = ["manual"]. No tags are forwarded to the code generation rule, so the code generation runs unconditionally. So I thought I'd confirm: this "official" implementation doesn't suffer from this bug, does it?

@jiawen

Copy link
Copy Markdown

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

@hrfuller

Copy link
Copy Markdown
Contributor

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

@comius
comius marked this pull request as draft December 5, 2022 17:34
@comius
comiusforce-pushed the add-py_proto_library branch from f9b5fff to 8981c4bCompareDecember 5, 2022 17:36
@comius

Copy link
Copy Markdown
ContributorAuthor

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

Yes, this is the implementation. It will work with Bazel 5.3 and Bazel 6. And also without bzlmod.

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

I fixed the PR, so that the users only need to depend on rules_python. And proto repositories are fetched only if you use py_proto_library,

@comius
comiusforce-pushed the add-py_proto_library branch from 8981c4b to 1e24ebbCompareDecember 5, 2022 17:55
@comius
comiusforce-pushed the add-py_proto_library branch from 1e24ebb to 4ab5a5dCompareDecember 30, 2022 06:10
@comius
comius marked this pull request as ready for review December 30, 2022 07:45
@comius

comius commented Dec 30, 2022

Copy link
Copy Markdown
ContributorAuthor

@rickeylev:

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

The PR is now ready.

@aignasaignas mentioned this pull request Jan 3, 2023
12 tasks
@rickeylev
rickeylev merged commit 0d3c4f7 into bazel-contrib:mainJan 18, 2023
@alexeagle

Copy link
Copy Markdown
Contributor

This forgot to update the docs/ folder so that the new stardoc comments are published for users to find.

eed3si9n pushed a commit to eed3si9n/rules_python that referenced this pull request Aug 16, 2023
* Add py_proto_library
* Bump versions of rules_proto and protobuf
* Update documentation
* Bump rules_pkg version
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.

9 participants

@comius@aaliddell@rickeylev@tpudlik@jiawen@hrfuller@alexeagle@meteorcloudy@UebelAndre
, '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

Implement py_proto_library - #832

Merged
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library
Jan 18, 2023
Merged

Implement py_proto_library#832
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library

Conversation

@comius

@comiuscomius commented Sep 20, 2022

Copy link
Copy Markdown
Contributor

py_proto_library was tested manually on Bazel repository using Bazel 6.0.0 with and without using bzlmod.

Extend README.md to mention also py_proto_library.

With bzlmod py_proto_library just works. Users without bzlmod, need to import rules_proto and protobuf repositories into their WORKSPACE file.

py_proto_library is compatible with Bazel >=5.4.0 and >=6.0.0.

@comius

Copy link
Copy Markdown
ContributorAuthor

cc @rickeylev@haberman

Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated

@meteorcloudymeteorcloudy 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.

LGTM, from dependencies management perspective.

Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
@aaliddell

aaliddell commented Sep 21, 2022

Copy link
Copy Markdown
Contributor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

@comius
comiusforce-pushed the add-py_proto_library branch from a7233d3 to 94c2b4bCompareSeptember 21, 2022 08:16
@comius

comius commented Sep 21, 2022

Copy link
Copy Markdown
ContributorAuthor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that you're 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Comment threadproto/python/private/py_proto_library.bzl Outdated
@rickeylev

Copy link
Copy Markdown
Collaborator

https://rules-proto-grpc.com/en/latest/transitivity.html says

In hindsight, [recursive aspect] was not the correct behaviour and led to many bugs, since you may end up creating a library that contains compiled proto files from a third party, where you should instead be depending on a proper library for that third party’s protos.

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

@aaliddell

Copy link
Copy Markdown
Contributor

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

You can email me or put it in a new discussion here; not sure I’ll be much help though with SWIG. Or put it on the bazel-discuss mailing list if you want a wider audience. Or slack. Too many options 😵‍💫

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that your 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Ok, I thought I’d check your weren’t just blindly copying some of the other language rulesets’ behaviour without knowing the implications; seems like you’re on top of it 👍

@rickeylev

Copy link
Copy Markdown
Collaborator

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

@tpudlik

Copy link
Copy Markdown
Collaborator

I just ran into an interesting bug in the unofficial py_proto_library from https://github.com/protocolbuffers/protobuf/: it doesn't respect tags = ["manual"]. No tags are forwarded to the code generation rule, so the code generation runs unconditionally. So I thought I'd confirm: this "official" implementation doesn't suffer from this bug, does it?

@jiawen

Copy link
Copy Markdown

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

@hrfuller

Copy link
Copy Markdown
Contributor

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

@comius
comius marked this pull request as draft December 5, 2022 17:34
@comius
comiusforce-pushed the add-py_proto_library branch from f9b5fff to 8981c4bCompareDecember 5, 2022 17:36
@comius

Copy link
Copy Markdown
ContributorAuthor

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

Yes, this is the implementation. It will work with Bazel 5.3 and Bazel 6. And also without bzlmod.

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

I fixed the PR, so that the users only need to depend on rules_python. And proto repositories are fetched only if you use py_proto_library,

@comius
comiusforce-pushed the add-py_proto_library branch from 8981c4b to 1e24ebbCompareDecember 5, 2022 17:55
@comius
comiusforce-pushed the add-py_proto_library branch from 1e24ebb to 4ab5a5dCompareDecember 30, 2022 06:10
@comius
comius marked this pull request as ready for review December 30, 2022 07:45
@comius

comius commented Dec 30, 2022

Copy link
Copy Markdown
ContributorAuthor

@rickeylev:

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

The PR is now ready.

@aignasaignas mentioned this pull request Jan 3, 2023
12 tasks
@rickeylev
rickeylev merged commit 0d3c4f7 into bazel-contrib:mainJan 18, 2023
@alexeagle

Copy link
Copy Markdown
Contributor

This forgot to update the docs/ folder so that the new stardoc comments are published for users to find.

eed3si9n pushed a commit to eed3si9n/rules_python that referenced this pull request Aug 16, 2023
* Add py_proto_library
* Bump versions of rules_proto and protobuf
* Update documentation
* Bump rules_pkg version
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.

9 participants

@comius@aaliddell@rickeylev@tpudlik@jiawen@hrfuller@alexeagle@meteorcloudy@UebelAndre
, '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

Implement py_proto_library - #832

Merged
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library
Jan 18, 2023
Merged

Implement py_proto_library#832
rickeylev merged 4 commits into
bazel-contrib:mainfrom
comius:add-py_proto_library

Conversation

@comius

@comiuscomius commented Sep 20, 2022

Copy link
Copy Markdown
Contributor

py_proto_library was tested manually on Bazel repository using Bazel 6.0.0 with and without using bzlmod.

Extend README.md to mention also py_proto_library.

With bzlmod py_proto_library just works. Users without bzlmod, need to import rules_proto and protobuf repositories into their WORKSPACE file.

py_proto_library is compatible with Bazel >=5.4.0 and >=6.0.0.

@comius

Copy link
Copy Markdown
ContributorAuthor

cc @rickeylev@haberman

Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated
Comment threadproto/MODULE.bazel Outdated

@meteorcloudymeteorcloudy 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.

LGTM, from dependencies management perspective.

Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
Comment threadproto/python/py_proto_library.bzl
Comment threadproto/python/py_proto_library.bzl Outdated
@aaliddell

aaliddell commented Sep 21, 2022

Copy link
Copy Markdown
Contributor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

@comius
comiusforce-pushed the add-py_proto_library branch from a7233d3 to 94c2b4bCompareSeptember 21, 2022 08:16
@comius

comius commented Sep 21, 2022

Copy link
Copy Markdown
ContributorAuthor

FWIW transitive proto compilation with an aspect is probably not the right method to use any longer. Both rules_proto and rules_proto_grpc have dropped aspect based compilation in favour of more explicit direct compilation of the named protos only within a target. This is because transitive compilation is both artificially limiting in terms of passable options and more importantly leads to multiple definitions of the same proto message if depended on via differing trees (a serious problem in C++, a nuisance in Python). See here for further details: https://rules-proto-grpc.com/en/latest/transitivity.html

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that you're 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Comment threadproto/python/private/py_proto_library.bzl Outdated
@rickeylev

Copy link
Copy Markdown
Collaborator

https://rules-proto-grpc.com/en/latest/transitivity.html says

In hindsight, [recursive aspect] was not the correct behaviour and led to many bugs, since you may end up creating a library that contains compiled proto files from a third party, where you should instead be depending on a proper library for that third party’s protos.

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

@aaliddell

Copy link
Copy Markdown
Contributor

Is there a place to further discuss this (this PR is probably not the best venue)? This situation sounds similar to some of the problems we have with SWIG (and C bindings in general) within Google, and pushing the codegen burden elsewhere has its own set of problems. @aaliddell

You can email me or put it in a new discussion here; not sure I’ll be much help though with SWIG. Or put it on the bazel-discuss mailing list if you want a wider audience. Or slack. Too many options 😵‍💫

Compiling only directly is a good choice for gRPC generated libraries.

For non-service proto libraries, it's better to use lang_proto_library with an aspect. It removes redundancies - having to add py_proto_library next to every proto_library in the transitive closure. Aspects take care that your 1:1 mapping from proto dependency graph to python graph - even if lang_proto_library is duplicated. If there are problems with proto dependency graph, they are not going to be solved by either direct or aspect based solution. Aspect based solution will probably fail, whereas no-aspect/direct solution will potentially hide problems.

Ok, I thought I’d check your weren’t just blindly copying some of the other language rulesets’ behaviour without knowing the implications; seems like you’re on top of it 👍

@rickeylev

Copy link
Copy Markdown
Collaborator

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

@tpudlik

Copy link
Copy Markdown
Collaborator

I just ran into an interesting bug in the unofficial py_proto_library from https://github.com/protocolbuffers/protobuf/: it doesn't respect tags = ["manual"]. No tags are forwarded to the code generation rule, so the code generation runs unconditionally. So I thought I'd confirm: this "official" implementation doesn't suffer from this bug, does it?

@jiawen

Copy link
Copy Markdown

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

@hrfuller

Copy link
Copy Markdown
Contributor

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

@comius
comius marked this pull request as draft December 5, 2022 17:34
@comius
comiusforce-pushed the add-py_proto_library branch from f9b5fff to 8981c4bCompareDecember 5, 2022 17:36
@comius

Copy link
Copy Markdown
ContributorAuthor

I just discovered this comment in com_google_protobuf//:protobuf.bzl.py_proto_library(). It suggests that Bazel 5.3 will include py_proto_library() internally.

Is this the implementation? But only available when using bzlmod and/or Bazel 6?

Yes, this is the implementation. It will work with Bazel 5.3 and Bazel 6. And also without bzlmod.

Still wrapping my head around bzlmod stuff. Is the idea that users would have to depend on the py_proto_module seperately from rules_python in their MODULE.bazel file in order to use the py_proto_library rule; or would any dependency on rules_python include the ability to use py_proto_library?

I fixed the PR, so that the users only need to depend on rules_python. And proto repositories are fetched only if you use py_proto_library,

@comius
comiusforce-pushed the add-py_proto_library branch from 8981c4b to 1e24ebbCompareDecember 5, 2022 17:55
@comius
comiusforce-pushed the add-py_proto_library branch from 1e24ebb to 4ab5a5dCompareDecember 30, 2022 06:10
@comius
comius marked this pull request as ready for review December 30, 2022 07:45
@comius

comius commented Dec 30, 2022

Copy link
Copy Markdown
ContributorAuthor

@rickeylev:

per chat with Ivo: PR is not yet ready to merge; he's going to refactor things into a single bzlmod module file because deps for modules are fetched lazily (and thus no proto dep will be brought in unless necessary)

The PR is now ready.

@aignasaignas mentioned this pull request Jan 3, 2023
12 tasks
@rickeylev
rickeylev merged commit 0d3c4f7 into bazel-contrib:mainJan 18, 2023
@alexeagle

Copy link
Copy Markdown
Contributor

This forgot to update the docs/ folder so that the new stardoc comments are published for users to find.

eed3si9n pushed a commit to eed3si9n/rules_python that referenced this pull request Aug 16, 2023
* Add py_proto_library
* Bump versions of rules_proto and protobuf
* Update documentation
* Bump rules_pkg version
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.

9 participants

@comius@aaliddell@rickeylev@tpudlik@jiawen@hrfuller@alexeagle@meteorcloudy@UebelAndre