diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 1d275b1832..95105c585e 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -1160,8 +1160,20 @@ tasks: shell_commands: - sed -i 's/^# load("@bazel_ci_rules/load("@bazel_ci_rules/' WORKSPACE.bazel - sed -i 's/^# rbe_preconfig/rbe_preconfig/' WORKSPACE.bazel - build_flags: *aspects_flags - test_flags: *aspects_flags + build_flags: + - "--config=rustfmt" + - "--config=clippy" + - "--config=no_mypy" + - "--config=no_black" + - "--config=no_pylint" + - "--config=no_isort" + test_flags: + - "--config=rustfmt" + - "--config=clippy" + - "--config=no_mypy" + - "--config=no_black" + - "--config=no_pylint" + - "--config=no_isort" build_targets: - "//..." test_targets: diff --git a/.github/workflows/compile_pyo3_dev_requirements.yaml b/.github/workflows/compile_pyo3_dev_requirements.yaml new file mode 100644 index 0000000000..19daa5be7b --- /dev/null +++ b/.github/workflows/compile_pyo3_dev_requirements.yaml @@ -0,0 +1,58 @@ +--- +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: compile_pyo3_dev_requirements + +on: + workflow_dispatch: + inputs: + target: + description: "The py_reqs_compiler target to run" + default: "//tools/requirements:update" + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - os: linux_x86_64 + runs-on: ubuntu-latest + - os: linux_aarch64 + runs-on: ubuntu-24.04-arm + - os: macos_aarch64 + runs-on: macos-latest + - os: windows_x86_64 + runs-on: windows-latest + + runs-on: ${{ matrix.runs-on }} + defaults: + run: + working-directory: ./extensions/pyo3 + name: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - name: Compile requirements + if: runner.os == 'Windows' + run: | + bazel run "$env:TARGET" "--" "--upgrade" "--verbose" + env: + TARGET: ${{ github.event.inputs.target }} + - name: Compile requirements + if: runner.os != 'Windows' + run: | + bazel run "${TARGET}" "--" "--upgrade" "--verbose" + env: + TARGET: ${{ github.event.inputs.target }} + - name: Display results + shell: bash + run: | + set -e + echo "
" >> "${GITHUB_STEP_SUMMARY}" + echo "" >> "${GITHUB_STEP_SUMMARY}" + echo '```' >> "${GITHUB_STEP_SUMMARY}" + cat "tools/requirements/requirements_${{ matrix.os }}.txt" >> "${GITHUB_STEP_SUMMARY}" + echo '```' >> "${GITHUB_STEP_SUMMARY}" + echo "" >> "${GITHUB_STEP_SUMMARY}" + echo "
" >> "${GITHUB_STEP_SUMMARY}" diff --git a/extensions/pyo3/.bazelrc b/extensions/pyo3/.bazelrc index 1e36b9b34d..d2ee87b8f0 100644 --- a/extensions/pyo3/.bazelrc +++ b/extensions/pyo3/.bazelrc @@ -23,7 +23,34 @@ build --sandbox_default_allow_network=false # registered in the WORKSPACE. common --repo_env=BAZEL_DO_NOT_DETECT_PYTHON_TOOLCHAIN=1 -# # Enable rustfmt for all targets in the workspace +############################################################################### +## Configuration Flags +############################################################################### + +# Enable black for all targets in the workspace +build --aspects=@rules_venv//python/black:defs.bzl%py_black_aspect +build:black --output_groups=+py_black_checks +build:no_black --output_groups=-py_black_checks + +# Enable isort for all targets in the workspace +build --aspects=@rules_venv//python/isort:defs.bzl%py_isort_aspect +build --@rules_venv//python/isort:config=//:.isort.cfg +build:isort --output_groups=+py_isort_checks +build:no_isort --output_groups=-py_isort_checks + +# Enable mypy for all targets in the workspace +build --aspects=@rules_venv//python/mypy:defs.bzl%py_mypy_aspect +build --@rules_venv//python/mypy:config=//:.mypy.ini +build:mypy --output_groups=+py_mypy_checks +build:no_mypy --output_groups=-py_mypy_checks + +# Enable pylint for all targets in the workspace +build --aspects=@rules_venv//python/pylint:defs.bzl%py_pylint_aspect +build --@rules_venv//python/pylint:config=//:.pylintrc.toml +build:pylint --output_groups=+py_pylint_checks +build:no_pylint --output_groups=-py_pylint_checks + +# Enable rustfmt for all targets in the workspace build --aspects=@rules_rust//rust:defs.bzl%rustfmt_aspect build:rustfmt --output_groups=+rustfmt_checks build:no_rustfmt --output_groups=-rustfmt_checks @@ -44,8 +71,16 @@ build:unpretty --config=nightly # Convenience configs for enabling linting and formatting build:strict --config=rustfmt build:strict --config=clippy +build:strict --config=black +build:strict --config=isort +build:strict --config=pylint +build:strict --config=mypy build:no_strict --config=no_rustfmt build:no_strict --config=no_clippy +build:no_strict --config=no_black +build:no_strict --config=no_isort +build:no_strict --config=no_pylint +build:no_strict --config=no_mypy # When running test enable all linters and formatters test --config=strict diff --git a/extensions/pyo3/.isort.cfg b/extensions/pyo3/.isort.cfg new file mode 100644 index 0000000000..f238bf7ea1 --- /dev/null +++ b/extensions/pyo3/.isort.cfg @@ -0,0 +1,2 @@ +[settings] +profile = black diff --git a/extensions/pyo3/.mypy.ini b/extensions/pyo3/.mypy.ini new file mode 100644 index 0000000000..12611a8767 --- /dev/null +++ b/extensions/pyo3/.mypy.ini @@ -0,0 +1,11 @@ +# https://mypy.readthedocs.io/en/stable/config_file.html +[mypy] + +# Improve strictness of checks +strict = True + +# Improve logging +pretty = True + +# Improve behavior in actions. +explicit_package_bases = True diff --git a/extensions/pyo3/.pylintrc.toml b/extensions/pyo3/.pylintrc.toml new file mode 100644 index 0000000000..95606f8110 --- /dev/null +++ b/extensions/pyo3/.pylintrc.toml @@ -0,0 +1,15 @@ +[tool.pylint.main] + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension = true + +# Limit actions to using 1 core per action. +jobs = 1 + +disable = [ + "fixme", # Developers should be allowed to leave TODO comments. + "wrong-import-position", # isort is in charge of import ordering. + "wrong-import-order", # isort is in charge of import ordering. + "line-too-long", # Black is responsible for shortening where possible. +] diff --git a/extensions/pyo3/BUILD.bazel b/extensions/pyo3/BUILD.bazel index 0ff45bebaa..47e0506eed 100644 --- a/extensions/pyo3/BUILD.bazel +++ b/extensions/pyo3/BUILD.bazel @@ -2,6 +2,9 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("//private:pyo3_toolchain.bzl", "current_pyo3_toolchain") exports_files([ + ".isort.cfg", + ".mypy.ini", + ".pylintrc.toml", "defs.bzl", "MODULE.bazel", "version.bzl", diff --git a/extensions/pyo3/MODULE.bazel b/extensions/pyo3/MODULE.bazel index da307beed8..869afb8e6f 100644 --- a/extensions/pyo3/MODULE.bazel +++ b/extensions/pyo3/MODULE.bazel @@ -37,3 +37,26 @@ use_repo( rust_ext_dev, "buildkite_config", ) + +bazel_dep(name = "rules_venv", version = "0.7.0", dev_dependency = True) +bazel_dep(name = "rules_req_compile", version = "1.0.0rc38", dev_dependency = True) + +requirements = use_extension("@rules_req_compile//extensions:python.bzl", "requirements", dev_dependency = True) +requirements.parse( + name = "pip_deps", + requirements_locks = { + "//tools/requirements:requirements_linux_aarch64.txt": "@@//tools/requirements:linux_aarch64", + "//tools/requirements:requirements_linux_x86_64.txt": "@@//tools/requirements:linux_x86_64", + "//tools/requirements:requirements_macos_aarch64.txt": "@@//tools/requirements:macos_aarch64", + "//tools/requirements:requirements_windows_x86_64.txt": "@@//tools/requirements:windows_x86_64", + }, +) +use_repo(requirements, "pip_deps") + +register_toolchains( + "//tools/toolchains:black_toolchain", + "//tools/toolchains:isort_toolchain", + "//tools/toolchains:mypy_toolchain", + "//tools/toolchains:pylint_toolchain", + dev_dependency = True, +) diff --git a/extensions/pyo3/settings/BUILD.bazel b/extensions/pyo3/settings/BUILD.bazel index 573c6179e8..8bdd7c45cd 100644 --- a/extensions/pyo3/settings/BUILD.bazel +++ b/extensions/pyo3/settings/BUILD.bazel @@ -10,7 +10,7 @@ package(default_visibility = ["//visibility:public"]) # agnostic or incorrect stubs will be generated. # # The use of this feature requires the `experimental-inspect` feature. For -# details see: https://pyo3.rs/v0.23.4/features.html#experimental-inspect +# details see: https://pyo3.rs/v0.26.0/features.html#experimental-inspect bool_flag( name = "experimental_stubgen", build_setting_default = True, diff --git a/extensions/pyo3/test/string_sum/string_sum_import_test.py b/extensions/pyo3/test/string_sum/string_sum_import_test.py index 379b4232fc..8f94ba2c0e 100644 --- a/extensions/pyo3/test/string_sum/string_sum_import_test.py +++ b/extensions/pyo3/test/string_sum/string_sum_import_test.py @@ -2,7 +2,8 @@ import unittest -from string_sum_import import sum_as_string +# TODO: https://github.com/periareon/rules_venv/issues/80 +from string_sum_import import sum_as_string # type: ignore class StringSumTest(unittest.TestCase): diff --git a/extensions/pyo3/tools/BUILD.bazel b/extensions/pyo3/tools/BUILD.bazel new file mode 100644 index 0000000000..e69de29bb2 diff --git a/extensions/pyo3/tools/requirements/BUILD.bazel b/extensions/pyo3/tools/requirements/BUILD.bazel new file mode 100644 index 0000000000..87239df5f5 --- /dev/null +++ b/extensions/pyo3/tools/requirements/BUILD.bazel @@ -0,0 +1,82 @@ +load("@rules_req_compile//:defs.bzl", "py_reqs_compiler", "py_reqs_solution_test") + +config_setting( + name = "linux_aarch64", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + visibility = ["//visibility:public"], +) + +config_setting( + name = "linux_x86_64", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + visibility = ["//visibility:public"], +) + +config_setting( + name = "macos_aarch64", + constraint_values = [ + "@platforms//os:macos", + "@platforms//cpu:aarch64", + ], + visibility = ["//visibility:public"], +) + +config_setting( + name = "macos_x86_64", + constraint_values = [ + "@platforms//os:macos", + "@platforms//cpu:x86_64", + ], + visibility = ["//visibility:public"], +) + +config_setting( + name = "windows_x86_64", + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], + visibility = ["//visibility:public"], +) + +PLATFORMS = [ + "linux_aarch64", + "linux_x86_64", + "macos_aarch64", + "windows_x86_64", +] + +[ + py_reqs_compiler( + name = "requirements.{}.update".format(platform), + requirements_in = "requirements.in", + requirements_txt = "requirements_{}.txt".format(platform), + target_compatible_with = select({ + ":{}".format(platform): [], + "//conditions:default": ["@platforms//:incompatible"], + }), + ) + for platform in PLATFORMS +] + +[ + py_reqs_solution_test( + name = "requirements_{}_test".format(platform), + compiler = ":requirements.{}.update".format(platform), + ) + for platform in PLATFORMS +] + +alias( + name = "update", + actual = select({ + ":{}".format(platform): ":requirements.{}.update".format(platform) + for platform in PLATFORMS + }), +) diff --git a/extensions/pyo3/tools/requirements/README.md b/extensions/pyo3/tools/requirements/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/extensions/pyo3/tools/requirements/requirements.in b/extensions/pyo3/tools/requirements/requirements.in new file mode 100644 index 0000000000..5b19d7bd89 --- /dev/null +++ b/extensions/pyo3/tools/requirements/requirements.in @@ -0,0 +1,6 @@ +# Development requirements + +black +isort +mypy +pylint diff --git a/extensions/pyo3/tools/requirements/requirements_linux_aarch64.txt b/extensions/pyo3/tools/requirements/requirements_linux_aarch64.txt new file mode 100644 index 0000000000..61ba3fb2c9 --- /dev/null +++ b/extensions/pyo3/tools/requirements/requirements_linux_aarch64.txt @@ -0,0 +1,80 @@ +################################################################################ +## AUTOGENERATED: This file is autogenerated by req-compile. +## +## Python: 3.11.13 +## Platform: Linux +## +## To regenerate this file, use the following command: +## +## bazel run "@@//tools/requirements:requirements.linux_aarch64.update" +## +################################################################################ + +astroid==4.0.2 \ + --hash=sha256:d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b + # via pylint (<=4.1.dev0,>=4.0.2) + # https://files.pythonhosted.org/packages/93/ac/a85b4bfb4cf53221513e27f33cc37ad158fce02ac291d18bee6b49ab477d/astroid-4.0.2-py3-none-any.whl#sha256=d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b +black==25.11.0 \ + --hash=sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl#sha256=e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b +click==8.3.0 \ + --hash=sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc + # via black (>=8.0.0) + # https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl#sha256=9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc +dill==0.4.0 \ + --hash=sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 + # via pylint (>=0.3.6) + # https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl#sha256=44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 +isort==7.0.0 \ + --hash=sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1 + # via + # _main/tools/requirements/requirements.in + # pylint (!=5.13,<8,>=5) + # https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl#sha256=1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1 +mccabe==0.7.0 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + # via pylint (<0.8,>=0.6) + # https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl#sha256=6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +mypy==1.18.2 \ + --hash=sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/72/ef/0c9ba89eb03453e76bdac5a78b08260a848c7bfc5d6603634774d9cd9525/mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl#sha256=1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d +mypy_extensions==1.1.0 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 + # via + # black (>=0.4.3) + # mypy (>=1.0.0) + # https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl#sha256=1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 + # via black (>=22.0) + # https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 + # via + # black (>=0.9.0) + # mypy (>=0.9.0) + # https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl#sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 +platformdirs==4.5.0 \ + --hash=sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 + # via + # black (>=2) + # pylint (>=2.2) + # https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl#sha256=e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 +pylint==4.0.3 \ + --hash=sha256:896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/1f/01/b8acd4087102c774d432a6663bac4857405c64771445c0a3110828bc5c88/pylint-4.0.3-py3-none-any.whl#sha256=896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a +pytokens==0.3.0 \ + --hash=sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 + # via black (>=0.3.0) + # https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl#sha256=95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 +tomlkit==0.13.3 \ + --hash=sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0 + # via pylint (>=0.10.1) + # https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl#sha256=c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0 +typing_extensions==4.15.0 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + # via mypy (>=4.6.0) + # https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl#sha256=f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 diff --git a/extensions/pyo3/tools/requirements/requirements_linux_x86_64.txt b/extensions/pyo3/tools/requirements/requirements_linux_x86_64.txt new file mode 100644 index 0000000000..3fb0ac0497 --- /dev/null +++ b/extensions/pyo3/tools/requirements/requirements_linux_x86_64.txt @@ -0,0 +1,80 @@ +################################################################################ +## AUTOGENERATED: This file is autogenerated by req-compile. +## +## Python: 3.11.13 +## Platform: Linux +## +## To regenerate this file, use the following command: +## +## bazel run "@@//tools/requirements:requirements.linux_x86_64.update" +## +################################################################################ + +astroid==4.0.2 \ + --hash=sha256:d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b + # via pylint (<=4.1.dev0,>=4.0.2) + # https://files.pythonhosted.org/packages/93/ac/a85b4bfb4cf53221513e27f33cc37ad158fce02ac291d18bee6b49ab477d/astroid-4.0.2-py3-none-any.whl#sha256=d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b +black==25.11.0 \ + --hash=sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/cb/c8/7c8bda3108d0bb57387ac41b4abb5c08782b26da9f9c4421ef6694dac01a/black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl#sha256=d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc +click==8.3.0 \ + --hash=sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc + # via black (>=8.0.0) + # https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl#sha256=9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc +dill==0.4.0 \ + --hash=sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 + # via pylint (>=0.3.6) + # https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl#sha256=44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 +isort==7.0.0 \ + --hash=sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1 + # via + # _main/tools/requirements/requirements.in + # pylint (!=5.13,<8,>=5) + # https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl#sha256=1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1 +mccabe==0.7.0 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + # via pylint (<0.8,>=0.6) + # https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl#sha256=6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +mypy==1.18.2 \ + --hash=sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86 + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/1a/52/ec4a061dd599eb8179d5411d99775bec2a20542505988f40fc2fee781068/mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl#sha256=1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86 +mypy_extensions==1.1.0 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 + # via + # black (>=0.4.3) + # mypy (>=1.0.0) + # https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl#sha256=1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 + # via black (>=22.0) + # https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 + # via + # black (>=0.9.0) + # mypy (>=0.9.0) + # https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl#sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 +platformdirs==4.5.0 \ + --hash=sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 + # via + # black (>=2) + # pylint (>=2.2) + # https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl#sha256=e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 +pylint==4.0.3 \ + --hash=sha256:896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/1f/01/b8acd4087102c774d432a6663bac4857405c64771445c0a3110828bc5c88/pylint-4.0.3-py3-none-any.whl#sha256=896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a +pytokens==0.3.0 \ + --hash=sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 + # via black (>=0.3.0) + # https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl#sha256=95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 +tomlkit==0.13.3 \ + --hash=sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0 + # via pylint (>=0.10.1) + # https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl#sha256=c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0 +typing_extensions==4.15.0 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + # via mypy (>=4.6.0) + # https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl#sha256=f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 diff --git a/extensions/pyo3/tools/requirements/requirements_macos_aarch64.txt b/extensions/pyo3/tools/requirements/requirements_macos_aarch64.txt new file mode 100644 index 0000000000..3cb8f546d5 --- /dev/null +++ b/extensions/pyo3/tools/requirements/requirements_macos_aarch64.txt @@ -0,0 +1,80 @@ +################################################################################ +## AUTOGENERATED: This file is autogenerated by req-compile. +## +## Python: 3.11.13 +## Platform: Darwin +## +## To regenerate this file, use the following command: +## +## bazel run "@@//tools/requirements:requirements.macos_aarch64.update" +## +################################################################################ + +astroid==4.0.2 \ + --hash=sha256:d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b + # via pylint (<=4.1.dev0,>=4.0.2) + # https://files.pythonhosted.org/packages/93/ac/a85b4bfb4cf53221513e27f33cc37ad158fce02ac291d18bee6b49ab477d/astroid-4.0.2-py3-none-any.whl#sha256=d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b +black==25.11.0 \ + --hash=sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170 + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/82/5d/ffe8a006aa522c9e3f430e7b93568a7b2163f4b3f16e8feb6d8c3552761a/black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl#sha256=cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170 +click==8.3.0 \ + --hash=sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc + # via black (>=8.0.0) + # https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl#sha256=9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc +dill==0.4.0 \ + --hash=sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 + # via pylint (>=0.3.6) + # https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl#sha256=44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 +isort==7.0.0 \ + --hash=sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1 + # via + # _main/tools/requirements/requirements.in + # pylint (!=5.13,<8,>=5) + # https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl#sha256=1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1 +mccabe==0.7.0 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + # via pylint (<0.8,>=0.6) + # https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl#sha256=6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +mypy==1.18.2 \ + --hash=sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341 + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/0f/e0/1e96c3d4266a06d4b0197ace5356d67d937d8358e2ee3ffac71faa843724/mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl#sha256=776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341 +mypy_extensions==1.1.0 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 + # via + # black (>=0.4.3) + # mypy (>=1.0.0) + # https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl#sha256=1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 + # via black (>=22.0) + # https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 + # via + # black (>=0.9.0) + # mypy (>=0.9.0) + # https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl#sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 +platformdirs==4.5.0 \ + --hash=sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 + # via + # black (>=2) + # pylint (>=2.2) + # https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl#sha256=e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 +pylint==4.0.3 \ + --hash=sha256:896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/1f/01/b8acd4087102c774d432a6663bac4857405c64771445c0a3110828bc5c88/pylint-4.0.3-py3-none-any.whl#sha256=896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a +pytokens==0.3.0 \ + --hash=sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 + # via black (>=0.3.0) + # https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl#sha256=95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 +tomlkit==0.13.3 \ + --hash=sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0 + # via pylint (>=0.10.1) + # https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl#sha256=c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0 +typing_extensions==4.15.0 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + # via mypy (>=4.6.0) + # https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl#sha256=f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 diff --git a/extensions/pyo3/tools/requirements/requirements_windows_x86_64.txt b/extensions/pyo3/tools/requirements/requirements_windows_x86_64.txt new file mode 100644 index 0000000000..7df95db06e --- /dev/null +++ b/extensions/pyo3/tools/requirements/requirements_windows_x86_64.txt @@ -0,0 +1,86 @@ +################################################################################ +## AUTOGENERATED: This file is autogenerated by req-compile. +## +## Python: 3.11.13 +## Platform: Windows +## +## To regenerate this file, use the following command: +## +## bazel run "@@//tools/requirements:requirements.windows_x86_64.update" +## +################################################################################ + +astroid==4.0.2 \ + --hash=sha256:d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b + # via pylint (<=4.1.dev0,>=4.0.2) + # https://files.pythonhosted.org/packages/93/ac/a85b4bfb4cf53221513e27f33cc37ad158fce02ac291d18bee6b49ab477d/astroid-4.0.2-py3-none-any.whl#sha256=d7546c00a12efc32650b19a2bb66a153883185d3179ab0d4868086f807338b9b +black==25.11.0 \ + --hash=sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/34/b9/f17dea34eecb7cc2609a89627d480fb6caea7b86190708eaa7eb15ed25e7/black-25.11.0-cp311-cp311-win_amd64.whl#sha256=7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e +click==8.3.0 \ + --hash=sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc + # via black (>=8.0.0) + # https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl#sha256=9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc +colorama==0.4.6 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via + # click + # pylint (>=0.4.5) + # https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl#sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +dill==0.4.0 \ + --hash=sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 + # via pylint (>=0.3.6) + # https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl#sha256=44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 +isort==7.0.0 \ + --hash=sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1 + # via + # _main/tools/requirements/requirements.in + # pylint (!=5.13,<8,>=5) + # https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl#sha256=1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1 +mccabe==0.7.0 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + # via pylint (<0.8,>=0.6) + # https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl#sha256=6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +mypy==1.18.2 \ + --hash=sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8 + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/c8/7d/2697b930179e7277529eaaec1513f8de622818696857f689e4a5432e5e27/mypy-1.18.2-cp311-cp311-win_amd64.whl#sha256=664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8 +mypy_extensions==1.1.0 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 + # via + # black (>=0.4.3) + # mypy (>=1.0.0) + # https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl#sha256=1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 + # via black (>=22.0) + # https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl#sha256=29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 + # via + # black (>=0.9.0) + # mypy (>=0.9.0) + # https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl#sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 +platformdirs==4.5.0 \ + --hash=sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 + # via + # black (>=2) + # pylint (>=2.2) + # https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl#sha256=e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 +pylint==4.0.3 \ + --hash=sha256:896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a + # via _main/tools/requirements/requirements.in + # https://files.pythonhosted.org/packages/1f/01/b8acd4087102c774d432a6663bac4857405c64771445c0a3110828bc5c88/pylint-4.0.3-py3-none-any.whl#sha256=896d09afb0e78bbf2e030cd1f3d8dc92771a51f7e46828cbc3948a89cd03433a +pytokens==0.3.0 \ + --hash=sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 + # via black (>=0.3.0) + # https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl#sha256=95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 +tomlkit==0.13.3 \ + --hash=sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0 + # via pylint (>=0.10.1) + # https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl#sha256=c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0 +typing_extensions==4.15.0 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + # via mypy (>=4.6.0) + # https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl#sha256=f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 diff --git a/extensions/pyo3/tools/toolchains/BUILD.bazel b/extensions/pyo3/tools/toolchains/BUILD.bazel new file mode 100644 index 0000000000..48c45b8744 --- /dev/null +++ b/extensions/pyo3/tools/toolchains/BUILD.bazel @@ -0,0 +1,52 @@ +load("@rules_venv//python/black:defs.bzl", "py_black_toolchain") +load("@rules_venv//python/isort:defs.bzl", "py_isort_toolchain") +load("@rules_venv//python/mypy:defs.bzl", "py_mypy_toolchain") +load("@rules_venv//python/pylint:defs.bzl", "py_pylint_toolchain") + +py_black_toolchain( + name = "py_black_toolchain", + black = "@pip_deps//:black", +) + +toolchain( + name = "black_toolchain", + toolchain = ":py_black_toolchain", + toolchain_type = "@rules_venv//python/black:toolchain_type", + visibility = ["//visibility:public"], +) + +py_isort_toolchain( + name = "py_isort_toolchain", + isort = "@pip_deps//:isort", +) + +toolchain( + name = "isort_toolchain", + toolchain = ":py_isort_toolchain", + toolchain_type = "@rules_venv//python/isort:toolchain_type", + visibility = ["//visibility:public"], +) + +py_mypy_toolchain( + name = "py_mypy_toolchain", + mypy = "@pip_deps//:mypy", +) + +toolchain( + name = "mypy_toolchain", + toolchain = ":py_mypy_toolchain", + toolchain_type = "@rules_venv//python/mypy:toolchain_type", + visibility = ["//visibility:public"], +) + +py_pylint_toolchain( + name = "py_pylint_toolchain", + pylint = "@pip_deps//:pylint", +) + +toolchain( + name = "pylint_toolchain", + toolchain = ":py_pylint_toolchain", + toolchain_type = "@rules_venv//python/pylint:toolchain_type", + visibility = ["//visibility:public"], +)