From aa8db2d2b15f0ad53615f56c7c743efd98770147 Mon Sep 17 00:00:00 2001 From: Jesse Kinkead Date: Thu, 5 Apr 2018 17:18:53 -0700 Subject: [PATCH 1/3] Add a pip3_import target for Python 3 compatibility. --- python/pip.bzl | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/python/pip.bzl b/python/pip.bzl index 237b7d2ba..65c61e24d 100644 --- a/python/pip.bzl +++ b/python/pip.bzl @@ -13,7 +13,7 @@ # limitations under the License. """Import pip requirements into Bazel.""" -def _pip_import_impl(repository_ctx): +def _pip_import_impl(repository_ctx, binary_name): """Core implementation of pip_import.""" # Add an empty top-level BUILD file. @@ -24,7 +24,7 @@ def _pip_import_impl(repository_ctx): # To see the output, pass: quiet=False result = repository_ctx.execute([ - "python", repository_ctx.path(repository_ctx.attr._script), + binary_name, repository_ctx.path(repository_ctx.attr._script), "--name", repository_ctx.attr.name, "--input", repository_ctx.path(repository_ctx.attr.requirements), "--output", repository_ctx.path("requirements.bzl"), @@ -34,6 +34,14 @@ def _pip_import_impl(repository_ctx): if result.return_code: fail("pip_import failed: %s (%s)" % (result.stdout, result.stderr)) +def _pip2_import_impl(repository_ctx): + """System python implementation. Assumes this links to python 2.""" + _pip_import_impl(repository_ctx, "python") + +def _pip3_import_impl(repository_ctx): + """Python 3 implementation.""" + _pip_import_impl(repository_ctx, "python3") + pip_import = repository_rule( attrs = { "requirements": attr.label( @@ -47,15 +55,32 @@ pip_import = repository_rule( cfg = "host", ), }, - implementation = _pip_import_impl, + implementation = _pip2_import_impl, +) + +pip3_import = repository_rule( + attrs = { + "requirements": attr.label( + allow_files = True, + mandatory = True, + single_file = True, + ), + "_script": attr.label( + executable = True, + default = Label("//tools:piptool.par"), + cfg = "host", + ), + }, + implementation = _pip3_import_impl, ) -"""A rule for importing requirements.txt dependencies into Bazel. +"""Rules for importing requirements.txt dependencies into Bazel. -This rule imports a requirements.txt file and generates a new +These rules import a requirements.txt file and generate a new requirements.bzl file. This is used via the WORKSPACE pattern: -
pip_import(
+
# Use pip3_import to force Python 3.
+pip_import(
     name = "foo",
     requirements = ":requirements.txt",
 )

From bbc689724e28af23072b60ed4e72815ddc5e1996 Mon Sep 17 00:00:00 2001
From: Jesse Kinkead 
Date: Fri, 6 Apr 2018 14:23:03 -0700
Subject: [PATCH 2/3] Update docs for pip3_import.

---
 README.md      |  4 ++++
 python/pip.bzl | 61 +++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 55 insertions(+), 10 deletions(-)

diff --git a/README.md b/README.md
index a2e35caf0..b26339ddf 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@ Status: This is **ALPHA** software.
 ## Rules
 
 * [pip_import](docs/python/pip.md#pip_import)
+* [pip3_import](docs/python/pip.md#pip3_import)
 * [py_library](docs/python/python.md#py_library)
 * [py_binary](docs/python/python.md#py_binary)
 * [py_test](docs/python/python.md#py_test)
@@ -73,6 +74,9 @@ load("@my_deps//:requirements.bzl", "pip_install")
 pip_install()
 ```
 
+The `pip_import` rule uses the system `python` command, which is usually
+Python 2. `pip3_import` uses the system `python3` command.
+
 ## Consuming `pip` dependencies
 
 Once a set of dependencies has been imported via `pip_import` and `pip_install`
diff --git a/python/pip.bzl b/python/pip.bzl
index 65c61e24d..cbdd10d15 100644
--- a/python/pip.bzl
+++ b/python/pip.bzl
@@ -29,13 +29,13 @@ def _pip_import_impl(repository_ctx, binary_name):
     "--input", repository_ctx.path(repository_ctx.attr.requirements),
     "--output", repository_ctx.path("requirements.bzl"),
     "--directory", repository_ctx.path(""),
-  ])
+  ], quiet=False)
 
   if result.return_code:
     fail("pip_import failed: %s (%s)" % (result.stdout, result.stderr))
 
-def _pip2_import_impl(repository_ctx):
-  """System python implementation. Assumes this links to python 2."""
+def _pip_system_import_impl(repository_ctx):
+  """System python implementation."""
   _pip_import_impl(repository_ctx, "python")
 
 def _pip3_import_impl(repository_ctx):
@@ -55,9 +55,51 @@ pip_import = repository_rule(
             cfg = "host",
         ),
     },
-    implementation = _pip2_import_impl,
+    implementation = _pip_system_import_impl,
 )
 
+"""A rule for importing requirements.txt dependencies into Bazel.
+
+This rule imports a requirements.txt file using the system
+python, and generates a new requirements.bzl file.
+This is used via the WORKSPACE pattern:
+
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: +
load("@foo//:requirements.bzl", "requirement")
+py_library(
+    name = "bar",
+    ...
+    deps = [
+       "//my/other:dep",
+       requirement("futures"),
+       requirement("mock"),
+    ],
+)
+
+ +Or alternatively: +
load("@foo//:requirements.bzl", "all_requirements")
+py_binary(
+    name = "baz",
+    ...
+    deps = [
+       ":foo",
+    ] + all_requirements,
+)
+
+ +Args: + requirements: The label of a requirements.txt file. +""" + pip3_import = repository_rule( attrs = { "requirements": attr.label( @@ -74,13 +116,12 @@ pip3_import = repository_rule( implementation = _pip3_import_impl, ) -"""Rules for importing requirements.txt dependencies into Bazel. +"""A rule for importing requirements.txt dependencies into Bazel. -These rules import a requirements.txt file and generate a new -requirements.bzl file. This is used via the WORKSPACE -pattern: -
# Use pip3_import to force Python 3.
-pip_import(
+This rule imports a requirements.txt file using the system
+python3, and generates a new requirements.bzl file.
+This is used via the WORKSPACE pattern:
+
pip3_import(
     name = "foo",
     requirements = ":requirements.txt",
 )

From 07785fcc2bd7b99f84954f2365f236e5bfe632f7 Mon Sep 17 00:00:00 2001
From: Jesse Kinkead 
Date: Fri, 6 Apr 2018 14:33:41 -0700
Subject: [PATCH 3/3] Add output of ./update_docs.sh.

---
 docs/index.html      | 11 ++++++
 docs/index.md        | 11 ++++++
 docs/python/pip.html | 70 +++++++++++++++++++++++++++++++++++++--
 docs/python/pip.md   | 79 ++++++++++++++++++++++++++++++++++++++++++--
 docs/python/whl.html | 10 +++++-
 docs/python/whl.md   | 10 +++++-
 6 files changed, 183 insertions(+), 8 deletions(-)

diff --git a/docs/index.html b/docs/index.html
index f3487d21b..5a35c5508 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -97,6 +97,17 @@ 

Repository Rules

+ + + + pip3_import + + + +

A rule for importing <code>requirements.txt</code> dependencies into Bazel.

+ + + diff --git a/docs/index.md b/docs/index.md index 79f931a44..ac62a1541 100644 --- a/docs/index.md +++ b/docs/index.md @@ -40,6 +40,17 @@ + + + + pip3_import + + + +

A rule for importing <code>requirements.txt</code> dependencies into Bazel.

+ + + diff --git a/docs/python/pip.html b/docs/python/pip.html index 8045e3f55..3bc0ee177 100644 --- a/docs/python/pip.html +++ b/docs/python/pip.html @@ -61,6 +61,7 @@

Import pip requirements into Bazel.