diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index a1b16bbc66..a0d9a19047 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -73,6 +73,14 @@ tasks: build_targets: ["//..."] test_targets: ["//..."] working_directory: gazelle + gazelle_extension_bzlmod: + <<: *common_bzlmod_flags + name: Test the Gazelle extension under bzlmod + platform: ubuntu2004 + build_targets: ["//..."] + test_targets: ["//..."] + working_directory: gazelle + ubuntu_min: <<: *minimum_supported_version <<: *reusable_config @@ -138,6 +146,32 @@ tasks: working_directory: examples/build_file_generation platform: windows + integration_test_build_file_generation_bzlmod_ubuntu: + <<: *minimum_supported_bzlmod_version + <<: *common_bzlmod_flags + <<: *reusable_build_test_all + name: build_file_generation_bzlmod integration tests on Ubuntu + working_directory: examples/build_file_generation + platform: ubuntu2004 + integration_test_build_file_generation_bzlmod_debian: + <<: *common_bzlmod_flags + <<: *reusable_build_test_all + name: build_file_generation_bzlmod integration tests on Debian + working_directory: examples/build_file_generation + platform: debian11 + integration_test_build_file_generation_bzlmod_macos: + <<: *common_bzlmod_flags + <<: *reusable_build_test_all + name: build_file_generation_bzlmod integration tests on macOS + working_directory: examples/build_file_generation + platform: macos + integration_test_build_file_generation_bzlmod_windows: + <<: *common_bzlmod_flags + <<: *reusable_build_test_all + name: build_file_generation_bzlmod integration tests on Windows + working_directory: examples/build_file_generation + platform: windows + integration_test_bzlmod_ubuntu_min: <<: *minimum_supported_bzlmod_version <<: *reusable_build_test_all diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 38e0658e44..0d305b8816 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,44 +1,11 @@ -## PR Checklist - -Please check if your PR fulfills the following requirements: - -- [ ] Tests for the changes have been added (for bug fixes / features) -- [ ] Docs have been added / updated (for bug fixes / features) - - -## PR Type - -What kind of change does this PR introduce? - - - -- [ ] Bugfix -- [ ] Feature (please, look at the "Scope of the project" section in the README.md file) -- [ ] Code style update (formatting, local variables) -- [ ] Refactoring (no functional changes, no api changes) -- [ ] Build related changes -- [ ] CI related changes -- [ ] Documentation content changes -- [ ] Other... Please describe: - - -## What is the current behavior? - - -Issue Number: N/A - - -## What is the new behavior? - - -## Does this PR introduce a breaking change? - -- [ ] Yes -- [ ] No - - - - - -## Other information - +PR Instructions/requirements +* Title uses `type: description` format. See CONTRIBUTING.md for types. +* Common types are: build, docs, feat, fix, refactor, revert, test +* Breaking changes include "!" after the type and a "BREAKING CHANGES:" + section at the bottom. +* Body text describes: + * Why this change is being made, briefly. + * Before and after behavior, as applicable + * References issue number, as applicable +* Update docs and tests, as applicable +* Delete these instructions prior to sending the PR diff --git a/.github/workflows/create_archive_and_notes.sh b/.github/workflows/create_archive_and_notes.sh index 549af074eb..0c0c4acf41 100755 --- a/.github/workflows/create_archive_and_notes.sh +++ b/.github/workflows/create_archive_and_notes.sh @@ -87,5 +87,12 @@ http_archive( strip_prefix = "${PREFIX}/gazelle", url = "https://github.com/bazelbuild/rules_python/releases/download/${TAG}/rules_python-${TAG}.tar.gz", ) + +# To compile the rules_python gazelle extension from source, +# we must fetch some third-party go dependencies that it uses. + +load("@rules_python_gazelle_plugin//:deps.bzl", _py_gazelle_deps = "gazelle_deps") + +_py_gazelle_deps() \`\`\` EOF diff --git a/README.md b/README.md index a509e28d7e..07acaf8e19 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,8 @@ rules_python_version = "740825b7f74930c62f44af95c9a4c1bd428d2c53" # Latest @ 202 http_archive( name = "rules_python", - sha256 = "3474c5815da4cb003ff22811a36a11894927eda1c2e64bf2dac63e914bfdf30f", + # Bazel will print the proper value to add here during the first build. + # sha256 = "FIXME", strip_prefix = "rules_python-{}".format(rules_python_version), url = "https://github.com/bazelbuild/rules_python/archive/{}.zip".format(rules_python_version), ) diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index d2f0b04b56..e1163d9d0e 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -56,7 +56,11 @@ bzl_library( "//python:defs.bzl", "//python/private:reexports.bzl", ], - deps = [":bazel_python_tools"], + deps = [ + ":bazel_python_tools", + "//python:defs_bzl", + "//python/private:reexports_bzl", + ], ) bzl_library( diff --git a/docs/pip.md b/docs/pip.md index 528abf737d..e4c3f21b79 100644 --- a/docs/pip.md +++ b/docs/pip.md @@ -42,8 +42,8 @@ of some other compile_pip_requirements rule that references these requirements It also generates two targets for running pip-compile: -- validate with `bazel test <name>_test` -- update with `bazel run <name>.update` +- validate with `bazel test [name]_test` +- update with `bazel run [name].update` **PARAMETERS** diff --git a/docs/pip_repository.md b/docs/pip_repository.md index 2ccdc64854..c02058e08d 100644 --- a/docs/pip_repository.md +++ b/docs/pip_repository.md @@ -8,9 +8,10 @@
pip_repository(name, annotations, download_only, enable_implicit_namespace_pkgs, environment, - extra_pip_args, isolated, pip_data_exclude, python_interpreter, - python_interpreter_target, quiet, repo_mapping, repo_prefix, requirements_darwin, - requirements_linux, requirements_lock, requirements_windows, timeout) + extra_pip_args, incompatible_generate_aliases, isolated, pip_data_exclude, + python_interpreter, python_interpreter_target, quiet, repo_mapping, repo_prefix, + requirements_darwin, requirements_linux, requirements_lock, requirements_windows, + timeout)A rule for importing `requirements.txt` dependencies into Bazel. @@ -64,6 +65,7 @@ py_binary( | enable_implicit_namespace_pkgs | If true, disables conversion of native namespace packages into pkg-util style namespace packages. When set all py_binary and py_test targets must specify either
legacy_create_init=False
or the global Bazel option --incompatible_default_to_explicit_init_py
to prevent __init__.py
being automatically generated in every directory.False
|
| environment | Environment variables to set in the pip subprocess. Can be used to set common variables such as http_proxy
, https_proxy
and no_proxy
Note that pip is run with "--isolated" on the CLI so PIP_<VAR>_<NAME>
style env vars are ignored, but env vars that control requests and urllib3 can be passed. | Dictionary: String -> String | optional | {}
|
| extra_pip_args | Extra arguments to pass on to pip. Must not contain spaces. | List of strings | optional | []
|
+| incompatible_generate_aliases | Allow generating aliases '@pip//<pkg>' -> '@pip_<pkg>//:pkg'. | Boolean | optional | False
|
| isolated | Whether or not to pass the [--isolated](https://pip.pypa.io/en/stable/cli/pip/#cmdoption-isolated) flag to the underlying pip command. Alternatively, the RULES_PYTHON_PIP_ISOLATED
enviornment varaible can be used to control this flag. | Boolean | optional | True
|
| pip_data_exclude | Additional data exclusion parameters to add to the pip packages BUILD file. | List of strings | optional | []
|
| python_interpreter | The python interpreter to use. This can either be an absolute path or the name of a binary found on the host's PATH
environment variable. If no value is set python3
is defaulted for Unix systems and python.exe
for Windows. | String | optional | ""
|
@@ -83,8 +85,8 @@ py_binary(
## pip_repository_bzlmod
-pip_repository_bzlmod(name, repo_mapping, requirements_darwin, requirements_linux, - requirements_lock, requirements_windows) +pip_repository_bzlmod(name, incompatible_generate_aliases, repo_mapping, requirements_darwin, + requirements_linux, requirements_lock, requirements_windows)A rule for bzlmod pip_repository creation. Intended for private use only. @@ -95,6 +97,7 @@ A rule for bzlmod pip_repository creation. Intended for private use only. | Name | Description | Type | Mandatory | Default | | :------------- | :------------- | :------------- | :------------- | :------------- | | name | A unique name for this repository. | Name | required | | +| incompatible_generate_aliases | Allow generating aliases in '@pip//:<pkg>' -> '@pip_<pkg>//:pkg'. This replaces the aliases generated by the
bzlmod
tooling. | Boolean | optional | False
|
| repo_mapping | A dictionary from local repository name to global repository name. This allows controls over workspace dependency resolution for dependencies of this repository.<p>For example, an entry "@foo": "@bar"
declares that, for any time this repository depends on @foo
(such as a dependency on @foo//some:target
, it should actually resolve that dependency within globally-declared @bar
(@bar//some:target
). | Dictionary: String -> String | required | |
| requirements_darwin | Override the requirements_lock attribute when the host platform is Mac OS | Label | optional | None
|
| requirements_linux | Override the requirements_lock attribute when the host platform is Linux | Label | optional | None
|
diff --git a/docs/python.md b/docs/python.md
index 6682e48bd1..e42375ad60 100755
--- a/docs/python.md
+++ b/docs/python.md
@@ -1,9 +1,7 @@
-
Core rules for building Python projects.
-
## current_py_toolchain
diff --git a/examples/build_file_generation/BUILD.bazel b/examples/build_file_generation/BUILD.bazel
index 6419ef2c70..7c88d9203d 100644
--- a/examples/build_file_generation/BUILD.bazel
+++ b/examples/build_file_generation/BUILD.bazel
@@ -43,6 +43,9 @@ gazelle_python_manifest(
modules_mapping = ":modules_map",
pip_repository_name = "pip",
requirements = "//:requirements_lock.txt",
+ # NOTE: we can use this flag in order to make our setup compatible with
+ # bzlmod.
+ use_pip_repository_aliases = True,
)
# Our gazelle target points to the python gazelle binary.
@@ -65,7 +68,7 @@ py_library(
visibility = ["//:__subpackages__"],
deps = [
"//random_number_generator",
- "@pip_flask//:pkg",
+ "@pip//flask",
],
)
diff --git a/examples/build_file_generation/MODULE.bazel b/examples/build_file_generation/MODULE.bazel
new file mode 100644
index 0000000000..5f79fec486
--- /dev/null
+++ b/examples/build_file_generation/MODULE.bazel
@@ -0,0 +1,43 @@
+module(
+ name = "example_bzlmod",
+ version = "0.0.0",
+ compatibility_level = 1,
+)
+
+bazel_dep(name = "rules_python", version = "0.19.0")
+bazel_dep(name = "rules_python_gazelle_plugin", version = "0.19.0")
+bazel_dep(name = "gazelle", version = "0.29.0", repo_name = "bazel_gazelle")
+
+# local overrides for the packages for CI purposes.
+# for usual setups you should remove this block.
+local_path_override(
+ module_name = "rules_python",
+ path = "../..",
+)
+
+local_path_override(
+ module_name = "rules_python_gazelle_plugin",
+ path = "../../gazelle",
+)
+
+# Register python toolchain
+python = use_extension("@rules_python//python:extensions.bzl", "python")
+python.toolchain(
+ name = "python3_9",
+ python_version = "3.9",
+)
+use_repo(python, "python3_9_toolchains")
+
+register_toolchains(
+ "@python3_9_toolchains//:all",
+)
+
+pip = use_extension("@rules_python//python:extensions.bzl", "pip")
+pip.parse(
+ name = "pip",
+ # Generate user friendly alias labels for each dependency that we have.
+ incompatible_generate_aliases = True,
+ requirements_lock = "//:requirements_lock.txt",
+ requirements_windows = "//:requirements_windows.txt",
+)
+use_repo(pip, "pip")
diff --git a/examples/build_file_generation/WORKSPACE b/examples/build_file_generation/WORKSPACE
index 674b9eb7ea..65e0a6e5f3 100644
--- a/examples/build_file_generation/WORKSPACE
+++ b/examples/build_file_generation/WORKSPACE
@@ -55,49 +55,20 @@ gazelle_dependencies()
# Remaining setup is for rules_python.
-# You do not want to use the following command when you are using a WORKSPACE file
-# that is outside of rules_python repository.
-# This command allows targets from a local directory to be bound.
-# Which allows bazel to use targets defined in base rules_python directory.
-# If you are using this example outside of the rules_python git repo,
-# use the http_archive command that is commented out below.
-# https://bazel.build/reference/be/workspace#local_repository
+# DON'T COPY_PASTE THIS.
+# Our example uses `local_repository` to point to the HEAD version of rules_python.
+# Users should instead use the installation instructions from the release they use.
+# See https://github.com/bazelbuild/rules_python/releases
local_repository(
name = "rules_python",
path = "../..",
)
-# When not using this example in the rules_python git repo you would load the python
-# ruleset using the following StarLark.
-# See https://github.com/bazelbuild/rules_python#getting-started for the latest
-# ruleset version.
-#
-# The following StarLark would replace the `local_repository` rule mentioned above.
-#
-# load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
-# http_archive(
-# name = "rules_python",
-# sha256 = "497ca47374f48c8b067d786b512ac10a276211810f4a580178ee9b9ad139323a",
-# strip_prefix = "rules_python-0.16.1",
-# url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.16.1.tar.gz",
-# )
-
-# We import the repository-local rules_python_gazelle_plugin version in order to
-# be able to test development changes to the plugin.
local_repository(
name = "rules_python_gazelle_plugin",
path = "../../gazelle",
)
-# When loading the gazelle plugin outside this repo, use the http_archive rule as follows:
-#
-#http_archive(
-# name = "rules_python_gazelle_plugin",
-# sha256 = "497ca47374f48c8b067d786b512ac10a276211810f4a580178ee9b9ad139323a",
-# strip_prefix = "rules_python-0.16.1/gazelle",
-# url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.16.1.tar.gz",
-#)
-
# Next we load the toolchain from rules_python.
load("@rules_python//python:repositories.bzl", "python_register_toolchains")
@@ -119,6 +90,8 @@ load("@rules_python//python:pip.bzl", "pip_parse")
# You can instead check this `requirements.bzl` file into your repo.
pip_parse(
name = "pip",
+ # Generate user friendly alias labels for each dependency that we have.
+ incompatible_generate_aliases = True,
# (Optional) You can provide a python_interpreter (path) or a python_interpreter_target (a Bazel target, that
# acts as an executable). The latter can be anything that could be used as Python interpreter. E.g.:
# 1. Python interpreter that you compile in the build file.
diff --git a/examples/build_file_generation/gazelle_python.yaml b/examples/build_file_generation/gazelle_python.yaml
index 847d1ecc55..b57e9f02bc 100644
--- a/examples/build_file_generation/gazelle_python.yaml
+++ b/examples/build_file_generation/gazelle_python.yaml
@@ -114,4 +114,5 @@ manifest:
zipp.py310compat: zipp
pip_repository:
name: pip
-integrity: 2c84a3cabeaff134a1d045e5a173a3178086f236ab20f895ffbd7f3b7a6e5bb0
+ use_pip_repository_aliases: true
+integrity: 85f073e37e31339508aaaf5e0d5472adae5148fd5f054e9cc586343c026660e1
diff --git a/examples/bzlmod/BUILD.bazel b/examples/bzlmod/BUILD.bazel
index 7b7566bd5a..7ecc035853 100644
--- a/examples/bzlmod/BUILD.bazel
+++ b/examples/bzlmod/BUILD.bazel
@@ -1,4 +1,5 @@
load("@pip//:requirements.bzl", "requirement")
+load("@python3_9//:defs.bzl", py_test_with_transition = "py_test")
load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test")
load("@rules_python//python:pip.bzl", "compile_pip_requirements")
@@ -35,3 +36,10 @@ py_test(
srcs = ["test.py"],
deps = [":lib"],
)
+
+py_test_with_transition(
+ name = "test_with_transition",
+ srcs = ["test.py"],
+ main = "test.py",
+ deps = [":lib"],
+)
diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel
index 5f984c39df..ce9122810c 100644
--- a/examples/bzlmod/MODULE.bazel
+++ b/examples/bzlmod/MODULE.bazel
@@ -16,6 +16,7 @@ python.toolchain(
configure_coverage_tool = True,
python_version = "3.9",
)
+use_repo(python, "python3_9")
use_repo(python, "python3_9_toolchains")
register_toolchains(
diff --git a/examples/wheel/BUILD.bazel b/examples/wheel/BUILD.bazel
index 4124a826d1..61a43ae6cf 100644
--- a/examples/wheel/BUILD.bazel
+++ b/examples/wheel/BUILD.bazel
@@ -13,7 +13,7 @@
# limitations under the License.
load("@bazel_skylib//rules:build_test.bzl", "build_test")
-load("//examples/wheel/private:wheel_utils.bzl", "directory_writer")
+load("//examples/wheel/private:wheel_utils.bzl", "directory_writer", "make_variable_tags")
load("//python:defs.bzl", "py_library", "py_test")
load("//python:packaging.bzl", "py_package", "py_wheel")
load("//python:versions.bzl", "gen_python_config_settings")
@@ -62,6 +62,29 @@ py_wheel(
],
)
+# Populate a rule with "Make Variable" arguments for
+# abi, python_tag and version. You might want to do this
+# for the following use cases:
+# - abi, python_tag: introspect a toolchain to map to appropriate cpython tags
+# - version: populate given this or a dependent module's version
+make_variable_tags(
+ name = "make_variable_tags",
+)
+
+py_wheel(
+ name = "minimal_with_py_library_with_make_variables",
+ testonly = True,
+ abi = "$(ABI)",
+ distribution = "example_minimal_library",
+ python_tag = "$(PYTHON_TAG)",
+ toolchains = ["//examples/wheel:make_variable_tags"],
+ version = "$(VERSION)",
+ deps = [
+ "//examples/wheel/lib:module_with_data",
+ "//examples/wheel/lib:simple_module",
+ ],
+)
+
build_test(
name = "dist_build_tests",
targets = [":minimal_with_py_library.dist"],
diff --git a/examples/wheel/private/wheel_utils.bzl b/examples/wheel/private/wheel_utils.bzl
index af4fa1958b..037fed0175 100644
--- a/examples/wheel/private/wheel_utils.bzl
+++ b/examples/wheel/private/wheel_utils.bzl
@@ -54,3 +54,20 @@ directory_writer = rule(
),
},
)
+
+def _make_variable_tags_impl(ctx): # buildifier: disable=unused-variable
+ # This example is contrived. In a real usage, this rule would
+ # look at flags or dependencies to determine what values to use.
+ # If all you're doing is setting constant values, then you can simply
+ # set them in the py_wheel() call.
+ vars = {}
+ vars["ABI"] = "cp38"
+ vars["PYTHON_TAG"] = "cp38"
+ vars["VERSION"] = "0.99.0"
+ return [platform_common.TemplateVariableInfo(vars)]
+
+make_variable_tags = rule(
+ attrs = {},
+ doc = """Make variable tags to pass to a py_wheel rule.""",
+ implementation = _make_variable_tags_impl,
+)
diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel
new file mode 100644
index 0000000000..bd634020f3
--- /dev/null
+++ b/gazelle/MODULE.bazel
@@ -0,0 +1,20 @@
+module(
+ name = "rules_python_gazelle_plugin",
+ version = "0.0.0",
+ compatibility_level = 1,
+)
+
+bazel_dep(name = "rules_python", version = "0.18.0")
+bazel_dep(name = "rules_go", version = "0.38.1", repo_name = "io_bazel_rules_go")
+bazel_dep(name = "gazelle", version = "0.29.0", repo_name = "bazel_gazelle")
+
+go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps")
+go_deps.from_file(go_mod = "//:go.mod")
+use_repo(
+ go_deps,
+ "com_github_bazelbuild_buildtools",
+ "com_github_bmatcuk_doublestar",
+ "com_github_emirpasic_gods",
+ "com_github_ghodss_yaml",
+ "in_gopkg_yaml_v2",
+)
diff --git a/gazelle/README.md b/gazelle/README.md
index a76ac59199..0081701241 100644
--- a/gazelle/README.md
+++ b/gazelle/README.md
@@ -14,23 +14,8 @@ Follow the instructions at https://github.com/bazelbuild/bazel-gazelle#running-g
Next, we need to fetch the third-party Go libraries that the python extension
depends on.
-Add this to your `WORKSPACE`:
-
-```starlark
-http_archive(
- name = "rules_python_gazelle_plugin",
- sha256 = "",
- strip_prefix = "rules_python-0.17.0/gazelle",
- url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.17.0.tar.gz",
-)
-
-# To compile the rules_python gazelle extension from source,
-# we must fetch some third-party go dependencies that it uses.
-
-load("@rules_python_gazelle_plugin//:deps.bzl", _py_gazelle_deps = "gazelle_deps")
-
-_py_gazelle_deps()
-```
+See the installation `WORKSPACE` snippet on the Releases page:
+https://github.com/bazelbuild/rules_python/releases
Next, we'll fetch metadata about your Python dependencies, so that gazelle can
determine which package a given import statement comes from. This is provided
diff --git a/gazelle/deps.bzl b/gazelle/deps.bzl
index 357944302c..26f8c66aec 100644
--- a/gazelle/deps.bzl
+++ b/gazelle/deps.bzl
@@ -28,12 +28,7 @@ def gazelle_deps():
sum = "h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs=",
version = "v0.0.0-20190523083050-ea95bdfd59fc",
)
- go_repository(
- name = "com_github_bazelbuild_bazel_gazelle",
- importpath = "github.com/bazelbuild/bazel-gazelle",
- sum = "h1:+/ZhUxlDy4XnyMIGeKkbRZoIGssy1eO51GijwIvvuwE=",
- version = "v0.27.0",
- )
+
go_repository(
name = "com_github_bazelbuild_buildtools",
build_naming_convention = "go_default_library",
@@ -41,24 +36,14 @@ def gazelle_deps():
sum = "h1:jhiMzJ+8unnLRtV8rpbWBFE9pFNzIqgUTyZU5aA++w8=",
version = "v0.0.0-20221004120235-7186f635531b",
)
- go_repository(
- name = "com_github_bazelbuild_rules_go",
- importpath = "github.com/bazelbuild/rules_go",
- sum = "h1:ViPR65vOrg74JKntAUFY6qZkheBKGB6to7wFd8gCRU4=",
- version = "v0.35.0",
- )
+
go_repository(
name = "com_github_bmatcuk_doublestar",
importpath = "github.com/bmatcuk/doublestar",
sum = "h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0=",
version = "v1.3.4",
)
- go_repository(
- name = "com_github_bmatcuk_doublestar_v4",
- importpath = "github.com/bmatcuk/doublestar/v4",
- sum = "h1:Qu+u9wR3Vd89LnlLMHvnZ5coJMWKQamqdz9/p5GNthA=",
- version = "v4.2.0",
- )
+
go_repository(
name = "com_github_burntsushi_toml",
importpath = "github.com/BurntSushi/toml",
@@ -113,12 +98,7 @@ def gazelle_deps():
sum = "h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=",
version = "v0.1.0",
)
- go_repository(
- name = "com_github_fsnotify_fsnotify",
- importpath = "github.com/fsnotify/fsnotify",
- sum = "h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=",
- version = "v1.5.4",
- )
+
go_repository(
name = "com_github_ghodss_yaml",
importpath = "github.com/ghodss/yaml",
@@ -134,14 +114,14 @@ def gazelle_deps():
go_repository(
name = "com_github_golang_mock",
importpath = "github.com/golang/mock",
- sum = "h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=",
- version = "v1.6.0",
+ sum = "h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8=",
+ version = "v1.1.1",
)
go_repository(
name = "com_github_golang_protobuf",
importpath = "github.com/golang/protobuf",
- sum = "h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=",
- version = "v1.5.2",
+ sum = "h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=",
+ version = "v1.4.3",
)
go_repository(
name = "com_github_google_go_cmp",
@@ -149,18 +129,7 @@ def gazelle_deps():
sum = "h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=",
version = "v0.5.9",
)
- go_repository(
- name = "com_github_pelletier_go_toml",
- importpath = "github.com/pelletier/go-toml",
- sum = "h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=",
- version = "v1.9.5",
- )
- go_repository(
- name = "com_github_pmezard_go_difflib",
- importpath = "github.com/pmezard/go-difflib",
- sum = "h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=",
- version = "v1.0.0",
- )
+
go_repository(
name = "com_github_prometheus_client_model",
importpath = "github.com/prometheus/client_model",
@@ -218,8 +187,8 @@ def gazelle_deps():
go_repository(
name = "org_golang_google_protobuf",
importpath = "google.golang.org/protobuf",
- sum = "h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=",
- version = "v1.28.0",
+ sum = "h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=",
+ version = "v1.25.0",
)
go_repository(
name = "org_golang_x_crypto",
@@ -260,8 +229,8 @@ def gazelle_deps():
go_repository(
name = "org_golang_x_sync",
importpath = "golang.org/x/sync",
- sum = "h1:0SH2R3f1b1VmIMG7BXbEZCBUu2dKmHschSmjqGUrW8A=",
- version = "v0.0.0-20220907140024-f12130a52804",
+ sum = "h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=",
+ version = "v0.0.0-20220722155255-886fb9371eb4",
)
go_repository(
name = "org_golang_x_sys",
diff --git a/gazelle/go.mod b/gazelle/go.mod
index 6d6f0332a0..94f19e801f 100644
--- a/gazelle/go.mod
+++ b/gazelle/go.mod
@@ -3,9 +3,7 @@ module github.com/bazelbuild/rules_python/gazelle
go 1.19
require (
- github.com/bazelbuild/bazel-gazelle v0.27.0
github.com/bazelbuild/buildtools v0.0.0-20221004120235-7186f635531b
- github.com/bazelbuild/rules_go v0.35.0
github.com/bmatcuk/doublestar v1.3.4
github.com/emirpasic/gods v1.18.1
github.com/ghodss/yaml v1.0.0
diff --git a/gazelle/manifest/defs.bzl b/gazelle/manifest/defs.bzl
index 78e0c272ac..05562a1583 100644
--- a/gazelle/manifest/defs.bzl
+++ b/gazelle/manifest/defs.bzl
@@ -24,13 +24,16 @@ def gazelle_python_manifest(
modules_mapping,
pip_repository_name = "",
pip_deps_repository_name = "",
- manifest = ":gazelle_python.yaml"):
+ manifest = ":gazelle_python.yaml",
+ use_pip_repository_aliases = False):
"""A macro for defining the updating and testing targets for the Gazelle manifest file.
Args:
name: the name used as a base for the targets.
requirements: the target for the requirements.txt file.
pip_repository_name: the name of the pip_install or pip_repository target.
+ use_pip_repository_aliases: boolean flag to enable using user-friendly
+ python package aliases.
pip_deps_repository_name: deprecated - the old pip_install target name.
modules_mapping: the target for the generated modules_mapping.json file.
manifest: the target for the Gazelle manifest file.
@@ -67,6 +70,12 @@ def gazelle_python_manifest(
update_target_label,
]
+ if use_pip_repository_aliases:
+ update_args += [
+ "--use-pip-repository-aliases",
+ "true",
+ ]
+
go_binary(
name = update_target,
embed = [Label("//manifest/generate:generate_lib")],
diff --git a/gazelle/manifest/generate/generate.go b/gazelle/manifest/generate/generate.go
index 0f429f8345..1f56e630cc 100644
--- a/gazelle/manifest/generate/generate.go
+++ b/gazelle/manifest/generate/generate.go
@@ -38,12 +38,15 @@ func init() {
}
func main() {
- var manifestGeneratorHashPath string
- var requirementsPath string
- var pipRepositoryName string
- var modulesMappingPath string
- var outputPath string
- var updateTarget string
+ var (
+ manifestGeneratorHashPath string
+ requirementsPath string
+ pipRepositoryName string
+ usePipRepositoryAliases bool
+ modulesMappingPath string
+ outputPath string
+ updateTarget string
+ )
flag.StringVar(
&manifestGeneratorHashPath,
"manifest-generator-hash",
@@ -60,6 +63,11 @@ func main() {
"pip-repository-name",
"",
"The name of the pip_install or pip_repository target.")
+ flag.BoolVar(
+ &usePipRepositoryAliases,
+ "use-pip-repository-aliases",
+ false,
+ "Whether to use the pip-repository aliases, which are generated when passing 'incompatible_generate_aliases = True'.")
flag.StringVar(
&modulesMappingPath,
"modules-mapping",
@@ -103,7 +111,8 @@ func main() {
manifestFile := manifest.NewFile(&manifest.Manifest{
ModulesMapping: modulesMapping,
PipRepository: &manifest.PipRepository{
- Name: pipRepositoryName,
+ Name: pipRepositoryName,
+ UsePipRepositoryAliases: usePipRepositoryAliases,
},
})
if err := writeOutput(
diff --git a/gazelle/manifest/manifest.go b/gazelle/manifest/manifest.go
index bb4826435f..c49951dd3e 100644
--- a/gazelle/manifest/manifest.go
+++ b/gazelle/manifest/manifest.go
@@ -144,4 +144,7 @@ type Manifest struct {
type PipRepository struct {
// The name of the pip_install or pip_repository target.
Name string
+ // UsePipRepositoryAliases allows to use aliases generated pip_repository
+ // when passing incompatible_generate_aliases = True.
+ UsePipRepositoryAliases bool `yaml:"use_pip_repository_aliases,omitempty"`
}
diff --git a/gazelle/python/BUILD.bazel b/gazelle/python/BUILD.bazel
index 3b5ded2139..ddcad2785d 100644
--- a/gazelle/python/BUILD.bazel
+++ b/gazelle/python/BUILD.bazel
@@ -61,7 +61,6 @@ go_test(
] + glob(["testdata/**"]),
deps = [
"@bazel_gazelle//testtools:go_default_library",
- "@com_github_emirpasic_gods//lists/singlylinkedlist",
"@com_github_ghodss_yaml//:yaml",
"@io_bazel_rules_go//go/tools/bazel:go_default_library",
],
diff --git a/gazelle/python/parse.py b/gazelle/python/parse.py
index 5cf0b89868..6c0ef69598 100644
--- a/gazelle/python/parse.py
+++ b/gazelle/python/parse.py
@@ -27,7 +27,7 @@
def parse_import_statements(content, filepath):
modules = list()
- tree = ast.parse(content)
+ tree = ast.parse(content, filename=filepath)
for node in ast.walk(tree):
if isinstance(node, ast.Import):
for subnode in node.names:
diff --git a/gazelle/pythonconfig/BUILD.bazel b/gazelle/pythonconfig/BUILD.bazel
index 79b512163d..d0f1690d94 100644
--- a/gazelle/pythonconfig/BUILD.bazel
+++ b/gazelle/pythonconfig/BUILD.bazel
@@ -1,4 +1,4 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
name = "pythonconfig",
@@ -15,6 +15,12 @@ go_library(
],
)
+go_test(
+ name = "pythonconfig_test",
+ srcs = ["pythonconfig_test.go"],
+ deps = [":pythonconfig"],
+)
+
filegroup(
name = "distribution",
srcs = glob(["**"]),
diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go
index a2fe7d51b2..c7cd7c1a28 100644
--- a/gazelle/pythonconfig/pythonconfig.go
+++ b/gazelle/pythonconfig/pythonconfig.go
@@ -90,6 +90,14 @@ var defaultIgnoreFiles = map[string]struct{}{
"setup.py": {},
}
+func SanitizeDistribution(distributionName string) string {
+ sanitizedDistribution := strings.ToLower(distributionName)
+ sanitizedDistribution = strings.ReplaceAll(sanitizedDistribution, "-", "_")
+ sanitizedDistribution = strings.ReplaceAll(sanitizedDistribution, ".", "_")
+
+ return sanitizedDistribution
+}
+
// Configs is an extension of map[string]*Config. It provides finding methods
// on top of the mapping.
type Configs map[string]*Config
@@ -218,12 +226,17 @@ func (c *Config) FindThirdPartyDependency(modName string) (string, bool) {
} else if gazelleManifest.PipRepository != nil {
distributionRepositoryName = gazelleManifest.PipRepository.Name
}
- sanitizedDistribution := strings.ToLower(distributionName)
- sanitizedDistribution = strings.ReplaceAll(sanitizedDistribution, "-", "_")
- var lbl label.Label
+ sanitizedDistribution := SanitizeDistribution(distributionName)
+
+ if gazelleManifest.PipRepository != nil && gazelleManifest.PipRepository.UsePipRepositoryAliases {
+ // @