move pip_import rule to legacy_pip_import
BREAKING CHANGE:
The load statement for "pip_import" and "pip_repositories" has moved to //python/legacy_pip_import:pip.bzl
Use of the old load site will print a failure message indicating this.
diff --git a/.bazelrc b/.bazelrc
index 92711d8..1afaedb 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/pip_install
-query --deleted_packages=examples/pip/boto,examples/pip/extras,examples/pip/helloworld,examples/pip_install
+build --deleted_packages=examples/legacy_pip_import/boto,examples/legacy_pip_import/extras,examples/legacy_pip_import/helloworld,examples/pip_install
+query --deleted_packages=examples/legacy_pip_import/boto,examples/legacy_pip_import/extras,examples/legacy_pip_import/helloworld,examples/pip_install
test --test_output=errors
diff --git a/examples/BUILD b/examples/BUILD
index 92d899d..092ad40 100644
--- a/examples/BUILD
+++ b/examples/BUILD
@@ -18,7 +18,7 @@
licenses(["notice"]) # Apache 2.0
bazel_integration_test(
- name = "pip_example",
+ name = "legacy_pip_import_example",
timeout = "long",
)
diff --git a/examples/pip/.bazelrc b/examples/legacy_pip_import/.bazelrc
similarity index 100%
rename from examples/pip/.bazelrc
rename to examples/legacy_pip_import/.bazelrc
diff --git a/examples/pip/README.md b/examples/legacy_pip_import/README.md
similarity index 64%
rename from examples/pip/README.md
rename to examples/legacy_pip_import/README.md
index 0c4ffa8..8ce8438 100644
--- a/examples/pip/README.md
+++ b/examples/legacy_pip_import/README.md
@@ -1,4 +1,6 @@
-# pip example
+# LEGACY pip example
+
+This feature has been replaced by the pip_install rule, please see the latest release notes to migrate.
This shows how you can point Bazel at your requirements.txt file to get dependencies automatically installed.
diff --git a/examples/pip/WORKSPACE b/examples/legacy_pip_import/WORKSPACE
similarity index 90%
rename from examples/pip/WORKSPACE
rename to examples/legacy_pip_import/WORKSPACE
index 5c8d22a..af84004 100644
--- a/examples/pip/WORKSPACE
+++ b/examples/legacy_pip_import/WORKSPACE
@@ -8,7 +8,7 @@
sha256 = "e46612e9bb0dae8745de6a0643be69e8665a03f63163ac6610c210e80d14c3e4",
)
-load("@rules_python//python:pip.bzl", "pip_import", "pip_repositories")
+load("@rules_python//python/legacy_pip_import:pip.bzl", "pip_import", "pip_repositories")
pip_repositories()
diff --git a/examples/pip/boto/BUILD b/examples/legacy_pip_import/boto/BUILD
similarity index 100%
rename from examples/pip/boto/BUILD
rename to examples/legacy_pip_import/boto/BUILD
diff --git a/examples/pip/boto/boto_test.py b/examples/legacy_pip_import/boto/boto_test.py
similarity index 100%
rename from examples/pip/boto/boto_test.py
rename to examples/legacy_pip_import/boto/boto_test.py
diff --git a/examples/pip/boto/requirements.txt b/examples/legacy_pip_import/boto/requirements.txt
similarity index 100%
rename from examples/pip/boto/requirements.txt
rename to examples/legacy_pip_import/boto/requirements.txt
diff --git a/examples/pip/extras/BUILD b/examples/legacy_pip_import/extras/BUILD
similarity index 100%
rename from examples/pip/extras/BUILD
rename to examples/legacy_pip_import/extras/BUILD
diff --git a/examples/pip/extras/extras_test.py b/examples/legacy_pip_import/extras/extras_test.py
similarity index 100%
rename from examples/pip/extras/extras_test.py
rename to examples/legacy_pip_import/extras/extras_test.py
diff --git a/examples/pip/extras/requirements.txt b/examples/legacy_pip_import/extras/requirements.txt
similarity index 100%
rename from examples/pip/extras/requirements.txt
rename to examples/legacy_pip_import/extras/requirements.txt
diff --git a/examples/pip/extras/version_test.py b/examples/legacy_pip_import/extras/version_test.py
similarity index 100%
rename from examples/pip/extras/version_test.py
rename to examples/legacy_pip_import/extras/version_test.py
diff --git a/examples/pip/helloworld/BUILD b/examples/legacy_pip_import/helloworld/BUILD
similarity index 100%
rename from examples/pip/helloworld/BUILD
rename to examples/legacy_pip_import/helloworld/BUILD
diff --git a/examples/pip/helloworld/helloworld.py b/examples/legacy_pip_import/helloworld/helloworld.py
similarity index 100%
rename from examples/pip/helloworld/helloworld.py
rename to examples/legacy_pip_import/helloworld/helloworld.py
diff --git a/examples/pip/helloworld/helloworld_test.py b/examples/legacy_pip_import/helloworld/helloworld_test.py
similarity index 100%
rename from examples/pip/helloworld/helloworld_test.py
rename to examples/legacy_pip_import/helloworld/helloworld_test.py
diff --git a/examples/pip/helloworld/requirements.txt b/examples/legacy_pip_import/helloworld/requirements.txt
similarity index 100%
rename from examples/pip/helloworld/requirements.txt
rename to examples/legacy_pip_import/helloworld/requirements.txt
diff --git a/internal_deps.bzl b/internal_deps.bzl
index 15fe0a5..e731cc8 100644
--- a/internal_deps.bzl
+++ b/internal_deps.bzl
@@ -3,7 +3,7 @@
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
-load("@rules_python//python:pip.bzl", "pip_import")
+load("@rules_python//python/legacy_pip_import:pip.bzl", "pip_import")
def rules_python_internal_deps():
"""Fetches all required dependencies for rules_python tests and tools."""
diff --git a/python/BUILD b/python/BUILD
index e5891c0..124ddd0 100644
--- a/python/BUILD
+++ b/python/BUILD
@@ -32,6 +32,7 @@
name = "distribution",
srcs = glob(["**"]) + [
"//python/constraints:distribution",
+ "//python/legacy_pip_import:distribution",
"//python/runfiles:distribution",
],
visibility = ["//:__pkg__"],
diff --git a/python/legacy_pip_import/BUILD b/python/legacy_pip_import/BUILD
new file mode 100644
index 0000000..d76747a
--- /dev/null
+++ b/python/legacy_pip_import/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+ name = "distribution",
+ srcs = [
+ "BUILD",
+ "pip.bzl",
+ ],
+ visibility = ["//python:__pkg__"],
+)
diff --git a/python/legacy_pip_import/pip.bzl b/python/legacy_pip_import/pip.bzl
new file mode 100644
index 0000000..ff7977b
--- /dev/null
+++ b/python/legacy_pip_import/pip.bzl
@@ -0,0 +1,143 @@
+# Copyright 2017 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.
+"""Import pip requirements into Bazel."""
+
+def _pip_import_impl(repository_ctx):
+ """Core implementation of pip_import."""
+
+ # Add an empty top-level BUILD file.
+ # This is because Bazel requires BUILD files along all paths accessed
+ # via //this/sort/of:path and we wouldn't be able to load our generated
+ # requirements.bzl without it.
+ repository_ctx.file("BUILD", "")
+
+ interpreter_path = repository_ctx.attr.python_interpreter
+ if repository_ctx.attr.python_interpreter_target != None:
+ target = repository_ctx.attr.python_interpreter_target
+ interpreter_path = repository_ctx.path(target)
+
+ args = [
+ interpreter_path,
+ repository_ctx.path(repository_ctx.attr._script),
+ "--python_interpreter",
+ interpreter_path,
+ "--name",
+ repository_ctx.attr.name,
+ "--input",
+ repository_ctx.path(repository_ctx.attr.requirements),
+ "--output",
+ repository_ctx.path("requirements.bzl"),
+ "--directory",
+ repository_ctx.path(""),
+ ]
+ if repository_ctx.attr.extra_pip_args:
+ args += [
+ "--extra_pip_args",
+ "\"" + " ".join(repository_ctx.attr.extra_pip_args) + "\"",
+ ]
+
+ # To see the output, pass: quiet=False
+ result = repository_ctx.execute(args, timeout=repository_ctx.attr.timeout)
+
+ if result.return_code:
+ fail("pip_import failed: %s (%s)" % (result.stdout, result.stderr))
+
+pip_import = repository_rule(
+ attrs = {
+ "extra_pip_args": attr.string_list(
+ doc = "Extra arguments to pass on to pip. Must not contain spaces.",
+ ),
+ "python_interpreter": attr.string(default = "python", doc = """
+The command to run the Python interpreter used to invoke pip and unpack the
+wheels.
+"""),
+ "python_interpreter_target": attr.label(allow_single_file = True, doc = """
+If you are using a custom python interpreter built by another repository rule,
+use this attribute to specify its BUILD target. This allows pip_import to invoke
+pip using the same interpreter as your toolchain. If set, takes precedence over
+python_interpreter.
+"""),
+ "requirements": attr.label(
+ mandatory = True,
+ allow_single_file = True,
+ doc = "The label of the requirements.txt file.",
+ ),
+ "timeout": attr.int(
+ default = 600,
+ doc = "Timeout (in seconds) for repository fetch."
+ ),
+ "_script": attr.label(
+ executable = True,
+ default = Label("//tools:piptool.par"),
+ cfg = "host",
+ ),
+ },
+ implementation = _pip_import_impl,
+ doc = """A rule for importing `requirements.txt` dependencies into Bazel.
+
+This rule imports a `requirements.txt` file and generates a new
+`requirements.bzl` file. This is used via the `WORKSPACE` pattern:
+
+```python
+pip_import(
+ name = "foo",
+ requirements = ":requirements.txt",
+)
+load("@foo//:requirements.bzl", "pip_install")
+pip_install()
+```
+
+You can then reference imported dependencies from your `BUILD` file with:
+
+```python
+load("@foo//:requirements.bzl", "requirement")
+py_library(
+ name = "bar",
+ ...
+ deps = [
+ "//my/other:dep",
+ requirement("futures"),
+ requirement("mock"),
+ ],
+)
+```
+
+Or alternatively:
+```python
+load("@foo//:requirements.bzl", "all_requirements")
+py_binary(
+ name = "baz",
+ ...
+ deps = [
+ ":foo",
+ ] + all_requirements,
+)
+```
+""",
+)
+
+# We don't provide a `pip2_import` that would use the `python2` system command
+# because this command does not exist on all platforms. On most (but not all)
+# systems, `python` means Python 2 anyway. See also #258.
+
+def pip3_import(**kwargs):
+ """A wrapper around pip_import that uses the `python3` system command.
+
+ Use this for requirements of PY3 programs.
+ """
+ pip_import(python_interpreter = "python3", **kwargs)
+
+def pip_repositories():
+ # buildifier: disable=print
+ print("DEPRECATED: the pip_import rule has been replaced with pip_install, please see release notes")
diff --git a/python/pip.bzl b/python/pip.bzl
index bbaca94..6a0bcb9 100644
--- a/python/pip.bzl
+++ b/python/pip.bzl
@@ -16,165 +16,6 @@
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."""
-
- # Add an empty top-level BUILD file.
- # This is because Bazel requires BUILD files along all paths accessed
- # via //this/sort/of:path and we wouldn't be able to load our generated
- # requirements.bzl without it.
- repository_ctx.file("BUILD", "")
-
- interpreter_path = repository_ctx.attr.python_interpreter
- if repository_ctx.attr.python_interpreter_target != None:
- target = repository_ctx.attr.python_interpreter_target
- interpreter_path = repository_ctx.path(target)
-
- args = [
- interpreter_path,
- repository_ctx.path(repository_ctx.attr._script),
- "--python_interpreter",
- interpreter_path,
- "--name",
- repository_ctx.attr.name,
- "--input",
- repository_ctx.path(repository_ctx.attr.requirements),
- "--output",
- repository_ctx.path("requirements.bzl"),
- "--directory",
- repository_ctx.path(""),
- ]
- if repository_ctx.attr.extra_pip_args:
- args += [
- "--extra_pip_args",
- "\"" + " ".join(repository_ctx.attr.extra_pip_args) + "\"",
- ]
-
- # To see the output, pass: quiet=False
- result = repository_ctx.execute(args, timeout=repository_ctx.attr.timeout)
-
- if result.return_code:
- fail("pip_import failed: %s (%s)" % (result.stdout, result.stderr))
-
-pip_import = repository_rule(
- attrs = {
- "extra_pip_args": attr.string_list(
- doc = "Extra arguments to pass on to pip. Must not contain spaces.",
- ),
- "python_interpreter": attr.string(default = "python", doc = """
-The command to run the Python interpreter used to invoke pip and unpack the
-wheels.
-"""),
- "python_interpreter_target": attr.label(allow_single_file = True, doc = """
-If you are using a custom python interpreter built by another repository rule,
-use this attribute to specify its BUILD target. This allows pip_import to invoke
-pip using the same interpreter as your toolchain. If set, takes precedence over
-python_interpreter.
-"""),
- "requirements": attr.label(
- mandatory = True,
- allow_single_file = True,
- doc = "The label of the requirements.txt file.",
- ),
- "timeout": attr.int(
- default = 600,
- doc = "Timeout (in seconds) for repository fetch."
- ),
- "_script": attr.label(
- executable = True,
- default = Label("//tools:piptool.par"),
- cfg = "host",
- ),
- },
- implementation = _pip_import_impl,
- doc = """A rule for importing `requirements.txt` dependencies into Bazel.
-
-This rule imports a `requirements.txt` file and generates a new
-`requirements.bzl` file. This is used via the `WORKSPACE` pattern:
-
-```python
-pip_import(
- name = "foo",
- requirements = ":requirements.txt",
-)
-load("@foo//:requirements.bzl", "pip_install")
-pip_install()
-```
-
-You can then reference imported dependencies from your `BUILD` file with:
-
-```python
-load("@foo//:requirements.bzl", "requirement")
-py_library(
- name = "bar",
- ...
- deps = [
- "//my/other:dep",
- requirement("futures"),
- requirement("mock"),
- ],
-)
-```
-
-Or alternatively:
-```python
-load("@foo//:requirements.bzl", "all_requirements")
-py_binary(
- name = "baz",
- ...
- deps = [
- ":foo",
- ] + all_requirements,
-)
-```
-""",
-)
-
-# We don't provide a `pip2_import` that would use the `python2` system command
-# because this command does not exist on all platforms. On most (but not all)
-# systems, `python` means Python 2 anyway. See also #258.
-
-def pip3_import(**kwargs):
- """A wrapper around pip_import that uses the `python3` system command.
-
- Use this for requirements of PY3 programs.
- """
- pip_import(python_interpreter = "python3", **kwargs)
-
-def pip_repositories():
- """Pull in dependencies needed to use the packaging rules."""
-
- # At the moment this is a placeholder, in that it does not actually pull in
- # any dependencies. However, it does do some validation checking.
- #
- # As a side effect of migrating our canonical workspace name from
- # "@io_bazel_rules_python" to "@rules_python" (#203), users who still
- # imported us by the old name would get a confusing error about a
- # repository dependency cycle in their workspace. (The cycle is likely
- # related to the fact that our repo name is hardcoded into the template
- # in piptool.py.)
- #
- # To produce a more informative error message in this situation, we
- # fail-fast here if we detect that we're not being imported by the new
- # name. (I believe we have always had the requirement that we're imported
- # by the canonical name, because of the aforementioned hardcoding.)
- #
- # Users who, against best practice, do not call pip_repositories() in their
- # workspace will not benefit from this check.
- if "rules_python" not in native.existing_rules():
- message = "=" * 79 + """\n\
-It appears that you are trying to import rules_python without using its
-canonical name, "@rules_python". This does not work. Please change your
-WORKSPACE file to import this repo with `name = "rules_python"` instead.
-"""
- if "io_bazel_rules_python" in native.existing_rules():
- message += """\n\
-Note that the previous name of "@io_bazel_rules_python" is no longer used.
-See https://github.com/bazelbuild/rules_python/issues/203 for context.
-"""
- message += "=" * 79
- fail(message)
-
def pip_install(requirements, name = "pip", **kwargs):
"""Imports a `requirements.txt` file and generates a new `requirements.bzl` file.
@@ -214,3 +55,9 @@
requirements = requirements,
**kwargs
)
+
+def pip_import(**kwargs):
+ fail("=" * 79 + """\n
+ pip_import has been replaced with pip_install, please see the release notes.
+ To continue using it, you can load from "@rules_python//python/legacy_pip_import:pip.bzl"
+ """)