move rules_python_external out of experimental - mv experimental/rules_python_external -> python/pip_install - mv examples/rules_python_external -> examples/pip_install This promotes rules_python_external as a public API in rules_python. In a follow-up PR we'll update the documentation to indicate this and instruct users how to switch.
diff --git a/.bazelrc b/.bazelrc index ca4af76..92711d8 100644 --- a/.bazelrc +++ b/.bazelrc
@@ -3,7 +3,7 @@ # This lets us glob() up all the files inside the examples to make them inputs to tests # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, run tools/bazel_integration_test/update_deleted_packages.sh -build --deleted_packages=examples/pip/boto,examples/pip/extras,examples/pip/helloworld,examples/rules_python_external -query --deleted_packages=examples/pip/boto,examples/pip/extras,examples/pip/helloworld,examples/rules_python_external +build --deleted_packages=examples/pip/boto,examples/pip/extras,examples/pip/helloworld,examples/pip_install +query --deleted_packages=examples/pip/boto,examples/pip/extras,examples/pip/helloworld,examples/pip_install test --test_output=errors
diff --git a/BUILD b/BUILD index d3487d2..8458bc7 100644 --- a/BUILD +++ b/BUILD
@@ -27,7 +27,7 @@ "LICENSE", "internal_deps.bzl", "internal_setup.bzl", - "//experimental/rules_python_external:distribution", + "//python/pip_install:distribution", "//python:distribution", "//tools:distribution", ],
diff --git a/docs/BUILD b/docs/BUILD index b84e250..4da9d80 100644 --- a/docs/BUILD +++ b/docs/BUILD
@@ -39,6 +39,13 @@ ) bzl_library( + name = "bazel_repo_tools", + srcs = [ + "@bazel_tools//tools:bzl_srcs", + ] +) + +bzl_library( name = "defs", srcs = [ "//python:defs.bzl", @@ -62,6 +69,10 @@ name = "pip-docs", out = "pip.md", input = "//python:pip.bzl", + deps = [ + ":bazel_repo_tools", + "//python/pip_install:bzl", + ], ) stardoc(
diff --git a/examples/BUILD b/examples/BUILD index 2d9bdaa..92d899d 100644 --- a/examples/BUILD +++ b/examples/BUILD
@@ -23,6 +23,6 @@ ) bazel_integration_test( - name = "rules_python_external_example", + name = "pip_install_example", timeout = "long", )
diff --git a/examples/rules_python_external/BUILD b/examples/pip_install/BUILD similarity index 100% rename from examples/rules_python_external/BUILD rename to examples/pip_install/BUILD
diff --git a/examples/pip_install/README.md b/examples/pip_install/README.md new file mode 100644 index 0000000..7657787 --- /dev/null +++ b/examples/pip_install/README.md
@@ -0,0 +1,4 @@ +# pip_install example + +This example shows how to use pip to fetch external dependencies from a requirements.txt file, +then use them in BUILD files as dependencies of Bazel targets.
diff --git a/examples/rules_python_external/WORKSPACE b/examples/pip_install/WORKSPACE similarity index 96% rename from examples/rules_python_external/WORKSPACE rename to examples/pip_install/WORKSPACE index 81dcd9b..c492d19 100644 --- a/examples/rules_python_external/WORKSPACE +++ b/examples/pip_install/WORKSPACE
@@ -12,7 +12,7 @@ py_repositories() -load("@rules_python//experimental/rules_python_external:defs.bzl", "pip_install") +load("@rules_python//python:pip.bzl", "pip_install") pip_install( # (Optional) You can provide extra parameters to pip.
diff --git a/examples/rules_python_external/main.py b/examples/pip_install/main.py similarity index 100% rename from examples/rules_python_external/main.py rename to examples/pip_install/main.py
diff --git a/examples/rules_python_external/requirements.txt b/examples/pip_install/requirements.txt similarity index 100% rename from examples/rules_python_external/requirements.txt rename to examples/pip_install/requirements.txt
diff --git a/examples/rules_python_external/test.py b/examples/pip_install/test.py similarity index 100% rename from examples/rules_python_external/test.py rename to examples/pip_install/test.py
diff --git a/examples/rules_python_external/README.md b/examples/rules_python_external/README.md deleted file mode 100644 index b432f0b..0000000 --- a/examples/rules_python_external/README.md +++ /dev/null
@@ -1,7 +0,0 @@ -# rules_python_external example - -This example shows how to use rules_python_external which was developed as an alternative -to packaging rules in rules_python. - -We will soon migrate this example to be the canonical one for rules_python. -See https://github.com/bazelbuild/rules_python/pull/352 for the longer plan.
diff --git a/experimental/rules_python_external/BUILD b/experimental/rules_python_external/BUILD deleted file mode 100644 index 657c956..0000000 --- a/experimental/rules_python_external/BUILD +++ /dev/null
@@ -1,8 +0,0 @@ -filegroup( - name = "distribution", - srcs = glob(["*.bzl"]) + [ - "BUILD", - "//experimental/rules_python_external/extract_wheels:distribution", - ], - visibility = ["//:__pkg__"], -)
diff --git a/experimental/rules_python_external/extract_wheels/BUILD b/experimental/rules_python_external/extract_wheels/BUILD deleted file mode 100644 index f780b0d..0000000 --- a/experimental/rules_python_external/extract_wheels/BUILD +++ /dev/null
@@ -1,19 +0,0 @@ -load("@rules_python//python:defs.bzl", "py_binary") - -py_binary( - name = "extract_wheels", - srcs = [ - "__init__.py", - "__main__.py", - ], - main = "__main__.py", - deps = ["//experimental/rules_python_external/extract_wheels/lib"], -) - -filegroup( - name = "distribution", - srcs = glob(["*"]) + [ - "//experimental/rules_python_external/extract_wheels/lib:distribution", - ], - visibility = ["//experimental/rules_python_external:__subpackages__"], -)
diff --git a/experimental/rules_python_external/extract_wheels/__main__.py b/experimental/rules_python_external/extract_wheels/__main__.py deleted file mode 100644 index 6aed7cd..0000000 --- a/experimental/rules_python_external/extract_wheels/__main__.py +++ /dev/null
@@ -1,5 +0,0 @@ -"""Main entry point.""" -from experimental.rules_python_external.extract_wheels import main - -if __name__ == "__main__": - main()
diff --git a/internal_setup.bzl b/internal_setup.bzl index 646b86c..8609915 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl
@@ -7,8 +7,8 @@ "@piptool_deps//:requirements.bzl", _piptool_install = "pip_install", ) - load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS") +load("//python/pip_install:repositories.bzl", "pip_install_dependencies") def rules_python_internal_setup(): """Setup for rules_python tests and tools.""" @@ -16,5 +16,8 @@ # Requirements for building our piptool. _piptool_install() + # Because we don't use the pip_install rule, we have to call this to fetch its deps + pip_install_dependencies() + # Depend on the Bazel binaries for running bazel-in-bazel tests bazel_binaries(versions = SUPPORTED_BAZEL_VERSIONS)
diff --git a/python/pip.bzl b/python/pip.bzl index e6c8f63..bbaca94 100644 --- a/python/pip.bzl +++ b/python/pip.bzl
@@ -13,6 +13,9 @@ # limitations under the License. """Import pip requirements into Bazel.""" +load("//python/pip_install:pip_repository.bzl", "pip_repository") +load("//python/pip_install:repositories.bzl", "pip_install_dependencies") + def _pip_import_impl(repository_ctx): """Core implementation of pip_import.""" @@ -171,3 +174,43 @@ """ message += "=" * 79 fail(message) + +def pip_install(requirements, name = "pip", **kwargs): + """Imports a `requirements.txt` file and generates a new `requirements.bzl` file. + + This is used via the `WORKSPACE` pattern: + + ```python + pip_install( + requirements = ":requirements.txt", + ) + ``` + + You can then reference imported dependencies from your `BUILD` file with: + + ```python + load("@pip//:requirements.bzl", "requirement") + py_library( + name = "bar", + ... + deps = [ + "//my/other:dep", + requirement("requests"), + requirement("numpy"), + ], + ) + ``` + + Args: + requirements: A 'requirements.txt' pip requirements file. + name: A unique name for the created external repository (default 'pip'). + **kwargs: Keyword arguments passed directly to the `pip_repository` repository rule. + """ + # Just in case our dependencies weren't already fetched + pip_install_dependencies() + + pip_repository( + name = name, + requirements = requirements, + **kwargs + )
diff --git a/experimental/rules_python_external/.gitignore b/python/pip_install/.gitignore similarity index 100% rename from experimental/rules_python_external/.gitignore rename to python/pip_install/.gitignore
diff --git a/python/pip_install/BUILD b/python/pip_install/BUILD new file mode 100644 index 0000000..b37170e --- /dev/null +++ b/python/pip_install/BUILD
@@ -0,0 +1,19 @@ +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") + +filegroup( + name = "distribution", + srcs = glob(["*.bzl"]) + [ + "BUILD", + "//python/pip_install/extract_wheels:distribution", + ], + visibility = ["//:__pkg__"], +) + +bzl_library( + name = "bzl", + srcs = [ + "pip_repository.bzl", + "repositories.bzl", + ], + visibility = ["//docs:__pkg__"], +)
diff --git a/experimental/rules_python_external/README.md b/python/pip_install/README.md similarity index 100% rename from experimental/rules_python_external/README.md rename to python/pip_install/README.md
diff --git a/python/pip_install/extract_wheels/BUILD b/python/pip_install/extract_wheels/BUILD new file mode 100644 index 0000000..92a0c7a --- /dev/null +++ b/python/pip_install/extract_wheels/BUILD
@@ -0,0 +1,19 @@ +load("@rules_python//python:defs.bzl", "py_binary") + +py_binary( + name = "extract_wheels", + srcs = [ + "__init__.py", + "__main__.py", + ], + main = "__main__.py", + deps = ["//python/pip_install/extract_wheels/lib"], +) + +filegroup( + name = "distribution", + srcs = glob(["*"]) + [ + "//python/pip_install/extract_wheels/lib:distribution", + ], + visibility = ["//python/pip_install:__subpackages__"], +)
diff --git a/experimental/rules_python_external/extract_wheels/__init__.py b/python/pip_install/extract_wheels/__init__.py similarity index 97% rename from experimental/rules_python_external/extract_wheels/__init__.py rename to python/pip_install/extract_wheels/__init__.py index 79f87e5..879b676 100644 --- a/experimental/rules_python_external/extract_wheels/__init__.py +++ b/python/pip_install/extract_wheels/__init__.py
@@ -12,7 +12,7 @@ import sys import json -from experimental.rules_python_external.extract_wheels.lib import bazel, requirements +from python.pip_install.extract_wheels.lib import bazel, requirements def configure_reproducible_wheels() -> None:
diff --git a/python/pip_install/extract_wheels/__main__.py b/python/pip_install/extract_wheels/__main__.py new file mode 100644 index 0000000..40b690e --- /dev/null +++ b/python/pip_install/extract_wheels/__main__.py
@@ -0,0 +1,5 @@ +"""Main entry point.""" +from python.pip_install.extract_wheels import main + +if __name__ == "__main__": + main()
diff --git a/experimental/rules_python_external/extract_wheels/lib/BUILD b/python/pip_install/extract_wheels/lib/BUILD similarity index 76% rename from experimental/rules_python_external/extract_wheels/lib/BUILD rename to python/pip_install/extract_wheels/lib/BUILD index c78c517..001e333 100644 --- a/experimental/rules_python_external/extract_wheels/lib/BUILD +++ b/python/pip_install/extract_wheels/lib/BUILD
@@ -1,5 +1,5 @@ load("@rules_python//python:defs.bzl", "py_library", "py_test") -load("//experimental/rules_python_external:repositories.bzl", "requirement") +load("//python/pip_install:repositories.bzl", "requirement") py_library( name = "lib", @@ -10,7 +10,7 @@ "requirements.py", "wheel.py", ], - visibility = ["//experimental/rules_python_external/extract_wheels:__subpackages__"], + visibility = ["//python/pip_install/extract_wheels:__subpackages__"], deps = [ requirement("pkginfo"), requirement("setuptools"), @@ -47,5 +47,5 @@ ["*"], exclude = ["*_test.py"], ), - visibility = ["//experimental/rules_python_external:__subpackages__"], + visibility = ["//python/pip_install:__subpackages__"], )
diff --git a/experimental/rules_python_external/extract_wheels/lib/__init__.py b/python/pip_install/extract_wheels/lib/__init__.py similarity index 100% rename from experimental/rules_python_external/extract_wheels/lib/__init__.py rename to python/pip_install/extract_wheels/lib/__init__.py
diff --git a/experimental/rules_python_external/extract_wheels/lib/bazel.py b/python/pip_install/extract_wheels/lib/bazel.py similarity index 97% rename from experimental/rules_python_external/extract_wheels/lib/bazel.py rename to python/pip_install/extract_wheels/lib/bazel.py index fb92c0a..978f3a9 100644 --- a/experimental/rules_python_external/extract_wheels/lib/bazel.py +++ b/python/pip_install/extract_wheels/lib/bazel.py
@@ -4,7 +4,7 @@ import json from typing import Iterable, List, Dict, Set -from experimental.rules_python_external.extract_wheels.lib import namespace_pkgs, wheel, purelib +from python.pip_install.extract_wheels.lib import namespace_pkgs, wheel, purelib def generate_build_file_contents(
diff --git a/experimental/rules_python_external/extract_wheels/lib/namespace_pkgs.py b/python/pip_install/extract_wheels/lib/namespace_pkgs.py similarity index 96% rename from experimental/rules_python_external/extract_wheels/lib/namespace_pkgs.py rename to python/pip_install/extract_wheels/lib/namespace_pkgs.py index 8f7e57f..82804c5 100644 --- a/experimental/rules_python_external/extract_wheels/lib/namespace_pkgs.py +++ b/python/pip_install/extract_wheels/lib/namespace_pkgs.py
@@ -3,7 +3,7 @@ import textwrap from typing import Set, List, Optional -from experimental.rules_python_external.extract_wheels.lib import wheel +from python.pip_install.extract_wheels.lib import wheel def implicit_namespace_packages(
diff --git a/experimental/rules_python_external/extract_wheels/lib/namespace_pkgs_test.py b/python/pip_install/extract_wheels/lib/namespace_pkgs_test.py similarity index 95% rename from experimental/rules_python_external/extract_wheels/lib/namespace_pkgs_test.py rename to python/pip_install/extract_wheels/lib/namespace_pkgs_test.py index f1b299e..5eec5c3 100644 --- a/experimental/rules_python_external/extract_wheels/lib/namespace_pkgs_test.py +++ b/python/pip_install/extract_wheels/lib/namespace_pkgs_test.py
@@ -4,7 +4,7 @@ from typing import Optional import unittest -from experimental.rules_python_external.extract_wheels.lib import namespace_pkgs +from python.pip_install.extract_wheels.lib import namespace_pkgs class TempDir:
diff --git a/experimental/rules_python_external/extract_wheels/lib/purelib.py b/python/pip_install/extract_wheels/lib/purelib.py similarity index 96% rename from experimental/rules_python_external/extract_wheels/lib/purelib.py rename to python/pip_install/extract_wheels/lib/purelib.py index 830ce70..99f6299 100644 --- a/experimental/rules_python_external/extract_wheels/lib/purelib.py +++ b/python/pip_install/extract_wheels/lib/purelib.py
@@ -2,7 +2,7 @@ import pathlib import shutil -from experimental.rules_python_external.extract_wheels.lib import wheel +from python.pip_install.extract_wheels.lib import wheel def spread_purelib_into_root(wheel_dir: str) -> None:
diff --git a/experimental/rules_python_external/extract_wheels/lib/requirements.py b/python/pip_install/extract_wheels/lib/requirements.py similarity index 100% rename from experimental/rules_python_external/extract_wheels/lib/requirements.py rename to python/pip_install/extract_wheels/lib/requirements.py
diff --git a/experimental/rules_python_external/extract_wheels/lib/requirements_test.py b/python/pip_install/extract_wheels/lib/requirements_test.py similarity index 92% rename from experimental/rules_python_external/extract_wheels/lib/requirements_test.py rename to python/pip_install/extract_wheels/lib/requirements_test.py index c06297a..ba7ee13 100644 --- a/experimental/rules_python_external/extract_wheels/lib/requirements_test.py +++ b/python/pip_install/extract_wheels/lib/requirements_test.py
@@ -1,6 +1,6 @@ import unittest -from experimental.rules_python_external.extract_wheels.lib import requirements +from python.pip_install.extract_wheels.lib import requirements class TestRequirementExtrasParsing(unittest.TestCase):
diff --git a/experimental/rules_python_external/extract_wheels/lib/wheel.py b/python/pip_install/extract_wheels/lib/wheel.py similarity index 100% rename from experimental/rules_python_external/extract_wheels/lib/wheel.py rename to python/pip_install/extract_wheels/lib/wheel.py
diff --git a/experimental/rules_python_external/defs.bzl b/python/pip_install/pip_repository.bzl similarity index 77% rename from experimental/rules_python_external/defs.bzl rename to python/pip_install/pip_repository.bzl index 6f894e6..b2cb0a8 100644 --- a/experimental/rules_python_external/defs.bzl +++ b/python/pip_install/pip_repository.bzl
@@ -1,8 +1,6 @@ "" -load("//experimental/rules_python_external:repositories.bzl", "all_requirements", "rules_python_external_dependencies") - -DEFAULT_REPOSITORY_NAME = "pip" +load("//python/pip_install:repositories.bzl", "all_requirements") def _pip_repository_impl(rctx): python_interpreter = rctx.attr.python_interpreter @@ -30,7 +28,7 @@ args = [ python_interpreter, "-m", - "experimental.rules_python_external.extract_wheels", + "python.pip_install.extract_wheels", "--requirements", rctx.path(rctx.attr.requirements), "--repo", @@ -147,43 +145,3 @@ ``` """, ) - -def pip_install(requirements, name = DEFAULT_REPOSITORY_NAME, **kwargs): - """Imports a `requirements.txt` file and generates a new `requirements.bzl` file. - - This is used via the `WORKSPACE` pattern: - - ```python - pip_install( - requirements = ":requirements.txt", - ) - ``` - - You can then reference imported dependencies from your `BUILD` file with: - - ```python - load("@pip//:requirements.bzl", "requirement") - py_library( - name = "bar", - ... - deps = [ - "//my/other:dep", - requirement("requests"), - requirement("numpy"), - ], - ) - ``` - - Args: - requirements: A 'requirements.txt' pip requirements file. - name: A unique name for the created external repository (default 'pip'). - **kwargs: Keyword arguments passed directly to the `pip_repository` repository rule. - """ - # Just in case our dependencies weren't already fetched - rules_python_external_dependencies() - - pip_repository( - name = name, - requirements = requirements, - **kwargs - )
diff --git a/experimental/rules_python_external/repositories.bzl b/python/pip_install/repositories.bzl similarity index 92% rename from experimental/rules_python_external/repositories.bzl rename to python/pip_install/repositories.bzl index 00dc900..df63674 100644 --- a/experimental/rules_python_external/repositories.bzl +++ b/python/pip_install/repositories.bzl
@@ -47,9 +47,11 @@ def requirement(pkg): return "@pypi__" + pkg + "//:lib" -def rules_python_external_dependencies(): +def pip_install_dependencies(): """ - Fetch dependencies these rules depend on. Workspaces that use the rules_python_external should call this. + Fetch dependencies these rules depend on. Workspaces that use the pip_install rule can call this. + + (However we call it from pip_install, making it optional for users to do so.) """ for (name, url, sha256) in _RULE_DEPS: maybe(