From 0f1dccc31933b4df83fba24ff7b916d243795732 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 21 Feb 2026 23:15:36 -0800 Subject: [PATCH 1/7] initial split --- .bazelignore | 1 + MODULE.bazel | 9 ++++-- docs/BUILD.bazel | 14 +++++----- docs/conf.py | 2 +- docs/readthedocs_build.sh | 6 ++-- python/private/BUILD.bazel | 9 +++--- sphinxdocs/BUILD.bazel | 10 +++---- sphinxdocs/MODULE.bazel | 28 +++++++++++++++++++ sphinxdocs/docs/BUILD.bazel | 19 +++++++------ sphinxdocs/docs/api/sphinxdocs/index.md | 4 +-- .../docs/api/sphinxdocs/inventories/index.md | 4 +-- sphinxdocs/docs/readthedocs.md | 12 ++++---- sphinxdocs/docs/sphinx-bzl.md | 2 +- sphinxdocs/docs/starlark-docgen.md | 4 +-- sphinxdocs/inventories/BUILD.bazel | 2 +- sphinxdocs/private/BUILD.bazel | 20 ++++++------- sphinxdocs/private/readthedocs.bzl | 10 +++---- sphinxdocs/private/sphinx.bzl | 26 ++++++++--------- .../private/sphinx_docs_library_macro.bzl | 4 +-- sphinxdocs/private/sphinx_stardoc.bzl | 10 +++---- sphinxdocs/readthedocs.bzl | 2 +- sphinxdocs/sphinx.bzl | 2 +- sphinxdocs/sphinx_docs_library.bzl | 2 +- sphinxdocs/sphinx_stardoc.bzl | 2 +- sphinxdocs/src/sphinx_bzl/BUILD.bazel | 2 +- sphinxdocs/src/sphinx_bzl/bzl.py | 2 +- .../tests/proto_to_markdown/BUILD.bazel | 4 +-- .../proto_to_markdown_test.py | 2 +- sphinxdocs/tests/sphinx_docs/BUILD.bazel | 2 +- sphinxdocs/tests/sphinx_stardoc/BUILD.bazel | 10 +++---- sphinxdocs/tests/sphinx_stardoc/index.md | 4 +-- .../sphinx_stardoc/sphinx_output_test.py | 2 +- sphinxdocs/tests/sphinx_stardoc/xrefs.md | 2 +- 33 files changed, 134 insertions(+), 100 deletions(-) create mode 100644 sphinxdocs/MODULE.bazel diff --git a/.bazelignore b/.bazelignore index 0384d0746e..89e06444a4 100644 --- a/.bazelignore +++ b/.bazelignore @@ -29,6 +29,7 @@ gazelle/examples/bzlmod_build_file_generation/bazel-bin gazelle/examples/bzlmod_build_file_generation/bazel-bzlmod_build_file_generation gazelle/examples/bzlmod_build_file_generation/bazel-out gazelle/examples/bzlmod_build_file_generation/bazel-testlog +sphinxdocs tests/integration/compile_pip_requirements/bazel-compile_pip_requirements tests/integration/local_toolchains/bazel-local_toolchains tests/integration/py_cc_toolchain_registered/bazel-py_cc_toolchain_registered diff --git a/MODULE.bazel b/MODULE.bazel index 6486634370..887c344791 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -211,10 +211,13 @@ pip.parse( ) use_repo(pip, "rules_python_publish_deps") -# Not a dev dependency to allow usage of //sphinxdocs code, which refers to stardoc repos. -bazel_dep(name = "stardoc", version = "0.7.2", repo_name = "io_bazel_stardoc") - # ===== DEV ONLY DEPS AND SETUP BELOW HERE ===== +bazel_dep(name = "sphinxdocs", version = "0.0.0", dev_dependency = True) +local_path_override( + module_name = "sphinxdocs", + path = "sphinxdocs", +) + bazel_dep(name = "rules_bazel_integration_test", version = "0.27.0", dev_dependency = True) bazel_dep(name = "rules_testing", version = "0.6.0", dev_dependency = True) bazel_dep(name = "rules_shell", version = "0.3.0", dev_dependency = True) diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index 656c06b6e1..7b5af451f0 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -17,10 +17,10 @@ load("@dev_pip//:requirements.bzl", "requirement") load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility load("//python/private:common_labels.bzl", "labels") # buildifier: disable=bzl-visibility load("//python/uv:lock.bzl", "lock") # buildifier: disable=bzl-visibility -load("//sphinxdocs:readthedocs.bzl", "readthedocs_install") -load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") -load("//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library") -load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") +load("@sphinxdocs//:readthedocs.bzl", "readthedocs_install") +load("@sphinxdocs//:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") +load("@sphinxdocs//:sphinx_docs_library.bzl", "sphinx_docs_library") +load("@sphinxdocs//:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") package(default_visibility = ["//:__subpackages__"]) @@ -63,7 +63,7 @@ sphinx_docs( renamed_srcs = { "//:CHANGELOG.md": "changelog.md", "//:CONTRIBUTING.md": "contributing.md", - "//sphinxdocs/inventories:bazel_inventory": "bazel_inventory.inv", + "@sphinxdocs//inventories:bazel_inventory": "bazel_inventory.inv", }, sphinx = ":sphinx-build", strip_prefix = package_name() + "/", @@ -73,7 +73,7 @@ sphinx_docs( ":bzl_api_docs", ":py_api_srcs", ":py_runtime_pair", - "//sphinxdocs/docs:docs_lib", + "@sphinxdocs//docs:docs_lib", ], ) @@ -182,7 +182,7 @@ sphinx_build_binary( requirement("typing_extensions"), requirement("sphinx_autodoc2"), requirement("sphinx_reredirects"), - "//sphinxdocs/src/sphinx_bzl", + "@sphinxdocs//src/sphinx_bzl", ], ) diff --git a/docs/conf.py b/docs/conf.py index 6a7cfe178f..9411e394af 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -7,7 +7,7 @@ copyright = "2023, The Bazel Authors" author = "Bazel" -# NOTE: These are overriden by -D flags via --//sphinxdocs:extra_defines +# NOTE: These are overriden by -D flags via --@sphinxdocs//:extra_defines version = "0.0.0" release = version diff --git a/docs/readthedocs_build.sh b/docs/readthedocs_build.sh index 06ac7698d2..c7036f2823 100755 --- a/docs/readthedocs_build.sh +++ b/docs/readthedocs_build.sh @@ -5,12 +5,12 @@ set -eou pipefail declare -a extra_env while IFS='=' read -r -d '' name value; do if [[ "$name" == READTHEDOCS* ]]; then - extra_env+=("--//sphinxdocs:extra_env=$name=$value") + extra_env+=("--@sphinxdocs//:extra_env=$name=$value") fi done < <(env -0) # In order to get the build number, we extract it from the host name -extra_env+=("--//sphinxdocs:extra_env=HOSTNAME=$HOSTNAME") +extra_env+=("--@sphinxdocs//:extra_env=HOSTNAME=$HOSTNAME") export RULES_PYTHON_ENABLE_PIPSTAR=1 @@ -18,6 +18,6 @@ set -x export RULES_PYTHON_ENABLE_PIPSTAR=1 bazel run \ --config=rtd \ - "--//sphinxdocs:extra_defines=version=$READTHEDOCS_VERSION" \ + "--@sphinxdocs//:extra_defines=version=$READTHEDOCS_VERSION" \ "${extra_env[@]}" \ //docs:readthedocs_install diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 70f7f86413..6aa4614c5a 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -24,7 +24,10 @@ load(":stamp.bzl", "stamp_build_setting") load(":uncachable_version_file.bzl", "define_uncachable_version_file") package( - default_visibility = ["//:__subpackages__"], + default_visibility = [ + "//:__subpackages__", + "@sphinxdocs//:__subpackages__", + ], ) licenses(["notice"]) @@ -689,9 +692,7 @@ bzl_library( bzl_library( name = "util_bzl", srcs = ["util.bzl"], - visibility = [ - "//:__subpackages__", - ], + visibility = ["//visibility:public"], deps = [ ":py_internal_bzl", "@bazel_skylib//lib:types", diff --git a/sphinxdocs/BUILD.bazel b/sphinxdocs/BUILD.bazel index 9ad1e1eef9..383a03f591 100644 --- a/sphinxdocs/BUILD.bazel +++ b/sphinxdocs/BUILD.bazel @@ -14,7 +14,7 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") -load("//sphinxdocs/private:sphinx.bzl", "repeated_string_list_flag") +load("//private:sphinx.bzl", "repeated_string_list_flag") package( default_visibility = ["//:__subpackages__"], @@ -44,23 +44,23 @@ bool_flag( bzl_library( name = "sphinx_bzl", srcs = ["sphinx.bzl"], - deps = ["//sphinxdocs/private:sphinx_bzl"], + deps = ["//private:sphinx_bzl"], ) bzl_library( name = "sphinx_docs_library_bzl", srcs = ["sphinx_docs_library.bzl"], - deps = ["//sphinxdocs/private:sphinx_docs_library_macro_bzl"], + deps = ["//private:sphinx_docs_library_macro_bzl"], ) bzl_library( name = "sphinx_stardoc_bzl", srcs = ["sphinx_stardoc.bzl"], - deps = ["//sphinxdocs/private:sphinx_stardoc_bzl"], + deps = ["//private:sphinx_stardoc_bzl"], ) bzl_library( name = "readthedocs_bzl", srcs = ["readthedocs.bzl"], - deps = ["//sphinxdocs/private:readthedocs_bzl"], + deps = ["//private:readthedocs_bzl"], ) diff --git a/sphinxdocs/MODULE.bazel b/sphinxdocs/MODULE.bazel new file mode 100644 index 0000000000..615f95eb7a --- /dev/null +++ b/sphinxdocs/MODULE.bazel @@ -0,0 +1,28 @@ +module( + name = "sphinxdocs", + version = "0.0.0", + compatibility_level = 1, +) + +bazel_dep(name = "bazel_skylib", version = "1.8.2") +bazel_dep(name = "stardoc", version = "0.7.2", repo_name = "io_bazel_stardoc") +bazel_dep(name = "platforms", version = "0.0.11") +bazel_dep(name = "protobuf", version = "29.0-rc2", repo_name = "com_google_protobuf") +bazel_dep(name = "rules_python", version = "0.0.0") + +local_path_override( + module_name = "rules_python", + path = "..", +) + +dev_pip = use_extension( + "@rules_python//python/extensions:pip.bzl", + "pip", + dev_dependency = True, +) +dev_pip.parse( + hub_name = "dev_pip", + python_version = "3.11", + requirements_lock = "@rules_python//docs:requirements.txt", +) +use_repo(dev_pip, "dev_pip") diff --git a/sphinxdocs/docs/BUILD.bazel b/sphinxdocs/docs/BUILD.bazel index 070e0485d7..91ea9ab1d5 100644 --- a/sphinxdocs/docs/BUILD.bazel +++ b/sphinxdocs/docs/BUILD.bazel @@ -1,6 +1,6 @@ -load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility -load("//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library") -load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardocs") +load("@rules_python//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility +load("//:sphinx_docs_library.bzl", "sphinx_docs_library") +load("//:sphinx_stardoc.bzl", "sphinx_stardocs") package(default_visibility = ["//:__subpackages__"]) @@ -18,6 +18,7 @@ _TARGET_COMPATIBLE_WITH = select({ sphinx_docs_library( name = "docs_lib", + visibility = ["//visibility:public"], deps = [ ":artisian_api_docs", ":bzl_docs", @@ -47,11 +48,11 @@ sphinx_docs_library( sphinx_stardocs( name = "bzl_docs", srcs = [ - "//sphinxdocs:readthedocs_bzl", - "//sphinxdocs:sphinx_bzl", - "//sphinxdocs:sphinx_docs_library_bzl", - "//sphinxdocs:sphinx_stardoc_bzl", - "//sphinxdocs/private:sphinx_docs_library_bzl", + "//:readthedocs_bzl", + "//:sphinx_bzl", + "//:sphinx_docs_library_bzl", + "//:sphinx_stardoc_bzl", + "//private:sphinx_docs_library_bzl", ], prefix = "api/sphinxdocs/", target_compatible_with = _TARGET_COMPATIBLE_WITH, @@ -59,6 +60,6 @@ sphinx_stardocs( sphinx_docs_library( name = "py_api_srcs", - srcs = ["//sphinxdocs/src/sphinx_bzl"], + srcs = ["//src/sphinx_bzl"], strip_prefix = "sphinxdocs/src/", ) diff --git a/sphinxdocs/docs/api/sphinxdocs/index.md b/sphinxdocs/docs/api/sphinxdocs/index.md index bd4e9b6eec..a59edb2b65 100644 --- a/sphinxdocs/docs/api/sphinxdocs/index.md +++ b/sphinxdocs/docs/api/sphinxdocs/index.md @@ -1,7 +1,7 @@ -:::{bzl:currentfile} //sphinxdocs:BUILD.bazel +:::{bzl:currentfile} //:BUILD.bazel ::: -# //sphinxdocs +# // :::{bzl:flag} extra_defines Additional `-D` values to add to every Sphinx build. diff --git a/sphinxdocs/docs/api/sphinxdocs/inventories/index.md b/sphinxdocs/docs/api/sphinxdocs/inventories/index.md index a03645ed44..d0b983fe7f 100644 --- a/sphinxdocs/docs/api/sphinxdocs/inventories/index.md +++ b/sphinxdocs/docs/api/sphinxdocs/inventories/index.md @@ -1,7 +1,7 @@ -:::{bzl:currentfile} //sphinxdocs/inventories:BUILD.bazel +:::{bzl:currentfile} //inventories:BUILD.bazel ::: -# //sphinxdocs/inventories +# //inventories :::{bzl:target} bazel_inventory A Sphinx inventory of Bazel objects. diff --git a/sphinxdocs/docs/readthedocs.md b/sphinxdocs/docs/readthedocs.md index c347d19850..6bc8cec3df 100644 --- a/sphinxdocs/docs/readthedocs.md +++ b/sphinxdocs/docs/readthedocs.md @@ -26,8 +26,8 @@ In the example below, `npm` is used to install Bazelisk and a helper shell script, `readthedocs_build.sh` is used to construct the Bazel invocation. The key purpose of the shell script it to set the -`--@rules_python//sphinxdocs:extra_env` and -`--@rules_python//sphinxdocs:extra_defines` flags. These are used to communicate +`--//:extra_env` and +`--//:extra_defines` flags. These are used to communicate `READTHEDOCS*` environment variables and settings to the Bazel invocation. ## BUILD config @@ -73,7 +73,7 @@ build: ``` # File: docs/BUILD -load("@rules_python//sphinxdocs:readthedocs.bzl.bzl", "readthedocs_install") +load("//:readthedocs.bzl.bzl", "readthedocs_install") readthedocs_install( name = "readthedocs_install", docs = [":docs"], @@ -90,17 +90,17 @@ set -eou pipefail declare -a extra_env while IFS='=' read -r -d '' name value; do if [[ "$name" == READTHEDOCS* ]]; then - extra_env+=("--@rules_python//sphinxdocs:extra_env=$name=$value") + extra_env+=("--//:extra_env=$name=$value") fi done < <(env -0) # In order to get the build number, we extract it from the host name -extra_env+=("--@rules_python//sphinxdocs:extra_env=HOSTNAME=$HOSTNAME") +extra_env+=("--//:extra_env=HOSTNAME=$HOSTNAME") set -x bazel run \ --stamp \ - "--@rules_python//sphinxdocs:extra_defines=version=$READTHEDOCS_VERSION" \ + "--//:extra_defines=version=$READTHEDOCS_VERSION" \ "${extra_env[@]}" \ //docs:readthedocs_install ``` diff --git a/sphinxdocs/docs/sphinx-bzl.md b/sphinxdocs/docs/sphinx-bzl.md index da4cd9f293..d415c72cb7 100644 --- a/sphinxdocs/docs/sphinx-bzl.md +++ b/sphinxdocs/docs/sphinx-bzl.md @@ -11,7 +11,7 @@ a well known target. ## Configuring Sphinx To enable the plugin in Sphinx, depend on -`@rules_python//sphinxdocs/src/sphinx_bzl` and enable it in `conf.py`: +`//src/sphinx_bzl` and enable it in `conf.py`: ``` extensions = [ diff --git a/sphinxdocs/docs/starlark-docgen.md b/sphinxdocs/docs/starlark-docgen.md index b9181ee347..e11edc0c69 100644 --- a/sphinxdocs/docs/starlark-docgen.md +++ b/sphinxdocs/docs/starlark-docgen.md @@ -13,7 +13,7 @@ While the `sphinx_stardoc` rule doesn't require Sphinx itself, the source it generates requires some additional Sphinx plugins and config settings. When defining the `sphinx_build_binary` target, also depend on: -* `@rules_python//sphinxdocs/src/sphinx_bzl:sphinx_bzl` +* `//src/sphinx_bzl:sphinx_bzl` * `myst_parser` (e.g. `@pypi//myst_parser`) * `typing_extensions` (e.g. `@pypi//myst_parser`) @@ -21,7 +21,7 @@ When defining the `sphinx_build_binary` target, also depend on: sphinx_build_binary( name = "sphinx-build", deps = [ - "@rules_python//sphinxdocs/src/sphinx_bzl", + "//src/sphinx_bzl", "@pypi//myst_parser", "@pypi//typing_extensions", ... diff --git a/sphinxdocs/inventories/BUILD.bazel b/sphinxdocs/inventories/BUILD.bazel index 9ed7698cdf..7840421c1c 100644 --- a/sphinxdocs/inventories/BUILD.bazel +++ b/sphinxdocs/inventories/BUILD.bazel @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//sphinxdocs:sphinx.bzl", "sphinx_inventory") +load("//:sphinx.bzl", "sphinx_inventory") # Inventory for the current Bazel version sphinx_inventory( diff --git a/sphinxdocs/private/BUILD.bazel b/sphinxdocs/private/BUILD.bazel index c707b4d1d8..67964d2b2c 100644 --- a/sphinxdocs/private/BUILD.bazel +++ b/sphinxdocs/private/BUILD.bazel @@ -14,16 +14,16 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") -load("//python:py_binary.bzl", "py_binary") -load("//python:py_library.bzl", "py_library") +load("@rules_python//python:py_binary.bzl", "py_binary") +load("@rules_python//python:py_library.bzl", "py_library") package( - default_visibility = ["//sphinxdocs:__subpackages__"], + default_visibility = ["//:__subpackages__"], ) -# These are only exported because they're passed as files to the //sphinxdocs +# These are only exported because they're passed as files to the // # macros, and thus must be visible to other packages. They should only be -# referenced by the //sphinxdocs macros. +# referenced by the // macros. exports_files( [ "readthedocs_install.py", @@ -39,7 +39,7 @@ bzl_library( srcs = ["sphinx_docs_library_macro.bzl"], deps = [ ":sphinx_docs_library_bzl", - "//python/private:util_bzl", + "@rules_python//python/private:util_bzl", ], ) @@ -59,7 +59,7 @@ bzl_library( srcs = ["sphinx.bzl"], deps = [ ":sphinx_docs_library_info_bzl", - "//python:py_binary_bzl", + "@rules_python//python:py_binary_bzl", "@bazel_skylib//:bzl_library", "@bazel_skylib//lib:paths", "@bazel_skylib//lib:types", @@ -74,8 +74,8 @@ bzl_library( srcs = ["sphinx_stardoc.bzl"], deps = [ ":sphinx_docs_library_macro_bzl", - "//python/private:util_bzl", - "//sphinxdocs:sphinx_bzl", + "@rules_python//python/private:util_bzl", + "//:sphinx_bzl", "@bazel_skylib//:bzl_library", "@bazel_skylib//lib:paths", "@bazel_skylib//lib:types", @@ -87,7 +87,7 @@ bzl_library( bzl_library( name = "readthedocs_bzl", srcs = ["readthedocs.bzl"], - deps = ["//python:py_binary_bzl"], + deps = ["@rules_python//python:py_binary_bzl"], ) py_binary( diff --git a/sphinxdocs/private/readthedocs.bzl b/sphinxdocs/private/readthedocs.bzl index a62c51b86a..7ee35aa75e 100644 --- a/sphinxdocs/private/readthedocs.bzl +++ b/sphinxdocs/private/readthedocs.bzl @@ -13,10 +13,10 @@ # limitations under the License. """Starlark rules for integrating Sphinx and Readthedocs.""" -load("//python:py_binary.bzl", "py_binary") -load("//python/private:util.bzl", "add_tag") # buildifier: disable=bzl-visibility +load("@rules_python//python:py_binary.bzl", "py_binary") +load("@rules_python//python/private:util.bzl", "add_tag") # buildifier: disable=bzl-visibility -_INSTALL_MAIN_SRC = Label("//sphinxdocs/private:readthedocs_install.py") +_INSTALL_MAIN_SRC = Label("//private:readthedocs_install.py") def readthedocs_install(name, docs, **kwargs): """Run a program to copy Sphinx doc files into readthedocs output directories. @@ -33,7 +33,7 @@ def readthedocs_install(name, docs, **kwargs): is typically a single {obj}`sphinx_stardocs` target. **kwargs: {type}`dict` additional kwargs to pass onto the installer """ - add_tag(kwargs, "@rules_python//sphinxdocs:readthedocs_install") + add_tag(kwargs, "//:readthedocs_install") py_binary( name = name, srcs = [_INSTALL_MAIN_SRC], @@ -43,6 +43,6 @@ def readthedocs_install(name, docs, **kwargs): "$(rlocationpaths {})".format(d) for d in docs ], - deps = [Label("//python/runfiles")], + deps = [Label("@rules_python//python/runfiles")], **kwargs ) diff --git a/sphinxdocs/private/sphinx.bzl b/sphinxdocs/private/sphinx.bzl index 0efbc269c5..bf8149eb12 100644 --- a/sphinxdocs/private/sphinx.bzl +++ b/sphinxdocs/private/sphinx.bzl @@ -16,12 +16,12 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") -load("//python:py_binary.bzl", "py_binary") -load("//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility +load("@rules_python//python:py_binary.bzl", "py_binary") +load("@rules_python//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility load(":sphinx_docs_library_info.bzl", "SphinxDocsLibraryInfo") -_SPHINX_BUILD_MAIN_SRC = Label("//sphinxdocs/private:sphinx_build.py") -_SPHINX_SERVE_MAIN_SRC = Label("//sphinxdocs/private:sphinx_server.py") +_SPHINX_BUILD_MAIN_SRC = Label("//private:sphinx_build.py") +_SPHINX_SERVE_MAIN_SRC = Label("//private:sphinx_server.py") _SphinxSourceTreeInfo = provider( doc = "Information about source tree for Sphinx to build.", @@ -83,7 +83,7 @@ def sphinx_build_binary(name, py_binary_rule = py_binary, **kwargs): **kwargs: {type}`dict` Additional kwargs to pass onto `py_binary`. The `srcs` and `main` attributes must not be specified. """ - add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_build_binary") + add_tag(kwargs, "//:sphinx_build_binary") py_binary_rule( name = name, srcs = [_SPHINX_BUILD_MAIN_SRC], @@ -148,7 +148,7 @@ def sphinx_docs( This can improve incremental building of docs. **kwargs: {type}`dict` Common attributes to pass onto rules. """ - add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_docs") + add_tag(kwargs, "//:sphinx_docs") common_kwargs = copy_propagating_kwargs(kwargs) internal_name = "_{}".format(name.lstrip("_")) @@ -189,7 +189,7 @@ def sphinx_docs( srcs = [_SPHINX_SERVE_MAIN_SRC], main = _SPHINX_SERVE_MAIN_SRC, data = [html_name], - deps = [Label("//python/runfiles")], + deps = [Label("@rules_python//python/runfiles")], args = [ "$(rlocationpath {})".format(html_name), ], @@ -259,9 +259,9 @@ _sphinx_docs = rule( cfg = "exec", doc = "Additional tools that are used by Sphinx and its plugins.", ), - "_extra_defines_flag": attr.label(default = "//sphinxdocs:extra_defines"), - "_extra_env_flag": attr.label(default = "//sphinxdocs:extra_env"), - "_quiet_flag": attr.label(default = "//sphinxdocs:quiet"), + "_extra_defines_flag": attr.label(default = "//:extra_defines"), + "_extra_env_flag": attr.label(default = "//:extra_env"), + "_quiet_flag": attr.label(default = "//:quiet"), }, ) @@ -482,7 +482,7 @@ def sphinx_inventory(*, name, src, **kwargs): the value `-` to indicate it is the same as `name` :::{seealso} - {bzl:obj}`//sphinxdocs/inventories` for inventories of Bazel objects. + {bzl:obj}`//inventories` for inventories of Bazel objects. ::: Args: @@ -511,7 +511,7 @@ _sphinx_inventory = rule( attrs = { "src": attr.label(allow_single_file = True), "_builder": attr.label( - default = "//sphinxdocs/private:inventory_builder", + default = "//private:inventory_builder", executable = True, cfg = "exec", ), @@ -594,7 +594,7 @@ inspected without Bazel interference. ), "_template": attr.label( allow_single_file = True, - default = "//sphinxdocs/private:sphinx_run_template.sh", + default = "//private:sphinx_run_template.sh", ), }, executable = True, diff --git a/sphinxdocs/private/sphinx_docs_library_macro.bzl b/sphinxdocs/private/sphinx_docs_library_macro.bzl index 095b3769ca..fd780c128f 100644 --- a/sphinxdocs/private/sphinx_docs_library_macro.bzl +++ b/sphinxdocs/private/sphinx_docs_library_macro.bzl @@ -1,6 +1,6 @@ """Implementation of sphinx_docs_library macro.""" -load("//python/private:util.bzl", "add_tag") # buildifier: disable=bzl-visibility +load("@rules_python//python/private:util.bzl", "add_tag") # buildifier: disable=bzl-visibility load(":sphinx_docs_library.bzl", _sphinx_docs_library = "sphinx_docs_library") def sphinx_docs_library(**kwargs): @@ -9,5 +9,5 @@ def sphinx_docs_library(**kwargs): Args: **kwargs: Args passed onto underlying {bzl:rule}`sphinx_docs_library` rule """ - add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_docs_library") + add_tag(kwargs, "//:sphinx_docs_library") _sphinx_docs_library(**kwargs) diff --git a/sphinxdocs/private/sphinx_stardoc.bzl b/sphinxdocs/private/sphinx_stardoc.bzl index d5869b0bc4..c6ec934ae0 100644 --- a/sphinxdocs/private/sphinx_stardoc.bzl +++ b/sphinxdocs/private/sphinx_stardoc.bzl @@ -19,8 +19,8 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//lib:types.bzl", "types") load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc") -load("//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility -load("//sphinxdocs/private:sphinx_docs_library_macro.bzl", "sphinx_docs_library") +load("@rules_python//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility +load("//private:sphinx_docs_library_macro.bzl", "sphinx_docs_library") _StardocInputHelperInfo = provider( doc = "Extracts the single source file from a bzl library.", @@ -73,7 +73,7 @@ def sphinx_stardocs( **kwargs: Additional kwargs to pass onto each `sphinx_stardoc` target """ internal_name = "_{}".format(name) - add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_stardocs") + add_tag(kwargs, "//:sphinx_stardocs") common_kwargs = copy_propagating_kwargs(kwargs) common_kwargs["target_compatible_with"] = kwargs.get("target_compatible_with") @@ -160,7 +160,7 @@ def sphinx_stardoc( **kwargs: {type}`dict` common args passed onto rules. """ internal_name = "_{}".format(name.lstrip("_")) - add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_stardoc") + add_tag(kwargs, "//:sphinx_stardoc") common_kwargs = copy_propagating_kwargs(kwargs) common_kwargs["target_compatible_with"] = kwargs.get("target_compatible_with") @@ -287,7 +287,7 @@ _stardoc_proto_to_markdown = rule( "src": attr.label(allow_single_file = True, mandatory = True), "strip_prefix": attr.string(), "_proto_to_markdown": attr.label( - default = "//sphinxdocs/private:proto_to_markdown", + default = "//private:proto_to_markdown", executable = True, cfg = "exec", ), diff --git a/sphinxdocs/readthedocs.bzl b/sphinxdocs/readthedocs.bzl index 4dfaf26465..9b49fe05aa 100644 --- a/sphinxdocs/readthedocs.bzl +++ b/sphinxdocs/readthedocs.bzl @@ -13,6 +13,6 @@ # limitations under the License. """Starlark rules for integrating Sphinx and Readthedocs.""" -load("//sphinxdocs/private:readthedocs.bzl", _readthedocs_install = "readthedocs_install") +load("//private:readthedocs.bzl", _readthedocs_install = "readthedocs_install") readthedocs_install = _readthedocs_install diff --git a/sphinxdocs/sphinx.bzl b/sphinxdocs/sphinx.bzl index 6cae80ed5c..f42052f667 100644 --- a/sphinxdocs/sphinx.bzl +++ b/sphinxdocs/sphinx.bzl @@ -28,7 +28,7 @@ The Sphinx integration is still experimental. """ load( - "//sphinxdocs/private:sphinx.bzl", + "//private:sphinx.bzl", _sphinx_build_binary = "sphinx_build_binary", _sphinx_docs = "sphinx_docs", _sphinx_inventory = "sphinx_inventory", diff --git a/sphinxdocs/sphinx_docs_library.bzl b/sphinxdocs/sphinx_docs_library.bzl index e86432996b..c77cd36e5f 100644 --- a/sphinxdocs/sphinx_docs_library.bzl +++ b/sphinxdocs/sphinx_docs_library.bzl @@ -1,5 +1,5 @@ """Library-like rule to collect docs.""" -load("//sphinxdocs/private:sphinx_docs_library_macro.bzl", _sphinx_docs_library = "sphinx_docs_library") +load("//private:sphinx_docs_library_macro.bzl", _sphinx_docs_library = "sphinx_docs_library") sphinx_docs_library = _sphinx_docs_library diff --git a/sphinxdocs/sphinx_stardoc.bzl b/sphinxdocs/sphinx_stardoc.bzl index 991396435b..955db61302 100644 --- a/sphinxdocs/sphinx_stardoc.bzl +++ b/sphinxdocs/sphinx_stardoc.bzl @@ -14,7 +14,7 @@ """Rules to generate Sphinx-compatible documentation for bzl files.""" -load("//sphinxdocs/private:sphinx_stardoc.bzl", _sphinx_stardoc = "sphinx_stardoc", _sphinx_stardocs = "sphinx_stardocs") +load("//private:sphinx_stardoc.bzl", _sphinx_stardoc = "sphinx_stardoc", _sphinx_stardocs = "sphinx_stardocs") sphinx_stardocs = _sphinx_stardocs sphinx_stardoc = _sphinx_stardoc diff --git a/sphinxdocs/src/sphinx_bzl/BUILD.bazel b/sphinxdocs/src/sphinx_bzl/BUILD.bazel index 8830315bc3..aa7d664107 100644 --- a/sphinxdocs/src/sphinx_bzl/BUILD.bazel +++ b/sphinxdocs/src/sphinx_bzl/BUILD.bazel @@ -1,4 +1,4 @@ -load("//python:py_library.bzl", "py_library") +load("@rules_python//python:py_library.bzl", "py_library") package( default_visibility = ["//:__subpackages__"], diff --git a/sphinxdocs/src/sphinx_bzl/bzl.py b/sphinxdocs/src/sphinx_bzl/bzl.py index 7d5ec6a68e..4f24014b4f 100644 --- a/sphinxdocs/src/sphinx_bzl/bzl.py +++ b/sphinxdocs/src/sphinx_bzl/bzl.py @@ -57,7 +57,7 @@ def _log_debug(message, *args): # NOTE: Non-warning log messages go to stdout and are only # visible when -q isn't passed to Sphinx. Note that the sphinx_docs build - # rule passes -q by default; use --//sphinxdocs:quiet=false to disable it. + # rule passes -q by default; use --//:quiet=false to disable it. _logger.debug("%s" + message, _LOG_PREFIX, *args) diff --git a/sphinxdocs/tests/proto_to_markdown/BUILD.bazel b/sphinxdocs/tests/proto_to_markdown/BUILD.bazel index 2964785eed..1fdaaf5744 100644 --- a/sphinxdocs/tests/proto_to_markdown/BUILD.bazel +++ b/sphinxdocs/tests/proto_to_markdown/BUILD.bazel @@ -12,13 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//python:py_test.bzl", "py_test") +load("@rules_python//python:py_test.bzl", "py_test") py_test( name = "proto_to_markdown_test", srcs = ["proto_to_markdown_test.py"], deps = [ - "//sphinxdocs/private:proto_to_markdown_lib", + "//private:proto_to_markdown_lib", "@dev_pip//absl_py", ], ) diff --git a/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py b/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py index da6edb21d4..17648f90a9 100644 --- a/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py +++ b/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py @@ -19,7 +19,7 @@ from google.protobuf import text_format from stardoc.proto import stardoc_output_pb2 -from sphinxdocs.private import proto_to_markdown +from private import proto_to_markdown _EVERYTHING_MODULE = """\ module_docstring: "MODULE_DOC_STRING" diff --git a/sphinxdocs/tests/sphinx_docs/BUILD.bazel b/sphinxdocs/tests/sphinx_docs/BUILD.bazel index 33b98ec585..1e3075d4ab 100644 --- a/sphinxdocs/tests/sphinx_docs/BUILD.bazel +++ b/sphinxdocs/tests/sphinx_docs/BUILD.bazel @@ -1,5 +1,5 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") +load("//:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") load(":defs.bzl", "gen_directory") # We only build for Linux and Mac because: diff --git a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel index af9af30886..8556f3cbd4 100644 --- a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel +++ b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel @@ -1,8 +1,8 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("//python:py_test.bzl", "py_test") -load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") -load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") +load("@rules_python//python:py_test.bzl", "py_test") +load("//:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") +load("//:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") # We only build for Linux and Mac because: # 1. The actual doc process only runs on Linux @@ -28,7 +28,7 @@ sphinx_docs( "html", ], renamed_srcs = { - "//sphinxdocs/inventories:bazel_inventory": "bazel_inventory.inv", + "//inventories:bazel_inventory": "bazel_inventory.inv", }, sphinx = ":sphinx-build", strip_prefix = package_name() + "/", @@ -93,7 +93,7 @@ sphinx_build_binary( name = "sphinx-build", tags = ["manual"], # Only needed as part of sphinx doc building deps = [ - "//sphinxdocs/src/sphinx_bzl", + "//src/sphinx_bzl", "@dev_pip//myst_parser", "@dev_pip//sphinx", "@dev_pip//typing_extensions", # Needed by sphinx_stardoc diff --git a/sphinxdocs/tests/sphinx_stardoc/index.md b/sphinxdocs/tests/sphinx_stardoc/index.md index 43ef14f55a..51a7a671ec 100644 --- a/sphinxdocs/tests/sphinx_stardoc/index.md +++ b/sphinxdocs/tests/sphinx_stardoc/index.md @@ -5,7 +5,7 @@ This is a set of documents to test the sphinx_stardoc extension. To build and view these docs, run: ``` -bazel run //sphinxdocs/tests/sphinx_stardoc:docs.serve +bazel run //tests/sphinx_stardoc:docs.serve ``` This will build the docs and start an HTTP server where they can be viewed. @@ -14,7 +14,7 @@ To aid the edit/debug cycle, `ibazel` can be used to automatically rebuild the HTML: ``` -ibazel build //sphinxdocs/tests/sphinx_stardoc:docs +ibazel build //tests/sphinx_stardoc:docs ``` :::{toctree} diff --git a/sphinxdocs/tests/sphinx_stardoc/sphinx_output_test.py b/sphinxdocs/tests/sphinx_stardoc/sphinx_output_test.py index c78089ac14..1393134d12 100644 --- a/sphinxdocs/tests/sphinx_stardoc/sphinx_output_test.py +++ b/sphinxdocs/tests/sphinx_stardoc/sphinx_output_test.py @@ -3,7 +3,7 @@ from absl.testing import absltest, parameterized -from sphinxdocs.tests import sphinx_stardoc +from tests import sphinx_stardoc class SphinxOutputTest(parameterized.TestCase): diff --git a/sphinxdocs/tests/sphinx_stardoc/xrefs.md b/sphinxdocs/tests/sphinx_stardoc/xrefs.md index bbd415ce19..9893c32023 100644 --- a/sphinxdocs/tests/sphinx_stardoc/xrefs.md +++ b/sphinxdocs/tests/sphinx_stardoc/xrefs.md @@ -36,7 +36,7 @@ Various tests of cross referencing support ## Using origin keys -* provider using `{type}`: {type}`"@rules_python//sphinxdocs/tests/sphinx_stardoc:bzl_rule.bzl%GenericInfo"` +* provider using `{type}`: {type}`"//tests/sphinx_stardoc:bzl_rule.bzl%GenericInfo"` ## Any xref From 951564ca484d53fb08b88a3afb9d60f5da19b185 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 21 Feb 2026 23:25:08 -0800 Subject: [PATCH 2/7] dont use internal rules_python helpers --- sphinxdocs/docs/BUILD.bazel | 2 +- sphinxdocs/private/BUILD.bazel | 18 +++++- sphinxdocs/private/readthedocs.bzl | 2 +- sphinxdocs/private/sphinx.bzl | 2 +- .../private/sphinx_docs_library_macro.bzl | 2 +- sphinxdocs/private/sphinx_stardoc.bzl | 2 +- sphinxdocs/private/util.bzl | 56 +++++++++++++++++++ 7 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 sphinxdocs/private/util.bzl diff --git a/sphinxdocs/docs/BUILD.bazel b/sphinxdocs/docs/BUILD.bazel index 91ea9ab1d5..5dfde5bd6d 100644 --- a/sphinxdocs/docs/BUILD.bazel +++ b/sphinxdocs/docs/BUILD.bazel @@ -1,4 +1,4 @@ -load("@rules_python//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility +load("//private:util.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility load("//:sphinx_docs_library.bzl", "sphinx_docs_library") load("//:sphinx_stardoc.bzl", "sphinx_stardocs") diff --git a/sphinxdocs/private/BUILD.bazel b/sphinxdocs/private/BUILD.bazel index 67964d2b2c..23fa8ea24b 100644 --- a/sphinxdocs/private/BUILD.bazel +++ b/sphinxdocs/private/BUILD.bazel @@ -34,12 +34,20 @@ exports_files( visibility = ["//visibility:public"], ) +bzl_library( + name = "util_bzl", + srcs = ["util.bzl"], + deps = [ + "@bazel_skylib//lib:types", + ], +) + bzl_library( name = "sphinx_docs_library_macro_bzl", srcs = ["sphinx_docs_library_macro.bzl"], deps = [ ":sphinx_docs_library_bzl", - "@rules_python//python/private:util_bzl", + "//private:util_bzl", ], ) @@ -58,6 +66,7 @@ bzl_library( name = "sphinx_bzl", srcs = ["sphinx.bzl"], deps = [ + ":util_bzl", ":sphinx_docs_library_info_bzl", "@rules_python//python:py_binary_bzl", "@bazel_skylib//:bzl_library", @@ -74,7 +83,7 @@ bzl_library( srcs = ["sphinx_stardoc.bzl"], deps = [ ":sphinx_docs_library_macro_bzl", - "@rules_python//python/private:util_bzl", + "//private:util_bzl", "//:sphinx_bzl", "@bazel_skylib//:bzl_library", "@bazel_skylib//lib:paths", @@ -87,7 +96,10 @@ bzl_library( bzl_library( name = "readthedocs_bzl", srcs = ["readthedocs.bzl"], - deps = ["@rules_python//python:py_binary_bzl"], + deps = [ + ":util_bzl", + "@rules_python//python:py_binary_bzl", + ], ) py_binary( diff --git a/sphinxdocs/private/readthedocs.bzl b/sphinxdocs/private/readthedocs.bzl index 7ee35aa75e..642c32c86d 100644 --- a/sphinxdocs/private/readthedocs.bzl +++ b/sphinxdocs/private/readthedocs.bzl @@ -14,7 +14,7 @@ """Starlark rules for integrating Sphinx and Readthedocs.""" load("@rules_python//python:py_binary.bzl", "py_binary") -load("@rules_python//python/private:util.bzl", "add_tag") # buildifier: disable=bzl-visibility +load("//private:util.bzl", "add_tag") # buildifier: disable=bzl-visibility _INSTALL_MAIN_SRC = Label("//private:readthedocs_install.py") diff --git a/sphinxdocs/private/sphinx.bzl b/sphinxdocs/private/sphinx.bzl index bf8149eb12..394187bc5c 100644 --- a/sphinxdocs/private/sphinx.bzl +++ b/sphinxdocs/private/sphinx.bzl @@ -17,7 +17,7 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@rules_python//python:py_binary.bzl", "py_binary") -load("@rules_python//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility +load("//private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility load(":sphinx_docs_library_info.bzl", "SphinxDocsLibraryInfo") _SPHINX_BUILD_MAIN_SRC = Label("//private:sphinx_build.py") diff --git a/sphinxdocs/private/sphinx_docs_library_macro.bzl b/sphinxdocs/private/sphinx_docs_library_macro.bzl index fd780c128f..dad08b1eaa 100644 --- a/sphinxdocs/private/sphinx_docs_library_macro.bzl +++ b/sphinxdocs/private/sphinx_docs_library_macro.bzl @@ -1,6 +1,6 @@ """Implementation of sphinx_docs_library macro.""" -load("@rules_python//python/private:util.bzl", "add_tag") # buildifier: disable=bzl-visibility +load("//private:util.bzl", "add_tag") # buildifier: disable=bzl-visibility load(":sphinx_docs_library.bzl", _sphinx_docs_library = "sphinx_docs_library") def sphinx_docs_library(**kwargs): diff --git a/sphinxdocs/private/sphinx_stardoc.bzl b/sphinxdocs/private/sphinx_stardoc.bzl index c6ec934ae0..134900d635 100644 --- a/sphinxdocs/private/sphinx_stardoc.bzl +++ b/sphinxdocs/private/sphinx_stardoc.bzl @@ -19,7 +19,7 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//lib:types.bzl", "types") load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc") -load("@rules_python//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility +load("//private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility load("//private:sphinx_docs_library_macro.bzl", "sphinx_docs_library") _StardocInputHelperInfo = provider( diff --git a/sphinxdocs/private/util.bzl b/sphinxdocs/private/util.bzl new file mode 100644 index 0000000000..4d851ec45d --- /dev/null +++ b/sphinxdocs/private/util.bzl @@ -0,0 +1,56 @@ +load("@bazel_skylib//lib:types.bzl", "types") + +# When bzlmod is enabled, canonical repos names have @@ in them, while under +# workspace builds, there is never a @@ in labels. +BZLMOD_ENABLED = "@@" in str(Label("//:unused")) + +def copy_propagating_kwargs(from_kwargs, into_kwargs = None): + """Copies args that must be compatible between two targets with a dependency relationship. + + This is intended for when one target depends on another, so they must have + compatible settings such as `testonly` and `compatible_with`. This usually + happens when a macro generates multiple targets, some of which depend + on one another, so their settings must be compatible. + + Args: + from_kwargs: keyword args dict whose common kwarg will be copied. + into_kwargs: optional keyword args dict that the values from `from_kwargs` + will be copied into. The values in this dict will take precedence + over the ones in `from_kwargs` (i.e., if this has `testonly` already + set, then it won't be overwritten). + NOTE: THIS WILL BE MODIFIED IN-PLACE. + + Returns: + Keyword args to use for the depender target derived from the dependency + target. If `into_kwargs` was passed in, then that same object is + returned; this is to facilitate easy `**` expansion. + """ + if into_kwargs == None: + into_kwargs = {} + + # Include tags because people generally expect tags to propagate. + for attr in ("testonly", "tags", "compatible_with", "restricted_to", "target_compatible_with"): + if attr in from_kwargs and attr not in into_kwargs: + into_kwargs[attr] = from_kwargs[attr] + return into_kwargs + +def add_tag(attrs, tag): + """Adds `tag` to `attrs["tags"]`. + + Args: + attrs: dict of keyword args. It is modified in place. + tag: str, the tag to add. + """ + if "tags" in attrs and attrs["tags"] != None: + tags = attrs["tags"] + + # Preserve the input type: this allows a test verifying the underlying + # rule can accept the tuple for the tags argument. + if types.is_tuple(tags): + attrs["tags"] = tags + (tag,) + else: + # List concatenation is necessary because the original value + # may be a frozen list. + attrs["tags"] = tags + [tag] + else: + attrs["tags"] = [tag] From 97ac4da04fbaf797b54df5b64743ef323d242fb3 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 22 Feb 2026 15:17:51 -0800 Subject: [PATCH 3/7] add bcr config --- .bcr/config.yml | 2 +- .bcr/sphinxdocs/metadata.template.json | 21 +++++++++++ .bcr/sphinxdocs/presubmit.yml | 37 +++++++++++++++++++ .bcr/sphinxdocs/source.template.json | 5 +++ sphinxdocs/integration_tests/bcr/BUILD.bazel | 7 ++++ sphinxdocs/integration_tests/bcr/MODULE.bazel | 16 ++++++++ sphinxdocs/integration_tests/bcr/conf.py | 2 + sphinxdocs/integration_tests/bcr/index.md | 1 + 8 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 .bcr/sphinxdocs/metadata.template.json create mode 100644 .bcr/sphinxdocs/presubmit.yml create mode 100644 .bcr/sphinxdocs/source.template.json create mode 100644 sphinxdocs/integration_tests/bcr/BUILD.bazel create mode 100644 sphinxdocs/integration_tests/bcr/MODULE.bazel create mode 100644 sphinxdocs/integration_tests/bcr/conf.py create mode 100644 sphinxdocs/integration_tests/bcr/index.md diff --git a/.bcr/config.yml b/.bcr/config.yml index f103e35bf7..038761b6df 100644 --- a/.bcr/config.yml +++ b/.bcr/config.yml @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -moduleRoots: [".", "gazelle"] +moduleRoots: [".", "gazelle", "sphinxdocs"] diff --git a/.bcr/sphinxdocs/metadata.template.json b/.bcr/sphinxdocs/metadata.template.json new file mode 100644 index 0000000000..017f9d3774 --- /dev/null +++ b/.bcr/sphinxdocs/metadata.template.json @@ -0,0 +1,21 @@ +{ + "homepage": "https://github.com/bazel-contrib/rules_python", + "maintainers": [ + { + "name": "Richard Levasseur", + "email": "richardlev@gmail.com", + "github": "rickeylev" + }, + { + "name": "Ignas Anikevicius", + "email": "bcr-ignas@use.startmail.com", + "github": "aignas" + } + ], + "repository": [ + "github:bazelbuild/rules_python", + "github:bazel-contrib/rules_python" + ], + "versions": [], + "yanked_versions": {} +} diff --git a/.bcr/sphinxdocs/presubmit.yml b/.bcr/sphinxdocs/presubmit.yml new file mode 100644 index 0000000000..d62a3e0007 --- /dev/null +++ b/.bcr/sphinxdocs/presubmit.yml @@ -0,0 +1,37 @@ +# Copyright 2023 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +bcr_test_module: + module_path: "integration_tests/bcr" + matrix: + platform: ["debian11", "macos", "ubuntu2204", "windows"] + bazel: [7.*, 8.*, 9.*] + tasks: + run_tests: + name: "Run test module" + platform: ${{ platform }} + bazel: ${{ bazel }} + shell_commands: + - "echo 'common --override_module=rules_python=' >> .bazelrc" + batch_commands: + - "echo common --override_module=rules_python= >> .bazelrc" + test_flags: + # Minimum bazel supported C++ + - "--keep_going" + - '--cxxopt=-std=c++17' + - '--host_cxxopt=-std=c++17' + build_targets: + - "//..." + test_targets: + - "//..." diff --git a/.bcr/sphinxdocs/source.template.json b/.bcr/sphinxdocs/source.template.json new file mode 100644 index 0000000000..b2a2d1ef23 --- /dev/null +++ b/.bcr/sphinxdocs/source.template.json @@ -0,0 +1,5 @@ +{ + "integrity": "", + "strip_prefix": "{REPO}-{VERSION}/sphinxdocs", + "url": "https://github.com/{OWNER}/{REPO}/releases/download/{TAG}/rules_python-{TAG}.tar.gz" +} diff --git a/sphinxdocs/integration_tests/bcr/BUILD.bazel b/sphinxdocs/integration_tests/bcr/BUILD.bazel new file mode 100644 index 0000000000..11c721323b --- /dev/null +++ b/sphinxdocs/integration_tests/bcr/BUILD.bazel @@ -0,0 +1,7 @@ +load("@sphinxdocs//:sphinx.bzl", "sphinx_docs") + +sphinx_docs( + name = "docs", + srcs = ["index.md"], + conf = "conf.py", +) diff --git a/sphinxdocs/integration_tests/bcr/MODULE.bazel b/sphinxdocs/integration_tests/bcr/MODULE.bazel new file mode 100644 index 0000000000..6a25aa5e4c --- /dev/null +++ b/sphinxdocs/integration_tests/bcr/MODULE.bazel @@ -0,0 +1,16 @@ +module( + name = "sphinxdocs_example", + version = "0.0.0", +) + +bazel_dep(name = "sphinxdocs", version = "0.0.0") +local_path_override( + module_name = "sphinxdocs", + path = "../..", +) + +bazel_dep(name = "rules_python", version = "0.0.0") +local_path_override( + module_name = "rules_python", + path = "../../..", +) diff --git a/sphinxdocs/integration_tests/bcr/conf.py b/sphinxdocs/integration_tests/bcr/conf.py new file mode 100644 index 0000000000..3b751bf402 --- /dev/null +++ b/sphinxdocs/integration_tests/bcr/conf.py @@ -0,0 +1,2 @@ +extensions = ["myst_parser"] +master_doc = "index" diff --git a/sphinxdocs/integration_tests/bcr/index.md b/sphinxdocs/integration_tests/bcr/index.md new file mode 100644 index 0000000000..bfe100937d --- /dev/null +++ b/sphinxdocs/integration_tests/bcr/index.md @@ -0,0 +1 @@ +# Sphinxdocs example From e8d4338d3ad0e617bf792cce9f26fec48d4e096b Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 22 Feb 2026 15:58:53 -0800 Subject: [PATCH 4/7] rm windows in bcr --- .bcr/sphinxdocs/presubmit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bcr/sphinxdocs/presubmit.yml b/.bcr/sphinxdocs/presubmit.yml index d62a3e0007..542f65a142 100644 --- a/.bcr/sphinxdocs/presubmit.yml +++ b/.bcr/sphinxdocs/presubmit.yml @@ -15,7 +15,7 @@ bcr_test_module: module_path: "integration_tests/bcr" matrix: - platform: ["debian11", "macos", "ubuntu2204", "windows"] + platform: ["debian11", "macos", "ubuntu2204"] bazel: [7.*, 8.*, 9.*] tasks: run_tests: From 502d5074f3754832bcc7144e79c63d8ffe6a2195 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 22 Feb 2026 16:01:40 -0800 Subject: [PATCH 5/7] add bazelrc --- sphinxdocs/.bazelrc | 22 ++++++++++++++++++++++ sphinxdocs/.bazelversion | 1 + 2 files changed, 23 insertions(+) create mode 100644 sphinxdocs/.bazelrc create mode 100644 sphinxdocs/.bazelversion diff --git a/sphinxdocs/.bazelrc b/sphinxdocs/.bazelrc new file mode 100644 index 0000000000..1bf0263c5e --- /dev/null +++ b/sphinxdocs/.bazelrc @@ -0,0 +1,22 @@ +import %workspace%/.bazelrc.deleted_packages + +test --test_output=errors + +build --incompatible_default_to_explicit_init_py +build --//python/config_settings:incompatible_default_to_explicit_init_py=True + +# Ensure ongoing compatibility with this flag. +common --incompatible_disallow_struct_provider_syntax +# Makes Bazel 7 act more like Bazel 8 +common --incompatible_use_plus_in_repo_names + +# Explicitly enable for Windows +build --enable_runfiles + +# Local disk cache greatly speeds up builds if the regular cache is lost +common --disk_cache=~/.cache/bazel/bazel-disk-cache + +common --incompatible_python_disallow_native_rules +common --incompatible_no_implicit_file_export + +build --lockfile_mode=update diff --git a/sphinxdocs/.bazelversion b/sphinxdocs/.bazelversion new file mode 100644 index 0000000000..c6b7980b68 --- /dev/null +++ b/sphinxdocs/.bazelversion @@ -0,0 +1 @@ +8.x From 701d1de31db7af3279e7f771cc23ca9a99cbf9cc Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 22 Feb 2026 16:03:11 -0800 Subject: [PATCH 6/7] fixup bazlerc --- sphinxdocs/.bazelrc | 2 +- sphinxdocs/.bazelrc.deleted_packages | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 sphinxdocs/.bazelrc.deleted_packages diff --git a/sphinxdocs/.bazelrc b/sphinxdocs/.bazelrc index 1bf0263c5e..caefd0af53 100644 --- a/sphinxdocs/.bazelrc +++ b/sphinxdocs/.bazelrc @@ -3,7 +3,7 @@ import %workspace%/.bazelrc.deleted_packages test --test_output=errors build --incompatible_default_to_explicit_init_py -build --//python/config_settings:incompatible_default_to_explicit_init_py=True +build --@rules_python//python/config_settings:incompatible_default_to_explicit_init_py=True # Ensure ongoing compatibility with this flag. common --incompatible_disallow_struct_provider_syntax diff --git a/sphinxdocs/.bazelrc.deleted_packages b/sphinxdocs/.bazelrc.deleted_packages new file mode 100644 index 0000000000..442c80e960 --- /dev/null +++ b/sphinxdocs/.bazelrc.deleted_packages @@ -0,0 +1 @@ +common --deleted_packages=integration_tests/bcr From 3f0f040938d1928939a5543fd74dc51e0f3dc4dd Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 22 Feb 2026 21:34:38 -0800 Subject: [PATCH 7/7] format --- docs/BUILD.bazel | 6 +++--- docs/conf.py | 5 ++++- sphinxdocs/MODULE.bazel | 1 - sphinxdocs/docs/BUILD.bazel | 2 +- sphinxdocs/private/BUILD.bazel | 6 +++--- sphinxdocs/private/sphinx_stardoc.bzl | 2 +- sphinxdocs/private/util.bzl | 2 ++ sphinxdocs/src/sphinx_bzl/bzl.py | 4 +--- 8 files changed, 15 insertions(+), 13 deletions(-) diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index 7b5af451f0..cb412fbc44 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -14,13 +14,13 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@dev_pip//:requirements.bzl", "requirement") -load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility -load("//python/private:common_labels.bzl", "labels") # buildifier: disable=bzl-visibility -load("//python/uv:lock.bzl", "lock") # buildifier: disable=bzl-visibility load("@sphinxdocs//:readthedocs.bzl", "readthedocs_install") load("@sphinxdocs//:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") load("@sphinxdocs//:sphinx_docs_library.bzl", "sphinx_docs_library") load("@sphinxdocs//:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") +load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility +load("//python/private:common_labels.bzl", "labels") # buildifier: disable=bzl-visibility +load("//python/uv:lock.bzl", "lock") # buildifier: disable=bzl-visibility package(default_visibility = ["//:__subpackages__"]) diff --git a/docs/conf.py b/docs/conf.py index 9411e394af..e8f55b2279 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -139,7 +139,10 @@ # --- Extlinks configuration extlinks = { - "gh-issue": (f"https://github.com/bazel-contrib/rules_python/issues/%s", "#%s issue"), + "gh-issue": ( + f"https://github.com/bazel-contrib/rules_python/issues/%s", + "#%s issue", + ), "gh-path": (f"https://github.com/bazel-contrib/rules_python/tree/main/%s", "%s"), "gh-pr": (f"https://github.com/bazel-contrib/rules_python/pull/%s", "#%s PR"), } diff --git a/sphinxdocs/MODULE.bazel b/sphinxdocs/MODULE.bazel index 615f95eb7a..bbb9d7a688 100644 --- a/sphinxdocs/MODULE.bazel +++ b/sphinxdocs/MODULE.bazel @@ -9,7 +9,6 @@ bazel_dep(name = "stardoc", version = "0.7.2", repo_name = "io_bazel_stardoc") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "protobuf", version = "29.0-rc2", repo_name = "com_google_protobuf") bazel_dep(name = "rules_python", version = "0.0.0") - local_path_override( module_name = "rules_python", path = "..", diff --git a/sphinxdocs/docs/BUILD.bazel b/sphinxdocs/docs/BUILD.bazel index 5dfde5bd6d..24468a4922 100644 --- a/sphinxdocs/docs/BUILD.bazel +++ b/sphinxdocs/docs/BUILD.bazel @@ -1,6 +1,6 @@ -load("//private:util.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility load("//:sphinx_docs_library.bzl", "sphinx_docs_library") load("//:sphinx_stardoc.bzl", "sphinx_stardocs") +load("//private:util.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility package(default_visibility = ["//:__subpackages__"]) diff --git a/sphinxdocs/private/BUILD.bazel b/sphinxdocs/private/BUILD.bazel index 23fa8ea24b..078fc861c6 100644 --- a/sphinxdocs/private/BUILD.bazel +++ b/sphinxdocs/private/BUILD.bazel @@ -66,15 +66,15 @@ bzl_library( name = "sphinx_bzl", srcs = ["sphinx.bzl"], deps = [ - ":util_bzl", ":sphinx_docs_library_info_bzl", - "@rules_python//python:py_binary_bzl", + ":util_bzl", "@bazel_skylib//:bzl_library", "@bazel_skylib//lib:paths", "@bazel_skylib//lib:types", "@bazel_skylib//rules:build_test", "@bazel_skylib//rules:common_settings", "@io_bazel_stardoc//stardoc:stardoc_lib", + "@rules_python//python:py_binary_bzl", ], ) @@ -83,8 +83,8 @@ bzl_library( srcs = ["sphinx_stardoc.bzl"], deps = [ ":sphinx_docs_library_macro_bzl", - "//private:util_bzl", "//:sphinx_bzl", + "//private:util_bzl", "@bazel_skylib//:bzl_library", "@bazel_skylib//lib:paths", "@bazel_skylib//lib:types", diff --git a/sphinxdocs/private/sphinx_stardoc.bzl b/sphinxdocs/private/sphinx_stardoc.bzl index 134900d635..13f7eb61da 100644 --- a/sphinxdocs/private/sphinx_stardoc.bzl +++ b/sphinxdocs/private/sphinx_stardoc.bzl @@ -19,8 +19,8 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//lib:types.bzl", "types") load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc") -load("//private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility load("//private:sphinx_docs_library_macro.bzl", "sphinx_docs_library") +load("//private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility _StardocInputHelperInfo = provider( doc = "Extracts the single source file from a bzl library.", diff --git a/sphinxdocs/private/util.bzl b/sphinxdocs/private/util.bzl index 4d851ec45d..0dcbc36fef 100644 --- a/sphinxdocs/private/util.bzl +++ b/sphinxdocs/private/util.bzl @@ -1,3 +1,5 @@ +"""Utility functions used by sphinxdocs.""" + load("@bazel_skylib//lib:types.bzl", "types") # When bzlmod is enabled, canonical repos names have @@ in them, while under diff --git a/sphinxdocs/src/sphinx_bzl/bzl.py b/sphinxdocs/src/sphinx_bzl/bzl.py index 4f24014b4f..a1f47b3b1d 100644 --- a/sphinxdocs/src/sphinx_bzl/bzl.py +++ b/sphinxdocs/src/sphinx_bzl/bzl.py @@ -1754,9 +1754,7 @@ def clear_doc(self, docname: str) -> None: if entry.full_id in self.data["objects"]: del self.data["objects"][entry.full_id] - if entry.full_id in self.data["objects_by_type"].get( - entry.object_type, {} - ): + if entry.full_id in self.data["objects_by_type"].get(entry.object_type, {}): del self.data["objects_by_type"][entry.object_type][entry.full_id] # We can't easily reverse the mapping for alt_names, so we have