From 10af2a339f08293c504d6f97a6cdc9d6c24ad15b Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Fri, 9 Jun 2023 23:25:20 -0700 Subject: [PATCH 01/96] Get started on new pypi_install repo rule https://docs.google.com/document/d/12Yrc3Wyo7hZOroKdhgOgiduOCYor_UZyzpaQL9lY8sM/edit# --- .bazelrc | 4 +- examples/BUILD.bazel | 5 + examples/pypi_install/.bazelrc | 2 + examples/pypi_install/.gitignore | 4 + examples/pypi_install/BUILD.bazel | 41 ++++++++ examples/pypi_install/WORKSPACE | 35 +++++++ examples/pypi_install/main.py | 19 ++++ .../pip_install_report_x86_64_linux.json | 1 + examples/pypi_install/pip_parse_test.py | 77 +++++++++++++++ examples/pypi_install/requirements.in | 1 + examples/pypi_install/requirements_lock.txt | 99 +++++++++++++++++++ examples/pypi_install/test.py | 26 +++++ python/pip_install/requirements.bzl | 12 +++ .../dependency_resolver.py | 8 ++ 14 files changed, 332 insertions(+), 2 deletions(-) create mode 100644 examples/pypi_install/.bazelrc create mode 100644 examples/pypi_install/.gitignore create mode 100644 examples/pypi_install/BUILD.bazel create mode 100644 examples/pypi_install/WORKSPACE create mode 100644 examples/pypi_install/main.py create mode 100644 examples/pypi_install/pip_install_report_x86_64_linux.json create mode 100644 examples/pypi_install/pip_parse_test.py create mode 100644 examples/pypi_install/requirements.in create mode 100644 examples/pypi_install/requirements_lock.txt create mode 100644 examples/pypi_install/test.py diff --git a/.bazelrc b/.bazelrc index 2cf2a8a3a9..9039939bbd 100644 --- a/.bazelrc +++ b/.bazelrc @@ -3,8 +3,8 @@ # 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/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_point,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_install,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,tests/compile_pip_requirements,tests/compile_pip_requirements_test_from_external_workspace,tests/ignore_root_user_error,tests/pip_repository_entry_points -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_point,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_install,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,tests/compile_pip_requirements,tests/compile_pip_requirements_test_from_external_workspace,tests/ignore_root_user_error,tests/pip_repository_entry_points +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_point,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_install,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/pypi_install,examples/py_proto_library,tests/compile_pip_requirements,tests/compile_pip_requirements_test_from_external_workspace,tests/ignore_root_user_error,tests/pip_repository_entry_points +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_point,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_install,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/pypi_install,examples/py_proto_library,tests/compile_pip_requirements,tests/compile_pip_requirements_test_from_external_workspace,tests/ignore_root_user_error,tests/pip_repository_entry_points test --test_output=errors diff --git a/examples/BUILD.bazel b/examples/BUILD.bazel index feb1cfbd4e..8f8980ae21 100644 --- a/examples/BUILD.bazel +++ b/examples/BUILD.bazel @@ -43,6 +43,11 @@ bazel_integration_test( tags = ["fix-windows"], ) +bazel_integration_test( + name = "pypi_install_example", + timeout = "long", +) + bazel_integration_test( name = "pip_repository_annotations_example", timeout = "long", diff --git a/examples/pypi_install/.bazelrc b/examples/pypi_install/.bazelrc new file mode 100644 index 0000000000..9e7ef37327 --- /dev/null +++ b/examples/pypi_install/.bazelrc @@ -0,0 +1,2 @@ +# https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file +try-import %workspace%/user.bazelrc diff --git a/examples/pypi_install/.gitignore b/examples/pypi_install/.gitignore new file mode 100644 index 0000000000..e5ae073b3c --- /dev/null +++ b/examples/pypi_install/.gitignore @@ -0,0 +1,4 @@ +# git ignore patterns + +/bazel-* +user.bazelrc diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel new file mode 100644 index 0000000000..c37bc22996 --- /dev/null +++ b/examples/pypi_install/BUILD.bazel @@ -0,0 +1,41 @@ +#load( +# "@pypi//:requirements.bzl", +# "data_requirement", +# "dist_info_requirement", +# "entry_point", +#) +load("@rules_python//python:defs.bzl", "py_binary", "py_test") +load("@rules_python//python:pip.bzl", "compile_pip_requirements") + +py_binary( + name = "main", + srcs = ["main.py"], + deps = [ + #"@pypi//requests", + ], +) + +py_test( + name = "test", + srcs = ["test.py"], + deps = [":main"], +) + +# This rule adds a convenient way to update the requirements file. +compile_pip_requirements( + name = "requirements", + extra_args = ["--allow-unsafe"], + requirements_in = "requirements.in", + requirements_txt = "requirements_lock.txt", + pip_installation_report = { + ":x86_64_linux": "pip_install_report_x86_64_linux.json", + }, +) + +config_setting( + name = "x86_64_linux", + constraint_values = [ + "@platforms//cpu:x86_64", + "@platforms//os:linux", + ], +) diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE new file mode 100644 index 0000000000..d6cf4ccd73 --- /dev/null +++ b/examples/pypi_install/WORKSPACE @@ -0,0 +1,35 @@ +workspace(name = "rules_python_pip_parse_example") + +local_repository( + name = "rules_python", + path = "../..", +) + +load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains") + +py_repositories() + +load("@rules_python//python/pip_install:repositories.bzl", "pip_install_dependencies") + +pip_install_dependencies() + +python_register_toolchains( + name = "python39", + python_version = "3.9", +) + +load("@python39//:defs.bzl", "interpreter") +#load("@rules_python//python:pip.bzl", "pypi_install") +# +#pypi_install( +# name = "pypi_install", +# pip_installation_report = { +# "@//:x86_64_linux": "//:pip_install_report_x86_64_linux.json", +# }, +#) +# +#load("@pypi_install//:packages.bzl", "load_pypi_packages") +# +#load_pypi_packages( +# name = "pypi", +#) diff --git a/examples/pypi_install/main.py b/examples/pypi_install/main.py new file mode 100644 index 0000000000..80610f42a1 --- /dev/null +++ b/examples/pypi_install/main.py @@ -0,0 +1,19 @@ +# Copyright 2023 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 requests + + +def version(): + return requests.__version__ diff --git a/examples/pypi_install/pip_install_report_x86_64_linux.json b/examples/pypi_install/pip_install_report_x86_64_linux.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/examples/pypi_install/pip_install_report_x86_64_linux.json @@ -0,0 +1 @@ +{} diff --git a/examples/pypi_install/pip_parse_test.py b/examples/pypi_install/pip_parse_test.py new file mode 100644 index 0000000000..f319cb898f --- /dev/null +++ b/examples/pypi_install/pip_parse_test.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +# Copyright 2023 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 os +import subprocess +import unittest +from pathlib import Path + +from rules_python.python.runfiles import runfiles + + +class PipInstallTest(unittest.TestCase): + maxDiff = None + + def test_entry_point(self): + env = os.environ.get("YAMLLINT_ENTRY_POINT") + self.assertIsNotNone(env) + + r = runfiles.Create() + + # To find an external target, this must use `{workspace_name}/$(rootpath @external_repo//:target)` + entry_point = Path(r.Rlocation("rules_python_pip_parse_example/{}".format(env))) + self.assertTrue(entry_point.exists()) + + proc = subprocess.run( + [str(entry_point), "--version"], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + self.assertEqual(proc.stdout.decode("utf-8").strip(), "yamllint 1.26.3") + + def test_data(self): + env = os.environ.get("WHEEL_DATA_CONTENTS") + self.assertIsNotNone(env) + self.assertListEqual( + env.split(" "), + [ + "external/pypi_s3cmd/data/share/doc/packages/s3cmd/INSTALL.md", + "external/pypi_s3cmd/data/share/doc/packages/s3cmd/LICENSE", + "external/pypi_s3cmd/data/share/doc/packages/s3cmd/NEWS", + "external/pypi_s3cmd/data/share/doc/packages/s3cmd/README.md", + "external/pypi_s3cmd/data/share/man/man1/s3cmd.1", + ], + ) + + def test_dist_info(self): + env = os.environ.get("WHEEL_DIST_INFO_CONTENTS") + self.assertIsNotNone(env) + self.assertListEqual( + env.split(" "), + [ + "external/pypi_requests/site-packages/requests-2.25.1.dist-info/INSTALLER", + "external/pypi_requests/site-packages/requests-2.25.1.dist-info/LICENSE", + "external/pypi_requests/site-packages/requests-2.25.1.dist-info/METADATA", + "external/pypi_requests/site-packages/requests-2.25.1.dist-info/RECORD", + "external/pypi_requests/site-packages/requests-2.25.1.dist-info/WHEEL", + "external/pypi_requests/site-packages/requests-2.25.1.dist-info/top_level.txt", + ], + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/examples/pypi_install/requirements.in b/examples/pypi_install/requirements.in new file mode 100644 index 0000000000..f2293605cf --- /dev/null +++ b/examples/pypi_install/requirements.in @@ -0,0 +1 @@ +requests diff --git a/examples/pypi_install/requirements_lock.txt b/examples/pypi_install/requirements_lock.txt new file mode 100644 index 0000000000..9dd738ce1d --- /dev/null +++ b/examples/pypi_install/requirements_lock.txt @@ -0,0 +1,99 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# bazel run //:requirements.update +# +certifi==2023.5.7 \ + --hash=sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7 \ + --hash=sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716 + # via requests +charset-normalizer==3.1.0 \ + --hash=sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6 \ + --hash=sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1 \ + --hash=sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e \ + --hash=sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373 \ + --hash=sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62 \ + --hash=sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230 \ + --hash=sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be \ + --hash=sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c \ + --hash=sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0 \ + --hash=sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448 \ + --hash=sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f \ + --hash=sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649 \ + --hash=sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d \ + --hash=sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0 \ + --hash=sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706 \ + --hash=sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a \ + --hash=sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59 \ + --hash=sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23 \ + --hash=sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5 \ + --hash=sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb \ + --hash=sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e \ + --hash=sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e \ + --hash=sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c \ + --hash=sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28 \ + --hash=sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d \ + --hash=sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41 \ + --hash=sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974 \ + --hash=sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce \ + --hash=sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f \ + --hash=sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1 \ + --hash=sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d \ + --hash=sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8 \ + --hash=sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017 \ + --hash=sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31 \ + --hash=sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7 \ + --hash=sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8 \ + --hash=sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e \ + --hash=sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14 \ + --hash=sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd \ + --hash=sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d \ + --hash=sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795 \ + --hash=sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b \ + --hash=sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b \ + --hash=sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b \ + --hash=sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203 \ + --hash=sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f \ + --hash=sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19 \ + --hash=sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1 \ + --hash=sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a \ + --hash=sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac \ + --hash=sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9 \ + --hash=sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0 \ + --hash=sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137 \ + --hash=sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f \ + --hash=sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6 \ + --hash=sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5 \ + --hash=sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909 \ + --hash=sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f \ + --hash=sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0 \ + --hash=sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324 \ + --hash=sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755 \ + --hash=sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb \ + --hash=sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854 \ + --hash=sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c \ + --hash=sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60 \ + --hash=sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84 \ + --hash=sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0 \ + --hash=sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b \ + --hash=sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1 \ + --hash=sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531 \ + --hash=sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1 \ + --hash=sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11 \ + --hash=sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326 \ + --hash=sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df \ + --hash=sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab + # via requests +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 + # via requests +requests==2.31.0 \ + --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ + --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 + # via -r requirements.in +urllib3==2.0.3 \ + --hash=sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1 \ + --hash=sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825 + # via requests diff --git a/examples/pypi_install/test.py b/examples/pypi_install/test.py new file mode 100644 index 0000000000..2dc3046319 --- /dev/null +++ b/examples/pypi_install/test.py @@ -0,0 +1,26 @@ +# Copyright 2023 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 unittest + +import main + + +class ExampleTest(unittest.TestCase): + def test_main(self): + self.assertEqual("2.25.1", main.version()) + + +if __name__ == "__main__": + unittest.main() diff --git a/python/pip_install/requirements.bzl b/python/pip_install/requirements.bzl index 86fd408647..3143f1e0df 100644 --- a/python/pip_install/requirements.bzl +++ b/python/pip_install/requirements.bzl @@ -17,6 +17,12 @@ load("//python:defs.bzl", _py_binary = "py_binary", _py_test = "py_test") load("//python/pip_install:repositories.bzl", "requirement") +def _generate_log_select(pip_installation_report, loc): + result = {} + for config, report_label in pip_installation_report.items(): + result[config] = [loc.format(report_label)] + return select(result) + def compile_pip_requirements( name, extra_args = [], @@ -28,6 +34,7 @@ def compile_pip_requirements( requirements_darwin = None, requirements_linux = None, requirements_windows = None, + pip_installation_report = None, visibility = ["//visibility:private"], tags = None, **kwargs): @@ -73,6 +80,8 @@ def compile_pip_requirements( ) data = [name, requirements_in, requirements_txt] + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None] + if pip_installation_report: + data += _generate_log_select(pip_installation_report, "{}") # Use the Label constructor so this is expanded in the context of the file # where it appears, which is to say, in @rules_python @@ -87,6 +96,7 @@ def compile_pip_requirements( loc.format(requirements_linux) if requirements_linux else "None", loc.format(requirements_darwin) if requirements_darwin else "None", loc.format(requirements_windows) if requirements_windows else "None", + ] + (_generate_log_select(pip_installation_report, loc) if pip_installation_report else "None") + [ "//%s:%s.update" % (native.package_name(), name), ] + extra_args @@ -126,6 +136,8 @@ def compile_pip_requirements( if _bazel_version_4_or_greater: attrs["env"] = kwargs.pop("env", {}) + # TODO(phil): Add a target_compatible_with here for all the configs not + # mentioned in pip_installation_report. py_binary( name = name + ".update", **attrs diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index 89e355806c..a68d56f01f 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -20,6 +20,8 @@ import sys from pathlib import Path +import pip + import piptools.writer as piptools_writer from piptools.scripts.compile import cli @@ -93,6 +95,7 @@ def _locate(bazel_runfiles, file): requirements_linux = parse_str_none(sys.argv.pop(1)) requirements_darwin = parse_str_none(sys.argv.pop(1)) requirements_windows = parse_str_none(sys.argv.pop(1)) + pip_installation_report = parse_str_none(sys.argv.pop(1)) update_target_label = sys.argv.pop(1) resolved_requirements_in = _locate(bazel_runfiles, requirements_in) @@ -114,6 +117,8 @@ def _locate(bazel_runfiles, file): # Note: Windows cannot reference generated files without runfiles support enabled. requirements_in_relative = requirements_in[len(repository_prefix) :] requirements_txt_relative = requirements_txt[len(repository_prefix) :] + if pip_installation_report: + pip_installation_report_relative = pip_installation_report[len(repository_prefix) :] # Before loading click, set the locale for its parser. # If it leaks through to the system setting, it may fail: @@ -151,6 +156,9 @@ def _locate(bazel_runfiles, file): sys.argv.append("--generate-hashes") sys.argv.append("--output-file") sys.argv.append(requirements_txt_relative if UPDATE else requirements_out) + if pip_installation_report: + sys.argv.append("--pip-args") + sys.argv.append(f"--report={pip_installation_report_relative}") sys.argv.append( requirements_in_relative if Path(requirements_in_relative).exists() From cf28cb6c04ffe8b81734b25b3a43b254d53c384e Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Tue, 13 Jun 2023 18:00:07 -0700 Subject: [PATCH 02/96] Actually generate an installation report --- .../pip_install_report_x86_64_linux.json | 304 +++++++++++++++++- .../dependency_resolver.py | 24 ++ 2 files changed, 327 insertions(+), 1 deletion(-) diff --git a/examples/pypi_install/pip_install_report_x86_64_linux.json b/examples/pypi_install/pip_install_report_x86_64_linux.json index 0967ef424b..71b9b8ad0f 100644 --- a/examples/pypi_install/pip_install_report_x86_64_linux.json +++ b/examples/pypi_install/pip_install_report_x86_64_linux.json @@ -1 +1,303 @@ -{} +{ + "version": "0", + "pip_version": "22.3.1", + "install": [ + { + "download_info": { + "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", + "archive_info": { + "hash": "sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f" + } + }, + "is_direct": false, + "requested": true, + "metadata": { + "metadata_version": "2.1", + "name": "requests", + "version": "2.31.0", + "platform": [ + "UNKNOWN" + ], + "summary": "Python HTTP for Humans.", + "description_content_type": "text/markdown", + "home_page": "https://requests.readthedocs.io", + "author": "Kenneth Reitz", + "author_email": "me@kennethreitz.org", + "license": "Apache 2.0", + "classifier": [ + "Development Status :: 5 - Production/Stable", + "Environment :: Web Environment", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Software Development :: Libraries" + ], + "requires_dist": [ + "charset-normalizer (<4,>=2)", + "idna (<4,>=2.5)", + "urllib3 (<3,>=1.21.1)", + "certifi (>=2017.4.17)", + "PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks'", + "chardet (<6,>=3.0.2) ; extra == 'use_chardet_on_py3'" + ], + "requires_python": ">=3.7", + "project_url": [ + "Documentation, https://requests.readthedocs.io", + "Source, https://github.com/psf/requests" + ], + "provides_extra": [ + "security", + "socks", + "use_chardet_on_py3" + ], + "description": "# Requests\n\n**Requests** is a simple, yet elegant, HTTP library.\n\n```python\n>>> import requests\n>>> r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))\n>>> r.status_code\n200\n>>> r.headers['content-type']\n'application/json; charset=utf8'\n>>> r.encoding\n'utf-8'\n>>> r.text\n'{\"authenticated\": true, ...'\n>>> r.json()\n{'authenticated': True, ...}\n```\n\nRequests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method!\n\nRequests is one of the most downloaded Python packages today, pulling in around `30M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `1,000,000+` repositories. You may certainly put your trust in this code.\n\n[![Downloads](https://pepy.tech/badge/requests/month)](https://pepy.tech/project/requests)\n[![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests)\n[![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors)\n\n## Installing Requests and Supported Versions\n\nRequests is available on PyPI:\n\n```console\n$ python -m pip install requests\n```\n\nRequests officially supports Python 3.7+.\n\n## Supported Features & Best–Practices\n\nRequests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today.\n\n- Keep-Alive & Connection Pooling\n- International Domains and URLs\n- Sessions with Cookie Persistence\n- Browser-style TLS/SSL Verification\n- Basic & Digest Authentication\n- Familiar `dict`–like Cookies\n- Automatic Content Decompression and Decoding\n- Multi-part File Uploads\n- SOCKS Proxy Support\n- Connection Timeouts\n- Streaming Downloads\n- Automatic honoring of `.netrc`\n- Chunked HTTP Requests\n\n## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io)\n\n[![Read the Docs](https://raw.githubusercontent.com/psf/requests/main/ext/ss.png)](https://requests.readthedocs.io)\n\n## Cloning the repository\n\nWhen cloning the Requests repository, you may need to add the `-c\nfetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see\n[this issue](https://github.com/psf/requests/issues/2690) for more background):\n\n```shell\ngit clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git\n```\n\nYou can also apply this setting to your global Git config:\n\n```shell\ngit config --global fetch.fsck.badTimezone ignore\n```\n\n---\n\n[![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/main/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/main/ext/psf.png)](https://www.python.org/psf)\n\n\n" + } + }, + { + "download_info": { + "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", + "archive_info": { + "hash": "sha256=c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + } + }, + "is_direct": false, + "requested": false, + "metadata": { + "metadata_version": "2.1", + "name": "certifi", + "version": "2023.5.7", + "platform": [ + "UNKNOWN" + ], + "summary": "Python package for providing Mozilla's CA Bundle.", + "home_page": "https://github.com/certifi/python-certifi", + "author": "Kenneth Reitz", + "author_email": "me@kennethreitz.com", + "license": "MPL-2.0", + "classifier": [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", + "Natural Language :: English", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11" + ], + "requires_python": ">=3.6", + "project_url": [ + "Source, https://github.com/certifi/python-certifi" + ], + "description": "Certifi: Python SSL Certificates\n================================\n\nCertifi provides Mozilla's carefully curated collection of Root Certificates for\nvalidating the trustworthiness of SSL certificates while verifying the identity\nof TLS hosts. It has been extracted from the `Requests`_ project.\n\nInstallation\n------------\n\n``certifi`` is available on PyPI. Simply install it with ``pip``::\n\n $ pip install certifi\n\nUsage\n-----\n\nTo reference the installed certificate authority (CA) bundle, you can use the\nbuilt-in function::\n\n >>> import certifi\n\n >>> certifi.where()\n '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem'\n\nOr from the command line::\n\n $ python -m certifi\n /usr/local/lib/python3.7/site-packages/certifi/cacert.pem\n\nEnjoy!\n\n.. _`Requests`: https://requests.readthedocs.io/en/master/\n\nAddition/Removal of Certificates\n--------------------------------\n\nCertifi does not support any addition/removal or other modification of the\nCA trust store content. This project is intended to provide a reliable and\nhighly portable root of trust to python deployments. Look to upstream projects\nfor methods to use alternate trust.\n\n\n" + } + }, + { + "download_info": { + "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "archive_info": { + "hash": "sha256=21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706" + } + }, + "is_direct": false, + "requested": false, + "metadata": { + "metadata_version": "2.1", + "name": "charset-normalizer", + "version": "3.1.0", + "summary": "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.", + "description_content_type": "text/markdown", + "keywords": [ + "encoding", + "charset", + "charset-detector", + "detector", + "normalization", + "unicode", + "chardet", + "detect" + ], + "home_page": "https://github.com/Ousret/charset_normalizer", + "author": "Ahmed TAHRI", + "author_email": "ahmed.tahri@cloudnursery.dev", + "license": "MIT", + "classifier": [ + "Development Status :: 5 - Production/Stable", + "License :: OSI Approved :: MIT License", + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries :: Python Modules", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: Implementation :: PyPy", + "Topic :: Text Processing :: Linguistic", + "Topic :: Utilities", + "Typing :: Typed" + ], + "requires_python": ">=3.7.0", + "project_url": [ + "Bug Reports, https://github.com/Ousret/charset_normalizer/issues", + "Documentation, https://charset-normalizer.readthedocs.io/en/latest" + ], + "provides_extra": [ + "unicode_backport" + ], + "description": "

Charset Detection, for Everyone 👋

\n\n

\n The Real First Universal Charset Detector
\n \n \n \n \n \n \n \n \"Download\n \n

\n\n> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`,\n> I'm trying to resolve the issue by taking a new approach.\n> All IANA character set names for which the Python core library provides codecs are supported.\n\n

\n >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<<\n

\n\nThis project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**.\n\n| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) |\n|--------------------------------------------------|:---------------------------------------------:|:------------------------------------------------------------------------------------------------------:|:-----------------------------------------------:|\n| `Fast` | ❌
| ✅
| ✅
|\n| `Universal**` | ❌ | ✅ | ❌ |\n| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ |\n| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ |\n| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ |\n| `Native Python` | ✅ | ✅ | ❌ |\n| `Detect spoken language` | ❌ | ✅ | N/A |\n| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ |\n| `Whl Size` | 193.6 kB | 39.5 kB | ~200 kB |\n| `Supported Encoding` | 33 | :tada: [90](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 |\n\n

\n\"Reading\"Cat\n\n*\\*\\* : They are clearly using specific code for a specific encoding even if covering most of used one*
\nDid you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html)\n\n## ⭐ Your support\n\n*Fork, test-it, star-it, submit your ideas! We do listen.*\n \n## ⚡ Performance\n\nThis package offer better performance than its counterpart Chardet. Here are some numbers.\n\n| Package | Accuracy | Mean per file (ms) | File per sec (est) |\n|-----------------------------------------------|:--------:|:------------------:|:------------------:|\n| [chardet](https://github.com/chardet/chardet) | 86 % | 200 ms | 5 file/sec |\n| charset-normalizer | **98 %** | **10 ms** | 100 file/sec |\n\n| Package | 99th percentile | 95th percentile | 50th percentile |\n|-----------------------------------------------|:---------------:|:---------------:|:---------------:|\n| [chardet](https://github.com/chardet/chardet) | 1200 ms | 287 ms | 23 ms |\n| charset-normalizer | 100 ms | 50 ms | 5 ms |\n\nChardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload.\n\n> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows.\n> And yes, these results might change at any time. The dataset can be updated to include more files.\n> The actual delays heavily depends on your CPU capabilities. The factors should remain the same.\n> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability\n> (eg. Supported Encoding) Challenge-them if you want.\n\n## ✨ Installation\n\nUsing PyPi for latest stable\n```sh\npip install charset-normalizer -U\n```\n\n## 🚀 Basic Usage\n\n### CLI\nThis package comes with a CLI.\n\n```\nusage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD]\n file [file ...]\n\nThe Real First Universal Charset Detector. Discover originating encoding used\non text file. Normalize text to unicode.\n\npositional arguments:\n files File(s) to be analysed\n\noptional arguments:\n -h, --help show this help message and exit\n -v, --verbose Display complementary information about file if any.\n Stdout will contain logs about the detection process.\n -a, --with-alternative\n Output complementary possibilities if any. Top-level\n JSON WILL be a list.\n -n, --normalize Permit to normalize input file. If not set, program\n does not write anything.\n -m, --minimal Only output the charset detected to STDOUT. Disabling\n JSON output.\n -r, --replace Replace file when trying to normalize it instead of\n creating a new one.\n -f, --force Replace file without asking if you are sure, use this\n flag with caution.\n -t THRESHOLD, --threshold THRESHOLD\n Define a custom maximum amount of chaos allowed in\n decoded content. 0. <= chaos <= 1.\n --version Show version information and exit.\n```\n\n```bash\nnormalizer ./data/sample.1.fr.srt\n```\n\n:tada: Since version 1.4.0 the CLI produce easily usable stdout result in JSON format.\n\n```json\n{\n \"path\": \"/home/default/projects/charset_normalizer/data/sample.1.fr.srt\",\n \"encoding\": \"cp1252\",\n \"encoding_aliases\": [\n \"1252\",\n \"windows_1252\"\n ],\n \"alternative_encodings\": [\n \"cp1254\",\n \"cp1256\",\n \"cp1258\",\n \"iso8859_14\",\n \"iso8859_15\",\n \"iso8859_16\",\n \"iso8859_3\",\n \"iso8859_9\",\n \"latin_1\",\n \"mbcs\"\n ],\n \"language\": \"French\",\n \"alphabets\": [\n \"Basic Latin\",\n \"Latin-1 Supplement\"\n ],\n \"has_sig_or_bom\": false,\n \"chaos\": 0.149,\n \"coherence\": 97.152,\n \"unicode_path\": null,\n \"is_preferred\": true\n}\n```\n\n### Python\n*Just print out normalized text*\n```python\nfrom charset_normalizer import from_path\n\nresults = from_path('./my_subtitle.srt')\n\nprint(str(results.best()))\n```\n\n*Upgrade your code without effort*\n```python\nfrom charset_normalizer import detect\n```\n\nThe above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible.\n\nSee the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/)\n\n## 😇 Why\n\nWhen I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a\nreliable alternative using a completely different method. Also! I never back down on a good challenge!\n\nI **don't care** about the **originating charset** encoding, because **two different tables** can\nproduce **two identical rendered string.**\nWhat I want is to get readable text, the best I can. \n\nIn a way, **I'm brute forcing text decoding.** How cool is that ? 😎\n\nDon't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode.\n\n## 🍰 How\n\n - Discard all charset encoding table that could not fit the binary content.\n - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding.\n - Extract matches with the lowest mess detected.\n - Additionally, we measure coherence / probe for a language.\n\n**Wait a minute**, what is noise/mess and coherence according to **YOU ?**\n\n*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then\n**I established** some ground rules about **what is obvious** when **it seems like** a mess.\n I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to\n improve or rewrite it.\n\n*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought\nthat intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design.\n\n## ⚡ Known limitations\n\n - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters))\n - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content.\n\n## ⚠️ About Python EOLs\n\n**If you are running:**\n\n- Python >=2.7,<3.5: Unsupported\n- Python 3.5: charset-normalizer < 2.1\n- Python 3.6: charset-normalizer < 3.1\n\nUpgrade your Python interpreter as soon as possible.\n\n## 👤 Contributing\n\nContributions, issues and feature requests are very much welcome.
\nFeel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute.\n\n## 📝 License\n\nCopyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
\nThis project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed.\n\nCharacters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/)\n\n## 💼 For Enterprise\n\nProfessional support for charset-normalizer is available as part of the [Tidelift\nSubscription][1]. Tidelift gives software development teams a single source for\npurchasing and maintaining their software, with professional grade assurances\nfrom the experts who know it best, while seamlessly integrating with existing\ntools.\n\n[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme\n\n# Changelog\nAll notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).\n\n## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06)\n\n### Added\n- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262)\n\n### Removed\n- Support for Python 3.6 (PR #260)\n\n### Changed\n- Optional speedup provided by mypy/c 1.0.1\n\n## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18)\n\n### Fixed\n- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233)\n\n### Changed\n- Speedup provided by mypy/c 0.990 on Python >= 3.7\n\n## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20)\n\n### Added\n- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results\n- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES\n- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio\n- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)\n\n### Changed\n- Build with static metadata using 'build' frontend\n- Make the language detection stricter\n- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1\n\n### Fixed\n- CLI with opt --normalize fail when using full path for files\n- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it\n- Sphinx warnings when generating the documentation\n\n### Removed\n- Coherence detector no longer return 'Simple English' instead return 'English'\n- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'\n- Breaking: Method `first()` and `best()` from CharsetMatch\n- UTF-7 will no longer appear as \"detected\" without a recognized SIG/mark (is unreliable/conflict with ASCII)\n- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches\n- Breaking: Top-level function `normalize`\n- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch\n- Support for the backport `unicodedata2`\n\n## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18)\n\n### Added\n- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results\n- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES\n- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio\n\n### Changed\n- Build with static metadata using 'build' frontend\n- Make the language detection stricter\n\n### Fixed\n- CLI with opt --normalize fail when using full path for files\n- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it\n\n### Removed\n- Coherence detector no longer return 'Simple English' instead return 'English'\n- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'\n\n## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21)\n\n### Added\n- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)\n\n### Removed\n- Breaking: Method `first()` and `best()` from CharsetMatch\n- UTF-7 will no longer appear as \"detected\" without a recognized SIG/mark (is unreliable/conflict with ASCII)\n\n### Fixed\n- Sphinx warnings when generating the documentation\n\n## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15)\n\n### Changed\n- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1\n\n### Removed\n- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches\n- Breaking: Top-level function `normalize`\n- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch\n- Support for the backport `unicodedata2`\n\n## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19)\n\n### Deprecated\n- Function `normalize` scheduled for removal in 3.0\n\n### Changed\n- Removed useless call to decode in fn is_unprintable (#206)\n\n### Fixed\n- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204)\n\n## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19)\n\n### Added\n- Output the Unicode table version when running the CLI with `--version` (PR #194)\n\n### Changed\n- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175)\n- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183)\n\n### Fixed\n- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175)\n- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181)\n\n### Removed\n- Support for Python 3.5 (PR #192)\n\n### Deprecated\n- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194)\n\n## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12)\n\n### Fixed\n- ASCII miss-detection on rare cases (PR #170) \n\n## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30)\n\n### Added\n- Explicit support for Python 3.11 (PR #164)\n\n### Changed\n- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165)\n\n## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04)\n\n### Fixed\n- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154)\n\n### Changed\n- Skipping the language-detection (CD) on ASCII (PR #155)\n\n## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03)\n\n### Changed\n- Moderating the logging impact (since 2.0.8) for specific environments (PR #147)\n\n### Fixed\n- Wrong logging level applied when setting kwarg `explain` to True (PR #146)\n\n## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24)\n### Changed\n- Improvement over Vietnamese detection (PR #126)\n- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124)\n- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122)\n- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129)\n- Code style as refactored by Sourcery-AI (PR #131) \n- Minor adjustment on the MD around european words (PR #133)\n- Remove and replace SRTs from assets / tests (PR #139)\n- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135)\n- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135)\n\n### Fixed\n- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137)\n- Avoid using too insignificant chunk (PR #137)\n\n### Added\n- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135)\n- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141)\n\n## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11)\n### Added\n- Add support for Kazakh (Cyrillic) language detection (PR #109)\n\n### Changed\n- Further, improve inferring the language from a given single-byte code page (PR #112)\n- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116)\n- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113)\n- Various detection improvement (MD+CD) (PR #117)\n\n### Removed\n- Remove redundant logging entry about detected language(s) (PR #115)\n\n### Fixed\n- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102)\n\n## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18)\n### Fixed\n- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100)\n- Fix CLI crash when using --minimal output in certain cases (PR #103)\n\n### Changed\n- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101)\n\n## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14)\n### Changed\n- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81)\n- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82)\n- The Unicode detection is slightly improved (PR #93)\n- Add syntax sugar \\_\\_bool\\_\\_ for results CharsetMatches list-container (PR #91)\n\n### Removed\n- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92)\n\n### Fixed\n- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95)\n- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96)\n- The MANIFEST.in was not exhaustive (PR #78)\n\n## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30)\n### Fixed\n- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70)\n- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68)\n- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72)\n- Submatch factoring could be wrong in rare edge cases (PR #72)\n- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72)\n- Fix line endings from CRLF to LF for certain project files (PR #67)\n\n### Changed\n- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76)\n- Allow fallback on specified encoding if any (PR #71)\n\n## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16)\n### Changed\n- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63)\n- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64)\n\n## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15)\n### Fixed\n- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) \n\n### Changed\n- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57)\n\n## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13)\n### Fixed\n- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55)\n- Using explain=False permanently disable the verbose output in the current runtime (PR #47)\n- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47)\n- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52)\n\n### Changed\n- Public function normalize default args values were not aligned with from_bytes (PR #53)\n\n### Added\n- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47)\n\n## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02)\n### Changed\n- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet.\n- Accent has been made on UTF-8 detection, should perform rather instantaneous.\n- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible.\n- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time)\n- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+\n- utf_7 detection has been reinstated.\n\n### Removed\n- This package no longer require anything when used with Python 3.5 (Dropped cached_property)\n- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian.\n- The exception hook on UnicodeDecodeError has been removed.\n\n### Deprecated\n- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0\n\n### Fixed\n- The CLI output used the relative path of the file(s). Should be absolute.\n\n## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28)\n### Fixed\n- Logger configuration/usage no longer conflict with others (PR #44)\n\n## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21)\n### Removed\n- Using standard logging instead of using the package loguru.\n- Dropping nose test framework in favor of the maintained pytest.\n- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text.\n- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version.\n- Stop support for UTF-7 that does not contain a SIG.\n- Dropping PrettyTable, replaced with pure JSON output in CLI.\n\n### Fixed\n- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process.\n- Not searching properly for the BOM when trying utf32/16 parent codec.\n\n### Changed\n- Improving the package final size by compressing frequencies.json.\n- Huge improvement over the larges payload.\n\n### Added\n- CLI now produces JSON consumable output.\n- Return ASCII if given sequences fit. Given reasonable confidence.\n\n## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13)\n\n### Fixed\n- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40)\n\n## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12)\n\n### Fixed\n- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39)\n\n## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12)\n\n### Fixed\n- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38)\n\n## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09)\n\n### Changed\n- Amend the previous release to allow prettytable 2.0 (PR #35)\n\n## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08)\n\n### Fixed\n- Fix error while using the package with a python pre-release interpreter (PR #33)\n\n### Changed\n- Dependencies refactoring, constraints revised.\n\n### Added\n- Add python 3.9 and 3.10 to the supported interpreters\n\nMIT License\n\nCopyright (c) 2019 TAHRI Ahmed R.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" + } + }, + { + "download_info": { + "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", + "archive_info": { + "hash": "sha256=90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + } + }, + "is_direct": false, + "requested": false, + "metadata": { + "metadata_version": "2.1", + "name": "idna", + "version": "3.4", + "summary": "Internationalized Domain Names in Applications (IDNA)", + "description_content_type": "text/x-rst", + "author_email": "Kim Davies ", + "classifier": [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Intended Audience :: System Administrators", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", + "Topic :: Internet :: Name Service (DNS)", + "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: Utilities" + ], + "requires_python": ">=3.5", + "project_url": [ + "Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst", + "Issue tracker, https://github.com/kjd/idna/issues", + "Source, https://github.com/kjd/idna" + ], + "description": "Internationalized Domain Names in Applications (IDNA)\n=====================================================\n\nSupport for the Internationalized Domain Names in\nApplications (IDNA) protocol as specified in `RFC 5891\n`_. This is the latest version of\nthe protocol and is sometimes referred to as “IDNA 2008”.\n\nThis library also provides support for Unicode Technical\nStandard 46, `Unicode IDNA Compatibility Processing\n`_.\n\nThis acts as a suitable replacement for the “encodings.idna”\nmodule that comes with the Python standard library, but which\nonly supports the older superseded IDNA specification (`RFC 3490\n`_).\n\nBasic functions are simply executed:\n\n.. code-block:: pycon\n\n >>> import idna\n >>> idna.encode('ドメイン.テスト')\n b'xn--eckwd4c7c.xn--zckzah'\n >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))\n ドメイン.テスト\n\n\nInstallation\n------------\n\nThis package is available for installation from PyPI:\n\n.. code-block:: bash\n\n $ python3 -m pip install idna\n\n\nUsage\n-----\n\nFor typical usage, the ``encode`` and ``decode`` functions will take a\ndomain name argument and perform a conversion to A-labels or U-labels\nrespectively.\n\n.. code-block:: pycon\n\n >>> import idna\n >>> idna.encode('ドメイン.テスト')\n b'xn--eckwd4c7c.xn--zckzah'\n >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))\n ドメイン.テスト\n\nYou may use the codec encoding and decoding methods using the\n``idna.codec`` module:\n\n.. code-block:: pycon\n\n >>> import idna.codec\n >>> print('домен.испытание'.encode('idna'))\n b'xn--d1acufc.xn--80akhbyknj4f'\n >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna'))\n домен.испытание\n\nConversions can be applied at a per-label basis using the ``ulabel`` or\n``alabel`` functions if necessary:\n\n.. code-block:: pycon\n\n >>> idna.alabel('测试')\n b'xn--0zwm56d'\n\nCompatibility Mapping (UTS #46)\n+++++++++++++++++++++++++++++++\n\nAs described in `RFC 5895 `_, the\nIDNA specification does not normalize input from different potential\nways a user may input a domain name. This functionality, known as\na “mapping”, is considered by the specification to be a local\nuser-interface issue distinct from IDNA conversion functionality.\n\nThis library provides one such mapping, that was developed by the\nUnicode Consortium. Known as `Unicode IDNA Compatibility Processing\n`_, it provides for both a regular\nmapping for typical applications, as well as a transitional mapping to\nhelp migrate from older IDNA 2003 applications.\n\nFor example, “Königsgäßchen” is not a permissible label as *LATIN\nCAPITAL LETTER K* is not allowed (nor are capital letters in general).\nUTS 46 will convert this into lower case prior to applying the IDNA\nconversion.\n\n.. code-block:: pycon\n\n >>> import idna\n >>> idna.encode('Königsgäßchen')\n ...\n idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed\n >>> idna.encode('Königsgäßchen', uts46=True)\n b'xn--knigsgchen-b4a3dun'\n >>> print(idna.decode('xn--knigsgchen-b4a3dun'))\n königsgäßchen\n\nTransitional processing provides conversions to help transition from\nthe older 2003 standard to the current standard. For example, in the\noriginal IDNA specification, the *LATIN SMALL LETTER SHARP S* (ß) was\nconverted into two *LATIN SMALL LETTER S* (ss), whereas in the current\nIDNA specification this conversion is not performed.\n\n.. code-block:: pycon\n\n >>> idna.encode('Königsgäßchen', uts46=True, transitional=True)\n 'xn--knigsgsschen-lcb0w'\n\nImplementors should use transitional processing with caution, only in\nrare cases where conversion from legacy labels to current labels must be\nperformed (i.e. IDNA implementations that pre-date 2008). For typical\napplications that just need to convert labels, transitional processing\nis unlikely to be beneficial and could produce unexpected incompatible\nresults.\n\n``encodings.idna`` Compatibility\n++++++++++++++++++++++++++++++++\n\nFunction calls from the Python built-in ``encodings.idna`` module are\nmapped to their IDNA 2008 equivalents using the ``idna.compat`` module.\nSimply substitute the ``import`` clause in your code to refer to the new\nmodule name.\n\nExceptions\n----------\n\nAll errors raised during the conversion following the specification\nshould raise an exception derived from the ``idna.IDNAError`` base\nclass.\n\nMore specific exceptions that may be generated as ``idna.IDNABidiError``\nwhen the error reflects an illegal combination of left-to-right and\nright-to-left characters in a label; ``idna.InvalidCodepoint`` when\na specific codepoint is an illegal character in an IDN label (i.e.\nINVALID); and ``idna.InvalidCodepointContext`` when the codepoint is\nillegal based on its positional context (i.e. it is CONTEXTO or CONTEXTJ\nbut the contextual requirements are not satisfied.)\n\nBuilding and Diagnostics\n------------------------\n\nThe IDNA and UTS 46 functionality relies upon pre-calculated lookup\ntables for performance. These tables are derived from computing against\neligibility criteria in the respective standards. These tables are\ncomputed using the command-line script ``tools/idna-data``.\n\nThis tool will fetch relevant codepoint data from the Unicode repository\nand perform the required calculations to identify eligibility. There are\nthree main modes:\n\n* ``idna-data make-libdata``. Generates ``idnadata.py`` and\n ``uts46data.py``, the pre-calculated lookup tables using for IDNA and\n UTS 46 conversions. Implementors who wish to track this library against\n a different Unicode version may use this tool to manually generate a\n different version of the ``idnadata.py`` and ``uts46data.py`` files.\n\n* ``idna-data make-table``. Generate a table of the IDNA disposition\n (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix\n B.1 of RFC 5892 and the pre-computed tables published by `IANA\n `_.\n\n* ``idna-data U+0061``. Prints debugging output on the various\n properties associated with an individual Unicode codepoint (in this\n case, U+0061), that are used to assess the IDNA and UTS 46 status of a\n codepoint. This is helpful in debugging or analysis.\n\nThe tool accepts a number of arguments, described using ``idna-data\n-h``. Most notably, the ``--version`` argument allows the specification\nof the version of Unicode to use in computing the table data. For\nexample, ``idna-data --version 9.0.0 make-libdata`` will generate\nlibrary data against Unicode 9.0.0.\n\n\nAdditional Notes\n----------------\n\n* **Packages**. The latest tagged release version is published in the\n `Python Package Index `_.\n\n* **Version support**. This library supports Python 3.5 and higher.\n As this library serves as a low-level toolkit for a variety of\n applications, many of which strive for broad compatibility with older\n Python versions, there is no rush to remove older intepreter support.\n Removing support for older versions should be well justified in that the\n maintenance burden has become too high.\n\n* **Python 2**. Python 2 is supported by version 2.x of this library.\n While active development of the version 2.x series has ended, notable\n issues being corrected may be backported to 2.x. Use \"idna<3\" in your\n requirements file if you need this library for a Python 2 application.\n\n* **Testing**. The library has a test suite based on each rule of the\n IDNA specification, as well as tests that are provided as part of the\n Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing\n `_.\n\n* **Emoji**. It is an occasional request to support emoji domains in\n this library. Encoding of symbols like emoji is expressly prohibited by\n the technical standard IDNA 2008 and emoji domains are broadly phased\n out across the domain industry due to associated security risks. For\n now, applications that wish need to support these non-compliant labels\n may wish to consider trying the encode/decode operation in this library\n first, and then falling back to using `encodings.idna`. See `the Github\n project `_ for more discussion.\n\n" + } + }, + { + "download_info": { + "url": "https://files.pythonhosted.org/packages/8a/03/ad9306a50d05c166e3456fe810f33cee2b8b2a7a6818ec5d4908c4ec6b36/urllib3-2.0.3-py3-none-any.whl", + "archive_info": { + "hash": "sha256=48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1" + } + }, + "is_direct": false, + "requested": false, + "metadata": { + "metadata_version": "2.1", + "name": "urllib3", + "version": "2.0.3", + "summary": "HTTP library with thread-safe connection pooling, file post, and more.", + "description_content_type": "text/markdown", + "keywords": [ + "filepost", + "http", + "httplib", + "https", + "pooling", + "ssl", + "threadsafe", + "urllib" + ], + "author_email": "Andrey Petrov ", + "maintainer_email": "Seth Michael Larson , Quentin Pradet ", + "classifier": [ + "Environment :: Web Environment", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Software Development :: Libraries" + ], + "requires_dist": [ + "brotli>=1.0.9; platform_python_implementation == 'CPython' and extra == 'brotli'", + "brotlicffi>=0.8.0; platform_python_implementation != 'CPython' and extra == 'brotli'", + "certifi; extra == 'secure'", + "cryptography>=1.9; extra == 'secure'", + "idna>=2.0.0; extra == 'secure'", + "pyopenssl>=17.1.0; extra == 'secure'", + "urllib3-secure-extra; extra == 'secure'", + "pysocks!=1.5.7,<2.0,>=1.5.6; extra == 'socks'", + "zstandard>=0.18.0; extra == 'zstd'" + ], + "requires_python": ">=3.7", + "project_url": [ + "Changelog, https://github.com/urllib3/urllib3/blob/main/CHANGES.rst", + "Documentation, https://urllib3.readthedocs.io", + "Code, https://github.com/urllib3/urllib3", + "Issue tracker, https://github.com/urllib3/urllib3/issues" + ], + "provides_extra": [ + "brotli", + "secure", + "socks", + "zstd" + ], + "description": "

\n\n![urllib3](https://github.com/urllib3/urllib3/raw/main/docs/_static/banner_github.svg)\n\n

\n\n

\n \"PyPI\n \"Python\n \"Join\n \"Coverage\n \"Build\n \"Documentation
\n \"OpenSSF\n \"SLSA\n \"CII\n

\n\nurllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the\nPython ecosystem already uses urllib3 and you should too.\nurllib3 brings many critical features that are missing from the Python\nstandard libraries:\n\n- Thread safety.\n- Connection pooling.\n- Client-side SSL/TLS verification.\n- File uploads with multipart encoding.\n- Helpers for retrying requests and dealing with HTTP redirects.\n- Support for gzip, deflate, brotli, and zstd encoding.\n- Proxy support for HTTP and SOCKS.\n- 100% test coverage.\n\nurllib3 is powerful and easy to use:\n\n```python3\n>>> import urllib3\n>>> resp = urllib3.request(\"GET\", \"http://httpbin.org/robots.txt\")\n>>> resp.status\n200\n>>> resp.data\nb\"User-agent: *\\nDisallow: /deny\\n\"\n```\n\n## Installing\n\nurllib3 can be installed with [pip](https://pip.pypa.io):\n\n```bash\n$ python -m pip install urllib3\n```\n\nAlternatively, you can grab the latest source code from [GitHub](https://github.com/urllib3/urllib3):\n\n```bash\n$ git clone https://github.com/urllib3/urllib3.git\n$ cd urllib3\n$ pip install .\n```\n\n\n## Documentation\n\nurllib3 has usage and reference documentation at [urllib3.readthedocs.io](https://urllib3.readthedocs.io).\n\n\n## Community\n\nurllib3 has a [community Discord channel](https://discord.gg/urllib3) for asking questions and\ncollaborating with other contributors. Drop by and say hello 👋\n\n\n## Contributing\n\nurllib3 happily accepts contributions. Please see our\n[contributing documentation](https://urllib3.readthedocs.io/en/latest/contributing.html)\nfor some tips on getting started.\n\n\n## Security Disclosures\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure with maintainers.\n\n\n## Maintainers\n\n- [@sethmlarson](https://github.com/sethmlarson) (Seth M. Larson)\n- [@pquentin](https://github.com/pquentin) (Quentin Pradet)\n- [@theacodes](https://github.com/theacodes) (Thea Flowers)\n- [@haikuginger](https://github.com/haikuginger) (Jess Shapiro)\n- [@lukasa](https://github.com/lukasa) (Cory Benfield)\n- [@sigmavirus24](https://github.com/sigmavirus24) (Ian Stapleton Cordasco)\n- [@shazow](https://github.com/shazow) (Andrey Petrov)\n\n👋\n\n\n## Sponsorship\n\nIf your company benefits from this library, please consider [sponsoring its\ndevelopment](https://urllib3.readthedocs.io/en/latest/sponsors.html).\n\n\n## For Enterprise\n\nProfessional support for urllib3 is available as part of the [Tidelift\nSubscription][1]. Tidelift gives software development teams a single source for\npurchasing and maintaining their software, with professional grade assurances\nfrom the experts who know it best, while seamlessly integrating with existing\ntools.\n\n[1]: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme\n" + } + } + ], + "environment": { + "implementation_name": "cpython", + "implementation_version": "3.9.16", + "os_name": "posix", + "platform_machine": "x86_64", + "platform_release": "5.10.0-21-amd64", + "platform_system": "Linux", + "platform_version": "#1 SMP Debian 5.10.162-1 (2023-01-21)", + "python_full_version": "3.9.16", + "platform_python_implementation": "CPython", + "python_version": "3.9", + "sys_platform": "linux" + } +} \ No newline at end of file diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index a68d56f01f..78ca9b7ce4 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -21,6 +21,7 @@ from pathlib import Path import pip +import pip._internal.cli.main import piptools.writer as piptools_writer from piptools.scripts.compile import cli @@ -79,6 +80,22 @@ def _locate(bazel_runfiles, file): return bazel_runfiles.Rlocation(file) +def run_pip(requirements_in, requirements_txt, pip_installation_report): + sys.argv = [ + "pip", + "install", + "--ignore-installed", + "--dry-run", + "--quiet", + "--report", + pip_installation_report, + "--requirement", + requirements_in, + ] + + return pip._internal.cli.main.main() + + if __name__ == "__main__": if len(sys.argv) < 4: print( @@ -153,6 +170,13 @@ def _locate(bazel_runfiles, file): os.environ["CUSTOM_COMPILE_COMMAND"] = update_command os.environ["PIP_CONFIG_FILE"] = os.getenv("PIP_CONFIG_FILE") or os.devnull + if pip_installation_report: + sys.exit(run_pip(requirements_in_relative + if Path(requirements_in_relative).exists() + else resolved_requirements_in, + requirements_txt_relative, + pip_installation_report_relative)) + sys.argv.append("--generate-hashes") sys.argv.append("--output-file") sys.argv.append(requirements_txt_relative if UPDATE else requirements_out) From 5bb472f90320bf52f88c0733292c2bab54251bf1 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Tue, 13 Jun 2023 18:18:40 -0700 Subject: [PATCH 03/96] skeleton pypi_install --- examples/pypi_install/WORKSPACE | 18 +++++++++--------- python/pypi.bzl | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 python/pypi.bzl diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index d6cf4ccd73..33d8f660f2 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -19,15 +19,15 @@ python_register_toolchains( ) load("@python39//:defs.bzl", "interpreter") -#load("@rules_python//python:pip.bzl", "pypi_install") -# -#pypi_install( -# name = "pypi_install", -# pip_installation_report = { -# "@//:x86_64_linux": "//:pip_install_report_x86_64_linux.json", -# }, -#) -# +load("@rules_python//python:pypi.bzl", "pypi_install") + +pypi_install( + name = "pypi_install", + pip_installation_report = { + "@//:x86_64_linux": "//:pip_install_report_x86_64_linux.json", + }, +) + #load("@pypi_install//:packages.bzl", "load_pypi_packages") # #load_pypi_packages( diff --git a/python/pypi.bzl b/python/pypi.bzl new file mode 100644 index 0000000000..ccfaefb382 --- /dev/null +++ b/python/pypi.bzl @@ -0,0 +1,20 @@ +load("//python/pip_install:repositories.bzl", "pip_install_dependencies") + +def pypi_install(pip_installation_report = None, **kwargs): + pip_installation_report_swapped = {} + for config_setting, report in pip_installation_report.items(): + pip_installation_report_swapped[report] = config_setting + _pypi_install(pip_installation_report = pip_installation_report_swapped, **kwargs) + +def _pypi_install_impl(repository_ctx): + repository_ctx.file("BUILD.bazel", """\ +""", executable = False) + +_pypi_install = repository_rule( + implementation = _pypi_install_impl, + attrs = { + "pip_installation_report": attr.label_keyed_string_dict( + allow_files = True, + ), + }, +) From f5b53dd806676b952617ca1e59c4f3753b6f98c0 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Tue, 13 Jun 2023 18:39:47 -0700 Subject: [PATCH 04/96] Generate crude intermediate format --- python/private/intermediate_pypi_install.bzl | 17 +++++++++++++++++ python/pypi.bzl | 6 ++++++ 2 files changed, 23 insertions(+) create mode 100644 python/private/intermediate_pypi_install.bzl diff --git a/python/private/intermediate_pypi_install.bzl b/python/private/intermediate_pypi_install.bzl new file mode 100644 index 0000000000..98e8c22606 --- /dev/null +++ b/python/private/intermediate_pypi_install.bzl @@ -0,0 +1,17 @@ +def convert_installation_reports_to_intermediate(repository_ctx, installation_reports): + result = {} + + for report_label, config_setting in installation_reports.items(): + report = json.decode(repository_ctx.read(report_label)) + for install in report["install"]: + download_info = install["download_info"] + metadata = install["metadata"] + name = metadata["name"] + + info = result.setdefault(name, {}).setdefault(config_setting, {}) + info["url"] = download_info["url"] + hash = download_info["archive_info"].get("hash", "") + if hash and hash.startswith("sha256="): + info["sha256"] = hash.split("=", 1)[1] + + return result diff --git a/python/pypi.bzl b/python/pypi.bzl index ccfaefb382..c52fcfa763 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -1,4 +1,5 @@ load("//python/pip_install:repositories.bzl", "pip_install_dependencies") +load("//python/private:intermediate_pypi_install.bzl", "convert_installation_reports_to_intermediate") def pypi_install(pip_installation_report = None, **kwargs): pip_installation_report_swapped = {} @@ -9,6 +10,11 @@ def pypi_install(pip_installation_report = None, **kwargs): def _pypi_install_impl(repository_ctx): repository_ctx.file("BUILD.bazel", """\ """, executable = False) + if repository_ctx.attr.pip_installation_report: + result = convert_installation_reports_to_intermediate(repository_ctx, repository_ctx.attr.pip_installation_report) + else: + result = {} + repository_ctx.file("intermediate.json", json.encode_indent(result), executable=False) _pypi_install = repository_rule( implementation = _pypi_install_impl, From e1026c9e47df55a723033168dbaf1eb70060fe7b Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Tue, 13 Jun 2023 22:49:00 -0700 Subject: [PATCH 05/96] Generate http_file calls for all files --- examples/pypi_install/WORKSPACE | 10 ++--- python/private/intermediate_pypi_install.bzl | 18 ++++++-- python/pypi.bzl | 47 ++++++++++++++++++-- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index 33d8f660f2..3395b51184 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -28,8 +28,8 @@ pypi_install( }, ) -#load("@pypi_install//:packages.bzl", "load_pypi_packages") -# -#load_pypi_packages( -# name = "pypi", -#) +load("@pypi_install//:packages.bzl", "load_pypi_packages") + +load_pypi_packages( + name = "pypi", +) diff --git a/python/private/intermediate_pypi_install.bzl b/python/private/intermediate_pypi_install.bzl index 98e8c22606..dfc23786c5 100644 --- a/python/private/intermediate_pypi_install.bzl +++ b/python/private/intermediate_pypi_install.bzl @@ -1,5 +1,5 @@ def convert_installation_reports_to_intermediate(repository_ctx, installation_reports): - result = {} + intermediate = {} for report_label, config_setting in installation_reports.items(): report = json.decode(repository_ctx.read(report_label)) @@ -8,10 +8,22 @@ def convert_installation_reports_to_intermediate(repository_ctx, installation_re metadata = install["metadata"] name = metadata["name"] - info = result.setdefault(name, {}).setdefault(config_setting, {}) + info = intermediate.setdefault(name, {}).setdefault(config_setting, {}) info["url"] = download_info["url"] hash = download_info["archive_info"].get("hash", "") if hash and hash.startswith("sha256="): info["sha256"] = hash.split("=", 1)[1] + else: + fail("unknown integrity check: " + str(download_info["archive_info"])) + + return intermediate + +def generate_pypi_package_load(repository_ctx): + lines = [ + """load("@rules_python//python:pypi.bzl", _load_pypi_packages_internal="load_pypi_packages_internal")""", + """load("@{}//:intermediate.bzl", "INTERMEDIATE")""".format(repository_ctx.name), + """def load_pypi_packages(**kwargs):""", + """ _load_pypi_packages_internal(INTERMEDIATE, **kwargs)""", + ] + repository_ctx.file("packages.bzl", "\n".join(lines), executable=False) - return result diff --git a/python/pypi.bzl b/python/pypi.bzl index c52fcfa763..57fa916ba5 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -1,5 +1,7 @@ load("//python/pip_install:repositories.bzl", "pip_install_dependencies") -load("//python/private:intermediate_pypi_install.bzl", "convert_installation_reports_to_intermediate") +load("//python/private:intermediate_pypi_install.bzl", "convert_installation_reports_to_intermediate", "generate_pypi_package_load") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") +load("@bazel_skylib//lib:paths.bzl", "paths") def pypi_install(pip_installation_report = None, **kwargs): pip_installation_report_swapped = {} @@ -11,10 +13,18 @@ def _pypi_install_impl(repository_ctx): repository_ctx.file("BUILD.bazel", """\ """, executable = False) if repository_ctx.attr.pip_installation_report: - result = convert_installation_reports_to_intermediate(repository_ctx, repository_ctx.attr.pip_installation_report) + intermediate = convert_installation_reports_to_intermediate( + repository_ctx, + repository_ctx.attr.pip_installation_report) else: - result = {} - repository_ctx.file("intermediate.json", json.encode_indent(result), executable=False) + intermediate = {} + + repository_ctx.file( + "intermediate.bzl", + "INTERMEDIATE = {}\n".format(json.encode_indent(intermediate)), + executable=False) + + generate_pypi_package_load(repository_ctx) _pypi_install = repository_rule( implementation = _pypi_install_impl, @@ -24,3 +34,32 @@ _pypi_install = repository_rule( ), }, ) + +def load_pypi_packages_internal(intermediate, name, **kwargs): + # Only download a wheel/tarball once. We do this by tracking which SHA sums + # we've downloaded already. + sha_indexed_infos = {} + + for package, configs in intermediate.items(): + for config, info in configs.items(): + if info["sha256"] not in sha_indexed_infos: + _generate_http_file(package, info) + # TODO(phil): What do we need to track here? Can we switch to a + # set()? + sha_indexed_infos[info["sha256"]] = True + + +def _generate_repo_name_for_download(package, info): + # TODO(phil): Can we make it more human readable by avoiding the checksum? + return "pypi_extracted_download_{}_{}".format(package, info["sha256"]) + + +def _generate_http_file(package, info): + http_file( + name = _generate_repo_name_for_download(package, info), + urls = [ + info["url"], + ], + sha256 = info["sha256"], + downloaded_file_path = paths.basename(info["url"]), + ) From b6a7f0c22c3dc561a05ea1e5d6bebb2dc147897c Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 2 Jul 2023 20:38:42 -0700 Subject: [PATCH 06/96] Generate an intermediate representation --- python/private/BUILD.bazel | 8 ++ python/private/intermediate_pypi_install.py | 28 +++++ python/private/wheel_installer.py | 98 ++++++++++++++++ python/private/wheel_library.bzl | 120 ++++++++++++++++++++ python/pypi.bzl | 2 + 5 files changed, 256 insertions(+) create mode 100644 python/private/intermediate_pypi_install.py create mode 100644 python/private/wheel_installer.py create mode 100644 python/private/wheel_library.bzl diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index f454f42cf3..022a1ba24c 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -81,3 +81,11 @@ exports_files( stamp_build_setting(name = "stamp") print_toolchains_checksums(name = "print_toolchains_checksums") + +py_binary( + name = "wheel_installer", + srcs = ["wheel_installer.py"], + deps = [ + "@pypi__installer//:lib", + ], +) diff --git a/python/private/intermediate_pypi_install.py b/python/private/intermediate_pypi_install.py new file mode 100644 index 0000000000..78cd5bf0ee --- /dev/null +++ b/python/private/intermediate_pypi_install.py @@ -0,0 +1,28 @@ +import argparse +import json +import sys +from pathlib import Path + +from packaging.requirements import Requirement + +def main(argv): + parser = argparse.ArgumentParser() + parser.add_argument("--installation_report", + required=True, + type=Path) + args = parser.parse_args(argv[1:]) + + with args.installation_report.open() as file: + report = json.load(file) + + for install in report["install"]: + download_info = install["download_info"] + metadata = install["metadata"] + name = metadata["name"] + requires_dist = metdata.get("requires_dist", []) + + for raw_requirement in requires_dist: + requirement = Requirement(raw_requirement) + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/python/private/wheel_installer.py b/python/private/wheel_installer.py new file mode 100644 index 0000000000..4092e0a605 --- /dev/null +++ b/python/private/wheel_installer.py @@ -0,0 +1,98 @@ +""" +A tool that invokes pypa/build to build the given sdist tarball. + +Copied from https://github.com/jvolkman/rules_pycross/blob/main/pycross/private/tools/wheel_installer.py +at commit 91e10c1f62926e8e9821897e252e359f797ff989. +""" + +import argparse +import os +import shutil +import tempfile +from pathlib import Path +from typing import Any + +from installer import install +from installer.destinations import SchemeDictionaryDestination +from installer.sources import WheelFile + + +def main(args: Any) -> None: + dest_dir = args.directory + lib_dir = dest_dir / "site-packages" + destination = SchemeDictionaryDestination( + scheme_dict={ + "platlib": str(lib_dir), + "purelib": str(lib_dir), + "headers": str(dest_dir / "include"), + "scripts": str(dest_dir / "bin"), + "data": str(dest_dir / "data"), + }, + interpreter="/usr/bin/env python3", # Generic; it's not feasible to run these scripts directly. + script_kind="posix", + bytecode_optimization_levels=[0, 1], + ) + + link_dir = Path(tempfile.mkdtemp()) + if args.wheel_name_file: + with open(args.wheel_name_file, "r") as f: + wheel_name = f.read().strip() + else: + wheel_name = os.path.basename(args.wheel) + + link_path = link_dir / wheel_name + os.symlink(os.path.join(os.getcwd(), args.wheel), link_path) + + try: + with WheelFile.open(link_path) as source: + install( + source=source, + destination=destination, + # Additional metadata that is generated by the installation tool. + additional_metadata={ + "INSTALLER": b"https://github.com/jvolkman/rules_pycross", + }, + ) + finally: + shutil.rmtree(link_dir, ignore_errors=True) + + +def parse_flags(argv) -> Any: + parser = argparse.ArgumentParser(description="Extract a Python wheel.") + + parser.add_argument( + "--wheel", + type=Path, + required=True, + help="The wheel file path.", + ) + + parser.add_argument( + "--wheel-name-file", + type=Path, + required=False, + help="A file containing the canonical name of the wheel.", + ) + + parser.add_argument( + "--enable-implicit-namespace-pkgs", + action="store_true", + help="If true, disables conversion of implicit namespace packages and will unzip as-is.", + ) + + parser.add_argument( + "--directory", + type=Path, + help="The output path.", + ) + + return parser.parse_args(argv[1:]) + + +if __name__ == "__main__": + # When under `bazel run`, change to the actual working dir. + if "BUILD_WORKING_DIRECTORY" in os.environ: + os.chdir(os.environ["BUILD_WORKING_DIRECTORY"]) + + args = parse_flags(sys.argv) + main(args) diff --git a/python/private/wheel_library.bzl b/python/private/wheel_library.bzl new file mode 100644 index 0000000000..013cc0640c --- /dev/null +++ b/python/private/wheel_library.bzl @@ -0,0 +1,120 @@ +"""Implementation of the pycross_wheel_library rule. + +Copied from https://github.com/jvolkman/rules_pycross/blob/main/pycross/private/wheel_library.bzl +at commit 91e10c1f62926e8e9821897e252e359f797ff989. +""" + +load("@bazel_skylib//lib:paths.bzl", "paths") +load("//python:defs.bzl", "PyInfo") + +def _pycross_wheel_library_impl(ctx): + out = ctx.actions.declare_directory(ctx.attr.name) + + wheel_file = ctx.file.wheel + name_file = None + + args = ctx.actions.args().use_param_file("--flagfile=%s") + args.add("--wheel", wheel_file) + args.add("--directory", out.path) + + inputs = [wheel_file] + if name_file: + inputs.append(name_file) + args.add("--wheel-name-file", name_file) + + if ctx.attr.enable_implicit_namespace_pkgs: + args.add("--enable-implicit-namespace-pkgs") + + ctx.actions.run( + inputs = inputs, + outputs = [out], + executable = ctx.executable._tool, + arguments = [args], + # Set environment variables to make generated .pyc files reproducible. + env = { + "SOURCE_DATE_EPOCH": "315532800", + "PYTHONHASHSEED": "0", + }, + mnemonic = "WheelInstall", + progress_message = "Installing %s" % ctx.file.wheel.basename, + ) + + has_py2_only_sources = ctx.attr.python_version == "PY2" + has_py3_only_sources = ctx.attr.python_version == "PY3" + if not has_py2_only_sources: + for d in ctx.attr.deps: + if d[PyInfo].has_py2_only_sources: + has_py2_only_sources = True + break + if not has_py3_only_sources: + for d in ctx.attr.deps: + if d[PyInfo].has_py3_only_sources: + has_py3_only_sources = True + break + + # TODO: Is there a more correct way to get this runfiles-relative import path? + imp = paths.join( + ctx.label.workspace_name or ctx.workspace_name, # Default to the local workspace. + ctx.label.package, + ctx.label.name, + "site-packages", # we put lib files in this subdirectory. + ) + + imports = depset( + direct = [imp], + transitive = [d[PyInfo].imports for d in ctx.attr.deps], + ) + transitive_sources = depset( + direct = [out], + transitive = [dep[PyInfo].transitive_sources for dep in ctx.attr.deps if PyInfo in dep], + ) + runfiles = ctx.runfiles(files = [out]) + for d in ctx.attr.deps: + runfiles = runfiles.merge(d[DefaultInfo].default_runfiles) + + return [ + DefaultInfo( + files = depset(direct = [out]), + runfiles = runfiles, + ), + PyInfo( + has_py2_only_sources = has_py2_only_sources, + has_py3_only_sources = has_py3_only_sources, + imports = imports, + transitive_sources = transitive_sources, + uses_shared_libraries = True, # Docs say this is unused + ), + ] + +pycross_wheel_library = rule( + implementation = _pycross_wheel_library_impl, + attrs = { + "deps": attr.label_list( + doc = "A list of this wheel's Python library dependencies.", + providers = [DefaultInfo, PyInfo], + ), + "wheel": attr.label( + doc = "The wheel file.", + allow_single_file = [".whl"], + mandatory = True, + ), + "enable_implicit_namespace_pkgs": attr.bool( + default = True, + doc = """ +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. +This option is required to support some packages which cannot handle the conversion to pkg-util style. + """, + ), + "python_version": attr.string( + doc = "The python version required for this wheel ('PY2' or 'PY3')", + values = ["PY2", "PY3", ""] + ), + "_tool": attr.label( + default = Label("//python/private:wheel_installer"), + cfg = "exec", + executable = True, + ), + } +) diff --git a/python/pypi.bzl b/python/pypi.bzl index 57fa916ba5..f626f969df 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -4,6 +4,8 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") load("@bazel_skylib//lib:paths.bzl", "paths") def pypi_install(pip_installation_report = None, **kwargs): + pip_install_dependencies() + pip_installation_report_swapped = {} for config_setting, report in pip_installation_report.items(): pip_installation_report_swapped[report] = config_setting From f9a9fa216c2526c3c775ed3d6539f32280dea6a9 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 2 Jul 2023 21:32:57 -0700 Subject: [PATCH 07/96] Parse the report in user space --- examples/pypi_install/BUILD.bazel | 8 +- examples/pypi_install/WORKSPACE | 24 +- .../intermediate_file_x86_64_linux.json | 32 ++ .../pip_install_report_x86_64_linux.json | 303 ------------------ ...txt => requirements_lock_x86_64_linux.txt} | 0 python/pip_install/requirements.bzl | 35 +- .../dependency_resolver.py | 100 ++++-- 7 files changed, 145 insertions(+), 357 deletions(-) create mode 100644 examples/pypi_install/intermediate_file_x86_64_linux.json delete mode 100644 examples/pypi_install/pip_install_report_x86_64_linux.json rename examples/pypi_install/{requirements_lock.txt => requirements_lock_x86_64_linux.txt} (100%) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index c37bc22996..db8b414c50 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -26,9 +26,11 @@ compile_pip_requirements( name = "requirements", extra_args = ["--allow-unsafe"], requirements_in = "requirements.in", - requirements_txt = "requirements_lock.txt", - pip_installation_report = { - ":x86_64_linux": "pip_install_report_x86_64_linux.json", + requirements_txt = { + ":x86_64_linux": "requirements_lock_x86_64_linux.txt", + }, + intermediate_file = { + ":x86_64_linux": "intermediate_file_x86_64_linux.json", }, ) diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index 3395b51184..f832db7799 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -21,15 +21,15 @@ python_register_toolchains( load("@python39//:defs.bzl", "interpreter") load("@rules_python//python:pypi.bzl", "pypi_install") -pypi_install( - name = "pypi_install", - pip_installation_report = { - "@//:x86_64_linux": "//:pip_install_report_x86_64_linux.json", - }, -) - -load("@pypi_install//:packages.bzl", "load_pypi_packages") - -load_pypi_packages( - name = "pypi", -) +#pypi_install( +# name = "pypi_install", +# pip_installation_report = { +# "@//:x86_64_linux": "//:intermediate_file_x86_64_linux.json", +# }, +#) +# +#load("@pypi_install//:packages.bzl", "load_pypi_packages") +# +#load_pypi_packages( +# name = "pypi", +#) diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json new file mode 100644 index 0000000000..d7425d610e --- /dev/null +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -0,0 +1,32 @@ +{ + "certifi": { + ":x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", + "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + } + }, + "charset-normalizer": { + ":x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706" + } + }, + "idna": { + ":x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", + "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + } + }, + "requests": { + ":x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", + "sha256": "58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f" + } + }, + "urllib3": { + ":x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/8a/03/ad9306a50d05c166e3456fe810f33cee2b8b2a7a6818ec5d4908c4ec6b36/urllib3-2.0.3-py3-none-any.whl", + "sha256": "48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1" + } + } +} diff --git a/examples/pypi_install/pip_install_report_x86_64_linux.json b/examples/pypi_install/pip_install_report_x86_64_linux.json deleted file mode 100644 index 71b9b8ad0f..0000000000 --- a/examples/pypi_install/pip_install_report_x86_64_linux.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "version": "0", - "pip_version": "22.3.1", - "install": [ - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", - "archive_info": { - "hash": "sha256=58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f" - } - }, - "is_direct": false, - "requested": true, - "metadata": { - "metadata_version": "2.1", - "name": "requests", - "version": "2.31.0", - "platform": [ - "UNKNOWN" - ], - "summary": "Python HTTP for Humans.", - "description_content_type": "text/markdown", - "home_page": "https://requests.readthedocs.io", - "author": "Kenneth Reitz", - "author_email": "me@kennethreitz.org", - "license": "Apache 2.0", - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Environment :: Web Environment", - "Intended Audience :: Developers", - "License :: OSI Approved :: Apache Software License", - "Natural Language :: English", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Internet :: WWW/HTTP", - "Topic :: Software Development :: Libraries" - ], - "requires_dist": [ - "charset-normalizer (<4,>=2)", - "idna (<4,>=2.5)", - "urllib3 (<3,>=1.21.1)", - "certifi (>=2017.4.17)", - "PySocks (!=1.5.7,>=1.5.6) ; extra == 'socks'", - "chardet (<6,>=3.0.2) ; extra == 'use_chardet_on_py3'" - ], - "requires_python": ">=3.7", - "project_url": [ - "Documentation, https://requests.readthedocs.io", - "Source, https://github.com/psf/requests" - ], - "provides_extra": [ - "security", - "socks", - "use_chardet_on_py3" - ], - "description": "# Requests\n\n**Requests** is a simple, yet elegant, HTTP library.\n\n```python\n>>> import requests\n>>> r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))\n>>> r.status_code\n200\n>>> r.headers['content-type']\n'application/json; charset=utf8'\n>>> r.encoding\n'utf-8'\n>>> r.text\n'{\"authenticated\": true, ...'\n>>> r.json()\n{'authenticated': True, ...}\n```\n\nRequests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method!\n\nRequests is one of the most downloaded Python packages today, pulling in around `30M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `1,000,000+` repositories. You may certainly put your trust in this code.\n\n[![Downloads](https://pepy.tech/badge/requests/month)](https://pepy.tech/project/requests)\n[![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests)\n[![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors)\n\n## Installing Requests and Supported Versions\n\nRequests is available on PyPI:\n\n```console\n$ python -m pip install requests\n```\n\nRequests officially supports Python 3.7+.\n\n## Supported Features & Best–Practices\n\nRequests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today.\n\n- Keep-Alive & Connection Pooling\n- International Domains and URLs\n- Sessions with Cookie Persistence\n- Browser-style TLS/SSL Verification\n- Basic & Digest Authentication\n- Familiar `dict`–like Cookies\n- Automatic Content Decompression and Decoding\n- Multi-part File Uploads\n- SOCKS Proxy Support\n- Connection Timeouts\n- Streaming Downloads\n- Automatic honoring of `.netrc`\n- Chunked HTTP Requests\n\n## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io)\n\n[![Read the Docs](https://raw.githubusercontent.com/psf/requests/main/ext/ss.png)](https://requests.readthedocs.io)\n\n## Cloning the repository\n\nWhen cloning the Requests repository, you may need to add the `-c\nfetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see\n[this issue](https://github.com/psf/requests/issues/2690) for more background):\n\n```shell\ngit clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git\n```\n\nYou can also apply this setting to your global Git config:\n\n```shell\ngit config --global fetch.fsck.badTimezone ignore\n```\n\n---\n\n[![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/main/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/main/ext/psf.png)](https://www.python.org/psf)\n\n\n" - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", - "archive_info": { - "hash": "sha256=c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" - } - }, - "is_direct": false, - "requested": false, - "metadata": { - "metadata_version": "2.1", - "name": "certifi", - "version": "2023.5.7", - "platform": [ - "UNKNOWN" - ], - "summary": "Python package for providing Mozilla's CA Bundle.", - "home_page": "https://github.com/certifi/python-certifi", - "author": "Kenneth Reitz", - "author_email": "me@kennethreitz.com", - "license": "MPL-2.0", - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", - "Natural Language :: English", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11" - ], - "requires_python": ">=3.6", - "project_url": [ - "Source, https://github.com/certifi/python-certifi" - ], - "description": "Certifi: Python SSL Certificates\n================================\n\nCertifi provides Mozilla's carefully curated collection of Root Certificates for\nvalidating the trustworthiness of SSL certificates while verifying the identity\nof TLS hosts. It has been extracted from the `Requests`_ project.\n\nInstallation\n------------\n\n``certifi`` is available on PyPI. Simply install it with ``pip``::\n\n $ pip install certifi\n\nUsage\n-----\n\nTo reference the installed certificate authority (CA) bundle, you can use the\nbuilt-in function::\n\n >>> import certifi\n\n >>> certifi.where()\n '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem'\n\nOr from the command line::\n\n $ python -m certifi\n /usr/local/lib/python3.7/site-packages/certifi/cacert.pem\n\nEnjoy!\n\n.. _`Requests`: https://requests.readthedocs.io/en/master/\n\nAddition/Removal of Certificates\n--------------------------------\n\nCertifi does not support any addition/removal or other modification of the\nCA trust store content. This project is intended to provide a reliable and\nhighly portable root of trust to python deployments. Look to upstream projects\nfor methods to use alternate trust.\n\n\n" - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "archive_info": { - "hash": "sha256=21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706" - } - }, - "is_direct": false, - "requested": false, - "metadata": { - "metadata_version": "2.1", - "name": "charset-normalizer", - "version": "3.1.0", - "summary": "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.", - "description_content_type": "text/markdown", - "keywords": [ - "encoding", - "charset", - "charset-detector", - "detector", - "normalization", - "unicode", - "chardet", - "detect" - ], - "home_page": "https://github.com/Ousret/charset_normalizer", - "author": "Ahmed TAHRI", - "author_email": "ahmed.tahri@cloudnursery.dev", - "license": "MIT", - "classifier": [ - "Development Status :: 5 - Production/Stable", - "License :: OSI Approved :: MIT License", - "Intended Audience :: Developers", - "Topic :: Software Development :: Libraries :: Python Modules", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Text Processing :: Linguistic", - "Topic :: Utilities", - "Typing :: Typed" - ], - "requires_python": ">=3.7.0", - "project_url": [ - "Bug Reports, https://github.com/Ousret/charset_normalizer/issues", - "Documentation, https://charset-normalizer.readthedocs.io/en/latest" - ], - "provides_extra": [ - "unicode_backport" - ], - "description": "

Charset Detection, for Everyone 👋

\n\n

\n The Real First Universal Charset Detector
\n \n \n \n \n \n \n \n \"Download\n \n

\n\n> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`,\n> I'm trying to resolve the issue by taking a new approach.\n> All IANA character set names for which the Python core library provides codecs are supported.\n\n

\n >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<<\n

\n\nThis project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**.\n\n| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) |\n|--------------------------------------------------|:---------------------------------------------:|:------------------------------------------------------------------------------------------------------:|:-----------------------------------------------:|\n| `Fast` | ❌
| ✅
| ✅
|\n| `Universal**` | ❌ | ✅ | ❌ |\n| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ |\n| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ |\n| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ |\n| `Native Python` | ✅ | ✅ | ❌ |\n| `Detect spoken language` | ❌ | ✅ | N/A |\n| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ |\n| `Whl Size` | 193.6 kB | 39.5 kB | ~200 kB |\n| `Supported Encoding` | 33 | :tada: [90](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 |\n\n

\n\"Reading\"Cat\n\n*\\*\\* : They are clearly using specific code for a specific encoding even if covering most of used one*
\nDid you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html)\n\n## ⭐ Your support\n\n*Fork, test-it, star-it, submit your ideas! We do listen.*\n \n## ⚡ Performance\n\nThis package offer better performance than its counterpart Chardet. Here are some numbers.\n\n| Package | Accuracy | Mean per file (ms) | File per sec (est) |\n|-----------------------------------------------|:--------:|:------------------:|:------------------:|\n| [chardet](https://github.com/chardet/chardet) | 86 % | 200 ms | 5 file/sec |\n| charset-normalizer | **98 %** | **10 ms** | 100 file/sec |\n\n| Package | 99th percentile | 95th percentile | 50th percentile |\n|-----------------------------------------------|:---------------:|:---------------:|:---------------:|\n| [chardet](https://github.com/chardet/chardet) | 1200 ms | 287 ms | 23 ms |\n| charset-normalizer | 100 ms | 50 ms | 5 ms |\n\nChardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload.\n\n> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows.\n> And yes, these results might change at any time. The dataset can be updated to include more files.\n> The actual delays heavily depends on your CPU capabilities. The factors should remain the same.\n> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability\n> (eg. Supported Encoding) Challenge-them if you want.\n\n## ✨ Installation\n\nUsing PyPi for latest stable\n```sh\npip install charset-normalizer -U\n```\n\n## 🚀 Basic Usage\n\n### CLI\nThis package comes with a CLI.\n\n```\nusage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD]\n file [file ...]\n\nThe Real First Universal Charset Detector. Discover originating encoding used\non text file. Normalize text to unicode.\n\npositional arguments:\n files File(s) to be analysed\n\noptional arguments:\n -h, --help show this help message and exit\n -v, --verbose Display complementary information about file if any.\n Stdout will contain logs about the detection process.\n -a, --with-alternative\n Output complementary possibilities if any. Top-level\n JSON WILL be a list.\n -n, --normalize Permit to normalize input file. If not set, program\n does not write anything.\n -m, --minimal Only output the charset detected to STDOUT. Disabling\n JSON output.\n -r, --replace Replace file when trying to normalize it instead of\n creating a new one.\n -f, --force Replace file without asking if you are sure, use this\n flag with caution.\n -t THRESHOLD, --threshold THRESHOLD\n Define a custom maximum amount of chaos allowed in\n decoded content. 0. <= chaos <= 1.\n --version Show version information and exit.\n```\n\n```bash\nnormalizer ./data/sample.1.fr.srt\n```\n\n:tada: Since version 1.4.0 the CLI produce easily usable stdout result in JSON format.\n\n```json\n{\n \"path\": \"/home/default/projects/charset_normalizer/data/sample.1.fr.srt\",\n \"encoding\": \"cp1252\",\n \"encoding_aliases\": [\n \"1252\",\n \"windows_1252\"\n ],\n \"alternative_encodings\": [\n \"cp1254\",\n \"cp1256\",\n \"cp1258\",\n \"iso8859_14\",\n \"iso8859_15\",\n \"iso8859_16\",\n \"iso8859_3\",\n \"iso8859_9\",\n \"latin_1\",\n \"mbcs\"\n ],\n \"language\": \"French\",\n \"alphabets\": [\n \"Basic Latin\",\n \"Latin-1 Supplement\"\n ],\n \"has_sig_or_bom\": false,\n \"chaos\": 0.149,\n \"coherence\": 97.152,\n \"unicode_path\": null,\n \"is_preferred\": true\n}\n```\n\n### Python\n*Just print out normalized text*\n```python\nfrom charset_normalizer import from_path\n\nresults = from_path('./my_subtitle.srt')\n\nprint(str(results.best()))\n```\n\n*Upgrade your code without effort*\n```python\nfrom charset_normalizer import detect\n```\n\nThe above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible.\n\nSee the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/)\n\n## 😇 Why\n\nWhen I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a\nreliable alternative using a completely different method. Also! I never back down on a good challenge!\n\nI **don't care** about the **originating charset** encoding, because **two different tables** can\nproduce **two identical rendered string.**\nWhat I want is to get readable text, the best I can. \n\nIn a way, **I'm brute forcing text decoding.** How cool is that ? 😎\n\nDon't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode.\n\n## 🍰 How\n\n - Discard all charset encoding table that could not fit the binary content.\n - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding.\n - Extract matches with the lowest mess detected.\n - Additionally, we measure coherence / probe for a language.\n\n**Wait a minute**, what is noise/mess and coherence according to **YOU ?**\n\n*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then\n**I established** some ground rules about **what is obvious** when **it seems like** a mess.\n I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to\n improve or rewrite it.\n\n*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought\nthat intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design.\n\n## ⚡ Known limitations\n\n - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters))\n - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content.\n\n## ⚠️ About Python EOLs\n\n**If you are running:**\n\n- Python >=2.7,<3.5: Unsupported\n- Python 3.5: charset-normalizer < 2.1\n- Python 3.6: charset-normalizer < 3.1\n\nUpgrade your Python interpreter as soon as possible.\n\n## 👤 Contributing\n\nContributions, issues and feature requests are very much welcome.
\nFeel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute.\n\n## 📝 License\n\nCopyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
\nThis project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed.\n\nCharacters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/)\n\n## 💼 For Enterprise\n\nProfessional support for charset-normalizer is available as part of the [Tidelift\nSubscription][1]. Tidelift gives software development teams a single source for\npurchasing and maintaining their software, with professional grade assurances\nfrom the experts who know it best, while seamlessly integrating with existing\ntools.\n\n[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme\n\n# Changelog\nAll notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).\n\n## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06)\n\n### Added\n- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262)\n\n### Removed\n- Support for Python 3.6 (PR #260)\n\n### Changed\n- Optional speedup provided by mypy/c 1.0.1\n\n## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18)\n\n### Fixed\n- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233)\n\n### Changed\n- Speedup provided by mypy/c 0.990 on Python >= 3.7\n\n## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20)\n\n### Added\n- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results\n- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES\n- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio\n- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)\n\n### Changed\n- Build with static metadata using 'build' frontend\n- Make the language detection stricter\n- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1\n\n### Fixed\n- CLI with opt --normalize fail when using full path for files\n- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it\n- Sphinx warnings when generating the documentation\n\n### Removed\n- Coherence detector no longer return 'Simple English' instead return 'English'\n- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'\n- Breaking: Method `first()` and `best()` from CharsetMatch\n- UTF-7 will no longer appear as \"detected\" without a recognized SIG/mark (is unreliable/conflict with ASCII)\n- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches\n- Breaking: Top-level function `normalize`\n- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch\n- Support for the backport `unicodedata2`\n\n## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18)\n\n### Added\n- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results\n- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES\n- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio\n\n### Changed\n- Build with static metadata using 'build' frontend\n- Make the language detection stricter\n\n### Fixed\n- CLI with opt --normalize fail when using full path for files\n- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it\n\n### Removed\n- Coherence detector no longer return 'Simple English' instead return 'English'\n- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'\n\n## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21)\n\n### Added\n- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)\n\n### Removed\n- Breaking: Method `first()` and `best()` from CharsetMatch\n- UTF-7 will no longer appear as \"detected\" without a recognized SIG/mark (is unreliable/conflict with ASCII)\n\n### Fixed\n- Sphinx warnings when generating the documentation\n\n## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15)\n\n### Changed\n- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1\n\n### Removed\n- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches\n- Breaking: Top-level function `normalize`\n- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch\n- Support for the backport `unicodedata2`\n\n## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19)\n\n### Deprecated\n- Function `normalize` scheduled for removal in 3.0\n\n### Changed\n- Removed useless call to decode in fn is_unprintable (#206)\n\n### Fixed\n- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204)\n\n## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19)\n\n### Added\n- Output the Unicode table version when running the CLI with `--version` (PR #194)\n\n### Changed\n- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175)\n- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183)\n\n### Fixed\n- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175)\n- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181)\n\n### Removed\n- Support for Python 3.5 (PR #192)\n\n### Deprecated\n- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194)\n\n## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12)\n\n### Fixed\n- ASCII miss-detection on rare cases (PR #170) \n\n## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30)\n\n### Added\n- Explicit support for Python 3.11 (PR #164)\n\n### Changed\n- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165)\n\n## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04)\n\n### Fixed\n- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154)\n\n### Changed\n- Skipping the language-detection (CD) on ASCII (PR #155)\n\n## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03)\n\n### Changed\n- Moderating the logging impact (since 2.0.8) for specific environments (PR #147)\n\n### Fixed\n- Wrong logging level applied when setting kwarg `explain` to True (PR #146)\n\n## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24)\n### Changed\n- Improvement over Vietnamese detection (PR #126)\n- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124)\n- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122)\n- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129)\n- Code style as refactored by Sourcery-AI (PR #131) \n- Minor adjustment on the MD around european words (PR #133)\n- Remove and replace SRTs from assets / tests (PR #139)\n- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135)\n- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135)\n\n### Fixed\n- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137)\n- Avoid using too insignificant chunk (PR #137)\n\n### Added\n- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135)\n- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141)\n\n## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11)\n### Added\n- Add support for Kazakh (Cyrillic) language detection (PR #109)\n\n### Changed\n- Further, improve inferring the language from a given single-byte code page (PR #112)\n- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116)\n- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113)\n- Various detection improvement (MD+CD) (PR #117)\n\n### Removed\n- Remove redundant logging entry about detected language(s) (PR #115)\n\n### Fixed\n- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102)\n\n## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18)\n### Fixed\n- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100)\n- Fix CLI crash when using --minimal output in certain cases (PR #103)\n\n### Changed\n- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101)\n\n## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14)\n### Changed\n- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81)\n- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82)\n- The Unicode detection is slightly improved (PR #93)\n- Add syntax sugar \\_\\_bool\\_\\_ for results CharsetMatches list-container (PR #91)\n\n### Removed\n- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92)\n\n### Fixed\n- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95)\n- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96)\n- The MANIFEST.in was not exhaustive (PR #78)\n\n## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30)\n### Fixed\n- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70)\n- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68)\n- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72)\n- Submatch factoring could be wrong in rare edge cases (PR #72)\n- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72)\n- Fix line endings from CRLF to LF for certain project files (PR #67)\n\n### Changed\n- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76)\n- Allow fallback on specified encoding if any (PR #71)\n\n## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16)\n### Changed\n- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63)\n- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64)\n\n## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15)\n### Fixed\n- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) \n\n### Changed\n- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57)\n\n## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13)\n### Fixed\n- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55)\n- Using explain=False permanently disable the verbose output in the current runtime (PR #47)\n- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47)\n- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52)\n\n### Changed\n- Public function normalize default args values were not aligned with from_bytes (PR #53)\n\n### Added\n- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47)\n\n## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02)\n### Changed\n- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet.\n- Accent has been made on UTF-8 detection, should perform rather instantaneous.\n- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible.\n- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time)\n- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+\n- utf_7 detection has been reinstated.\n\n### Removed\n- This package no longer require anything when used with Python 3.5 (Dropped cached_property)\n- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian.\n- The exception hook on UnicodeDecodeError has been removed.\n\n### Deprecated\n- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0\n\n### Fixed\n- The CLI output used the relative path of the file(s). Should be absolute.\n\n## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28)\n### Fixed\n- Logger configuration/usage no longer conflict with others (PR #44)\n\n## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21)\n### Removed\n- Using standard logging instead of using the package loguru.\n- Dropping nose test framework in favor of the maintained pytest.\n- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text.\n- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version.\n- Stop support for UTF-7 that does not contain a SIG.\n- Dropping PrettyTable, replaced with pure JSON output in CLI.\n\n### Fixed\n- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process.\n- Not searching properly for the BOM when trying utf32/16 parent codec.\n\n### Changed\n- Improving the package final size by compressing frequencies.json.\n- Huge improvement over the larges payload.\n\n### Added\n- CLI now produces JSON consumable output.\n- Return ASCII if given sequences fit. Given reasonable confidence.\n\n## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13)\n\n### Fixed\n- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40)\n\n## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12)\n\n### Fixed\n- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39)\n\n## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12)\n\n### Fixed\n- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38)\n\n## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09)\n\n### Changed\n- Amend the previous release to allow prettytable 2.0 (PR #35)\n\n## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08)\n\n### Fixed\n- Fix error while using the package with a python pre-release interpreter (PR #33)\n\n### Changed\n- Dependencies refactoring, constraints revised.\n\n### Added\n- Add python 3.9 and 3.10 to the supported interpreters\n\nMIT License\n\nCopyright (c) 2019 TAHRI Ahmed R.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", - "archive_info": { - "hash": "sha256=90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" - } - }, - "is_direct": false, - "requested": false, - "metadata": { - "metadata_version": "2.1", - "name": "idna", - "version": "3.4", - "summary": "Internationalized Domain Names in Applications (IDNA)", - "description_content_type": "text/x-rst", - "author_email": "Kim Davies ", - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Intended Audience :: System Administrators", - "License :: OSI Approved :: BSD License", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Internet :: Name Service (DNS)", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Utilities" - ], - "requires_python": ">=3.5", - "project_url": [ - "Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst", - "Issue tracker, https://github.com/kjd/idna/issues", - "Source, https://github.com/kjd/idna" - ], - "description": "Internationalized Domain Names in Applications (IDNA)\n=====================================================\n\nSupport for the Internationalized Domain Names in\nApplications (IDNA) protocol as specified in `RFC 5891\n`_. This is the latest version of\nthe protocol and is sometimes referred to as “IDNA 2008”.\n\nThis library also provides support for Unicode Technical\nStandard 46, `Unicode IDNA Compatibility Processing\n`_.\n\nThis acts as a suitable replacement for the “encodings.idna”\nmodule that comes with the Python standard library, but which\nonly supports the older superseded IDNA specification (`RFC 3490\n`_).\n\nBasic functions are simply executed:\n\n.. code-block:: pycon\n\n >>> import idna\n >>> idna.encode('ドメイン.テスト')\n b'xn--eckwd4c7c.xn--zckzah'\n >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))\n ドメイン.テスト\n\n\nInstallation\n------------\n\nThis package is available for installation from PyPI:\n\n.. code-block:: bash\n\n $ python3 -m pip install idna\n\n\nUsage\n-----\n\nFor typical usage, the ``encode`` and ``decode`` functions will take a\ndomain name argument and perform a conversion to A-labels or U-labels\nrespectively.\n\n.. code-block:: pycon\n\n >>> import idna\n >>> idna.encode('ドメイン.テスト')\n b'xn--eckwd4c7c.xn--zckzah'\n >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))\n ドメイン.テスト\n\nYou may use the codec encoding and decoding methods using the\n``idna.codec`` module:\n\n.. code-block:: pycon\n\n >>> import idna.codec\n >>> print('домен.испытание'.encode('idna'))\n b'xn--d1acufc.xn--80akhbyknj4f'\n >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna'))\n домен.испытание\n\nConversions can be applied at a per-label basis using the ``ulabel`` or\n``alabel`` functions if necessary:\n\n.. code-block:: pycon\n\n >>> idna.alabel('测试')\n b'xn--0zwm56d'\n\nCompatibility Mapping (UTS #46)\n+++++++++++++++++++++++++++++++\n\nAs described in `RFC 5895 `_, the\nIDNA specification does not normalize input from different potential\nways a user may input a domain name. This functionality, known as\na “mapping”, is considered by the specification to be a local\nuser-interface issue distinct from IDNA conversion functionality.\n\nThis library provides one such mapping, that was developed by the\nUnicode Consortium. Known as `Unicode IDNA Compatibility Processing\n`_, it provides for both a regular\nmapping for typical applications, as well as a transitional mapping to\nhelp migrate from older IDNA 2003 applications.\n\nFor example, “Königsgäßchen” is not a permissible label as *LATIN\nCAPITAL LETTER K* is not allowed (nor are capital letters in general).\nUTS 46 will convert this into lower case prior to applying the IDNA\nconversion.\n\n.. code-block:: pycon\n\n >>> import idna\n >>> idna.encode('Königsgäßchen')\n ...\n idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed\n >>> idna.encode('Königsgäßchen', uts46=True)\n b'xn--knigsgchen-b4a3dun'\n >>> print(idna.decode('xn--knigsgchen-b4a3dun'))\n königsgäßchen\n\nTransitional processing provides conversions to help transition from\nthe older 2003 standard to the current standard. For example, in the\noriginal IDNA specification, the *LATIN SMALL LETTER SHARP S* (ß) was\nconverted into two *LATIN SMALL LETTER S* (ss), whereas in the current\nIDNA specification this conversion is not performed.\n\n.. code-block:: pycon\n\n >>> idna.encode('Königsgäßchen', uts46=True, transitional=True)\n 'xn--knigsgsschen-lcb0w'\n\nImplementors should use transitional processing with caution, only in\nrare cases where conversion from legacy labels to current labels must be\nperformed (i.e. IDNA implementations that pre-date 2008). For typical\napplications that just need to convert labels, transitional processing\nis unlikely to be beneficial and could produce unexpected incompatible\nresults.\n\n``encodings.idna`` Compatibility\n++++++++++++++++++++++++++++++++\n\nFunction calls from the Python built-in ``encodings.idna`` module are\nmapped to their IDNA 2008 equivalents using the ``idna.compat`` module.\nSimply substitute the ``import`` clause in your code to refer to the new\nmodule name.\n\nExceptions\n----------\n\nAll errors raised during the conversion following the specification\nshould raise an exception derived from the ``idna.IDNAError`` base\nclass.\n\nMore specific exceptions that may be generated as ``idna.IDNABidiError``\nwhen the error reflects an illegal combination of left-to-right and\nright-to-left characters in a label; ``idna.InvalidCodepoint`` when\na specific codepoint is an illegal character in an IDN label (i.e.\nINVALID); and ``idna.InvalidCodepointContext`` when the codepoint is\nillegal based on its positional context (i.e. it is CONTEXTO or CONTEXTJ\nbut the contextual requirements are not satisfied.)\n\nBuilding and Diagnostics\n------------------------\n\nThe IDNA and UTS 46 functionality relies upon pre-calculated lookup\ntables for performance. These tables are derived from computing against\neligibility criteria in the respective standards. These tables are\ncomputed using the command-line script ``tools/idna-data``.\n\nThis tool will fetch relevant codepoint data from the Unicode repository\nand perform the required calculations to identify eligibility. There are\nthree main modes:\n\n* ``idna-data make-libdata``. Generates ``idnadata.py`` and\n ``uts46data.py``, the pre-calculated lookup tables using for IDNA and\n UTS 46 conversions. Implementors who wish to track this library against\n a different Unicode version may use this tool to manually generate a\n different version of the ``idnadata.py`` and ``uts46data.py`` files.\n\n* ``idna-data make-table``. Generate a table of the IDNA disposition\n (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix\n B.1 of RFC 5892 and the pre-computed tables published by `IANA\n `_.\n\n* ``idna-data U+0061``. Prints debugging output on the various\n properties associated with an individual Unicode codepoint (in this\n case, U+0061), that are used to assess the IDNA and UTS 46 status of a\n codepoint. This is helpful in debugging or analysis.\n\nThe tool accepts a number of arguments, described using ``idna-data\n-h``. Most notably, the ``--version`` argument allows the specification\nof the version of Unicode to use in computing the table data. For\nexample, ``idna-data --version 9.0.0 make-libdata`` will generate\nlibrary data against Unicode 9.0.0.\n\n\nAdditional Notes\n----------------\n\n* **Packages**. The latest tagged release version is published in the\n `Python Package Index `_.\n\n* **Version support**. This library supports Python 3.5 and higher.\n As this library serves as a low-level toolkit for a variety of\n applications, many of which strive for broad compatibility with older\n Python versions, there is no rush to remove older intepreter support.\n Removing support for older versions should be well justified in that the\n maintenance burden has become too high.\n\n* **Python 2**. Python 2 is supported by version 2.x of this library.\n While active development of the version 2.x series has ended, notable\n issues being corrected may be backported to 2.x. Use \"idna<3\" in your\n requirements file if you need this library for a Python 2 application.\n\n* **Testing**. The library has a test suite based on each rule of the\n IDNA specification, as well as tests that are provided as part of the\n Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing\n `_.\n\n* **Emoji**. It is an occasional request to support emoji domains in\n this library. Encoding of symbols like emoji is expressly prohibited by\n the technical standard IDNA 2008 and emoji domains are broadly phased\n out across the domain industry due to associated security risks. For\n now, applications that wish need to support these non-compliant labels\n may wish to consider trying the encode/decode operation in this library\n first, and then falling back to using `encodings.idna`. See `the Github\n project `_ for more discussion.\n\n" - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/8a/03/ad9306a50d05c166e3456fe810f33cee2b8b2a7a6818ec5d4908c4ec6b36/urllib3-2.0.3-py3-none-any.whl", - "archive_info": { - "hash": "sha256=48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1" - } - }, - "is_direct": false, - "requested": false, - "metadata": { - "metadata_version": "2.1", - "name": "urllib3", - "version": "2.0.3", - "summary": "HTTP library with thread-safe connection pooling, file post, and more.", - "description_content_type": "text/markdown", - "keywords": [ - "filepost", - "http", - "httplib", - "https", - "pooling", - "ssl", - "threadsafe", - "urllib" - ], - "author_email": "Andrey Petrov ", - "maintainer_email": "Seth Michael Larson , Quentin Pradet ", - "classifier": [ - "Environment :: Web Environment", - "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Internet :: WWW/HTTP", - "Topic :: Software Development :: Libraries" - ], - "requires_dist": [ - "brotli>=1.0.9; platform_python_implementation == 'CPython' and extra == 'brotli'", - "brotlicffi>=0.8.0; platform_python_implementation != 'CPython' and extra == 'brotli'", - "certifi; extra == 'secure'", - "cryptography>=1.9; extra == 'secure'", - "idna>=2.0.0; extra == 'secure'", - "pyopenssl>=17.1.0; extra == 'secure'", - "urllib3-secure-extra; extra == 'secure'", - "pysocks!=1.5.7,<2.0,>=1.5.6; extra == 'socks'", - "zstandard>=0.18.0; extra == 'zstd'" - ], - "requires_python": ">=3.7", - "project_url": [ - "Changelog, https://github.com/urllib3/urllib3/blob/main/CHANGES.rst", - "Documentation, https://urllib3.readthedocs.io", - "Code, https://github.com/urllib3/urllib3", - "Issue tracker, https://github.com/urllib3/urllib3/issues" - ], - "provides_extra": [ - "brotli", - "secure", - "socks", - "zstd" - ], - "description": "

\n\n![urllib3](https://github.com/urllib3/urllib3/raw/main/docs/_static/banner_github.svg)\n\n

\n\n

\n \"PyPI\n \"Python\n \"Join\n \"Coverage\n \"Build\n \"Documentation
\n \"OpenSSF\n \"SLSA\n \"CII\n

\n\nurllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the\nPython ecosystem already uses urllib3 and you should too.\nurllib3 brings many critical features that are missing from the Python\nstandard libraries:\n\n- Thread safety.\n- Connection pooling.\n- Client-side SSL/TLS verification.\n- File uploads with multipart encoding.\n- Helpers for retrying requests and dealing with HTTP redirects.\n- Support for gzip, deflate, brotli, and zstd encoding.\n- Proxy support for HTTP and SOCKS.\n- 100% test coverage.\n\nurllib3 is powerful and easy to use:\n\n```python3\n>>> import urllib3\n>>> resp = urllib3.request(\"GET\", \"http://httpbin.org/robots.txt\")\n>>> resp.status\n200\n>>> resp.data\nb\"User-agent: *\\nDisallow: /deny\\n\"\n```\n\n## Installing\n\nurllib3 can be installed with [pip](https://pip.pypa.io):\n\n```bash\n$ python -m pip install urllib3\n```\n\nAlternatively, you can grab the latest source code from [GitHub](https://github.com/urllib3/urllib3):\n\n```bash\n$ git clone https://github.com/urllib3/urllib3.git\n$ cd urllib3\n$ pip install .\n```\n\n\n## Documentation\n\nurllib3 has usage and reference documentation at [urllib3.readthedocs.io](https://urllib3.readthedocs.io).\n\n\n## Community\n\nurllib3 has a [community Discord channel](https://discord.gg/urllib3) for asking questions and\ncollaborating with other contributors. Drop by and say hello 👋\n\n\n## Contributing\n\nurllib3 happily accepts contributions. Please see our\n[contributing documentation](https://urllib3.readthedocs.io/en/latest/contributing.html)\nfor some tips on getting started.\n\n\n## Security Disclosures\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure with maintainers.\n\n\n## Maintainers\n\n- [@sethmlarson](https://github.com/sethmlarson) (Seth M. Larson)\n- [@pquentin](https://github.com/pquentin) (Quentin Pradet)\n- [@theacodes](https://github.com/theacodes) (Thea Flowers)\n- [@haikuginger](https://github.com/haikuginger) (Jess Shapiro)\n- [@lukasa](https://github.com/lukasa) (Cory Benfield)\n- [@sigmavirus24](https://github.com/sigmavirus24) (Ian Stapleton Cordasco)\n- [@shazow](https://github.com/shazow) (Andrey Petrov)\n\n👋\n\n\n## Sponsorship\n\nIf your company benefits from this library, please consider [sponsoring its\ndevelopment](https://urllib3.readthedocs.io/en/latest/sponsors.html).\n\n\n## For Enterprise\n\nProfessional support for urllib3 is available as part of the [Tidelift\nSubscription][1]. Tidelift gives software development teams a single source for\npurchasing and maintaining their software, with professional grade assurances\nfrom the experts who know it best, while seamlessly integrating with existing\ntools.\n\n[1]: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme\n" - } - } - ], - "environment": { - "implementation_name": "cpython", - "implementation_version": "3.9.16", - "os_name": "posix", - "platform_machine": "x86_64", - "platform_release": "5.10.0-21-amd64", - "platform_system": "Linux", - "platform_version": "#1 SMP Debian 5.10.162-1 (2023-01-21)", - "python_full_version": "3.9.16", - "platform_python_implementation": "CPython", - "python_version": "3.9", - "sys_platform": "linux" - } -} \ No newline at end of file diff --git a/examples/pypi_install/requirements_lock.txt b/examples/pypi_install/requirements_lock_x86_64_linux.txt similarity index 100% rename from examples/pypi_install/requirements_lock.txt rename to examples/pypi_install/requirements_lock_x86_64_linux.txt diff --git a/python/pip_install/requirements.bzl b/python/pip_install/requirements.bzl index 3143f1e0df..40c8ce6045 100644 --- a/python/pip_install/requirements.bzl +++ b/python/pip_install/requirements.bzl @@ -14,15 +14,22 @@ """Rules to verify and update pip-compile locked requirements.txt""" +load("@bazel_skylib//lib:types.bzl", "types") load("//python:defs.bzl", _py_binary = "py_binary", _py_test = "py_test") load("//python/pip_install:repositories.bzl", "requirement") -def _generate_log_select(pip_installation_report, loc): +def _generate_loc_select(config_to_filepath_dict, loc): result = {} - for config, report_label in pip_installation_report.items(): - result[config] = [loc.format(report_label)] + for config, label in config_to_filepath_dict.items(): + result[config] = [loc.format(label)] return select(result) +def _generate_data_select(config_to_filepath_dict): + return select({k: [v] for k, v in config_to_filepath_dict.items()}) + +def _generate_config_select(config_to_filepath_dict): + return select({k: [k] for k in config_to_filepath_dict}) + def compile_pip_requirements( name, extra_args = [], @@ -34,7 +41,7 @@ def compile_pip_requirements( requirements_darwin = None, requirements_linux = None, requirements_windows = None, - pip_installation_report = None, + intermediate_file = None, visibility = ["//visibility:private"], tags = None, **kwargs): @@ -70,18 +77,23 @@ def compile_pip_requirements( requirements_in = name + ".in" if requirements_in == None else requirements_in requirements_txt = name + ".txt" if requirements_txt == None else requirements_txt + if types.is_dict(requirements_txt): + requirements_txt_data = _generate_data_select(requirements_txt) + else: + requirements_txt_data = [requirements_txt] + # "Default" target produced by this macro # Allow a compile_pip_requirements rule to include another one in the data # for a requirements file that does `-r ../other/requirements.txt` native.filegroup( name = name, - srcs = kwargs.pop("data", []) + [requirements_txt], + srcs = kwargs.pop("data", []) + requirements_txt_data, visibility = visibility, ) - data = [name, requirements_in, requirements_txt] + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None] - if pip_installation_report: - data += _generate_log_select(pip_installation_report, "{}") + data = [name, requirements_in] + requirements_txt_data + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None] + if intermediate_file: + data += _generate_loc_select(intermediate_file, "{}") # Use the Label constructor so this is expanded in the context of the file # where it appears, which is to say, in @rules_python @@ -91,12 +103,13 @@ def compile_pip_requirements( args = [ loc.format(requirements_in), - loc.format(requirements_txt), + ] + (_generate_loc_select(requirements_txt, loc) if types.is_dict(requirements_txt) else [loc.format(requirements_txt)]) + [ # String None is a placeholder for argv ordering. loc.format(requirements_linux) if requirements_linux else "None", loc.format(requirements_darwin) if requirements_darwin else "None", loc.format(requirements_windows) if requirements_windows else "None", - ] + (_generate_log_select(pip_installation_report, loc) if pip_installation_report else "None") + [ + ] + (_generate_loc_select(intermediate_file, loc) if intermediate_file else ["None"]) + ( + _generate_config_select(intermediate_file) if intermediate_file else ["None"]) + [ "//%s:%s.update" % (native.package_name(), name), ] + extra_args @@ -137,7 +150,7 @@ def compile_pip_requirements( attrs["env"] = kwargs.pop("env", {}) # TODO(phil): Add a target_compatible_with here for all the configs not - # mentioned in pip_installation_report. + # mentioned in intermediate_file. py_binary( name = name + ".update", **attrs diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index 78ca9b7ce4..7221bcdf11 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -15,9 +15,11 @@ "Set defaults for the pip-compile command to run it under Bazel" import atexit +import json import os import shutil import sys +import tempfile from pathlib import Path import pip @@ -80,20 +82,57 @@ def _locate(bazel_runfiles, file): return bazel_runfiles.Rlocation(file) -def run_pip(requirements_in, requirements_txt, pip_installation_report): - sys.argv = [ - "pip", - "install", - "--ignore-installed", - "--dry-run", - "--quiet", - "--report", - pip_installation_report, - "--requirement", - requirements_in, - ] +def _post_process_installation_report( + config_setting: str, + raw_installation_report: Path, + intermediate_file: Path): + + with raw_installation_report.open() as file: + report = json.load(file) + + intermediate = {} + + for install in report["install"]: + download_info = install["download_info"] + metadata = install["metadata"] + name = metadata["name"] + + info = intermediate.setdefault(name, {}).setdefault(config_setting, {}) + info["url"] = download_info["url"] + hash = download_info["archive_info"].get("hash", "") + if hash and hash.startswith("sha256="): + info["sha256"] = hash.split("=", 1)[1] + else: + raise ValueError("unknown integrity check: " + str(download_info["archive_info"])) + + with intermediate_file.open("w") as file: + json.dump(intermediate, file, indent=4) + file.write("\n") + + +def run_pip(config_setting, requirements_in, intermediate_file): + with tempfile.TemporaryDirectory() as temp_dir: + raw_installation_report = Path(temp_dir) / "installation_report.json" + sys.argv = [ + "pip", + "install", + "--ignore-installed", + "--dry-run", + "--quiet", + "--report", + str(raw_installation_report), + "--requirement", + str(requirements_in), + ] - return pip._internal.cli.main.main() + result = pip._internal.cli.main.main() + if result != 0: + return result + + _post_process_installation_report( + config_setting, + raw_installation_report, + intermediate_file) if __name__ == "__main__": @@ -112,7 +151,8 @@ def run_pip(requirements_in, requirements_txt, pip_installation_report): requirements_linux = parse_str_none(sys.argv.pop(1)) requirements_darwin = parse_str_none(sys.argv.pop(1)) requirements_windows = parse_str_none(sys.argv.pop(1)) - pip_installation_report = parse_str_none(sys.argv.pop(1)) + intermediate_file = parse_str_none(sys.argv.pop(1)) + config_setting = parse_str_none(sys.argv.pop(1)) update_target_label = sys.argv.pop(1) resolved_requirements_in = _locate(bazel_runfiles, requirements_in) @@ -134,8 +174,8 @@ def run_pip(requirements_in, requirements_txt, pip_installation_report): # Note: Windows cannot reference generated files without runfiles support enabled. requirements_in_relative = requirements_in[len(repository_prefix) :] requirements_txt_relative = requirements_txt[len(repository_prefix) :] - if pip_installation_report: - pip_installation_report_relative = pip_installation_report[len(repository_prefix) :] + if intermediate_file: + pip_installation_report_relative = intermediate_file[len(repository_prefix) :] # Before loading click, set the locale for its parser. # If it leaks through to the system setting, it may fail: @@ -145,6 +185,7 @@ def run_pip(requirements_in, requirements_txt, pip_installation_report): os.environ["LC_ALL"] = "C.UTF-8" os.environ["LANG"] = "C.UTF-8" + print("Maybe updating!!!!") UPDATE = True # Detect if we are running under `bazel test`. if "TEST_TMPDIR" in os.environ: @@ -170,25 +211,14 @@ def run_pip(requirements_in, requirements_txt, pip_installation_report): os.environ["CUSTOM_COMPILE_COMMAND"] = update_command os.environ["PIP_CONFIG_FILE"] = os.getenv("PIP_CONFIG_FILE") or os.devnull - if pip_installation_report: - sys.exit(run_pip(requirements_in_relative - if Path(requirements_in_relative).exists() - else resolved_requirements_in, - requirements_txt_relative, - pip_installation_report_relative)) - sys.argv.append("--generate-hashes") sys.argv.append("--output-file") sys.argv.append(requirements_txt_relative if UPDATE else requirements_out) - if pip_installation_report: - sys.argv.append("--pip-args") - sys.argv.append(f"--report={pip_installation_report_relative}") sys.argv.append( requirements_in_relative if Path(requirements_in_relative).exists() else resolved_requirements_in ) - print(sys.argv) if UPDATE: print("Updating " + requirements_txt_relative) @@ -204,11 +234,25 @@ def run_pip(requirements_in, requirements_txt, pip_installation_report): resolved_requirements_txt, requirements_txt_tree ) ) - cli() + try: + cli() + except SystemExit as e: + if e.code != 0: + raise requirements_txt_relative_path = Path(requirements_txt_relative) content = requirements_txt_relative_path.read_text() content = content.replace(absolute_path_prefix, "") requirements_txt_relative_path.write_text(content) + + if intermediate_file: + print("Generating an intermediate file.") + # Feed the output of pip-compile into the installation report + # generation. + sys.exit(run_pip(config_setting, requirements_txt_relative_path, + Path(pip_installation_report_relative))) + else: + print("Not generating an intermediate file!!!") + else: # cli will exit(0) on success try: From 327ba26b0f3804baf9535c34d280a78accf3f9f3 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 2 Jul 2023 21:49:28 -0700 Subject: [PATCH 08/96] Combine the intermediate files --- examples/pypi_install/WORKSPACE | 24 +++++++-------- python/private/intermediate_pypi_install.bzl | 32 ++++++++++---------- python/pypi.bzl | 4 +-- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index f832db7799..bca493fde4 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -21,15 +21,15 @@ python_register_toolchains( load("@python39//:defs.bzl", "interpreter") load("@rules_python//python:pypi.bzl", "pypi_install") -#pypi_install( -# name = "pypi_install", -# pip_installation_report = { -# "@//:x86_64_linux": "//:intermediate_file_x86_64_linux.json", -# }, -#) -# -#load("@pypi_install//:packages.bzl", "load_pypi_packages") -# -#load_pypi_packages( -# name = "pypi", -#) +pypi_install( + name = "pypi_install", + pip_installation_report = { + "@//:x86_64_linux": "//:intermediate_file_x86_64_linux.json", + }, +) + +load("@pypi_install//:packages.bzl", "load_pypi_packages") + +load_pypi_packages( + name = "pypi", +) diff --git a/python/private/intermediate_pypi_install.bzl b/python/private/intermediate_pypi_install.bzl index dfc23786c5..a610337efb 100644 --- a/python/private/intermediate_pypi_install.bzl +++ b/python/private/intermediate_pypi_install.bzl @@ -1,22 +1,22 @@ -def convert_installation_reports_to_intermediate(repository_ctx, installation_reports): - intermediate = {} +def combine_intermediate_files(repository_ctx, installation_reports): + combined = {} - for report_label, config_setting in installation_reports.items(): - report = json.decode(repository_ctx.read(report_label)) - for install in report["install"]: - download_info = install["download_info"] - metadata = install["metadata"] - name = metadata["name"] + for intermediate_label, config_setting in installation_reports.items(): + intermediate = json.decode(repository_ctx.read(intermediate_label)) + for package in intermediate: + config_settings = intermediate[package].keys() + if len(config_settings) != 1: + fail("Expected 1 config setting for package %s in %s, but got %d." \ + % (package, intermediate_label, len(config_settings))) + config_setting = config_settings[0] - info = intermediate.setdefault(name, {}).setdefault(config_setting, {}) - info["url"] = download_info["url"] - hash = download_info["archive_info"].get("hash", "") - if hash and hash.startswith("sha256="): - info["sha256"] = hash.split("=", 1)[1] - else: - fail("unknown integrity check: " + str(download_info["archive_info"])) + info = combined.setdefault(package, {}) + if config_setting in info: + fail("Two intermediate files have the same config setting for package %s in %s." \ + % (package, intermediate_label)) + info[config_setting] = intermediate[package][config_setting] - return intermediate + return combined def generate_pypi_package_load(repository_ctx): lines = [ diff --git a/python/pypi.bzl b/python/pypi.bzl index f626f969df..6004ac9fa4 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -1,5 +1,5 @@ load("//python/pip_install:repositories.bzl", "pip_install_dependencies") -load("//python/private:intermediate_pypi_install.bzl", "convert_installation_reports_to_intermediate", "generate_pypi_package_load") +load("//python/private:intermediate_pypi_install.bzl", "combine_intermediate_files", "generate_pypi_package_load") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") load("@bazel_skylib//lib:paths.bzl", "paths") @@ -15,7 +15,7 @@ def _pypi_install_impl(repository_ctx): repository_ctx.file("BUILD.bazel", """\ """, executable = False) if repository_ctx.attr.pip_installation_report: - intermediate = convert_installation_reports_to_intermediate( + intermediate = combine_intermediate_files( repository_ctx, repository_ctx.attr.pip_installation_report) else: From 050d33837da83a1b8d1f23407817de8e99f42734 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 3 Jul 2023 13:34:05 -0700 Subject: [PATCH 09/96] Start generating aliases Still need to switch over to pointing at the py_library targets. Right now I started writing them as pointing to the http_file targets. --- python/private/intermediate_pypi_install.bzl | 9 +++-- python/pypi.bzl | 41 +++++++++++++++++++- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/python/private/intermediate_pypi_install.bzl b/python/private/intermediate_pypi_install.bzl index a610337efb..a2b40e335a 100644 --- a/python/private/intermediate_pypi_install.bzl +++ b/python/private/intermediate_pypi_install.bzl @@ -20,10 +20,13 @@ def combine_intermediate_files(repository_ctx, installation_reports): def generate_pypi_package_load(repository_ctx): lines = [ - """load("@rules_python//python:pypi.bzl", _load_pypi_packages_internal="load_pypi_packages_internal")""", + """load("@rules_python//python:pypi.bzl",""", + """ _load_pypi_packages_internal="load_pypi_packages_internal",""", + """ _generate_package_aliases="generate_package_aliases_internal",""", + """)""", """load("@{}//:intermediate.bzl", "INTERMEDIATE")""".format(repository_ctx.name), - """def load_pypi_packages(**kwargs):""", + """def load_pypi_packages(name, **kwargs):""", """ _load_pypi_packages_internal(INTERMEDIATE, **kwargs)""", + """ _generate_package_aliases(name=name, intermediate="@{}//:intermediate.bzl", **kwargs)""".format(repository_ctx.name), ] repository_ctx.file("packages.bzl", "\n".join(lines), executable=False) - diff --git a/python/pypi.bzl b/python/pypi.bzl index 6004ac9fa4..1e703eb2a0 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -37,7 +37,7 @@ _pypi_install = repository_rule( }, ) -def load_pypi_packages_internal(intermediate, name, **kwargs): +def load_pypi_packages_internal(intermediate, **kwargs): # Only download a wheel/tarball once. We do this by tracking which SHA sums # we've downloaded already. sha_indexed_infos = {} @@ -50,6 +50,45 @@ def load_pypi_packages_internal(intermediate, name, **kwargs): # set()? sha_indexed_infos[info["sha256"]] = True +def _generate_package_aliases_internal_impl(repository_ctx): + bzl_intermediate = repository_ctx.read(repository_ctx.path(repository_ctx.attr.intermediate)) + if not bzl_intermediate.startswith("INTERMEDIATE = "): + fail("Expected intermediate.bzl to start with 'INTERMEDIATE = '. Did the implementation get out of sync?") + intermediate = json.decode(bzl_intermediate[len("INTERMEDIATE = "):]) + + for package in intermediate: + lines = [ + """load("{}", "INTERMEDIATE")""".format(repository_ctx.attr.intermediate), + """load("@rules_python//python:pypi.bzl", _generate_package_alias="generate_package_alias")""", + """_generate_package_alias(INTERMEDIATE)""", + ] + repository_ctx.file("{}/BUILD".format(package), "\n".join(lines), executable=False) + +_generate_package_aliases_internal = repository_rule( + implementation = _generate_package_aliases_internal_impl, + attrs = { + "intermediate": attr.label( + allow_single_file = True, + ), + }, +) + +def generate_package_aliases_internal(**kwargs): + _generate_package_aliases_internal(**kwargs) + + +def generate_package_alias(intermediate): + package = native.package_name() + if package not in intermediate: + fail("Failed to find {} in the intermediate file. Something went wrong internally.") + + info_per_config = intermediate[package] + actual_select = {} + for config, info in info_per_config.items(): + repo_name = _generate_repo_name_for_download(package, info) + # TODO(phil): Point at the py_library, not the http_file. + actual_select[config] = "@{}//:library".format(repo_name) + def _generate_repo_name_for_download(package, info): # TODO(phil): Can we make it more human readable by avoiding the checksum? From 1f43e702d2212493a58a7b4fa99c1f2c293e41b9 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 3 Jul 2023 18:01:44 -0700 Subject: [PATCH 10/96] Aliases are working $ bazel query --output=build @pypi//... --- python/pypi.bzl | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/python/pypi.bzl b/python/pypi.bzl index 1e703eb2a0..ce35e7ad02 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -50,6 +50,10 @@ def load_pypi_packages_internal(intermediate, **kwargs): # set()? sha_indexed_infos[info["sha256"]] = True + # TODO(phil): Can we add target_compatible_with information + # here? + _generate_py_library(package, info) + def _generate_package_aliases_internal_impl(repository_ctx): bzl_intermediate = repository_ctx.read(repository_ctx.path(repository_ctx.attr.intermediate)) if not bzl_intermediate.startswith("INTERMEDIATE = "): @@ -84,15 +88,29 @@ def generate_package_alias(intermediate): info_per_config = intermediate[package] actual_select = {} + target_compatible_with_select = { + "//conditions:default": ["@platforms//:incompatible"], + } for config, info in info_per_config.items(): - repo_name = _generate_repo_name_for_download(package, info) - # TODO(phil): Point at the py_library, not the http_file. + repo_name = _generate_repo_name_for_extracted_wheel(package, info) actual_select[config] = "@{}//:library".format(repo_name) + target_compatible_with_select[config] = [] + + native.alias( + name = "package", + actual = select(actual_select), + # TODO(phil): Validate that this works in bazel 5. Do we care? + target_compatible_with = select(target_compatible_with_select), + ) def _generate_repo_name_for_download(package, info): # TODO(phil): Can we make it more human readable by avoiding the checksum? - return "pypi_extracted_download_{}_{}".format(package, info["sha256"]) + return "pypi_download_{}_{}".format(package, info["sha256"]) + +def _generate_repo_name_for_extracted_wheel(package, info): + # TODO(phil): Can we make it more human readable by avoiding the checksum? + return "pypi_extracted_wheel_{}_{}".format(package, info["sha256"]) def _generate_http_file(package, info): @@ -104,3 +122,28 @@ def _generate_http_file(package, info): sha256 = info["sha256"], downloaded_file_path = paths.basename(info["url"]), ) + +def _generate_py_library(package, info): + _wheel_library( + name = _generate_repo_name_for_extracted_wheel(package, info), + wheel_repo_name = _generate_repo_name_for_download(package, info), + ) + +def _wheel_library_impl(repository_ctx): + lines = [ + """load("//python/private:wheel_library.bzl", "pycross_wheel_library")""", + """pycross_wheel_library(""", + """ name = "library",""", + """ wheel = "@{}//file",""".format(repository_ctx.attr.wheel_repo_name), + """ enable_implicit_namespace_pkgs = True,""", + # TODO(phil): Add deps here. + """)""", + ] + repository_ctx.file("BUILD", "\n".join(lines), executable=False) + +_wheel_library = repository_rule( + implementation = _wheel_library_impl, + attrs = { + "wheel_repo_name": attr.string(), + }, +) From 97718ebcf0ae22e73fc168b3350935dd4a466ee2 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 3 Jul 2023 18:09:06 -0700 Subject: [PATCH 11/96] Wheel are now extracted --- examples/pypi_install/BUILD.bazel | 6 +++--- .../pypi_install/intermediate_file_x86_64_linux.json | 10 +++++----- python/private/BUILD.bazel | 1 + python/private/wheel_installer.py | 1 + python/pypi.bzl | 6 ++++-- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index db8b414c50..d5e0ed5060 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -11,7 +11,7 @@ py_binary( name = "main", srcs = ["main.py"], deps = [ - #"@pypi//requests", + "@pypi//requests", ], ) @@ -27,10 +27,10 @@ compile_pip_requirements( extra_args = ["--allow-unsafe"], requirements_in = "requirements.in", requirements_txt = { - ":x86_64_linux": "requirements_lock_x86_64_linux.txt", + "@//:x86_64_linux": "requirements_lock_x86_64_linux.txt", }, intermediate_file = { - ":x86_64_linux": "intermediate_file_x86_64_linux.json", + "@//:x86_64_linux": "intermediate_file_x86_64_linux.json", }, ) diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index d7425d610e..89cfbaa71e 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -1,30 +1,30 @@ { "certifi": { - ":x86_64_linux": { + "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" } }, "charset-normalizer": { - ":x86_64_linux": { + "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", "sha256": "21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706" } }, "idna": { - ":x86_64_linux": { + "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" } }, "requests": { - ":x86_64_linux": { + "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", "sha256": "58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f" } }, "urllib3": { - ":x86_64_linux": { + "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/8a/03/ad9306a50d05c166e3456fe810f33cee2b8b2a7a6818ec5d4908c4ec6b36/urllib3-2.0.3-py3-none-any.whl", "sha256": "48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1" } diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 022a1ba24c..c62ab10c3a 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -88,4 +88,5 @@ py_binary( deps = [ "@pypi__installer//:lib", ], + visibility = ["//visibility:public"], ) diff --git a/python/private/wheel_installer.py b/python/private/wheel_installer.py index 4092e0a605..8016cdc509 100644 --- a/python/private/wheel_installer.py +++ b/python/private/wheel_installer.py @@ -8,6 +8,7 @@ import argparse import os import shutil +import sys import tempfile from pathlib import Path from typing import Any diff --git a/python/pypi.bzl b/python/pypi.bzl index ce35e7ad02..cd2dc81292 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -97,10 +97,11 @@ def generate_package_alias(intermediate): target_compatible_with_select[config] = [] native.alias( - name = "package", + name = package, actual = select(actual_select), # TODO(phil): Validate that this works in bazel 5. Do we care? target_compatible_with = select(target_compatible_with_select), + visibility = ["//visibility:public"], ) @@ -131,11 +132,12 @@ def _generate_py_library(package, info): def _wheel_library_impl(repository_ctx): lines = [ - """load("//python/private:wheel_library.bzl", "pycross_wheel_library")""", + """load("@rules_python//python/private:wheel_library.bzl", "pycross_wheel_library")""", """pycross_wheel_library(""", """ name = "library",""", """ wheel = "@{}//file",""".format(repository_ctx.attr.wheel_repo_name), """ enable_implicit_namespace_pkgs = True,""", + """ visibility = ["//visibility:public"],""", # TODO(phil): Add deps here. """)""", ] From 99e49242131224f7d599d32488a23f3c9c42a7a4 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 9 Jul 2023 23:04:38 -0700 Subject: [PATCH 12/96] Add support for deps --- python/pip_install/requirements.bzl | 1 + .../dependency_resolver.py | 19 +++++++++++++++++++ python/pypi.bzl | 4 ++++ 3 files changed, 24 insertions(+) diff --git a/python/pip_install/requirements.bzl b/python/pip_install/requirements.bzl index 40c8ce6045..4f77141a91 100644 --- a/python/pip_install/requirements.bzl +++ b/python/pip_install/requirements.bzl @@ -117,6 +117,7 @@ def compile_pip_requirements( requirement("build"), requirement("click"), requirement("colorama"), + requirement("packaging"), requirement("pep517"), requirement("pip"), requirement("pip_tools"), diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index 7221bcdf11..631ff0f2ec 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -24,6 +24,7 @@ import pip import pip._internal.cli.main +from packaging.requirements import Requirement import piptools.writer as piptools_writer from piptools.scripts.compile import cli @@ -90,6 +91,10 @@ def _post_process_installation_report( with raw_installation_report.open() as file: report = json.load(file) + json.dump(report, sys.stdout, indent=4) + + environment = report["environment"] + intermediate = {} for install in report["install"]: @@ -105,6 +110,20 @@ def _post_process_installation_report( else: raise ValueError("unknown integrity check: " + str(download_info["archive_info"])) + + extras = install.get("_rules_python_extras", []) + + deps = [] + for raw_requirement in metadata.get("requires_dist", []): + requirement = Requirement(raw_requirement) + if requirement.extras and requirement.extras not in extras: + continue + if requirement.marker and not requirement.marker.evaluate(environment): + continue + deps.append(requirement.name) + + info["deps"] = sorted(deps) + with intermediate_file.open("w") as file: json.dump(intermediate, file, indent=4) file.write("\n") diff --git a/python/pypi.bzl b/python/pypi.bzl index cd2dc81292..2661e3ec1d 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -128,15 +128,18 @@ def _generate_py_library(package, info): _wheel_library( name = _generate_repo_name_for_extracted_wheel(package, info), wheel_repo_name = _generate_repo_name_for_download(package, info), + deps = info["deps"], ) def _wheel_library_impl(repository_ctx): + deps = ['"{dep}"' % dep for dep in deps] lines = [ """load("@rules_python//python/private:wheel_library.bzl", "pycross_wheel_library")""", """pycross_wheel_library(""", """ name = "library",""", """ wheel = "@{}//file",""".format(repository_ctx.attr.wheel_repo_name), """ enable_implicit_namespace_pkgs = True,""", + """ deps = [{}],""".format(deps), """ visibility = ["//visibility:public"],""", # TODO(phil): Add deps here. """)""", @@ -147,5 +150,6 @@ _wheel_library = repository_rule( implementation = _wheel_library_impl, attrs = { "wheel_repo_name": attr.string(), + "deps": attr.string_list(), }, ) From 39e2a7c190799528097988670c8890be22ba149f Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 9 Jul 2023 23:05:37 -0700 Subject: [PATCH 13/96] regenerate intermediate file --- .../intermediate_file_x86_64_linux.json | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index 89cfbaa71e..6328fc104b 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -2,31 +2,41 @@ "certifi": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", - "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716", + "deps": [] } }, "charset-normalizer": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706" + "sha256": "21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", + "deps": [] } }, "idna": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", - "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", + "deps": [] } }, "requests": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", - "sha256": "58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f" + "sha256": "58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "deps": [ + "certifi", + "charset-normalizer", + "idna", + "urllib3" + ] } }, "urllib3": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/8a/03/ad9306a50d05c166e3456fe810f33cee2b8b2a7a6818ec5d4908c4ec6b36/urllib3-2.0.3-py3-none-any.whl", - "sha256": "48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1" + "sha256": "48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1", + "deps": [] } } } From cd2325e01b8b909de6e5fa0348d6022297770c72 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 9 Jul 2023 23:09:42 -0700 Subject: [PATCH 14/96] fix issues with version --- examples/pypi_install/main.py | 2 ++ python/private/intermediate_pypi_install.bzl | 2 +- python/pypi.bzl | 12 +++++++----- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/pypi_install/main.py b/examples/pypi_install/main.py index 80610f42a1..016c58b90d 100644 --- a/examples/pypi_install/main.py +++ b/examples/pypi_install/main.py @@ -17,3 +17,5 @@ def version(): return requests.__version__ + +print(version()) diff --git a/python/private/intermediate_pypi_install.bzl b/python/private/intermediate_pypi_install.bzl index a2b40e335a..2b07580802 100644 --- a/python/private/intermediate_pypi_install.bzl +++ b/python/private/intermediate_pypi_install.bzl @@ -26,7 +26,7 @@ def generate_pypi_package_load(repository_ctx): """)""", """load("@{}//:intermediate.bzl", "INTERMEDIATE")""".format(repository_ctx.name), """def load_pypi_packages(name, **kwargs):""", - """ _load_pypi_packages_internal(INTERMEDIATE, **kwargs)""", + """ _load_pypi_packages_internal(INTERMEDIATE, alias_repo_name=name, **kwargs)""", """ _generate_package_aliases(name=name, intermediate="@{}//:intermediate.bzl", **kwargs)""".format(repository_ctx.name), ] repository_ctx.file("packages.bzl", "\n".join(lines), executable=False) diff --git a/python/pypi.bzl b/python/pypi.bzl index 2661e3ec1d..198798af22 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -37,7 +37,7 @@ _pypi_install = repository_rule( }, ) -def load_pypi_packages_internal(intermediate, **kwargs): +def load_pypi_packages_internal(intermediate, alias_repo_name, **kwargs): # Only download a wheel/tarball once. We do this by tracking which SHA sums # we've downloaded already. sha_indexed_infos = {} @@ -52,7 +52,7 @@ def load_pypi_packages_internal(intermediate, **kwargs): # TODO(phil): Can we add target_compatible_with information # here? - _generate_py_library(package, info) + _generate_py_library(package, alias_repo_name, info) def _generate_package_aliases_internal_impl(repository_ctx): bzl_intermediate = repository_ctx.read(repository_ctx.path(repository_ctx.attr.intermediate)) @@ -124,22 +124,23 @@ def _generate_http_file(package, info): downloaded_file_path = paths.basename(info["url"]), ) -def _generate_py_library(package, info): +def _generate_py_library(package, alias_repo_name, info): _wheel_library( name = _generate_repo_name_for_extracted_wheel(package, info), + alias_repo_name = alias_repo_name, wheel_repo_name = _generate_repo_name_for_download(package, info), deps = info["deps"], ) def _wheel_library_impl(repository_ctx): - deps = ['"{dep}"' % dep for dep in deps] + deps = ['"@{}//{}"'.format(repository_ctx.attr.alias_repo_name, dep) for dep in repository_ctx.attr.deps] lines = [ """load("@rules_python//python/private:wheel_library.bzl", "pycross_wheel_library")""", """pycross_wheel_library(""", """ name = "library",""", """ wheel = "@{}//file",""".format(repository_ctx.attr.wheel_repo_name), """ enable_implicit_namespace_pkgs = True,""", - """ deps = [{}],""".format(deps), + """ deps = [{}],""".format(",".join(deps)), """ visibility = ["//visibility:public"],""", # TODO(phil): Add deps here. """)""", @@ -149,6 +150,7 @@ def _wheel_library_impl(repository_ctx): _wheel_library = repository_rule( implementation = _wheel_library_impl, attrs = { + "alias_repo_name": attr.string(), "wheel_repo_name": attr.string(), "deps": attr.string_list(), }, From 9074c6c71a4c1fcbc9edb3cd75470afa831cd4e6 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 30 Jul 2023 14:55:53 -0700 Subject: [PATCH 15/96] Resolve merge conflict --- .../tools/dependency_resolver/dependency_resolver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index cf0b6d4f9a..11c1fba965 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -271,7 +271,7 @@ def run_pip(config_setting, requirements_in, intermediate_file): print("Generating an intermediate file.") # Feed the output of pip-compile into the installation report # generation. - sys.exit(run_pip(config_setting, requirements_txt_relative_path, + sys.exit(run_pip(config_setting, requirements_file_relative_path, Path(pip_installation_report_relative))) else: print("Not generating an intermediate file!!!") From 8fcf5cc64d78be4c5986652cf0a8cf79a3c3e4dc Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 30 Jul 2023 15:03:21 -0700 Subject: [PATCH 16/96] Import some wheels to get transitive deps with extras working. --- .../intermediate_file_x86_64_linux.json | 75 +++++++++++ examples/pypi_install/requirements.in | 4 + .../requirements_lock_x86_64_linux.txt | 121 ++++++++++++++++++ 3 files changed, 200 insertions(+) diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index 6328fc104b..5e56b4a4f1 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -6,6 +6,15 @@ "deps": [] } }, + "cffi": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/2d/86/3ca57cddfa0419f6a95d1c8478f8f622ba597e3581fd501bbb915b20eb75/cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", + "deps": [ + "pycparser" + ] + } + }, "charset-normalizer": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", @@ -13,6 +22,31 @@ "deps": [] } }, + "cognitojwt": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/a5/69/97faafdc4f1900fa1b525cedae0f98aa30b0bb086d076f8d66c68a18b1b2/cognitojwt-1.4.1-py3-none-any.whl", + "sha256": "8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce", + "deps": [] + } + }, + "cryptography": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/1a/c7/b8193a0859fed883738ae99d33fe90edf05c7e3d0fdb1726f8f53d85859e/cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", + "sha256": "49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", + "deps": [ + "cffi" + ] + } + }, + "ecdsa": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/09/d4/4f05f5d16a4863b30ba96c23b23e942da8889abfa1cdbabf2a0df12a4532/ecdsa-0.18.0-py2.py3-none-any.whl", + "sha256": "80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd", + "deps": [ + "six" + ] + } + }, "idna": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", @@ -20,6 +54,31 @@ "deps": [] } }, + "pyasn1": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/14/e5/b56a725cbde139aa960c26a1a3ca4d4af437282e20b5314ee6a3501e7dfc/pyasn1-0.5.0-py2.py3-none-any.whl", + "sha256": "87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57", + "deps": [] + } + }, + "pycparser": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl", + "sha256": "8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "deps": [] + } + }, + "python-jose": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/bd/2d/e94b2f7bab6773c70efc70a61d66e312e1febccd9e0db6b9e0adf58cbad1/python_jose-3.3.0-py2.py3-none-any.whl", + "sha256": "9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a", + "deps": [ + "ecdsa", + "pyasn1", + "rsa" + ] + } + }, "requests": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", @@ -32,6 +91,22 @@ ] } }, + "rsa": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", + "sha256": "90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", + "deps": [ + "pyasn1" + ] + } + }, + "six": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", + "sha256": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", + "deps": [] + } + }, "urllib3": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/8a/03/ad9306a50d05c166e3456fe810f33cee2b8b2a7a6818ec5d4908c4ec6b36/urllib3-2.0.3-py3-none-any.whl", diff --git a/examples/pypi_install/requirements.in b/examples/pypi_install/requirements.in index f2293605cf..1ec713a172 100644 --- a/examples/pypi_install/requirements.in +++ b/examples/pypi_install/requirements.in @@ -1 +1,5 @@ +# Dependency which specifies at least one extra in its dependencies. +cognitojwt + +# Common dependency whose functionality is easy to validate. requests diff --git a/examples/pypi_install/requirements_lock_x86_64_linux.txt b/examples/pypi_install/requirements_lock_x86_64_linux.txt index 9dd738ce1d..c339139b9d 100644 --- a/examples/pypi_install/requirements_lock_x86_64_linux.txt +++ b/examples/pypi_install/requirements_lock_x86_64_linux.txt @@ -8,6 +8,72 @@ certifi==2023.5.7 \ --hash=sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7 \ --hash=sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716 # via requests +cffi==1.15.1 \ + --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ + --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ + --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ + --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ + --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ + --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ + --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ + --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ + --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ + --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ + --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ + --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ + --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ + --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ + --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ + --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ + --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ + --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ + --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ + --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ + --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ + --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ + --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ + --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ + --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ + --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ + --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ + --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ + --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ + --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ + --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ + --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ + --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ + --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ + --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ + --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ + --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ + --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ + --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ + --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ + --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ + --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ + --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ + --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ + --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ + --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ + --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ + --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ + --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ + --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ + --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ + --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ + --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ + --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ + --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ + --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ + --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ + --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ + --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ + --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ + --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ + --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ + --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ + --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 + # via cryptography charset-normalizer==3.1.0 \ --hash=sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6 \ --hash=sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1 \ @@ -85,14 +151,69 @@ charset-normalizer==3.1.0 \ --hash=sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df \ --hash=sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab # via requests +cognitojwt==1.4.1 \ + --hash=sha256:8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce \ + --hash=sha256:a9f751942517ecf85da9f14674749390aad268e4b0155ef7d133aa50800aa15a + # via -r requirements.in +cryptography==41.0.2 \ + --hash=sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711 \ + --hash=sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7 \ + --hash=sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd \ + --hash=sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e \ + --hash=sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58 \ + --hash=sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0 \ + --hash=sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d \ + --hash=sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83 \ + --hash=sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831 \ + --hash=sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766 \ + --hash=sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b \ + --hash=sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c \ + --hash=sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182 \ + --hash=sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f \ + --hash=sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa \ + --hash=sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4 \ + --hash=sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a \ + --hash=sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2 \ + --hash=sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76 \ + --hash=sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5 \ + --hash=sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee \ + --hash=sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f \ + --hash=sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14 + # via python-jose +ecdsa==0.18.0 \ + --hash=sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49 \ + --hash=sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd + # via python-jose idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 # via requests +pyasn1==0.5.0 \ + --hash=sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57 \ + --hash=sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde + # via + # python-jose + # rsa +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via cffi +python-jose[cryptography]==3.3.0 \ + --hash=sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a \ + --hash=sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a + # via cognitojwt requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 # via -r requirements.in +rsa==4.9 \ + --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ + --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 + # via python-jose +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via ecdsa urllib3==2.0.3 \ --hash=sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1 \ --hash=sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825 From 4dfd766c34a556775977f65c1a029d0b2b1cb588 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 30 Jul 2023 16:02:31 -0700 Subject: [PATCH 17/96] Make dependencies' deps work properly --- .../intermediate_file_x86_64_linux.json | 5 ++- .../dependency_resolver.py | 31 ++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index 5e56b4a4f1..9f866a92a7 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -26,7 +26,9 @@ "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/a5/69/97faafdc4f1900fa1b525cedae0f98aa30b0bb086d076f8d66c68a18b1b2/cognitojwt-1.4.1-py3-none-any.whl", "sha256": "8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce", - "deps": [] + "deps": [ + "python-jose" + ] } }, "cryptography": { @@ -73,6 +75,7 @@ "url": "https://files.pythonhosted.org/packages/bd/2d/e94b2f7bab6773c70efc70a61d66e312e1febccd9e0db6b9e0adf58cbad1/python_jose-3.3.0-py2.py3-none-any.whl", "sha256": "9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a", "deps": [ + "cryptography", "ecdsa", "pyasn1", "rsa" diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index 11c1fba965..ea4df7596b 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -21,10 +21,12 @@ import sys import tempfile from pathlib import Path +from typing import Mapping import pip import pip._internal.cli.main from packaging.requirements import Requirement +from packaging.markers import Marker import piptools.writer as piptools_writer from piptools.scripts.compile import cli @@ -83,6 +85,12 @@ def _locate(bazel_runfiles, file): return bazel_runfiles.Rlocation(file) +def _evaluate_marker(marker: Marker, environment: Mapping[str, str], extra: str): + environment_copy = environment.copy() + environment_copy["extra"] = extra + return marker.evaluate(environment_copy) + + def _post_process_installation_report( config_setting: str, raw_installation_report: Path, @@ -91,7 +99,7 @@ def _post_process_installation_report( with raw_installation_report.open() as file: report = json.load(file) - json.dump(report, sys.stdout, indent=4) + #json.dump(report, sys.stdout, indent=4) environment = report["environment"] @@ -110,16 +118,20 @@ def _post_process_installation_report( else: raise ValueError("unknown integrity check: " + str(download_info["archive_info"])) - - extras = install.get("_rules_python_extras", []) + extras = install.get("requested_extras", []) + [""] deps = [] for raw_requirement in metadata.get("requires_dist", []): requirement = Requirement(raw_requirement) - if requirement.extras and requirement.extras not in extras: - continue - if requirement.marker and not requirement.marker.evaluate(environment): - continue + # TODO(phil): Is there a way to evaluate against all requested + # extras at once? + if requirement.marker: + if not any(_evaluate_marker(requirement.marker, environment, extra) for extra in extras): + continue + # TODO(phil): Look at requirement.extras and pull in that + # dependency's extra variant. This requires us to expose libraries + # with those extra variants. For now just pull in the library + # assuming that it provides all requested extras. deps.append(requirement.name) info["deps"] = sorted(deps) @@ -209,7 +221,6 @@ def run_pip(config_setting, requirements_in, intermediate_file): os.environ["LC_ALL"] = "C.UTF-8" os.environ["LANG"] = "C.UTF-8" - print("Maybe updating!!!!") UPDATE = True # Detect if we are running under `bazel test`. if "TEST_TMPDIR" in os.environ: @@ -274,15 +285,13 @@ def run_pip(config_setting, requirements_in, intermediate_file): sys.exit(run_pip(config_setting, requirements_file_relative_path, Path(pip_installation_report_relative))) else: - print("Not generating an intermediate file!!!") + print("Not generating an intermediate file.") requirements_file_relative_path.write_text(content) else: # cli will exit(0) on success try: - print("Checking " + requirements_file) cli() - print("cli() should exit", file=sys.stderr) sys.exit(1) except SystemExit as e: if e.code == 2: From b0c9d33e6b019b4492412efa85c1ba8739fd2b85 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 30 Jul 2023 16:25:52 -0700 Subject: [PATCH 18/96] Add a basic test --- examples/pypi_install/BUILD.bazel | 18 ++++++++++++++++++ examples/pypi_install/main.py | 11 ++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index d5e0ed5060..9509979d69 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -12,6 +12,7 @@ py_binary( srcs = ["main.py"], deps = [ "@pypi//requests", + "@pypi//cognitojwt", ], ) @@ -41,3 +42,20 @@ config_setting( "@platforms//os:linux", ], ) + +genquery( + name = "cognitojwt_deps", + expression = """filter(@pypi//, kind(".* rule", deps(@pypi//cognitojwt)))""", + scope = ["@pypi//cognitojwt"], + opts = [ + "--notool_deps", + ], +) + +sh_test( + name = "cognitojwt_deps_test", + srcs = ["cognitojwt_deps_test.sh"], + data = [ + ":cognitojwt_deps", + ], +) diff --git a/examples/pypi_install/main.py b/examples/pypi_install/main.py index 016c58b90d..431b6081d2 100644 --- a/examples/pypi_install/main.py +++ b/examples/pypi_install/main.py @@ -12,10 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. +import sys + +import cognitojwt import requests -def version(): - return requests.__version__ +def main(argv): + print(f"cognitojwt version: {requests.__version__}") + print(f"requests version: {requests.__version__}") -print(version()) +if __name__ == "__main__": + sys.exit(main(sys.argv)) From 943867212cee7dad115f47b79694f6bdf53d7306 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 6 Aug 2023 15:34:34 -0700 Subject: [PATCH 19/96] fix test --- examples/pypi_install/main.py | 12 +++++++++--- examples/pypi_install/test.py | 3 ++- .../tools/dependency_resolver/dependency_resolver.py | 5 +++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/examples/pypi_install/main.py b/examples/pypi_install/main.py index 431b6081d2..fbf320bcbd 100644 --- a/examples/pypi_install/main.py +++ b/examples/pypi_install/main.py @@ -14,13 +14,19 @@ import sys -import cognitojwt +import pkg_resources import requests +def cognitojwt_version() -> str: + return pkg_resources.require("cognitojwt")[0].version + +def requests_version() -> str: + return requests.__version__ + def main(argv): - print(f"cognitojwt version: {requests.__version__}") - print(f"requests version: {requests.__version__}") + print(f"cognitojwt version: {cognitojwt_version()}") + print(f"requests version: {requests_version()}") if __name__ == "__main__": sys.exit(main(sys.argv)) diff --git a/examples/pypi_install/test.py b/examples/pypi_install/test.py index 2dc3046319..8a461915c8 100644 --- a/examples/pypi_install/test.py +++ b/examples/pypi_install/test.py @@ -19,7 +19,8 @@ class ExampleTest(unittest.TestCase): def test_main(self): - self.assertEqual("2.25.1", main.version()) + self.assertEqual("1.4.1", main.cognitojwt_version()) + self.assertEqual("2.31.0", main.requests_version()) if __name__ == "__main__": diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index ea4df7596b..c8f11688a9 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -141,7 +141,8 @@ def _post_process_installation_report( file.write("\n") -def run_pip(config_setting, requirements_in, intermediate_file): +def _generate_intermediate_file(config_setting, requirements_in, intermediate_file): + """Generates an intermediate file from the installation report.""" with tempfile.TemporaryDirectory() as temp_dir: raw_installation_report = Path(temp_dir) / "installation_report.json" sys.argv = [ @@ -282,7 +283,7 @@ def run_pip(config_setting, requirements_in, intermediate_file): print("Generating an intermediate file.") # Feed the output of pip-compile into the installation report # generation. - sys.exit(run_pip(config_setting, requirements_file_relative_path, + sys.exit(_generate_intermediate_file(config_setting, requirements_file_relative_path, Path(pip_installation_report_relative))) else: print("Not generating an intermediate file.") From 93ac73cc54021f2989f7269661cd6a2933628a1b Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 6 Aug 2023 16:19:58 -0700 Subject: [PATCH 20/96] fix distribution for integration tests. --- python/config_settings/BUILD.bazel | 1 + python/config_settings/private/BUILD.bazel | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index 272ba78f1f..ab4ee8d880 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -5,6 +5,7 @@ filegroup( name = "distribution", srcs = glob(["*.bzl"]) + [ "BUILD.bazel", + "//python/config_settings/private:distribution", ], visibility = ["//python:__pkg__"], ) diff --git a/python/config_settings/private/BUILD.bazel b/python/config_settings/private/BUILD.bazel index e69de29bb2..aa68c6508c 100644 --- a/python/config_settings/private/BUILD.bazel +++ b/python/config_settings/private/BUILD.bazel @@ -0,0 +1,7 @@ +filegroup( + name = "distribution", + srcs = glob(["*.bzl"]) + [ + "BUILD.bazel", + ], + visibility = ["//python/config_settings:__pkg__"], +) From 09e030f4568458940c0102fa27bd374f21efe904 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 6 Aug 2023 16:39:14 -0700 Subject: [PATCH 21/96] clean up a bit --- examples/pypi_install/BUILD.bazel | 8 ++------ python/pip_install/requirements.bzl | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index 9509979d69..da9aaee7f7 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -1,9 +1,3 @@ -#load( -# "@pypi//:requirements.bzl", -# "data_requirement", -# "dist_info_requirement", -# "entry_point", -#) load("@rules_python//python:defs.bzl", "py_binary", "py_test") load("@rules_python//python:pip.bzl", "compile_pip_requirements") @@ -27,6 +21,8 @@ compile_pip_requirements( name = "requirements", extra_args = ["--allow-unsafe"], requirements_in = "requirements.in", + # Pass in a select-like value that lets the macro decide what to do with + # the file. requirements_txt = { "@//:x86_64_linux": "requirements_lock_x86_64_linux.txt", }, diff --git a/python/pip_install/requirements.bzl b/python/pip_install/requirements.bzl index 1d16d440dc..cfb4ecc6ed 100644 --- a/python/pip_install/requirements.bzl +++ b/python/pip_install/requirements.bzl @@ -14,6 +14,7 @@ """Rules to verify and update pip-compile locked requirements.txt""" +load("@bazel_skylib//lib:new_sets.bzl", "sets") load("@bazel_skylib//lib:types.bzl", "types") load("//python:defs.bzl", _py_binary = "py_binary", _py_test = "py_test") load("//python/pip_install:repositories.bzl", "requirement") @@ -30,6 +31,10 @@ def _generate_data_select(config_to_filepath_dict): def _generate_config_select(config_to_filepath_dict): return select({k: [k] for k in config_to_filepath_dict}) +def _validate_keys_match(description, dict1, dict2): + if not sets.is_equal(sets.make(dict1.keys()), sets.make(dict2.keys())): + fail("The keys of {} must match.".format(description)) + def compile_pip_requirements( name, extra_args = [], @@ -96,6 +101,7 @@ def compile_pip_requirements( data = [name, requirements_in] + requirements_txt_data + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None] if intermediate_file: data += _generate_loc_select(intermediate_file, "{}") + _validate_keys_match("requirements_txt and intermediate_file", intermediate_file, requirements_txt) # Use the Label constructor so this is expanded in the context of the file # where it appears, which is to say, in @rules_python @@ -145,6 +151,15 @@ def compile_pip_requirements( "visibility": visibility, } + # If we are generating data into an intermediate file, then we mark the + # update target as only compatible with the platforms for which an + # intermediate file is specified. This should hopefully prevent confusing + # runtime errors. + if intermediate_file: + compatible = {config: [] for config in intermediate_file} + compatible["//conditions:default"] = ["@platforms//:incompatible"] + attrs["target_compatible_with"] = select(compatible) + # cheap way to detect the bazel version _bazel_version_4_or_greater = "propeller_optimize" in dir(native) @@ -152,8 +167,6 @@ def compile_pip_requirements( if _bazel_version_4_or_greater: attrs["env"] = kwargs.pop("env", {}) - # TODO(phil): Add a target_compatible_with here for all the configs not - # mentioned in intermediate_file. py_binary( name = name + ".update", **attrs From 14150de22ec52adb04e5c993a4146885a712060b Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 6 Aug 2023 16:59:20 -0700 Subject: [PATCH 22/96] clean up more --- examples/pypi_install/BUILD.bazel | 3 +- examples/pypi_install/pip_parse_test.py | 77 ------------------- .../dependency_resolver.py | 22 ++++-- 3 files changed, 19 insertions(+), 83 deletions(-) delete mode 100644 examples/pypi_install/pip_parse_test.py diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index da9aaee7f7..b6df262ba9 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -22,7 +22,8 @@ compile_pip_requirements( extra_args = ["--allow-unsafe"], requirements_in = "requirements.in", # Pass in a select-like value that lets the macro decide what to do with - # the file. + # the file. Having these values as dictionaries allows us to do some + # validation before the underlying targets get instantiated. requirements_txt = { "@//:x86_64_linux": "requirements_lock_x86_64_linux.txt", }, diff --git a/examples/pypi_install/pip_parse_test.py b/examples/pypi_install/pip_parse_test.py deleted file mode 100644 index f319cb898f..0000000000 --- a/examples/pypi_install/pip_parse_test.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2023 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 os -import subprocess -import unittest -from pathlib import Path - -from rules_python.python.runfiles import runfiles - - -class PipInstallTest(unittest.TestCase): - maxDiff = None - - def test_entry_point(self): - env = os.environ.get("YAMLLINT_ENTRY_POINT") - self.assertIsNotNone(env) - - r = runfiles.Create() - - # To find an external target, this must use `{workspace_name}/$(rootpath @external_repo//:target)` - entry_point = Path(r.Rlocation("rules_python_pip_parse_example/{}".format(env))) - self.assertTrue(entry_point.exists()) - - proc = subprocess.run( - [str(entry_point), "--version"], - check=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - self.assertEqual(proc.stdout.decode("utf-8").strip(), "yamllint 1.26.3") - - def test_data(self): - env = os.environ.get("WHEEL_DATA_CONTENTS") - self.assertIsNotNone(env) - self.assertListEqual( - env.split(" "), - [ - "external/pypi_s3cmd/data/share/doc/packages/s3cmd/INSTALL.md", - "external/pypi_s3cmd/data/share/doc/packages/s3cmd/LICENSE", - "external/pypi_s3cmd/data/share/doc/packages/s3cmd/NEWS", - "external/pypi_s3cmd/data/share/doc/packages/s3cmd/README.md", - "external/pypi_s3cmd/data/share/man/man1/s3cmd.1", - ], - ) - - def test_dist_info(self): - env = os.environ.get("WHEEL_DIST_INFO_CONTENTS") - self.assertIsNotNone(env) - self.assertListEqual( - env.split(" "), - [ - "external/pypi_requests/site-packages/requests-2.25.1.dist-info/INSTALLER", - "external/pypi_requests/site-packages/requests-2.25.1.dist-info/LICENSE", - "external/pypi_requests/site-packages/requests-2.25.1.dist-info/METADATA", - "external/pypi_requests/site-packages/requests-2.25.1.dist-info/RECORD", - "external/pypi_requests/site-packages/requests-2.25.1.dist-info/WHEEL", - "external/pypi_requests/site-packages/requests-2.25.1.dist-info/top_level.txt", - ], - ) - - -if __name__ == "__main__": - unittest.main() diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index c8f11688a9..81ec10d625 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -86,6 +86,14 @@ def _locate(bazel_runfiles, file): def _evaluate_marker(marker: Marker, environment: Mapping[str, str], extra: str): + """Evaluates a requirements marker found in the metadata. + + https://packaging.pypa.io/en/stable/markers.html + + Since there doesn't seem to be a packaging-provided helper to evaluate + against multiple extras, call this function once for each extra. Call it at + least once with `extra` set to the empty string. + """ environment_copy = environment.copy() environment_copy["extra"] = extra return marker.evaluate(environment_copy) @@ -95,12 +103,14 @@ def _post_process_installation_report( config_setting: str, raw_installation_report: Path, intermediate_file: Path): + """Processes an installation report into an intermediate file. + See the docs on installation reports for more information: + https://pip.pypa.io/en/stable/reference/installation-report/ + """ with raw_installation_report.open() as file: report = json.load(file) - #json.dump(report, sys.stdout, indent=4) - environment = report["environment"] intermediate = {} @@ -110,6 +120,7 @@ def _post_process_installation_report( metadata = install["metadata"] name = metadata["name"] + # Extract the basic information about the hosted file (URL and sha256). info = intermediate.setdefault(name, {}).setdefault(config_setting, {}) info["url"] = download_info["url"] hash = download_info["archive_info"].get("hash", "") @@ -120,6 +131,7 @@ def _post_process_installation_report( extras = install.get("requested_extras", []) + [""] + # Extract the dependency information. deps = [] for raw_requirement in metadata.get("requires_dist", []): requirement = Requirement(raw_requirement) @@ -142,7 +154,7 @@ def _post_process_installation_report( def _generate_intermediate_file(config_setting, requirements_in, intermediate_file): - """Generates an intermediate file from the installation report.""" + """Generates an installation report and then converts it into an intermediate file.""" with tempfile.TemporaryDirectory() as temp_dir: raw_installation_report = Path(temp_dir) / "installation_report.json" sys.argv = [ @@ -287,12 +299,12 @@ def _generate_intermediate_file(config_setting, requirements_in, intermediate_fi Path(pip_installation_report_relative))) else: print("Not generating an intermediate file.") - - requirements_file_relative_path.write_text(content) else: # cli will exit(0) on success try: + print("Checking " + requirements_file) cli() + print("cli() should exit", file=sys.stderr) sys.exit(1) except SystemExit as e: if e.code == 2: From 9c728094a6ec01e0219b8d4a51466e67a339d7a2 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 6 Aug 2023 17:02:28 -0700 Subject: [PATCH 23/96] rename file --- python/private/{intermediate_pypi_install.bzl => pypi.bzl} | 0 python/pypi.bzl | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename python/private/{intermediate_pypi_install.bzl => pypi.bzl} (100%) diff --git a/python/private/intermediate_pypi_install.bzl b/python/private/pypi.bzl similarity index 100% rename from python/private/intermediate_pypi_install.bzl rename to python/private/pypi.bzl diff --git a/python/pypi.bzl b/python/pypi.bzl index 198798af22..25b01ccd16 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -1,5 +1,5 @@ load("//python/pip_install:repositories.bzl", "pip_install_dependencies") -load("//python/private:intermediate_pypi_install.bzl", "combine_intermediate_files", "generate_pypi_package_load") +load("//python/private:pypi.bzl", "combine_intermediate_files", "generate_pypi_package_load") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") load("@bazel_skylib//lib:paths.bzl", "paths") From 98c0416047aa6a42b3addc7711824bc7d77f57de Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 6 Aug 2023 17:55:11 -0700 Subject: [PATCH 24/96] clean up more --- examples/pypi_install/BUILD.bazel | 7 ++ examples/pypi_install/WORKSPACE | 2 + python/private/pypi.bzl | 153 +++++++++++++++++++++++++++++- python/pypi.bzl | 139 ++++----------------------- 4 files changed, 174 insertions(+), 127 deletions(-) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index b6df262ba9..3e8995d40e 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -30,6 +30,13 @@ compile_pip_requirements( intermediate_file = { "@//:x86_64_linux": "intermediate_file_x86_64_linux.json", }, + # TODO(phil): Add an attribute that accepts a binary. That binary will let + # users modify the intermediate file. Then they can: + # - Inject dependencies. + # - Remove dependencies. + # - Drop whole packages (is there such a use case?). + # - Add patches (support needed). + # - Override/create aliases (support needed). ) config_setting( diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index bca493fde4..288ee54ab1 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -23,6 +23,8 @@ load("@rules_python//python:pypi.bzl", "pypi_install") pypi_install( name = "pypi_install", + # Use fully resolved labels so that they're not accidentally interpreted as + # repo-relative. pip_installation_report = { "@//:x86_64_linux": "//:intermediate_file_x86_64_linux.json", }, diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index 2b07580802..cc567e40e8 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -1,6 +1,26 @@ +# Copyright 2023 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. + +load("@bazel_skylib//lib:paths.bzl", "paths") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") +load("//python/private:wheel_library.bzl", "pycross_wheel_library") + def combine_intermediate_files(repository_ctx, installation_reports): combined = {} + # TODO(phil): Figure out how to deal with a single intermediate file. What + # "config" setting should that have? for intermediate_label, config_setting in installation_reports.items(): intermediate = json.decode(repository_ctx.read(intermediate_label)) for package in intermediate: @@ -20,13 +40,138 @@ def combine_intermediate_files(repository_ctx, installation_reports): def generate_pypi_package_load(repository_ctx): lines = [ - """load("@rules_python//python:pypi.bzl",""", - """ _load_pypi_packages_internal="load_pypi_packages_internal",""", - """ _generate_package_aliases="generate_package_aliases_internal",""", + """load("@rules_python//python/private:pypi.bzl",""", + """ _load_pypi_packages="load_pypi_packages",""", + """ _generate_package_aliases="generate_package_aliases",""", """)""", """load("@{}//:intermediate.bzl", "INTERMEDIATE")""".format(repository_ctx.name), """def load_pypi_packages(name, **kwargs):""", - """ _load_pypi_packages_internal(INTERMEDIATE, alias_repo_name=name, **kwargs)""", + """ _load_pypi_packages(INTERMEDIATE, alias_repo_name=name, **kwargs)""", """ _generate_package_aliases(name=name, intermediate="@{}//:intermediate.bzl", **kwargs)""".format(repository_ctx.name), ] repository_ctx.file("packages.bzl", "\n".join(lines), executable=False) + +def load_pypi_packages(intermediate, alias_repo_name, **kwargs): + # Only download a wheel/tarball once. We do this by tracking which SHA sums + # we've downloaded already. + sha_indexed_infos = {} + + for package, configs in intermediate.items(): + for config, info in configs.items(): + if info["sha256"] not in sha_indexed_infos: + _generate_http_file(package, info) + # TODO(phil): What do we need to track here? Can we switch to a + # set()? + sha_indexed_infos[info["sha256"]] = True + + # TODO(phil): Can we add target_compatible_with information + # here? + _generate_py_library(package, alias_repo_name, info) + +def _generate_package_aliases_impl(repository_ctx): + bzl_intermediate = repository_ctx.read(repository_ctx.path(repository_ctx.attr.intermediate)) + if not bzl_intermediate.startswith("INTERMEDIATE = "): + fail("Expected intermediate.bzl to start with 'INTERMEDIATE = '. Did the implementation get out of sync?") + intermediate = json.decode(bzl_intermediate[len("INTERMEDIATE = "):]) + + for package in intermediate: + lines = [ + """load("{}", "INTERMEDIATE")""".format(repository_ctx.attr.intermediate), + """load("@rules_python//python/private:pypi.bzl", _generate_package_alias="generate_package_alias")""", + """_generate_package_alias(INTERMEDIATE)""", + ] + repository_ctx.file("{}/BUILD".format(package), "\n".join(lines), executable=False) + +_generate_package_aliases = repository_rule( + implementation = _generate_package_aliases_impl, + attrs = { + "intermediate": attr.label( + allow_single_file = True, + ), + }, +) + +def generate_package_aliases(**kwargs): + _generate_package_aliases(**kwargs) + + +def generate_package_alias(intermediate): + package = native.package_name() + if package not in intermediate: + fail("Failed to find {} in the intermediate file. Something went wrong internally.") + + info_per_config = intermediate[package] + actual_select = {} + target_compatible_with_select = { + "//conditions:default": ["@platforms//:incompatible"], + } + for config, info in info_per_config.items(): + repo_name = _generate_repo_name_for_extracted_wheel(package, info) + actual_select[config] = "@{}//:library".format(repo_name) + target_compatible_with_select[config] = [] + + native.alias( + name = package, + actual = select(actual_select), + # TODO(phil): Validate that this works in bazel 5. Do we care? + target_compatible_with = select(target_compatible_with_select), + visibility = ["//visibility:public"], + ) + + +def _generate_repo_name_for_download(package, info): + # TODO(phil): Can we make it more human readable by avoiding the checksum? + return "pypi_download_{}_{}".format(package, info["sha256"]) + +def _generate_repo_name_for_extracted_wheel(package, info): + # TODO(phil): Can we make it more human readable by avoiding the checksum? + return "pypi_extracted_wheel_{}_{}".format(package, info["sha256"]) + + +def _generate_http_file(package, info): + http_file( + name = _generate_repo_name_for_download(package, info), + urls = [ + info["url"], + ], + sha256 = info["sha256"], + downloaded_file_path = paths.basename(info["url"]), + ) + +def _generate_py_library(package, alias_repo_name, info): + _wheel_library( + name = _generate_repo_name_for_extracted_wheel(package, info), + alias_repo_name = alias_repo_name, + wheel_repo_name = _generate_repo_name_for_download(package, info), + deps = info["deps"], + ) + +def _wheel_library_impl(repository_ctx): + deps = ["@{}//{}".format(repository_ctx.attr.alias_repo_name, dep) for dep in repository_ctx.attr.deps] + lines = [ + """load("@rules_python//python/private:pypi.bzl", "wrapped_py_wheel_library")""", + """wrapped_py_wheel_library(""", + """ name = "library",""", + """ wheel_repo_name = "{}",""".format(repository_ctx.attr.wheel_repo_name), + """ deps = {},""".format(json.encode(deps)), + """)""", + ] + repository_ctx.file("BUILD", "\n".join(lines), executable=False) + +_wheel_library = repository_rule( + implementation = _wheel_library_impl, + attrs = { + "alias_repo_name": attr.string(), + "wheel_repo_name": attr.string(), + "deps": attr.string_list(), + }, +) + +def wrapped_py_wheel_library(name, wheel_repo_name, deps): + pycross_wheel_library( + name = "library", + wheel = "@{}//file".format(wheel_repo_name), + enable_implicit_namespace_pkgs = True, + deps = deps, + visibility = ["//visibility:public"], + ) diff --git a/python/pypi.bzl b/python/pypi.bzl index 25b01ccd16..ecf02a6d3f 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -1,7 +1,19 @@ +# Copyright 2023 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. + load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:pypi.bzl", "combine_intermediate_files", "generate_pypi_package_load") -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") -load("@bazel_skylib//lib:paths.bzl", "paths") def pypi_install(pip_installation_report = None, **kwargs): pip_install_dependencies() @@ -12,8 +24,7 @@ def pypi_install(pip_installation_report = None, **kwargs): _pypi_install(pip_installation_report = pip_installation_report_swapped, **kwargs) def _pypi_install_impl(repository_ctx): - repository_ctx.file("BUILD.bazel", """\ -""", executable = False) + repository_ctx.file("BUILD.bazel", "\n", executable = False) if repository_ctx.attr.pip_installation_report: intermediate = combine_intermediate_files( repository_ctx, @@ -31,127 +42,9 @@ def _pypi_install_impl(repository_ctx): _pypi_install = repository_rule( implementation = _pypi_install_impl, attrs = { + # TODO(phil): Add support for a single installation report. "pip_installation_report": attr.label_keyed_string_dict( allow_files = True, ), }, ) - -def load_pypi_packages_internal(intermediate, alias_repo_name, **kwargs): - # Only download a wheel/tarball once. We do this by tracking which SHA sums - # we've downloaded already. - sha_indexed_infos = {} - - for package, configs in intermediate.items(): - for config, info in configs.items(): - if info["sha256"] not in sha_indexed_infos: - _generate_http_file(package, info) - # TODO(phil): What do we need to track here? Can we switch to a - # set()? - sha_indexed_infos[info["sha256"]] = True - - # TODO(phil): Can we add target_compatible_with information - # here? - _generate_py_library(package, alias_repo_name, info) - -def _generate_package_aliases_internal_impl(repository_ctx): - bzl_intermediate = repository_ctx.read(repository_ctx.path(repository_ctx.attr.intermediate)) - if not bzl_intermediate.startswith("INTERMEDIATE = "): - fail("Expected intermediate.bzl to start with 'INTERMEDIATE = '. Did the implementation get out of sync?") - intermediate = json.decode(bzl_intermediate[len("INTERMEDIATE = "):]) - - for package in intermediate: - lines = [ - """load("{}", "INTERMEDIATE")""".format(repository_ctx.attr.intermediate), - """load("@rules_python//python:pypi.bzl", _generate_package_alias="generate_package_alias")""", - """_generate_package_alias(INTERMEDIATE)""", - ] - repository_ctx.file("{}/BUILD".format(package), "\n".join(lines), executable=False) - -_generate_package_aliases_internal = repository_rule( - implementation = _generate_package_aliases_internal_impl, - attrs = { - "intermediate": attr.label( - allow_single_file = True, - ), - }, -) - -def generate_package_aliases_internal(**kwargs): - _generate_package_aliases_internal(**kwargs) - - -def generate_package_alias(intermediate): - package = native.package_name() - if package not in intermediate: - fail("Failed to find {} in the intermediate file. Something went wrong internally.") - - info_per_config = intermediate[package] - actual_select = {} - target_compatible_with_select = { - "//conditions:default": ["@platforms//:incompatible"], - } - for config, info in info_per_config.items(): - repo_name = _generate_repo_name_for_extracted_wheel(package, info) - actual_select[config] = "@{}//:library".format(repo_name) - target_compatible_with_select[config] = [] - - native.alias( - name = package, - actual = select(actual_select), - # TODO(phil): Validate that this works in bazel 5. Do we care? - target_compatible_with = select(target_compatible_with_select), - visibility = ["//visibility:public"], - ) - - -def _generate_repo_name_for_download(package, info): - # TODO(phil): Can we make it more human readable by avoiding the checksum? - return "pypi_download_{}_{}".format(package, info["sha256"]) - -def _generate_repo_name_for_extracted_wheel(package, info): - # TODO(phil): Can we make it more human readable by avoiding the checksum? - return "pypi_extracted_wheel_{}_{}".format(package, info["sha256"]) - - -def _generate_http_file(package, info): - http_file( - name = _generate_repo_name_for_download(package, info), - urls = [ - info["url"], - ], - sha256 = info["sha256"], - downloaded_file_path = paths.basename(info["url"]), - ) - -def _generate_py_library(package, alias_repo_name, info): - _wheel_library( - name = _generate_repo_name_for_extracted_wheel(package, info), - alias_repo_name = alias_repo_name, - wheel_repo_name = _generate_repo_name_for_download(package, info), - deps = info["deps"], - ) - -def _wheel_library_impl(repository_ctx): - deps = ['"@{}//{}"'.format(repository_ctx.attr.alias_repo_name, dep) for dep in repository_ctx.attr.deps] - lines = [ - """load("@rules_python//python/private:wheel_library.bzl", "pycross_wheel_library")""", - """pycross_wheel_library(""", - """ name = "library",""", - """ wheel = "@{}//file",""".format(repository_ctx.attr.wheel_repo_name), - """ enable_implicit_namespace_pkgs = True,""", - """ deps = [{}],""".format(",".join(deps)), - """ visibility = ["//visibility:public"],""", - # TODO(phil): Add deps here. - """)""", - ] - repository_ctx.file("BUILD", "\n".join(lines), executable=False) - -_wheel_library = repository_rule( - implementation = _wheel_library_impl, - attrs = { - "alias_repo_name": attr.string(), - "wheel_repo_name": attr.string(), - "deps": attr.string_list(), - }, -) From b346789e3c15d61a92661986ccda9986f6cd1ecb Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 6 Aug 2023 17:56:43 -0700 Subject: [PATCH 25/96] more cleanup --- python/private/intermediate_pypi_install.py | 28 --------------------- python/private/pypi.bzl | 9 +++---- 2 files changed, 4 insertions(+), 33 deletions(-) delete mode 100644 python/private/intermediate_pypi_install.py diff --git a/python/private/intermediate_pypi_install.py b/python/private/intermediate_pypi_install.py deleted file mode 100644 index 78cd5bf0ee..0000000000 --- a/python/private/intermediate_pypi_install.py +++ /dev/null @@ -1,28 +0,0 @@ -import argparse -import json -import sys -from pathlib import Path - -from packaging.requirements import Requirement - -def main(argv): - parser = argparse.ArgumentParser() - parser.add_argument("--installation_report", - required=True, - type=Path) - args = parser.parse_args(argv[1:]) - - with args.installation_report.open() as file: - report = json.load(file) - - for install in report["install"]: - download_info = install["download_info"] - metadata = install["metadata"] - name = metadata["name"] - requires_dist = metdata.get("requires_dist", []) - - for raw_requirement in requires_dist: - requirement = Requirement(raw_requirement) - -if __name__ == "__main__": - sys.exit(main(sys.argv)) diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index cc567e40e8..0751d960ba 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -150,11 +150,10 @@ def _wheel_library_impl(repository_ctx): deps = ["@{}//{}".format(repository_ctx.attr.alias_repo_name, dep) for dep in repository_ctx.attr.deps] lines = [ """load("@rules_python//python/private:pypi.bzl", "wrapped_py_wheel_library")""", - """wrapped_py_wheel_library(""", - """ name = "library",""", - """ wheel_repo_name = "{}",""".format(repository_ctx.attr.wheel_repo_name), - """ deps = {},""".format(json.encode(deps)), - """)""", + """wrapped_py_wheel_library(name="library", wheel_repo_name="{}", deps={})""".format( + repository_ctx.attr.wheel_repo_name, + json.encode(deps), + ), ] repository_ctx.file("BUILD", "\n".join(lines), executable=False) From 356c0671a813ee37c83d090b2f95ceb831299abb Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sat, 19 Aug 2023 20:27:54 -0700 Subject: [PATCH 26/96] Re-organize the logic a bit --- examples/pypi_install/cognitojwt_deps_test.sh | 32 ++++ python/private/pypi.bzl | 130 +------------ python/private/pypi_repo.bzl | 172 ++++++++++++++++++ python/private/pypi_util.bzl | 22 +++ python/pypi.bzl | 37 +--- 5 files changed, 230 insertions(+), 163 deletions(-) create mode 100755 examples/pypi_install/cognitojwt_deps_test.sh create mode 100644 python/private/pypi_repo.bzl create mode 100644 python/private/pypi_util.bzl diff --git a/examples/pypi_install/cognitojwt_deps_test.sh b/examples/pypi_install/cognitojwt_deps_test.sh new file mode 100755 index 0000000000..e374385a6a --- /dev/null +++ b/examples/pypi_install/cognitojwt_deps_test.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +GENQUERY_OUTPUT="$(cat ./cognitojwt_deps)" +readonly GENQUERY_OUTPUT + +EXPECTED_OUTPUT="$(cat <&2 < @@ -296,7 +315,7 @@ def _generate_intermediate_file(config_setting, requirements_in, intermediate_fi # Feed the output of pip-compile into the installation report # generation. sys.exit(_generate_intermediate_file(config_setting, requirements_file_relative_path, - Path(pip_installation_report_relative))) + Path(pip_installation_report_relative), intermediate_file_patcher)) else: print("Not generating an intermediate file.") else: @@ -316,7 +335,7 @@ def _generate_intermediate_file(config_setting, requirements_in, intermediate_fi ) sys.exit(1) elif e.code == 0: - golden = open(_locate(bazel_runfiles, requirements_file)).readlines() + golden = open(_locate(requirements_file)).readlines() out = open(requirements_out).readlines() out = [line.replace(absolute_path_prefix, "") for line in out] if golden != out: diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index 10dea819c0..ec39c08fef 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -106,6 +106,12 @@ def load_pypi_packages_internal(intermediate, alias_repo_name, **kwargs): def _generate_http_file(package, info): + # Extract all the args that we want to pass to http_file. + extra_args = {} + for arg in info: + if arg.startswith("patch"): + extra_args[arg] = info[arg] + http_file( name = generate_repo_name_for_download(package, info), urls = [ @@ -113,6 +119,7 @@ def _generate_http_file(package, info): ], sha256 = info["sha256"], downloaded_file_path = paths.basename(info["url"]), + **extra_args ) From 34412f093ae2148842deb7bb80690d2e5f5b5bda Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sat, 19 Aug 2023 21:01:34 -0700 Subject: [PATCH 28/96] add missing files --- .../pypi_install/intermediate_file_patcher.py | 34 +++++++++++++++++++ examples/pypi_install/third_party/BUILD.bazel | 0 2 files changed, 34 insertions(+) create mode 100644 examples/pypi_install/intermediate_file_patcher.py create mode 100644 examples/pypi_install/third_party/BUILD.bazel diff --git a/examples/pypi_install/intermediate_file_patcher.py b/examples/pypi_install/intermediate_file_patcher.py new file mode 100644 index 0000000000..f600ef7bf0 --- /dev/null +++ b/examples/pypi_install/intermediate_file_patcher.py @@ -0,0 +1,34 @@ +import json +import sys +from pathlib import Path + +UPDATES = { + "requests": { + "patches": [ + "@//third_party:requests/hello.patch", + ], + "patch_args": [ + "-p1", + ], + }, +} + +def patch_intermediate_file(content): + for package, info_per_config in content.items(): + for config, info in info_per_config.items(): + if package in UPDATES: + info.update(UPDATES[package]) + +def main(argv): + intermediate_file = Path(argv[1]) + + with intermediate_file.open("r") as file: + content = json.load(file) + + patch_intermediate_file(content) + + with intermediate_file.open("w") as file: + json.dump(content, file, indent=4) + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/examples/pypi_install/third_party/BUILD.bazel b/examples/pypi_install/third_party/BUILD.bazel new file mode 100644 index 0000000000..e69de29bb2 From c58db28e793504116fd0042823f4f71486f83c08 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sat, 19 Aug 2023 21:28:16 -0700 Subject: [PATCH 29/96] Start moving patch support into user space --- python/private/pypi_repo.bzl | 9 ++------- python/private/wheel_installer.py | 26 ++++++++++++++++++++++++++ python/private/wheel_library.bzl | 20 ++++++++++++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index ec39c08fef..6bae0426fb 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -106,12 +106,6 @@ def load_pypi_packages_internal(intermediate, alias_repo_name, **kwargs): def _generate_http_file(package, info): - # Extract all the args that we want to pass to http_file. - extra_args = {} - for arg in info: - if arg.startswith("patch"): - extra_args[arg] = info[arg] - http_file( name = generate_repo_name_for_download(package, info), urls = [ @@ -119,7 +113,6 @@ def _generate_http_file(package, info): ], sha256 = info["sha256"], downloaded_file_path = paths.basename(info["url"]), - **extra_args ) @@ -134,6 +127,8 @@ def _generate_py_library(package, alias_repo_name, info): def _wheel_library_repo_impl(repository_ctx): deps = ["@{}//{}".format(repository_ctx.attr.alias_repo_name, dep) for dep in repository_ctx.attr.deps] + # TODO(phil): Pass the intermediate format through here. Then in the + # wrapper rule we can extract the deps and the patches. lines = [ """load("@rules_python//python/private:pypi.bzl", "wrapped_py_wheel_library")""", """wrapped_py_wheel_library(name="library", wheel_repo_name="{}", deps={})""".format( diff --git a/python/private/wheel_installer.py b/python/private/wheel_installer.py index 8016cdc509..426a13d834 100644 --- a/python/private/wheel_installer.py +++ b/python/private/wheel_installer.py @@ -57,6 +57,12 @@ def main(args: Any) -> None: finally: shutil.rmtree(link_dir, ignore_errors=True) + patch_args = [args.patch_tool] + args.patch_arg + for patch in args.patch: + with patch.open("r") as stdin: + subprocess.run(patch_args, stdin=stdin, check=True) + + def parse_flags(argv) -> Any: parser = argparse.ArgumentParser(description="Extract a Python wheel.") @@ -87,6 +93,26 @@ def parse_flags(argv) -> Any: help="The output path.", ) + parser.add_argument( + "--patch", + type=Path, + action="append", + help="A patch file to apply.", + ) + + parser.add_argument( + "--patch-arg", + type=Path, + action="append", + help="An argument for the patch_tool when applying the patches.", + ) + + parser.add_argument( + "--patch-tool", + type=str, + help="The tool to invoke when applying patches.", + ) + return parser.parse_args(argv[1:]) diff --git a/python/private/wheel_library.bzl b/python/private/wheel_library.bzl index 013cc0640c..3457f2c4eb 100644 --- a/python/private/wheel_library.bzl +++ b/python/private/wheel_library.bzl @@ -16,6 +16,9 @@ def _pycross_wheel_library_impl(ctx): args = ctx.actions.args().use_param_file("--flagfile=%s") args.add("--wheel", wheel_file) args.add("--directory", out.path) + args.add_all(ctx.files.patches, format_each="--patch=%s") + args.add_all(ctx.args.patch_args, format_each="--patch-arg=%s") + args.add("--patch_tool", ctx.attr.patch_tool) inputs = [wheel_file] if name_file: @@ -116,5 +119,22 @@ This option is required to support some packages which cannot handle the convers cfg = "exec", executable = True, ), + "patches": attr.label_list( + default = [], + doc = + "A list of files that are to be applied as patches after " + + "extracting the archive. This will use the patch command line tool.", + ), + "patch_args": attr.string_list( + default = ["-p0"], + doc = + "The arguments given to the patch tool. Defaults to -p0, " + + "however -p1 will usually be needed for patches generated by " + + "git. If multiple -p arguments are specified, the last one will take effect." + + ), + "patch_tool": attr.string( + default = "patch", + doc = "The patch(1) utility to use.", + ), } ) From 34ff1c89907eb0b24ee3c6228eba7d9719d20981 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 23 Aug 2023 21:05:39 -0700 Subject: [PATCH 30/96] Actually pass patch args through --- examples/pypi_install/BUILD.bazel | 3 +-- python/private/pypi.bzl | 11 ++++++++--- python/private/pypi_repo.bzl | 33 ++++++++++++++++++++----------- python/private/wheel_installer.py | 3 ++- python/private/wheel_library.bzl | 6 +++--- 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index 7b6bab309d..877734e8ec 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -30,8 +30,7 @@ compile_pip_requirements( intermediate_file = { "@//:x86_64_linux": "intermediate_file_x86_64_linux.json", }, - # TODO(phil): Add an attribute that accepts a binary. That binary will let - # users modify the intermediate file. Then they can: + # That binary will let users modify the intermediate file. Then they can: # - Inject dependencies. # - Remove dependencies. # - Drop whole packages (is there such a use case?). diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index c392d0d5a8..98c336f22f 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -34,17 +34,22 @@ def generate_package_alias(intermediate): native.alias( name = package, actual = select(actual_select), - # TODO(phil): Validate that this works in bazel 5. Do we care? target_compatible_with = select(target_compatible_with_select), visibility = ["//visibility:public"], ) -def wrapped_py_wheel_library(name, wheel_repo_name, deps): +def wrapped_py_wheel_library(name, wheel_repo_name, info): + kwargs = {arg: info.get(arg) for arg in ( + "deps", + "patches", + "patch_args", + "patch_tool", + )} pycross_wheel_library( name = "library", wheel = "@{}//file".format(wheel_repo_name), enable_implicit_namespace_pkgs = True, - deps = deps, visibility = ["//visibility:public"], + **kwargs ) diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index 6bae0426fb..31a0baf48f 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -47,7 +47,10 @@ def _pypi_install_impl(repository_ctx): """)""", """load("@{}//:intermediate.bzl", "INTERMEDIATE")""".format(repository_ctx.name), """def load_pypi_packages(name, **kwargs):""", - """ _load_pypi_packages_internal(INTERMEDIATE, alias_repo_name=name, **kwargs)""", + """ _load_pypi_packages_internal(INTERMEDIATE,""", + """ intermediate_repo_name="{}",""".format(repository_ctx.name), + """ alias_repo_name=name,""", + """ **kwargs)""", """ _generate_package_aliases(name=name, intermediate="@{}//:intermediate.bzl", **kwargs)""".format(repository_ctx.name), ] repository_ctx.file("packages.bzl", "\n".join(lines), executable=False) @@ -87,7 +90,7 @@ def _combine_intermediate_files(repository_ctx, installation_reports): return combined -def load_pypi_packages_internal(intermediate, alias_repo_name, **kwargs): +def load_pypi_packages_internal(intermediate, intermediate_repo_name, alias_repo_name, **kwargs): # Only download a wheel/tarball once. We do this by tracking which SHA sums # we've downloaded already. sha_indexed_infos = {} @@ -102,7 +105,7 @@ def load_pypi_packages_internal(intermediate, alias_repo_name, **kwargs): # TODO(phil): Can we add target_compatible_with information # here? - _generate_py_library(package, alias_repo_name, info) + _generate_py_library(package, config, info, intermediate_repo_name, alias_repo_name) def _generate_http_file(package, info): @@ -116,25 +119,29 @@ def _generate_http_file(package, info): ) -def _generate_py_library(package, alias_repo_name, info): +def _generate_py_library(package, config, info, intermediate_repo_name, alias_repo_name): _wheel_library_repo( name = generate_repo_name_for_extracted_wheel(package, info), alias_repo_name = alias_repo_name, wheel_repo_name = generate_repo_name_for_download(package, info), - deps = info["deps"], + intermediate_repo_name = intermediate_repo_name, + intermediate_package = package, + intermediate_config = config, ) def _wheel_library_repo_impl(repository_ctx): - deps = ["@{}//{}".format(repository_ctx.attr.alias_repo_name, dep) for dep in repository_ctx.attr.deps] - # TODO(phil): Pass the intermediate format through here. Then in the - # wrapper rule we can extract the deps and the patches. lines = [ """load("@rules_python//python/private:pypi.bzl", "wrapped_py_wheel_library")""", - """wrapped_py_wheel_library(name="library", wheel_repo_name="{}", deps={})""".format( - repository_ctx.attr.wheel_repo_name, - json.encode(deps), + """load("@{}//:intermediate.bzl", "INTERMEDIATE")""".format(repository_ctx.attr.intermediate_repo_name), + """wrapped_py_wheel_library(""", + """ name="library",""", + """ wheel_repo_name="{}",""".format(repository_ctx.attr.wheel_repo_name), + """ info=INTERMEDIATE["{}"]["{}"],""".format( + repository_ctx.attr.intermediate_package, + repository_ctx.attr.intermediate_config, ), + """)""", ] repository_ctx.file("BUILD", "\n".join(lines), executable=False) @@ -144,7 +151,9 @@ _wheel_library_repo = repository_rule( attrs = { "alias_repo_name": attr.string(), "wheel_repo_name": attr.string(), - "deps": attr.string_list(), + "intermediate_repo_name": attr.string(), + "intermediate_package": attr.string(), + "intermediate_config": attr.string(), }, ) diff --git a/python/private/wheel_installer.py b/python/private/wheel_installer.py index 426a13d834..97b5697d9a 100644 --- a/python/private/wheel_installer.py +++ b/python/private/wheel_installer.py @@ -58,8 +58,9 @@ def main(args: Any) -> None: shutil.rmtree(link_dir, ignore_errors=True) patch_args = [args.patch_tool] + args.patch_arg - for patch in args.patch: + for patch in (args.patch or []): with patch.open("r") as stdin: + print(f"Applying patch {patch}") subprocess.run(patch_args, stdin=stdin, check=True) diff --git a/python/private/wheel_library.bzl b/python/private/wheel_library.bzl index 3457f2c4eb..8895a3d655 100644 --- a/python/private/wheel_library.bzl +++ b/python/private/wheel_library.bzl @@ -17,8 +17,8 @@ def _pycross_wheel_library_impl(ctx): args.add("--wheel", wheel_file) args.add("--directory", out.path) args.add_all(ctx.files.patches, format_each="--patch=%s") - args.add_all(ctx.args.patch_args, format_each="--patch-arg=%s") - args.add("--patch_tool", ctx.attr.patch_tool) + args.add_all(ctx.attr.patch_args, format_each="--patch-arg=%s") + args.add("--patch-tool", ctx.attr.patch_tool) inputs = [wheel_file] if name_file: @@ -130,7 +130,7 @@ This option is required to support some packages which cannot handle the convers doc = "The arguments given to the patch tool. Defaults to -p0, " + "however -p1 will usually be needed for patches generated by " + - "git. If multiple -p arguments are specified, the last one will take effect." + + "git. If multiple -p arguments are specified, the last one will take effect." ), "patch_tool": attr.string( default = "patch", From 00e83b4712c6bc18e4ff55419f3282ac87ee5bdf Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 23 Aug 2023 21:07:02 -0700 Subject: [PATCH 31/96] Switch to BUILD.bazel --- python/private/pypi_repo.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index 31a0baf48f..e696dd1184 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -143,7 +143,7 @@ def _wheel_library_repo_impl(repository_ctx): ), """)""", ] - repository_ctx.file("BUILD", "\n".join(lines), executable=False) + repository_ctx.file("BUILD.bazel", "\n".join(lines), executable=False) _wheel_library_repo = repository_rule( @@ -170,7 +170,7 @@ def _generate_package_aliases_impl(repository_ctx): """load("@rules_python//python/private:pypi.bzl", _generate_package_alias="generate_package_alias")""", """_generate_package_alias(INTERMEDIATE)""", ] - repository_ctx.file("{}/BUILD".format(package), "\n".join(lines), executable=False) + repository_ctx.file("{}/BUILD.bazel".format(package), "\n".join(lines), executable=False) generate_package_aliases = repository_rule( From 831559ea1a0c19fb245f4254458080b9f649b265 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sat, 26 Aug 2023 17:46:19 -0700 Subject: [PATCH 32/96] Fix deps --- python/private/pypi.bzl | 5 +++-- python/private/pypi_repo.bzl | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index 98c336f22f..58799126b7 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -39,17 +39,18 @@ def generate_package_alias(intermediate): ) -def wrapped_py_wheel_library(name, wheel_repo_name, info): +def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, info): kwargs = {arg: info.get(arg) for arg in ( - "deps", "patches", "patch_args", "patch_tool", )} + deps = ["@{}//{}".format(alias_repo_name, dep) for dep in info.get("deps", [])] pycross_wheel_library( name = "library", wheel = "@{}//file".format(wheel_repo_name), enable_implicit_namespace_pkgs = True, visibility = ["//visibility:public"], + deps = deps, **kwargs ) diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index e696dd1184..3a8799a868 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -136,6 +136,7 @@ def _wheel_library_repo_impl(repository_ctx): """load("@{}//:intermediate.bzl", "INTERMEDIATE")""".format(repository_ctx.attr.intermediate_repo_name), """wrapped_py_wheel_library(""", """ name="library",""", + """ alias_repo_name="{}",""".format(repository_ctx.attr.alias_repo_name), """ wheel_repo_name="{}",""".format(repository_ctx.attr.wheel_repo_name), """ info=INTERMEDIATE["{}"]["{}"],""".format( repository_ctx.attr.intermediate_package, From 35bbf8ec3ec651620ee5582b96a06d3610dc8c0a Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sat, 26 Aug 2023 18:08:53 -0700 Subject: [PATCH 33/96] make patches actually work. --- .../pypi_install/intermediate_file_patcher.py | 2 ++ .../intermediate_file_x86_64_linux.json | 4 ++-- examples/pypi_install/main.py | 3 +++ examples/pypi_install/test.py | 3 +++ examples/pypi_install/third_party/BUILD.bazel | 1 + .../0001-Add-a-dummy-patch-for-requests.patch | 19 +++++++++++++++++++ python/private/pypi.bzl | 1 + python/private/wheel_installer.py | 10 +++++++++- python/private/wheel_library.bzl | 8 +++++++- 9 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 examples/pypi_install/third_party/requests/0001-Add-a-dummy-patch-for-requests.patch diff --git a/examples/pypi_install/intermediate_file_patcher.py b/examples/pypi_install/intermediate_file_patcher.py index f600ef7bf0..ad975d44b7 100644 --- a/examples/pypi_install/intermediate_file_patcher.py +++ b/examples/pypi_install/intermediate_file_patcher.py @@ -10,6 +10,7 @@ "patch_args": [ "-p1", ], + "patch_dir": "library/site-packages", }, } @@ -29,6 +30,7 @@ def main(argv): with intermediate_file.open("w") as file: json.dump(content, file, indent=4) + file.write("\n") if __name__ == "__main__": sys.exit(main(sys.argv)) diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index 05b5c86fc5..86b0a87667 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -93,7 +93,7 @@ "urllib3" ], "patches": [ - "@//third_party:requests/hello.patch" + "@//third_party:requests/0001-Add-a-dummy-patch-for-requests.patch" ], "patch_args": [ "-p1" @@ -123,4 +123,4 @@ "deps": [] } } -} \ No newline at end of file +} diff --git a/examples/pypi_install/main.py b/examples/pypi_install/main.py index fbf320bcbd..e04e431ce1 100644 --- a/examples/pypi_install/main.py +++ b/examples/pypi_install/main.py @@ -24,6 +24,9 @@ def cognitojwt_version() -> str: def requests_version() -> str: return requests.__version__ +def patched_hello() -> str: + return requests.patched_hello() + def main(argv): print(f"cognitojwt version: {cognitojwt_version()}") print(f"requests version: {requests_version()}") diff --git a/examples/pypi_install/test.py b/examples/pypi_install/test.py index 8a461915c8..f754702dbf 100644 --- a/examples/pypi_install/test.py +++ b/examples/pypi_install/test.py @@ -22,6 +22,9 @@ def test_main(self): self.assertEqual("1.4.1", main.cognitojwt_version()) self.assertEqual("2.31.0", main.requests_version()) + def test_patch(self): + self.assertEqual("Hello from a patch", main.patched_hello()) + if __name__ == "__main__": unittest.main() diff --git a/examples/pypi_install/third_party/BUILD.bazel b/examples/pypi_install/third_party/BUILD.bazel index e69de29bb2..0aa01210d4 100644 --- a/examples/pypi_install/third_party/BUILD.bazel +++ b/examples/pypi_install/third_party/BUILD.bazel @@ -0,0 +1 @@ +exports_files(glob(["*/*.patch"])) diff --git a/examples/pypi_install/third_party/requests/0001-Add-a-dummy-patch-for-requests.patch b/examples/pypi_install/third_party/requests/0001-Add-a-dummy-patch-for-requests.patch new file mode 100644 index 0000000000..e31414f843 --- /dev/null +++ b/examples/pypi_install/third_party/requests/0001-Add-a-dummy-patch-for-requests.patch @@ -0,0 +1,19 @@ +From 71a59346ecb9837c4a7cff7319063019bb555a54 Mon Sep 17 00:00:00 2001 +From: Philipp Schrader +Date: Sat, 26 Aug 2023 17:52:25 -0700 +Subject: [PATCH] Add a dummy patch for requests + +This needs to be applied to the `library/site-packages` directory. +--- + requests/hello.py | 2 ++ + 1 file changed, 2 insertions(+) + create mode 100644 requests/hello.py + +diff --git a/requests/hello.py b/requests/hello.py +new file mode 100644 +index 0000000..9d7c21d +--- /dev/null ++++ b/requests/hello.py +@@ -0,0 +1,2 @@ ++def patched_function(): ++ return "Hello from a patch" diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index 58799126b7..fe86eec731 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -44,6 +44,7 @@ def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, info): "patches", "patch_args", "patch_tool", + "patch_dir", )} deps = ["@{}//{}".format(alias_repo_name, dep) for dep in info.get("deps", [])] pycross_wheel_library( diff --git a/python/private/wheel_installer.py b/python/private/wheel_installer.py index 97b5697d9a..b8ee24f5e1 100644 --- a/python/private/wheel_installer.py +++ b/python/private/wheel_installer.py @@ -7,6 +7,7 @@ import argparse import os +import subprocess import shutil import sys import tempfile @@ -58,10 +59,11 @@ def main(args: Any) -> None: shutil.rmtree(link_dir, ignore_errors=True) patch_args = [args.patch_tool] + args.patch_arg + patch_dir = args.patch_dir or "." for patch in (args.patch or []): with patch.open("r") as stdin: print(f"Applying patch {patch}") - subprocess.run(patch_args, stdin=stdin, check=True) + subprocess.run(patch_args, stdin=stdin, check=True, cwd=patch_dir) @@ -114,6 +116,12 @@ def parse_flags(argv) -> Any: help="The tool to invoke when applying patches.", ) + parser.add_argument( + "--patch-dir", + type=str, + help="The directory from which to invoke patch_tool.", + ) + return parser.parse_args(argv[1:]) diff --git a/python/private/wheel_library.bzl b/python/private/wheel_library.bzl index 8895a3d655..9a0cbcaea8 100644 --- a/python/private/wheel_library.bzl +++ b/python/private/wheel_library.bzl @@ -19,8 +19,9 @@ def _pycross_wheel_library_impl(ctx): args.add_all(ctx.files.patches, format_each="--patch=%s") args.add_all(ctx.attr.patch_args, format_each="--patch-arg=%s") args.add("--patch-tool", ctx.attr.patch_tool) + args.add("--patch-dir", ctx.attr.patch_dir) - inputs = [wheel_file] + inputs = [wheel_file] + ctx.files.patches if name_file: inputs.append(name_file) args.add("--wheel-name-file", name_file) @@ -120,6 +121,7 @@ This option is required to support some packages which cannot handle the convers executable = True, ), "patches": attr.label_list( + allow_files = True, default = [], doc = "A list of files that are to be applied as patches after " + @@ -136,5 +138,9 @@ This option is required to support some packages which cannot handle the convers default = "patch", doc = "The patch(1) utility to use.", ), + "patch_dir": attr.string( + default = "", + doc = "The directory from which to invoke the patch_tool.", + ), } ) From d77b9979c6a13009e1191aece710414835ed8e08 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sat, 26 Aug 2023 18:22:16 -0700 Subject: [PATCH 34/96] Make patches work with `patch_dir` --- examples/pypi_install/intermediate_file_x86_64_linux.json | 3 ++- examples/pypi_install/main.py | 3 ++- python/private/wheel_installer.py | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index 86b0a87667..1d229e398f 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -97,7 +97,8 @@ ], "patch_args": [ "-p1" - ] + ], + "patch_dir": "site-packages" } }, "rsa": { diff --git a/examples/pypi_install/main.py b/examples/pypi_install/main.py index e04e431ce1..37e63ebf79 100644 --- a/examples/pypi_install/main.py +++ b/examples/pypi_install/main.py @@ -16,6 +16,7 @@ import pkg_resources import requests +import requests.hello def cognitojwt_version() -> str: @@ -25,7 +26,7 @@ def requests_version() -> str: return requests.__version__ def patched_hello() -> str: - return requests.patched_hello() + return requests.hello.patched_function() def main(argv): print(f"cognitojwt version: {cognitojwt_version()}") diff --git a/python/private/wheel_installer.py b/python/private/wheel_installer.py index b8ee24f5e1..6ff9b113ea 100644 --- a/python/private/wheel_installer.py +++ b/python/private/wheel_installer.py @@ -63,8 +63,9 @@ def main(args: Any) -> None: for patch in (args.patch or []): with patch.open("r") as stdin: print(f"Applying patch {patch}") - subprocess.run(patch_args, stdin=stdin, check=True, cwd=patch_dir) - + print("patch_dir = " + str(patch_dir)) + print("cwd = " + str(args.directory / patch_dir)) + subprocess.run(patch_args, stdin=stdin, check=True, cwd=args.directory / patch_dir) def parse_flags(argv) -> Any: From 6d85b4fda3b0cae1243c9d32a8cd54b74941821e Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 4 Sep 2023 11:20:02 -0700 Subject: [PATCH 35/96] fix a couple of things. --- examples/pypi_install/BUILD.bazel | 2 +- python/private/wheel_installer.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index 877734e8ec..084d41590f 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -34,7 +34,7 @@ compile_pip_requirements( # - Inject dependencies. # - Remove dependencies. # - Drop whole packages (is there such a use case?). - # - Add patches (support needed). + # - Add patches. # - Override/create aliases (support needed). intermediate_file_patcher = "//:intermediate_file_patcher", ) diff --git a/python/private/wheel_installer.py b/python/private/wheel_installer.py index 6ff9b113ea..85c7fd795e 100644 --- a/python/private/wheel_installer.py +++ b/python/private/wheel_installer.py @@ -62,9 +62,6 @@ def main(args: Any) -> None: patch_dir = args.patch_dir or "." for patch in (args.patch or []): with patch.open("r") as stdin: - print(f"Applying patch {patch}") - print("patch_dir = " + str(patch_dir)) - print("cwd = " + str(args.directory / patch_dir)) subprocess.run(patch_args, stdin=stdin, check=True, cwd=args.directory / patch_dir) From 36d0b859155fa2e7f3c46d4d0b713176204bdeb0 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Fri, 8 Sep 2023 06:16:39 -0700 Subject: [PATCH 36/96] Make wrapped_py_wheel_library work for multiple configs --- python/private/pypi.bzl | 36 +++++++++++++++++++++++-------- python/private/pypi_repo.bzl | 10 +++++---- python/private/wheel_installer.py | 1 + 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index fe86eec731..a927284380 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -16,6 +16,13 @@ load("//python/private:wheel_library.bzl", "pycross_wheel_library") load(":pypi_util.bzl", "generate_repo_name_for_extracted_wheel") +_FORWARDED_ARGS = ( + ("patches", None), + ("patch_args", None), + ("patch_tool", None), + ("patch_dir", None), +) + def generate_package_alias(intermediate): package = native.package_name() if package not in intermediate: @@ -38,20 +45,31 @@ def generate_package_alias(intermediate): visibility = ["//visibility:public"], ) +def _nop(value): + return value + +def _forward_arg(kwargs, intermediate, package, arg_name, default, transform): + select_dict = {} + + for config, info in intermediate[package].items(): + select_dict[config] = (transform or _nop)(info.get(arg_name, default)) + + kwargs[arg_name] = select(select_dict) + + +def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, intermediate, package): + kwargs = {} + for arg_name, default in _FORWARDED_ARGS: + _forward_arg(kwargs, intermediate, package, arg_name, default, _nop) + + to_alias_refs = lambda deps: ["@{}//{}".format(alias_repo_name, dep) for dep in deps] + + _forward_arg(kwargs, intermediate, package, "deps", [], to_alias_refs) -def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, info): - kwargs = {arg: info.get(arg) for arg in ( - "patches", - "patch_args", - "patch_tool", - "patch_dir", - )} - deps = ["@{}//{}".format(alias_repo_name, dep) for dep in info.get("deps", [])] pycross_wheel_library( name = "library", wheel = "@{}//file".format(wheel_repo_name), enable_implicit_namespace_pkgs = True, visibility = ["//visibility:public"], - deps = deps, **kwargs ) diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index 3a8799a868..32a3cf7201 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -103,6 +103,10 @@ def load_pypi_packages_internal(intermediate, intermediate_repo_name, alias_repo # set()? sha_indexed_infos[info["sha256"]] = True + # TODO(phil): Do we need to support individual py_library + # targets per config? Should only be an issue if someone needs + # to assemble a runfiles tree with multiple configurations in + # it. # TODO(phil): Can we add target_compatible_with information # here? _generate_py_library(package, config, info, intermediate_repo_name, alias_repo_name) @@ -138,10 +142,8 @@ def _wheel_library_repo_impl(repository_ctx): """ name="library",""", """ alias_repo_name="{}",""".format(repository_ctx.attr.alias_repo_name), """ wheel_repo_name="{}",""".format(repository_ctx.attr.wheel_repo_name), - """ info=INTERMEDIATE["{}"]["{}"],""".format( - repository_ctx.attr.intermediate_package, - repository_ctx.attr.intermediate_config, - ), + """ intermediate=INTERMEDIATE,""", + """ package="{}",""".format(repository_ctx.attr.intermediate_package), """)""", ] repository_ctx.file("BUILD.bazel", "\n".join(lines), executable=False) diff --git a/python/private/wheel_installer.py b/python/private/wheel_installer.py index 85c7fd795e..bb9daef105 100644 --- a/python/private/wheel_installer.py +++ b/python/private/wheel_installer.py @@ -104,6 +104,7 @@ def parse_flags(argv) -> Any: parser.add_argument( "--patch-arg", type=Path, + default=[], action="append", help="An argument for the patch_tool when applying the patches.", ) From 4b1c56d2f5a4e5ab0163d954bc716438ff2ad851 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Fri, 8 Sep 2023 07:41:41 -0700 Subject: [PATCH 37/96] maybe switch to transitive dep accumulation? --- examples/pypi_install/WORKSPACE | 2 ++ python/private/pypi.bzl | 42 +++++++++++++++++++++++++++++---- python/private/pypi_repo.bzl | 29 +++++++++++++++++++---- 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index 288ee54ab1..40d79e4116 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -25,6 +25,8 @@ pypi_install( name = "pypi_install", # Use fully resolved labels so that they're not accidentally interpreted as # repo-relative. + # TODO(phil): Add test to make sure that the config settings are mutually + # exclusive. pip_installation_report = { "@//:x86_64_linux": "//:intermediate_file_x86_64_linux.json", }, diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index a927284380..09b75b9dc9 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -12,7 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +load("@bazel_skylib//lib:new_sets.bzl", "sets") load("//python/private:wheel_library.bzl", "pycross_wheel_library") +load("//python:defs.bzl", "py_library") load(":pypi_util.bzl", "generate_repo_name_for_extracted_wheel") @@ -45,31 +47,61 @@ def generate_package_alias(intermediate): visibility = ["//visibility:public"], ) -def _nop(value): +def _no_transform(value): return value def _forward_arg(kwargs, intermediate, package, arg_name, default, transform): select_dict = {} for config, info in intermediate[package].items(): - select_dict[config] = (transform or _nop)(info.get(arg_name, default)) + select_dict[config] = transform(info.get(arg_name, default)) kwargs[arg_name] = select(select_dict) -def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, intermediate, package): +def _accumulate_transitive_deps_inner(intermediate, configs, package, already_accumulated): + for config in configs: + if config in intermediate[package]: + deps = intermediate[package][config].get("deps", []) + else: + deps = intermediate["//conditions:default"][config].get("deps", []) + + new_deps = sets.difference(sets.make(deps), already_accumulated[config]) + already_accumulated[config] = sets.union(already_accumulated[config], new_deps) + + for dep in sets.to_list(new_deps): + _accumulate_transitive_deps_inner(intermediate, configs, dep, already_accumulated) + +def _accumulate_transitive_deps(intermediate, configs, package): + already_accumulated = {config: sets.make([package]) for config in configs} + _accumulate_transitive_deps_inner(intermediate, configs, package, already_accumulated) + return select({config: sets.to_list(set) for config, set in already_accumulated}) + +def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, intermediate, configs, package): kwargs = {} for arg_name, default in _FORWARDED_ARGS: - _forward_arg(kwargs, intermediate, package, arg_name, default, _nop) + _forward_arg(kwargs, intermediate, package, arg_name, default, _no_transform) to_alias_refs = lambda deps: ["@{}//{}".format(alias_repo_name, dep) for dep in deps] _forward_arg(kwargs, intermediate, package, "deps", [], to_alias_refs) + deps = _accumulate_transitive_deps(intermediate, configs, package) + pycross_wheel_library( - name = "library", + name = "underlying_library", wheel = "@{}//file".format(wheel_repo_name), enable_implicit_namespace_pkgs = True, + # TODO(phil): Can we restrict visibility? visibility = ["//visibility:public"], + deps = deps, **kwargs ) + + py_library( + name = name, + deps = [ + ":underlying_library", + ], + visibility = ["//visibility:public"], + ) diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index 32a3cf7201..522664df09 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -35,10 +35,15 @@ def _pypi_install_impl(repository_ctx): else: intermediate = {} - repository_ctx.file( - "intermediate.bzl", - "INTERMEDIATE = {}\n".format(json.encode_indent(intermediate)), - executable=False) + configs = [] + for package in intermediate: + configs.extend(intermediate[package].keys()) + + lines = ["INTERMEDIATE = {}".format(json.encode_indent(intermediate)), ""] + repository_ctx.file("intermediate.bzl", "\n".join(lines), executable=False) + + lines = ["CONFIGS = {}".format(json.encode_indent(configs)), ""] + repository_ctx.file("configs.bzl", "\n".join(lines), executable=False) lines = [ """load("@rules_python//python/private:pypi_repo.bzl",""", @@ -138,11 +143,13 @@ def _wheel_library_repo_impl(repository_ctx): lines = [ """load("@rules_python//python/private:pypi.bzl", "wrapped_py_wheel_library")""", """load("@{}//:intermediate.bzl", "INTERMEDIATE")""".format(repository_ctx.attr.intermediate_repo_name), + """load("@{}//:configs.bzl", "CONFIGS")""".format(repository_ctx.attr.intermediate_repo_name), """wrapped_py_wheel_library(""", """ name="library",""", """ alias_repo_name="{}",""".format(repository_ctx.attr.alias_repo_name), """ wheel_repo_name="{}",""".format(repository_ctx.attr.wheel_repo_name), """ intermediate=INTERMEDIATE,""", + """ configs=CONFIGS,""", """ package="{}",""".format(repository_ctx.attr.intermediate_package), """)""", ] @@ -167,6 +174,11 @@ def _generate_package_aliases_impl(repository_ctx): fail("Expected intermediate.bzl to start with 'INTERMEDIATE = '. Did the implementation get out of sync?") intermediate = json.decode(bzl_intermediate[len("INTERMEDIATE = "):]) + dep_tracked_lines = [ + """load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")""", + """""", + ] + for package in intermediate: lines = [ """load("{}", "INTERMEDIATE")""".format(repository_ctx.attr.intermediate), @@ -175,6 +187,15 @@ def _generate_package_aliases_impl(repository_ctx): ] repository_ctx.file("{}/BUILD.bazel".format(package), "\n".join(lines), executable=False) + dep_tracked_lines += [ + """bool_flag(""", + """ name="{}",""".format(package), + """ build_setting_default = False,""", + """)""", + ] + + repository_ctx.file("_package_already_included/BUILD.bazel", "\n".join(dep_tracked_lines), executable=False) + generate_package_aliases = repository_rule( implementation = _generate_package_aliases_impl, From d40c04b55e01149564da387bea0a147f6c8fb191 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Fri, 8 Sep 2023 08:05:03 -0700 Subject: [PATCH 38/96] Fix circular dependencies maybe? --- python/private/pypi.bzl | 45 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index 09b75b9dc9..c517115dfe 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -61,35 +61,42 @@ def _forward_arg(kwargs, intermediate, package, arg_name, default, transform): def _accumulate_transitive_deps_inner(intermediate, configs, package, already_accumulated): for config in configs: - if config in intermediate[package]: - deps = intermediate[package][config].get("deps", []) - else: - deps = intermediate["//conditions:default"][config].get("deps", []) + pending_deps = sets.make([package]) - new_deps = sets.difference(sets.make(deps), already_accumulated[config]) - already_accumulated[config] = sets.union(already_accumulated[config], new_deps) + for _ in range(1000): + if sets.length(pending_deps) == 0: + break - for dep in sets.to_list(new_deps): - _accumulate_transitive_deps_inner(intermediate, configs, dep, already_accumulated) + dep = sets.to_list(pending_deps)[0] + sets.remove(pending_deps, dep) + + deps = intermediate[dep].get(config, "//conditions:default").get("deps", []) + new_deps = sets.difference(sets.make(deps), already_accumulated[config]) + new_deps = sets.difference(new_deps, pending_deps) + already_accumulated[config] = sets.union(already_accumulated[config], new_deps) + pending_deps = sets.union(pending_deps, new_deps) + + if sets.length(pending_deps) > 0: + fail("Failed to accumulate the transitive deps for {} in 1000 iterations!".format(package)) def _accumulate_transitive_deps(intermediate, configs, package): already_accumulated = {config: sets.make([package]) for config in configs} _accumulate_transitive_deps_inner(intermediate, configs, package, already_accumulated) - return select({config: sets.to_list(set) for config, set in already_accumulated}) + return {config: sets.to_list(sets.remove(set, package)) for config, set in already_accumulated.items()} + +def to_alias_refs(alias_repo_name, deps): + return ["@{}//{}".format(alias_repo_name, dep) for dep in deps] def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, intermediate, configs, package): kwargs = {} for arg_name, default in _FORWARDED_ARGS: _forward_arg(kwargs, intermediate, package, arg_name, default, _no_transform) - to_alias_refs = lambda deps: ["@{}//{}".format(alias_repo_name, dep) for dep in deps] - - _forward_arg(kwargs, intermediate, package, "deps", [], to_alias_refs) - - deps = _accumulate_transitive_deps(intermediate, configs, package) + deps_dict = _accumulate_transitive_deps(intermediate, configs, package) + deps = select({config: to_alias_refs(alias_repo_name, deps) for config, deps in deps_dict.items()}) pycross_wheel_library( - name = "underlying_library", + name = name, wheel = "@{}//file".format(wheel_repo_name), enable_implicit_namespace_pkgs = True, # TODO(phil): Can we restrict visibility? @@ -97,11 +104,3 @@ def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, intermediat deps = deps, **kwargs ) - - py_library( - name = name, - deps = [ - ":underlying_library", - ], - visibility = ["//visibility:public"], - ) From d2158f2571858d393d09726d23d0287a2a0204b6 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 13 Sep 2023 04:53:05 -0700 Subject: [PATCH 39/96] Introduce circular dependency --- .../intermediate_file_x86_64_linux.json | 1267 +++++++++++- examples/pypi_install/requirements.in | 3 + .../requirements_lock_x86_64_linux.txt | 1736 ++++++++++++++++- 3 files changed, 2974 insertions(+), 32 deletions(-) diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index 1d229e398f..850a7d4943 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -1,58 +1,979 @@ { + "aiohttp": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/5b/8d/821fcb268cfc056964a75da3823896b17eabaa4968a2414121bc93b0c501/aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1", + "deps": [ + "aiosignal", + "async-timeout", + "attrs", + "charset-normalizer", + "frozenlist", + "multidict", + "yarl" + ] + } + }, + "aiosignal": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", + "sha256": "f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", + "deps": [ + "frozenlist" + ] + } + }, + "alembic": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/a2/8b/46919127496036c8e990b2b236454a0d8655fd46e1df2fd35610a9cbc842/alembic-1.12.0-py3-none-any.whl", + "sha256": "03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f", + "deps": [ + "Mako", + "SQLAlchemy", + "typing-extensions" + ] + } + }, + "annotated-types": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/d8/f0/a2ee543a96cc624c35a9086f39b1ed2aa403c6d355dfe47a11ee5c64a164/annotated_types-0.5.0-py3-none-any.whl", + "sha256": "58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd", + "deps": [] + } + }, + "anyio": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl", + "sha256": "cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f", + "deps": [ + "exceptiongroup", + "idna", + "sniffio" + ] + } + }, + "apache-airflow": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/bb/2c/1aae9daf5eedc153ec64cb125317d1a7680450114b690cfa484a7217a9fa/apache_airflow-2.7.1-py3-none-any.whl", + "sha256": "06214ece464bbb54910220903081b84056d97e2271400ca01ee63743c41cf4f1", + "deps": [ + "alembic", + "apache-airflow-providers-common-sql", + "apache-airflow-providers-ftp", + "apache-airflow-providers-http", + "apache-airflow-providers-imap", + "apache-airflow-providers-sqlite", + "argcomplete", + "asgiref", + "attrs", + "blinker", + "cattrs", + "colorlog", + "configupdater", + "connexion", + "cron-descriptor", + "croniter", + "cryptography", + "deprecated", + "dill", + "flask", + "flask-appbuilder", + "flask-caching", + "flask-login", + "flask-session", + "flask-wtf", + "google-re2", + "graphviz", + "gunicorn", + "httpx", + "itsdangerous", + "jinja2", + "jsonschema", + "lazy-object-proxy", + "linkify-it-py", + "lockfile", + "markdown", + "markdown-it-py", + "markupsafe", + "marshmallow-oneofschema", + "mdit-py-plugins", + "opentelemetry-api", + "opentelemetry-exporter-otlp", + "packaging", + "pathspec", + "pendulum", + "pluggy", + "psutil", + "pydantic", + "pygments", + "pyjwt", + "python-daemon", + "python-dateutil", + "python-nvd3", + "python-slugify", + "rfc3339-validator", + "rich", + "rich-argparse", + "setproctitle", + "sqlalchemy", + "sqlalchemy-jsonfield", + "tabulate", + "tenacity", + "termcolor", + "typing-extensions", + "unicodecsv", + "werkzeug" + ] + } + }, + "apache-airflow-providers-common-sql": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/3f/18/77f2bd8b2f70fcd496737877c486c9d2a3bf86bdc95c869424d1e45bcaa4/apache_airflow_providers_common_sql-1.7.2-py3-none-any.whl", + "sha256": "5a0e6a1ffcde4d4d41660bcecdad33364ef81c8d98f0d8a3dcf385f0e419d80f", + "deps": [ + "apache-airflow", + "sqlparse" + ] + } + }, + "apache-airflow-providers-ftp": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/29/67/da4f2c02b865e0f624327d0a8903e867745cf42d5db3801e774325311f83/apache_airflow_providers_ftp-3.5.2-py3-none-any.whl", + "sha256": "a3960872de03467c289b925172f48dec45d028c992093cc3a6c45816e0e43536", + "deps": [ + "apache-airflow" + ] + } + }, + "apache-airflow-providers-http": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/bd/49/5560fdd14766314123c9d8580871c7bfc3251661cd3ea2c71ec41161eac4/apache_airflow_providers_http-4.5.2-py3-none-any.whl", + "sha256": "e890d02a64244cb70c36dc0155c2f97ae563c6c0ea3dfa9a050b787865897cbf", + "deps": [ + "aiohttp", + "apache-airflow", + "asgiref", + "requests", + "requests-toolbelt" + ] + } + }, + "apache-airflow-providers-imap": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/f6/f5/225708321453285d7c21e48316e969395fca1c6c5e9ded6126dee565a593/apache_airflow_providers_imap-3.3.2-py3-none-any.whl", + "sha256": "6c4511e30abac3ec888e9beee29e65fe3d0d92141fdea3d14edf117739378baa", + "deps": [ + "apache-airflow" + ] + } + }, + "apache-airflow-providers-sqlite": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/fc/71/a42e7d278363f470a22a8c6096c82d2233174aac45133db60da311850067/apache_airflow_providers_sqlite-3.4.3-py3-none-any.whl", + "sha256": "4ffa6a50f0ea1b4e51240b657dfec3fb026c87bdfa71af908a56461df6a6f2e0", + "deps": [ + "apache-airflow", + "apache-airflow-providers-common-sql" + ] + } + }, + "apispec": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/8c/fb/5b32dc208c0adadd1b9f08f0982c1a39c0bcc7a0f6206802a0c9086c4756/apispec-6.3.0-py3-none-any.whl", + "sha256": "95a0b9355785df998bb0e9b939237a30ee4c7428fd6ef97305eae3da06b9b339", + "deps": [ + "PyYAML", + "packaging" + ] + } + }, + "argcomplete": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/4f/ef/8b604222ba5e5190e25851aa3a5b754f2002361dc62a258a8e9f13e866f4/argcomplete-3.1.1-py3-none-any.whl", + "sha256": "35fa893a88deea85ea7b20d241100e64516d6af6d7b0ae2bed1d263d26f70948", + "deps": [] + } + }, + "asgiref": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/9b/80/b9051a4a07ad231558fcd8ffc89232711b4e618c15cb7a392a17384bbeef/asgiref-3.7.2-py3-none-any.whl", + "sha256": "89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e", + "deps": [ + "typing-extensions" + ] + } + }, + "async-timeout": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl", + "sha256": "7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028", + "deps": [] + } + }, + "attrs": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/f0/eb/fcb708c7bf5056045e9e98f62b93bd7467eb718b0202e7698eb11d66416c/attrs-23.1.0-py3-none-any.whl", + "sha256": "1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", + "deps": [] + } + }, + "Babel": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/df/c4/1088865e0246d7ecf56d819a233ab2b72f7d6ab043965ef327d0731b5434/Babel-2.12.1-py3-none-any.whl", + "sha256": "b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610", + "deps": [] + } + }, + "backoff": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", + "sha256": "63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", + "deps": [] + } + }, + "blinker": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/0d/f1/5f39e771cd730d347539bb74c6d496737b9d5f0a53bc9fdbf3e170f1ee48/blinker-1.6.2-py3-none-any.whl", + "sha256": "c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0", + "deps": [] + } + }, + "cachelib": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/93/70/58e525451478055b0fd2859b22226888a6985d404fe65e014fc4893d3b75/cachelib-0.9.0-py3-none-any.whl", + "sha256": "811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3", + "deps": [] + } + }, + "cattrs": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/3a/ba/05df14efaa0624fac6b1510e87f5ce446208d2f6ce50270a89b6268aebfe/cattrs-23.1.2-py3-none-any.whl", + "sha256": "b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4", + "deps": [ + "attrs", + "exceptiongroup", + "typing_extensions" + ] + } + }, "certifi": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", - "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716", - "deps": [] + "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", + "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716", + "deps": [] + } + }, + "cffi": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/2d/86/3ca57cddfa0419f6a95d1c8478f8f622ba597e3581fd501bbb915b20eb75/cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", + "deps": [ + "pycparser" + ] + } + }, + "charset-normalizer": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", + "deps": [] + } + }, + "click": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", + "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "deps": [] + } + }, + "clickclick": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/7a/7e/c08007d3fb2bbefb430437a3573373590abedc03566b785d7d6763b22480/clickclick-20.10.2-py2.py3-none-any.whl", + "sha256": "c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5", + "deps": [ + "PyYAML", + "click" + ] + } + }, + "cognitojwt": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/a5/69/97faafdc4f1900fa1b525cedae0f98aa30b0bb086d076f8d66c68a18b1b2/cognitojwt-1.4.1-py3-none-any.whl", + "sha256": "8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce", + "deps": [ + "python-jose" + ] + } + }, + "colorama": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", + "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "deps": [] + } + }, + "colorlog": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/51/62/61449c6bb74c2a3953c415b2cdb488e4f0518ac67b35e2b03a6d543035ca/colorlog-4.8.0-py2.py3-none-any.whl", + "sha256": "3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd", + "deps": [] + } + }, + "ConfigUpdater": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/4d/13/6791bba527baf3648be8aabaf6d3775027c3ebbf4000f2ae16867911b879/ConfigUpdater-3.1.1-py2.py3-none-any.whl", + "sha256": "805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286", + "deps": [] + } + }, + "connexion": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/ed/e6/851b3d7688115b176eb5d3e45055d1dc5b2b91708007064a38b0e93813ed/connexion-2.14.2-py2.py3-none-any.whl", + "sha256": "a73b96a0e07b16979a42cde7c7e26afe8548099e352cf350f80c57185e0e0b36", + "deps": [ + "PyYAML", + "clickclick", + "flask", + "flask", + "inflection", + "itsdangerous", + "itsdangerous", + "jsonschema", + "packaging", + "requests", + "werkzeug" + ] + } + }, + "cron-descriptor": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/24/a0/455f5a0181cf9a0d2e84d3a66c88de019dce5644ad9680825d1c8a403335/cron_descriptor-1.4.0.tar.gz", + "sha256": "b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd", + "deps": [] + } + }, + "croniter": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/f2/91/e5ae454da8200c6eb6cf94ca05d799b51e2cb2cc458a7737aebc0c5a21bb/croniter-1.4.1-py2.py3-none-any.whl", + "sha256": "9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128", + "deps": [ + "python-dateutil" + ] + } + }, + "cryptography": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/1a/c7/b8193a0859fed883738ae99d33fe90edf05c7e3d0fdb1726f8f53d85859e/cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", + "sha256": "49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", + "deps": [ + "cffi" + ] + } + }, + "Deprecated": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl", + "sha256": "6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", + "deps": [ + "wrapt" + ] + } + }, + "dill": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/f5/3a/74a29b11cf2cdfcd6ba89c0cecd70b37cd1ba7b77978ce611eb7a146a832/dill-0.3.7-py3-none-any.whl", + "sha256": "76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e", + "deps": [] + } + }, + "dnspython": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/f6/b4/0a9bee52c50f226a3cbfb54263d02bb421c7f2adc136520729c2c689c1e5/dnspython-2.4.2-py3-none-any.whl", + "sha256": "57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8", + "deps": [] + } + }, + "docutils": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl", + "sha256": "96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", + "deps": [] + } + }, + "ecdsa": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/09/d4/4f05f5d16a4863b30ba96c23b23e942da8889abfa1cdbabf2a0df12a4532/ecdsa-0.18.0-py2.py3-none-any.whl", + "sha256": "80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd", + "deps": [ + "six" + ] + } + }, + "email-validator": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/ba/ec/adc595d04e795b04bb0028fc6b067713fdb4a7e8cec44b428f7144fc432e/email_validator-1.3.1-py2.py3-none-any.whl", + "sha256": "49a72f5fa6ed26be1c964f0567d931d10bf3fdeeacdf97bc26ef1cd2a44e0bda", + "deps": [ + "dnspython", + "idna" + ] + } + }, + "exceptiongroup": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/ad/83/b71e58666f156a39fb29417e4c8ca4bc7400c0dd4ed9e8842ab54dc8c344/exceptiongroup-1.1.3-py3-none-any.whl", + "sha256": "343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3", + "deps": [] + } + }, + "Flask": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/9f/1a/8b6d48162861009d1e017a9740431c78d860809773b66cac220a11aa3310/Flask-2.2.5-py3-none-any.whl", + "sha256": "58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf", + "deps": [ + "Jinja2", + "Werkzeug", + "click", + "importlib-metadata", + "itsdangerous" + ] + } + }, + "Flask-AppBuilder": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/9b/13/7ed7265ee77655466292f6e6ba8c989ac60cb82f6450b2f0bd01804a5024/Flask_AppBuilder-4.3.6-py3-none-any.whl", + "sha256": "840480dfd43134bebf78f3c7dc909e324c2689d2d9f27aeb1880a8a25466bc8d", + "deps": [ + "Flask", + "Flask-Babel", + "Flask-JWT-Extended", + "Flask-Limiter", + "Flask-Login", + "Flask-SQLAlchemy", + "Flask-WTF", + "PyJWT", + "SQLAlchemy", + "WTForms", + "apispec", + "click", + "colorama", + "email-validator", + "jsonschema", + "marshmallow", + "marshmallow-sqlalchemy", + "prison", + "python-dateutil", + "sqlalchemy-utils" + ] + } + }, + "Flask-Babel": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/ab/3e/02331179ffab8b79e0383606a028b6a60fb1b4419b84935edd43223406a0/Flask_Babel-2.0.0-py3-none-any.whl", + "sha256": "e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468", + "deps": [ + "Babel", + "Flask", + "Jinja2", + "pytz" + ] + } + }, + "Flask-Caching": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/fe/99/9fb5a680701b695e5e375d902586bea2704ad5517c8aa9c4225f13db131a/Flask_Caching-2.0.2-py3-none-any.whl", + "sha256": "19571f2570e9b8dd9dd9d2f49d7cbee69c14ebe8cc001100b1eb98c379dd80ad", + "deps": [ + "Flask", + "cachelib" + ] + } + }, + "Flask-JWT-Extended": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/13/44/fa536c29c4014af7073474ad15a382f561db89c19fc4485ed0692942deb3/Flask_JWT_Extended-4.5.2-py2.py3-none-any.whl", + "sha256": "e0ef23d8c863746bd141046167073699e1a7b03c97169cbba70f05b8d9cd6b9e", + "deps": [ + "Flask", + "PyJWT", + "Werkzeug" + ] + } + }, + "Flask-Limiter": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/a2/ff/2dc82d9517172b67c2f5b13884777be9fe644cbfd6c52600076747d2f125/Flask_Limiter-3.5.0-py3-none-any.whl", + "sha256": "dbda4174f44e6cb858c6eb75e7488186f2977dd5d33d7028ba1aabf179de1bee", + "deps": [ + "Flask", + "limits", + "ordered-set", + "rich", + "typing-extensions" + ] + } + }, + "Flask-Login": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/a6/94/01b658bef1863a07f4738a322cce87d97be4362645255dc1182f7f5c075a/Flask_Login-0.6.2-py3-none-any.whl", + "sha256": "1ef79843f5eddd0f143c2cd994c1b05ac83c0401dc6234c143495af9a939613f", + "deps": [ + "Flask", + "Werkzeug" + ] + } + }, + "Flask-Session": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/3e/d4/b374183251054928ddb5e72f9a0d3d764d0f2af0638fbbdf205df26e55e3/flask_session-0.5.0-py3-none-any.whl", + "sha256": "1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631", + "deps": [ + "cachelib", + "flask" + ] + } + }, + "Flask-SQLAlchemy": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/26/2c/9088b6bd95bca539230bbe9ad446737ed391aab9a83aff403e18dded3e75/Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", + "sha256": "f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390", + "deps": [ + "Flask", + "SQLAlchemy" + ] + } + }, + "Flask-WTF": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/e0/06/102cdb72b0f98bf6ee73e9239e9cfb071e5ab8893037f6b12053b6b06a27/Flask_WTF-1.1.1-py3-none-any.whl", + "sha256": "7887d6f1ebb3e17bf648647422f0944c9a469d0fcf63e3b66fb9a83037e38b2c", + "deps": [ + "Flask", + "WTForms", + "itsdangerous" + ] + } + }, + "frozenlist": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/b5/03/7dec2e257bd173b5ca1f74477863b97d322149f6f0284d7decead8c5ceeb/frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087", + "deps": [] + } + }, + "google-re2": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/2a/92/41d653778fa7130db028d522b21f77329d10f09abd67b876cdc4564d5e9a/google_re2-1.1-2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", + "sha256": "1b9c1ffcfbc3095b6ff601ec2d2bf662988f6ea6763bc1c9d52bec55881f8fde", + "deps": [] + } + }, + "googleapis-common-protos": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/a7/bc/416a1ffeba4dcd072bc10523dac9ed97f2e7fc4b760580e2bdbdc1e2afdd/googleapis_common_protos-1.60.0-py2.py3-none-any.whl", + "sha256": "69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918", + "deps": [ + "protobuf" + ] + } + }, + "graphviz": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/de/5e/fcbb22c68208d39edff467809d06c9d81d7d27426460ebc598e55130c1aa/graphviz-0.20.1-py3-none-any.whl", + "sha256": "587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977", + "deps": [] + } + }, + "greenlet": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/e9/29/2ae545c4c0218b042c2bb0760c0f65e114cca1ab5e552dc23b0f118e428a/greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b", + "deps": [] + } + }, + "grpcio": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/5a/e8/c6bbb12ec726c80c05baaab5dc0d026798ef6e9f53edd7a3798655b9c242/grpcio-1.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "ba0af11938acf8cd4cf815c46156bcde36fa5850518120920d52620cc3ec1830", + "deps": [] + } + }, + "gunicorn": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/0e/2a/c3a878eccb100ccddf45c50b6b8db8cf3301a6adede6e31d48e8531cab13/gunicorn-21.2.0-py3-none-any.whl", + "sha256": "3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0", + "deps": [ + "packaging" + ] + } + }, + "h11": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", + "sha256": "e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", + "deps": [] + } + }, + "httpcore": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/ac/97/724afbb7925339f6214bf1fdb5714d1a462690466832bf8fb3fd497649f1/httpcore-0.18.0-py3-none-any.whl", + "sha256": "adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced", + "deps": [ + "anyio", + "certifi", + "h11", + "sniffio" + ] + } + }, + "httpx": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/33/0d/d9ce469af019741c8999711d36b270ff992ceb1a0293f73f9f34fdf131e9/httpx-0.25.0-py3-none-any.whl", + "sha256": "181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100", + "deps": [ + "certifi", + "httpcore", + "idna", + "sniffio" + ] + } + }, + "idna": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", + "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", + "deps": [] + } + }, + "importlib-metadata": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl", + "sha256": "3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", + "deps": [ + "zipp" + ] + } + }, + "importlib-resources": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/25/d4/592f53ce2f8dde8be5720851bd0ab71cc2e76c55978e4163ef1ab7e389bb/importlib_resources-6.0.1-py3-none-any.whl", + "sha256": "134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf", + "deps": [ + "zipp" + ] + } + }, + "inflection": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", + "sha256": "f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", + "deps": [] + } + }, + "itsdangerous": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl", + "sha256": "2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44", + "deps": [] + } + }, + "Jinja2": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/bc/c3/f068337a370801f372f2f8f6bad74a5c140f6fda3d9de154052708dd3c65/Jinja2-3.1.2-py3-none-any.whl", + "sha256": "6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61", + "deps": [ + "MarkupSafe" + ] + } + }, + "jsonschema": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/2b/ff/af59fd34bc4d7ac3e6e0cd1f3c10317d329b6c1aee179e8b24ad9a79fbac/jsonschema-4.19.0-py3-none-any.whl", + "sha256": "043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb", + "deps": [ + "attrs", + "jsonschema-specifications", + "referencing", + "rpds-py" + ] + } + }, + "jsonschema-specifications": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/1c/24/83349ac2189cc2435e84da3f69ba3c97314d3c0622628e55171c6798ed80/jsonschema_specifications-2023.7.1-py3-none-any.whl", + "sha256": "05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1", + "deps": [ + "referencing" + ] + } + }, + "lazy-object-proxy": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/4c/a4/cdd6f41a675a89ab584c78019a24adc533829764bcc85b0e24ed2678020c/lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006", + "deps": [] + } + }, + "limits": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/1d/58/bcdf5719709d13d8523117ec3eb6b027d1bec461cdc91d05bceb88d0aec1/limits-3.6.0-py3-none-any.whl", + "sha256": "32fe29a398352c71bc43d53773117d47e22c5ea4200aef28d3f5fdee10334cd7", + "deps": [ + "deprecated", + "importlib-resources", + "packaging", + "typing-extensions" + ] + } + }, + "linkify-it-py": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/1f/1a/16b0d2f66601ba3081f1d4177087c79fd1f11d17706ee01d373e4ba8e00d/linkify_it_py-2.0.2-py3-none-any.whl", + "sha256": "a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541", + "deps": [ + "uc-micro-py" + ] + } + }, + "lockfile": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl", + "sha256": "6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa", + "deps": [] + } + }, + "Mako": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/03/3b/68690a035ba7347860f1b8c0cde853230ba69ff41df5884ea7d89fe68cd3/Mako-1.2.4-py3-none-any.whl", + "sha256": "c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818", + "deps": [ + "MarkupSafe" + ] + } + }, + "Markdown": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/1a/b5/228c1cdcfe138f1a8e01ab1b54284c8b83735476cb22b6ba251656ed13ad/Markdown-3.4.4-py3-none-any.whl", + "sha256": "a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941", + "deps": [ + "importlib-metadata" + ] + } + }, + "markdown-it-py": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", + "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "deps": [ + "mdurl" + ] + } + }, + "MarkupSafe": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/de/63/cb7e71984e9159ec5f45b5e81e896c8bdd0e45fe3fc6ce02ab497f0d790e/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", + "deps": [] + } + }, + "marshmallow": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/ed/3c/cebfdcad015240014ff08b883d1c0c427f2ba45ae8c6572851b6ef136cad/marshmallow-3.20.1-py3-none-any.whl", + "sha256": "684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c", + "deps": [ + "packaging" + ] + } + }, + "marshmallow-oneofschema": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/ca/eb/3f6d90ba82b2dd319c7d3534a90ba3f4bdf2e332e89c2399fdc818051589/marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", + "sha256": "bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2", + "deps": [ + "marshmallow" + ] } }, - "cffi": { + "marshmallow-sqlalchemy": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/2d/86/3ca57cddfa0419f6a95d1c8478f8f622ba597e3581fd501bbb915b20eb75/cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", + "url": "https://files.pythonhosted.org/packages/d1/84/1f4d7393d04f2ae0d4098791d1901a713f45ba70ff6f3c35ff2f7fd81f7b/marshmallow_sqlalchemy-0.26.1-py2.py3-none-any.whl", + "sha256": "ba7493eeb8669a3bf00d8f906b657feaa87a740ae9e4ecf829cfd6ddf763d276", "deps": [ - "pycparser" + "SQLAlchemy", + "marshmallow" ] } }, - "charset-normalizer": { + "mdit-py-plugins": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", + "url": "https://files.pythonhosted.org/packages/e5/3c/fe85f19699a7b40c8f9ce8ecee7e269b9b3c94099306df6f9891bdefeedd/mdit_py_plugins-0.4.0-py3-none-any.whl", + "sha256": "b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9", + "deps": [ + "markdown-it-py" + ] + } + }, + "mdurl": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", + "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", "deps": [] } }, - "cognitojwt": { + "multidict": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/a5/69/97faafdc4f1900fa1b525cedae0f98aa30b0bb086d076f8d66c68a18b1b2/cognitojwt-1.4.1-py3-none-any.whl", - "sha256": "8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce", + "url": "https://files.pythonhosted.org/packages/69/48/2750fd3ace4d778b4e1f7110db3ad637906de3496abc9c450ce726b97337/multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1", + "deps": [] + } + }, + "opentelemetry-api": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/41/01/85c059d495679bb9ae50be223d6bd56d94bd050f51b25deffde2e6437463/opentelemetry_api-1.20.0-py3-none-any.whl", + "sha256": "982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5", "deps": [ - "python-jose" + "deprecated", + "importlib-metadata" ] } }, - "cryptography": { + "opentelemetry-exporter-otlp": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/1a/c7/b8193a0859fed883738ae99d33fe90edf05c7e3d0fdb1726f8f53d85859e/cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", - "sha256": "49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", + "url": "https://files.pythonhosted.org/packages/04/ba/4e22b13ff0ebaa30ea6e1b568463dc3fa53ed7076b2fc3de263682b69a5d/opentelemetry_exporter_otlp-1.20.0-py3-none-any.whl", + "sha256": "3b4d47726da83fef84467bdf96da4f8f3d1a61b35db3c16354c391ce8e9decf6", "deps": [ - "cffi" + "opentelemetry-exporter-otlp-proto-grpc", + "opentelemetry-exporter-otlp-proto-http" ] } }, - "ecdsa": { + "opentelemetry-exporter-otlp-proto-common": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/09/d4/4f05f5d16a4863b30ba96c23b23e942da8889abfa1cdbabf2a0df12a4532/ecdsa-0.18.0-py2.py3-none-any.whl", - "sha256": "80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd", + "url": "https://files.pythonhosted.org/packages/89/13/1c6f7f1d81839ecfd4b61f8648c3d1843362e9c927a9b4e59fe4c29cec14/opentelemetry_exporter_otlp_proto_common-1.20.0-py3-none-any.whl", + "sha256": "dd63209b40702636ab6ae76a06b401b646ad7b008a906ecb41222d4af24fbdef", + "deps": [ + "backoff", + "opentelemetry-proto" + ] + } + }, + "opentelemetry-exporter-otlp-proto-grpc": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/9e/a7/ce3ba7618887c08835c2f9c2fcfc4fcc46d9af7b62e2d2c9ea80d6604cf7/opentelemetry_exporter_otlp_proto_grpc-1.20.0-py3-none-any.whl", + "sha256": "7c3f066065891b56348ba2c7f9df6ec635a712841cae0a36f2f6a81642ae7dec", + "deps": [ + "backoff", + "deprecated", + "googleapis-common-protos", + "grpcio", + "opentelemetry-api", + "opentelemetry-exporter-otlp-proto-common", + "opentelemetry-proto", + "opentelemetry-sdk" + ] + } + }, + "opentelemetry-exporter-otlp-proto-http": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/d8/05/764b6ff9a70d9c5f749cea38072f830f577b0e01e144522522258924b626/opentelemetry_exporter_otlp_proto_http-1.20.0-py3-none-any.whl", + "sha256": "03f6e768ad25f1c3a9586e8c695db4a4adf978f8546a1285fa962e16bfbb0bd6", + "deps": [ + "backoff", + "deprecated", + "googleapis-common-protos", + "opentelemetry-api", + "opentelemetry-exporter-otlp-proto-common", + "opentelemetry-proto", + "opentelemetry-sdk", + "requests" + ] + } + }, + "opentelemetry-proto": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/68/8b/90f0672651e80fca84eb4952ae48b6d5776b2329c6d7bf70d937535719d2/opentelemetry_proto-1.20.0-py3-none-any.whl", + "sha256": "512c3d2c6864fb7547a69577c3907348e6c985b7a204533563cb4c4c5046203b", + "deps": [ + "protobuf" + ] + } + }, + "opentelemetry-sdk": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/fa/0a/ffb64bc8177fef5fdb97e4e5dcce9924184090620b3fc97b9c656e06b2e8/opentelemetry_sdk-1.20.0-py3-none-any.whl", + "sha256": "f2230c276ff4c63ea09b3cb2e2ac6b1265f90af64e8d16bbf275c81a9ce8e804", + "deps": [ + "opentelemetry-api", + "opentelemetry-semantic-conventions", + "typing-extensions" + ] + } + }, + "opentelemetry-semantic-conventions": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/aa/78/7a7508d16d32f92d6b206b2e367c5f044b3e652e7f385bbf17f49baad189/opentelemetry_semantic_conventions-0.41b0-py3-none-any.whl", + "sha256": "45404391ed9e50998183a4925ad1b497c01c143f06500c3b9c3d0013492bb0f2", + "deps": [] + } + }, + "ordered-set": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl", + "sha256": "046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562", + "deps": [] + } + }, + "packaging": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/ab/c3/57f0601a2d4fe15de7a553c00adbc901425661bf048f2a22dfc500caf121/packaging-23.1-py3-none-any.whl", + "sha256": "994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "deps": [] + } + }, + "pathspec": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/b4/2a/9b1be29146139ef459188f5e420a66e835dda921208db600b7037093891f/pathspec-0.11.2-py3-none-any.whl", + "sha256": "1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", + "deps": [] + } + }, + "pendulum": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/8e/4b/b2042f5122a4b3508c736304e38e8b41e2feed9f3d8c08a03d1de10a2a2b/pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", + "sha256": "94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7", + "deps": [ + "python-dateutil", + "pytzdata" + ] + } + }, + "pluggy": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/05/b8/42ed91898d4784546c5f06c60506400548db3f7a4b3fb441cba4e5c17952/pluggy-1.3.0-py3-none-any.whl", + "sha256": "d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7", + "deps": [] + } + }, + "prison": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/f1/bd/e55e14cd213174100be0353824f2add41e8996c6f32081888897e8ec48b5/prison-0.2.1-py2.py3-none-any.whl", + "sha256": "f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5", "deps": [ "six" ] } }, - "idna": { + "protobuf": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", - "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", + "url": "https://files.pythonhosted.org/packages/bb/c3/6a06208ecf0934ecaf509b51c52a6cf688586f54ae81ac65c56124571494/protobuf-4.24.3-cp37-abi3-manylinux2014_x86_64.whl", + "sha256": "f6ccbcf027761a2978c1406070c3788f6de4a4b2cc20800cc03d52df716ad675", + "deps": [] + } + }, + "psutil": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/af/4d/389441079ecef400e2551a3933224885a7bde6b8a4810091d628cdd75afe/psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4", "deps": [] } }, @@ -70,6 +991,60 @@ "deps": [] } }, + "pydantic": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/82/06/fafdc75e48b248eff364b4249af4bcc6952225e8f20e8205820afc66e88e/pydantic-2.3.0-py3-none-any.whl", + "sha256": "45b5e446c6dfaad9444819a293b921a40e1db1aa61ea08aede0522529ce90e81", + "deps": [ + "annotated-types", + "pydantic-core", + "typing-extensions" + ] + } + }, + "pydantic_core": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/18/54/6d64dff3e49e7faf4f5b989b49e46dd8b592d1e3f3db2113f4aaf1defdd3/pydantic_core-2.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "171a4718860790f66d6c2eda1d95dd1edf64f864d2e9f9115840840cf5b5713f", + "deps": [ + "typing-extensions" + ] + } + }, + "Pygments": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/43/88/29adf0b44ba6ac85045e63734ae0997d3c58d8b1a91c914d240828d0d73d/Pygments-2.16.1-py3-none-any.whl", + "sha256": "13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", + "deps": [] + } + }, + "PyJWT": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/2b/4f/e04a8067c7c96c364cef7ef73906504e2f40d690811c021e1a1901473a19/PyJWT-2.8.0-py3-none-any.whl", + "sha256": "59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320", + "deps": [] + } + }, + "python-daemon": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/83/7f/feffd97af851e2a837b5ca9bfbe570002c45397734724e4abfd4c62fdd0d/python_daemon-3.0.1-py3-none-any.whl", + "sha256": "42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341", + "deps": [ + "docutils", + "lockfile", + "setuptools" + ] + } + }, + "python-dateutil": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", + "sha256": "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9", + "deps": [ + "six" + ] + } + }, "python-jose": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/bd/2d/e94b2f7bab6773c70efc70a61d66e312e1febccd9e0db6b9e0adf58cbad1/python_jose-3.3.0-py2.py3-none-any.whl", @@ -82,6 +1057,56 @@ ] } }, + "python-nvd3": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/0b/aa/97165daa6e319409c5c2582e62736a7353bda3c90d90fdcb0b11e116dd2d/python-nvd3-0.15.0.tar.gz", + "sha256": "fbd75ff47e0ef255b4aa4f3a8b10dc8b4024aa5a9a7abed5b2406bd3cb817715", + "deps": [ + "Jinja2", + "python-slugify" + ] + } + }, + "python-slugify": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/b4/85/6aa722a11307ec572682023b76cad4c52cda708dfc25fcb4b4a6051da7ab/python_slugify-8.0.1-py2.py3-none-any.whl", + "sha256": "70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395", + "deps": [ + "text-unidecode" + ] + } + }, + "pytz": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/32/4d/aaf7eff5deb402fd9a24a1449a8119f00d74ae9c2efa79f8ef9994261fc2/pytz-2023.3.post1-py2.py3-none-any.whl", + "sha256": "ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7", + "deps": [] + } + }, + "pytzdata": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/e0/4f/4474bda990ee740a020cbc3eb271925ef7daa7c8444240d34ff62c8442a3/pytzdata-2020.1-py2.py3-none-any.whl", + "sha256": "e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f", + "deps": [] + } + }, + "PyYAML": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "deps": [] + } + }, + "referencing": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/be/8e/56d6f1e2d591f4d6cbcba446cac4a1b0dc4f584537e2071d9bcee8eeab6b/referencing-0.30.2-py3-none-any.whl", + "sha256": "449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf", + "deps": [ + "attrs", + "rpds-py" + ] + } + }, "requests": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", @@ -93,12 +1118,56 @@ "urllib3" ], "patches": [ - "@//third_party:requests/0001-Add-a-dummy-patch-for-requests.patch" + "@//third_party:requests/hello.patch" ], "patch_args": [ "-p1" ], - "patch_dir": "site-packages" + "patch_dir": "library/site-packages" + } + }, + "requests-toolbelt": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", + "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", + "deps": [ + "requests" + ] + } + }, + "rfc3339-validator": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", + "sha256": "24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", + "deps": [ + "six" + ] + } + }, + "rich": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/8d/5f/21a93b2ec205f4b79853ff6e838e3c99064d5dbe85ec6b05967506f14af0/rich-13.5.2-py3-none-any.whl", + "sha256": "146a90b3b6b47cac4a73c12866a499e9817426423f57c5a66949c086191a8808", + "deps": [ + "markdown-it-py", + "pygments" + ] + } + }, + "rich-argparse": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/c3/7a/0e398b736af0e37c733294f91907d5f979ca99a9c75f97213b0ab02d9a05/rich_argparse-1.3.0-py3-none-any.whl", + "sha256": "1a5eda1659c0a215862fe3630fcbe68d7792f18a8106baaf4e005b9896acc6f6", + "deps": [ + "rich" + ] + } + }, + "rpds-py": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/71/3c/23591f5992c3fc95da5a256faf03b738b90ed4b8708ec6114728f64a83d6/rpds_py-0.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "b8578fc6c8bdd0201327503720fa581000b4bd3934abbf07e2628d1ad3de157d", + "deps": [] } }, "rsa": { @@ -110,6 +1179,20 @@ ] } }, + "setproctitle": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/b7/7e/4f71712c98fd06b3075c93a1a2135c5f656191b2aae30895ca7bc7a0da03/setproctitle-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4", + "deps": [] + } + }, + "setuptools": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/bb/26/7945080113158354380a12ce26873dd6c1ebd88d47f5bc24e2c5bb38c16a/setuptools-68.2.2-py3-none-any.whl", + "sha256": "b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a", + "deps": [] + } + }, "six": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", @@ -117,11 +1200,143 @@ "deps": [] } }, + "sniffio": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/c3/a0/5dba8ed157b0136607c7f2151db695885606968d1fae123dc3391e0cfdbf/sniffio-1.3.0-py3-none-any.whl", + "sha256": "eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384", + "deps": [] + } + }, + "SQLAlchemy": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/1b/21/3aa5406575603c15a9eb1e76d5f6a7c7d29682eedb9f643a43e54e8c4f29/SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5", + "deps": [ + "greenlet" + ] + } + }, + "SQLAlchemy-JSONField": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/38/1c/283e6216c21827fb1358f2f409432828f9df4e402182cf590a1cc5a8874f/SQLAlchemy_JSONField-1.0.1.post0-py3-none-any.whl", + "sha256": "d6f1e5ee329a3c0d9d164e40d81a2143ac8332e09988fbbaff84179dac5503d4", + "deps": [ + "sqlalchemy" + ] + } + }, + "SQLAlchemy-Utils": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/73/d8/3863fdfe6b27f6c0dffc650aaa2929f313b33aea615b102279fd46ab550b/SQLAlchemy_Utils-0.41.1-py3-none-any.whl", + "sha256": "6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801", + "deps": [ + "SQLAlchemy" + ] + } + }, + "sqlparse": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/98/5a/66d7c9305baa9f11857f247d4ba761402cea75db6058ff850ed7128957b7/sqlparse-0.4.4-py3-none-any.whl", + "sha256": "5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3", + "deps": [] + } + }, + "tabulate": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", + "sha256": "024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", + "deps": [] + } + }, + "tenacity": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl", + "sha256": "ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c", + "deps": [] + } + }, + "termcolor": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/67/e1/434566ffce04448192369c1a282931cf4ae593e91907558eaecd2e9f2801/termcolor-2.3.0-py3-none-any.whl", + "sha256": "3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475", + "deps": [] + } + }, + "text-unidecode": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", + "sha256": "1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", + "deps": [] + } + }, + "typing_extensions": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", + "sha256": "440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", + "deps": [] + } + }, + "uc-micro-py": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/d1/1c/5aeb94aa980da111e4fd0c0fbe5ad95ed5bf9bd957f8e2a6178b85ff4da8/uc_micro_py-1.0.2-py3-none-any.whl", + "sha256": "8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0", + "deps": [] + } + }, + "unicodecsv": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz", + "sha256": "018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc", + "deps": [] + } + }, "urllib3": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/8a/03/ad9306a50d05c166e3456fe810f33cee2b8b2a7a6818ec5d4908c4ec6b36/urllib3-2.0.3-py3-none-any.whl", "sha256": "48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1", "deps": [] } + }, + "Werkzeug": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/f6/f8/9da63c1617ae2a1dec2fbf6412f3a0cfe9d4ce029eccbda6e1e4258ca45f/Werkzeug-2.2.3-py3-none-any.whl", + "sha256": "56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612", + "deps": [ + "MarkupSafe" + ] + } + }, + "wrapt": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/dd/eb/389f9975a6be31ddd19d29128a11f1288d07b624e464598a4b450f8d007e/wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29", + "deps": [] + } + }, + "WTForms": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/eb/2e/199a0edf6577af771a68fbd950d98f0c1a16bb5fa956e45772005318c702/WTForms-3.0.1-py3-none-any.whl", + "sha256": "837f2f0e0ca79481b92884962b914eba4e72b7a2daaf1f939c890ed0124b834b", + "deps": [ + "MarkupSafe" + ] + } + }, + "yarl": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/11/3d/785761e64dc90fda6feb9bd0459dc55ebe282a7d4564642a4a8ee277e0c0/yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955", + "deps": [ + "idna", + "multidict" + ] + } + }, + "zipp": { + "@//:x86_64_linux": { + "url": "https://files.pythonhosted.org/packages/8c/08/d3006317aefe25ea79d3b76c9650afabaf6d63d1c8443b236e7405447503/zipp-3.16.2-py3-none-any.whl", + "sha256": "679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", + "deps": [] + } } } diff --git a/examples/pypi_install/requirements.in b/examples/pypi_install/requirements.in index 1ec713a172..b7bfd1391f 100644 --- a/examples/pypi_install/requirements.in +++ b/examples/pypi_install/requirements.in @@ -3,3 +3,6 @@ cognitojwt # Common dependency whose functionality is easy to validate. requests + +# A library with a circular dependency. +apache-airflow diff --git a/examples/pypi_install/requirements_lock_x86_64_linux.txt b/examples/pypi_install/requirements_lock_x86_64_linux.txt index c339139b9d..39a4ac2ca1 100644 --- a/examples/pypi_install/requirements_lock_x86_64_linux.txt +++ b/examples/pypi_install/requirements_lock_x86_64_linux.txt @@ -4,10 +4,202 @@ # # bazel run //:requirements.update # +aiohttp==3.8.5 \ + --hash=sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67 \ + --hash=sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c \ + --hash=sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda \ + --hash=sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755 \ + --hash=sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d \ + --hash=sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5 \ + --hash=sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548 \ + --hash=sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690 \ + --hash=sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84 \ + --hash=sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4 \ + --hash=sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a \ + --hash=sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a \ + --hash=sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9 \ + --hash=sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef \ + --hash=sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b \ + --hash=sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a \ + --hash=sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d \ + --hash=sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945 \ + --hash=sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634 \ + --hash=sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7 \ + --hash=sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691 \ + --hash=sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802 \ + --hash=sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c \ + --hash=sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0 \ + --hash=sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8 \ + --hash=sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82 \ + --hash=sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a \ + --hash=sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975 \ + --hash=sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b \ + --hash=sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d \ + --hash=sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3 \ + --hash=sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7 \ + --hash=sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e \ + --hash=sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5 \ + --hash=sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649 \ + --hash=sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff \ + --hash=sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e \ + --hash=sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c \ + --hash=sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22 \ + --hash=sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df \ + --hash=sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e \ + --hash=sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780 \ + --hash=sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905 \ + --hash=sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51 \ + --hash=sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543 \ + --hash=sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6 \ + --hash=sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873 \ + --hash=sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f \ + --hash=sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35 \ + --hash=sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938 \ + --hash=sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b \ + --hash=sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d \ + --hash=sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8 \ + --hash=sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c \ + --hash=sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af \ + --hash=sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42 \ + --hash=sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3 \ + --hash=sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc \ + --hash=sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8 \ + --hash=sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410 \ + --hash=sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c \ + --hash=sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825 \ + --hash=sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9 \ + --hash=sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53 \ + --hash=sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a \ + --hash=sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc \ + --hash=sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8 \ + --hash=sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c \ + --hash=sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a \ + --hash=sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b \ + --hash=sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd \ + --hash=sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14 \ + --hash=sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2 \ + --hash=sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c \ + --hash=sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9 \ + --hash=sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692 \ + --hash=sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1 \ + --hash=sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa \ + --hash=sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a \ + --hash=sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de \ + --hash=sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91 \ + --hash=sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761 \ + --hash=sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd \ + --hash=sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced \ + --hash=sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28 \ + --hash=sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8 \ + --hash=sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824 + # via apache-airflow-providers-http +aiosignal==1.3.1 \ + --hash=sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc \ + --hash=sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17 + # via aiohttp +alembic==1.12.0 \ + --hash=sha256:03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f \ + --hash=sha256:8e7645c32e4f200675e69f0745415335eb59a3663f5feb487abfa0b30c45888b + # via apache-airflow +annotated-types==0.5.0 \ + --hash=sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802 \ + --hash=sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd + # via pydantic +anyio==4.0.0 \ + --hash=sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f \ + --hash=sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a + # via httpcore +apache-airflow==2.7.1 \ + --hash=sha256:06214ece464bbb54910220903081b84056d97e2271400ca01ee63743c41cf4f1 \ + --hash=sha256:b4fead8f3e09a673ece479c8cc398a61fa4f2fa13626ac6588f1813f2bd21920 + # via + # -r requirements.in + # apache-airflow-providers-common-sql + # apache-airflow-providers-ftp + # apache-airflow-providers-http + # apache-airflow-providers-imap + # apache-airflow-providers-sqlite +apache-airflow-providers-common-sql==1.7.2 \ + --hash=sha256:5a0e6a1ffcde4d4d41660bcecdad33364ef81c8d98f0d8a3dcf385f0e419d80f \ + --hash=sha256:e268a8f0a224c092136a30e1ddec196edcaa861ff69ac26f270f18d8eca986c6 + # via + # apache-airflow + # apache-airflow-providers-sqlite +apache-airflow-providers-ftp==3.5.2 \ + --hash=sha256:a3960872de03467c289b925172f48dec45d028c992093cc3a6c45816e0e43536 \ + --hash=sha256:f5994d2f43664eb946b0e6f868991ec83efd8d37bf7488345eeeeb0168a23d81 + # via apache-airflow +apache-airflow-providers-http==4.5.2 \ + --hash=sha256:73a1107ce1350a68c6fcec8aa4b5bd5a837e71f63fc2bce4210183e53bb24f17 \ + --hash=sha256:e890d02a64244cb70c36dc0155c2f97ae563c6c0ea3dfa9a050b787865897cbf + # via apache-airflow +apache-airflow-providers-imap==3.3.2 \ + --hash=sha256:3853c54f71d48f8f7417c154168a99c5b999babf0695dc814bba99cb2aa61a1f \ + --hash=sha256:6c4511e30abac3ec888e9beee29e65fe3d0d92141fdea3d14edf117739378baa + # via apache-airflow +apache-airflow-providers-sqlite==3.4.3 \ + --hash=sha256:347d2db03eaa5ea9fef414666565ffa5e849935cbc30e37237edcaa822b5ced8 \ + --hash=sha256:4ffa6a50f0ea1b4e51240b657dfec3fb026c87bdfa71af908a56461df6a6f2e0 + # via apache-airflow +apispec[yaml]==6.3.0 \ + --hash=sha256:6cb08d92ce73ff0b3bf46cb2ea5c00d57289b0f279fb0256a3df468182ba5344 \ + --hash=sha256:95a0b9355785df998bb0e9b939237a30ee4c7428fd6ef97305eae3da06b9b339 + # via flask-appbuilder +argcomplete==3.1.1 \ + --hash=sha256:35fa893a88deea85ea7b20d241100e64516d6af6d7b0ae2bed1d263d26f70948 \ + --hash=sha256:6c4c563f14f01440aaffa3eae13441c5db2357b5eec639abe7c0b15334627dff + # via apache-airflow +asgiref==3.7.2 \ + --hash=sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e \ + --hash=sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed + # via + # apache-airflow + # apache-airflow-providers-http +async-timeout==4.0.3 \ + --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ + --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 + # via aiohttp +attrs==23.1.0 \ + --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ + --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 + # via + # aiohttp + # apache-airflow + # cattrs + # jsonschema + # referencing +babel==2.12.1 \ + --hash=sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610 \ + --hash=sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455 + # via flask-babel +backoff==2.2.1 \ + --hash=sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba \ + --hash=sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8 + # via + # opentelemetry-exporter-otlp-proto-common + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +blinker==1.6.2 \ + --hash=sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213 \ + --hash=sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0 + # via apache-airflow +cachelib==0.9.0 \ + --hash=sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5 \ + --hash=sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3 + # via + # flask-caching + # flask-session +cattrs==23.1.2 \ + --hash=sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4 \ + --hash=sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657 + # via apache-airflow certifi==2023.5.7 \ --hash=sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7 \ --hash=sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716 - # via requests + # via + # httpcore + # httpx + # requests cffi==1.15.1 \ --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ @@ -150,11 +342,47 @@ charset-normalizer==3.1.0 \ --hash=sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326 \ --hash=sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df \ --hash=sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab - # via requests + # via + # aiohttp + # requests +click==8.1.7 \ + --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ + --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de + # via + # clickclick + # flask + # flask-appbuilder +clickclick==20.10.2 \ + --hash=sha256:4efb13e62353e34c5eef7ed6582c4920b418d7dedc86d819e22ee089ba01802c \ + --hash=sha256:c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5 + # via connexion cognitojwt==1.4.1 \ --hash=sha256:8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce \ --hash=sha256:a9f751942517ecf85da9f14674749390aad268e4b0155ef7d133aa50800aa15a # via -r requirements.in +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via flask-appbuilder +colorlog==4.8.0 \ + --hash=sha256:3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd \ + --hash=sha256:59b53160c60902c405cdec28d38356e09d40686659048893e026ecbd589516b1 + # via apache-airflow +configupdater==3.1.1 \ + --hash=sha256:46f0c74d73efa723776764b43c9739f68052495dd3d734319c1d0eb58511f15b \ + --hash=sha256:805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286 + # via apache-airflow +connexion[flask]==2.14.2 \ + --hash=sha256:a73b96a0e07b16979a42cde7c7e26afe8548099e352cf350f80c57185e0e0b36 \ + --hash=sha256:dbc06f52ebeebcf045c9904d570f24377e8bbd5a6521caef15a06f634cf85646 + # via apache-airflow +cron-descriptor==1.4.0 \ + --hash=sha256:b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd + # via apache-airflow +croniter==1.4.1 \ + --hash=sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361 \ + --hash=sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128 + # via apache-airflow cryptography==41.0.2 \ --hash=sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711 \ --hash=sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7 \ @@ -179,15 +407,813 @@ cryptography==41.0.2 \ --hash=sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee \ --hash=sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f \ --hash=sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14 - # via python-jose + # via + # apache-airflow + # python-jose +deprecated==1.2.14 \ + --hash=sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c \ + --hash=sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3 + # via + # apache-airflow + # limits + # opentelemetry-api + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +dill==0.3.7 \ + --hash=sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e \ + --hash=sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03 + # via apache-airflow +dnspython==2.4.2 \ + --hash=sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8 \ + --hash=sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984 + # via email-validator +docutils==0.20.1 \ + --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ + --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b + # via python-daemon ecdsa==0.18.0 \ --hash=sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49 \ --hash=sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd # via python-jose +email-validator==1.3.1 \ + --hash=sha256:49a72f5fa6ed26be1c964f0567d931d10bf3fdeeacdf97bc26ef1cd2a44e0bda \ + --hash=sha256:d178c5c6fa6c6824e9b04f199cf23e79ac15756786573c190d2ad13089411ad2 + # via flask-appbuilder +exceptiongroup==1.1.3 \ + --hash=sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9 \ + --hash=sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3 + # via + # anyio + # cattrs +flask==2.2.5 \ + --hash=sha256:58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf \ + --hash=sha256:edee9b0a7ff26621bd5a8c10ff484ae28737a2410d99b0bb9a6850c7fb977aa0 + # via + # apache-airflow + # connexion + # flask-appbuilder + # flask-babel + # flask-caching + # flask-jwt-extended + # flask-limiter + # flask-login + # flask-session + # flask-sqlalchemy + # flask-wtf +flask-appbuilder==4.3.6 \ + --hash=sha256:840480dfd43134bebf78f3c7dc909e324c2689d2d9f27aeb1880a8a25466bc8d \ + --hash=sha256:8ca9710fa7d2704747d195e11b487d45a571f40559d8399d9d5dfa42ea1f3c78 + # via apache-airflow +flask-babel==2.0.0 \ + --hash=sha256:e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468 \ + --hash=sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d + # via flask-appbuilder +flask-caching==2.0.2 \ + --hash=sha256:19571f2570e9b8dd9dd9d2f49d7cbee69c14ebe8cc001100b1eb98c379dd80ad \ + --hash=sha256:24b60c552d59a9605cc1b6a42c56cdb39a82a28dab4532bbedb9222ae54ecb4e + # via apache-airflow +flask-jwt-extended==4.5.2 \ + --hash=sha256:ba56245ba43b71c8ae936784b867625dce8b9956faeedec2953222e57942fb0b \ + --hash=sha256:e0ef23d8c863746bd141046167073699e1a7b03c97169cbba70f05b8d9cd6b9e + # via flask-appbuilder +flask-limiter==3.5.0 \ + --hash=sha256:13a3491b994c49f7cb4706587a38ca47e8162b576530472df38be68104f299c0 \ + --hash=sha256:dbda4174f44e6cb858c6eb75e7488186f2977dd5d33d7028ba1aabf179de1bee + # via flask-appbuilder +flask-login==0.6.2 \ + --hash=sha256:1ef79843f5eddd0f143c2cd994c1b05ac83c0401dc6234c143495af9a939613f \ + --hash=sha256:c0a7baa9fdc448cdd3dd6f0939df72eec5177b2f7abe6cb82fc934d29caac9c3 + # via + # apache-airflow + # flask-appbuilder +flask-session==0.5.0 \ + --hash=sha256:1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631 \ + --hash=sha256:190875e6aebf2953c6803d42379ef3b934bc209ef8ef006f97aecb08f5aaeb86 + # via apache-airflow +flask-sqlalchemy==2.5.1 \ + --hash=sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912 \ + --hash=sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390 + # via flask-appbuilder +flask-wtf==1.1.1 \ + --hash=sha256:41c4244e9ae626d63bed42ae4785b90667b885b1535d5a4095e1f63060d12aa9 \ + --hash=sha256:7887d6f1ebb3e17bf648647422f0944c9a469d0fcf63e3b66fb9a83037e38b2c + # via + # apache-airflow + # flask-appbuilder +frozenlist==1.4.0 \ + --hash=sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6 \ + --hash=sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01 \ + --hash=sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251 \ + --hash=sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9 \ + --hash=sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b \ + --hash=sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87 \ + --hash=sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf \ + --hash=sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f \ + --hash=sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0 \ + --hash=sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2 \ + --hash=sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b \ + --hash=sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc \ + --hash=sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c \ + --hash=sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467 \ + --hash=sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9 \ + --hash=sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1 \ + --hash=sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a \ + --hash=sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79 \ + --hash=sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167 \ + --hash=sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300 \ + --hash=sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf \ + --hash=sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea \ + --hash=sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2 \ + --hash=sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab \ + --hash=sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3 \ + --hash=sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb \ + --hash=sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087 \ + --hash=sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc \ + --hash=sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8 \ + --hash=sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62 \ + --hash=sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f \ + --hash=sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326 \ + --hash=sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c \ + --hash=sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431 \ + --hash=sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963 \ + --hash=sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7 \ + --hash=sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef \ + --hash=sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3 \ + --hash=sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956 \ + --hash=sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781 \ + --hash=sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472 \ + --hash=sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc \ + --hash=sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839 \ + --hash=sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672 \ + --hash=sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3 \ + --hash=sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503 \ + --hash=sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d \ + --hash=sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8 \ + --hash=sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b \ + --hash=sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc \ + --hash=sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f \ + --hash=sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559 \ + --hash=sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b \ + --hash=sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95 \ + --hash=sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb \ + --hash=sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963 \ + --hash=sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919 \ + --hash=sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f \ + --hash=sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3 \ + --hash=sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1 \ + --hash=sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e + # via + # aiohttp + # aiosignal +google-re2==1.1 \ + --hash=sha256:04b2aefd768aa4edeef8b273327806c9cb0b82e90ff52eacf5d11003ac7a0db2 \ + --hash=sha256:07dd0780240ee431781119b46c3bbf76f5cef24a2cbb542f6a08c643e0a68d98 \ + --hash=sha256:0b5f0eaab859d3ba5f462c82bf37ab56e9d37e19b40b5898c731dbe4213a85f7 \ + --hash=sha256:0c39f69b702005963a3d3bf78743e1733ad73efd7e6e8465d76e3009e4694ceb \ + --hash=sha256:10c6cddc720151a509beb98ab310fa0cc8bcb265f83518ebf831de2c9ff73af0 \ + --hash=sha256:1563577e2b720d267c4cffacc0f6a2b5c8480ea966ebdb1844fbea6602c7496f \ + --hash=sha256:197cd9bcaba96d18c5bf84d0c32fca7a26c234ea83b1d3083366f4392cb99f78 \ + --hash=sha256:19b3f0bfbb2a2ca58ed0aaa9356d07a5c0921383a6dbeca086b2b74472f5ee08 \ + --hash=sha256:1b896f171d29b541256cf26e10dccc9103ac1894683914ed88828ca6facf8dca \ + --hash=sha256:1b9c1ffcfbc3095b6ff601ec2d2bf662988f6ea6763bc1c9d52bec55881f8fde \ + --hash=sha256:1e019e8f57955806ee843254ce454249b58800a6e872b2c8e9df2ef3459de0d5 \ + --hash=sha256:221e38c27e1dd9ccb8e911e9c7aed6439f68ce81e7bb74001076830b0d6e931d \ + --hash=sha256:22ad9ad9d125249d6386a2e80efb9de7af8260b703b6be7fa0ab069c1cf56ced \ + --hash=sha256:2362fd70eb639a75fd0187d28b4ba7b20b3088833d8ad7ffd8693d0ba159e1c2 \ + --hash=sha256:23b50eb74dc3e1d480b04b987c61242df5dade50d08bc16e25eb3582b83fca80 \ + --hash=sha256:2ac6936a3a60d8d9de9563e90227b3aea27068f597274ca192c999a12d8baa8f \ + --hash=sha256:2c73f8a9440873b68bee1198094377501065e85aaf6fcc0d2512c7589ffa06ca \ + --hash=sha256:32ecf995a252c0548404c1065ba4b36f1e524f1f4a86b6367a1a6c3da3801e30 \ + --hash=sha256:34fd7f97b84af7453cf05b25adfe2491ba3cef1ca548ac2907efa63d3510954d \ + --hash=sha256:35a902ba31a71a3e9e114e44473624d9aa9f9b85ec981bfa91671aefe0ef1a6c \ + --hash=sha256:35fd189cbaaaa39c9a6a8a00164c8d9c709bacd0c231c694936879609beff516 \ + --hash=sha256:3b47715b6d43c9351957eb5092ad0fa625d04106d81f34cb8a726c53395ad474 \ + --hash=sha256:3c325c2eae197b423330a04ab62e2e1cf942676cd5560907db4d63e23ce0648a \ + --hash=sha256:3cdf8982b6def987e95b37984d0c1c878de32635dd78acde3273f730b69708c9 \ + --hash=sha256:3e029664192d8d30f7c977706183ef483e82ca239302272df74e01d2e22897ca \ + --hash=sha256:41a8f222f9839d059d37efd28e4deec203502d7e39c3759d83d6a33deadf1d2e \ + --hash=sha256:42128916cc2966623832aabbd224c88e862d1c531d6bc49ab141f565e6321a90 \ + --hash=sha256:48b12d953bc796736e7831d67b36892fb6419a4cc44cb16521fe291e594bfe23 \ + --hash=sha256:49b7964532a801b96062d78c0222d155873968f823a546a3dbe63d73f25bb56f \ + --hash=sha256:4f2754616c61b76ab4e5a4f39892a52a00897203b859c5abd7e3c630dd883cda \ + --hash=sha256:5456fba09df951fe8d1714474ed1ecda102a68ddffab0113e6c117d2e64e6f2b \ + --hash=sha256:5541efcca5b5faf7e0d882334a04fa479bad4e7433f94870f46272eec0672c4a \ + --hash=sha256:58ebbcc7ad2b639768a6bca586357291660ea40dfac83039208e5055c357513b \ + --hash=sha256:59efeb77c0dcdbe37794c61f29c5b1f34bc06e8ec309a111ccdd29d380644d70 \ + --hash=sha256:5e9edcd743a830d0c0b2729201e42ab86fceef8f4086df65563f482e4544359e \ + --hash=sha256:5eaefe4705b75ca5f78178a50104b689e9282f868e12f119b26b4cffc0c7ee6e \ + --hash=sha256:60475d222cebd066c80414831c8a42aa2449aab252084102ee05440896586e6a \ + --hash=sha256:6141d569fdf72aa693f040ba05c469036587395af07ff419b9a3c009d6ffefd3 \ + --hash=sha256:62c780c927cff98c1538439f0ff616f48a9b2e8837c676f53170d8ae5b9e83cb \ + --hash=sha256:64f8eed4ca96905d99b5286b3d14b5ca4f6a025ff3c1351626a7df2f93ad1ddd \ + --hash=sha256:6d0ce762dee8d6617d0b1788a9653e805e83a23046c441d0ea65f1e27bf84114 \ + --hash=sha256:6e27986a166903ad7000635f6faed8ab5072d687f822ac9f692c40b2470aebcf \ + --hash=sha256:71ac661a7365e134741fe5542f13d7ce1e6187446b96ddee4c8b7d153fc8f05a \ + --hash=sha256:723f8553e7fc022294071f14fb7dfc7958c365dc7d4a71d4938ccd2df8c6eca4 \ + --hash=sha256:76a20e5ebdf5bc5d430530197e42a2eeb562f729d3a3fb51f39168283d676e66 \ + --hash=sha256:77c9f4d4bb1c8de9d2642d3c4b8b615858ba764df025b3b4f1310266f8def269 \ + --hash=sha256:7f9ba69eaee6e7a9f5ddfb919bf1a866af14a18b26a179e3fb1a6fe3d0cbf349 \ + --hash=sha256:86b80719636a4e21391e20a9adf18173ee6ae2ec956726fe2ff587417b5e8ba6 \ + --hash=sha256:871cb85b9b0e1784c983b5c148156b3c5314cb29ca70432dff0d163c5c08d7e5 \ + --hash=sha256:874d2e36dfa506b03d4f9c4aef1701a65304f4004c96c7edac7d8aea08fe193e \ + --hash=sha256:8b27cc2544b69a357ab2a749dc0c13a1b9055198c56f4c2c3b0f61d693f8e203 \ + --hash=sha256:901d86555bd7725506d651afaba7d71cd4abd13260aed6cfd7c641a45f76d4f6 \ + --hash=sha256:92309af35b6eb2d3b3dc57045cdd83a76370958ab3e0edd2cc4638f6d23f5b32 \ + --hash=sha256:9469f26b485da2784c658e687a766c72e1a17b1e63b3ed24b5f64c3d19fbae3d \ + --hash=sha256:94bd60785bf37ef130a1613738e3c39465a67eae3f3be44bb918540d39b68da3 \ + --hash=sha256:94f4e66e34bdb8de91ec6cdf20ba4fa9fea1dfdcfb77ff1f59700d01a0243664 \ + --hash=sha256:9857dc4d69b8025057c8129e98406a24d51bdaf1b96e481dbba7e69e0ec85104 \ + --hash=sha256:998f31bf7efbc9bb603d0c356c1c77e5331f689c71783df8e21e67bb025fc66a \ + --hash=sha256:9a1426a8cbd1fa004974574708d496005bd379310c4b1c7012be4bc75efde7a8 \ + --hash=sha256:9bea09c5e8401ec50b8f211bc820ec2f0ca5e744ac67431a1b39bdacbd266553 \ + --hash=sha256:9c6c9f64b9724ec38da8e514f404ac64e9a6a5e8b1d7031c2dadd05c1f4c16fd \ + --hash=sha256:9c90175992346519ee7546d9af9a64541c05b6b70346b0ddc54a48aa0d3b6554 \ + --hash=sha256:9c9998f71466f4db7bda752aa7c348b2881ff688e361108fe500caad1d8b9cb2 \ + --hash=sha256:9fb56a41250191298e6a2859b0fdea1e83330c9870fe8d84e5836c506ae46e96 \ + --hash=sha256:a1a30626ba48b4070f3eab272d860ef1952e710b088792c4d68dddb155be6bfc \ + --hash=sha256:a2d03f6aaf22788ba13a770f0d183b8eebe55545bcbb6e4c41dcccac7ded014d \ + --hash=sha256:a32bb2afe128d90b8edc20d4f7d297f7e2753206eba92937a57e5280736eac74 \ + --hash=sha256:a42c733036e8f242ee4e5f0e27153ad4ca44ced9e4ce82f3972938ddee528db0 \ + --hash=sha256:a6eaaa5f200022eb0bdded5949c91454fc96e1edd6f9e9a96dd1dc32c821c00e \ + --hash=sha256:a98f15fd9c31bf80d368698447191a2e9703880b305dbf34d9a63ce634b8a557 \ + --hash=sha256:ac775c75cec7069351d201da4e0fb0cae4c1c5ebecd08fa34e1be89740c1d80b \ + --hash=sha256:b110f3d657e8f67a43a699d327ce47095b80180ea1118e2de44cb5c7002503d9 \ + --hash=sha256:b632eff5e4cd44545a9c0e52f2e1becd55831e25f4dd4e0d7ec8ee6ca50858c1 \ + --hash=sha256:b66eb84850afdce09aabca40bcd6f2a0e96178a1b4990d555678edb1f59bf255 \ + --hash=sha256:c461640a07db26dc2b51f43de607b7520e7debaf4f6a000f796a3c0196ca52af \ + --hash=sha256:c58601b155651cc572a23ee2860788c77581aad85d3567a55b89b0674702f34d \ + --hash=sha256:c8a12f0740e2a52826bdbf95569a4b0abdf413b4012fa71e94ad25dd4715c6e5 \ + --hash=sha256:ce4710ff636701cfb56eb91c19b775d53b03749a23b7d2a5071bbbf4342a9067 \ + --hash=sha256:d1b751b9ab9f8e2ab2a36d72b909281ce65f328c9115a1685acae1a2d1afd7a4 \ + --hash=sha256:d33145bbfd32e916f1c911cd9225be5364a36c3959742a0cc4dfc0692d6a2a5e \ + --hash=sha256:d3a9467ee52b46ac77ca928f6d0cbeaccfd92f03ca0f0f65b9df6a95184f3a1c \ + --hash=sha256:d5a87b436028ec9b0f02fe19d4cbc19ef30441085cdfcdf1cce8fbe5c4bd5e9a \ + --hash=sha256:d81512b08e6787fc8ef29fea365d3fdbf957553a625550e1d96c36877ae30355 \ + --hash=sha256:d9145879e6c2e1b814445300b31f88a675e1f06c57564670d95a1442e8370c27 \ + --hash=sha256:e022d3239b945014e916ca7120fee659b246ec26c301f9e0542f1a19b38a8744 \ + --hash=sha256:e1bde89855dd5ab0811187d21eec149975510c80e865c771c883524a452445e7 \ + --hash=sha256:e35f2c8aabfaaa4ce6420b3cae86c0c29042b1b4f9937254347e9b985694a171 \ + --hash=sha256:e7865410f3b112a3609739283ec3f4f6f25aae827ff59c6bfdf806fd394d753e \ + --hash=sha256:ecf3619d98c9b4a7844ab52552ad32597cdbc9a5bdbc7e3435391c653600d1e2 \ + --hash=sha256:f267499529e64a4abed24c588f355ebe4700189d434d84a7367725f5a186e48d \ + --hash=sha256:f6d591d9c4cbc7142b729ddcc3f654d059d8ebc3bc95891198808a4785a6b4d8 \ + --hash=sha256:f70971f6ffe5254e476e71d449089917f50ebf9cf60f9cec80975ab1693777e2 \ + --hash=sha256:f95cf16739cc3ea63728366881221b119f2322b4b739b7da6522d45a68792cea \ + --hash=sha256:fb22ea995564d87baf4a4bfbb3ca024be913683a710f4f0dc9c94dc663afab20 \ + --hash=sha256:fc0d4163de9ed2155a77e7a2d59d94c348a6bbab3cff88922fab9e0d3d24faec \ + --hash=sha256:fd62ba2853eef65e249a9c4437a9ecac568222062bc956f0c61a3d1151a6271b \ + --hash=sha256:ffa51b118037518bcdf63c7649d0b4be7071982b83f48ee3bbabf24a9cb48f8a + # via apache-airflow +googleapis-common-protos==1.60.0 \ + --hash=sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918 \ + --hash=sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708 + # via + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +graphviz==0.20.1 \ + --hash=sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977 \ + --hash=sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8 + # via apache-airflow +greenlet==2.0.2 \ + --hash=sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a \ + --hash=sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a \ + --hash=sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1 \ + --hash=sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43 \ + --hash=sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33 \ + --hash=sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8 \ + --hash=sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088 \ + --hash=sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca \ + --hash=sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343 \ + --hash=sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645 \ + --hash=sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db \ + --hash=sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df \ + --hash=sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3 \ + --hash=sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86 \ + --hash=sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2 \ + --hash=sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a \ + --hash=sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf \ + --hash=sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7 \ + --hash=sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394 \ + --hash=sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40 \ + --hash=sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3 \ + --hash=sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6 \ + --hash=sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74 \ + --hash=sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0 \ + --hash=sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3 \ + --hash=sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91 \ + --hash=sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5 \ + --hash=sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9 \ + --hash=sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417 \ + --hash=sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8 \ + --hash=sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b \ + --hash=sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6 \ + --hash=sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb \ + --hash=sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73 \ + --hash=sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b \ + --hash=sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df \ + --hash=sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9 \ + --hash=sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f \ + --hash=sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0 \ + --hash=sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857 \ + --hash=sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a \ + --hash=sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249 \ + --hash=sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30 \ + --hash=sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292 \ + --hash=sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b \ + --hash=sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d \ + --hash=sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b \ + --hash=sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c \ + --hash=sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca \ + --hash=sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7 \ + --hash=sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75 \ + --hash=sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae \ + --hash=sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47 \ + --hash=sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b \ + --hash=sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470 \ + --hash=sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c \ + --hash=sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564 \ + --hash=sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9 \ + --hash=sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099 \ + --hash=sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0 \ + --hash=sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5 \ + --hash=sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19 \ + --hash=sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1 \ + --hash=sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526 + # via sqlalchemy +grpcio==1.58.0 \ + --hash=sha256:002f228d197fea12797a14e152447044e14fb4fdb2eb5d6cfa496f29ddbf79ef \ + --hash=sha256:039003a5e0ae7d41c86c768ef8b3ee2c558aa0a23cf04bf3c23567f37befa092 \ + --hash=sha256:09206106848462763f7f273ca93d2d2d4d26cab475089e0de830bb76be04e9e8 \ + --hash=sha256:128eb1f8e70676d05b1b0c8e6600320fc222b3f8c985a92224248b1367122188 \ + --hash=sha256:1c1c5238c6072470c7f1614bf7c774ffde6b346a100521de9ce791d1e4453afe \ + --hash=sha256:1ed979b273a81de36fc9c6716d9fb09dd3443efa18dcc8652501df11da9583e9 \ + --hash=sha256:201e550b7e2ede113b63e718e7ece93cef5b0fbf3c45e8fe4541a5a4305acd15 \ + --hash=sha256:212f38c6a156862098f6bdc9a79bf850760a751d259d8f8f249fc6d645105855 \ + --hash=sha256:24765a627eb4d9288ace32d5104161c3654128fe27f2808ecd6e9b0cfa7fc8b9 \ + --hash=sha256:24edec346e69e672daf12b2c88e95c6f737f3792d08866101d8c5f34370c54fd \ + --hash=sha256:2ef8d4a76d2c7d8065aba829f8d0bc0055495c998dce1964ca5b302d02514fb3 \ + --hash=sha256:2f85f87e2f087d9f632c085b37440a3169fda9cdde80cb84057c2fc292f8cbdf \ + --hash=sha256:3886b4d56bd4afeac518dbc05933926198aa967a7d1d237a318e6fbc47141577 \ + --hash=sha256:3e6bebf1dfdbeb22afd95650e4f019219fef3ab86d3fca8ebade52e4bc39389a \ + --hash=sha256:458899d2ebd55d5ca2350fd3826dfd8fcb11fe0f79828ae75e2b1e6051d50a29 \ + --hash=sha256:4891bbb4bba58acd1d620759b3be11245bfe715eb67a4864c8937b855b7ed7fa \ + --hash=sha256:4b12754af201bb993e6e2efd7812085ddaaef21d0a6f0ff128b97de1ef55aa4a \ + --hash=sha256:532410c51ccd851b706d1fbc00a87be0f5312bd6f8e5dbf89d4e99c7f79d7499 \ + --hash=sha256:5b23d75e5173faa3d1296a7bedffb25afd2fddb607ef292dfc651490c7b53c3d \ + --hash=sha256:62831d5e251dd7561d9d9e83a0b8655084b2a1f8ea91e4bd6b3cedfefd32c9d2 \ + --hash=sha256:652978551af02373a5a313e07bfef368f406b5929cf2d50fa7e4027f913dbdb4 \ + --hash=sha256:6801ff6652ecd2aae08ef994a3e49ff53de29e69e9cd0fd604a79ae4e545a95c \ + --hash=sha256:6cba491c638c76d3dc6c191d9c75041ca5b8f5c6de4b8327ecdcab527f130bb4 \ + --hash=sha256:7e473a7abad9af48e3ab5f3b5d237d18208024d28ead65a459bd720401bd2f8f \ + --hash=sha256:8774219e21b05f750eef8adc416e9431cf31b98f6ce9def288e4cea1548cbd22 \ + --hash=sha256:8f061722cad3f9aabb3fbb27f3484ec9d4667b7328d1a7800c3c691a98f16bb0 \ + --hash=sha256:92ae871a902cf19833328bd6498ec007b265aabf2fda845ab5bd10abcaf4c8c6 \ + --hash=sha256:9f13a171281ebb4d7b1ba9f06574bce2455dcd3f2f6d1fbe0fd0d84615c74045 \ + --hash=sha256:a2d67ff99e70e86b2be46c1017ae40b4840d09467d5455b2708de6d4c127e143 \ + --hash=sha256:b5e8db0aff0a4819946215f156bd722b6f6c8320eb8419567ffc74850c9fd205 \ + --hash=sha256:ba0af11938acf8cd4cf815c46156bcde36fa5850518120920d52620cc3ec1830 \ + --hash=sha256:bc325fed4d074367bebd465a20763586e5e1ed5b943e9d8bc7c162b1f44fd602 \ + --hash=sha256:bc7ffef430b80345729ff0a6825e9d96ac87efe39216e87ac58c6c4ef400de93 \ + --hash=sha256:cde11577d5b6fd73a00e6bfa3cf5f428f3f33c2d2878982369b5372bbc4acc60 \ + --hash=sha256:d4cef77ad2fed42b1ba9143465856d7e737279854e444925d5ba45fc1f3ba727 \ + --hash=sha256:d79b660681eb9bc66cc7cbf78d1b1b9e335ee56f6ea1755d34a31108b80bd3c8 \ + --hash=sha256:d81c2b2b24c32139dd2536972f1060678c6b9fbd106842a9fcdecf07b233eccd \ + --hash=sha256:dc72e04620d49d3007771c0e0348deb23ca341c0245d610605dddb4ac65a37cb \ + --hash=sha256:dcfba7befe3a55dab6fe1eb7fc9359dc0c7f7272b30a70ae0af5d5b063842f28 \ + --hash=sha256:e9f995a8a421405958ff30599b4d0eec244f28edc760de82f0412c71c61763d2 \ + --hash=sha256:eb6b92036ff312d5b4182fa72e8735d17aceca74d0d908a7f08e375456f03e07 \ + --hash=sha256:f0241f7eb0d2303a545136c59bc565a35c4fc3b924ccbd69cb482f4828d6f31c \ + --hash=sha256:fad9295fe02455d4f158ad72c90ef8b4bcaadfdb5efb5795f7ab0786ad67dd58 \ + --hash=sha256:fbcecb6aedd5c1891db1d70efbfbdc126c986645b5dd616a045c07d6bd2dfa86 \ + --hash=sha256:fe643af248442221db027da43ed43e53b73e11f40c9043738de9a2b4b6ca7697 + # via opentelemetry-exporter-otlp-proto-grpc +gunicorn==21.2.0 \ + --hash=sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0 \ + --hash=sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033 + # via apache-airflow +h11==0.14.0 \ + --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ + --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 + # via httpcore +httpcore==0.18.0 \ + --hash=sha256:13b5e5cd1dca1a6636a6aaea212b19f4f85cd88c366a2b82304181b769aab3c9 \ + --hash=sha256:adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced + # via httpx +httpx==0.25.0 \ + --hash=sha256:181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100 \ + --hash=sha256:47ecda285389cb32bb2691cc6e069e3ab0205956f681c5b2ad2325719751d875 + # via apache-airflow idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 - # via requests + # via + # anyio + # email-validator + # httpx + # requests + # yarl +importlib-metadata==6.8.0 \ + --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ + --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 + # via + # flask + # markdown + # opentelemetry-api +importlib-resources==6.0.1 \ + --hash=sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf \ + --hash=sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4 + # via limits +inflection==0.5.1 \ + --hash=sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417 \ + --hash=sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2 + # via connexion +itsdangerous==2.1.2 \ + --hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \ + --hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a + # via + # apache-airflow + # connexion + # flask + # flask-wtf +jinja2==3.1.2 \ + --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ + --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 + # via + # apache-airflow + # flask + # flask-babel + # python-nvd3 +jsonschema==4.19.0 \ + --hash=sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb \ + --hash=sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f + # via + # apache-airflow + # connexion + # flask-appbuilder +jsonschema-specifications==2023.7.1 \ + --hash=sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1 \ + --hash=sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb + # via jsonschema +lazy-object-proxy==1.9.0 \ + --hash=sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382 \ + --hash=sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82 \ + --hash=sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9 \ + --hash=sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494 \ + --hash=sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46 \ + --hash=sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30 \ + --hash=sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63 \ + --hash=sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4 \ + --hash=sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae \ + --hash=sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be \ + --hash=sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701 \ + --hash=sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd \ + --hash=sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006 \ + --hash=sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a \ + --hash=sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586 \ + --hash=sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8 \ + --hash=sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821 \ + --hash=sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07 \ + --hash=sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b \ + --hash=sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171 \ + --hash=sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b \ + --hash=sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2 \ + --hash=sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7 \ + --hash=sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4 \ + --hash=sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8 \ + --hash=sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e \ + --hash=sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f \ + --hash=sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda \ + --hash=sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4 \ + --hash=sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e \ + --hash=sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671 \ + --hash=sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11 \ + --hash=sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455 \ + --hash=sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734 \ + --hash=sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb \ + --hash=sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59 + # via apache-airflow +limits==3.6.0 \ + --hash=sha256:32fe29a398352c71bc43d53773117d47e22c5ea4200aef28d3f5fdee10334cd7 \ + --hash=sha256:57a9c69fd37ad1e4fa3886dff8d035227e1f6af87f47e9118627e72cf1ced3bf + # via flask-limiter +linkify-it-py==2.0.2 \ + --hash=sha256:19f3060727842c254c808e99d465c80c49d2c7306788140987a1a7a29b0d6ad2 \ + --hash=sha256:a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541 + # via apache-airflow +lockfile==0.12.2 \ + --hash=sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799 \ + --hash=sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa + # via + # apache-airflow + # python-daemon +mako==1.2.4 \ + --hash=sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818 \ + --hash=sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34 + # via alembic +markdown==3.4.4 \ + --hash=sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6 \ + --hash=sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941 + # via apache-airflow +markdown-it-py==3.0.0 \ + --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ + --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb + # via + # apache-airflow + # mdit-py-plugins + # rich +markupsafe==2.1.3 \ + --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ + --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ + --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ + --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ + --hash=sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c \ + --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ + --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ + --hash=sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb \ + --hash=sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939 \ + --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ + --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ + --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ + --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ + --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ + --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ + --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ + --hash=sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd \ + --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ + --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ + --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ + --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ + --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ + --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ + --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ + --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ + --hash=sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007 \ + --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ + --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ + --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ + --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ + --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ + --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ + --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ + --hash=sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1 \ + --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ + --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ + --hash=sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c \ + --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ + --hash=sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823 \ + --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ + --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ + --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ + --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ + --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ + --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ + --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ + --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ + --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ + --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ + --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ + --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ + --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ + --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ + --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ + --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ + --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ + --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ + --hash=sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc \ + --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 \ + --hash=sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11 + # via + # apache-airflow + # jinja2 + # mako + # werkzeug + # wtforms +marshmallow==3.20.1 \ + --hash=sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889 \ + --hash=sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c + # via + # flask-appbuilder + # marshmallow-oneofschema + # marshmallow-sqlalchemy +marshmallow-oneofschema==3.0.1 \ + --hash=sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237 \ + --hash=sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2 + # via apache-airflow +marshmallow-sqlalchemy==0.26.1 \ + --hash=sha256:ba7493eeb8669a3bf00d8f906b657feaa87a740ae9e4ecf829cfd6ddf763d276 \ + --hash=sha256:d8525f74de51554b5c8491effe036f60629a426229befa33ff614c8569a16a73 + # via flask-appbuilder +mdit-py-plugins==0.4.0 \ + --hash=sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9 \ + --hash=sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b + # via apache-airflow +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py +multidict==6.0.4 \ + --hash=sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9 \ + --hash=sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8 \ + --hash=sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03 \ + --hash=sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710 \ + --hash=sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161 \ + --hash=sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664 \ + --hash=sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569 \ + --hash=sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067 \ + --hash=sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313 \ + --hash=sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706 \ + --hash=sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2 \ + --hash=sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636 \ + --hash=sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49 \ + --hash=sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93 \ + --hash=sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603 \ + --hash=sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0 \ + --hash=sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60 \ + --hash=sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4 \ + --hash=sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e \ + --hash=sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1 \ + --hash=sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60 \ + --hash=sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951 \ + --hash=sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc \ + --hash=sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe \ + --hash=sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95 \ + --hash=sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d \ + --hash=sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8 \ + --hash=sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed \ + --hash=sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2 \ + --hash=sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775 \ + --hash=sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87 \ + --hash=sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c \ + --hash=sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2 \ + --hash=sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98 \ + --hash=sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3 \ + --hash=sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe \ + --hash=sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78 \ + --hash=sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660 \ + --hash=sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176 \ + --hash=sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e \ + --hash=sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988 \ + --hash=sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c \ + --hash=sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c \ + --hash=sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0 \ + --hash=sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449 \ + --hash=sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f \ + --hash=sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde \ + --hash=sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5 \ + --hash=sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d \ + --hash=sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac \ + --hash=sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a \ + --hash=sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9 \ + --hash=sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca \ + --hash=sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11 \ + --hash=sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35 \ + --hash=sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063 \ + --hash=sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b \ + --hash=sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982 \ + --hash=sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258 \ + --hash=sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1 \ + --hash=sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52 \ + --hash=sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480 \ + --hash=sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7 \ + --hash=sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461 \ + --hash=sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d \ + --hash=sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc \ + --hash=sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779 \ + --hash=sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a \ + --hash=sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547 \ + --hash=sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0 \ + --hash=sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171 \ + --hash=sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf \ + --hash=sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d \ + --hash=sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba + # via + # aiohttp + # yarl +opentelemetry-api==1.20.0 \ + --hash=sha256:06abe351db7572f8afdd0fb889ce53f3c992dbf6f6262507b385cc1963e06983 \ + --hash=sha256:982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5 + # via + # apache-airflow + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-sdk +opentelemetry-exporter-otlp==1.20.0 \ + --hash=sha256:3b4d47726da83fef84467bdf96da4f8f3d1a61b35db3c16354c391ce8e9decf6 \ + --hash=sha256:f8cb69f80c333166e5cfaa030f9e28f7faaf343aff24caaa2cb4202ea4849b6b + # via apache-airflow +opentelemetry-exporter-otlp-proto-common==1.20.0 \ + --hash=sha256:dd63209b40702636ab6ae76a06b401b646ad7b008a906ecb41222d4af24fbdef \ + --hash=sha256:df60c681bd61812e50b3a39a7a1afeeb6d4066117583249fcc262269374e7a49 + # via + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +opentelemetry-exporter-otlp-proto-grpc==1.20.0 \ + --hash=sha256:6c06d43c3771bda1795226e327722b4b980fa1ca1ec9e985f2ef3e29795bdd52 \ + --hash=sha256:7c3f066065891b56348ba2c7f9df6ec635a712841cae0a36f2f6a81642ae7dec + # via opentelemetry-exporter-otlp +opentelemetry-exporter-otlp-proto-http==1.20.0 \ + --hash=sha256:03f6e768ad25f1c3a9586e8c695db4a4adf978f8546a1285fa962e16bfbb0bd6 \ + --hash=sha256:500f42821420fdf0759193d6438edc0f4e984a83e14c08a23023c06a188861b4 + # via opentelemetry-exporter-otlp +opentelemetry-proto==1.20.0 \ + --hash=sha256:512c3d2c6864fb7547a69577c3907348e6c985b7a204533563cb4c4c5046203b \ + --hash=sha256:cf01f49b3072ee57468bccb1a4f93bdb55411f4512d0ac3f97c5c04c0040b5a2 + # via + # opentelemetry-exporter-otlp-proto-common + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +opentelemetry-sdk==1.20.0 \ + --hash=sha256:702e432a457fa717fd2ddfd30640180e69938f85bb7fec3e479f85f61c1843f8 \ + --hash=sha256:f2230c276ff4c63ea09b3cb2e2ac6b1265f90af64e8d16bbf275c81a9ce8e804 + # via + # opentelemetry-exporter-otlp-proto-grpc + # opentelemetry-exporter-otlp-proto-http +opentelemetry-semantic-conventions==0.41b0 \ + --hash=sha256:0ce5b040b8a3fc816ea5879a743b3d6fe5db61f6485e4def94c6ee4d402e1eb7 \ + --hash=sha256:45404391ed9e50998183a4925ad1b497c01c143f06500c3b9c3d0013492bb0f2 + # via opentelemetry-sdk +ordered-set==4.1.0 \ + --hash=sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562 \ + --hash=sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8 + # via flask-limiter +packaging==23.1 \ + --hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \ + --hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f + # via + # apache-airflow + # apispec + # connexion + # gunicorn + # limits + # marshmallow +pathspec==0.11.2 \ + --hash=sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20 \ + --hash=sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3 + # via apache-airflow +pendulum==2.1.2 \ + --hash=sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394 \ + --hash=sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b \ + --hash=sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a \ + --hash=sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087 \ + --hash=sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739 \ + --hash=sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269 \ + --hash=sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0 \ + --hash=sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5 \ + --hash=sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be \ + --hash=sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7 \ + --hash=sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3 \ + --hash=sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207 \ + --hash=sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe \ + --hash=sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360 \ + --hash=sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0 \ + --hash=sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b \ + --hash=sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052 \ + --hash=sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002 \ + --hash=sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116 \ + --hash=sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db \ + --hash=sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b + # via apache-airflow +pluggy==1.3.0 \ + --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ + --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 + # via apache-airflow +prison==0.2.1 \ + --hash=sha256:e6cd724044afcb1a8a69340cad2f1e3151a5839fd3a8027fd1357571e797c599 \ + --hash=sha256:f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5 + # via flask-appbuilder +protobuf==4.24.3 \ + --hash=sha256:067f750169bc644da2e1ef18c785e85071b7c296f14ac53e0900e605da588719 \ + --hash=sha256:12e9ad2ec079b833176d2921be2cb24281fa591f0b119b208b788adc48c2561d \ + --hash=sha256:1b182c7181a2891e8f7f3a1b5242e4ec54d1f42582485a896e4de81aa17540c2 \ + --hash=sha256:20651f11b6adc70c0f29efbe8f4a94a74caf61b6200472a9aea6e19898f9fcf4 \ + --hash=sha256:2da777d34b4f4f7613cdf85c70eb9a90b1fbef9d36ae4a0ccfe014b0b07906f1 \ + --hash=sha256:3d42e9e4796a811478c783ef63dc85b5a104b44aaaca85d4864d5b886e4b05e3 \ + --hash=sha256:6e514e8af0045be2b56e56ae1bb14f43ce7ffa0f68b1c793670ccbe2c4fc7d2b \ + --hash=sha256:b0271a701e6782880d65a308ba42bc43874dabd1a0a0f41f72d2dac3b57f8e76 \ + --hash=sha256:ba53c2f04798a326774f0e53b9c759eaef4f6a568ea7072ec6629851c8435959 \ + --hash=sha256:e29d79c913f17a60cf17c626f1041e5288e9885c8579832580209de8b75f2a52 \ + --hash=sha256:f631bb982c5478e0c1c70eab383af74a84be66945ebf5dd6b06fc90079668d0b \ + --hash=sha256:f6ccbcf027761a2978c1406070c3788f6de4a4b2cc20800cc03d52df716ad675 \ + --hash=sha256:f6f8dc65625dadaad0c8545319c2e2f0424fede988368893ca3844261342c11a + # via + # googleapis-common-protos + # opentelemetry-proto +psutil==5.9.5 \ + --hash=sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d \ + --hash=sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217 \ + --hash=sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4 \ + --hash=sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c \ + --hash=sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f \ + --hash=sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da \ + --hash=sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4 \ + --hash=sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42 \ + --hash=sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5 \ + --hash=sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4 \ + --hash=sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9 \ + --hash=sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f \ + --hash=sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30 \ + --hash=sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48 + # via apache-airflow pyasn1==0.5.0 \ --hash=sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57 \ --hash=sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde @@ -198,23 +1224,721 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi +pydantic==2.3.0 \ + --hash=sha256:1607cc106602284cd4a00882986570472f193fde9cb1259bceeaedb26aa79a6d \ + --hash=sha256:45b5e446c6dfaad9444819a293b921a40e1db1aa61ea08aede0522529ce90e81 + # via apache-airflow +pydantic-core==2.6.3 \ + --hash=sha256:002d0ea50e17ed982c2d65b480bd975fc41086a5a2f9c924ef8fc54419d1dea3 \ + --hash=sha256:02e1c385095efbd997311d85c6021d32369675c09bcbfff3b69d84e59dc103f6 \ + --hash=sha256:046af9cfb5384f3684eeb3f58a48698ddab8dd870b4b3f67f825353a14441418 \ + --hash=sha256:04fe5c0a43dec39aedba0ec9579001061d4653a9b53a1366b113aca4a3c05ca7 \ + --hash=sha256:07a1aec07333bf5adebd8264047d3dc518563d92aca6f2f5b36f505132399efc \ + --hash=sha256:1480fa4682e8202b560dcdc9eeec1005f62a15742b813c88cdc01d44e85308e5 \ + --hash=sha256:1508f37ba9e3ddc0189e6ff4e2228bd2d3c3a4641cbe8c07177162f76ed696c7 \ + --hash=sha256:171a4718860790f66d6c2eda1d95dd1edf64f864d2e9f9115840840cf5b5713f \ + --hash=sha256:19e20f8baedd7d987bd3f8005c146e6bcbda7cdeefc36fad50c66adb2dd2da48 \ + --hash=sha256:1a0ddaa723c48af27d19f27f1c73bdc615c73686d763388c8683fe34ae777bad \ + --hash=sha256:1aa712ba150d5105814e53cb141412217146fedc22621e9acff9236d77d2a5ef \ + --hash=sha256:1ac1750df1b4339b543531ce793b8fd5c16660a95d13aecaab26b44ce11775e9 \ + --hash=sha256:1c721bfc575d57305dd922e6a40a8fe3f762905851d694245807a351ad255c58 \ + --hash=sha256:1ce8c84051fa292a5dc54018a40e2a1926fd17980a9422c973e3ebea017aa8da \ + --hash=sha256:1fa1f6312fb84e8c281f32b39affe81984ccd484da6e9d65b3d18c202c666149 \ + --hash=sha256:22134a4453bd59b7d1e895c455fe277af9d9d9fbbcb9dc3f4a97b8693e7e2c9b \ + --hash=sha256:23470a23614c701b37252618e7851e595060a96a23016f9a084f3f92f5ed5881 \ + --hash=sha256:240a015102a0c0cc8114f1cba6444499a8a4d0333e178bc504a5c2196defd456 \ + --hash=sha256:252851b38bad3bfda47b104ffd077d4f9604a10cb06fe09d020016a25107bf98 \ + --hash=sha256:2a20c533cb80466c1d42a43a4521669ccad7cf2967830ac62c2c2f9cece63e7e \ + --hash=sha256:2dd50d6a1aef0426a1d0199190c6c43ec89812b1f409e7fe44cb0fbf6dfa733c \ + --hash=sha256:340e96c08de1069f3d022a85c2a8c63529fd88709468373b418f4cf2c949fb0e \ + --hash=sha256:3796a6152c545339d3b1652183e786df648ecdf7c4f9347e1d30e6750907f5bb \ + --hash=sha256:37a822f630712817b6ecc09ccc378192ef5ff12e2c9bae97eb5968a6cdf3b862 \ + --hash=sha256:3a750a83b2728299ca12e003d73d1264ad0440f60f4fc9cee54acc489249b728 \ + --hash=sha256:3c8945a105f1589ce8a693753b908815e0748f6279959a4530f6742e1994dcb6 \ + --hash=sha256:3ccc13afee44b9006a73d2046068d4df96dc5b333bf3509d9a06d1b42db6d8bf \ + --hash=sha256:3f90e5e3afb11268628c89f378f7a1ea3f2fe502a28af4192e30a6cdea1e7d5e \ + --hash=sha256:4292ca56751aebbe63a84bbfc3b5717abb09b14d4b4442cc43fd7c49a1529efd \ + --hash=sha256:430ddd965ffd068dd70ef4e4d74f2c489c3a313adc28e829dd7262cc0d2dd1e8 \ + --hash=sha256:439a0de139556745ae53f9cc9668c6c2053444af940d3ef3ecad95b079bc9987 \ + --hash=sha256:44b4f937b992394a2e81a5c5ce716f3dcc1237281e81b80c748b2da6dd5cf29a \ + --hash=sha256:48c1ed8b02ffea4d5c9c220eda27af02b8149fe58526359b3c07eb391cb353a2 \ + --hash=sha256:4ef724a059396751aef71e847178d66ad7fc3fc969a1a40c29f5aac1aa5f8784 \ + --hash=sha256:50555ba3cb58f9861b7a48c493636b996a617db1a72c18da4d7f16d7b1b9952b \ + --hash=sha256:522a9c4a4d1924facce7270c84b5134c5cabcb01513213662a2e89cf28c1d309 \ + --hash=sha256:5493a7027bfc6b108e17c3383959485087d5942e87eb62bbac69829eae9bc1f7 \ + --hash=sha256:56ea80269077003eaa59723bac1d8bacd2cd15ae30456f2890811efc1e3d4413 \ + --hash=sha256:5a2a3c9ef904dcdadb550eedf3291ec3f229431b0084666e2c2aa8ff99a103a2 \ + --hash=sha256:5cfde4fab34dd1e3a3f7f3db38182ab6c95e4ea91cf322242ee0be5c2f7e3d2f \ + --hash=sha256:5e4a2cf8c4543f37f5dc881de6c190de08096c53986381daebb56a355be5dfe6 \ + --hash=sha256:5e9c068f36b9f396399d43bfb6defd4cc99c36215f6ff33ac8b9c14ba15bdf6b \ + --hash=sha256:5ed7ceca6aba5331ece96c0e328cd52f0dcf942b8895a1ed2642de50800b79d3 \ + --hash=sha256:5fa159b902d22b283b680ef52b532b29554ea2a7fc39bf354064751369e9dbd7 \ + --hash=sha256:615a31b1629e12445c0e9fc8339b41aaa6cc60bd53bf802d5fe3d2c0cda2ae8d \ + --hash=sha256:621afe25cc2b3c4ba05fff53525156d5100eb35c6e5a7cf31d66cc9e1963e378 \ + --hash=sha256:6656a0ae383d8cd7cc94e91de4e526407b3726049ce8d7939049cbfa426518c8 \ + --hash=sha256:672174480a85386dd2e681cadd7d951471ad0bb028ed744c895f11f9d51b9ebe \ + --hash=sha256:692b4ff5c4e828a38716cfa92667661a39886e71136c97b7dac26edef18767f7 \ + --hash=sha256:6bcc1ad776fffe25ea5c187a028991c031a00ff92d012ca1cc4714087e575973 \ + --hash=sha256:6bf7d610ac8f0065a286002a23bcce241ea8248c71988bda538edcc90e0c39ad \ + --hash=sha256:75c0ebbebae71ed1e385f7dfd9b74c1cff09fed24a6df43d326dd7f12339ec34 \ + --hash=sha256:788be9844a6e5c4612b74512a76b2153f1877cd845410d756841f6c3420230eb \ + --hash=sha256:7dc2ce039c7290b4ef64334ec7e6ca6494de6eecc81e21cb4f73b9b39991408c \ + --hash=sha256:813aab5bfb19c98ae370952b6f7190f1e28e565909bfc219a0909db168783465 \ + --hash=sha256:8421cf496e746cf8d6b677502ed9a0d1e4e956586cd8b221e1312e0841c002d5 \ + --hash=sha256:84e87c16f582f5c753b7f39a71bd6647255512191be2d2dbf49458c4ef024588 \ + --hash=sha256:84f8bb34fe76c68c9d96b77c60cef093f5e660ef8e43a6cbfcd991017d375950 \ + --hash=sha256:85cc4d105747d2aa3c5cf3e37dac50141bff779545ba59a095f4a96b0a460e70 \ + --hash=sha256:883daa467865e5766931e07eb20f3e8152324f0adf52658f4d302242c12e2c32 \ + --hash=sha256:8b2b1bfed698fa410ab81982f681f5b1996d3d994ae8073286515ac4d165c2e7 \ + --hash=sha256:8ecbac050856eb6c3046dea655b39216597e373aa8e50e134c0e202f9c47efec \ + --hash=sha256:930bfe73e665ebce3f0da2c6d64455098aaa67e1a00323c74dc752627879fc67 \ + --hash=sha256:9616567800bdc83ce136e5847d41008a1d602213d024207b0ff6cab6753fe645 \ + --hash=sha256:9680dd23055dd874173a3a63a44e7f5a13885a4cfd7e84814be71be24fba83db \ + --hash=sha256:99faba727727b2e59129c59542284efebbddade4f0ae6a29c8b8d3e1f437beb7 \ + --hash=sha256:9a718d56c4d55efcfc63f680f207c9f19c8376e5a8a67773535e6f7e80e93170 \ + --hash=sha256:9b33bf9658cb29ac1a517c11e865112316d09687d767d7a0e4a63d5c640d1b17 \ + --hash=sha256:9e8b374ef41ad5c461efb7a140ce4730661aadf85958b5c6a3e9cf4e040ff4bb \ + --hash=sha256:9e9b65a55bbabda7fccd3500192a79f6e474d8d36e78d1685496aad5f9dbd92c \ + --hash=sha256:a0b7486d85293f7f0bbc39b34e1d8aa26210b450bbd3d245ec3d732864009819 \ + --hash=sha256:a53e3195f134bde03620d87a7e2b2f2046e0e5a8195e66d0f244d6d5b2f6d31b \ + --hash=sha256:a87c54e72aa2ef30189dc74427421e074ab4561cf2bf314589f6af5b37f45e6d \ + --hash=sha256:a892b5b1871b301ce20d40b037ffbe33d1407a39639c2b05356acfef5536d26a \ + --hash=sha256:a8acc9dedd304da161eb071cc7ff1326aa5b66aadec9622b2574ad3ffe225525 \ + --hash=sha256:aaafc776e5edc72b3cad1ccedb5fd869cc5c9a591f1213aa9eba31a781be9ac1 \ + --hash=sha256:acafc4368b289a9f291e204d2c4c75908557d4f36bd3ae937914d4529bf62a76 \ + --hash=sha256:b0a5d7edb76c1c57b95df719af703e796fc8e796447a1da939f97bfa8a918d60 \ + --hash=sha256:b25afe9d5c4f60dcbbe2b277a79be114e2e65a16598db8abee2a2dcde24f162b \ + --hash=sha256:b44c42edc07a50a081672e25dfe6022554b47f91e793066a7b601ca290f71e42 \ + --hash=sha256:b594b64e8568cf09ee5c9501ede37066b9fc41d83d58f55b9952e32141256acd \ + --hash=sha256:b962700962f6e7a6bd77e5f37320cabac24b4c0f76afeac05e9f93cf0c620014 \ + --hash=sha256:bb128c30cf1df0ab78166ded1ecf876620fb9aac84d2413e8ea1594b588c735d \ + --hash=sha256:bf9d42a71a4d7a7c1f14f629e5c30eac451a6fc81827d2beefd57d014c006c4a \ + --hash=sha256:c6595b0d8c8711e8e1dc389d52648b923b809f68ac1c6f0baa525c6440aa0daa \ + --hash=sha256:c8c6660089a25d45333cb9db56bb9e347241a6d7509838dbbd1931d0e19dbc7f \ + --hash=sha256:c9d469204abcca28926cbc28ce98f28e50e488767b084fb3fbdf21af11d3de26 \ + --hash=sha256:d38bbcef58220f9c81e42c255ef0bf99735d8f11edef69ab0b499da77105158a \ + --hash=sha256:d4eb77df2964b64ba190eee00b2312a1fd7a862af8918ec70fc2d6308f76ac64 \ + --hash=sha256:d63b7545d489422d417a0cae6f9898618669608750fc5e62156957e609e728a5 \ + --hash=sha256:d7050899026e708fb185e174c63ebc2c4ee7a0c17b0a96ebc50e1f76a231c057 \ + --hash=sha256:d79f1f2f7ebdb9b741296b69049ff44aedd95976bfee38eb4848820628a99b50 \ + --hash=sha256:d85463560c67fc65cd86153a4975d0b720b6d7725cf7ee0b2d291288433fc21b \ + --hash=sha256:d9140ded382a5b04a1c030b593ed9bf3088243a0a8b7fa9f071a5736498c5483 \ + --hash=sha256:d9b4916b21931b08096efed090327f8fe78e09ae8f5ad44e07f5c72a7eedb51b \ + --hash=sha256:df14f6332834444b4a37685810216cc8fe1fe91f447332cd56294c984ecbff1c \ + --hash=sha256:e49ce7dc9f925e1fb010fc3d555250139df61fa6e5a0a95ce356329602c11ea9 \ + --hash=sha256:e61eae9b31799c32c5f9b7be906be3380e699e74b2db26c227c50a5fc7988698 \ + --hash=sha256:ea053cefa008fda40f92aab937fb9f183cf8752e41dbc7bc68917884454c6362 \ + --hash=sha256:f06e21ad0b504658a3a9edd3d8530e8cea5723f6ea5d280e8db8efc625b47e49 \ + --hash=sha256:f14546403c2a1d11a130b537dda28f07eb6c1805a43dae4617448074fd49c282 \ + --hash=sha256:f1a5d8f18877474c80b7711d870db0eeef9442691fcdb00adabfc97e183ee0b0 \ + --hash=sha256:f2969e8f72c6236c51f91fbb79c33821d12a811e2a94b7aa59c65f8dbdfad34a \ + --hash=sha256:f468d520f47807d1eb5d27648393519655eadc578d5dd862d06873cce04c4d1b \ + --hash=sha256:f70dc00a91311a1aea124e5f64569ea44c011b58433981313202c46bccbec0e1 \ + --hash=sha256:f93255b3e4d64785554e544c1c76cd32f4a354fa79e2eeca5d16ac2e7fdd57aa + # via pydantic +pygments==2.16.1 \ + --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \ + --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29 + # via + # apache-airflow + # rich +pyjwt==2.8.0 \ + --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ + --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 + # via + # apache-airflow + # flask-appbuilder + # flask-jwt-extended +python-daemon==3.0.1 \ + --hash=sha256:42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341 \ + --hash=sha256:6c57452372f7eaff40934a1c03ad1826bf5e793558e87fef49131e6464b4dae5 + # via apache-airflow +python-dateutil==2.8.2 \ + --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 + # via + # apache-airflow + # croniter + # flask-appbuilder + # pendulum python-jose[cryptography]==3.3.0 \ --hash=sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a \ --hash=sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a # via cognitojwt +python-nvd3==0.15.0 \ + --hash=sha256:fbd75ff47e0ef255b4aa4f3a8b10dc8b4024aa5a9a7abed5b2406bd3cb817715 + # via apache-airflow +python-slugify==8.0.1 \ + --hash=sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395 \ + --hash=sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27 + # via + # apache-airflow + # python-nvd3 +pytz==2023.3.post1 \ + --hash=sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b \ + --hash=sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7 + # via flask-babel +pytzdata==2020.1 \ + --hash=sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540 \ + --hash=sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f + # via pendulum +pyyaml==6.0.1 \ + --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ + --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ + --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ + --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ + --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ + --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ + --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ + --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ + --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ + --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ + --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ + --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ + --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ + --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ + --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ + --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ + --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ + --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ + --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ + --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ + --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ + --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ + --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ + --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ + --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ + --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ + --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ + --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ + --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ + --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ + --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ + --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ + --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ + --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ + --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ + --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ + --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ + --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ + --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ + --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ + --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ + --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ + --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ + --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ + --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ + --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ + --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ + --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ + --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ + --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f + # via + # apispec + # clickclick + # connexion +referencing==0.30.2 \ + --hash=sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf \ + --hash=sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0 + # via + # jsonschema + # jsonschema-specifications requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 - # via -r requirements.in + # via + # -r requirements.in + # apache-airflow-providers-http + # connexion + # opentelemetry-exporter-otlp-proto-http + # requests-toolbelt +requests-toolbelt==1.0.0 \ + --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \ + --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 + # via apache-airflow-providers-http +rfc3339-validator==0.1.4 \ + --hash=sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b \ + --hash=sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa + # via apache-airflow +rich==13.5.2 \ + --hash=sha256:146a90b3b6b47cac4a73c12866a499e9817426423f57c5a66949c086191a8808 \ + --hash=sha256:fb9d6c0a0f643c99eed3875b5377a184132ba9be4d61516a55273d3554d75a39 + # via + # apache-airflow + # flask-limiter + # rich-argparse +rich-argparse==1.3.0 \ + --hash=sha256:1a5eda1659c0a215862fe3630fcbe68d7792f18a8106baaf4e005b9896acc6f6 \ + --hash=sha256:974cc1ba0aaa0d6aabc09ab1b78f9ba928670e08590f9551121bcbc60c75b74a + # via apache-airflow +rpds-py==0.10.2 \ + --hash=sha256:00e97d43a36811b78fa9ad9d3329bf34f76a31e891a7031a2ac01450c9b168ab \ + --hash=sha256:013d6c784150d10236a74b4094a79d96a256b814457e388fc5a4ba9efe24c402 \ + --hash=sha256:0188b580c490bccb031e9b67e9e8c695a3c44ac5e06218b152361eca847317c3 \ + --hash=sha256:02945ae38fd78efc40900f509890de84cfd5ffe2cd2939eeb3a8800dc68b87cb \ + --hash=sha256:02b4a2e28eb24dac4ef43dda4f6a6f7766e355179b143f7d0c76a1c5488a307b \ + --hash=sha256:0527c97dcd8bb983822ee31d3760187083fd3ba18ac4dd22cf5347c89d5628f4 \ + --hash=sha256:05a1382905026bdd560f806c8c7c16e0f3e3fb359ba8868203ca6e5799884968 \ + --hash=sha256:0b309908b6ff5ffbf6394818cb73b5a2a74073acee2c57fe8719046389aeff0d \ + --hash=sha256:0fc625059b83695fbb4fc8b7a8b66fa94ff9c7b78c84fb9986cd53ff88a28d80 \ + --hash=sha256:177c033e467a66a054dd3a9534167234a3d0b2e41445807b13b626e01da25d92 \ + --hash=sha256:18909093944727e068ebfc92e2e6ed1c4fa44135507c1c0555213ce211c53214 \ + --hash=sha256:1adb04e4b4e41bf30aaa77eeb169c1b9ba9e5010e2e6ce8d6c17e1446edc9b68 \ + --hash=sha256:1ed3d5385d14be894e12a9033be989e012214a9811e7194849c94032ad69682a \ + --hash=sha256:203eb1532d51591d32e8dfafd60b5d31347ea7278c8da02b4b550287f6abe28b \ + --hash=sha256:213f9ef5c02ec2f883c1075d25a873149daadbaea50d18d622e9db55ec9849c2 \ + --hash=sha256:2275f1a022e2383da5d2d101fe11ccdcbae799148c4b83260a4b9309fa3e1fc2 \ + --hash=sha256:22e6de18f00583f06928cc8d0993104ecc62f7c6da6478db2255de89a30e45d1 \ + --hash=sha256:289073f68452b96e70990085324be7223944c7409973d13ddfe0eea1c1b5663b \ + --hash=sha256:29ec8507664f94cc08457d98cfc41c3cdbddfa8952438e644177a29b04937876 \ + --hash=sha256:2a55631b93e47956fbc97d69ba2054a8c6a4016f9a3064ec4e031f5f1030cb90 \ + --hash=sha256:2a86d246a160d98d820ee7d02dc18c923c228de095be362e57b9fd8970b2c4a1 \ + --hash=sha256:2bca97521ee786087f0c5ef318fef3eef0266a9c3deff88205523cf353af7394 \ + --hash=sha256:2c8fc6c841ada60a86d29c9ebe2e8757c47eda6553f3596c560e59ca6e9b6fa1 \ + --hash=sha256:2cd0c9fb5d40887500b4ed818770c68ab4fa6e0395d286f9704be6751b1b7d98 \ + --hash=sha256:2d27d08056fcd61ff47a0cd8407eff4d3e816c82cb6b9c6f0ce9a0ad49225f81 \ + --hash=sha256:2ffbf1b38c88d0466de542e91b08225d51782282512f8e2b11715126c41fda48 \ + --hash=sha256:3fd503c27e7b7034128e30847ecdb4bff4ca5e60f29ad022a9f66ae8940d54ac \ + --hash=sha256:3ff1f585a0fdc1415bd733b804f33d386064a308672249b14828130dd43e7c31 \ + --hash=sha256:41bd430b7b63aa802c02964e331ac0b177148fef5f807d2c90d05ce71a52b4d4 \ + --hash=sha256:43e9b1531d6a898bdf086acb75c41265c7ec4331267d7619148d407efc72bd24 \ + --hash=sha256:46af4a742b90c7460e94214f923452c2c1d050a9da1d2b8d4c70cbc045e692b7 \ + --hash=sha256:46c4c550bf59ce05d6bff2c98053822549aaf9fbaf81103edea325e03350bca1 \ + --hash=sha256:4969592e3cdeefa4cbb15a26cec102cbd4a1d6e5b695fac9fa026e19741138c8 \ + --hash=sha256:4a0536ed2b9297c75104e1a3da330828ba1b2639fa53b38d396f98bf7e3c68df \ + --hash=sha256:4a96147791e49e84207dd1530109aa0e9eeaf1c8b7a59f150047fc0fcdf9bb64 \ + --hash=sha256:4c7f9d70f99e1fbcbf57c75328b80e1c0a7f6cad43e75efa90a97221be5efe15 \ + --hash=sha256:4e8474f7233fe1949ce4e03bea698a600c2d5d6b51dab6d6e6336dbe69acf23e \ + --hash=sha256:4f1b804cfad04f862d6a84af9d1ad941b06f671878f0f7ecad6c92007d423de6 \ + --hash=sha256:529aab727f54a937085184e7436e1d0e19975cf10115eda12d37a683e4ee5342 \ + --hash=sha256:5612b0b1de8d5114520094bd5fc3d04eb8af6f3e10d48ef05b7c8e77c1fd9545 \ + --hash=sha256:56777c57246e048908b550af9b81b0ec9cf804fd47cb7502ccd93238bd6025c2 \ + --hash=sha256:56ba7c1100ed079527f2b995bf5486a2e557e6d5b733c52e8947476338815b69 \ + --hash=sha256:59d222086daa55421d599609b32d0ebe544e57654c4a0a1490c54a7ebaa67561 \ + --hash=sha256:5aba767e64b494483ad60c4873bec78d16205a21f8247c99749bd990d9c846c2 \ + --hash=sha256:5d5eaf988951f6ecb6854ca3300b87123599c711183c83da7ce39717a7cbdbce \ + --hash=sha256:73da69e1f612c3e682e34dcb971272d90d6f27b2c99acff444ca455a89978574 \ + --hash=sha256:75c8766734ac0053e1d683567e65e85306c4ec62631b0591caeb287ac8f72e08 \ + --hash=sha256:75eea40355a8690459c7291ce6c8ce39c27bd223675c7da6619f510c728feb97 \ + --hash=sha256:80c3cf46511653f94dfe07c7c79ab105c4164d6e1dfcb35b7214fb9af53eaef4 \ + --hash=sha256:8557c807388e6617161fe51b1a4747ea8d1133f2d2ad8e79583439abebe58fbd \ + --hash=sha256:89438e8885a186c69fe31f7ef98bb2bf29688c466c3caf9060f404c0be89ae80 \ + --hash=sha256:899b03a3be785a7e1ff84b237da71f0efa2f021512f147dd34ffdf7aa82cb678 \ + --hash=sha256:8de9b88f0cbac73cfed34220d13c57849e62a7099a714b929142425e926d223a \ + --hash=sha256:8f4d561f4728f825e3b793a53064b606ca0b6fc264f67d09e54af452aafc5b82 \ + --hash=sha256:907b214da5d2fcff0b6ddb83de1333890ca92abaf4bbf8d9c61dc1b95c87fd6e \ + --hash=sha256:9118de88c16947eaf5b92f749e65b0501ea69e7c2be7bd6aefc12551622360e1 \ + --hash=sha256:9568764e72d85cf7855ca78b48e07ed1be47bf230e2cea8dabda3c95f660b0ff \ + --hash=sha256:9c74cbee9e532dc34371127f7686d6953e5153a1f22beab7f953d95ee4a0fe09 \ + --hash=sha256:9cdfd649011ce2d90cb0dd304c5aba1190fac0c266d19a9e2b96b81cfd150a09 \ + --hash=sha256:9f00d54b18dd837f1431d66b076737deb7c29ce3ebb8412ceaf44d5e1954ac0c \ + --hash=sha256:a2f416cdfe92f5fbb77177f5f3f7830059d1582db05f2c7119bf80069d1ab69b \ + --hash=sha256:a4cb372e22e9c879bd9a9cc9b20b7c1fbf30a605ac953da45ecec05d8a6e1c77 \ + --hash=sha256:a65de5c02884760a14a58304fb6303f9ddfc582e630f385daea871e1bdb18686 \ + --hash=sha256:aa3b3a43dabc4cc57a7800f526cbe03f71c69121e21b863fdf497b59b462b163 \ + --hash=sha256:ab0f7aabdbce4a202e013083eeab71afdb85efa405dc4a06fea98cde81204675 \ + --hash=sha256:abe081453166e206e3a8c6d8ace57214c17b6d9477d7601ac14a365344dbc1f4 \ + --hash=sha256:ae141c9017f8f473a6ee07a9425da021816a9f8c0683c2e5442f0ccf56b0fc62 \ + --hash=sha256:af52078719209bef33e38131486fd784832dd8d1dc9b85f00a44f6e7437dd021 \ + --hash=sha256:b00150a9a3fd0a8efaa90bc2696c105b04039d50763dd1c95a34c88c5966cb57 \ + --hash=sha256:b2660000e1a113869c86eb5cc07f3343467490f3cd9d0299f81da9ddae7137b7 \ + --hash=sha256:b3eb1a0d2b6d232d1bcdfc3fcc5f7b004ab3fbd9203011a3172f051d4527c0b6 \ + --hash=sha256:b589d93a60e78fe55d5bc76ee8c2bf945dbdbb7cd16044c53e0307604e448de1 \ + --hash=sha256:b8578fc6c8bdd0201327503720fa581000b4bd3934abbf07e2628d1ad3de157d \ + --hash=sha256:ba1b28e44f611f3f2b436bd8290050a61db4b59a8e24be4465f44897936b3824 \ + --hash=sha256:bb44644371eaa29a3aba7b69b1862d0d56f073bb7585baa32e4271a71a91ee82 \ + --hash=sha256:bcde80aefe7054fad6277762fb7e9d35c72ea479a485ae1bb14629c640987b30 \ + --hash=sha256:bd1142d22fdb183a0fff66d79134bf644401437fed874f81066d314c67ee193c \ + --hash=sha256:bf77f9017fcfa1232f98598a637406e6c33982ccba8a5922339575c3e2b90ea5 \ + --hash=sha256:c2772bb95062e3f9774140205cd65d8997e39620715486cf5f843cf4ad8f744c \ + --hash=sha256:c4ecc4e9a5d73a816cae36ee6b5d8b7a0c72013cae1e101406e832887c3dc2d8 \ + --hash=sha256:c86231c66e4f422e7c13ea6200bb4048b3016c8bfd11b4fd0dabd04d2c8e3501 \ + --hash=sha256:c8f6526df47953b07c45b95c4d1da6b9a0861c0e5da0271db96bb1d807825412 \ + --hash=sha256:ccfb77f6dc8abffa6f1c7e3975ed9070a41ce5fcc11154d2bead8c1baa940f09 \ + --hash=sha256:d9d7efaad48b859053b90dedd69bc92f2095084251e732e4c57ac9726bcb1e64 \ + --hash=sha256:dd91a7d7a9ce7f4983097c91ce211f3e5569cc21caa16f2692298a07e396f82b \ + --hash=sha256:de4a2fd524993578fe093044f291b4b24aab134390030b3b9b5f87fd41ab7e75 \ + --hash=sha256:df61f818edf7c8626bfa392f825860fb670b5f8336e238eb0ec7e2a5689cdded \ + --hash=sha256:e1147bc3d0dd1e549d991110d0a09557ec9f925dbc1ca62871fcdab2ec9d716b \ + --hash=sha256:e1954f4b239d1a92081647eecfd51cbfd08ea16eb743b8af1cd0113258feea14 \ + --hash=sha256:e281b71922208e00886e4b7ffbfcf27874486364f177418ab676f102130e7ec9 \ + --hash=sha256:e69737bd56006a86fd5a78b2b85447580a6138c930a75eb9ef39fe03d90782b1 \ + --hash=sha256:e82b4a70cc67094f3f3fd77579702f48fcf1de7bdc67d79b8f1e24d089a6162c \ + --hash=sha256:e92e5817eb6bfed23aa5e45bfe30647b83602bdd6f9e25d63524d4e6258458b0 \ + --hash=sha256:eaba0613c759ebf95988a84f766ca6b7432d55ce399194f95dde588ad1be0878 \ + --hash=sha256:edd74b760a6bb950397e7a7bd2f38e6700f6525062650b1d77c6d851b82f02c2 \ + --hash=sha256:f40abbcc0a7d9a8a80870af839d317e6932533f98682aabd977add6c53beeb23 \ + --hash=sha256:fce7a8ee8d0f682c953c0188735d823f0fcb62779bf92cd6ba473a8e730e26ad + # via + # jsonschema + # referencing rsa==4.9 \ --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 # via python-jose +setproctitle==1.3.2 \ + --hash=sha256:1c5d5dad7c28bdd1ec4187d818e43796f58a845aa892bb4481587010dc4d362b \ + --hash=sha256:1c8d9650154afaa86a44ff195b7b10d683c73509d085339d174e394a22cccbb9 \ + --hash=sha256:1f0cde41857a644b7353a0060b5f94f7ba7cf593ebde5a1094da1be581ac9a31 \ + --hash=sha256:1f29b75e86260b0ab59adb12661ef9f113d2f93a59951373eb6d68a852b13e83 \ + --hash=sha256:1fa1a0fbee72b47dc339c87c890d3c03a72ea65c061ade3204f285582f2da30f \ + --hash=sha256:1ff863a20d1ff6ba2c24e22436a3daa3cd80be1dfb26891aae73f61b54b04aca \ + --hash=sha256:265ecbe2c6eafe82e104f994ddd7c811520acdd0647b73f65c24f51374cf9494 \ + --hash=sha256:288943dec88e178bb2fd868adf491197cc0fc8b6810416b1c6775e686bab87fe \ + --hash=sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa \ + --hash=sha256:2e3ac25bfc4a0f29d2409650c7532d5ddfdbf29f16f8a256fc31c47d0dc05172 \ + --hash=sha256:2fbd8187948284293f43533c150cd69a0e4192c83c377da837dbcd29f6b83084 \ + --hash=sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80 \ + --hash=sha256:4058564195b975ddc3f0462375c533cce310ccdd41b80ac9aed641c296c3eff4 \ + --hash=sha256:4749a2b0c9ac52f864d13cee94546606f92b981b50e46226f7f830a56a9dc8e1 \ + --hash=sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77 \ + --hash=sha256:4d8938249a7cea45ab7e1e48b77685d0f2bab1ebfa9dde23e94ab97968996a7c \ + --hash=sha256:5194b4969f82ea842a4f6af2f82cd16ebdc3f1771fb2771796e6add9835c1973 \ + --hash=sha256:55ce1e9925ce1765865442ede9dca0ba9bde10593fcd570b1f0fa25d3ec6b31c \ + --hash=sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3 \ + --hash=sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077 \ + --hash=sha256:589be87172b238f839e19f146b9ea47c71e413e951ef0dc6db4218ddacf3c202 \ + --hash=sha256:5b932c3041aa924163f4aab970c2f0e6b4d9d773f4d50326e0ea1cd69240e5c5 \ + --hash=sha256:5fb4f769c02f63fac90989711a3fee83919f47ae9afd4758ced5d86596318c65 \ + --hash=sha256:630f6fe5e24a619ccf970c78e084319ee8be5be253ecc9b5b216b0f474f5ef18 \ + --hash=sha256:65d884e22037b23fa25b2baf1a3316602ed5c5971eb3e9d771a38c3a69ce6e13 \ + --hash=sha256:6c877691b90026670e5a70adfbcc735460a9f4c274d35ec5e8a43ce3f8443005 \ + --hash=sha256:710e16fa3bade3b026907e4a5e841124983620046166f355bbb84be364bf2a02 \ + --hash=sha256:7a55fe05f15c10e8c705038777656fe45e3bd676d49ad9ac8370b75c66dd7cd7 \ + --hash=sha256:7aa0aac1711fadffc1d51e9d00a3bea61f68443d6ac0241a224e4d622489d665 \ + --hash=sha256:7f0bed90a216ef28b9d227d8d73e28a8c9b88c0f48a082d13ab3fa83c581488f \ + --hash=sha256:7f2719a398e1a2c01c2a63bf30377a34d0b6ef61946ab9cf4d550733af8f1ef1 \ + --hash=sha256:7fe9df7aeb8c64db6c34fc3b13271a363475d77bc157d3f00275a53910cb1989 \ + --hash=sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff \ + --hash=sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf \ + --hash=sha256:8ff3c8cb26afaed25e8bca7b9dd0c1e36de71f35a3a0706b5c0d5172587a3827 \ + --hash=sha256:9124bedd8006b0e04d4e8a71a0945da9b67e7a4ab88fdad7b1440dc5b6122c42 \ + --hash=sha256:92c626edc66169a1b09e9541b9c0c9f10488447d8a2b1d87c8f0672e771bc927 \ + --hash=sha256:a149a5f7f2c5a065d4e63cb0d7a4b6d3b66e6e80f12e3f8827c4f63974cbf122 \ + --hash=sha256:a47d97a75fd2d10c37410b180f67a5835cb1d8fdea2648fd7f359d4277f180b9 \ + --hash=sha256:a499fff50387c1520c085a07578a000123f519e5f3eee61dd68e1d301659651f \ + --hash=sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4 \ + --hash=sha256:ab45146c71ca6592c9cc8b354a2cc9cc4843c33efcbe1d245d7d37ce9696552d \ + --hash=sha256:b2c9cb2705fc84cb8798f1ba74194f4c080aaef19d9dae843591c09b97678e98 \ + --hash=sha256:b34baef93bfb20a8ecb930e395ccd2ae3268050d8cf4fe187de5e2bd806fd796 \ + --hash=sha256:b617f12c9be61e8f4b2857be4a4319754756845dbbbd9c3718f468bbb1e17bcb \ + --hash=sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd \ + --hash=sha256:bae283e85fc084b18ffeb92e061ff7ac5af9e183c9d1345c93e178c3e5069cbe \ + --hash=sha256:c2c46200656280a064073447ebd363937562debef329482fd7e570c8d498f806 \ + --hash=sha256:c8a09d570b39517de10ee5b718730e171251ce63bbb890c430c725c8c53d4484 \ + --hash=sha256:c91b9bc8985d00239f7dc08a49927a7ca1ca8a6af2c3890feec3ed9665b6f91e \ + --hash=sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc \ + --hash=sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de \ + --hash=sha256:dad42e676c5261eb50fdb16bdf3e2771cf8f99a79ef69ba88729aeb3472d8575 \ + --hash=sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7 \ + --hash=sha256:de3a540cd1817ede31f530d20e6a4935bbc1b145fd8f8cf393903b1e02f1ae76 \ + --hash=sha256:e00c9d5c541a2713ba0e657e0303bf96ddddc412ef4761676adc35df35d7c246 \ + --hash=sha256:e1aafc91cbdacc9e5fe712c52077369168e6b6c346f3a9d51bf600b53eae56bb \ + --hash=sha256:e425be62524dc0c593985da794ee73eb8a17abb10fe692ee43bb39e201d7a099 \ + --hash=sha256:e43f315c68aa61cbdef522a2272c5a5b9b8fd03c301d3167b5e1343ef50c676c \ + --hash=sha256:e49ae693306d7624015f31cb3e82708916759d592c2e5f72a35c8f4cc8aef258 \ + --hash=sha256:e5c50e164cd2459bc5137c15288a9ef57160fd5cbf293265ea3c45efe7870865 \ + --hash=sha256:e8579a43eafd246e285eb3a5b939e7158073d5087aacdd2308f23200eac2458b \ + --hash=sha256:e85e50b9c67854f89635a86247412f3ad66b132a4d8534ac017547197c88f27d \ + --hash=sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e \ + --hash=sha256:f0452282258dfcc01697026a8841258dd2057c4438b43914b611bccbcd048f10 \ + --hash=sha256:f4bfc89bd33ebb8e4c0e9846a09b1f5a4a86f5cb7a317e75cc42fee1131b4f4f \ + --hash=sha256:fa2f50678f04fda7a75d0fe5dd02bbdd3b13cbe6ed4cf626e4472a7ccf47ae94 \ + --hash=sha256:faec934cfe5fd6ac1151c02e67156c3f526e82f96b24d550b5d51efa4a5527c6 \ + --hash=sha256:fcd3cf4286a60fdc95451d8d14e0389a6b4f5cebe02c7f2609325eb016535963 \ + --hash=sha256:fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4 \ + --hash=sha256:fed18e44711c5af4b681c2b3b18f85e6f0f1b2370a28854c645d636d5305ccd8 \ + --hash=sha256:ffc61a388a5834a97953d6444a2888c24a05f2e333f9ed49f977a87bb1ad4761 + # via apache-airflow +setuptools==68.2.2 \ + --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \ + --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a + # via python-daemon six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via ecdsa + # via + # ecdsa + # prison + # python-dateutil + # rfc3339-validator +sniffio==1.3.0 \ + --hash=sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101 \ + --hash=sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384 + # via + # anyio + # httpcore + # httpx +sqlalchemy==1.4.49 \ + --hash=sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71 \ + --hash=sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9 \ + --hash=sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557 \ + --hash=sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1 \ + --hash=sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77 \ + --hash=sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d \ + --hash=sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf \ + --hash=sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6 \ + --hash=sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb \ + --hash=sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a \ + --hash=sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4 \ + --hash=sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b \ + --hash=sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d \ + --hash=sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729 \ + --hash=sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f \ + --hash=sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264 \ + --hash=sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c \ + --hash=sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87 \ + --hash=sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4 \ + --hash=sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1 \ + --hash=sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91 \ + --hash=sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55 \ + --hash=sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09 \ + --hash=sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e \ + --hash=sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd \ + --hash=sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0 \ + --hash=sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e \ + --hash=sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30 \ + --hash=sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de \ + --hash=sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f \ + --hash=sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95 \ + --hash=sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d \ + --hash=sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d \ + --hash=sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5 \ + --hash=sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294 \ + --hash=sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532 \ + --hash=sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c \ + --hash=sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa + # via + # alembic + # apache-airflow + # flask-appbuilder + # flask-sqlalchemy + # marshmallow-sqlalchemy + # sqlalchemy-jsonfield + # sqlalchemy-utils +sqlalchemy-jsonfield==1.0.1.post0 \ + --hash=sha256:72a5e714fe0493d2660abd7484a9fd9f492f493a0856288dd22a5decb29f5dc4 \ + --hash=sha256:d6f1e5ee329a3c0d9d164e40d81a2143ac8332e09988fbbaff84179dac5503d4 + # via apache-airflow +sqlalchemy-utils==0.41.1 \ + --hash=sha256:6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801 \ + --hash=sha256:a2181bff01eeb84479e38571d2c0718eb52042f9afd8c194d0d02877e84b7d74 + # via flask-appbuilder +sqlparse==0.4.4 \ + --hash=sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3 \ + --hash=sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c + # via apache-airflow-providers-common-sql +tabulate==0.9.0 \ + --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f + # via apache-airflow +tenacity==8.2.3 \ + --hash=sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a \ + --hash=sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c + # via apache-airflow +termcolor==2.3.0 \ + --hash=sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475 \ + --hash=sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a + # via apache-airflow +text-unidecode==1.3 \ + --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 \ + --hash=sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93 + # via python-slugify +typing-extensions==4.7.1 \ + --hash=sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36 \ + --hash=sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2 + # via + # alembic + # apache-airflow + # asgiref + # cattrs + # flask-limiter + # limits + # opentelemetry-sdk + # pydantic + # pydantic-core +uc-micro-py==1.0.2 \ + --hash=sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54 \ + --hash=sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0 + # via linkify-it-py +unicodecsv==0.14.1 \ + --hash=sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc + # via apache-airflow urllib3==2.0.3 \ --hash=sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1 \ --hash=sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825 # via requests +werkzeug==2.2.3 \ + --hash=sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe \ + --hash=sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612 + # via + # apache-airflow + # connexion + # flask + # flask-jwt-extended + # flask-login +wrapt==1.15.0 \ + --hash=sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0 \ + --hash=sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420 \ + --hash=sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a \ + --hash=sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c \ + --hash=sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079 \ + --hash=sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923 \ + --hash=sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f \ + --hash=sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1 \ + --hash=sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8 \ + --hash=sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86 \ + --hash=sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0 \ + --hash=sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364 \ + --hash=sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e \ + --hash=sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c \ + --hash=sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e \ + --hash=sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c \ + --hash=sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727 \ + --hash=sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff \ + --hash=sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e \ + --hash=sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29 \ + --hash=sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7 \ + --hash=sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72 \ + --hash=sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475 \ + --hash=sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a \ + --hash=sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317 \ + --hash=sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2 \ + --hash=sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd \ + --hash=sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640 \ + --hash=sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98 \ + --hash=sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248 \ + --hash=sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e \ + --hash=sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d \ + --hash=sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec \ + --hash=sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1 \ + --hash=sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e \ + --hash=sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9 \ + --hash=sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92 \ + --hash=sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb \ + --hash=sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094 \ + --hash=sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46 \ + --hash=sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29 \ + --hash=sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd \ + --hash=sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705 \ + --hash=sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8 \ + --hash=sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975 \ + --hash=sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb \ + --hash=sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e \ + --hash=sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b \ + --hash=sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418 \ + --hash=sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019 \ + --hash=sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1 \ + --hash=sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba \ + --hash=sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6 \ + --hash=sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2 \ + --hash=sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3 \ + --hash=sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7 \ + --hash=sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752 \ + --hash=sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416 \ + --hash=sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f \ + --hash=sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1 \ + --hash=sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc \ + --hash=sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145 \ + --hash=sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee \ + --hash=sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a \ + --hash=sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7 \ + --hash=sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b \ + --hash=sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653 \ + --hash=sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0 \ + --hash=sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90 \ + --hash=sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29 \ + --hash=sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6 \ + --hash=sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034 \ + --hash=sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09 \ + --hash=sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559 \ + --hash=sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639 + # via deprecated +wtforms==3.0.1 \ + --hash=sha256:6b351bbb12dd58af57ffef05bc78425d08d1914e0fd68ee14143b7ade023c5bc \ + --hash=sha256:837f2f0e0ca79481b92884962b914eba4e72b7a2daaf1f939c890ed0124b834b + # via + # flask-appbuilder + # flask-wtf +yarl==1.9.2 \ + --hash=sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571 \ + --hash=sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3 \ + --hash=sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3 \ + --hash=sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c \ + --hash=sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7 \ + --hash=sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04 \ + --hash=sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191 \ + --hash=sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea \ + --hash=sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4 \ + --hash=sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4 \ + --hash=sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095 \ + --hash=sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e \ + --hash=sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74 \ + --hash=sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef \ + --hash=sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33 \ + --hash=sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde \ + --hash=sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45 \ + --hash=sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf \ + --hash=sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b \ + --hash=sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac \ + --hash=sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0 \ + --hash=sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528 \ + --hash=sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716 \ + --hash=sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb \ + --hash=sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18 \ + --hash=sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72 \ + --hash=sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6 \ + --hash=sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582 \ + --hash=sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5 \ + --hash=sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368 \ + --hash=sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc \ + --hash=sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9 \ + --hash=sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be \ + --hash=sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a \ + --hash=sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80 \ + --hash=sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8 \ + --hash=sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6 \ + --hash=sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417 \ + --hash=sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574 \ + --hash=sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59 \ + --hash=sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608 \ + --hash=sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82 \ + --hash=sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1 \ + --hash=sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3 \ + --hash=sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d \ + --hash=sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8 \ + --hash=sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc \ + --hash=sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac \ + --hash=sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8 \ + --hash=sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955 \ + --hash=sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0 \ + --hash=sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367 \ + --hash=sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb \ + --hash=sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a \ + --hash=sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623 \ + --hash=sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2 \ + --hash=sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6 \ + --hash=sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7 \ + --hash=sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4 \ + --hash=sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051 \ + --hash=sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938 \ + --hash=sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8 \ + --hash=sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9 \ + --hash=sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3 \ + --hash=sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5 \ + --hash=sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9 \ + --hash=sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333 \ + --hash=sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185 \ + --hash=sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3 \ + --hash=sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560 \ + --hash=sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b \ + --hash=sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7 \ + --hash=sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78 \ + --hash=sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7 + # via aiohttp +zipp==3.16.2 \ + --hash=sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0 \ + --hash=sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147 + # via + # importlib-metadata + # importlib-resources From f5e73de914ee798385b34e25ba61150720395e69 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 13 Sep 2023 05:43:44 -0700 Subject: [PATCH 40/96] Give up on finding a package with a circular dependency for now. apache-airflow and dvc[gs] require source packages. --- .../pypi_install/intermediate_file_patcher.py | 2 +- .../intermediate_file_x86_64_linux.json | 1271 +----------- examples/pypi_install/requirements.in | 4 +- .../requirements_lock_x86_64_linux.txt | 1742 +---------------- python/private/pypi.bzl | 7 + python/private/pypi_repo.bzl | 16 +- 6 files changed, 62 insertions(+), 2980 deletions(-) diff --git a/examples/pypi_install/intermediate_file_patcher.py b/examples/pypi_install/intermediate_file_patcher.py index ad975d44b7..cfc9df9d3b 100644 --- a/examples/pypi_install/intermediate_file_patcher.py +++ b/examples/pypi_install/intermediate_file_patcher.py @@ -5,7 +5,7 @@ UPDATES = { "requests": { "patches": [ - "@//third_party:requests/hello.patch", + "@//third_party:requests/0001-Add-a-dummy-patch-for-requests.patch", ], "patch_args": [ "-p1", diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index 850a7d4943..b2b0ea6fb1 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -1,979 +1,58 @@ { - "aiohttp": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/5b/8d/821fcb268cfc056964a75da3823896b17eabaa4968a2414121bc93b0c501/aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1", - "deps": [ - "aiosignal", - "async-timeout", - "attrs", - "charset-normalizer", - "frozenlist", - "multidict", - "yarl" - ] - } - }, - "aiosignal": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", - "sha256": "f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", - "deps": [ - "frozenlist" - ] - } - }, - "alembic": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/a2/8b/46919127496036c8e990b2b236454a0d8655fd46e1df2fd35610a9cbc842/alembic-1.12.0-py3-none-any.whl", - "sha256": "03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f", - "deps": [ - "Mako", - "SQLAlchemy", - "typing-extensions" - ] - } - }, - "annotated-types": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/d8/f0/a2ee543a96cc624c35a9086f39b1ed2aa403c6d355dfe47a11ee5c64a164/annotated_types-0.5.0-py3-none-any.whl", - "sha256": "58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd", - "deps": [] - } - }, - "anyio": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/36/55/ad4de788d84a630656ece71059665e01ca793c04294c463fd84132f40fe6/anyio-4.0.0-py3-none-any.whl", - "sha256": "cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f", - "deps": [ - "exceptiongroup", - "idna", - "sniffio" - ] - } - }, - "apache-airflow": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/bb/2c/1aae9daf5eedc153ec64cb125317d1a7680450114b690cfa484a7217a9fa/apache_airflow-2.7.1-py3-none-any.whl", - "sha256": "06214ece464bbb54910220903081b84056d97e2271400ca01ee63743c41cf4f1", - "deps": [ - "alembic", - "apache-airflow-providers-common-sql", - "apache-airflow-providers-ftp", - "apache-airflow-providers-http", - "apache-airflow-providers-imap", - "apache-airflow-providers-sqlite", - "argcomplete", - "asgiref", - "attrs", - "blinker", - "cattrs", - "colorlog", - "configupdater", - "connexion", - "cron-descriptor", - "croniter", - "cryptography", - "deprecated", - "dill", - "flask", - "flask-appbuilder", - "flask-caching", - "flask-login", - "flask-session", - "flask-wtf", - "google-re2", - "graphviz", - "gunicorn", - "httpx", - "itsdangerous", - "jinja2", - "jsonschema", - "lazy-object-proxy", - "linkify-it-py", - "lockfile", - "markdown", - "markdown-it-py", - "markupsafe", - "marshmallow-oneofschema", - "mdit-py-plugins", - "opentelemetry-api", - "opentelemetry-exporter-otlp", - "packaging", - "pathspec", - "pendulum", - "pluggy", - "psutil", - "pydantic", - "pygments", - "pyjwt", - "python-daemon", - "python-dateutil", - "python-nvd3", - "python-slugify", - "rfc3339-validator", - "rich", - "rich-argparse", - "setproctitle", - "sqlalchemy", - "sqlalchemy-jsonfield", - "tabulate", - "tenacity", - "termcolor", - "typing-extensions", - "unicodecsv", - "werkzeug" - ] - } - }, - "apache-airflow-providers-common-sql": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/3f/18/77f2bd8b2f70fcd496737877c486c9d2a3bf86bdc95c869424d1e45bcaa4/apache_airflow_providers_common_sql-1.7.2-py3-none-any.whl", - "sha256": "5a0e6a1ffcde4d4d41660bcecdad33364ef81c8d98f0d8a3dcf385f0e419d80f", - "deps": [ - "apache-airflow", - "sqlparse" - ] - } - }, - "apache-airflow-providers-ftp": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/29/67/da4f2c02b865e0f624327d0a8903e867745cf42d5db3801e774325311f83/apache_airflow_providers_ftp-3.5.2-py3-none-any.whl", - "sha256": "a3960872de03467c289b925172f48dec45d028c992093cc3a6c45816e0e43536", - "deps": [ - "apache-airflow" - ] - } - }, - "apache-airflow-providers-http": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/bd/49/5560fdd14766314123c9d8580871c7bfc3251661cd3ea2c71ec41161eac4/apache_airflow_providers_http-4.5.2-py3-none-any.whl", - "sha256": "e890d02a64244cb70c36dc0155c2f97ae563c6c0ea3dfa9a050b787865897cbf", - "deps": [ - "aiohttp", - "apache-airflow", - "asgiref", - "requests", - "requests-toolbelt" - ] - } - }, - "apache-airflow-providers-imap": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/f6/f5/225708321453285d7c21e48316e969395fca1c6c5e9ded6126dee565a593/apache_airflow_providers_imap-3.3.2-py3-none-any.whl", - "sha256": "6c4511e30abac3ec888e9beee29e65fe3d0d92141fdea3d14edf117739378baa", - "deps": [ - "apache-airflow" - ] - } - }, - "apache-airflow-providers-sqlite": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/fc/71/a42e7d278363f470a22a8c6096c82d2233174aac45133db60da311850067/apache_airflow_providers_sqlite-3.4.3-py3-none-any.whl", - "sha256": "4ffa6a50f0ea1b4e51240b657dfec3fb026c87bdfa71af908a56461df6a6f2e0", - "deps": [ - "apache-airflow", - "apache-airflow-providers-common-sql" - ] - } - }, - "apispec": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/8c/fb/5b32dc208c0adadd1b9f08f0982c1a39c0bcc7a0f6206802a0c9086c4756/apispec-6.3.0-py3-none-any.whl", - "sha256": "95a0b9355785df998bb0e9b939237a30ee4c7428fd6ef97305eae3da06b9b339", - "deps": [ - "PyYAML", - "packaging" - ] - } - }, - "argcomplete": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/4f/ef/8b604222ba5e5190e25851aa3a5b754f2002361dc62a258a8e9f13e866f4/argcomplete-3.1.1-py3-none-any.whl", - "sha256": "35fa893a88deea85ea7b20d241100e64516d6af6d7b0ae2bed1d263d26f70948", - "deps": [] - } - }, - "asgiref": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/9b/80/b9051a4a07ad231558fcd8ffc89232711b4e618c15cb7a392a17384bbeef/asgiref-3.7.2-py3-none-any.whl", - "sha256": "89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e", - "deps": [ - "typing-extensions" - ] - } - }, - "async-timeout": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl", - "sha256": "7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028", - "deps": [] - } - }, - "attrs": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/f0/eb/fcb708c7bf5056045e9e98f62b93bd7467eb718b0202e7698eb11d66416c/attrs-23.1.0-py3-none-any.whl", - "sha256": "1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "deps": [] - } - }, - "Babel": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/df/c4/1088865e0246d7ecf56d819a233ab2b72f7d6ab043965ef327d0731b5434/Babel-2.12.1-py3-none-any.whl", - "sha256": "b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610", - "deps": [] - } - }, - "backoff": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", - "sha256": "63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", - "deps": [] - } - }, - "blinker": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/0d/f1/5f39e771cd730d347539bb74c6d496737b9d5f0a53bc9fdbf3e170f1ee48/blinker-1.6.2-py3-none-any.whl", - "sha256": "c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0", - "deps": [] - } - }, - "cachelib": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/93/70/58e525451478055b0fd2859b22226888a6985d404fe65e014fc4893d3b75/cachelib-0.9.0-py3-none-any.whl", - "sha256": "811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3", - "deps": [] - } - }, - "cattrs": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/3a/ba/05df14efaa0624fac6b1510e87f5ce446208d2f6ce50270a89b6268aebfe/cattrs-23.1.2-py3-none-any.whl", - "sha256": "b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4", - "deps": [ - "attrs", - "exceptiongroup", - "typing_extensions" - ] - } - }, - "certifi": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", - "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716", - "deps": [] - } - }, - "cffi": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/2d/86/3ca57cddfa0419f6a95d1c8478f8f622ba597e3581fd501bbb915b20eb75/cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "deps": [ - "pycparser" - ] - } - }, - "charset-normalizer": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", - "deps": [] - } - }, - "click": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", - "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "deps": [] - } - }, - "clickclick": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/7a/7e/c08007d3fb2bbefb430437a3573373590abedc03566b785d7d6763b22480/clickclick-20.10.2-py2.py3-none-any.whl", - "sha256": "c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5", - "deps": [ - "PyYAML", - "click" - ] - } - }, - "cognitojwt": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/a5/69/97faafdc4f1900fa1b525cedae0f98aa30b0bb086d076f8d66c68a18b1b2/cognitojwt-1.4.1-py3-none-any.whl", - "sha256": "8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce", - "deps": [ - "python-jose" - ] - } - }, - "colorama": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", - "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", - "deps": [] - } - }, - "colorlog": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/51/62/61449c6bb74c2a3953c415b2cdb488e4f0518ac67b35e2b03a6d543035ca/colorlog-4.8.0-py2.py3-none-any.whl", - "sha256": "3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd", - "deps": [] - } - }, - "ConfigUpdater": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/4d/13/6791bba527baf3648be8aabaf6d3775027c3ebbf4000f2ae16867911b879/ConfigUpdater-3.1.1-py2.py3-none-any.whl", - "sha256": "805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286", - "deps": [] - } - }, - "connexion": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/ed/e6/851b3d7688115b176eb5d3e45055d1dc5b2b91708007064a38b0e93813ed/connexion-2.14.2-py2.py3-none-any.whl", - "sha256": "a73b96a0e07b16979a42cde7c7e26afe8548099e352cf350f80c57185e0e0b36", - "deps": [ - "PyYAML", - "clickclick", - "flask", - "flask", - "inflection", - "itsdangerous", - "itsdangerous", - "jsonschema", - "packaging", - "requests", - "werkzeug" - ] - } - }, - "cron-descriptor": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/24/a0/455f5a0181cf9a0d2e84d3a66c88de019dce5644ad9680825d1c8a403335/cron_descriptor-1.4.0.tar.gz", - "sha256": "b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd", - "deps": [] - } - }, - "croniter": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/f2/91/e5ae454da8200c6eb6cf94ca05d799b51e2cb2cc458a7737aebc0c5a21bb/croniter-1.4.1-py2.py3-none-any.whl", - "sha256": "9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128", - "deps": [ - "python-dateutil" - ] - } - }, - "cryptography": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/1a/c7/b8193a0859fed883738ae99d33fe90edf05c7e3d0fdb1726f8f53d85859e/cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", - "sha256": "49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", - "deps": [ - "cffi" - ] - } - }, - "Deprecated": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl", - "sha256": "6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", - "deps": [ - "wrapt" - ] - } - }, - "dill": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/f5/3a/74a29b11cf2cdfcd6ba89c0cecd70b37cd1ba7b77978ce611eb7a146a832/dill-0.3.7-py3-none-any.whl", - "sha256": "76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e", - "deps": [] - } - }, - "dnspython": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/f6/b4/0a9bee52c50f226a3cbfb54263d02bb421c7f2adc136520729c2c689c1e5/dnspython-2.4.2-py3-none-any.whl", - "sha256": "57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8", - "deps": [] - } - }, - "docutils": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl", - "sha256": "96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", - "deps": [] - } - }, - "ecdsa": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/09/d4/4f05f5d16a4863b30ba96c23b23e942da8889abfa1cdbabf2a0df12a4532/ecdsa-0.18.0-py2.py3-none-any.whl", - "sha256": "80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd", - "deps": [ - "six" - ] - } - }, - "email-validator": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/ba/ec/adc595d04e795b04bb0028fc6b067713fdb4a7e8cec44b428f7144fc432e/email_validator-1.3.1-py2.py3-none-any.whl", - "sha256": "49a72f5fa6ed26be1c964f0567d931d10bf3fdeeacdf97bc26ef1cd2a44e0bda", - "deps": [ - "dnspython", - "idna" - ] - } - }, - "exceptiongroup": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/ad/83/b71e58666f156a39fb29417e4c8ca4bc7400c0dd4ed9e8842ab54dc8c344/exceptiongroup-1.1.3-py3-none-any.whl", - "sha256": "343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3", - "deps": [] - } - }, - "Flask": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/9f/1a/8b6d48162861009d1e017a9740431c78d860809773b66cac220a11aa3310/Flask-2.2.5-py3-none-any.whl", - "sha256": "58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf", - "deps": [ - "Jinja2", - "Werkzeug", - "click", - "importlib-metadata", - "itsdangerous" - ] - } - }, - "Flask-AppBuilder": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/9b/13/7ed7265ee77655466292f6e6ba8c989ac60cb82f6450b2f0bd01804a5024/Flask_AppBuilder-4.3.6-py3-none-any.whl", - "sha256": "840480dfd43134bebf78f3c7dc909e324c2689d2d9f27aeb1880a8a25466bc8d", - "deps": [ - "Flask", - "Flask-Babel", - "Flask-JWT-Extended", - "Flask-Limiter", - "Flask-Login", - "Flask-SQLAlchemy", - "Flask-WTF", - "PyJWT", - "SQLAlchemy", - "WTForms", - "apispec", - "click", - "colorama", - "email-validator", - "jsonschema", - "marshmallow", - "marshmallow-sqlalchemy", - "prison", - "python-dateutil", - "sqlalchemy-utils" - ] - } - }, - "Flask-Babel": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/ab/3e/02331179ffab8b79e0383606a028b6a60fb1b4419b84935edd43223406a0/Flask_Babel-2.0.0-py3-none-any.whl", - "sha256": "e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468", - "deps": [ - "Babel", - "Flask", - "Jinja2", - "pytz" - ] - } - }, - "Flask-Caching": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/fe/99/9fb5a680701b695e5e375d902586bea2704ad5517c8aa9c4225f13db131a/Flask_Caching-2.0.2-py3-none-any.whl", - "sha256": "19571f2570e9b8dd9dd9d2f49d7cbee69c14ebe8cc001100b1eb98c379dd80ad", - "deps": [ - "Flask", - "cachelib" - ] - } - }, - "Flask-JWT-Extended": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/13/44/fa536c29c4014af7073474ad15a382f561db89c19fc4485ed0692942deb3/Flask_JWT_Extended-4.5.2-py2.py3-none-any.whl", - "sha256": "e0ef23d8c863746bd141046167073699e1a7b03c97169cbba70f05b8d9cd6b9e", - "deps": [ - "Flask", - "PyJWT", - "Werkzeug" - ] - } - }, - "Flask-Limiter": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/a2/ff/2dc82d9517172b67c2f5b13884777be9fe644cbfd6c52600076747d2f125/Flask_Limiter-3.5.0-py3-none-any.whl", - "sha256": "dbda4174f44e6cb858c6eb75e7488186f2977dd5d33d7028ba1aabf179de1bee", - "deps": [ - "Flask", - "limits", - "ordered-set", - "rich", - "typing-extensions" - ] - } - }, - "Flask-Login": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/a6/94/01b658bef1863a07f4738a322cce87d97be4362645255dc1182f7f5c075a/Flask_Login-0.6.2-py3-none-any.whl", - "sha256": "1ef79843f5eddd0f143c2cd994c1b05ac83c0401dc6234c143495af9a939613f", - "deps": [ - "Flask", - "Werkzeug" - ] - } - }, - "Flask-Session": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/3e/d4/b374183251054928ddb5e72f9a0d3d764d0f2af0638fbbdf205df26e55e3/flask_session-0.5.0-py3-none-any.whl", - "sha256": "1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631", - "deps": [ - "cachelib", - "flask" - ] - } - }, - "Flask-SQLAlchemy": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/26/2c/9088b6bd95bca539230bbe9ad446737ed391aab9a83aff403e18dded3e75/Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", - "sha256": "f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390", - "deps": [ - "Flask", - "SQLAlchemy" - ] - } - }, - "Flask-WTF": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/e0/06/102cdb72b0f98bf6ee73e9239e9cfb071e5ab8893037f6b12053b6b06a27/Flask_WTF-1.1.1-py3-none-any.whl", - "sha256": "7887d6f1ebb3e17bf648647422f0944c9a469d0fcf63e3b66fb9a83037e38b2c", - "deps": [ - "Flask", - "WTForms", - "itsdangerous" - ] - } - }, - "frozenlist": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/b5/03/7dec2e257bd173b5ca1f74477863b97d322149f6f0284d7decead8c5ceeb/frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087", - "deps": [] - } - }, - "google-re2": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/2a/92/41d653778fa7130db028d522b21f77329d10f09abd67b876cdc4564d5e9a/google_re2-1.1-2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", - "sha256": "1b9c1ffcfbc3095b6ff601ec2d2bf662988f6ea6763bc1c9d52bec55881f8fde", - "deps": [] - } - }, - "googleapis-common-protos": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/a7/bc/416a1ffeba4dcd072bc10523dac9ed97f2e7fc4b760580e2bdbdc1e2afdd/googleapis_common_protos-1.60.0-py2.py3-none-any.whl", - "sha256": "69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918", - "deps": [ - "protobuf" - ] - } - }, - "graphviz": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/de/5e/fcbb22c68208d39edff467809d06c9d81d7d27426460ebc598e55130c1aa/graphviz-0.20.1-py3-none-any.whl", - "sha256": "587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977", - "deps": [] - } - }, - "greenlet": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/e9/29/2ae545c4c0218b042c2bb0760c0f65e114cca1ab5e552dc23b0f118e428a/greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b", - "deps": [] - } - }, - "grpcio": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/5a/e8/c6bbb12ec726c80c05baaab5dc0d026798ef6e9f53edd7a3798655b9c242/grpcio-1.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "ba0af11938acf8cd4cf815c46156bcde36fa5850518120920d52620cc3ec1830", - "deps": [] - } - }, - "gunicorn": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/0e/2a/c3a878eccb100ccddf45c50b6b8db8cf3301a6adede6e31d48e8531cab13/gunicorn-21.2.0-py3-none-any.whl", - "sha256": "3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0", - "deps": [ - "packaging" - ] - } - }, - "h11": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", - "sha256": "e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", - "deps": [] - } - }, - "httpcore": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/ac/97/724afbb7925339f6214bf1fdb5714d1a462690466832bf8fb3fd497649f1/httpcore-0.18.0-py3-none-any.whl", - "sha256": "adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced", - "deps": [ - "anyio", - "certifi", - "h11", - "sniffio" - ] - } - }, - "httpx": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/33/0d/d9ce469af019741c8999711d36b270ff992ceb1a0293f73f9f34fdf131e9/httpx-0.25.0-py3-none-any.whl", - "sha256": "181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100", - "deps": [ - "certifi", - "httpcore", - "idna", - "sniffio" - ] - } - }, - "idna": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", - "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", - "deps": [] - } - }, - "importlib-metadata": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl", - "sha256": "3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", - "deps": [ - "zipp" - ] - } - }, - "importlib-resources": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/25/d4/592f53ce2f8dde8be5720851bd0ab71cc2e76c55978e4163ef1ab7e389bb/importlib_resources-6.0.1-py3-none-any.whl", - "sha256": "134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf", - "deps": [ - "zipp" - ] - } - }, - "inflection": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", - "sha256": "f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", - "deps": [] - } - }, - "itsdangerous": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl", - "sha256": "2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44", - "deps": [] - } - }, - "Jinja2": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/bc/c3/f068337a370801f372f2f8f6bad74a5c140f6fda3d9de154052708dd3c65/Jinja2-3.1.2-py3-none-any.whl", - "sha256": "6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61", - "deps": [ - "MarkupSafe" - ] - } - }, - "jsonschema": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/2b/ff/af59fd34bc4d7ac3e6e0cd1f3c10317d329b6c1aee179e8b24ad9a79fbac/jsonschema-4.19.0-py3-none-any.whl", - "sha256": "043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb", - "deps": [ - "attrs", - "jsonschema-specifications", - "referencing", - "rpds-py" - ] - } - }, - "jsonschema-specifications": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/1c/24/83349ac2189cc2435e84da3f69ba3c97314d3c0622628e55171c6798ed80/jsonschema_specifications-2023.7.1-py3-none-any.whl", - "sha256": "05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1", - "deps": [ - "referencing" - ] - } - }, - "lazy-object-proxy": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/4c/a4/cdd6f41a675a89ab584c78019a24adc533829764bcc85b0e24ed2678020c/lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006", - "deps": [] - } - }, - "limits": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/1d/58/bcdf5719709d13d8523117ec3eb6b027d1bec461cdc91d05bceb88d0aec1/limits-3.6.0-py3-none-any.whl", - "sha256": "32fe29a398352c71bc43d53773117d47e22c5ea4200aef28d3f5fdee10334cd7", - "deps": [ - "deprecated", - "importlib-resources", - "packaging", - "typing-extensions" - ] - } - }, - "linkify-it-py": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/1f/1a/16b0d2f66601ba3081f1d4177087c79fd1f11d17706ee01d373e4ba8e00d/linkify_it_py-2.0.2-py3-none-any.whl", - "sha256": "a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541", - "deps": [ - "uc-micro-py" - ] - } - }, - "lockfile": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl", - "sha256": "6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa", - "deps": [] - } - }, - "Mako": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/03/3b/68690a035ba7347860f1b8c0cde853230ba69ff41df5884ea7d89fe68cd3/Mako-1.2.4-py3-none-any.whl", - "sha256": "c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818", - "deps": [ - "MarkupSafe" - ] - } - }, - "Markdown": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/1a/b5/228c1cdcfe138f1a8e01ab1b54284c8b83735476cb22b6ba251656ed13ad/Markdown-3.4.4-py3-none-any.whl", - "sha256": "a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941", - "deps": [ - "importlib-metadata" - ] - } - }, - "markdown-it-py": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", - "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", - "deps": [ - "mdurl" - ] - } - }, - "MarkupSafe": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/de/63/cb7e71984e9159ec5f45b5e81e896c8bdd0e45fe3fc6ce02ab497f0d790e/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", - "deps": [] - } - }, - "marshmallow": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/ed/3c/cebfdcad015240014ff08b883d1c0c427f2ba45ae8c6572851b6ef136cad/marshmallow-3.20.1-py3-none-any.whl", - "sha256": "684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c", - "deps": [ - "packaging" - ] - } - }, - "marshmallow-oneofschema": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/ca/eb/3f6d90ba82b2dd319c7d3534a90ba3f4bdf2e332e89c2399fdc818051589/marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", - "sha256": "bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2", - "deps": [ - "marshmallow" - ] - } - }, - "marshmallow-sqlalchemy": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/d1/84/1f4d7393d04f2ae0d4098791d1901a713f45ba70ff6f3c35ff2f7fd81f7b/marshmallow_sqlalchemy-0.26.1-py2.py3-none-any.whl", - "sha256": "ba7493eeb8669a3bf00d8f906b657feaa87a740ae9e4ecf829cfd6ddf763d276", - "deps": [ - "SQLAlchemy", - "marshmallow" - ] - } - }, - "mdit-py-plugins": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/e5/3c/fe85f19699a7b40c8f9ce8ecee7e269b9b3c94099306df6f9891bdefeedd/mdit_py_plugins-0.4.0-py3-none-any.whl", - "sha256": "b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9", - "deps": [ - "markdown-it-py" - ] - } - }, - "mdurl": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", - "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", - "deps": [] - } - }, - "multidict": { + "certifi": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/69/48/2750fd3ace4d778b4e1f7110db3ad637906de3496abc9c450ce726b97337/multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1", + "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", + "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716", "deps": [] } }, - "opentelemetry-api": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/41/01/85c059d495679bb9ae50be223d6bd56d94bd050f51b25deffde2e6437463/opentelemetry_api-1.20.0-py3-none-any.whl", - "sha256": "982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5", - "deps": [ - "deprecated", - "importlib-metadata" - ] - } - }, - "opentelemetry-exporter-otlp": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/04/ba/4e22b13ff0ebaa30ea6e1b568463dc3fa53ed7076b2fc3de263682b69a5d/opentelemetry_exporter_otlp-1.20.0-py3-none-any.whl", - "sha256": "3b4d47726da83fef84467bdf96da4f8f3d1a61b35db3c16354c391ce8e9decf6", - "deps": [ - "opentelemetry-exporter-otlp-proto-grpc", - "opentelemetry-exporter-otlp-proto-http" - ] - } - }, - "opentelemetry-exporter-otlp-proto-common": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/89/13/1c6f7f1d81839ecfd4b61f8648c3d1843362e9c927a9b4e59fe4c29cec14/opentelemetry_exporter_otlp_proto_common-1.20.0-py3-none-any.whl", - "sha256": "dd63209b40702636ab6ae76a06b401b646ad7b008a906ecb41222d4af24fbdef", - "deps": [ - "backoff", - "opentelemetry-proto" - ] - } - }, - "opentelemetry-exporter-otlp-proto-grpc": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/9e/a7/ce3ba7618887c08835c2f9c2fcfc4fcc46d9af7b62e2d2c9ea80d6604cf7/opentelemetry_exporter_otlp_proto_grpc-1.20.0-py3-none-any.whl", - "sha256": "7c3f066065891b56348ba2c7f9df6ec635a712841cae0a36f2f6a81642ae7dec", - "deps": [ - "backoff", - "deprecated", - "googleapis-common-protos", - "grpcio", - "opentelemetry-api", - "opentelemetry-exporter-otlp-proto-common", - "opentelemetry-proto", - "opentelemetry-sdk" - ] - } - }, - "opentelemetry-exporter-otlp-proto-http": { + "cffi": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/d8/05/764b6ff9a70d9c5f749cea38072f830f577b0e01e144522522258924b626/opentelemetry_exporter_otlp_proto_http-1.20.0-py3-none-any.whl", - "sha256": "03f6e768ad25f1c3a9586e8c695db4a4adf978f8546a1285fa962e16bfbb0bd6", + "url": "https://files.pythonhosted.org/packages/2d/86/3ca57cddfa0419f6a95d1c8478f8f622ba597e3581fd501bbb915b20eb75/cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", "deps": [ - "backoff", - "deprecated", - "googleapis-common-protos", - "opentelemetry-api", - "opentelemetry-exporter-otlp-proto-common", - "opentelemetry-proto", - "opentelemetry-sdk", - "requests" + "pycparser" ] } }, - "opentelemetry-proto": { + "charset-normalizer": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/68/8b/90f0672651e80fca84eb4952ae48b6d5776b2329c6d7bf70d937535719d2/opentelemetry_proto-1.20.0-py3-none-any.whl", - "sha256": "512c3d2c6864fb7547a69577c3907348e6c985b7a204533563cb4c4c5046203b", - "deps": [ - "protobuf" - ] + "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "sha256": "21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", + "deps": [] } }, - "opentelemetry-sdk": { + "cognitojwt": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/fa/0a/ffb64bc8177fef5fdb97e4e5dcce9924184090620b3fc97b9c656e06b2e8/opentelemetry_sdk-1.20.0-py3-none-any.whl", - "sha256": "f2230c276ff4c63ea09b3cb2e2ac6b1265f90af64e8d16bbf275c81a9ce8e804", + "url": "https://files.pythonhosted.org/packages/a5/69/97faafdc4f1900fa1b525cedae0f98aa30b0bb086d076f8d66c68a18b1b2/cognitojwt-1.4.1-py3-none-any.whl", + "sha256": "8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce", "deps": [ - "opentelemetry-api", - "opentelemetry-semantic-conventions", - "typing-extensions" + "python-jose" ] } }, - "opentelemetry-semantic-conventions": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/aa/78/7a7508d16d32f92d6b206b2e367c5f044b3e652e7f385bbf17f49baad189/opentelemetry_semantic_conventions-0.41b0-py3-none-any.whl", - "sha256": "45404391ed9e50998183a4925ad1b497c01c143f06500c3b9c3d0013492bb0f2", - "deps": [] - } - }, - "ordered-set": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl", - "sha256": "046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562", - "deps": [] - } - }, - "packaging": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/ab/c3/57f0601a2d4fe15de7a553c00adbc901425661bf048f2a22dfc500caf121/packaging-23.1-py3-none-any.whl", - "sha256": "994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "deps": [] - } - }, - "pathspec": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/b4/2a/9b1be29146139ef459188f5e420a66e835dda921208db600b7037093891f/pathspec-0.11.2-py3-none-any.whl", - "sha256": "1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", - "deps": [] - } - }, - "pendulum": { + "cryptography": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/8e/4b/b2042f5122a4b3508c736304e38e8b41e2feed9f3d8c08a03d1de10a2a2b/pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", - "sha256": "94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7", + "url": "https://files.pythonhosted.org/packages/1a/c7/b8193a0859fed883738ae99d33fe90edf05c7e3d0fdb1726f8f53d85859e/cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", + "sha256": "49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", "deps": [ - "python-dateutil", - "pytzdata" + "cffi" ] } }, - "pluggy": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/05/b8/42ed91898d4784546c5f06c60506400548db3f7a4b3fb441cba4e5c17952/pluggy-1.3.0-py3-none-any.whl", - "sha256": "d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7", - "deps": [] - } - }, - "prison": { + "ecdsa": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/f1/bd/e55e14cd213174100be0353824f2add41e8996c6f32081888897e8ec48b5/prison-0.2.1-py2.py3-none-any.whl", - "sha256": "f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5", + "url": "https://files.pythonhosted.org/packages/09/d4/4f05f5d16a4863b30ba96c23b23e942da8889abfa1cdbabf2a0df12a4532/ecdsa-0.18.0-py2.py3-none-any.whl", + "sha256": "80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd", "deps": [ "six" ] } }, - "protobuf": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/bb/c3/6a06208ecf0934ecaf509b51c52a6cf688586f54ae81ac65c56124571494/protobuf-4.24.3-cp37-abi3-manylinux2014_x86_64.whl", - "sha256": "f6ccbcf027761a2978c1406070c3788f6de4a4b2cc20800cc03d52df716ad675", - "deps": [] - } - }, - "psutil": { + "idna": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/af/4d/389441079ecef400e2551a3933224885a7bde6b8a4810091d628cdd75afe/psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4", + "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", + "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", "deps": [] } }, @@ -991,60 +70,6 @@ "deps": [] } }, - "pydantic": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/82/06/fafdc75e48b248eff364b4249af4bcc6952225e8f20e8205820afc66e88e/pydantic-2.3.0-py3-none-any.whl", - "sha256": "45b5e446c6dfaad9444819a293b921a40e1db1aa61ea08aede0522529ce90e81", - "deps": [ - "annotated-types", - "pydantic-core", - "typing-extensions" - ] - } - }, - "pydantic_core": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/18/54/6d64dff3e49e7faf4f5b989b49e46dd8b592d1e3f3db2113f4aaf1defdd3/pydantic_core-2.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "171a4718860790f66d6c2eda1d95dd1edf64f864d2e9f9115840840cf5b5713f", - "deps": [ - "typing-extensions" - ] - } - }, - "Pygments": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/43/88/29adf0b44ba6ac85045e63734ae0997d3c58d8b1a91c914d240828d0d73d/Pygments-2.16.1-py3-none-any.whl", - "sha256": "13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", - "deps": [] - } - }, - "PyJWT": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/2b/4f/e04a8067c7c96c364cef7ef73906504e2f40d690811c021e1a1901473a19/PyJWT-2.8.0-py3-none-any.whl", - "sha256": "59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320", - "deps": [] - } - }, - "python-daemon": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/83/7f/feffd97af851e2a837b5ca9bfbe570002c45397734724e4abfd4c62fdd0d/python_daemon-3.0.1-py3-none-any.whl", - "sha256": "42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341", - "deps": [ - "docutils", - "lockfile", - "setuptools" - ] - } - }, - "python-dateutil": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", - "sha256": "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9", - "deps": [ - "six" - ] - } - }, "python-jose": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/bd/2d/e94b2f7bab6773c70efc70a61d66e312e1febccd9e0db6b9e0adf58cbad1/python_jose-3.3.0-py2.py3-none-any.whl", @@ -1057,56 +82,6 @@ ] } }, - "python-nvd3": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/0b/aa/97165daa6e319409c5c2582e62736a7353bda3c90d90fdcb0b11e116dd2d/python-nvd3-0.15.0.tar.gz", - "sha256": "fbd75ff47e0ef255b4aa4f3a8b10dc8b4024aa5a9a7abed5b2406bd3cb817715", - "deps": [ - "Jinja2", - "python-slugify" - ] - } - }, - "python-slugify": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/b4/85/6aa722a11307ec572682023b76cad4c52cda708dfc25fcb4b4a6051da7ab/python_slugify-8.0.1-py2.py3-none-any.whl", - "sha256": "70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395", - "deps": [ - "text-unidecode" - ] - } - }, - "pytz": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/32/4d/aaf7eff5deb402fd9a24a1449a8119f00d74ae9c2efa79f8ef9994261fc2/pytz-2023.3.post1-py2.py3-none-any.whl", - "sha256": "ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7", - "deps": [] - } - }, - "pytzdata": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/e0/4f/4474bda990ee740a020cbc3eb271925ef7daa7c8444240d34ff62c8442a3/pytzdata-2020.1-py2.py3-none-any.whl", - "sha256": "e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f", - "deps": [] - } - }, - "PyYAML": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", - "deps": [] - } - }, - "referencing": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/be/8e/56d6f1e2d591f4d6cbcba446cac4a1b0dc4f584537e2071d9bcee8eeab6b/referencing-0.30.2-py3-none-any.whl", - "sha256": "449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf", - "deps": [ - "attrs", - "rpds-py" - ] - } - }, "requests": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", @@ -1118,7 +93,7 @@ "urllib3" ], "patches": [ - "@//third_party:requests/hello.patch" + "@//third_party:requests/0001-Add-a-dummy-patch-for-requests.patch" ], "patch_args": [ "-p1" @@ -1126,50 +101,6 @@ "patch_dir": "library/site-packages" } }, - "requests-toolbelt": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", - "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", - "deps": [ - "requests" - ] - } - }, - "rfc3339-validator": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", - "sha256": "24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", - "deps": [ - "six" - ] - } - }, - "rich": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/8d/5f/21a93b2ec205f4b79853ff6e838e3c99064d5dbe85ec6b05967506f14af0/rich-13.5.2-py3-none-any.whl", - "sha256": "146a90b3b6b47cac4a73c12866a499e9817426423f57c5a66949c086191a8808", - "deps": [ - "markdown-it-py", - "pygments" - ] - } - }, - "rich-argparse": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/c3/7a/0e398b736af0e37c733294f91907d5f979ca99a9c75f97213b0ab02d9a05/rich_argparse-1.3.0-py3-none-any.whl", - "sha256": "1a5eda1659c0a215862fe3630fcbe68d7792f18a8106baaf4e005b9896acc6f6", - "deps": [ - "rich" - ] - } - }, - "rpds-py": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/71/3c/23591f5992c3fc95da5a256faf03b738b90ed4b8708ec6114728f64a83d6/rpds_py-0.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "b8578fc6c8bdd0201327503720fa581000b4bd3934abbf07e2628d1ad3de157d", - "deps": [] - } - }, "rsa": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", @@ -1179,20 +110,6 @@ ] } }, - "setproctitle": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/b7/7e/4f71712c98fd06b3075c93a1a2135c5f656191b2aae30895ca7bc7a0da03/setproctitle-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4", - "deps": [] - } - }, - "setuptools": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/bb/26/7945080113158354380a12ce26873dd6c1ebd88d47f5bc24e2c5bb38c16a/setuptools-68.2.2-py3-none-any.whl", - "sha256": "b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a", - "deps": [] - } - }, "six": { "@//:x86_64_linux": { "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", @@ -1200,142 +117,10 @@ "deps": [] } }, - "sniffio": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/c3/a0/5dba8ed157b0136607c7f2151db695885606968d1fae123dc3391e0cfdbf/sniffio-1.3.0-py3-none-any.whl", - "sha256": "eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384", - "deps": [] - } - }, - "SQLAlchemy": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/1b/21/3aa5406575603c15a9eb1e76d5f6a7c7d29682eedb9f643a43e54e8c4f29/SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5", - "deps": [ - "greenlet" - ] - } - }, - "SQLAlchemy-JSONField": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/38/1c/283e6216c21827fb1358f2f409432828f9df4e402182cf590a1cc5a8874f/SQLAlchemy_JSONField-1.0.1.post0-py3-none-any.whl", - "sha256": "d6f1e5ee329a3c0d9d164e40d81a2143ac8332e09988fbbaff84179dac5503d4", - "deps": [ - "sqlalchemy" - ] - } - }, - "SQLAlchemy-Utils": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/73/d8/3863fdfe6b27f6c0dffc650aaa2929f313b33aea615b102279fd46ab550b/SQLAlchemy_Utils-0.41.1-py3-none-any.whl", - "sha256": "6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801", - "deps": [ - "SQLAlchemy" - ] - } - }, - "sqlparse": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/98/5a/66d7c9305baa9f11857f247d4ba761402cea75db6058ff850ed7128957b7/sqlparse-0.4.4-py3-none-any.whl", - "sha256": "5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3", - "deps": [] - } - }, - "tabulate": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", - "sha256": "024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", - "deps": [] - } - }, - "tenacity": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl", - "sha256": "ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c", - "deps": [] - } - }, - "termcolor": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/67/e1/434566ffce04448192369c1a282931cf4ae593e91907558eaecd2e9f2801/termcolor-2.3.0-py3-none-any.whl", - "sha256": "3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475", - "deps": [] - } - }, - "text-unidecode": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", - "sha256": "1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", - "deps": [] - } - }, - "typing_extensions": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", - "sha256": "440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", - "deps": [] - } - }, - "uc-micro-py": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/d1/1c/5aeb94aa980da111e4fd0c0fbe5ad95ed5bf9bd957f8e2a6178b85ff4da8/uc_micro_py-1.0.2-py3-none-any.whl", - "sha256": "8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0", - "deps": [] - } - }, - "unicodecsv": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz", - "sha256": "018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc", - "deps": [] - } - }, "urllib3": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/8a/03/ad9306a50d05c166e3456fe810f33cee2b8b2a7a6818ec5d4908c4ec6b36/urllib3-2.0.3-py3-none-any.whl", - "sha256": "48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1", - "deps": [] - } - }, - "Werkzeug": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/f6/f8/9da63c1617ae2a1dec2fbf6412f3a0cfe9d4ce029eccbda6e1e4258ca45f/Werkzeug-2.2.3-py3-none-any.whl", - "sha256": "56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612", - "deps": [ - "MarkupSafe" - ] - } - }, - "wrapt": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/dd/eb/389f9975a6be31ddd19d29128a11f1288d07b624e464598a4b450f8d007e/wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29", - "deps": [] - } - }, - "WTForms": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/eb/2e/199a0edf6577af771a68fbd950d98f0c1a16bb5fa956e45772005318c702/WTForms-3.0.1-py3-none-any.whl", - "sha256": "837f2f0e0ca79481b92884962b914eba4e72b7a2daaf1f939c890ed0124b834b", - "deps": [ - "MarkupSafe" - ] - } - }, - "yarl": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/11/3d/785761e64dc90fda6feb9bd0459dc55ebe282a7d4564642a4a8ee277e0c0/yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955", - "deps": [ - "idna", - "multidict" - ] - } - }, - "zipp": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/8c/08/d3006317aefe25ea79d3b76c9650afabaf6d63d1c8443b236e7405447503/zipp-3.16.2-py3-none-any.whl", - "sha256": "679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", + "url": "https://files.pythonhosted.org/packages/c5/05/c214b32d21c0b465506f95c4f28ccbcba15022e000b043b72b3df7728471/urllib3-1.26.16-py2.py3-none-any.whl", + "sha256": "8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", "deps": [] } } diff --git a/examples/pypi_install/requirements.in b/examples/pypi_install/requirements.in index b7bfd1391f..29d4fe89bb 100644 --- a/examples/pypi_install/requirements.in +++ b/examples/pypi_install/requirements.in @@ -4,5 +4,5 @@ cognitojwt # Common dependency whose functionality is easy to validate. requests -# A library with a circular dependency. -apache-airflow +# TODO(philsc): Get a package with circular dependencies. +# We want to support those packages. diff --git a/examples/pypi_install/requirements_lock_x86_64_linux.txt b/examples/pypi_install/requirements_lock_x86_64_linux.txt index 39a4ac2ca1..8eb4112060 100644 --- a/examples/pypi_install/requirements_lock_x86_64_linux.txt +++ b/examples/pypi_install/requirements_lock_x86_64_linux.txt @@ -4,202 +4,10 @@ # # bazel run //:requirements.update # -aiohttp==3.8.5 \ - --hash=sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67 \ - --hash=sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c \ - --hash=sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda \ - --hash=sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755 \ - --hash=sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d \ - --hash=sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5 \ - --hash=sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548 \ - --hash=sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690 \ - --hash=sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84 \ - --hash=sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4 \ - --hash=sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a \ - --hash=sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a \ - --hash=sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9 \ - --hash=sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef \ - --hash=sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b \ - --hash=sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a \ - --hash=sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d \ - --hash=sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945 \ - --hash=sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634 \ - --hash=sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7 \ - --hash=sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691 \ - --hash=sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802 \ - --hash=sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c \ - --hash=sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0 \ - --hash=sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8 \ - --hash=sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82 \ - --hash=sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a \ - --hash=sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975 \ - --hash=sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b \ - --hash=sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d \ - --hash=sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3 \ - --hash=sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7 \ - --hash=sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e \ - --hash=sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5 \ - --hash=sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649 \ - --hash=sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff \ - --hash=sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e \ - --hash=sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c \ - --hash=sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22 \ - --hash=sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df \ - --hash=sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e \ - --hash=sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780 \ - --hash=sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905 \ - --hash=sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51 \ - --hash=sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543 \ - --hash=sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6 \ - --hash=sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873 \ - --hash=sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f \ - --hash=sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35 \ - --hash=sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938 \ - --hash=sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b \ - --hash=sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d \ - --hash=sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8 \ - --hash=sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c \ - --hash=sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af \ - --hash=sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42 \ - --hash=sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3 \ - --hash=sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc \ - --hash=sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8 \ - --hash=sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410 \ - --hash=sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c \ - --hash=sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825 \ - --hash=sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9 \ - --hash=sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53 \ - --hash=sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a \ - --hash=sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc \ - --hash=sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8 \ - --hash=sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c \ - --hash=sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a \ - --hash=sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b \ - --hash=sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd \ - --hash=sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14 \ - --hash=sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2 \ - --hash=sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c \ - --hash=sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9 \ - --hash=sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692 \ - --hash=sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1 \ - --hash=sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa \ - --hash=sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a \ - --hash=sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de \ - --hash=sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91 \ - --hash=sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761 \ - --hash=sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd \ - --hash=sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced \ - --hash=sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28 \ - --hash=sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8 \ - --hash=sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824 - # via apache-airflow-providers-http -aiosignal==1.3.1 \ - --hash=sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc \ - --hash=sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17 - # via aiohttp -alembic==1.12.0 \ - --hash=sha256:03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f \ - --hash=sha256:8e7645c32e4f200675e69f0745415335eb59a3663f5feb487abfa0b30c45888b - # via apache-airflow -annotated-types==0.5.0 \ - --hash=sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802 \ - --hash=sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd - # via pydantic -anyio==4.0.0 \ - --hash=sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f \ - --hash=sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a - # via httpcore -apache-airflow==2.7.1 \ - --hash=sha256:06214ece464bbb54910220903081b84056d97e2271400ca01ee63743c41cf4f1 \ - --hash=sha256:b4fead8f3e09a673ece479c8cc398a61fa4f2fa13626ac6588f1813f2bd21920 - # via - # -r requirements.in - # apache-airflow-providers-common-sql - # apache-airflow-providers-ftp - # apache-airflow-providers-http - # apache-airflow-providers-imap - # apache-airflow-providers-sqlite -apache-airflow-providers-common-sql==1.7.2 \ - --hash=sha256:5a0e6a1ffcde4d4d41660bcecdad33364ef81c8d98f0d8a3dcf385f0e419d80f \ - --hash=sha256:e268a8f0a224c092136a30e1ddec196edcaa861ff69ac26f270f18d8eca986c6 - # via - # apache-airflow - # apache-airflow-providers-sqlite -apache-airflow-providers-ftp==3.5.2 \ - --hash=sha256:a3960872de03467c289b925172f48dec45d028c992093cc3a6c45816e0e43536 \ - --hash=sha256:f5994d2f43664eb946b0e6f868991ec83efd8d37bf7488345eeeeb0168a23d81 - # via apache-airflow -apache-airflow-providers-http==4.5.2 \ - --hash=sha256:73a1107ce1350a68c6fcec8aa4b5bd5a837e71f63fc2bce4210183e53bb24f17 \ - --hash=sha256:e890d02a64244cb70c36dc0155c2f97ae563c6c0ea3dfa9a050b787865897cbf - # via apache-airflow -apache-airflow-providers-imap==3.3.2 \ - --hash=sha256:3853c54f71d48f8f7417c154168a99c5b999babf0695dc814bba99cb2aa61a1f \ - --hash=sha256:6c4511e30abac3ec888e9beee29e65fe3d0d92141fdea3d14edf117739378baa - # via apache-airflow -apache-airflow-providers-sqlite==3.4.3 \ - --hash=sha256:347d2db03eaa5ea9fef414666565ffa5e849935cbc30e37237edcaa822b5ced8 \ - --hash=sha256:4ffa6a50f0ea1b4e51240b657dfec3fb026c87bdfa71af908a56461df6a6f2e0 - # via apache-airflow -apispec[yaml]==6.3.0 \ - --hash=sha256:6cb08d92ce73ff0b3bf46cb2ea5c00d57289b0f279fb0256a3df468182ba5344 \ - --hash=sha256:95a0b9355785df998bb0e9b939237a30ee4c7428fd6ef97305eae3da06b9b339 - # via flask-appbuilder -argcomplete==3.1.1 \ - --hash=sha256:35fa893a88deea85ea7b20d241100e64516d6af6d7b0ae2bed1d263d26f70948 \ - --hash=sha256:6c4c563f14f01440aaffa3eae13441c5db2357b5eec639abe7c0b15334627dff - # via apache-airflow -asgiref==3.7.2 \ - --hash=sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e \ - --hash=sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed - # via - # apache-airflow - # apache-airflow-providers-http -async-timeout==4.0.3 \ - --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ - --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 - # via aiohttp -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 - # via - # aiohttp - # apache-airflow - # cattrs - # jsonschema - # referencing -babel==2.12.1 \ - --hash=sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610 \ - --hash=sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455 - # via flask-babel -backoff==2.2.1 \ - --hash=sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba \ - --hash=sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8 - # via - # opentelemetry-exporter-otlp-proto-common - # opentelemetry-exporter-otlp-proto-grpc - # opentelemetry-exporter-otlp-proto-http -blinker==1.6.2 \ - --hash=sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213 \ - --hash=sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0 - # via apache-airflow -cachelib==0.9.0 \ - --hash=sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5 \ - --hash=sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3 - # via - # flask-caching - # flask-session -cattrs==23.1.2 \ - --hash=sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4 \ - --hash=sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657 - # via apache-airflow certifi==2023.5.7 \ --hash=sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7 \ --hash=sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716 - # via - # httpcore - # httpx - # requests + # via requests cffi==1.15.1 \ --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ @@ -342,47 +150,11 @@ charset-normalizer==3.1.0 \ --hash=sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326 \ --hash=sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df \ --hash=sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab - # via - # aiohttp - # requests -click==8.1.7 \ - --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ - --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de - # via - # clickclick - # flask - # flask-appbuilder -clickclick==20.10.2 \ - --hash=sha256:4efb13e62353e34c5eef7ed6582c4920b418d7dedc86d819e22ee089ba01802c \ - --hash=sha256:c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5 - # via connexion + # via requests cognitojwt==1.4.1 \ --hash=sha256:8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce \ --hash=sha256:a9f751942517ecf85da9f14674749390aad268e4b0155ef7d133aa50800aa15a # via -r requirements.in -colorama==0.4.6 \ - --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ - --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - # via flask-appbuilder -colorlog==4.8.0 \ - --hash=sha256:3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd \ - --hash=sha256:59b53160c60902c405cdec28d38356e09d40686659048893e026ecbd589516b1 - # via apache-airflow -configupdater==3.1.1 \ - --hash=sha256:46f0c74d73efa723776764b43c9739f68052495dd3d734319c1d0eb58511f15b \ - --hash=sha256:805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286 - # via apache-airflow -connexion[flask]==2.14.2 \ - --hash=sha256:a73b96a0e07b16979a42cde7c7e26afe8548099e352cf350f80c57185e0e0b36 \ - --hash=sha256:dbc06f52ebeebcf045c9904d570f24377e8bbd5a6521caef15a06f634cf85646 - # via apache-airflow -cron-descriptor==1.4.0 \ - --hash=sha256:b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd - # via apache-airflow -croniter==1.4.1 \ - --hash=sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361 \ - --hash=sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128 - # via apache-airflow cryptography==41.0.2 \ --hash=sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711 \ --hash=sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7 \ @@ -407,813 +179,15 @@ cryptography==41.0.2 \ --hash=sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee \ --hash=sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f \ --hash=sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14 - # via - # apache-airflow - # python-jose -deprecated==1.2.14 \ - --hash=sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c \ - --hash=sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3 - # via - # apache-airflow - # limits - # opentelemetry-api - # opentelemetry-exporter-otlp-proto-grpc - # opentelemetry-exporter-otlp-proto-http -dill==0.3.7 \ - --hash=sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e \ - --hash=sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03 - # via apache-airflow -dnspython==2.4.2 \ - --hash=sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8 \ - --hash=sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984 - # via email-validator -docutils==0.20.1 \ - --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ - --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b - # via python-daemon + # via python-jose ecdsa==0.18.0 \ --hash=sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49 \ --hash=sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd # via python-jose -email-validator==1.3.1 \ - --hash=sha256:49a72f5fa6ed26be1c964f0567d931d10bf3fdeeacdf97bc26ef1cd2a44e0bda \ - --hash=sha256:d178c5c6fa6c6824e9b04f199cf23e79ac15756786573c190d2ad13089411ad2 - # via flask-appbuilder -exceptiongroup==1.1.3 \ - --hash=sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9 \ - --hash=sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3 - # via - # anyio - # cattrs -flask==2.2.5 \ - --hash=sha256:58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf \ - --hash=sha256:edee9b0a7ff26621bd5a8c10ff484ae28737a2410d99b0bb9a6850c7fb977aa0 - # via - # apache-airflow - # connexion - # flask-appbuilder - # flask-babel - # flask-caching - # flask-jwt-extended - # flask-limiter - # flask-login - # flask-session - # flask-sqlalchemy - # flask-wtf -flask-appbuilder==4.3.6 \ - --hash=sha256:840480dfd43134bebf78f3c7dc909e324c2689d2d9f27aeb1880a8a25466bc8d \ - --hash=sha256:8ca9710fa7d2704747d195e11b487d45a571f40559d8399d9d5dfa42ea1f3c78 - # via apache-airflow -flask-babel==2.0.0 \ - --hash=sha256:e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468 \ - --hash=sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d - # via flask-appbuilder -flask-caching==2.0.2 \ - --hash=sha256:19571f2570e9b8dd9dd9d2f49d7cbee69c14ebe8cc001100b1eb98c379dd80ad \ - --hash=sha256:24b60c552d59a9605cc1b6a42c56cdb39a82a28dab4532bbedb9222ae54ecb4e - # via apache-airflow -flask-jwt-extended==4.5.2 \ - --hash=sha256:ba56245ba43b71c8ae936784b867625dce8b9956faeedec2953222e57942fb0b \ - --hash=sha256:e0ef23d8c863746bd141046167073699e1a7b03c97169cbba70f05b8d9cd6b9e - # via flask-appbuilder -flask-limiter==3.5.0 \ - --hash=sha256:13a3491b994c49f7cb4706587a38ca47e8162b576530472df38be68104f299c0 \ - --hash=sha256:dbda4174f44e6cb858c6eb75e7488186f2977dd5d33d7028ba1aabf179de1bee - # via flask-appbuilder -flask-login==0.6.2 \ - --hash=sha256:1ef79843f5eddd0f143c2cd994c1b05ac83c0401dc6234c143495af9a939613f \ - --hash=sha256:c0a7baa9fdc448cdd3dd6f0939df72eec5177b2f7abe6cb82fc934d29caac9c3 - # via - # apache-airflow - # flask-appbuilder -flask-session==0.5.0 \ - --hash=sha256:1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631 \ - --hash=sha256:190875e6aebf2953c6803d42379ef3b934bc209ef8ef006f97aecb08f5aaeb86 - # via apache-airflow -flask-sqlalchemy==2.5.1 \ - --hash=sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912 \ - --hash=sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390 - # via flask-appbuilder -flask-wtf==1.1.1 \ - --hash=sha256:41c4244e9ae626d63bed42ae4785b90667b885b1535d5a4095e1f63060d12aa9 \ - --hash=sha256:7887d6f1ebb3e17bf648647422f0944c9a469d0fcf63e3b66fb9a83037e38b2c - # via - # apache-airflow - # flask-appbuilder -frozenlist==1.4.0 \ - --hash=sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6 \ - --hash=sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01 \ - --hash=sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251 \ - --hash=sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9 \ - --hash=sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b \ - --hash=sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87 \ - --hash=sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf \ - --hash=sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f \ - --hash=sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0 \ - --hash=sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2 \ - --hash=sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b \ - --hash=sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc \ - --hash=sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c \ - --hash=sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467 \ - --hash=sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9 \ - --hash=sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1 \ - --hash=sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a \ - --hash=sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79 \ - --hash=sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167 \ - --hash=sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300 \ - --hash=sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf \ - --hash=sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea \ - --hash=sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2 \ - --hash=sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab \ - --hash=sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3 \ - --hash=sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb \ - --hash=sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087 \ - --hash=sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc \ - --hash=sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8 \ - --hash=sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62 \ - --hash=sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f \ - --hash=sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326 \ - --hash=sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c \ - --hash=sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431 \ - --hash=sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963 \ - --hash=sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7 \ - --hash=sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef \ - --hash=sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3 \ - --hash=sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956 \ - --hash=sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781 \ - --hash=sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472 \ - --hash=sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc \ - --hash=sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839 \ - --hash=sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672 \ - --hash=sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3 \ - --hash=sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503 \ - --hash=sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d \ - --hash=sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8 \ - --hash=sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b \ - --hash=sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc \ - --hash=sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f \ - --hash=sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559 \ - --hash=sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b \ - --hash=sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95 \ - --hash=sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb \ - --hash=sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963 \ - --hash=sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919 \ - --hash=sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f \ - --hash=sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3 \ - --hash=sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1 \ - --hash=sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e - # via - # aiohttp - # aiosignal -google-re2==1.1 \ - --hash=sha256:04b2aefd768aa4edeef8b273327806c9cb0b82e90ff52eacf5d11003ac7a0db2 \ - --hash=sha256:07dd0780240ee431781119b46c3bbf76f5cef24a2cbb542f6a08c643e0a68d98 \ - --hash=sha256:0b5f0eaab859d3ba5f462c82bf37ab56e9d37e19b40b5898c731dbe4213a85f7 \ - --hash=sha256:0c39f69b702005963a3d3bf78743e1733ad73efd7e6e8465d76e3009e4694ceb \ - --hash=sha256:10c6cddc720151a509beb98ab310fa0cc8bcb265f83518ebf831de2c9ff73af0 \ - --hash=sha256:1563577e2b720d267c4cffacc0f6a2b5c8480ea966ebdb1844fbea6602c7496f \ - --hash=sha256:197cd9bcaba96d18c5bf84d0c32fca7a26c234ea83b1d3083366f4392cb99f78 \ - --hash=sha256:19b3f0bfbb2a2ca58ed0aaa9356d07a5c0921383a6dbeca086b2b74472f5ee08 \ - --hash=sha256:1b896f171d29b541256cf26e10dccc9103ac1894683914ed88828ca6facf8dca \ - --hash=sha256:1b9c1ffcfbc3095b6ff601ec2d2bf662988f6ea6763bc1c9d52bec55881f8fde \ - --hash=sha256:1e019e8f57955806ee843254ce454249b58800a6e872b2c8e9df2ef3459de0d5 \ - --hash=sha256:221e38c27e1dd9ccb8e911e9c7aed6439f68ce81e7bb74001076830b0d6e931d \ - --hash=sha256:22ad9ad9d125249d6386a2e80efb9de7af8260b703b6be7fa0ab069c1cf56ced \ - --hash=sha256:2362fd70eb639a75fd0187d28b4ba7b20b3088833d8ad7ffd8693d0ba159e1c2 \ - --hash=sha256:23b50eb74dc3e1d480b04b987c61242df5dade50d08bc16e25eb3582b83fca80 \ - --hash=sha256:2ac6936a3a60d8d9de9563e90227b3aea27068f597274ca192c999a12d8baa8f \ - --hash=sha256:2c73f8a9440873b68bee1198094377501065e85aaf6fcc0d2512c7589ffa06ca \ - --hash=sha256:32ecf995a252c0548404c1065ba4b36f1e524f1f4a86b6367a1a6c3da3801e30 \ - --hash=sha256:34fd7f97b84af7453cf05b25adfe2491ba3cef1ca548ac2907efa63d3510954d \ - --hash=sha256:35a902ba31a71a3e9e114e44473624d9aa9f9b85ec981bfa91671aefe0ef1a6c \ - --hash=sha256:35fd189cbaaaa39c9a6a8a00164c8d9c709bacd0c231c694936879609beff516 \ - --hash=sha256:3b47715b6d43c9351957eb5092ad0fa625d04106d81f34cb8a726c53395ad474 \ - --hash=sha256:3c325c2eae197b423330a04ab62e2e1cf942676cd5560907db4d63e23ce0648a \ - --hash=sha256:3cdf8982b6def987e95b37984d0c1c878de32635dd78acde3273f730b69708c9 \ - --hash=sha256:3e029664192d8d30f7c977706183ef483e82ca239302272df74e01d2e22897ca \ - --hash=sha256:41a8f222f9839d059d37efd28e4deec203502d7e39c3759d83d6a33deadf1d2e \ - --hash=sha256:42128916cc2966623832aabbd224c88e862d1c531d6bc49ab141f565e6321a90 \ - --hash=sha256:48b12d953bc796736e7831d67b36892fb6419a4cc44cb16521fe291e594bfe23 \ - --hash=sha256:49b7964532a801b96062d78c0222d155873968f823a546a3dbe63d73f25bb56f \ - --hash=sha256:4f2754616c61b76ab4e5a4f39892a52a00897203b859c5abd7e3c630dd883cda \ - --hash=sha256:5456fba09df951fe8d1714474ed1ecda102a68ddffab0113e6c117d2e64e6f2b \ - --hash=sha256:5541efcca5b5faf7e0d882334a04fa479bad4e7433f94870f46272eec0672c4a \ - --hash=sha256:58ebbcc7ad2b639768a6bca586357291660ea40dfac83039208e5055c357513b \ - --hash=sha256:59efeb77c0dcdbe37794c61f29c5b1f34bc06e8ec309a111ccdd29d380644d70 \ - --hash=sha256:5e9edcd743a830d0c0b2729201e42ab86fceef8f4086df65563f482e4544359e \ - --hash=sha256:5eaefe4705b75ca5f78178a50104b689e9282f868e12f119b26b4cffc0c7ee6e \ - --hash=sha256:60475d222cebd066c80414831c8a42aa2449aab252084102ee05440896586e6a \ - --hash=sha256:6141d569fdf72aa693f040ba05c469036587395af07ff419b9a3c009d6ffefd3 \ - --hash=sha256:62c780c927cff98c1538439f0ff616f48a9b2e8837c676f53170d8ae5b9e83cb \ - --hash=sha256:64f8eed4ca96905d99b5286b3d14b5ca4f6a025ff3c1351626a7df2f93ad1ddd \ - --hash=sha256:6d0ce762dee8d6617d0b1788a9653e805e83a23046c441d0ea65f1e27bf84114 \ - --hash=sha256:6e27986a166903ad7000635f6faed8ab5072d687f822ac9f692c40b2470aebcf \ - --hash=sha256:71ac661a7365e134741fe5542f13d7ce1e6187446b96ddee4c8b7d153fc8f05a \ - --hash=sha256:723f8553e7fc022294071f14fb7dfc7958c365dc7d4a71d4938ccd2df8c6eca4 \ - --hash=sha256:76a20e5ebdf5bc5d430530197e42a2eeb562f729d3a3fb51f39168283d676e66 \ - --hash=sha256:77c9f4d4bb1c8de9d2642d3c4b8b615858ba764df025b3b4f1310266f8def269 \ - --hash=sha256:7f9ba69eaee6e7a9f5ddfb919bf1a866af14a18b26a179e3fb1a6fe3d0cbf349 \ - --hash=sha256:86b80719636a4e21391e20a9adf18173ee6ae2ec956726fe2ff587417b5e8ba6 \ - --hash=sha256:871cb85b9b0e1784c983b5c148156b3c5314cb29ca70432dff0d163c5c08d7e5 \ - --hash=sha256:874d2e36dfa506b03d4f9c4aef1701a65304f4004c96c7edac7d8aea08fe193e \ - --hash=sha256:8b27cc2544b69a357ab2a749dc0c13a1b9055198c56f4c2c3b0f61d693f8e203 \ - --hash=sha256:901d86555bd7725506d651afaba7d71cd4abd13260aed6cfd7c641a45f76d4f6 \ - --hash=sha256:92309af35b6eb2d3b3dc57045cdd83a76370958ab3e0edd2cc4638f6d23f5b32 \ - --hash=sha256:9469f26b485da2784c658e687a766c72e1a17b1e63b3ed24b5f64c3d19fbae3d \ - --hash=sha256:94bd60785bf37ef130a1613738e3c39465a67eae3f3be44bb918540d39b68da3 \ - --hash=sha256:94f4e66e34bdb8de91ec6cdf20ba4fa9fea1dfdcfb77ff1f59700d01a0243664 \ - --hash=sha256:9857dc4d69b8025057c8129e98406a24d51bdaf1b96e481dbba7e69e0ec85104 \ - --hash=sha256:998f31bf7efbc9bb603d0c356c1c77e5331f689c71783df8e21e67bb025fc66a \ - --hash=sha256:9a1426a8cbd1fa004974574708d496005bd379310c4b1c7012be4bc75efde7a8 \ - --hash=sha256:9bea09c5e8401ec50b8f211bc820ec2f0ca5e744ac67431a1b39bdacbd266553 \ - --hash=sha256:9c6c9f64b9724ec38da8e514f404ac64e9a6a5e8b1d7031c2dadd05c1f4c16fd \ - --hash=sha256:9c90175992346519ee7546d9af9a64541c05b6b70346b0ddc54a48aa0d3b6554 \ - --hash=sha256:9c9998f71466f4db7bda752aa7c348b2881ff688e361108fe500caad1d8b9cb2 \ - --hash=sha256:9fb56a41250191298e6a2859b0fdea1e83330c9870fe8d84e5836c506ae46e96 \ - --hash=sha256:a1a30626ba48b4070f3eab272d860ef1952e710b088792c4d68dddb155be6bfc \ - --hash=sha256:a2d03f6aaf22788ba13a770f0d183b8eebe55545bcbb6e4c41dcccac7ded014d \ - --hash=sha256:a32bb2afe128d90b8edc20d4f7d297f7e2753206eba92937a57e5280736eac74 \ - --hash=sha256:a42c733036e8f242ee4e5f0e27153ad4ca44ced9e4ce82f3972938ddee528db0 \ - --hash=sha256:a6eaaa5f200022eb0bdded5949c91454fc96e1edd6f9e9a96dd1dc32c821c00e \ - --hash=sha256:a98f15fd9c31bf80d368698447191a2e9703880b305dbf34d9a63ce634b8a557 \ - --hash=sha256:ac775c75cec7069351d201da4e0fb0cae4c1c5ebecd08fa34e1be89740c1d80b \ - --hash=sha256:b110f3d657e8f67a43a699d327ce47095b80180ea1118e2de44cb5c7002503d9 \ - --hash=sha256:b632eff5e4cd44545a9c0e52f2e1becd55831e25f4dd4e0d7ec8ee6ca50858c1 \ - --hash=sha256:b66eb84850afdce09aabca40bcd6f2a0e96178a1b4990d555678edb1f59bf255 \ - --hash=sha256:c461640a07db26dc2b51f43de607b7520e7debaf4f6a000f796a3c0196ca52af \ - --hash=sha256:c58601b155651cc572a23ee2860788c77581aad85d3567a55b89b0674702f34d \ - --hash=sha256:c8a12f0740e2a52826bdbf95569a4b0abdf413b4012fa71e94ad25dd4715c6e5 \ - --hash=sha256:ce4710ff636701cfb56eb91c19b775d53b03749a23b7d2a5071bbbf4342a9067 \ - --hash=sha256:d1b751b9ab9f8e2ab2a36d72b909281ce65f328c9115a1685acae1a2d1afd7a4 \ - --hash=sha256:d33145bbfd32e916f1c911cd9225be5364a36c3959742a0cc4dfc0692d6a2a5e \ - --hash=sha256:d3a9467ee52b46ac77ca928f6d0cbeaccfd92f03ca0f0f65b9df6a95184f3a1c \ - --hash=sha256:d5a87b436028ec9b0f02fe19d4cbc19ef30441085cdfcdf1cce8fbe5c4bd5e9a \ - --hash=sha256:d81512b08e6787fc8ef29fea365d3fdbf957553a625550e1d96c36877ae30355 \ - --hash=sha256:d9145879e6c2e1b814445300b31f88a675e1f06c57564670d95a1442e8370c27 \ - --hash=sha256:e022d3239b945014e916ca7120fee659b246ec26c301f9e0542f1a19b38a8744 \ - --hash=sha256:e1bde89855dd5ab0811187d21eec149975510c80e865c771c883524a452445e7 \ - --hash=sha256:e35f2c8aabfaaa4ce6420b3cae86c0c29042b1b4f9937254347e9b985694a171 \ - --hash=sha256:e7865410f3b112a3609739283ec3f4f6f25aae827ff59c6bfdf806fd394d753e \ - --hash=sha256:ecf3619d98c9b4a7844ab52552ad32597cdbc9a5bdbc7e3435391c653600d1e2 \ - --hash=sha256:f267499529e64a4abed24c588f355ebe4700189d434d84a7367725f5a186e48d \ - --hash=sha256:f6d591d9c4cbc7142b729ddcc3f654d059d8ebc3bc95891198808a4785a6b4d8 \ - --hash=sha256:f70971f6ffe5254e476e71d449089917f50ebf9cf60f9cec80975ab1693777e2 \ - --hash=sha256:f95cf16739cc3ea63728366881221b119f2322b4b739b7da6522d45a68792cea \ - --hash=sha256:fb22ea995564d87baf4a4bfbb3ca024be913683a710f4f0dc9c94dc663afab20 \ - --hash=sha256:fc0d4163de9ed2155a77e7a2d59d94c348a6bbab3cff88922fab9e0d3d24faec \ - --hash=sha256:fd62ba2853eef65e249a9c4437a9ecac568222062bc956f0c61a3d1151a6271b \ - --hash=sha256:ffa51b118037518bcdf63c7649d0b4be7071982b83f48ee3bbabf24a9cb48f8a - # via apache-airflow -googleapis-common-protos==1.60.0 \ - --hash=sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918 \ - --hash=sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708 - # via - # opentelemetry-exporter-otlp-proto-grpc - # opentelemetry-exporter-otlp-proto-http -graphviz==0.20.1 \ - --hash=sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977 \ - --hash=sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8 - # via apache-airflow -greenlet==2.0.2 \ - --hash=sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a \ - --hash=sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a \ - --hash=sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1 \ - --hash=sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43 \ - --hash=sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33 \ - --hash=sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8 \ - --hash=sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088 \ - --hash=sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca \ - --hash=sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343 \ - --hash=sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645 \ - --hash=sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db \ - --hash=sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df \ - --hash=sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3 \ - --hash=sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86 \ - --hash=sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2 \ - --hash=sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a \ - --hash=sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf \ - --hash=sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7 \ - --hash=sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394 \ - --hash=sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40 \ - --hash=sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3 \ - --hash=sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6 \ - --hash=sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74 \ - --hash=sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0 \ - --hash=sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3 \ - --hash=sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91 \ - --hash=sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5 \ - --hash=sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9 \ - --hash=sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417 \ - --hash=sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8 \ - --hash=sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b \ - --hash=sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6 \ - --hash=sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb \ - --hash=sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73 \ - --hash=sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b \ - --hash=sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df \ - --hash=sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9 \ - --hash=sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f \ - --hash=sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0 \ - --hash=sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857 \ - --hash=sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a \ - --hash=sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249 \ - --hash=sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30 \ - --hash=sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292 \ - --hash=sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b \ - --hash=sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d \ - --hash=sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b \ - --hash=sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c \ - --hash=sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca \ - --hash=sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7 \ - --hash=sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75 \ - --hash=sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae \ - --hash=sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47 \ - --hash=sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b \ - --hash=sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470 \ - --hash=sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c \ - --hash=sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564 \ - --hash=sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9 \ - --hash=sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099 \ - --hash=sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0 \ - --hash=sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5 \ - --hash=sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19 \ - --hash=sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1 \ - --hash=sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526 - # via sqlalchemy -grpcio==1.58.0 \ - --hash=sha256:002f228d197fea12797a14e152447044e14fb4fdb2eb5d6cfa496f29ddbf79ef \ - --hash=sha256:039003a5e0ae7d41c86c768ef8b3ee2c558aa0a23cf04bf3c23567f37befa092 \ - --hash=sha256:09206106848462763f7f273ca93d2d2d4d26cab475089e0de830bb76be04e9e8 \ - --hash=sha256:128eb1f8e70676d05b1b0c8e6600320fc222b3f8c985a92224248b1367122188 \ - --hash=sha256:1c1c5238c6072470c7f1614bf7c774ffde6b346a100521de9ce791d1e4453afe \ - --hash=sha256:1ed979b273a81de36fc9c6716d9fb09dd3443efa18dcc8652501df11da9583e9 \ - --hash=sha256:201e550b7e2ede113b63e718e7ece93cef5b0fbf3c45e8fe4541a5a4305acd15 \ - --hash=sha256:212f38c6a156862098f6bdc9a79bf850760a751d259d8f8f249fc6d645105855 \ - --hash=sha256:24765a627eb4d9288ace32d5104161c3654128fe27f2808ecd6e9b0cfa7fc8b9 \ - --hash=sha256:24edec346e69e672daf12b2c88e95c6f737f3792d08866101d8c5f34370c54fd \ - --hash=sha256:2ef8d4a76d2c7d8065aba829f8d0bc0055495c998dce1964ca5b302d02514fb3 \ - --hash=sha256:2f85f87e2f087d9f632c085b37440a3169fda9cdde80cb84057c2fc292f8cbdf \ - --hash=sha256:3886b4d56bd4afeac518dbc05933926198aa967a7d1d237a318e6fbc47141577 \ - --hash=sha256:3e6bebf1dfdbeb22afd95650e4f019219fef3ab86d3fca8ebade52e4bc39389a \ - --hash=sha256:458899d2ebd55d5ca2350fd3826dfd8fcb11fe0f79828ae75e2b1e6051d50a29 \ - --hash=sha256:4891bbb4bba58acd1d620759b3be11245bfe715eb67a4864c8937b855b7ed7fa \ - --hash=sha256:4b12754af201bb993e6e2efd7812085ddaaef21d0a6f0ff128b97de1ef55aa4a \ - --hash=sha256:532410c51ccd851b706d1fbc00a87be0f5312bd6f8e5dbf89d4e99c7f79d7499 \ - --hash=sha256:5b23d75e5173faa3d1296a7bedffb25afd2fddb607ef292dfc651490c7b53c3d \ - --hash=sha256:62831d5e251dd7561d9d9e83a0b8655084b2a1f8ea91e4bd6b3cedfefd32c9d2 \ - --hash=sha256:652978551af02373a5a313e07bfef368f406b5929cf2d50fa7e4027f913dbdb4 \ - --hash=sha256:6801ff6652ecd2aae08ef994a3e49ff53de29e69e9cd0fd604a79ae4e545a95c \ - --hash=sha256:6cba491c638c76d3dc6c191d9c75041ca5b8f5c6de4b8327ecdcab527f130bb4 \ - --hash=sha256:7e473a7abad9af48e3ab5f3b5d237d18208024d28ead65a459bd720401bd2f8f \ - --hash=sha256:8774219e21b05f750eef8adc416e9431cf31b98f6ce9def288e4cea1548cbd22 \ - --hash=sha256:8f061722cad3f9aabb3fbb27f3484ec9d4667b7328d1a7800c3c691a98f16bb0 \ - --hash=sha256:92ae871a902cf19833328bd6498ec007b265aabf2fda845ab5bd10abcaf4c8c6 \ - --hash=sha256:9f13a171281ebb4d7b1ba9f06574bce2455dcd3f2f6d1fbe0fd0d84615c74045 \ - --hash=sha256:a2d67ff99e70e86b2be46c1017ae40b4840d09467d5455b2708de6d4c127e143 \ - --hash=sha256:b5e8db0aff0a4819946215f156bd722b6f6c8320eb8419567ffc74850c9fd205 \ - --hash=sha256:ba0af11938acf8cd4cf815c46156bcde36fa5850518120920d52620cc3ec1830 \ - --hash=sha256:bc325fed4d074367bebd465a20763586e5e1ed5b943e9d8bc7c162b1f44fd602 \ - --hash=sha256:bc7ffef430b80345729ff0a6825e9d96ac87efe39216e87ac58c6c4ef400de93 \ - --hash=sha256:cde11577d5b6fd73a00e6bfa3cf5f428f3f33c2d2878982369b5372bbc4acc60 \ - --hash=sha256:d4cef77ad2fed42b1ba9143465856d7e737279854e444925d5ba45fc1f3ba727 \ - --hash=sha256:d79b660681eb9bc66cc7cbf78d1b1b9e335ee56f6ea1755d34a31108b80bd3c8 \ - --hash=sha256:d81c2b2b24c32139dd2536972f1060678c6b9fbd106842a9fcdecf07b233eccd \ - --hash=sha256:dc72e04620d49d3007771c0e0348deb23ca341c0245d610605dddb4ac65a37cb \ - --hash=sha256:dcfba7befe3a55dab6fe1eb7fc9359dc0c7f7272b30a70ae0af5d5b063842f28 \ - --hash=sha256:e9f995a8a421405958ff30599b4d0eec244f28edc760de82f0412c71c61763d2 \ - --hash=sha256:eb6b92036ff312d5b4182fa72e8735d17aceca74d0d908a7f08e375456f03e07 \ - --hash=sha256:f0241f7eb0d2303a545136c59bc565a35c4fc3b924ccbd69cb482f4828d6f31c \ - --hash=sha256:fad9295fe02455d4f158ad72c90ef8b4bcaadfdb5efb5795f7ab0786ad67dd58 \ - --hash=sha256:fbcecb6aedd5c1891db1d70efbfbdc126c986645b5dd616a045c07d6bd2dfa86 \ - --hash=sha256:fe643af248442221db027da43ed43e53b73e11f40c9043738de9a2b4b6ca7697 - # via opentelemetry-exporter-otlp-proto-grpc -gunicorn==21.2.0 \ - --hash=sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0 \ - --hash=sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033 - # via apache-airflow -h11==0.14.0 \ - --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ - --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 - # via httpcore -httpcore==0.18.0 \ - --hash=sha256:13b5e5cd1dca1a6636a6aaea212b19f4f85cd88c366a2b82304181b769aab3c9 \ - --hash=sha256:adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced - # via httpx -httpx==0.25.0 \ - --hash=sha256:181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100 \ - --hash=sha256:47ecda285389cb32bb2691cc6e069e3ab0205956f681c5b2ad2325719751d875 - # via apache-airflow idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 - # via - # anyio - # email-validator - # httpx - # requests - # yarl -importlib-metadata==6.8.0 \ - --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ - --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 - # via - # flask - # markdown - # opentelemetry-api -importlib-resources==6.0.1 \ - --hash=sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf \ - --hash=sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4 - # via limits -inflection==0.5.1 \ - --hash=sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417 \ - --hash=sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2 - # via connexion -itsdangerous==2.1.2 \ - --hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \ - --hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a - # via - # apache-airflow - # connexion - # flask - # flask-wtf -jinja2==3.1.2 \ - --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ - --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 - # via - # apache-airflow - # flask - # flask-babel - # python-nvd3 -jsonschema==4.19.0 \ - --hash=sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb \ - --hash=sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f - # via - # apache-airflow - # connexion - # flask-appbuilder -jsonschema-specifications==2023.7.1 \ - --hash=sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1 \ - --hash=sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb - # via jsonschema -lazy-object-proxy==1.9.0 \ - --hash=sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382 \ - --hash=sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82 \ - --hash=sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9 \ - --hash=sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494 \ - --hash=sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46 \ - --hash=sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30 \ - --hash=sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63 \ - --hash=sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4 \ - --hash=sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae \ - --hash=sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be \ - --hash=sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701 \ - --hash=sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd \ - --hash=sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006 \ - --hash=sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a \ - --hash=sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586 \ - --hash=sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8 \ - --hash=sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821 \ - --hash=sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07 \ - --hash=sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b \ - --hash=sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171 \ - --hash=sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b \ - --hash=sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2 \ - --hash=sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7 \ - --hash=sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4 \ - --hash=sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8 \ - --hash=sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e \ - --hash=sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f \ - --hash=sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda \ - --hash=sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4 \ - --hash=sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e \ - --hash=sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671 \ - --hash=sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11 \ - --hash=sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455 \ - --hash=sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734 \ - --hash=sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb \ - --hash=sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59 - # via apache-airflow -limits==3.6.0 \ - --hash=sha256:32fe29a398352c71bc43d53773117d47e22c5ea4200aef28d3f5fdee10334cd7 \ - --hash=sha256:57a9c69fd37ad1e4fa3886dff8d035227e1f6af87f47e9118627e72cf1ced3bf - # via flask-limiter -linkify-it-py==2.0.2 \ - --hash=sha256:19f3060727842c254c808e99d465c80c49d2c7306788140987a1a7a29b0d6ad2 \ - --hash=sha256:a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541 - # via apache-airflow -lockfile==0.12.2 \ - --hash=sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799 \ - --hash=sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa - # via - # apache-airflow - # python-daemon -mako==1.2.4 \ - --hash=sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818 \ - --hash=sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34 - # via alembic -markdown==3.4.4 \ - --hash=sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6 \ - --hash=sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941 - # via apache-airflow -markdown-it-py==3.0.0 \ - --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ - --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb - # via - # apache-airflow - # mdit-py-plugins - # rich -markupsafe==2.1.3 \ - --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ - --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ - --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ - --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ - --hash=sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c \ - --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ - --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ - --hash=sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb \ - --hash=sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939 \ - --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ - --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ - --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ - --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ - --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ - --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ - --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ - --hash=sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd \ - --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ - --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ - --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ - --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ - --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ - --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ - --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ - --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ - --hash=sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007 \ - --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ - --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ - --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ - --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ - --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ - --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ - --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ - --hash=sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1 \ - --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ - --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ - --hash=sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c \ - --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ - --hash=sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823 \ - --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ - --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ - --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ - --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ - --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ - --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ - --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ - --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ - --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ - --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ - --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ - --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ - --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ - --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ - --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ - --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ - --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ - --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ - --hash=sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc \ - --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 \ - --hash=sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11 - # via - # apache-airflow - # jinja2 - # mako - # werkzeug - # wtforms -marshmallow==3.20.1 \ - --hash=sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889 \ - --hash=sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c - # via - # flask-appbuilder - # marshmallow-oneofschema - # marshmallow-sqlalchemy -marshmallow-oneofschema==3.0.1 \ - --hash=sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237 \ - --hash=sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2 - # via apache-airflow -marshmallow-sqlalchemy==0.26.1 \ - --hash=sha256:ba7493eeb8669a3bf00d8f906b657feaa87a740ae9e4ecf829cfd6ddf763d276 \ - --hash=sha256:d8525f74de51554b5c8491effe036f60629a426229befa33ff614c8569a16a73 - # via flask-appbuilder -mdit-py-plugins==0.4.0 \ - --hash=sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9 \ - --hash=sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b - # via apache-airflow -mdurl==0.1.2 \ - --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ - --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba - # via markdown-it-py -multidict==6.0.4 \ - --hash=sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9 \ - --hash=sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8 \ - --hash=sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03 \ - --hash=sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710 \ - --hash=sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161 \ - --hash=sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664 \ - --hash=sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569 \ - --hash=sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067 \ - --hash=sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313 \ - --hash=sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706 \ - --hash=sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2 \ - --hash=sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636 \ - --hash=sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49 \ - --hash=sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93 \ - --hash=sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603 \ - --hash=sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0 \ - --hash=sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60 \ - --hash=sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4 \ - --hash=sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e \ - --hash=sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1 \ - --hash=sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60 \ - --hash=sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951 \ - --hash=sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc \ - --hash=sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe \ - --hash=sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95 \ - --hash=sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d \ - --hash=sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8 \ - --hash=sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed \ - --hash=sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2 \ - --hash=sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775 \ - --hash=sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87 \ - --hash=sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c \ - --hash=sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2 \ - --hash=sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98 \ - --hash=sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3 \ - --hash=sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe \ - --hash=sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78 \ - --hash=sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660 \ - --hash=sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176 \ - --hash=sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e \ - --hash=sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988 \ - --hash=sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c \ - --hash=sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c \ - --hash=sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0 \ - --hash=sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449 \ - --hash=sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f \ - --hash=sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde \ - --hash=sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5 \ - --hash=sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d \ - --hash=sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac \ - --hash=sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a \ - --hash=sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9 \ - --hash=sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca \ - --hash=sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11 \ - --hash=sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35 \ - --hash=sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063 \ - --hash=sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b \ - --hash=sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982 \ - --hash=sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258 \ - --hash=sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1 \ - --hash=sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52 \ - --hash=sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480 \ - --hash=sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7 \ - --hash=sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461 \ - --hash=sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d \ - --hash=sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc \ - --hash=sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779 \ - --hash=sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a \ - --hash=sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547 \ - --hash=sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0 \ - --hash=sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171 \ - --hash=sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf \ - --hash=sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d \ - --hash=sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba - # via - # aiohttp - # yarl -opentelemetry-api==1.20.0 \ - --hash=sha256:06abe351db7572f8afdd0fb889ce53f3c992dbf6f6262507b385cc1963e06983 \ - --hash=sha256:982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5 - # via - # apache-airflow - # opentelemetry-exporter-otlp-proto-grpc - # opentelemetry-exporter-otlp-proto-http - # opentelemetry-sdk -opentelemetry-exporter-otlp==1.20.0 \ - --hash=sha256:3b4d47726da83fef84467bdf96da4f8f3d1a61b35db3c16354c391ce8e9decf6 \ - --hash=sha256:f8cb69f80c333166e5cfaa030f9e28f7faaf343aff24caaa2cb4202ea4849b6b - # via apache-airflow -opentelemetry-exporter-otlp-proto-common==1.20.0 \ - --hash=sha256:dd63209b40702636ab6ae76a06b401b646ad7b008a906ecb41222d4af24fbdef \ - --hash=sha256:df60c681bd61812e50b3a39a7a1afeeb6d4066117583249fcc262269374e7a49 - # via - # opentelemetry-exporter-otlp-proto-grpc - # opentelemetry-exporter-otlp-proto-http -opentelemetry-exporter-otlp-proto-grpc==1.20.0 \ - --hash=sha256:6c06d43c3771bda1795226e327722b4b980fa1ca1ec9e985f2ef3e29795bdd52 \ - --hash=sha256:7c3f066065891b56348ba2c7f9df6ec635a712841cae0a36f2f6a81642ae7dec - # via opentelemetry-exporter-otlp -opentelemetry-exporter-otlp-proto-http==1.20.0 \ - --hash=sha256:03f6e768ad25f1c3a9586e8c695db4a4adf978f8546a1285fa962e16bfbb0bd6 \ - --hash=sha256:500f42821420fdf0759193d6438edc0f4e984a83e14c08a23023c06a188861b4 - # via opentelemetry-exporter-otlp -opentelemetry-proto==1.20.0 \ - --hash=sha256:512c3d2c6864fb7547a69577c3907348e6c985b7a204533563cb4c4c5046203b \ - --hash=sha256:cf01f49b3072ee57468bccb1a4f93bdb55411f4512d0ac3f97c5c04c0040b5a2 - # via - # opentelemetry-exporter-otlp-proto-common - # opentelemetry-exporter-otlp-proto-grpc - # opentelemetry-exporter-otlp-proto-http -opentelemetry-sdk==1.20.0 \ - --hash=sha256:702e432a457fa717fd2ddfd30640180e69938f85bb7fec3e479f85f61c1843f8 \ - --hash=sha256:f2230c276ff4c63ea09b3cb2e2ac6b1265f90af64e8d16bbf275c81a9ce8e804 - # via - # opentelemetry-exporter-otlp-proto-grpc - # opentelemetry-exporter-otlp-proto-http -opentelemetry-semantic-conventions==0.41b0 \ - --hash=sha256:0ce5b040b8a3fc816ea5879a743b3d6fe5db61f6485e4def94c6ee4d402e1eb7 \ - --hash=sha256:45404391ed9e50998183a4925ad1b497c01c143f06500c3b9c3d0013492bb0f2 - # via opentelemetry-sdk -ordered-set==4.1.0 \ - --hash=sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562 \ - --hash=sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8 - # via flask-limiter -packaging==23.1 \ - --hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \ - --hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f - # via - # apache-airflow - # apispec - # connexion - # gunicorn - # limits - # marshmallow -pathspec==0.11.2 \ - --hash=sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20 \ - --hash=sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3 - # via apache-airflow -pendulum==2.1.2 \ - --hash=sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394 \ - --hash=sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b \ - --hash=sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a \ - --hash=sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087 \ - --hash=sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739 \ - --hash=sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269 \ - --hash=sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0 \ - --hash=sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5 \ - --hash=sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be \ - --hash=sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7 \ - --hash=sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3 \ - --hash=sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207 \ - --hash=sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe \ - --hash=sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360 \ - --hash=sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0 \ - --hash=sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b \ - --hash=sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052 \ - --hash=sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002 \ - --hash=sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116 \ - --hash=sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db \ - --hash=sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b - # via apache-airflow -pluggy==1.3.0 \ - --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ - --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 - # via apache-airflow -prison==0.2.1 \ - --hash=sha256:e6cd724044afcb1a8a69340cad2f1e3151a5839fd3a8027fd1357571e797c599 \ - --hash=sha256:f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5 - # via flask-appbuilder -protobuf==4.24.3 \ - --hash=sha256:067f750169bc644da2e1ef18c785e85071b7c296f14ac53e0900e605da588719 \ - --hash=sha256:12e9ad2ec079b833176d2921be2cb24281fa591f0b119b208b788adc48c2561d \ - --hash=sha256:1b182c7181a2891e8f7f3a1b5242e4ec54d1f42582485a896e4de81aa17540c2 \ - --hash=sha256:20651f11b6adc70c0f29efbe8f4a94a74caf61b6200472a9aea6e19898f9fcf4 \ - --hash=sha256:2da777d34b4f4f7613cdf85c70eb9a90b1fbef9d36ae4a0ccfe014b0b07906f1 \ - --hash=sha256:3d42e9e4796a811478c783ef63dc85b5a104b44aaaca85d4864d5b886e4b05e3 \ - --hash=sha256:6e514e8af0045be2b56e56ae1bb14f43ce7ffa0f68b1c793670ccbe2c4fc7d2b \ - --hash=sha256:b0271a701e6782880d65a308ba42bc43874dabd1a0a0f41f72d2dac3b57f8e76 \ - --hash=sha256:ba53c2f04798a326774f0e53b9c759eaef4f6a568ea7072ec6629851c8435959 \ - --hash=sha256:e29d79c913f17a60cf17c626f1041e5288e9885c8579832580209de8b75f2a52 \ - --hash=sha256:f631bb982c5478e0c1c70eab383af74a84be66945ebf5dd6b06fc90079668d0b \ - --hash=sha256:f6ccbcf027761a2978c1406070c3788f6de4a4b2cc20800cc03d52df716ad675 \ - --hash=sha256:f6f8dc65625dadaad0c8545319c2e2f0424fede988368893ca3844261342c11a - # via - # googleapis-common-protos - # opentelemetry-proto -psutil==5.9.5 \ - --hash=sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d \ - --hash=sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217 \ - --hash=sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4 \ - --hash=sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c \ - --hash=sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f \ - --hash=sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da \ - --hash=sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4 \ - --hash=sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42 \ - --hash=sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5 \ - --hash=sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4 \ - --hash=sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9 \ - --hash=sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f \ - --hash=sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30 \ - --hash=sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48 - # via apache-airflow + # via requests pyasn1==0.5.0 \ --hash=sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57 \ --hash=sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde @@ -1224,721 +198,23 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pydantic==2.3.0 \ - --hash=sha256:1607cc106602284cd4a00882986570472f193fde9cb1259bceeaedb26aa79a6d \ - --hash=sha256:45b5e446c6dfaad9444819a293b921a40e1db1aa61ea08aede0522529ce90e81 - # via apache-airflow -pydantic-core==2.6.3 \ - --hash=sha256:002d0ea50e17ed982c2d65b480bd975fc41086a5a2f9c924ef8fc54419d1dea3 \ - --hash=sha256:02e1c385095efbd997311d85c6021d32369675c09bcbfff3b69d84e59dc103f6 \ - --hash=sha256:046af9cfb5384f3684eeb3f58a48698ddab8dd870b4b3f67f825353a14441418 \ - --hash=sha256:04fe5c0a43dec39aedba0ec9579001061d4653a9b53a1366b113aca4a3c05ca7 \ - --hash=sha256:07a1aec07333bf5adebd8264047d3dc518563d92aca6f2f5b36f505132399efc \ - --hash=sha256:1480fa4682e8202b560dcdc9eeec1005f62a15742b813c88cdc01d44e85308e5 \ - --hash=sha256:1508f37ba9e3ddc0189e6ff4e2228bd2d3c3a4641cbe8c07177162f76ed696c7 \ - --hash=sha256:171a4718860790f66d6c2eda1d95dd1edf64f864d2e9f9115840840cf5b5713f \ - --hash=sha256:19e20f8baedd7d987bd3f8005c146e6bcbda7cdeefc36fad50c66adb2dd2da48 \ - --hash=sha256:1a0ddaa723c48af27d19f27f1c73bdc615c73686d763388c8683fe34ae777bad \ - --hash=sha256:1aa712ba150d5105814e53cb141412217146fedc22621e9acff9236d77d2a5ef \ - --hash=sha256:1ac1750df1b4339b543531ce793b8fd5c16660a95d13aecaab26b44ce11775e9 \ - --hash=sha256:1c721bfc575d57305dd922e6a40a8fe3f762905851d694245807a351ad255c58 \ - --hash=sha256:1ce8c84051fa292a5dc54018a40e2a1926fd17980a9422c973e3ebea017aa8da \ - --hash=sha256:1fa1f6312fb84e8c281f32b39affe81984ccd484da6e9d65b3d18c202c666149 \ - --hash=sha256:22134a4453bd59b7d1e895c455fe277af9d9d9fbbcb9dc3f4a97b8693e7e2c9b \ - --hash=sha256:23470a23614c701b37252618e7851e595060a96a23016f9a084f3f92f5ed5881 \ - --hash=sha256:240a015102a0c0cc8114f1cba6444499a8a4d0333e178bc504a5c2196defd456 \ - --hash=sha256:252851b38bad3bfda47b104ffd077d4f9604a10cb06fe09d020016a25107bf98 \ - --hash=sha256:2a20c533cb80466c1d42a43a4521669ccad7cf2967830ac62c2c2f9cece63e7e \ - --hash=sha256:2dd50d6a1aef0426a1d0199190c6c43ec89812b1f409e7fe44cb0fbf6dfa733c \ - --hash=sha256:340e96c08de1069f3d022a85c2a8c63529fd88709468373b418f4cf2c949fb0e \ - --hash=sha256:3796a6152c545339d3b1652183e786df648ecdf7c4f9347e1d30e6750907f5bb \ - --hash=sha256:37a822f630712817b6ecc09ccc378192ef5ff12e2c9bae97eb5968a6cdf3b862 \ - --hash=sha256:3a750a83b2728299ca12e003d73d1264ad0440f60f4fc9cee54acc489249b728 \ - --hash=sha256:3c8945a105f1589ce8a693753b908815e0748f6279959a4530f6742e1994dcb6 \ - --hash=sha256:3ccc13afee44b9006a73d2046068d4df96dc5b333bf3509d9a06d1b42db6d8bf \ - --hash=sha256:3f90e5e3afb11268628c89f378f7a1ea3f2fe502a28af4192e30a6cdea1e7d5e \ - --hash=sha256:4292ca56751aebbe63a84bbfc3b5717abb09b14d4b4442cc43fd7c49a1529efd \ - --hash=sha256:430ddd965ffd068dd70ef4e4d74f2c489c3a313adc28e829dd7262cc0d2dd1e8 \ - --hash=sha256:439a0de139556745ae53f9cc9668c6c2053444af940d3ef3ecad95b079bc9987 \ - --hash=sha256:44b4f937b992394a2e81a5c5ce716f3dcc1237281e81b80c748b2da6dd5cf29a \ - --hash=sha256:48c1ed8b02ffea4d5c9c220eda27af02b8149fe58526359b3c07eb391cb353a2 \ - --hash=sha256:4ef724a059396751aef71e847178d66ad7fc3fc969a1a40c29f5aac1aa5f8784 \ - --hash=sha256:50555ba3cb58f9861b7a48c493636b996a617db1a72c18da4d7f16d7b1b9952b \ - --hash=sha256:522a9c4a4d1924facce7270c84b5134c5cabcb01513213662a2e89cf28c1d309 \ - --hash=sha256:5493a7027bfc6b108e17c3383959485087d5942e87eb62bbac69829eae9bc1f7 \ - --hash=sha256:56ea80269077003eaa59723bac1d8bacd2cd15ae30456f2890811efc1e3d4413 \ - --hash=sha256:5a2a3c9ef904dcdadb550eedf3291ec3f229431b0084666e2c2aa8ff99a103a2 \ - --hash=sha256:5cfde4fab34dd1e3a3f7f3db38182ab6c95e4ea91cf322242ee0be5c2f7e3d2f \ - --hash=sha256:5e4a2cf8c4543f37f5dc881de6c190de08096c53986381daebb56a355be5dfe6 \ - --hash=sha256:5e9c068f36b9f396399d43bfb6defd4cc99c36215f6ff33ac8b9c14ba15bdf6b \ - --hash=sha256:5ed7ceca6aba5331ece96c0e328cd52f0dcf942b8895a1ed2642de50800b79d3 \ - --hash=sha256:5fa159b902d22b283b680ef52b532b29554ea2a7fc39bf354064751369e9dbd7 \ - --hash=sha256:615a31b1629e12445c0e9fc8339b41aaa6cc60bd53bf802d5fe3d2c0cda2ae8d \ - --hash=sha256:621afe25cc2b3c4ba05fff53525156d5100eb35c6e5a7cf31d66cc9e1963e378 \ - --hash=sha256:6656a0ae383d8cd7cc94e91de4e526407b3726049ce8d7939049cbfa426518c8 \ - --hash=sha256:672174480a85386dd2e681cadd7d951471ad0bb028ed744c895f11f9d51b9ebe \ - --hash=sha256:692b4ff5c4e828a38716cfa92667661a39886e71136c97b7dac26edef18767f7 \ - --hash=sha256:6bcc1ad776fffe25ea5c187a028991c031a00ff92d012ca1cc4714087e575973 \ - --hash=sha256:6bf7d610ac8f0065a286002a23bcce241ea8248c71988bda538edcc90e0c39ad \ - --hash=sha256:75c0ebbebae71ed1e385f7dfd9b74c1cff09fed24a6df43d326dd7f12339ec34 \ - --hash=sha256:788be9844a6e5c4612b74512a76b2153f1877cd845410d756841f6c3420230eb \ - --hash=sha256:7dc2ce039c7290b4ef64334ec7e6ca6494de6eecc81e21cb4f73b9b39991408c \ - --hash=sha256:813aab5bfb19c98ae370952b6f7190f1e28e565909bfc219a0909db168783465 \ - --hash=sha256:8421cf496e746cf8d6b677502ed9a0d1e4e956586cd8b221e1312e0841c002d5 \ - --hash=sha256:84e87c16f582f5c753b7f39a71bd6647255512191be2d2dbf49458c4ef024588 \ - --hash=sha256:84f8bb34fe76c68c9d96b77c60cef093f5e660ef8e43a6cbfcd991017d375950 \ - --hash=sha256:85cc4d105747d2aa3c5cf3e37dac50141bff779545ba59a095f4a96b0a460e70 \ - --hash=sha256:883daa467865e5766931e07eb20f3e8152324f0adf52658f4d302242c12e2c32 \ - --hash=sha256:8b2b1bfed698fa410ab81982f681f5b1996d3d994ae8073286515ac4d165c2e7 \ - --hash=sha256:8ecbac050856eb6c3046dea655b39216597e373aa8e50e134c0e202f9c47efec \ - --hash=sha256:930bfe73e665ebce3f0da2c6d64455098aaa67e1a00323c74dc752627879fc67 \ - --hash=sha256:9616567800bdc83ce136e5847d41008a1d602213d024207b0ff6cab6753fe645 \ - --hash=sha256:9680dd23055dd874173a3a63a44e7f5a13885a4cfd7e84814be71be24fba83db \ - --hash=sha256:99faba727727b2e59129c59542284efebbddade4f0ae6a29c8b8d3e1f437beb7 \ - --hash=sha256:9a718d56c4d55efcfc63f680f207c9f19c8376e5a8a67773535e6f7e80e93170 \ - --hash=sha256:9b33bf9658cb29ac1a517c11e865112316d09687d767d7a0e4a63d5c640d1b17 \ - --hash=sha256:9e8b374ef41ad5c461efb7a140ce4730661aadf85958b5c6a3e9cf4e040ff4bb \ - --hash=sha256:9e9b65a55bbabda7fccd3500192a79f6e474d8d36e78d1685496aad5f9dbd92c \ - --hash=sha256:a0b7486d85293f7f0bbc39b34e1d8aa26210b450bbd3d245ec3d732864009819 \ - --hash=sha256:a53e3195f134bde03620d87a7e2b2f2046e0e5a8195e66d0f244d6d5b2f6d31b \ - --hash=sha256:a87c54e72aa2ef30189dc74427421e074ab4561cf2bf314589f6af5b37f45e6d \ - --hash=sha256:a892b5b1871b301ce20d40b037ffbe33d1407a39639c2b05356acfef5536d26a \ - --hash=sha256:a8acc9dedd304da161eb071cc7ff1326aa5b66aadec9622b2574ad3ffe225525 \ - --hash=sha256:aaafc776e5edc72b3cad1ccedb5fd869cc5c9a591f1213aa9eba31a781be9ac1 \ - --hash=sha256:acafc4368b289a9f291e204d2c4c75908557d4f36bd3ae937914d4529bf62a76 \ - --hash=sha256:b0a5d7edb76c1c57b95df719af703e796fc8e796447a1da939f97bfa8a918d60 \ - --hash=sha256:b25afe9d5c4f60dcbbe2b277a79be114e2e65a16598db8abee2a2dcde24f162b \ - --hash=sha256:b44c42edc07a50a081672e25dfe6022554b47f91e793066a7b601ca290f71e42 \ - --hash=sha256:b594b64e8568cf09ee5c9501ede37066b9fc41d83d58f55b9952e32141256acd \ - --hash=sha256:b962700962f6e7a6bd77e5f37320cabac24b4c0f76afeac05e9f93cf0c620014 \ - --hash=sha256:bb128c30cf1df0ab78166ded1ecf876620fb9aac84d2413e8ea1594b588c735d \ - --hash=sha256:bf9d42a71a4d7a7c1f14f629e5c30eac451a6fc81827d2beefd57d014c006c4a \ - --hash=sha256:c6595b0d8c8711e8e1dc389d52648b923b809f68ac1c6f0baa525c6440aa0daa \ - --hash=sha256:c8c6660089a25d45333cb9db56bb9e347241a6d7509838dbbd1931d0e19dbc7f \ - --hash=sha256:c9d469204abcca28926cbc28ce98f28e50e488767b084fb3fbdf21af11d3de26 \ - --hash=sha256:d38bbcef58220f9c81e42c255ef0bf99735d8f11edef69ab0b499da77105158a \ - --hash=sha256:d4eb77df2964b64ba190eee00b2312a1fd7a862af8918ec70fc2d6308f76ac64 \ - --hash=sha256:d63b7545d489422d417a0cae6f9898618669608750fc5e62156957e609e728a5 \ - --hash=sha256:d7050899026e708fb185e174c63ebc2c4ee7a0c17b0a96ebc50e1f76a231c057 \ - --hash=sha256:d79f1f2f7ebdb9b741296b69049ff44aedd95976bfee38eb4848820628a99b50 \ - --hash=sha256:d85463560c67fc65cd86153a4975d0b720b6d7725cf7ee0b2d291288433fc21b \ - --hash=sha256:d9140ded382a5b04a1c030b593ed9bf3088243a0a8b7fa9f071a5736498c5483 \ - --hash=sha256:d9b4916b21931b08096efed090327f8fe78e09ae8f5ad44e07f5c72a7eedb51b \ - --hash=sha256:df14f6332834444b4a37685810216cc8fe1fe91f447332cd56294c984ecbff1c \ - --hash=sha256:e49ce7dc9f925e1fb010fc3d555250139df61fa6e5a0a95ce356329602c11ea9 \ - --hash=sha256:e61eae9b31799c32c5f9b7be906be3380e699e74b2db26c227c50a5fc7988698 \ - --hash=sha256:ea053cefa008fda40f92aab937fb9f183cf8752e41dbc7bc68917884454c6362 \ - --hash=sha256:f06e21ad0b504658a3a9edd3d8530e8cea5723f6ea5d280e8db8efc625b47e49 \ - --hash=sha256:f14546403c2a1d11a130b537dda28f07eb6c1805a43dae4617448074fd49c282 \ - --hash=sha256:f1a5d8f18877474c80b7711d870db0eeef9442691fcdb00adabfc97e183ee0b0 \ - --hash=sha256:f2969e8f72c6236c51f91fbb79c33821d12a811e2a94b7aa59c65f8dbdfad34a \ - --hash=sha256:f468d520f47807d1eb5d27648393519655eadc578d5dd862d06873cce04c4d1b \ - --hash=sha256:f70dc00a91311a1aea124e5f64569ea44c011b58433981313202c46bccbec0e1 \ - --hash=sha256:f93255b3e4d64785554e544c1c76cd32f4a354fa79e2eeca5d16ac2e7fdd57aa - # via pydantic -pygments==2.16.1 \ - --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \ - --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29 - # via - # apache-airflow - # rich -pyjwt==2.8.0 \ - --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ - --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 - # via - # apache-airflow - # flask-appbuilder - # flask-jwt-extended -python-daemon==3.0.1 \ - --hash=sha256:42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341 \ - --hash=sha256:6c57452372f7eaff40934a1c03ad1826bf5e793558e87fef49131e6464b4dae5 - # via apache-airflow -python-dateutil==2.8.2 \ - --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ - --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - # via - # apache-airflow - # croniter - # flask-appbuilder - # pendulum python-jose[cryptography]==3.3.0 \ --hash=sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a \ --hash=sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a # via cognitojwt -python-nvd3==0.15.0 \ - --hash=sha256:fbd75ff47e0ef255b4aa4f3a8b10dc8b4024aa5a9a7abed5b2406bd3cb817715 - # via apache-airflow -python-slugify==8.0.1 \ - --hash=sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395 \ - --hash=sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27 - # via - # apache-airflow - # python-nvd3 -pytz==2023.3.post1 \ - --hash=sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b \ - --hash=sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7 - # via flask-babel -pytzdata==2020.1 \ - --hash=sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540 \ - --hash=sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f - # via pendulum -pyyaml==6.0.1 \ - --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ - --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ - --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ - --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ - --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ - --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ - --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ - --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f - # via - # apispec - # clickclick - # connexion -referencing==0.30.2 \ - --hash=sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf \ - --hash=sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0 - # via - # jsonschema - # jsonschema-specifications requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 - # via - # -r requirements.in - # apache-airflow-providers-http - # connexion - # opentelemetry-exporter-otlp-proto-http - # requests-toolbelt -requests-toolbelt==1.0.0 \ - --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \ - --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 - # via apache-airflow-providers-http -rfc3339-validator==0.1.4 \ - --hash=sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b \ - --hash=sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa - # via apache-airflow -rich==13.5.2 \ - --hash=sha256:146a90b3b6b47cac4a73c12866a499e9817426423f57c5a66949c086191a8808 \ - --hash=sha256:fb9d6c0a0f643c99eed3875b5377a184132ba9be4d61516a55273d3554d75a39 - # via - # apache-airflow - # flask-limiter - # rich-argparse -rich-argparse==1.3.0 \ - --hash=sha256:1a5eda1659c0a215862fe3630fcbe68d7792f18a8106baaf4e005b9896acc6f6 \ - --hash=sha256:974cc1ba0aaa0d6aabc09ab1b78f9ba928670e08590f9551121bcbc60c75b74a - # via apache-airflow -rpds-py==0.10.2 \ - --hash=sha256:00e97d43a36811b78fa9ad9d3329bf34f76a31e891a7031a2ac01450c9b168ab \ - --hash=sha256:013d6c784150d10236a74b4094a79d96a256b814457e388fc5a4ba9efe24c402 \ - --hash=sha256:0188b580c490bccb031e9b67e9e8c695a3c44ac5e06218b152361eca847317c3 \ - --hash=sha256:02945ae38fd78efc40900f509890de84cfd5ffe2cd2939eeb3a8800dc68b87cb \ - --hash=sha256:02b4a2e28eb24dac4ef43dda4f6a6f7766e355179b143f7d0c76a1c5488a307b \ - --hash=sha256:0527c97dcd8bb983822ee31d3760187083fd3ba18ac4dd22cf5347c89d5628f4 \ - --hash=sha256:05a1382905026bdd560f806c8c7c16e0f3e3fb359ba8868203ca6e5799884968 \ - --hash=sha256:0b309908b6ff5ffbf6394818cb73b5a2a74073acee2c57fe8719046389aeff0d \ - --hash=sha256:0fc625059b83695fbb4fc8b7a8b66fa94ff9c7b78c84fb9986cd53ff88a28d80 \ - --hash=sha256:177c033e467a66a054dd3a9534167234a3d0b2e41445807b13b626e01da25d92 \ - --hash=sha256:18909093944727e068ebfc92e2e6ed1c4fa44135507c1c0555213ce211c53214 \ - --hash=sha256:1adb04e4b4e41bf30aaa77eeb169c1b9ba9e5010e2e6ce8d6c17e1446edc9b68 \ - --hash=sha256:1ed3d5385d14be894e12a9033be989e012214a9811e7194849c94032ad69682a \ - --hash=sha256:203eb1532d51591d32e8dfafd60b5d31347ea7278c8da02b4b550287f6abe28b \ - --hash=sha256:213f9ef5c02ec2f883c1075d25a873149daadbaea50d18d622e9db55ec9849c2 \ - --hash=sha256:2275f1a022e2383da5d2d101fe11ccdcbae799148c4b83260a4b9309fa3e1fc2 \ - --hash=sha256:22e6de18f00583f06928cc8d0993104ecc62f7c6da6478db2255de89a30e45d1 \ - --hash=sha256:289073f68452b96e70990085324be7223944c7409973d13ddfe0eea1c1b5663b \ - --hash=sha256:29ec8507664f94cc08457d98cfc41c3cdbddfa8952438e644177a29b04937876 \ - --hash=sha256:2a55631b93e47956fbc97d69ba2054a8c6a4016f9a3064ec4e031f5f1030cb90 \ - --hash=sha256:2a86d246a160d98d820ee7d02dc18c923c228de095be362e57b9fd8970b2c4a1 \ - --hash=sha256:2bca97521ee786087f0c5ef318fef3eef0266a9c3deff88205523cf353af7394 \ - --hash=sha256:2c8fc6c841ada60a86d29c9ebe2e8757c47eda6553f3596c560e59ca6e9b6fa1 \ - --hash=sha256:2cd0c9fb5d40887500b4ed818770c68ab4fa6e0395d286f9704be6751b1b7d98 \ - --hash=sha256:2d27d08056fcd61ff47a0cd8407eff4d3e816c82cb6b9c6f0ce9a0ad49225f81 \ - --hash=sha256:2ffbf1b38c88d0466de542e91b08225d51782282512f8e2b11715126c41fda48 \ - --hash=sha256:3fd503c27e7b7034128e30847ecdb4bff4ca5e60f29ad022a9f66ae8940d54ac \ - --hash=sha256:3ff1f585a0fdc1415bd733b804f33d386064a308672249b14828130dd43e7c31 \ - --hash=sha256:41bd430b7b63aa802c02964e331ac0b177148fef5f807d2c90d05ce71a52b4d4 \ - --hash=sha256:43e9b1531d6a898bdf086acb75c41265c7ec4331267d7619148d407efc72bd24 \ - --hash=sha256:46af4a742b90c7460e94214f923452c2c1d050a9da1d2b8d4c70cbc045e692b7 \ - --hash=sha256:46c4c550bf59ce05d6bff2c98053822549aaf9fbaf81103edea325e03350bca1 \ - --hash=sha256:4969592e3cdeefa4cbb15a26cec102cbd4a1d6e5b695fac9fa026e19741138c8 \ - --hash=sha256:4a0536ed2b9297c75104e1a3da330828ba1b2639fa53b38d396f98bf7e3c68df \ - --hash=sha256:4a96147791e49e84207dd1530109aa0e9eeaf1c8b7a59f150047fc0fcdf9bb64 \ - --hash=sha256:4c7f9d70f99e1fbcbf57c75328b80e1c0a7f6cad43e75efa90a97221be5efe15 \ - --hash=sha256:4e8474f7233fe1949ce4e03bea698a600c2d5d6b51dab6d6e6336dbe69acf23e \ - --hash=sha256:4f1b804cfad04f862d6a84af9d1ad941b06f671878f0f7ecad6c92007d423de6 \ - --hash=sha256:529aab727f54a937085184e7436e1d0e19975cf10115eda12d37a683e4ee5342 \ - --hash=sha256:5612b0b1de8d5114520094bd5fc3d04eb8af6f3e10d48ef05b7c8e77c1fd9545 \ - --hash=sha256:56777c57246e048908b550af9b81b0ec9cf804fd47cb7502ccd93238bd6025c2 \ - --hash=sha256:56ba7c1100ed079527f2b995bf5486a2e557e6d5b733c52e8947476338815b69 \ - --hash=sha256:59d222086daa55421d599609b32d0ebe544e57654c4a0a1490c54a7ebaa67561 \ - --hash=sha256:5aba767e64b494483ad60c4873bec78d16205a21f8247c99749bd990d9c846c2 \ - --hash=sha256:5d5eaf988951f6ecb6854ca3300b87123599c711183c83da7ce39717a7cbdbce \ - --hash=sha256:73da69e1f612c3e682e34dcb971272d90d6f27b2c99acff444ca455a89978574 \ - --hash=sha256:75c8766734ac0053e1d683567e65e85306c4ec62631b0591caeb287ac8f72e08 \ - --hash=sha256:75eea40355a8690459c7291ce6c8ce39c27bd223675c7da6619f510c728feb97 \ - --hash=sha256:80c3cf46511653f94dfe07c7c79ab105c4164d6e1dfcb35b7214fb9af53eaef4 \ - --hash=sha256:8557c807388e6617161fe51b1a4747ea8d1133f2d2ad8e79583439abebe58fbd \ - --hash=sha256:89438e8885a186c69fe31f7ef98bb2bf29688c466c3caf9060f404c0be89ae80 \ - --hash=sha256:899b03a3be785a7e1ff84b237da71f0efa2f021512f147dd34ffdf7aa82cb678 \ - --hash=sha256:8de9b88f0cbac73cfed34220d13c57849e62a7099a714b929142425e926d223a \ - --hash=sha256:8f4d561f4728f825e3b793a53064b606ca0b6fc264f67d09e54af452aafc5b82 \ - --hash=sha256:907b214da5d2fcff0b6ddb83de1333890ca92abaf4bbf8d9c61dc1b95c87fd6e \ - --hash=sha256:9118de88c16947eaf5b92f749e65b0501ea69e7c2be7bd6aefc12551622360e1 \ - --hash=sha256:9568764e72d85cf7855ca78b48e07ed1be47bf230e2cea8dabda3c95f660b0ff \ - --hash=sha256:9c74cbee9e532dc34371127f7686d6953e5153a1f22beab7f953d95ee4a0fe09 \ - --hash=sha256:9cdfd649011ce2d90cb0dd304c5aba1190fac0c266d19a9e2b96b81cfd150a09 \ - --hash=sha256:9f00d54b18dd837f1431d66b076737deb7c29ce3ebb8412ceaf44d5e1954ac0c \ - --hash=sha256:a2f416cdfe92f5fbb77177f5f3f7830059d1582db05f2c7119bf80069d1ab69b \ - --hash=sha256:a4cb372e22e9c879bd9a9cc9b20b7c1fbf30a605ac953da45ecec05d8a6e1c77 \ - --hash=sha256:a65de5c02884760a14a58304fb6303f9ddfc582e630f385daea871e1bdb18686 \ - --hash=sha256:aa3b3a43dabc4cc57a7800f526cbe03f71c69121e21b863fdf497b59b462b163 \ - --hash=sha256:ab0f7aabdbce4a202e013083eeab71afdb85efa405dc4a06fea98cde81204675 \ - --hash=sha256:abe081453166e206e3a8c6d8ace57214c17b6d9477d7601ac14a365344dbc1f4 \ - --hash=sha256:ae141c9017f8f473a6ee07a9425da021816a9f8c0683c2e5442f0ccf56b0fc62 \ - --hash=sha256:af52078719209bef33e38131486fd784832dd8d1dc9b85f00a44f6e7437dd021 \ - --hash=sha256:b00150a9a3fd0a8efaa90bc2696c105b04039d50763dd1c95a34c88c5966cb57 \ - --hash=sha256:b2660000e1a113869c86eb5cc07f3343467490f3cd9d0299f81da9ddae7137b7 \ - --hash=sha256:b3eb1a0d2b6d232d1bcdfc3fcc5f7b004ab3fbd9203011a3172f051d4527c0b6 \ - --hash=sha256:b589d93a60e78fe55d5bc76ee8c2bf945dbdbb7cd16044c53e0307604e448de1 \ - --hash=sha256:b8578fc6c8bdd0201327503720fa581000b4bd3934abbf07e2628d1ad3de157d \ - --hash=sha256:ba1b28e44f611f3f2b436bd8290050a61db4b59a8e24be4465f44897936b3824 \ - --hash=sha256:bb44644371eaa29a3aba7b69b1862d0d56f073bb7585baa32e4271a71a91ee82 \ - --hash=sha256:bcde80aefe7054fad6277762fb7e9d35c72ea479a485ae1bb14629c640987b30 \ - --hash=sha256:bd1142d22fdb183a0fff66d79134bf644401437fed874f81066d314c67ee193c \ - --hash=sha256:bf77f9017fcfa1232f98598a637406e6c33982ccba8a5922339575c3e2b90ea5 \ - --hash=sha256:c2772bb95062e3f9774140205cd65d8997e39620715486cf5f843cf4ad8f744c \ - --hash=sha256:c4ecc4e9a5d73a816cae36ee6b5d8b7a0c72013cae1e101406e832887c3dc2d8 \ - --hash=sha256:c86231c66e4f422e7c13ea6200bb4048b3016c8bfd11b4fd0dabd04d2c8e3501 \ - --hash=sha256:c8f6526df47953b07c45b95c4d1da6b9a0861c0e5da0271db96bb1d807825412 \ - --hash=sha256:ccfb77f6dc8abffa6f1c7e3975ed9070a41ce5fcc11154d2bead8c1baa940f09 \ - --hash=sha256:d9d7efaad48b859053b90dedd69bc92f2095084251e732e4c57ac9726bcb1e64 \ - --hash=sha256:dd91a7d7a9ce7f4983097c91ce211f3e5569cc21caa16f2692298a07e396f82b \ - --hash=sha256:de4a2fd524993578fe093044f291b4b24aab134390030b3b9b5f87fd41ab7e75 \ - --hash=sha256:df61f818edf7c8626bfa392f825860fb670b5f8336e238eb0ec7e2a5689cdded \ - --hash=sha256:e1147bc3d0dd1e549d991110d0a09557ec9f925dbc1ca62871fcdab2ec9d716b \ - --hash=sha256:e1954f4b239d1a92081647eecfd51cbfd08ea16eb743b8af1cd0113258feea14 \ - --hash=sha256:e281b71922208e00886e4b7ffbfcf27874486364f177418ab676f102130e7ec9 \ - --hash=sha256:e69737bd56006a86fd5a78b2b85447580a6138c930a75eb9ef39fe03d90782b1 \ - --hash=sha256:e82b4a70cc67094f3f3fd77579702f48fcf1de7bdc67d79b8f1e24d089a6162c \ - --hash=sha256:e92e5817eb6bfed23aa5e45bfe30647b83602bdd6f9e25d63524d4e6258458b0 \ - --hash=sha256:eaba0613c759ebf95988a84f766ca6b7432d55ce399194f95dde588ad1be0878 \ - --hash=sha256:edd74b760a6bb950397e7a7bd2f38e6700f6525062650b1d77c6d851b82f02c2 \ - --hash=sha256:f40abbcc0a7d9a8a80870af839d317e6932533f98682aabd977add6c53beeb23 \ - --hash=sha256:fce7a8ee8d0f682c953c0188735d823f0fcb62779bf92cd6ba473a8e730e26ad - # via - # jsonschema - # referencing + # via -r requirements.in rsa==4.9 \ --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 # via python-jose -setproctitle==1.3.2 \ - --hash=sha256:1c5d5dad7c28bdd1ec4187d818e43796f58a845aa892bb4481587010dc4d362b \ - --hash=sha256:1c8d9650154afaa86a44ff195b7b10d683c73509d085339d174e394a22cccbb9 \ - --hash=sha256:1f0cde41857a644b7353a0060b5f94f7ba7cf593ebde5a1094da1be581ac9a31 \ - --hash=sha256:1f29b75e86260b0ab59adb12661ef9f113d2f93a59951373eb6d68a852b13e83 \ - --hash=sha256:1fa1a0fbee72b47dc339c87c890d3c03a72ea65c061ade3204f285582f2da30f \ - --hash=sha256:1ff863a20d1ff6ba2c24e22436a3daa3cd80be1dfb26891aae73f61b54b04aca \ - --hash=sha256:265ecbe2c6eafe82e104f994ddd7c811520acdd0647b73f65c24f51374cf9494 \ - --hash=sha256:288943dec88e178bb2fd868adf491197cc0fc8b6810416b1c6775e686bab87fe \ - --hash=sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa \ - --hash=sha256:2e3ac25bfc4a0f29d2409650c7532d5ddfdbf29f16f8a256fc31c47d0dc05172 \ - --hash=sha256:2fbd8187948284293f43533c150cd69a0e4192c83c377da837dbcd29f6b83084 \ - --hash=sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80 \ - --hash=sha256:4058564195b975ddc3f0462375c533cce310ccdd41b80ac9aed641c296c3eff4 \ - --hash=sha256:4749a2b0c9ac52f864d13cee94546606f92b981b50e46226f7f830a56a9dc8e1 \ - --hash=sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77 \ - --hash=sha256:4d8938249a7cea45ab7e1e48b77685d0f2bab1ebfa9dde23e94ab97968996a7c \ - --hash=sha256:5194b4969f82ea842a4f6af2f82cd16ebdc3f1771fb2771796e6add9835c1973 \ - --hash=sha256:55ce1e9925ce1765865442ede9dca0ba9bde10593fcd570b1f0fa25d3ec6b31c \ - --hash=sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3 \ - --hash=sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077 \ - --hash=sha256:589be87172b238f839e19f146b9ea47c71e413e951ef0dc6db4218ddacf3c202 \ - --hash=sha256:5b932c3041aa924163f4aab970c2f0e6b4d9d773f4d50326e0ea1cd69240e5c5 \ - --hash=sha256:5fb4f769c02f63fac90989711a3fee83919f47ae9afd4758ced5d86596318c65 \ - --hash=sha256:630f6fe5e24a619ccf970c78e084319ee8be5be253ecc9b5b216b0f474f5ef18 \ - --hash=sha256:65d884e22037b23fa25b2baf1a3316602ed5c5971eb3e9d771a38c3a69ce6e13 \ - --hash=sha256:6c877691b90026670e5a70adfbcc735460a9f4c274d35ec5e8a43ce3f8443005 \ - --hash=sha256:710e16fa3bade3b026907e4a5e841124983620046166f355bbb84be364bf2a02 \ - --hash=sha256:7a55fe05f15c10e8c705038777656fe45e3bd676d49ad9ac8370b75c66dd7cd7 \ - --hash=sha256:7aa0aac1711fadffc1d51e9d00a3bea61f68443d6ac0241a224e4d622489d665 \ - --hash=sha256:7f0bed90a216ef28b9d227d8d73e28a8c9b88c0f48a082d13ab3fa83c581488f \ - --hash=sha256:7f2719a398e1a2c01c2a63bf30377a34d0b6ef61946ab9cf4d550733af8f1ef1 \ - --hash=sha256:7fe9df7aeb8c64db6c34fc3b13271a363475d77bc157d3f00275a53910cb1989 \ - --hash=sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff \ - --hash=sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf \ - --hash=sha256:8ff3c8cb26afaed25e8bca7b9dd0c1e36de71f35a3a0706b5c0d5172587a3827 \ - --hash=sha256:9124bedd8006b0e04d4e8a71a0945da9b67e7a4ab88fdad7b1440dc5b6122c42 \ - --hash=sha256:92c626edc66169a1b09e9541b9c0c9f10488447d8a2b1d87c8f0672e771bc927 \ - --hash=sha256:a149a5f7f2c5a065d4e63cb0d7a4b6d3b66e6e80f12e3f8827c4f63974cbf122 \ - --hash=sha256:a47d97a75fd2d10c37410b180f67a5835cb1d8fdea2648fd7f359d4277f180b9 \ - --hash=sha256:a499fff50387c1520c085a07578a000123f519e5f3eee61dd68e1d301659651f \ - --hash=sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4 \ - --hash=sha256:ab45146c71ca6592c9cc8b354a2cc9cc4843c33efcbe1d245d7d37ce9696552d \ - --hash=sha256:b2c9cb2705fc84cb8798f1ba74194f4c080aaef19d9dae843591c09b97678e98 \ - --hash=sha256:b34baef93bfb20a8ecb930e395ccd2ae3268050d8cf4fe187de5e2bd806fd796 \ - --hash=sha256:b617f12c9be61e8f4b2857be4a4319754756845dbbbd9c3718f468bbb1e17bcb \ - --hash=sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd \ - --hash=sha256:bae283e85fc084b18ffeb92e061ff7ac5af9e183c9d1345c93e178c3e5069cbe \ - --hash=sha256:c2c46200656280a064073447ebd363937562debef329482fd7e570c8d498f806 \ - --hash=sha256:c8a09d570b39517de10ee5b718730e171251ce63bbb890c430c725c8c53d4484 \ - --hash=sha256:c91b9bc8985d00239f7dc08a49927a7ca1ca8a6af2c3890feec3ed9665b6f91e \ - --hash=sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc \ - --hash=sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de \ - --hash=sha256:dad42e676c5261eb50fdb16bdf3e2771cf8f99a79ef69ba88729aeb3472d8575 \ - --hash=sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7 \ - --hash=sha256:de3a540cd1817ede31f530d20e6a4935bbc1b145fd8f8cf393903b1e02f1ae76 \ - --hash=sha256:e00c9d5c541a2713ba0e657e0303bf96ddddc412ef4761676adc35df35d7c246 \ - --hash=sha256:e1aafc91cbdacc9e5fe712c52077369168e6b6c346f3a9d51bf600b53eae56bb \ - --hash=sha256:e425be62524dc0c593985da794ee73eb8a17abb10fe692ee43bb39e201d7a099 \ - --hash=sha256:e43f315c68aa61cbdef522a2272c5a5b9b8fd03c301d3167b5e1343ef50c676c \ - --hash=sha256:e49ae693306d7624015f31cb3e82708916759d592c2e5f72a35c8f4cc8aef258 \ - --hash=sha256:e5c50e164cd2459bc5137c15288a9ef57160fd5cbf293265ea3c45efe7870865 \ - --hash=sha256:e8579a43eafd246e285eb3a5b939e7158073d5087aacdd2308f23200eac2458b \ - --hash=sha256:e85e50b9c67854f89635a86247412f3ad66b132a4d8534ac017547197c88f27d \ - --hash=sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e \ - --hash=sha256:f0452282258dfcc01697026a8841258dd2057c4438b43914b611bccbcd048f10 \ - --hash=sha256:f4bfc89bd33ebb8e4c0e9846a09b1f5a4a86f5cb7a317e75cc42fee1131b4f4f \ - --hash=sha256:fa2f50678f04fda7a75d0fe5dd02bbdd3b13cbe6ed4cf626e4472a7ccf47ae94 \ - --hash=sha256:faec934cfe5fd6ac1151c02e67156c3f526e82f96b24d550b5d51efa4a5527c6 \ - --hash=sha256:fcd3cf4286a60fdc95451d8d14e0389a6b4f5cebe02c7f2609325eb016535963 \ - --hash=sha256:fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4 \ - --hash=sha256:fed18e44711c5af4b681c2b3b18f85e6f0f1b2370a28854c645d636d5305ccd8 \ - --hash=sha256:ffc61a388a5834a97953d6444a2888c24a05f2e333f9ed49f977a87bb1ad4761 - # via apache-airflow -setuptools==68.2.2 \ - --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \ - --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a - # via python-daemon six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via - # ecdsa - # prison - # python-dateutil - # rfc3339-validator -sniffio==1.3.0 \ - --hash=sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101 \ - --hash=sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384 - # via - # anyio - # httpcore - # httpx -sqlalchemy==1.4.49 \ - --hash=sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71 \ - --hash=sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9 \ - --hash=sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557 \ - --hash=sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1 \ - --hash=sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77 \ - --hash=sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d \ - --hash=sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf \ - --hash=sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6 \ - --hash=sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb \ - --hash=sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a \ - --hash=sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4 \ - --hash=sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b \ - --hash=sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d \ - --hash=sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729 \ - --hash=sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f \ - --hash=sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264 \ - --hash=sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c \ - --hash=sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87 \ - --hash=sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4 \ - --hash=sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1 \ - --hash=sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91 \ - --hash=sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55 \ - --hash=sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09 \ - --hash=sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e \ - --hash=sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd \ - --hash=sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0 \ - --hash=sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e \ - --hash=sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30 \ - --hash=sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de \ - --hash=sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f \ - --hash=sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95 \ - --hash=sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d \ - --hash=sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d \ - --hash=sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5 \ - --hash=sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294 \ - --hash=sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532 \ - --hash=sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c \ - --hash=sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa - # via - # alembic - # apache-airflow - # flask-appbuilder - # flask-sqlalchemy - # marshmallow-sqlalchemy - # sqlalchemy-jsonfield - # sqlalchemy-utils -sqlalchemy-jsonfield==1.0.1.post0 \ - --hash=sha256:72a5e714fe0493d2660abd7484a9fd9f492f493a0856288dd22a5decb29f5dc4 \ - --hash=sha256:d6f1e5ee329a3c0d9d164e40d81a2143ac8332e09988fbbaff84179dac5503d4 - # via apache-airflow -sqlalchemy-utils==0.41.1 \ - --hash=sha256:6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801 \ - --hash=sha256:a2181bff01eeb84479e38571d2c0718eb52042f9afd8c194d0d02877e84b7d74 - # via flask-appbuilder -sqlparse==0.4.4 \ - --hash=sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3 \ - --hash=sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c - # via apache-airflow-providers-common-sql -tabulate==0.9.0 \ - --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ - --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f - # via apache-airflow -tenacity==8.2.3 \ - --hash=sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a \ - --hash=sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c - # via apache-airflow -termcolor==2.3.0 \ - --hash=sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475 \ - --hash=sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a - # via apache-airflow -text-unidecode==1.3 \ - --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 \ - --hash=sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93 - # via python-slugify -typing-extensions==4.7.1 \ - --hash=sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36 \ - --hash=sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2 - # via - # alembic - # apache-airflow - # asgiref - # cattrs - # flask-limiter - # limits - # opentelemetry-sdk - # pydantic - # pydantic-core -uc-micro-py==1.0.2 \ - --hash=sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54 \ - --hash=sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0 - # via linkify-it-py -unicodecsv==0.14.1 \ - --hash=sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc - # via apache-airflow -urllib3==2.0.3 \ - --hash=sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1 \ - --hash=sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825 + # via ecdsa +urllib3==1.26.16 \ + --hash=sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f \ + --hash=sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14 # via requests -werkzeug==2.2.3 \ - --hash=sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe \ - --hash=sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612 - # via - # apache-airflow - # connexion - # flask - # flask-jwt-extended - # flask-login -wrapt==1.15.0 \ - --hash=sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0 \ - --hash=sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420 \ - --hash=sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a \ - --hash=sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c \ - --hash=sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079 \ - --hash=sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923 \ - --hash=sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f \ - --hash=sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1 \ - --hash=sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8 \ - --hash=sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86 \ - --hash=sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0 \ - --hash=sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364 \ - --hash=sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e \ - --hash=sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c \ - --hash=sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e \ - --hash=sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c \ - --hash=sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727 \ - --hash=sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff \ - --hash=sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e \ - --hash=sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29 \ - --hash=sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7 \ - --hash=sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72 \ - --hash=sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475 \ - --hash=sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a \ - --hash=sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317 \ - --hash=sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2 \ - --hash=sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd \ - --hash=sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640 \ - --hash=sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98 \ - --hash=sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248 \ - --hash=sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e \ - --hash=sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d \ - --hash=sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec \ - --hash=sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1 \ - --hash=sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e \ - --hash=sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9 \ - --hash=sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92 \ - --hash=sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb \ - --hash=sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094 \ - --hash=sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46 \ - --hash=sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29 \ - --hash=sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd \ - --hash=sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705 \ - --hash=sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8 \ - --hash=sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975 \ - --hash=sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb \ - --hash=sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e \ - --hash=sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b \ - --hash=sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418 \ - --hash=sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019 \ - --hash=sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1 \ - --hash=sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba \ - --hash=sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6 \ - --hash=sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2 \ - --hash=sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3 \ - --hash=sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7 \ - --hash=sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752 \ - --hash=sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416 \ - --hash=sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f \ - --hash=sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1 \ - --hash=sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc \ - --hash=sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145 \ - --hash=sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee \ - --hash=sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a \ - --hash=sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7 \ - --hash=sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b \ - --hash=sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653 \ - --hash=sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0 \ - --hash=sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90 \ - --hash=sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29 \ - --hash=sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6 \ - --hash=sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034 \ - --hash=sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09 \ - --hash=sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559 \ - --hash=sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639 - # via deprecated -wtforms==3.0.1 \ - --hash=sha256:6b351bbb12dd58af57ffef05bc78425d08d1914e0fd68ee14143b7ade023c5bc \ - --hash=sha256:837f2f0e0ca79481b92884962b914eba4e72b7a2daaf1f939c890ed0124b834b - # via - # flask-appbuilder - # flask-wtf -yarl==1.9.2 \ - --hash=sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571 \ - --hash=sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3 \ - --hash=sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3 \ - --hash=sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c \ - --hash=sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7 \ - --hash=sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04 \ - --hash=sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191 \ - --hash=sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea \ - --hash=sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4 \ - --hash=sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4 \ - --hash=sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095 \ - --hash=sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e \ - --hash=sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74 \ - --hash=sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef \ - --hash=sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33 \ - --hash=sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde \ - --hash=sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45 \ - --hash=sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf \ - --hash=sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b \ - --hash=sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac \ - --hash=sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0 \ - --hash=sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528 \ - --hash=sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716 \ - --hash=sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb \ - --hash=sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18 \ - --hash=sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72 \ - --hash=sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6 \ - --hash=sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582 \ - --hash=sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5 \ - --hash=sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368 \ - --hash=sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc \ - --hash=sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9 \ - --hash=sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be \ - --hash=sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a \ - --hash=sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80 \ - --hash=sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8 \ - --hash=sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6 \ - --hash=sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417 \ - --hash=sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574 \ - --hash=sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59 \ - --hash=sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608 \ - --hash=sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82 \ - --hash=sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1 \ - --hash=sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3 \ - --hash=sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d \ - --hash=sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8 \ - --hash=sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc \ - --hash=sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac \ - --hash=sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8 \ - --hash=sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955 \ - --hash=sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0 \ - --hash=sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367 \ - --hash=sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb \ - --hash=sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a \ - --hash=sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623 \ - --hash=sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2 \ - --hash=sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6 \ - --hash=sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7 \ - --hash=sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4 \ - --hash=sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051 \ - --hash=sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938 \ - --hash=sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8 \ - --hash=sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9 \ - --hash=sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3 \ - --hash=sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5 \ - --hash=sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9 \ - --hash=sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333 \ - --hash=sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185 \ - --hash=sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3 \ - --hash=sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560 \ - --hash=sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b \ - --hash=sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7 \ - --hash=sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78 \ - --hash=sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7 - # via aiohttp -zipp==3.16.2 \ - --hash=sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0 \ - --hash=sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147 - # via - # importlib-metadata - # importlib-resources diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index c517115dfe..7c383199a0 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -53,10 +53,17 @@ def _no_transform(value): def _forward_arg(kwargs, intermediate, package, arg_name, default, transform): select_dict = {} + found = False for config, info in intermediate[package].items(): select_dict[config] = transform(info.get(arg_name, default)) + if arg_name in info: + print(transform(info.get(arg_name, default))) + print(select_dict) + found = True kwargs[arg_name] = select(select_dict) + if found: + print(kwargs[arg_name]) def _accumulate_transitive_deps_inner(intermediate, configs, package, already_accumulated): diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index 522664df09..8da81dddb2 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -15,6 +15,7 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") load("//python/pip_install:repositories.bzl", "pip_install_dependencies") +load("//python/private:normalize_name.bzl", "normalize_name") load(":pypi_util.bzl", "generate_repo_name_for_download", "generate_repo_name_for_extracted_wheel") def pypi_install(pip_installation_report = None, **kwargs): @@ -25,6 +26,19 @@ def pypi_install(pip_installation_report = None, **kwargs): pip_installation_report_swapped[report] = config_setting _pypi_install(pip_installation_report = pip_installation_report_swapped, **kwargs) +def _clean_info(info): + result = dict(**info) + if "deps" in result: + result["deps"] = [normalize_name(dep) for dep in result["deps"]] + return result + +def _clean_intermediate(intermediate): + result = {} + for package, info_per_config in intermediate.items(): + result[normalize_name(package)] = { + config: _clean_info(info) for config, info in info_per_config.items() + } + return result def _pypi_install_impl(repository_ctx): repository_ctx.file("BUILD.bazel", "\n", executable = False) @@ -39,7 +53,7 @@ def _pypi_install_impl(repository_ctx): for package in intermediate: configs.extend(intermediate[package].keys()) - lines = ["INTERMEDIATE = {}".format(json.encode_indent(intermediate)), ""] + lines = ["INTERMEDIATE = {}".format(json.encode_indent(_clean_intermediate(intermediate))), ""] repository_ctx.file("intermediate.bzl", "\n".join(lines), executable=False) lines = ["CONFIGS = {}".format(json.encode_indent(configs)), ""] From 04776dd3f98605ee16ae6bc19a3ed3af88aed20b Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 13 Sep 2023 05:47:11 -0700 Subject: [PATCH 41/96] normalize name --- examples/pypi_install/cognitojwt_deps_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/pypi_install/cognitojwt_deps_test.sh b/examples/pypi_install/cognitojwt_deps_test.sh index e374385a6a..d4e6843d32 100755 --- a/examples/pypi_install/cognitojwt_deps_test.sh +++ b/examples/pypi_install/cognitojwt_deps_test.sh @@ -14,7 +14,7 @@ EXPECTED_OUTPUT="$(cat < Date: Wed, 13 Sep 2023 05:48:08 -0700 Subject: [PATCH 42/96] clean up --- examples/pypi_install/intermediate_file_patcher.py | 2 +- examples/pypi_install/intermediate_file_x86_64_linux.json | 2 +- python/private/pypi.bzl | 7 ------- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/examples/pypi_install/intermediate_file_patcher.py b/examples/pypi_install/intermediate_file_patcher.py index cfc9df9d3b..f30f197639 100644 --- a/examples/pypi_install/intermediate_file_patcher.py +++ b/examples/pypi_install/intermediate_file_patcher.py @@ -10,7 +10,7 @@ "patch_args": [ "-p1", ], - "patch_dir": "library/site-packages", + "patch_dir": "site-packages", }, } diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index b2b0ea6fb1..2e2f5849b5 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -98,7 +98,7 @@ "patch_args": [ "-p1" ], - "patch_dir": "library/site-packages" + "patch_dir": "site-packages" } }, "rsa": { diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index 7c383199a0..c517115dfe 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -53,17 +53,10 @@ def _no_transform(value): def _forward_arg(kwargs, intermediate, package, arg_name, default, transform): select_dict = {} - found = False for config, info in intermediate[package].items(): select_dict[config] = transform(info.get(arg_name, default)) - if arg_name in info: - print(transform(info.get(arg_name, default))) - print(select_dict) - found = True kwargs[arg_name] = select(select_dict) - if found: - print(kwargs[arg_name]) def _accumulate_transitive_deps_inner(intermediate, configs, package, already_accumulated): From 8cb7e29c9ca0fcc87f4af1002b91c8f77cd5d716 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 13 Sep 2023 06:01:18 -0700 Subject: [PATCH 43/96] add comment on circular dependencies. --- python/private/pypi.bzl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index c517115dfe..0f1c94e29c 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -95,6 +95,11 @@ def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, intermediat deps_dict = _accumulate_transitive_deps(intermediate, configs, package) deps = select({config: to_alias_refs(alias_repo_name, deps) for config, deps in deps_dict.items()}) + # TODO(phil): Probably need to split this in order to support circular + # dependencies. An "underlying" library and a "high level" that depends on + # the transitive closure of underlying libraries. Need to find a good + # example of this though. torch, dvc[gs]==2.43.1, apache-airflow all + # require sdist support. pycross_wheel_library( name = name, wheel = "@{}//file".format(wheel_repo_name), From bdfd1d0360f35b2f030369eba15f7f57c0c42588 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 13 Sep 2023 06:37:24 -0700 Subject: [PATCH 44/96] Rename `pycross_wheel_library` to `py_wheel_library` and make it work This patch changes the name of the rule to reflect the fact that it's not exactly the same as the one in rules_pycross. I also took this opportunity to delete the superfluous `namespace_pkgs.py` library (plus test) since we have a nearly identical version already in the main repo. I added a test to validate that the rule functions at a basic level. References: #1360 --- WORKSPACE | 13 +- .../tools/wheel_installer/BUILD.bazel | 1 + .../rules_pycross/pycross/private/BUILD.bazel | 35 ++++ .../pycross/private/providers.bzl | 6 +- .../pycross/private/py_wheel_library_test.py | 48 +++++ .../pycross/private/tools/BUILD.bazel | 33 +--- .../pycross/private/tools/namespace_pkgs.py | 109 ----------- .../private/tools/namespace_pkgs_test.py | 179 ------------------ .../pycross/private/tools/wheel_installer.py | 28 ++- .../pycross/private/wheel_library.bzl | 18 +- 10 files changed, 133 insertions(+), 337 deletions(-) create mode 100644 third_party/rules_pycross/pycross/private/BUILD.bazel create mode 100644 third_party/rules_pycross/pycross/private/py_wheel_library_test.py delete mode 100644 third_party/rules_pycross/pycross/private/tools/namespace_pkgs.py delete mode 100644 third_party/rules_pycross/pycross/private/tools/namespace_pkgs_test.py diff --git a/WORKSPACE b/WORKSPACE index 7438bb8257..420ad35277 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -34,7 +34,7 @@ python_register_multi_toolchains( python_versions = MINOR_MAPPING.values(), ) -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") # Used for Bazel CI http_archive( @@ -86,3 +86,14 @@ pip_parse( load("@publish_deps//:requirements.bzl", "install_deps") install_deps() + +# This wheel is purely here to validate the wheel extraction code. It's not +# intended for anything else. +http_file( + name = "wheel_for_testing", + downloaded_file_path = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + sha256 = "0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2", + urls = [ + "https://files.pythonhosted.org/packages/50/67/3e966d99a07d60a21a21d7ec016e9e4c2642a86fea251ec68677daf71d4d/numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + ], +) diff --git a/python/pip_install/tools/wheel_installer/BUILD.bazel b/python/pip_install/tools/wheel_installer/BUILD.bazel index 6360ca5c70..0eadcc25f6 100644 --- a/python/pip_install/tools/wheel_installer/BUILD.bazel +++ b/python/pip_install/tools/wheel_installer/BUILD.bazel @@ -9,6 +9,7 @@ py_library( "wheel.py", "wheel_installer.py", ], + visibility = ["//third_party/rules_pycross/pycross/private:__subpackages__"], deps = [ requirement("installer"), requirement("pip"), diff --git a/third_party/rules_pycross/pycross/private/BUILD.bazel b/third_party/rules_pycross/pycross/private/BUILD.bazel new file mode 100644 index 0000000000..903abe8523 --- /dev/null +++ b/third_party/rules_pycross/pycross/private/BUILD.bazel @@ -0,0 +1,35 @@ +# Copyright 2023 Jeremy Volkman. All rights reserved. +# Copyright 2023 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. + +load("//python:defs.bzl", "py_test") +load(":wheel_library.bzl", "py_wheel_library") + +py_wheel_library( + name = "extracted_wheel_for_testing", + wheel = "@wheel_for_testing//file", +) + +py_test( + name = "py_wheel_library_test", + srcs = [ + "py_wheel_library_test.py", + ], + data = [ + ":extracted_wheel_for_testing", + ], + deps = [ + "//python/runfiles", + ], +) diff --git a/third_party/rules_pycross/pycross/private/providers.bzl b/third_party/rules_pycross/pycross/private/providers.bzl index f55e98693a..47fc9f7271 100644 --- a/third_party/rules_pycross/pycross/private/providers.bzl +++ b/third_party/rules_pycross/pycross/private/providers.bzl @@ -13,9 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Pycross providers.""" +"""Python providers.""" -PycrossWheelInfo = provider( +PyWheelInfo = provider( doc = "Information about a Python wheel.", fields = { "name_file": "File: A file containing the canonical name of the wheel.", @@ -23,7 +23,7 @@ PycrossWheelInfo = provider( }, ) -PycrossTargetEnvironmentInfo = provider( +PyTargetEnvironmentInfo = provider( doc = "A target environment description.", fields = { "file": "The JSON file containing target environment information.", diff --git a/third_party/rules_pycross/pycross/private/py_wheel_library_test.py b/third_party/rules_pycross/pycross/private/py_wheel_library_test.py new file mode 100644 index 0000000000..d42fadaad5 --- /dev/null +++ b/third_party/rules_pycross/pycross/private/py_wheel_library_test.py @@ -0,0 +1,48 @@ +# Copyright 2023 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 unittest +from pathlib import Path + +from rules_python.python.runfiles import runfiles + +RUNFILES = runfiles.Create() + + +class TestPyWheelLibrary(unittest.TestCase): + def setUp(self): + self.extraction_dir = Path( + RUNFILES.Rlocation( + "rules_python/third_party/rules_pycross/pycross/private/extracted_wheel_for_testing" + ) + ) + self.assertTrue(self.extraction_dir.exists(), self.extraction_dir) + self.assertTrue(self.extraction_dir.is_dir(), self.extraction_dir) + + def test_file_presence(self): + """Validate that the basic file layout looks good.""" + for path in ( + "bin/f2py", + "site-packages/numpy.libs/libgfortran-daac5196.so.5.0.0", + "site-packages/numpy/dtypes.py", + "site-packages/numpy/core/_umath_tests.cpython-311-aarch64-linux-gnu.so", + ): + print(self.extraction_dir / path) + self.assertTrue( + (self.extraction_dir / path).exists(), f"{path} does not exist" + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/third_party/rules_pycross/pycross/private/tools/BUILD.bazel b/third_party/rules_pycross/pycross/private/tools/BUILD.bazel index 867b771aae..a87e6aa67e 100644 --- a/third_party/rules_pycross/pycross/private/tools/BUILD.bazel +++ b/third_party/rules_pycross/pycross/private/tools/BUILD.bazel @@ -13,41 +13,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test") - -package(default_visibility = ["//visibility:private"]) - -py_library( - name = "namespace_pkgs", - srcs = [ - "namespace_pkgs.py", - ], -) - -py_test( - name = "namespace_pkgs_test", - size = "small", - srcs = [ - "namespace_pkgs_test.py", - ], - tags = [ - "unit", - # TODO(philsc): Make this work. - "manual", - ], - deps = [ - ":namespace_pkgs", - ], -) +load("//python:defs.bzl", "py_binary") py_binary( name = "wheel_installer", srcs = ["wheel_installer.py"], visibility = ["//visibility:public"], deps = [ - ":namespace_pkgs", - # TODO(philsc): Make this work with what's available in rules_python. - #"@rules_pycross_pypi_deps_absl_py//:pkg", - #"@rules_pycross_pypi_deps_installer//:pkg", + "//python/pip_install/tools/wheel_installer:lib", + "@pypi__installer//:lib", ], ) diff --git a/third_party/rules_pycross/pycross/private/tools/namespace_pkgs.py b/third_party/rules_pycross/pycross/private/tools/namespace_pkgs.py deleted file mode 100644 index 59300ffcd1..0000000000 --- a/third_party/rules_pycross/pycross/private/tools/namespace_pkgs.py +++ /dev/null @@ -1,109 +0,0 @@ -"""Utility functions to discover python package types""" -import os -import textwrap -from pathlib import Path # supported in >= 3.4 -from typing import List -from typing import Optional -from typing import Set - - -def implicit_namespace_packages( - directory: str, ignored_dirnames: Optional[List[str]] = None -) -> Set[Path]: - """Discovers namespace packages implemented using the 'native namespace packages' method. - - AKA 'implicit namespace packages', which has been supported since Python 3.3. - See: https://packaging.python.org/guides/packaging-namespace-packages/#native-namespace-packages - - Args: - directory: The root directory to recursively find packages in. - ignored_dirnames: A list of directories to exclude from the search - - Returns: - The set of directories found under root to be packages using the native namespace method. - """ - namespace_pkg_dirs: Set[Path] = set() - standard_pkg_dirs: Set[Path] = set() - directory_path = Path(directory) - ignored_dirname_paths: List[Path] = [Path(p) for p in ignored_dirnames or ()] - # Traverse bottom-up because a directory can be a namespace pkg because its child contains module files. - for dirpath, dirnames, filenames in map( - lambda t: (Path(t[0]), *t[1:]), os.walk(directory_path, topdown=False) - ): - if "__init__.py" in filenames: - standard_pkg_dirs.add(dirpath) - continue - elif ignored_dirname_paths: - is_ignored_dir = dirpath in ignored_dirname_paths - child_of_ignored_dir = any( - d in dirpath.parents for d in ignored_dirname_paths - ) - if is_ignored_dir or child_of_ignored_dir: - continue - - dir_includes_py_modules = _includes_python_modules(filenames) - parent_of_namespace_pkg = any( - Path(dirpath, d) in namespace_pkg_dirs for d in dirnames - ) - parent_of_standard_pkg = any( - Path(dirpath, d) in standard_pkg_dirs for d in dirnames - ) - parent_of_pkg = parent_of_namespace_pkg or parent_of_standard_pkg - if ( - (dir_includes_py_modules or parent_of_pkg) - and - # The root of the directory should never be an implicit namespace - dirpath != directory_path - ): - namespace_pkg_dirs.add(dirpath) - return namespace_pkg_dirs - - -def add_pkgutil_style_namespace_pkg_init(dir_path: Path) -> None: - """Adds 'pkgutil-style namespace packages' init file to the given directory - - See: https://packaging.python.org/guides/packaging-namespace-packages/#pkgutil-style-namespace-packages - - Args: - dir_path: The directory to create an __init__.py for. - - Raises: - ValueError: If the directory already contains an __init__.py file - """ - ns_pkg_init_filepath = os.path.join(dir_path, "__init__.py") - - if os.path.isfile(ns_pkg_init_filepath): - raise ValueError("%s already contains an __init__.py file." % dir_path) - - with open(ns_pkg_init_filepath, "w") as ns_pkg_init_f: - # See https://packaging.python.org/guides/packaging-namespace-packages/#pkgutil-style-namespace-packages - ns_pkg_init_f.write( - textwrap.dedent( - """\ - # __path__ manipulation added by bazelbuild/rules_python to support namespace pkgs. - __path__ = __import__('pkgutil').extend_path(__path__, __name__) - """ - ) - ) - - -def _includes_python_modules(files: List[str]) -> bool: - """ - In order to only transform directories that Python actually considers namespace pkgs - we need to detect if a directory includes Python modules. - - Which files are loadable as modules is extension based, and the particular set of extensions - varies by platform. - - See: - 1. https://github.com/python/cpython/blob/7d9d25dbedfffce61fc76bc7ccbfa9ae901bf56f/Lib/importlib/machinery.py#L19 - 2. PEP 420 -- Implicit Namespace Packages, Specification - https://www.python.org/dev/peps/pep-0420/#specification - 3. dynload_shlib.c and dynload_win.c in python/cpython. - """ - module_suffixes = { - ".py", # Source modules - ".pyc", # Compiled bytecode modules - ".so", # Unix extension modules - ".pyd", # https://docs.python.org/3/faq/windows.html#is-a-pyd-file-the-same-as-a-dll - } - return any(Path(f).suffix in module_suffixes for f in files) diff --git a/third_party/rules_pycross/pycross/private/tools/namespace_pkgs_test.py b/third_party/rules_pycross/pycross/private/tools/namespace_pkgs_test.py deleted file mode 100644 index 49945f9b8c..0000000000 --- a/third_party/rules_pycross/pycross/private/tools/namespace_pkgs_test.py +++ /dev/null @@ -1,179 +0,0 @@ -import os -import pathlib -import shutil -import tempfile -import unittest -from typing import Optional -from typing import Set - -from pycross.private.tools import namespace_pkgs - - -class TempDir: - def __init__(self) -> None: - self.dir = tempfile.mkdtemp() - - def root(self) -> str: - return self.dir - - def add_dir(self, rel_path: str) -> None: - d = pathlib.Path(self.dir, rel_path) - d.mkdir(parents=True) - - def add_file(self, rel_path: str, contents: Optional[str] = None) -> None: - f = pathlib.Path(self.dir, rel_path) - f.parent.mkdir(parents=True, exist_ok=True) - if contents: - with open(str(f), "w") as writeable_f: - writeable_f.write(contents) - else: - f.touch() - - def remove(self) -> None: - shutil.rmtree(self.dir) - - -class TestImplicitNamespacePackages(unittest.TestCase): - def assertPathsEqual(self, actual: Set[pathlib.Path], expected: Set[str]) -> None: - self.assertEqual(actual, {pathlib.Path(p) for p in expected}) - - def test_in_current_directory(self) -> None: - directory = TempDir() - directory.add_file("foo/bar/biz.py") - directory.add_file("foo/bee/boo.py") - directory.add_file("foo/buu/__init__.py") - directory.add_file("foo/buu/bii.py") - cwd = os.getcwd() - os.chdir(directory.root()) - expected = { - "foo", - "foo/bar", - "foo/bee", - } - try: - actual = namespace_pkgs.implicit_namespace_packages(".") - self.assertPathsEqual(actual, expected) - finally: - os.chdir(cwd) - directory.remove() - - def test_finds_correct_namespace_packages(self) -> None: - directory = TempDir() - directory.add_file("foo/bar/biz.py") - directory.add_file("foo/bee/boo.py") - directory.add_file("foo/buu/__init__.py") - directory.add_file("foo/buu/bii.py") - - expected = { - directory.root() + "/foo", - directory.root() + "/foo/bar", - directory.root() + "/foo/bee", - } - actual = namespace_pkgs.implicit_namespace_packages(directory.root()) - self.assertPathsEqual(actual, expected) - - def test_ignores_empty_directories(self) -> None: - directory = TempDir() - directory.add_file("foo/bar/biz.py") - directory.add_dir("foo/cat") - - expected = { - directory.root() + "/foo", - directory.root() + "/foo/bar", - } - actual = namespace_pkgs.implicit_namespace_packages(directory.root()) - self.assertPathsEqual(actual, expected) - - def test_empty_case(self) -> None: - directory = TempDir() - directory.add_file("foo/__init__.py") - directory.add_file("foo/bar/__init__.py") - directory.add_file("foo/bar/biz.py") - - actual = namespace_pkgs.implicit_namespace_packages(directory.root()) - self.assertEqual(actual, set()) - - def test_ignores_non_module_files_in_directories(self) -> None: - directory = TempDir() - directory.add_file("foo/__init__.pyi") - directory.add_file("foo/py.typed") - - actual = namespace_pkgs.implicit_namespace_packages(directory.root()) - self.assertEqual(actual, set()) - - def test_parent_child_relationship_of_namespace_pkgs(self): - directory = TempDir() - directory.add_file("foo/bar/biff/my_module.py") - directory.add_file("foo/bar/biff/another_module.py") - - expected = { - directory.root() + "/foo", - directory.root() + "/foo/bar", - directory.root() + "/foo/bar/biff", - } - actual = namespace_pkgs.implicit_namespace_packages(directory.root()) - self.assertPathsEqual(actual, expected) - - def test_parent_child_relationship_of_namespace_and_standard_pkgs(self): - directory = TempDir() - directory.add_file("foo/bar/biff/__init__.py") - directory.add_file("foo/bar/biff/another_module.py") - - expected = { - directory.root() + "/foo", - directory.root() + "/foo/bar", - } - actual = namespace_pkgs.implicit_namespace_packages(directory.root()) - self.assertPathsEqual(actual, expected) - - def test_parent_child_relationship_of_namespace_and_nested_standard_pkgs(self): - directory = TempDir() - directory.add_file("foo/bar/__init__.py") - directory.add_file("foo/bar/biff/another_module.py") - directory.add_file("foo/bar/biff/__init__.py") - directory.add_file("foo/bar/boof/big_module.py") - directory.add_file("foo/bar/boof/__init__.py") - directory.add_file("fim/in_a_ns_pkg.py") - - expected = { - directory.root() + "/foo", - directory.root() + "/fim", - } - actual = namespace_pkgs.implicit_namespace_packages(directory.root()) - self.assertPathsEqual(actual, expected) - - def test_recognized_all_nonstandard_module_types(self): - directory = TempDir() - directory.add_file("ayy/my_module.pyc") - directory.add_file("bee/ccc/dee/eee.so") - directory.add_file("eff/jee/aych.pyd") - - expected = { - directory.root() + "/ayy", - directory.root() + "/bee", - directory.root() + "/bee/ccc", - directory.root() + "/bee/ccc/dee", - directory.root() + "/eff", - directory.root() + "/eff/jee", - } - actual = namespace_pkgs.implicit_namespace_packages(directory.root()) - self.assertPathsEqual(actual, expected) - - def test_skips_ignored_directories(self): - directory = TempDir() - directory.add_file("foo/boo/my_module.py") - directory.add_file("foo/bar/another_module.py") - - expected = { - directory.root() + "/foo", - directory.root() + "/foo/bar", - } - actual = namespace_pkgs.implicit_namespace_packages( - directory.root(), - ignored_dirnames=[directory.root() + "/foo/boo"], - ) - self.assertPathsEqual(actual, expected) - - -if __name__ == "__main__": - unittest.main() diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index 6d3673669b..c15e25a9aa 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -1,19 +1,35 @@ +# Copyright 2023 Jeremy Volkman. All rights reserved. +# Copyright 2023 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. + """ A tool that invokes pypa/build to build the given sdist tarball. """ +import argparse import os import shutil +import sys import tempfile from pathlib import Path from typing import Any -from absl import app -from absl.flags import argparse_flags from installer import install from installer.destinations import SchemeDictionaryDestination from installer.sources import WheelFile -from pycross.private.tools import namespace_pkgs + +from rules_python.python.pip_install.tools.wheel_installer import namespace_pkgs def setup_namespace_pkg_compatibility(wheel_dir: Path) -> None: @@ -73,7 +89,7 @@ def main(args: Any) -> None: destination=destination, # Additional metadata that is generated by the installation tool. additional_metadata={ - "INSTALLER": b"https://github.com/jvolkman/rules_pycross", + "INSTALLER": b"https://github.com/bazelbuild/rules_python/tree/main/third_party/rules_pycross", }, ) finally: @@ -83,7 +99,7 @@ def main(args: Any) -> None: def parse_flags(argv) -> Any: - parser = argparse_flags.ArgumentParser(description="Extract a Python wheel.") + parser = argparse.ArgumentParser(description="Extract a Python wheel.") parser.add_argument( "--wheel", @@ -119,4 +135,4 @@ def parse_flags(argv) -> Any: if "BUILD_WORKING_DIRECTORY" in os.environ: os.chdir(os.environ["BUILD_WORKING_DIRECTORY"]) - app.run(main, flags_parser=parse_flags) + main(parse_flags(sys.argv)) diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index 25a2497abe..c7af91e588 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -13,19 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Implementation of the pycross_wheel_library rule.""" +"""Implementation of the py_wheel_library rule.""" load("@bazel_skylib//lib:paths.bzl", "paths") load("@rules_python//python:defs.bzl", "PyInfo") -load(":providers.bzl", "PycrossWheelInfo") +load(":providers.bzl", "PyWheelInfo") -def _pycross_wheel_library_impl(ctx): +def _py_wheel_library_impl(ctx): out = ctx.actions.declare_directory(ctx.attr.name) wheel_target = ctx.attr.wheel - if PycrossWheelInfo in wheel_target: - wheel_file = wheel_target[PycrossWheelInfo].wheel_file - name_file = wheel_target[PycrossWheelInfo].name_file + if PyWheelInfo in wheel_target: + wheel_file = wheel_target[PyWheelInfo].wheel_file + name_file = wheel_target[PyWheelInfo].name_file else: wheel_file = ctx.file.wheel name_file = None @@ -103,8 +103,8 @@ def _pycross_wheel_library_impl(ctx): ), ] -pycross_wheel_library = rule( - implementation = _pycross_wheel_library_impl, +py_wheel_library = rule( + implementation = _py_wheel_library_impl, attrs = { "deps": attr.label_list( doc = "A list of this wheel's Python library dependencies.", @@ -129,7 +129,7 @@ This option is required to support some packages which cannot handle the convers mandatory = True, ), "_tool": attr.label( - default = Label("//pycross/private/tools:wheel_installer"), + default = Label("//third_party/rules_pycross/pycross/private/tools:wheel_installer"), cfg = "exec", executable = True, ), From dd2f7222b0b17666e800902a50d17f0ea9d55e26 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 25 Sep 2023 14:49:00 -0700 Subject: [PATCH 45/96] Move test to //tests/pycross --- tests/pycross/BUILD.bazel | 34 +++++++++++++++++++ .../pycross}/py_wheel_library_test.py | 4 +-- .../rules_pycross/pycross/private/BUILD.bazel | 21 ------------ 3 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 tests/pycross/BUILD.bazel rename {third_party/rules_pycross/pycross/private => tests/pycross}/py_wheel_library_test.py (91%) diff --git a/tests/pycross/BUILD.bazel b/tests/pycross/BUILD.bazel new file mode 100644 index 0000000000..6b523591c4 --- /dev/null +++ b/tests/pycross/BUILD.bazel @@ -0,0 +1,34 @@ +# Copyright 2023 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. + +load("//python:defs.bzl", "py_test") +load("//third_party/rules_pycross/pycross/private:wheel_library.bzl", "py_wheel_library") + +py_wheel_library( + name = "extracted_wheel_for_testing", + wheel = "@wheel_for_testing//file", +) + +py_test( + name = "py_wheel_library_test", + srcs = [ + "py_wheel_library_test.py", + ], + data = [ + ":extracted_wheel_for_testing", + ], + deps = [ + "//python/runfiles", + ], +) diff --git a/third_party/rules_pycross/pycross/private/py_wheel_library_test.py b/tests/pycross/py_wheel_library_test.py similarity index 91% rename from third_party/rules_pycross/pycross/private/py_wheel_library_test.py rename to tests/pycross/py_wheel_library_test.py index d42fadaad5..fa8e20e563 100644 --- a/third_party/rules_pycross/pycross/private/py_wheel_library_test.py +++ b/tests/pycross/py_wheel_library_test.py @@ -15,7 +15,7 @@ import unittest from pathlib import Path -from rules_python.python.runfiles import runfiles +from python.runfiles import runfiles RUNFILES = runfiles.Create() @@ -24,7 +24,7 @@ class TestPyWheelLibrary(unittest.TestCase): def setUp(self): self.extraction_dir = Path( RUNFILES.Rlocation( - "rules_python/third_party/rules_pycross/pycross/private/extracted_wheel_for_testing" + "rules_python/tests/pycross/extracted_wheel_for_testing" ) ) self.assertTrue(self.extraction_dir.exists(), self.extraction_dir) diff --git a/third_party/rules_pycross/pycross/private/BUILD.bazel b/third_party/rules_pycross/pycross/private/BUILD.bazel index 903abe8523..f59b087027 100644 --- a/third_party/rules_pycross/pycross/private/BUILD.bazel +++ b/third_party/rules_pycross/pycross/private/BUILD.bazel @@ -12,24 +12,3 @@ # 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. - -load("//python:defs.bzl", "py_test") -load(":wheel_library.bzl", "py_wheel_library") - -py_wheel_library( - name = "extracted_wheel_for_testing", - wheel = "@wheel_for_testing//file", -) - -py_test( - name = "py_wheel_library_test", - srcs = [ - "py_wheel_library_test.py", - ], - data = [ - ":extracted_wheel_for_testing", - ], - deps = [ - "//python/runfiles", - ], -) From e8386f1f6963b662bee27e60b265677f5fc1461f Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 25 Sep 2023 14:51:39 -0700 Subject: [PATCH 46/96] fix one more call site --- .../rules_pycross/pycross/private/tools/wheel_installer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index c15e25a9aa..8367f08d41 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -29,7 +29,7 @@ from installer.destinations import SchemeDictionaryDestination from installer.sources import WheelFile -from rules_python.python.pip_install.tools.wheel_installer import namespace_pkgs +from python.pip_install.tools.wheel_installer import namespace_pkgs def setup_namespace_pkg_compatibility(wheel_dir: Path) -> None: From a0660060a8e880183aff137889dd4ea0c7905dc7 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 25 Sep 2023 14:52:46 -0700 Subject: [PATCH 47/96] remove one more superfluous reference --- third_party/rules_pycross/pycross/private/wheel_library.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index c7af91e588..381511a2f1 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -16,7 +16,7 @@ """Implementation of the py_wheel_library rule.""" load("@bazel_skylib//lib:paths.bzl", "paths") -load("@rules_python//python:defs.bzl", "PyInfo") +load("//python:defs.bzl", "PyInfo") load(":providers.bzl", "PyWheelInfo") def _py_wheel_library_impl(ctx): From ea9f5be76e347f1e3e2ccff1046a57fa70eb9a57 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 25 Sep 2023 14:58:03 -0700 Subject: [PATCH 48/96] Suppress buildifier warning --- tests/pycross/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pycross/BUILD.bazel b/tests/pycross/BUILD.bazel index 6b523591c4..4f01272b7c 100644 --- a/tests/pycross/BUILD.bazel +++ b/tests/pycross/BUILD.bazel @@ -13,7 +13,7 @@ # limitations under the License. load("//python:defs.bzl", "py_test") -load("//third_party/rules_pycross/pycross/private:wheel_library.bzl", "py_wheel_library") +load("//third_party/rules_pycross/pycross/private:wheel_library.bzl", "py_wheel_library") # buildifier: disable=bzl-visibility py_wheel_library( name = "extracted_wheel_for_testing", From e1775c359115b9bb5a0edaa1eec7390aebc4e033 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 25 Sep 2023 15:12:09 -0700 Subject: [PATCH 49/96] port changes to vendored version on main. --- .../pycross/private/tools/wheel_installer.py | 33 +++++++++++++++++++ .../pycross/private/wheel_library.bzl | 28 +++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index 8367f08d41..f8b748cfe6 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -97,6 +97,12 @@ def main(args: Any) -> None: setup_namespace_pkg_compatibility(lib_dir) + patch_args = [args.patch_tool] + args.patch_arg + patch_dir = args.patch_dir or "." + for patch in (args.patch or []): + with patch.open("r") as stdin: + subprocess.run(patch_args, stdin=stdin, check=True, cwd=args.directory / patch_dir) + def parse_flags(argv) -> Any: parser = argparse.ArgumentParser(description="Extract a Python wheel.") @@ -127,6 +133,33 @@ def parse_flags(argv) -> Any: help="The output path.", ) + parser.add_argument( + "--patch", + type=Path, + action="append", + help="A patch file to apply.", + ) + + parser.add_argument( + "--patch-arg", + type=Path, + default=[], + action="append", + help="An argument for the patch_tool when applying the patches.", + ) + + parser.add_argument( + "--patch-tool", + type=str, + help="The tool to invoke when applying patches.", + ) + + parser.add_argument( + "--patch-dir", + type=str, + help="The directory from which to invoke patch_tool.", + ) + return parser.parse_args(argv[1:]) diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index 381511a2f1..29863f6eef 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -33,8 +33,12 @@ def _py_wheel_library_impl(ctx): args = ctx.actions.args().use_param_file("--flagfile=%s") args.add("--wheel", wheel_file) args.add("--directory", out.path) + args.add_all(ctx.files.patches, format_each="--patch=%s") + args.add_all(ctx.attr.patch_args, format_each="--patch-arg=%s") + args.add("--patch-tool", ctx.attr.patch_tool) + args.add("--patch-dir", ctx.attr.patch_dir) - inputs = [wheel_file] + inputs = [wheel_file] + ctx.files.patches if name_file: inputs.append(name_file) args.add("--wheel-name-file", name_file) @@ -133,5 +137,27 @@ This option is required to support some packages which cannot handle the convers cfg = "exec", executable = True, ), + "patches": attr.label_list( + allow_files = True, + default = [], + doc = + "A list of files that are to be applied as patches after " + + "extracting the archive. This will use the patch command line tool.", + ), + "patch_args": attr.string_list( + default = ["-p0"], + doc = + "The arguments given to the patch tool. Defaults to -p0, " + + "however -p1 will usually be needed for patches generated by " + + "git. If multiple -p arguments are specified, the last one will take effect." + ), + "patch_tool": attr.string( + default = "patch", + doc = "The patch(1) utility to use.", + ), + "patch_dir": attr.string( + default = "", + doc = "The directory from which to invoke the patch_tool.", + ), }, ) From 35c80ac115b34fb8c807ac4494d1bf3d8d5ff6e8 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 25 Sep 2023 15:13:08 -0700 Subject: [PATCH 50/96] run buildifier. --- examples/pypi_install/BUILD.bazel | 18 ++++----- python/pip_install/requirements.bzl | 3 +- python/private/BUILD.bazel | 2 +- python/private/pypi.bzl | 2 - python/private/pypi_repo.bzl | 38 ++++++++----------- python/private/pypi_util.bzl | 1 - python/private/wheel_library.bzl | 14 +++---- python/pypi.bzl | 2 +- .../pycross/private/wheel_library.bzl | 6 +-- 9 files changed, 39 insertions(+), 47 deletions(-) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index 084d41590f..5d298030d3 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -5,8 +5,8 @@ py_binary( name = "main", srcs = ["main.py"], deps = [ - "@pypi//requests", "@pypi//cognitojwt", + "@pypi//requests", ], ) @@ -20,13 +20,6 @@ py_test( compile_pip_requirements( name = "requirements", extra_args = ["--allow-unsafe"], - requirements_in = "requirements.in", - # Pass in a select-like value that lets the macro decide what to do with - # the file. Having these values as dictionaries allows us to do some - # validation before the underlying targets get instantiated. - requirements_txt = { - "@//:x86_64_linux": "requirements_lock_x86_64_linux.txt", - }, intermediate_file = { "@//:x86_64_linux": "intermediate_file_x86_64_linux.json", }, @@ -37,6 +30,13 @@ compile_pip_requirements( # - Add patches. # - Override/create aliases (support needed). intermediate_file_patcher = "//:intermediate_file_patcher", + requirements_in = "requirements.in", + # Pass in a select-like value that lets the macro decide what to do with + # the file. Having these values as dictionaries allows us to do some + # validation before the underlying targets get instantiated. + requirements_txt = { + "@//:x86_64_linux": "requirements_lock_x86_64_linux.txt", + }, ) py_binary( @@ -55,10 +55,10 @@ config_setting( genquery( name = "cognitojwt_deps", expression = """filter(@pypi//, kind(".* rule", deps(@pypi//cognitojwt)))""", - scope = ["@pypi//cognitojwt"], opts = [ "--notool_deps", ], + scope = ["@pypi//cognitojwt"], ) sh_test( diff --git a/python/pip_install/requirements.bzl b/python/pip_install/requirements.bzl index 7efe4c7802..8814d3908d 100644 --- a/python/pip_install/requirements.bzl +++ b/python/pip_install/requirements.bzl @@ -122,7 +122,8 @@ def compile_pip_requirements( loc.format(requirements_darwin) if requirements_darwin else "None", loc.format(requirements_windows) if requirements_windows else "None", ] + (_generate_loc_select(intermediate_file, loc) if intermediate_file else ["None"]) + ( - _generate_config_select(intermediate_file) if intermediate_file else ["None"]) + [ + _generate_config_select(intermediate_file) if intermediate_file else ["None"] + ) + [ loc.format(intermediate_file_patcher) if intermediate_file_patcher else "None", "//%s:%s.update" % (native.package_name(), name), ] + (["--generate-hashes"] if generate_hashes else []) + extra_args diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 1f79729f8a..ae78963b7d 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -141,10 +141,10 @@ print_toolchains_checksums(name = "print_toolchains_checksums") py_binary( name = "wheel_installer", srcs = ["wheel_installer.py"], + visibility = ["//visibility:public"], deps = [ "@pypi__installer//:lib", ], - visibility = ["//visibility:public"], ) # Used for py_console_script_gen rule diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index 0f1c94e29c..c92ea0a05f 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -17,7 +17,6 @@ load("//python/private:wheel_library.bzl", "pycross_wheel_library") load("//python:defs.bzl", "py_library") load(":pypi_util.bzl", "generate_repo_name_for_extracted_wheel") - _FORWARDED_ARGS = ( ("patches", None), ("patch_args", None), @@ -58,7 +57,6 @@ def _forward_arg(kwargs, intermediate, package, arg_name, default, transform): kwargs[arg_name] = select(select_dict) - def _accumulate_transitive_deps_inner(intermediate, configs, package, already_accumulated): for config in configs: pending_deps = sets.make([package]) diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index 8da81dddb2..5c46d388fb 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -36,7 +36,8 @@ def _clean_intermediate(intermediate): result = {} for package, info_per_config in intermediate.items(): result[normalize_name(package)] = { - config: _clean_info(info) for config, info in info_per_config.items() + config: _clean_info(info) + for config, info in info_per_config.items() } return result @@ -44,8 +45,9 @@ def _pypi_install_impl(repository_ctx): repository_ctx.file("BUILD.bazel", "\n", executable = False) if repository_ctx.attr.pip_installation_report: intermediate = _combine_intermediate_files( - repository_ctx, - repository_ctx.attr.pip_installation_report) + repository_ctx, + repository_ctx.attr.pip_installation_report, + ) else: intermediate = {} @@ -54,10 +56,10 @@ def _pypi_install_impl(repository_ctx): configs.extend(intermediate[package].keys()) lines = ["INTERMEDIATE = {}".format(json.encode_indent(_clean_intermediate(intermediate))), ""] - repository_ctx.file("intermediate.bzl", "\n".join(lines), executable=False) + repository_ctx.file("intermediate.bzl", "\n".join(lines), executable = False) lines = ["CONFIGS = {}".format(json.encode_indent(configs)), ""] - repository_ctx.file("configs.bzl", "\n".join(lines), executable=False) + repository_ctx.file("configs.bzl", "\n".join(lines), executable = False) lines = [ """load("@rules_python//python/private:pypi_repo.bzl",""", @@ -72,8 +74,7 @@ def _pypi_install_impl(repository_ctx): """ **kwargs)""", """ _generate_package_aliases(name=name, intermediate="@{}//:intermediate.bzl", **kwargs)""".format(repository_ctx.name), ] - repository_ctx.file("packages.bzl", "\n".join(lines), executable=False) - + repository_ctx.file("packages.bzl", "\n".join(lines), executable = False) _pypi_install = repository_rule( implementation = _pypi_install_impl, @@ -85,7 +86,6 @@ _pypi_install = repository_rule( }, ) - def _combine_intermediate_files(repository_ctx, installation_reports): combined = {} @@ -96,19 +96,18 @@ def _combine_intermediate_files(repository_ctx, installation_reports): for package in intermediate: config_settings = intermediate[package].keys() if len(config_settings) != 1: - fail("Expected 1 config setting for package %s in %s, but got %d." \ - % (package, intermediate_label, len(config_settings))) + fail("Expected 1 config setting for package %s in %s, but got %d." % + (package, intermediate_label, len(config_settings))) config_setting = config_settings[0] info = combined.setdefault(package, {}) if config_setting in info: - fail("Two intermediate files have the same config setting for package %s in %s." \ - % (package, intermediate_label)) + fail("Two intermediate files have the same config setting for package %s in %s." % + (package, intermediate_label)) info[config_setting] = intermediate[package][config_setting] return combined - def load_pypi_packages_internal(intermediate, intermediate_repo_name, alias_repo_name, **kwargs): # Only download a wheel/tarball once. We do this by tracking which SHA sums # we've downloaded already. @@ -118,6 +117,7 @@ def load_pypi_packages_internal(intermediate, intermediate_repo_name, alias_repo for config, info in configs.items(): if info["sha256"] not in sha_indexed_infos: _generate_http_file(package, info) + # TODO(phil): What do we need to track here? Can we switch to a # set()? sha_indexed_infos[info["sha256"]] = True @@ -130,7 +130,6 @@ def load_pypi_packages_internal(intermediate, intermediate_repo_name, alias_repo # here? _generate_py_library(package, config, info, intermediate_repo_name, alias_repo_name) - def _generate_http_file(package, info): http_file( name = generate_repo_name_for_download(package, info), @@ -141,7 +140,6 @@ def _generate_http_file(package, info): downloaded_file_path = paths.basename(info["url"]), ) - def _generate_py_library(package, config, info, intermediate_repo_name, alias_repo_name): _wheel_library_repo( name = generate_repo_name_for_extracted_wheel(package, info), @@ -152,7 +150,6 @@ def _generate_py_library(package, config, info, intermediate_repo_name, alias_re intermediate_config = config, ) - def _wheel_library_repo_impl(repository_ctx): lines = [ """load("@rules_python//python/private:pypi.bzl", "wrapped_py_wheel_library")""", @@ -167,8 +164,7 @@ def _wheel_library_repo_impl(repository_ctx): """ package="{}",""".format(repository_ctx.attr.intermediate_package), """)""", ] - repository_ctx.file("BUILD.bazel", "\n".join(lines), executable=False) - + repository_ctx.file("BUILD.bazel", "\n".join(lines), executable = False) _wheel_library_repo = repository_rule( implementation = _wheel_library_repo_impl, @@ -181,7 +177,6 @@ _wheel_library_repo = repository_rule( }, ) - def _generate_package_aliases_impl(repository_ctx): bzl_intermediate = repository_ctx.read(repository_ctx.path(repository_ctx.attr.intermediate)) if not bzl_intermediate.startswith("INTERMEDIATE = "): @@ -199,7 +194,7 @@ def _generate_package_aliases_impl(repository_ctx): """load("@rules_python//python/private:pypi.bzl", _generate_package_alias="generate_package_alias")""", """_generate_package_alias(INTERMEDIATE)""", ] - repository_ctx.file("{}/BUILD.bazel".format(package), "\n".join(lines), executable=False) + repository_ctx.file("{}/BUILD.bazel".format(package), "\n".join(lines), executable = False) dep_tracked_lines += [ """bool_flag(""", @@ -208,8 +203,7 @@ def _generate_package_aliases_impl(repository_ctx): """)""", ] - repository_ctx.file("_package_already_included/BUILD.bazel", "\n".join(dep_tracked_lines), executable=False) - + repository_ctx.file("_package_already_included/BUILD.bazel", "\n".join(dep_tracked_lines), executable = False) generate_package_aliases = repository_rule( implementation = _generate_package_aliases_impl, diff --git a/python/private/pypi_util.bzl b/python/private/pypi_util.bzl index 928250c4f4..c09c70a808 100644 --- a/python/private/pypi_util.bzl +++ b/python/private/pypi_util.bzl @@ -19,4 +19,3 @@ def generate_repo_name_for_download(package, info): def generate_repo_name_for_extracted_wheel(package, info): # TODO(phil): Can we make it more human readable by avoiding the checksum? return "pypi_extracted_wheel_{}_{}".format(package, info["sha256"]) - diff --git a/python/private/wheel_library.bzl b/python/private/wheel_library.bzl index 9a0cbcaea8..9d2479733b 100644 --- a/python/private/wheel_library.bzl +++ b/python/private/wheel_library.bzl @@ -16,8 +16,8 @@ def _pycross_wheel_library_impl(ctx): args = ctx.actions.args().use_param_file("--flagfile=%s") args.add("--wheel", wheel_file) args.add("--directory", out.path) - args.add_all(ctx.files.patches, format_each="--patch=%s") - args.add_all(ctx.attr.patch_args, format_each="--patch-arg=%s") + args.add_all(ctx.files.patches, format_each = "--patch=%s") + args.add_all(ctx.attr.patch_args, format_each = "--patch-arg=%s") args.add("--patch-tool", ctx.attr.patch_tool) args.add("--patch-dir", ctx.attr.patch_dir) @@ -103,8 +103,8 @@ pycross_wheel_library = rule( mandatory = True, ), "enable_implicit_namespace_pkgs": attr.bool( - default = True, - doc = """ + default = True, + doc = """ 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. @@ -113,7 +113,7 @@ This option is required to support some packages which cannot handle the convers ), "python_version": attr.string( doc = "The python version required for this wheel ('PY2' or 'PY3')", - values = ["PY2", "PY3", ""] + values = ["PY2", "PY3", ""], ), "_tool": attr.label( default = Label("//python/private:wheel_installer"), @@ -132,7 +132,7 @@ This option is required to support some packages which cannot handle the convers doc = "The arguments given to the patch tool. Defaults to -p0, " + "however -p1 will usually be needed for patches generated by " + - "git. If multiple -p arguments are specified, the last one will take effect." + "git. If multiple -p arguments are specified, the last one will take effect.", ), "patch_tool": attr.string( default = "patch", @@ -142,5 +142,5 @@ This option is required to support some packages which cannot handle the convers default = "", doc = "The directory from which to invoke the patch_tool.", ), - } + }, ) diff --git a/python/pypi.bzl b/python/pypi.bzl index 0feca2bdfc..3219d6758e 100644 --- a/python/pypi.bzl +++ b/python/pypi.bzl @@ -12,6 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//python/private:pypi_repo.bzl", _pypi_install="pypi_install") +load("//python/private:pypi_repo.bzl", _pypi_install = "pypi_install") pypi_install = _pypi_install diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index 29863f6eef..5d93bd3ee0 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -33,8 +33,8 @@ def _py_wheel_library_impl(ctx): args = ctx.actions.args().use_param_file("--flagfile=%s") args.add("--wheel", wheel_file) args.add("--directory", out.path) - args.add_all(ctx.files.patches, format_each="--patch=%s") - args.add_all(ctx.attr.patch_args, format_each="--patch-arg=%s") + args.add_all(ctx.files.patches, format_each = "--patch=%s") + args.add_all(ctx.attr.patch_args, format_each = "--patch-arg=%s") args.add("--patch-tool", ctx.attr.patch_tool) args.add("--patch-dir", ctx.attr.patch_dir) @@ -149,7 +149,7 @@ This option is required to support some packages which cannot handle the convers doc = "The arguments given to the patch tool. Defaults to -p0, " + "however -p1 will usually be needed for patches generated by " + - "git. If multiple -p arguments are specified, the last one will take effect." + "git. If multiple -p arguments are specified, the last one will take effect.", ), "patch_tool": attr.string( default = "patch", From c451b9f972d993cc9804504d95181d923aeed4e5 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 25 Sep 2023 15:15:40 -0700 Subject: [PATCH 51/96] switch to third_party version of pycross --- python/private/pypi.bzl | 7 +- python/private/wheel_installer.py | 133 ---------------- python/private/wheel_library.bzl | 146 ------------------ .../pycross/private/tools/wheel_installer.py | 1 + 4 files changed, 6 insertions(+), 281 deletions(-) delete mode 100644 python/private/wheel_installer.py delete mode 100644 python/private/wheel_library.bzl diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index c92ea0a05f..4efe329257 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -12,8 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +# TODO(philsc): Remove the buildifier warning suppression once we migrate +# rules_pycross code into the main source tree. + load("@bazel_skylib//lib:new_sets.bzl", "sets") -load("//python/private:wheel_library.bzl", "pycross_wheel_library") +load("//third_party/rules_pycross/pycross/private:wheel_library.bzl", "py_wheel_library") # buildifier: disable=bzl-visibility load("//python:defs.bzl", "py_library") load(":pypi_util.bzl", "generate_repo_name_for_extracted_wheel") @@ -98,7 +101,7 @@ def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, intermediat # the transitive closure of underlying libraries. Need to find a good # example of this though. torch, dvc[gs]==2.43.1, apache-airflow all # require sdist support. - pycross_wheel_library( + py_wheel_library( name = name, wheel = "@{}//file".format(wheel_repo_name), enable_implicit_namespace_pkgs = True, diff --git a/python/private/wheel_installer.py b/python/private/wheel_installer.py deleted file mode 100644 index bb9daef105..0000000000 --- a/python/private/wheel_installer.py +++ /dev/null @@ -1,133 +0,0 @@ -""" -A tool that invokes pypa/build to build the given sdist tarball. - -Copied from https://github.com/jvolkman/rules_pycross/blob/main/pycross/private/tools/wheel_installer.py -at commit 91e10c1f62926e8e9821897e252e359f797ff989. -""" - -import argparse -import os -import subprocess -import shutil -import sys -import tempfile -from pathlib import Path -from typing import Any - -from installer import install -from installer.destinations import SchemeDictionaryDestination -from installer.sources import WheelFile - - -def main(args: Any) -> None: - dest_dir = args.directory - lib_dir = dest_dir / "site-packages" - destination = SchemeDictionaryDestination( - scheme_dict={ - "platlib": str(lib_dir), - "purelib": str(lib_dir), - "headers": str(dest_dir / "include"), - "scripts": str(dest_dir / "bin"), - "data": str(dest_dir / "data"), - }, - interpreter="/usr/bin/env python3", # Generic; it's not feasible to run these scripts directly. - script_kind="posix", - bytecode_optimization_levels=[0, 1], - ) - - link_dir = Path(tempfile.mkdtemp()) - if args.wheel_name_file: - with open(args.wheel_name_file, "r") as f: - wheel_name = f.read().strip() - else: - wheel_name = os.path.basename(args.wheel) - - link_path = link_dir / wheel_name - os.symlink(os.path.join(os.getcwd(), args.wheel), link_path) - - try: - with WheelFile.open(link_path) as source: - install( - source=source, - destination=destination, - # Additional metadata that is generated by the installation tool. - additional_metadata={ - "INSTALLER": b"https://github.com/jvolkman/rules_pycross", - }, - ) - finally: - shutil.rmtree(link_dir, ignore_errors=True) - - patch_args = [args.patch_tool] + args.patch_arg - patch_dir = args.patch_dir or "." - for patch in (args.patch or []): - with patch.open("r") as stdin: - subprocess.run(patch_args, stdin=stdin, check=True, cwd=args.directory / patch_dir) - - -def parse_flags(argv) -> Any: - parser = argparse.ArgumentParser(description="Extract a Python wheel.") - - parser.add_argument( - "--wheel", - type=Path, - required=True, - help="The wheel file path.", - ) - - parser.add_argument( - "--wheel-name-file", - type=Path, - required=False, - help="A file containing the canonical name of the wheel.", - ) - - parser.add_argument( - "--enable-implicit-namespace-pkgs", - action="store_true", - help="If true, disables conversion of implicit namespace packages and will unzip as-is.", - ) - - parser.add_argument( - "--directory", - type=Path, - help="The output path.", - ) - - parser.add_argument( - "--patch", - type=Path, - action="append", - help="A patch file to apply.", - ) - - parser.add_argument( - "--patch-arg", - type=Path, - default=[], - action="append", - help="An argument for the patch_tool when applying the patches.", - ) - - parser.add_argument( - "--patch-tool", - type=str, - help="The tool to invoke when applying patches.", - ) - - parser.add_argument( - "--patch-dir", - type=str, - help="The directory from which to invoke patch_tool.", - ) - - return parser.parse_args(argv[1:]) - - -if __name__ == "__main__": - # When under `bazel run`, change to the actual working dir. - if "BUILD_WORKING_DIRECTORY" in os.environ: - os.chdir(os.environ["BUILD_WORKING_DIRECTORY"]) - - args = parse_flags(sys.argv) - main(args) diff --git a/python/private/wheel_library.bzl b/python/private/wheel_library.bzl deleted file mode 100644 index 9d2479733b..0000000000 --- a/python/private/wheel_library.bzl +++ /dev/null @@ -1,146 +0,0 @@ -"""Implementation of the pycross_wheel_library rule. - -Copied from https://github.com/jvolkman/rules_pycross/blob/main/pycross/private/wheel_library.bzl -at commit 91e10c1f62926e8e9821897e252e359f797ff989. -""" - -load("@bazel_skylib//lib:paths.bzl", "paths") -load("//python:defs.bzl", "PyInfo") - -def _pycross_wheel_library_impl(ctx): - out = ctx.actions.declare_directory(ctx.attr.name) - - wheel_file = ctx.file.wheel - name_file = None - - args = ctx.actions.args().use_param_file("--flagfile=%s") - args.add("--wheel", wheel_file) - args.add("--directory", out.path) - args.add_all(ctx.files.patches, format_each = "--patch=%s") - args.add_all(ctx.attr.patch_args, format_each = "--patch-arg=%s") - args.add("--patch-tool", ctx.attr.patch_tool) - args.add("--patch-dir", ctx.attr.patch_dir) - - inputs = [wheel_file] + ctx.files.patches - if name_file: - inputs.append(name_file) - args.add("--wheel-name-file", name_file) - - if ctx.attr.enable_implicit_namespace_pkgs: - args.add("--enable-implicit-namespace-pkgs") - - ctx.actions.run( - inputs = inputs, - outputs = [out], - executable = ctx.executable._tool, - arguments = [args], - # Set environment variables to make generated .pyc files reproducible. - env = { - "SOURCE_DATE_EPOCH": "315532800", - "PYTHONHASHSEED": "0", - }, - mnemonic = "WheelInstall", - progress_message = "Installing %s" % ctx.file.wheel.basename, - ) - - has_py2_only_sources = ctx.attr.python_version == "PY2" - has_py3_only_sources = ctx.attr.python_version == "PY3" - if not has_py2_only_sources: - for d in ctx.attr.deps: - if d[PyInfo].has_py2_only_sources: - has_py2_only_sources = True - break - if not has_py3_only_sources: - for d in ctx.attr.deps: - if d[PyInfo].has_py3_only_sources: - has_py3_only_sources = True - break - - # TODO: Is there a more correct way to get this runfiles-relative import path? - imp = paths.join( - ctx.label.workspace_name or ctx.workspace_name, # Default to the local workspace. - ctx.label.package, - ctx.label.name, - "site-packages", # we put lib files in this subdirectory. - ) - - imports = depset( - direct = [imp], - transitive = [d[PyInfo].imports for d in ctx.attr.deps], - ) - transitive_sources = depset( - direct = [out], - transitive = [dep[PyInfo].transitive_sources for dep in ctx.attr.deps if PyInfo in dep], - ) - runfiles = ctx.runfiles(files = [out]) - for d in ctx.attr.deps: - runfiles = runfiles.merge(d[DefaultInfo].default_runfiles) - - return [ - DefaultInfo( - files = depset(direct = [out]), - runfiles = runfiles, - ), - PyInfo( - has_py2_only_sources = has_py2_only_sources, - has_py3_only_sources = has_py3_only_sources, - imports = imports, - transitive_sources = transitive_sources, - uses_shared_libraries = True, # Docs say this is unused - ), - ] - -pycross_wheel_library = rule( - implementation = _pycross_wheel_library_impl, - attrs = { - "deps": attr.label_list( - doc = "A list of this wheel's Python library dependencies.", - providers = [DefaultInfo, PyInfo], - ), - "wheel": attr.label( - doc = "The wheel file.", - allow_single_file = [".whl"], - mandatory = True, - ), - "enable_implicit_namespace_pkgs": attr.bool( - default = True, - doc = """ -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. -This option is required to support some packages which cannot handle the conversion to pkg-util style. - """, - ), - "python_version": attr.string( - doc = "The python version required for this wheel ('PY2' or 'PY3')", - values = ["PY2", "PY3", ""], - ), - "_tool": attr.label( - default = Label("//python/private:wheel_installer"), - cfg = "exec", - executable = True, - ), - "patches": attr.label_list( - allow_files = True, - default = [], - doc = - "A list of files that are to be applied as patches after " + - "extracting the archive. This will use the patch command line tool.", - ), - "patch_args": attr.string_list( - default = ["-p0"], - doc = - "The arguments given to the patch tool. Defaults to -p0, " + - "however -p1 will usually be needed for patches generated by " + - "git. If multiple -p arguments are specified, the last one will take effect.", - ), - "patch_tool": attr.string( - default = "patch", - doc = "The patch(1) utility to use.", - ), - "patch_dir": attr.string( - default = "", - doc = "The directory from which to invoke the patch_tool.", - ), - }, -) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index f8b748cfe6..45a40bfed1 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -20,6 +20,7 @@ import argparse import os import shutil +import subprocess import sys import tempfile from pathlib import Path From 37ed85b8c04e45abe759d42eeafbded08655a3f8 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 25 Sep 2023 15:21:32 -0700 Subject: [PATCH 52/96] add comment --- .../rules_pycross/pycross/private/tools/wheel_installer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index 45a40bfed1..f401e8b828 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -102,6 +102,7 @@ def main(args: Any) -> None: patch_dir = args.patch_dir or "." for patch in (args.patch or []): with patch.open("r") as stdin: + # TODO(philsc): Only print stdout/stderr on failure. subprocess.run(patch_args, stdin=stdin, check=True, cwd=args.directory / patch_dir) From dd84feb8796c36750bcbd4e7da10d936a96bbc0f Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 28 Sep 2023 09:19:32 -0700 Subject: [PATCH 53/96] pycross: Add patching support to py_wheel_library This patch adds a few arguments to `py_wheel_library` to simulate how `http_archive` accepts patch-related arguments. I also amended the existing test to validate the behaviour at a very high level. References: #1360 --- ...d-new-file-for-testing-patch-support.patch | 17 +++++++ tests/pycross/BUILD.bazel | 6 +++ tests/pycross/py_wheel_library_test.py | 9 ++-- .../pycross/private/tools/wheel_installer.py | 46 +++++++++++++++++++ .../pycross/private/wheel_library.bzl | 28 ++++++++++- 5 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 tests/pycross/0001-Add-new-file-for-testing-patch-support.patch diff --git a/tests/pycross/0001-Add-new-file-for-testing-patch-support.patch b/tests/pycross/0001-Add-new-file-for-testing-patch-support.patch new file mode 100644 index 0000000000..fcbc3096ef --- /dev/null +++ b/tests/pycross/0001-Add-new-file-for-testing-patch-support.patch @@ -0,0 +1,17 @@ +From b2ebe6fe67ff48edaf2ae937d24b1f0b67c16f81 Mon Sep 17 00:00:00 2001 +From: Philipp Schrader +Date: Thu, 28 Sep 2023 09:02:44 -0700 +Subject: [PATCH] Add new file for testing patch support + +--- + site-packages/numpy/file_added_via_patch.txt | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 site-packages/numpy/file_added_via_patch.txt + +diff --git a/site-packages/numpy/file_added_via_patch.txt b/site-packages/numpy/file_added_via_patch.txt +new file mode 100644 +index 0000000..9d947a4 +--- /dev/null ++++ b/site-packages/numpy/file_added_via_patch.txt +@@ -0,0 +1 @@ ++Hello from a patch! diff --git a/tests/pycross/BUILD.bazel b/tests/pycross/BUILD.bazel index 4f01272b7c..c54d2009ee 100644 --- a/tests/pycross/BUILD.bazel +++ b/tests/pycross/BUILD.bazel @@ -17,6 +17,12 @@ load("//third_party/rules_pycross/pycross/private:wheel_library.bzl", "py_wheel_ py_wheel_library( name = "extracted_wheel_for_testing", + patch_args = [ + "-p1", + ], + patches = [ + "0001-Add-new-file-for-testing-patch-support.patch", + ], wheel = "@wheel_for_testing//file", ) diff --git a/tests/pycross/py_wheel_library_test.py b/tests/pycross/py_wheel_library_test.py index fa8e20e563..7b29c14812 100644 --- a/tests/pycross/py_wheel_library_test.py +++ b/tests/pycross/py_wheel_library_test.py @@ -23,9 +23,7 @@ class TestPyWheelLibrary(unittest.TestCase): def setUp(self): self.extraction_dir = Path( - RUNFILES.Rlocation( - "rules_python/tests/pycross/extracted_wheel_for_testing" - ) + RUNFILES.Rlocation("rules_python/tests/pycross/extracted_wheel_for_testing") ) self.assertTrue(self.extraction_dir.exists(), self.extraction_dir) self.assertTrue(self.extraction_dir.is_dir(), self.extraction_dir) @@ -43,6 +41,11 @@ def test_file_presence(self): (self.extraction_dir / path).exists(), f"{path} does not exist" ) + def test_patched_file_contents(self): + """Validate that the patch got applied correctly.""" + file = self.extraction_dir / "site-packages/numpy/file_added_via_patch.txt" + self.assertEqual(file.read_text(), "Hello from a patch!\n") + if __name__ == "__main__": unittest.main() diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index 8367f08d41..9380a847ae 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -20,6 +20,7 @@ import argparse import os import shutil +import subprocess import sys import tempfile from pathlib import Path @@ -97,6 +98,24 @@ def main(args: Any) -> None: setup_namespace_pkg_compatibility(lib_dir) + patch_args = [args.patch_tool] + args.patch_arg + patch_dir = args.patch_dir or "." + for patch in args.patch or []: + with patch.open("r") as stdin: + try: + subprocess.run( + patch_args, + stdin=stdin, + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + cwd=args.directory / patch_dir, + ) + except subprocess.CalledProcessError as error: + print(f"Patch {patch} failed to apply:") + print(error.stdout.decode("utf-8")) + raise + def parse_flags(argv) -> Any: parser = argparse.ArgumentParser(description="Extract a Python wheel.") @@ -127,6 +146,33 @@ def parse_flags(argv) -> Any: help="The output path.", ) + parser.add_argument( + "--patch", + type=Path, + action="append", + help="A patch file to apply.", + ) + + parser.add_argument( + "--patch-arg", + type=Path, + default=[], + action="append", + help="An argument for the patch_tool when applying the patches.", + ) + + parser.add_argument( + "--patch-tool", + type=str, + help="The tool to invoke when applying patches.", + ) + + parser.add_argument( + "--patch-dir", + type=str, + help="The directory from which to invoke patch_tool.", + ) + return parser.parse_args(argv[1:]) diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index 381511a2f1..10c7bf5d6a 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -33,8 +33,12 @@ def _py_wheel_library_impl(ctx): args = ctx.actions.args().use_param_file("--flagfile=%s") args.add("--wheel", wheel_file) args.add("--directory", out.path) + args.add_all(ctx.files.patches, format_each = "--patch=%s") + args.add_all(ctx.attr.patch_args, format_each = "--patch-arg=%s") + args.add("--patch-tool", ctx.attr.patch_tool) + args.add("--patch-dir", ctx.attr.patch_dir) - inputs = [wheel_file] + inputs = [wheel_file] + ctx.files.patches if name_file: inputs.append(name_file) args.add("--wheel-name-file", name_file) @@ -119,6 +123,28 @@ and py_test targets must specify either `legacy_create_init=False` or the global This option is required to support some packages which cannot handle the conversion to pkg-util style. """, ), + "patch_args": attr.string_list( + default = ["-p0"], + doc = + "The arguments given to the patch tool. Defaults to -p0, " + + "however -p1 will usually be needed for patches generated by " + + "git. If multiple -p arguments are specified, the last one will take effect.", + ), + "patch_dir": attr.string( + default = "", + doc = "The directory from which to invoke the patch_tool.", + ), + "patch_tool": attr.string( + default = "patch", + doc = "The patch(1) utility to use.", + ), + "patches": attr.label_list( + allow_files = True, + default = [], + doc = + "A list of files that are to be applied as patches after " + + "extracting the archive. This will use the patch command line tool.", + ), "python_version": attr.string( doc = "The python version required for this wheel ('PY2' or 'PY3')", values = ["PY2", "PY3", ""], From bb46f2e7e3207add34677eea0221db08fd1c4cfc Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 9 Oct 2023 21:00:00 -0700 Subject: [PATCH 54/96] Compile GNU patch --- WORKSPACE | 44 +++++++++++++++++++++++++++++++++++ third_party/patch.BUILD.bazel | 40 +++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 third_party/patch.BUILD.bazel diff --git a/WORKSPACE b/WORKSPACE index 6e1e5fc620..63369c655f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -97,3 +97,47 @@ http_file( "https://files.pythonhosted.org/packages/50/67/3e966d99a07d60a21a21d7ec016e9e4c2642a86fea251ec68677daf71d4d/numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", ], ) + +http_archive( + name = "rules_foreign_cc", + sha256 = "1c726b3ddcbf9061cca885fed3101a7966f0fe959a56c76ef861e04cc719a8fb", + strip_prefix = "rules_foreign_cc-14ded03b9c835e9ccba6a20f0944729dccab8d9b", + url = "https://github.com/bazelbuild/rules_foreign_cc/archive/14ded03b9c835e9ccba6a20f0944729dccab8d9b.tar.gz", +) + +load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") + +rules_foreign_cc_dependencies() + + + +http_archive( + name = "gnulib", + urls = [ + "https://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=snapshot;h=e017871121364b67549ea00fcfebc0cb6cc99fb3;sf=tgz", + ], + strip_prefix = "gnulib-e017871", + type = "tgz", + sha256 = "a285dc300c3d9c25cc06e38827ef40f6073ec3b9b0fcb5bba433f943be92d8d4", + build_file = "//:third_party/gnulib.BUILD.bazel", +) + +http_archive( + name = "patch", + urls = [ + "http://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.gz", + ], + strip_prefix = "patch-2.7.6", + sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", + build_file = "//:third_party/patch.BUILD.bazel", +) + +http_archive( + name = "patch2", + urls = [ + "http://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.gz", + ], + strip_prefix = "patch-2.7.6", + sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", + build_file = "//:third_party/patch.BUILD.bazel", +) diff --git a/third_party/patch.BUILD.bazel b/third_party/patch.BUILD.bazel new file mode 100644 index 0000000000..952402d8fe --- /dev/null +++ b/third_party/patch.BUILD.bazel @@ -0,0 +1,40 @@ +load("@bazel_skylib//rules:write_file.bzl", "write_file") + +load("@rules_foreign_cc//foreign_cc:defs.bzl", "configure_make") + +#cc_binary( +# name = "patch", +# srcs = [ +# "src/patch.c", +# "src/common.h", +# "src/inp.h", +# "src/pch.h", +# "src/util.c", +# "src/util.h", +# "src/version.h", +# "src/safe.h", +# ], +# includes = [ +# "src", +# ], +# deps = [ +# #"@gnulib//:gnulib", +# ], +# visibility = ["//visibility:public"], +#) + +filegroup( + name = "srcs", + srcs = glob([ + "**/*", + "*/*", + ]), +) + +configure_make( + name = "configure_make", + lib_source = ":srcs", + out_binaries = [ + "patch", + ], +) From 91c0a30960c118c63e8ebff7dc4f00876372016e Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 19 Oct 2023 07:13:25 -0700 Subject: [PATCH 55/96] Make it work for Windows maybe? --- WORKSPACE | 23 ---------- third_party/patch.BUILD.bazel | 42 ++++++++--------- .../pycross/private/tools/wheel_installer.py | 46 ++++++++++++------- .../pycross/private/wheel_library.bzl | 28 +++++++++-- 4 files changed, 72 insertions(+), 67 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63369c655f..2706ca8b22 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -109,19 +109,6 @@ load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_depende rules_foreign_cc_dependencies() - - -http_archive( - name = "gnulib", - urls = [ - "https://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=snapshot;h=e017871121364b67549ea00fcfebc0cb6cc99fb3;sf=tgz", - ], - strip_prefix = "gnulib-e017871", - type = "tgz", - sha256 = "a285dc300c3d9c25cc06e38827ef40f6073ec3b9b0fcb5bba433f943be92d8d4", - build_file = "//:third_party/gnulib.BUILD.bazel", -) - http_archive( name = "patch", urls = [ @@ -131,13 +118,3 @@ http_archive( sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", build_file = "//:third_party/patch.BUILD.bazel", ) - -http_archive( - name = "patch2", - urls = [ - "http://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.gz", - ], - strip_prefix = "patch-2.7.6", - sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", - build_file = "//:third_party/patch.BUILD.bazel", -) diff --git a/third_party/patch.BUILD.bazel b/third_party/patch.BUILD.bazel index 952402d8fe..c41742ca7b 100644 --- a/third_party/patch.BUILD.bazel +++ b/third_party/patch.BUILD.bazel @@ -1,27 +1,6 @@ -load("@bazel_skylib//rules:write_file.bzl", "write_file") - load("@rules_foreign_cc//foreign_cc:defs.bzl", "configure_make") - -#cc_binary( -# name = "patch", -# srcs = [ -# "src/patch.c", -# "src/common.h", -# "src/inp.h", -# "src/pch.h", -# "src/util.c", -# "src/util.h", -# "src/version.h", -# "src/safe.h", -# ], -# includes = [ -# "src", -# ], -# deps = [ -# #"@gnulib//:gnulib", -# ], -# visibility = ["//visibility:public"], -#) +load("@bazel_skylib//rules:copy_file.bzl", "copy_file") +load("@rules_python//:third_party/patch.bzl", "find_patch_executable") filegroup( name = "srcs", @@ -32,9 +11,24 @@ filegroup( ) configure_make( - name = "configure_make", + name = "patch_make", lib_source = ":srcs", out_binaries = [ "patch", ], ) + +# The configure_make rule automatically includes the header file "include" +# directory. We need to filter out just the patch binary itself. +find_patch_executable( + name = "find_patch", + src = ":patch_make", +) + +copy_file( + name = "patch_binary", + out = "patch", + src = ":find_patch", + is_executable = True, + visibility = ["//visibility:public"], +) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index 9380a847ae..2a7d103924 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -98,23 +98,29 @@ def main(args: Any) -> None: setup_namespace_pkg_compatibility(lib_dir) - patch_args = [args.patch_tool] + args.patch_arg - patch_dir = args.patch_dir or "." - for patch in args.patch or []: - with patch.open("r") as stdin: - try: - subprocess.run( - patch_args, - stdin=stdin, - check=True, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - cwd=args.directory / patch_dir, - ) - except subprocess.CalledProcessError as error: - print(f"Patch {patch} failed to apply:") - print(error.stdout.decode("utf-8")) - raise + if args.patch: + if args.patch_tool and args.patch_tool_target: + raise ValueError("Only specify one of 'patch_tool' and 'patch_tool_target'.") + if not args.patch_tool and not args.patch_tool_target: + raise ValueError("Specify one of 'patch_tool' or 'patch_tool_target'.") + + patch_args = [args.patch_tool or Path.cwd() / args.patch_tool_target] + args.patch_arg + patch_dir = args.patch_dir or "." + for patch in args.patch or []: + with patch.open("r") as stdin: + try: + subprocess.run( + patch_args, + stdin=stdin, + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + cwd=args.directory / patch_dir, + ) + except subprocess.CalledProcessError as error: + print(f"Patch {patch} failed to apply:") + print(error.stdout.decode("utf-8")) + raise def parse_flags(argv) -> Any: @@ -167,6 +173,12 @@ def parse_flags(argv) -> Any: help="The tool to invoke when applying patches.", ) + parser.add_argument( + "--patch-tool-target", + type=Path, + help="The tool to invoke when applying patches.", + ) + parser.add_argument( "--patch-dir", type=str, diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index 10c7bf5d6a..22058ced28 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -38,11 +38,16 @@ def _py_wheel_library_impl(ctx): args.add("--patch-tool", ctx.attr.patch_tool) args.add("--patch-dir", ctx.attr.patch_dir) + tools = [] inputs = [wheel_file] + ctx.files.patches if name_file: inputs.append(name_file) args.add("--wheel-name-file", name_file) + if ctx.attr.patch_tool_target: + args.add("--patch-tool-target", ctx.attr.patch_tool_target.files_to_run.executable) + tools.append(ctx.executable.patch_tool_target) + if ctx.attr.enable_implicit_namespace_pkgs: args.add("--enable-implicit-namespace-pkgs") @@ -50,6 +55,7 @@ def _py_wheel_library_impl(ctx): inputs = inputs, outputs = [out], executable = ctx.executable._tool, + tools = tools, arguments = [args], # Set environment variables to make generated .pyc files reproducible. env = { @@ -107,7 +113,7 @@ def _py_wheel_library_impl(ctx): ), ] -py_wheel_library = rule( +_py_wheel_library = rule( implementation = _py_wheel_library_impl, attrs = { "deps": attr.label_list( @@ -135,8 +141,13 @@ This option is required to support some packages which cannot handle the convers doc = "The directory from which to invoke the patch_tool.", ), "patch_tool": attr.string( - default = "patch", - doc = "The patch(1) utility to use.", + doc = "The patch(1) utility from the host to use. " + + "If set, overrides `patch_tool_target`.", + ), + "patch_tool_target": attr.label( + executable = True, + cfg = "exec", + doc = "The label of the patch(1) utility to use. Only used if `patch_tool` is not set.", ), "patches": attr.label_list( allow_files = True, @@ -161,3 +172,14 @@ This option is required to support some packages which cannot handle the convers ), }, ) + +def py_wheel_library(patches = None, patch_tool = None, patch_tool_target = None, **kwargs): + if patches and not patch_tool and not patch_tool_target: + patch_tool_target = "@patch//:patch_binary" + + _py_wheel_library( + patches = patches, + patch_tool = patch_tool, + patch_tool_target = patch_tool_target, + **kwargs + ) From 7f4b3444fe72be22c538b8a698befe7fd990785f Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 19 Oct 2023 07:13:59 -0700 Subject: [PATCH 56/96] add missing file --- third_party/patch.bzl | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 third_party/patch.bzl diff --git a/third_party/patch.bzl b/third_party/patch.bzl new file mode 100644 index 0000000000..9ff2ddd141 --- /dev/null +++ b/third_party/patch.bzl @@ -0,0 +1,20 @@ +def _find_patch_executable_impl(ctx): + patch_binary = None + for file in ctx.attr.src.files.to_list(): + if not file.is_directory: + if patch_binary: + fail("Found 2 candidates for patch binary. %s and %s" % + (patch_binary.path, file.path)) + patch_binary = file + if not patch_binary: + fail("Could not find patch binary.") + return [DefaultInfo(files=depset([patch_binary]))] + +find_patch_executable = rule( + implementation = _find_patch_executable_impl, + attrs = { + "src": attr.label( + mandatory = True, + ), + }, +) From c456eff8ccd5803cb45eb5c9d1490dcf03923ed5 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 19 Oct 2023 07:22:47 -0700 Subject: [PATCH 57/96] clean up a bit --- .../rules_pycross/pycross/private/tools/wheel_installer.py | 2 -- third_party/rules_pycross/pycross/private/wheel_library.bzl | 5 ++++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index 2a7d103924..d593d58f79 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -99,8 +99,6 @@ def main(args: Any) -> None: setup_namespace_pkg_compatibility(lib_dir) if args.patch: - if args.patch_tool and args.patch_tool_target: - raise ValueError("Only specify one of 'patch_tool' and 'patch_tool_target'.") if not args.patch_tool and not args.patch_tool_target: raise ValueError("Specify one of 'patch_tool' or 'patch_tool_target'.") diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index 22058ced28..332dd5d27c 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -147,7 +147,8 @@ This option is required to support some packages which cannot handle the convers "patch_tool_target": attr.label( executable = True, cfg = "exec", - doc = "The label of the patch(1) utility to use. Only used if `patch_tool` is not set.", + doc = "The label of the patch(1) utility to use. " + + "Only used if `patch_tool` is not set.", ), "patches": attr.label_list( allow_files = True, @@ -174,6 +175,8 @@ This option is required to support some packages which cannot handle the convers ) def py_wheel_library(patches = None, patch_tool = None, patch_tool_target = None, **kwargs): + # If the user has specified patches, but hasn't specified how to apply + # those patches, default to our internally-provided patch binary. if patches and not patch_tool and not patch_tool_target: patch_tool_target = "@patch//:patch_binary" From 88d679ea84d846e7c44948a5a064d7214b29e322 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 19 Oct 2023 07:34:07 -0700 Subject: [PATCH 58/96] fix buildifier warning --- WORKSPACE | 6 +++--- third_party/patch.bzl | 9 ++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2706ca8b22..6503220e4b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -111,10 +111,10 @@ rules_foreign_cc_dependencies() http_archive( name = "patch", + build_file = "//:third_party/patch.BUILD.bazel", + sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", + strip_prefix = "patch-2.7.6", urls = [ "http://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.gz", ], - strip_prefix = "patch-2.7.6", - sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", - build_file = "//:third_party/patch.BUILD.bazel", ) diff --git a/third_party/patch.bzl b/third_party/patch.bzl index 9ff2ddd141..700c2a6316 100644 --- a/third_party/patch.bzl +++ b/third_party/patch.bzl @@ -1,4 +1,11 @@ +"""Helper rule for using the GNU patch binary.""" + def _find_patch_executable_impl(ctx): + """Find the patch binary among the specified files. + + The configure_make rule includes too many files to be usable as-is. + We need to find the binary we care about. + """ patch_binary = None for file in ctx.attr.src.files.to_list(): if not file.is_directory: @@ -8,7 +15,7 @@ def _find_patch_executable_impl(ctx): patch_binary = file if not patch_binary: fail("Could not find patch binary.") - return [DefaultInfo(files=depset([patch_binary]))] + return [DefaultInfo(files = depset([patch_binary]))] find_patch_executable = rule( implementation = _find_patch_executable_impl, From 8fb9c6d8a428f4d428983ae22de72afd05fb5298 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 19 Oct 2023 07:44:26 -0700 Subject: [PATCH 59/96] clean up deps --- WORKSPACE | 21 --------------------- internal_deps.bzl | 19 +++++++++++++++++++ internal_setup.bzl | 3 +++ 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6503220e4b..6e1e5fc620 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -97,24 +97,3 @@ http_file( "https://files.pythonhosted.org/packages/50/67/3e966d99a07d60a21a21d7ec016e9e4c2642a86fea251ec68677daf71d4d/numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", ], ) - -http_archive( - name = "rules_foreign_cc", - sha256 = "1c726b3ddcbf9061cca885fed3101a7966f0fe959a56c76ef861e04cc719a8fb", - strip_prefix = "rules_foreign_cc-14ded03b9c835e9ccba6a20f0944729dccab8d9b", - url = "https://github.com/bazelbuild/rules_foreign_cc/archive/14ded03b9c835e9ccba6a20f0944729dccab8d9b.tar.gz", -) - -load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") - -rules_foreign_cc_dependencies() - -http_archive( - name = "patch", - build_file = "//:third_party/patch.BUILD.bazel", - sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", - strip_prefix = "patch-2.7.6", - urls = [ - "http://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.gz", - ], -) diff --git a/internal_deps.bzl b/internal_deps.bzl index fd2d91edc1..ac61e939d0 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -182,3 +182,22 @@ def rules_python_internal_deps(): "https://github.com/protocolbuffers/protobuf/archive/v21.7.tar.gz", ], ) + + maybe( + http_archive, + name = "rules_foreign_cc", + sha256 = "1c726b3ddcbf9061cca885fed3101a7966f0fe959a56c76ef861e04cc719a8fb", + strip_prefix = "rules_foreign_cc-14ded03b9c835e9ccba6a20f0944729dccab8d9b", + url = "https://github.com/bazelbuild/rules_foreign_cc/archive/14ded03b9c835e9ccba6a20f0944729dccab8d9b.tar.gz", + ) + + maybe( + http_archive, + name = "patch", + build_file = "//:third_party/patch.BUILD.bazel", + sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", + strip_prefix = "patch-2.7.6", + urls = [ + "http://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.gz", + ], + ) diff --git a/internal_setup.bzl b/internal_setup.bzl index 0c9d6c48a6..eb18fbebe0 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -18,6 +18,7 @@ load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") load("@build_bazel_integration_testing//tools:repositories.bzl", "bazel_binaries") load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") +load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS") load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:internal_config_repo.bzl", "internal_config_repo") # buildifier: disable=bzl-visibility @@ -39,3 +40,5 @@ def rules_python_internal_setup(): rules_proto_toolchains() protobuf_deps() + + rules_foreign_cc_dependencies() From b8ef501d81a8e4ea23495a50193f4dead85d9609 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 19 Oct 2023 08:34:23 -0700 Subject: [PATCH 60/96] fix merge conflicts --- internal_deps.bzl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/internal_deps.bzl b/internal_deps.bzl index b50c8b0eee..6fdb4241f5 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -214,16 +214,14 @@ def rules_python_internal_deps(): sha256 = "4531deccb913639c30e5c7512a054d5d875698daeb75d8cf90f284375fe7c360", ) - maybe( - http_archive, + http_archive( name = "rules_foreign_cc", sha256 = "1c726b3ddcbf9061cca885fed3101a7966f0fe959a56c76ef861e04cc719a8fb", strip_prefix = "rules_foreign_cc-14ded03b9c835e9ccba6a20f0944729dccab8d9b", url = "https://github.com/bazelbuild/rules_foreign_cc/archive/14ded03b9c835e9ccba6a20f0944729dccab8d9b.tar.gz", ) - maybe( - http_archive, + http_archive( name = "patch", build_file = "//:third_party/patch.BUILD.bazel", sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", From 2b0cdaf5eb234342af80e01755b13fb542c9b733 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 19 Oct 2023 08:40:54 -0700 Subject: [PATCH 61/96] Clean up some more. --- .../pycross/private/tools/wheel_installer.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index d593d58f79..fb3aedf24f 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -104,7 +104,7 @@ def main(args: Any) -> None: patch_args = [args.patch_tool or Path.cwd() / args.patch_tool_target] + args.patch_arg patch_dir = args.patch_dir or "." - for patch in args.patch or []: + for patch in args.patch: with patch.open("r") as stdin: try: subprocess.run( @@ -153,6 +153,7 @@ def parse_flags(argv) -> Any: parser.add_argument( "--patch", type=Path, + default=[], action="append", help="A patch file to apply.", ) @@ -162,25 +163,27 @@ def parse_flags(argv) -> Any: type=Path, default=[], action="append", - help="An argument for the patch_tool when applying the patches.", + help="An argument for the patch tool when applying the patches.", ) parser.add_argument( "--patch-tool", type=str, - help="The tool to invoke when applying patches.", + help=("The tool from PATH to invoke when applying patches. " + "If set, --patch-tool-target is ignored."), ) parser.add_argument( "--patch-tool-target", type=Path, - help="The tool to invoke when applying patches.", + help=("The path to the tool to invoke when applying patches. " + "Ignored when --patch-tool is set."), ) parser.add_argument( "--patch-dir", type=str, - help="The directory from which to invoke patch_tool.", + help="The directory from which to invoke the patch tool.", ) return parser.parse_args(argv[1:]) From 7855521d532fef461758bf1f4585f25dfb530189 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 19 Oct 2023 08:41:15 -0700 Subject: [PATCH 62/96] buildifier --- internal_setup.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal_setup.bzl b/internal_setup.bzl index eb18fbebe0..d8ad049f94 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -17,8 +17,8 @@ load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") load("@build_bazel_integration_testing//tools:repositories.bzl", "bazel_binaries") load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") -load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") +load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS") load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:internal_config_repo.bzl", "internal_config_repo") # buildifier: disable=bzl-visibility From 03d5b57d51c281984c47320c386dfa4e0f4ccacf Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Thu, 19 Oct 2023 08:44:49 -0700 Subject: [PATCH 63/96] black --- .../pycross/private/tools/wheel_installer.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index fb3aedf24f..ad99c1e314 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -102,7 +102,9 @@ def main(args: Any) -> None: if not args.patch_tool and not args.patch_tool_target: raise ValueError("Specify one of 'patch_tool' or 'patch_tool_target'.") - patch_args = [args.patch_tool or Path.cwd() / args.patch_tool_target] + args.patch_arg + patch_args = [ + args.patch_tool or Path.cwd() / args.patch_tool_target + ] + args.patch_arg patch_dir = args.patch_dir or "." for patch in args.patch: with patch.open("r") as stdin: @@ -169,15 +171,19 @@ def parse_flags(argv) -> Any: parser.add_argument( "--patch-tool", type=str, - help=("The tool from PATH to invoke when applying patches. " - "If set, --patch-tool-target is ignored."), + help=( + "The tool from PATH to invoke when applying patches. " + "If set, --patch-tool-target is ignored." + ), ) parser.add_argument( "--patch-tool-target", type=Path, - help=("The path to the tool to invoke when applying patches. " - "Ignored when --patch-tool is set."), + help=( + "The path to the tool to invoke when applying patches. " + "Ignored when --patch-tool is set." + ), ) parser.add_argument( From 1d4f48a99b50568b9da4a5338723a9c3f36cebb4 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 1 Nov 2023 07:49:58 -0700 Subject: [PATCH 64/96] Go back to using host patch --- internal_deps.bzl | 17 ------------- internal_setup.bzl | 3 --- tests/pycross/BUILD.bazel | 8 +++++- tests/pycross/py_wheel_library_test.py | 2 ++ third_party/patch.BUILD.bazel | 34 -------------------------- third_party/patch.bzl | 27 -------------------- 6 files changed, 9 insertions(+), 82 deletions(-) delete mode 100644 third_party/patch.BUILD.bazel delete mode 100644 third_party/patch.bzl diff --git a/internal_deps.bzl b/internal_deps.bzl index 6fdb4241f5..d2181d6f0f 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -213,20 +213,3 @@ def rules_python_internal_deps(): ], sha256 = "4531deccb913639c30e5c7512a054d5d875698daeb75d8cf90f284375fe7c360", ) - - http_archive( - name = "rules_foreign_cc", - sha256 = "1c726b3ddcbf9061cca885fed3101a7966f0fe959a56c76ef861e04cc719a8fb", - strip_prefix = "rules_foreign_cc-14ded03b9c835e9ccba6a20f0944729dccab8d9b", - url = "https://github.com/bazelbuild/rules_foreign_cc/archive/14ded03b9c835e9ccba6a20f0944729dccab8d9b.tar.gz", - ) - - http_archive( - name = "patch", - build_file = "//:third_party/patch.BUILD.bazel", - sha256 = "8cf86e00ad3aaa6d26aca30640e86b0e3e1f395ed99f189b06d4c9f74bc58a4e", - strip_prefix = "patch-2.7.6", - urls = [ - "http://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.gz", - ], - ) diff --git a/internal_setup.bzl b/internal_setup.bzl index d8ad049f94..0c9d6c48a6 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -17,7 +17,6 @@ load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") load("@build_bazel_integration_testing//tools:repositories.bzl", "bazel_binaries") load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") -load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS") load("//python/pip_install:repositories.bzl", "pip_install_dependencies") @@ -40,5 +39,3 @@ def rules_python_internal_setup(): rules_proto_toolchains() protobuf_deps() - - rules_foreign_cc_dependencies() diff --git a/tests/pycross/BUILD.bazel b/tests/pycross/BUILD.bazel index c54d2009ee..f1855cad4a 100644 --- a/tests/pycross/BUILD.bazel +++ b/tests/pycross/BUILD.bazel @@ -12,9 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//python:defs.bzl", "py_test") +load("//python:defs.bzl", "py_binary", "py_test") load("//third_party/rules_pycross/pycross/private:wheel_library.bzl", "py_wheel_library") # buildifier: disable=bzl-visibility +py_binary( + name = "unix_patcher", + srcs = ["unix_patcher.py"], +) + py_wheel_library( name = "extracted_wheel_for_testing", patch_args = [ @@ -23,6 +28,7 @@ py_wheel_library( patches = [ "0001-Add-new-file-for-testing-patch-support.patch", ], + patch_tool_target = ":unix_patcher", wheel = "@wheel_for_testing//file", ) diff --git a/tests/pycross/py_wheel_library_test.py b/tests/pycross/py_wheel_library_test.py index 7b29c14812..1f99488c79 100644 --- a/tests/pycross/py_wheel_library_test.py +++ b/tests/pycross/py_wheel_library_test.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import platform import unittest from pathlib import Path @@ -41,6 +42,7 @@ def test_file_presence(self): (self.extraction_dir / path).exists(), f"{path} does not exist" ) + @unittest.skipIf(platform.system() == "Windows", "Patching on Windows is currently not supported.") def test_patched_file_contents(self): """Validate that the patch got applied correctly.""" file = self.extraction_dir / "site-packages/numpy/file_added_via_patch.txt" diff --git a/third_party/patch.BUILD.bazel b/third_party/patch.BUILD.bazel deleted file mode 100644 index c41742ca7b..0000000000 --- a/third_party/patch.BUILD.bazel +++ /dev/null @@ -1,34 +0,0 @@ -load("@rules_foreign_cc//foreign_cc:defs.bzl", "configure_make") -load("@bazel_skylib//rules:copy_file.bzl", "copy_file") -load("@rules_python//:third_party/patch.bzl", "find_patch_executable") - -filegroup( - name = "srcs", - srcs = glob([ - "**/*", - "*/*", - ]), -) - -configure_make( - name = "patch_make", - lib_source = ":srcs", - out_binaries = [ - "patch", - ], -) - -# The configure_make rule automatically includes the header file "include" -# directory. We need to filter out just the patch binary itself. -find_patch_executable( - name = "find_patch", - src = ":patch_make", -) - -copy_file( - name = "patch_binary", - out = "patch", - src = ":find_patch", - is_executable = True, - visibility = ["//visibility:public"], -) diff --git a/third_party/patch.bzl b/third_party/patch.bzl deleted file mode 100644 index 700c2a6316..0000000000 --- a/third_party/patch.bzl +++ /dev/null @@ -1,27 +0,0 @@ -"""Helper rule for using the GNU patch binary.""" - -def _find_patch_executable_impl(ctx): - """Find the patch binary among the specified files. - - The configure_make rule includes too many files to be usable as-is. - We need to find the binary we care about. - """ - patch_binary = None - for file in ctx.attr.src.files.to_list(): - if not file.is_directory: - if patch_binary: - fail("Found 2 candidates for patch binary. %s and %s" % - (patch_binary.path, file.path)) - patch_binary = file - if not patch_binary: - fail("Could not find patch binary.") - return [DefaultInfo(files = depset([patch_binary]))] - -find_patch_executable = rule( - implementation = _find_patch_executable_impl, - attrs = { - "src": attr.label( - mandatory = True, - ), - }, -) From 13d59d35d9962686a7554b6bb2366b6afa613500 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 1 Nov 2023 07:51:56 -0700 Subject: [PATCH 65/96] buildifier --- tests/pycross/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pycross/BUILD.bazel b/tests/pycross/BUILD.bazel index f1855cad4a..9d3673f999 100644 --- a/tests/pycross/BUILD.bazel +++ b/tests/pycross/BUILD.bazel @@ -25,10 +25,10 @@ py_wheel_library( patch_args = [ "-p1", ], + patch_tool_target = ":unix_patcher", patches = [ "0001-Add-new-file-for-testing-patch-support.patch", ], - patch_tool_target = ":unix_patcher", wheel = "@wheel_for_testing//file", ) From 50b4739711aa43b9cf0d6a7d729ee80b4c6942d9 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 1 Nov 2023 07:52:07 -0700 Subject: [PATCH 66/96] black --- tests/pycross/py_wheel_library_test.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/pycross/py_wheel_library_test.py b/tests/pycross/py_wheel_library_test.py index 1f99488c79..0ba8605498 100644 --- a/tests/pycross/py_wheel_library_test.py +++ b/tests/pycross/py_wheel_library_test.py @@ -42,7 +42,10 @@ def test_file_presence(self): (self.extraction_dir / path).exists(), f"{path} does not exist" ) - @unittest.skipIf(platform.system() == "Windows", "Patching on Windows is currently not supported.") + @unittest.skipIf( + platform.system() == "Windows", + "Patching on Windows is currently not supported.", + ) def test_patched_file_contents(self): """Validate that the patch got applied correctly.""" file = self.extraction_dir / "site-packages/numpy/file_added_via_patch.txt" From 7619780e17bcaa7b53ddd9f09f47d4801ee1b045 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 1 Nov 2023 07:55:33 -0700 Subject: [PATCH 67/96] fail if user doesn't provide a patch tool. --- third_party/rules_pycross/pycross/private/wheel_library.bzl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index 332dd5d27c..41032716fc 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -178,7 +178,8 @@ def py_wheel_library(patches = None, patch_tool = None, patch_tool_target = None # If the user has specified patches, but hasn't specified how to apply # those patches, default to our internally-provided patch binary. if patches and not patch_tool and not patch_tool_target: - patch_tool_target = "@patch//:patch_binary" + fail("Patches specified, but missing `patch_tool` or `patch_tool_target` attributes. " + + "I.e. unsure how to apply patches.") _py_wheel_library( patches = patches, From a4c5c69db07e479b4767c01f466e47f87ee55134 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Wed, 1 Nov 2023 07:58:15 -0700 Subject: [PATCH 68/96] add missing file --- tests/pycross/unix_patcher.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/pycross/unix_patcher.py diff --git a/tests/pycross/unix_patcher.py b/tests/pycross/unix_patcher.py new file mode 100644 index 0000000000..b1e45fbd50 --- /dev/null +++ b/tests/pycross/unix_patcher.py @@ -0,0 +1,32 @@ +# Copyright 2023 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 os +import platform +import sys + + +def main(argv): + # For the purposes of our pycross testing, we can skip patching on Windows + # for now. We don't have a great way to do that at the moment. + if platform.system() == "Windwos": + print("Applying patches on Windows is not supported at the moment.") + return + + # On non-Windows systems, delegate to the `patch` tool. + os.execvp("patch", ["patch"] + sys.argv[1:]) + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) From 322e295cc332781db9ad180bc9a5d9da184827e0 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Fri, 3 Nov 2023 05:20:54 -0700 Subject: [PATCH 69/96] fix typo --- tests/pycross/unix_patcher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pycross/unix_patcher.py b/tests/pycross/unix_patcher.py index b1e45fbd50..1ce38c41ca 100644 --- a/tests/pycross/unix_patcher.py +++ b/tests/pycross/unix_patcher.py @@ -20,7 +20,7 @@ def main(argv): # For the purposes of our pycross testing, we can skip patching on Windows # for now. We don't have a great way to do that at the moment. - if platform.system() == "Windwos": + if platform.system() == "Windows": print("Applying patches on Windows is not supported at the moment.") return From a099bda66cfe2c03efe6a5f7f3911709e98c8c7b Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Fri, 3 Nov 2023 05:38:08 -0700 Subject: [PATCH 70/96] import pypiserver --- MODULE.bazel | 1 + python/pip_install/repositories.bzl | 29 +++++++++++++---------- python/pip_install/tools/requirements.txt | 1 + 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 9eae5e7049..b0002c231b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -30,6 +30,7 @@ use_repo( "pypi__pep517", "pypi__pip", "pypi__pip_tools", + "pypi__pypiserver", "pypi__pyproject_hooks", "pypi__setuptools", "pypi__tomli", diff --git a/python/pip_install/repositories.bzl b/python/pip_install/repositories.bzl index 37500a6f1c..1d6b0f3b7b 100644 --- a/python/pip_install/repositories.bzl +++ b/python/pip_install/repositories.bzl @@ -21,8 +21,8 @@ _RULE_DEPS = [ # START: maintained by 'bazel run //tools/private:update_pip_deps' ( "pypi__build", - "https://files.pythonhosted.org/packages/58/91/17b00d5fac63d3dca605f1b8269ba3c65e98059e1fd99d00283e42a454f0/build-0.10.0-py3-none-any.whl", - "af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171", + "https://files.pythonhosted.org/packages/93/dd/b464b728b866aaa62785a609e0dd8c72201d62c5f7c53e7c20f4dceb085f/build-1.0.3-py3-none-any.whl", + "589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f", ), ( "pypi__click", @@ -51,8 +51,8 @@ _RULE_DEPS = [ ), ( "pypi__packaging", - "https://files.pythonhosted.org/packages/ab/c3/57f0601a2d4fe15de7a553c00adbc901425661bf048f2a22dfc500caf121/packaging-23.1-py3-none-any.whl", - "994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl", + "8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", ), ( "pypi__pep517", @@ -61,14 +61,19 @@ _RULE_DEPS = [ ), ( "pypi__pip", - "https://files.pythonhosted.org/packages/50/c2/e06851e8cc28dcad7c155f4753da8833ac06a5c704c109313b8d5a62968a/pip-23.2.1-py3-none-any.whl", - "7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be", + "https://files.pythonhosted.org/packages/47/6a/453160888fab7c6a432a6e25f8afe6256d0d9f2cbd25971021da6491d899/pip-23.3.1-py3-none-any.whl", + "55eb67bb6171d37447e82213be585b75fe2b12b359e993773aca4de9247a052b", ), ( "pypi__pip_tools", "https://files.pythonhosted.org/packages/e8/df/47e6267c6b5cdae867adbdd84b437393e6202ce4322de0a5e0b92960e1d6/pip_tools-7.3.0-py3-none-any.whl", "8717693288720a8c6ebd07149c93ab0be1fced0b5191df9e9decd3263e20d85e", ), + ( + "pypi__pypiserver", + "https://files.pythonhosted.org/packages/34/95/6c70e2f7e8375354fd7b1db08405c93674f2e4ce4e714f379fadd06a92b1/pypiserver-2.0.1-py2.py3-none-any.whl", + "1dd98fb99d2da4199fb44c7284e57d69a9f7fda2c6c8dc01975c151c592677bf", + ), ( "pypi__pyproject_hooks", "https://files.pythonhosted.org/packages/d5/ea/9ae603de7fbb3df820b23a70f6aff92bf8c7770043254ad8d2dc9d6bcba4/pyproject_hooks-1.0.0-py3-none-any.whl", @@ -76,8 +81,8 @@ _RULE_DEPS = [ ), ( "pypi__setuptools", - "https://files.pythonhosted.org/packages/4f/ab/0bcfebdfc3bfa8554b2b2c97a555569c4c1ebc74ea288741ea8326c51906/setuptools-68.1.2-py3-none-any.whl", - "3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b", + "https://files.pythonhosted.org/packages/bb/26/7945080113158354380a12ce26873dd6c1ebd88d47f5bc24e2c5bb38c16a/setuptools-68.2.2-py3-none-any.whl", + "b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a", ), ( "pypi__tomli", @@ -86,13 +91,13 @@ _RULE_DEPS = [ ), ( "pypi__wheel", - "https://files.pythonhosted.org/packages/b8/8b/31273bf66016be6ad22bb7345c37ff350276cfd46e389a0c2ac5da9d9073/wheel-0.41.2-py3-none-any.whl", - "75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8", + "https://files.pythonhosted.org/packages/fa/7f/4c07234086edbce4a0a446209dc0cb08a19bb206a3ea53b2f56a403f983b/wheel-0.41.3-py3-none-any.whl", + "488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942", ), ( "pypi__zipp", - "https://files.pythonhosted.org/packages/8c/08/d3006317aefe25ea79d3b76c9650afabaf6d63d1c8443b236e7405447503/zipp-3.16.2-py3-none-any.whl", - "679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", + "https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl", + "0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", ), # END: maintained by 'bazel run //tools/private:update_pip_deps' ] diff --git a/python/pip_install/tools/requirements.txt b/python/pip_install/tools/requirements.txt index bf9fe46afd..e4e6bed4ba 100755 --- a/python/pip_install/tools/requirements.txt +++ b/python/pip_install/tools/requirements.txt @@ -12,3 +12,4 @@ setuptools tomli wheel zipp +pypiserver From b2b9fd7c844f57c39fdbc722f3197fcce124bf55 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Fri, 3 Nov 2023 09:43:56 -0700 Subject: [PATCH 71/96] Run compile_pip_requirements against a pypiserver --- .bazelrc | 4 +- tests/BUILD.bazel | 8 +++ .../.gitignore | 1 + .../BUILD.bazel | 51 +++++++++++++++++++ .../MODULE.bazel | 22 ++++++++ .../WORKSPACE | 2 + .../pypiserver_runner.py | 9 ++++ .../requirements.in | 1 + .../requirements_lock.txt | 0 tests/pypiserver.py | 2 + 10 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 tests/compile_pip_requirements_bazel_test/.gitignore create mode 100644 tests/compile_pip_requirements_bazel_test/BUILD.bazel create mode 100644 tests/compile_pip_requirements_bazel_test/MODULE.bazel create mode 100644 tests/compile_pip_requirements_bazel_test/WORKSPACE create mode 100644 tests/compile_pip_requirements_bazel_test/pypiserver_runner.py create mode 100644 tests/compile_pip_requirements_bazel_test/requirements.in create mode 100644 tests/compile_pip_requirements_bazel_test/requirements_lock.txt create mode 100644 tests/pypiserver.py diff --git a/.bazelrc b/.bazelrc index 2935f2782d..d53802ae9b 100644 --- a/.bazelrc +++ b/.bazelrc @@ -3,8 +3,8 @@ # 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/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/proto,tests/compile_pip_requirements,tests/compile_pip_requirements_test_from_external_workspace,tests/ignore_root_user_error,tests/pip_repository_entry_points -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/proto,tests/compile_pip_requirements,tests/compile_pip_requirements_test_from_external_workspace,tests/ignore_root_user_error,tests/pip_repository_entry_points +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/proto,tests/compile_pip_requirements,tests/compile_pip_requirements_bazel_test,tests/compile_pip_requirements_test_from_external_workspace,tests/ignore_root_user_error,tests/pip_repository_entry_points +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/proto,tests/compile_pip_requirements,tests/compile_pip_requirements_bazel_test,tests/compile_pip_requirements_test_from_external_workspace,tests/ignore_root_user_error,tests/pip_repository_entry_points test --test_output=errors diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel index 70dfa48857..45db923dce 100644 --- a/tests/BUILD.bazel +++ b/tests/BUILD.bazel @@ -1,10 +1,18 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("//python:defs.bzl", "py_binary") load("//tools/bazel_integration_test:bazel_integration_test.bzl", "bazel_integration_test") package(default_visibility = ["//visibility:public"]) licenses(["notice"]) +py_binary( + name = "pypiserver", + srcs = ["pypiserver.py"], + deps = ["@pypi__pypiserver//:lib"], + visibility = ["//visibility:public"], +) + bazel_integration_test( name = "pip_repository_entry_points_example", timeout = "long", diff --git a/tests/compile_pip_requirements_bazel_test/.gitignore b/tests/compile_pip_requirements_bazel_test/.gitignore new file mode 100644 index 0000000000..ac51a054d2 --- /dev/null +++ b/tests/compile_pip_requirements_bazel_test/.gitignore @@ -0,0 +1 @@ +bazel-* diff --git a/tests/compile_pip_requirements_bazel_test/BUILD.bazel b/tests/compile_pip_requirements_bazel_test/BUILD.bazel new file mode 100644 index 0000000000..a3b430e28f --- /dev/null +++ b/tests/compile_pip_requirements_bazel_test/BUILD.bazel @@ -0,0 +1,51 @@ +load("@rules_python//python:pip.bzl", "compile_pip_requirements") +load("@rules_python//python:packaging.bzl", "py_wheel") + +compile_pip_requirements( + name = "requirements", + src = "requirements.in", + requirements_txt = "requirements_lock.txt", + args = [ + "--index-url", + "http://localhost:8989/simple/", + ], +) + +py_wheel( + name = "pkg_a", + distribution = "pkg-a", + version = "1.0", + requires = ["pkg-b"], +) + +py_wheel( + name = "pkg_b", + distribution = "pkg-b", + version = "1.1", + requires = ["pkg-c", "pkg-d"], +) + +py_wheel( + name = "pkg_c", + distribution = "pkg-c", + version = "2.0", +) + +py_wheel( + name = "pkg_d", + distribution = "pkg-d", + version = "3.0", +) + +py_binary( + name = "pypiserver_runner", + srcs = ["pypiserver_runner.py"], + data = [ + ":pkg-a", + ":pkg-b", + ":pkg-c", + ":pkg-d", + "@rules_python//tests:pypiserver", + "@rules_python//python/runfiles", + ], +) diff --git a/tests/compile_pip_requirements_bazel_test/MODULE.bazel b/tests/compile_pip_requirements_bazel_test/MODULE.bazel new file mode 100644 index 0000000000..0e984fe360 --- /dev/null +++ b/tests/compile_pip_requirements_bazel_test/MODULE.bazel @@ -0,0 +1,22 @@ +module( + name = "example_bzlmod", + version = "0.0.0", + compatibility_level = 1, +) + +bazel_dep(name = "bazel_skylib", version = "1.4.1") +bazel_dep(name = "rules_python", version = "0.0.0") +local_path_override( + module_name = "rules_python", + path = "../..", +) + +# We next initialize the python toolchain using the extension. +# You can set different Python versions in this block. +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python.toolchain( + configure_coverage_tool = True, + # Only set when you have mulitple toolchain versions. + is_default = True, + python_version = "3.9", +) diff --git a/tests/compile_pip_requirements_bazel_test/WORKSPACE b/tests/compile_pip_requirements_bazel_test/WORKSPACE new file mode 100644 index 0000000000..78cc252e57 --- /dev/null +++ b/tests/compile_pip_requirements_bazel_test/WORKSPACE @@ -0,0 +1,2 @@ +# Empty file indicating the root of a Bazel workspace. +# Dependencies and setup are in MODULE.bazel. diff --git a/tests/compile_pip_requirements_bazel_test/pypiserver_runner.py b/tests/compile_pip_requirements_bazel_test/pypiserver_runner.py new file mode 100644 index 0000000000..b330af53e0 --- /dev/null +++ b/tests/compile_pip_requirements_bazel_test/pypiserver_runner.py @@ -0,0 +1,9 @@ +import tempfile + +from python.runfiles import runfiles + +r = runfiles.Create() + +def main(): + with tempfile.TemporaryDirectory + # TODO(phil): Assemble the wheels into a directory and run pypiserver. diff --git a/tests/compile_pip_requirements_bazel_test/requirements.in b/tests/compile_pip_requirements_bazel_test/requirements.in new file mode 100644 index 0000000000..0543075cb5 --- /dev/null +++ b/tests/compile_pip_requirements_bazel_test/requirements.in @@ -0,0 +1 @@ +pkg-a diff --git a/tests/compile_pip_requirements_bazel_test/requirements_lock.txt b/tests/compile_pip_requirements_bazel_test/requirements_lock.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/pypiserver.py b/tests/pypiserver.py new file mode 100644 index 0000000000..b350f2f9b3 --- /dev/null +++ b/tests/pypiserver.py @@ -0,0 +1,2 @@ +from pypiserver.__main__ import main +main() From 5b1e539c298d6a4be853c9de9040a71d016b3ae8 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 3 Dec 2023 14:41:19 -0800 Subject: [PATCH 72/96] minor edits --- tools/bazel_integration_test/bazel_integration_test.bzl | 3 ++- tools/bazel_integration_test/test_runner.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/bazel_integration_test/bazel_integration_test.bzl b/tools/bazel_integration_test/bazel_integration_test.bzl index c016551319..f30c198519 100644 --- a/tools/bazel_integration_test/bazel_integration_test.bzl +++ b/tools/bazel_integration_test/bazel_integration_test.bzl @@ -84,7 +84,7 @@ _config = rule( attrs = _ATTRS, ) -def bazel_integration_test(name, override_bazel_version = None, bzlmod = False, dirname = None, **kwargs): +def bazel_integration_test(name, override_bazel_version = None, bazel_commands = None, bzlmod = False, dirname = None, **kwargs): """Wrapper macro to set default srcs and run a py_test with config Args: @@ -111,6 +111,7 @@ def bazel_integration_test(name, override_bazel_version = None, bzlmod = False, name = "_%s_config" % name, workspace_files = workspace_files, bazel_binary = bazel_binary, + bazel_commands = bazel_commands, bzlmod = bzlmod, ) diff --git a/tools/bazel_integration_test/test_runner.py b/tools/bazel_integration_test/test_runner.py index 3940e87c37..29de14f072 100644 --- a/tools/bazel_integration_test/test_runner.py +++ b/tools/bazel_integration_test/test_runner.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import argparse import json import os import platform From 93d3edcbb69cbd80b2fbd13feb05cd037cb60550 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 3 Dec 2023 14:57:10 -0800 Subject: [PATCH 73/96] Split test cases to avoid unix_patcher.py --- tests/pycross/BUILD.bazel | 34 ++++++++++++++++++++------ tests/pycross/py_wheel_library_test.py | 10 -------- tests/pycross/unix_patcher.py | 32 ------------------------ 3 files changed, 26 insertions(+), 50 deletions(-) delete mode 100644 tests/pycross/unix_patcher.py diff --git a/tests/pycross/BUILD.bazel b/tests/pycross/BUILD.bazel index 9d3673f999..43c523591d 100644 --- a/tests/pycross/BUILD.bazel +++ b/tests/pycross/BUILD.bazel @@ -15,30 +15,48 @@ load("//python:defs.bzl", "py_binary", "py_test") load("//third_party/rules_pycross/pycross/private:wheel_library.bzl", "py_wheel_library") # buildifier: disable=bzl-visibility -py_binary( - name = "unix_patcher", - srcs = ["unix_patcher.py"], +py_wheel_library( + name = "extracted_wheel_for_testing", + wheel = "@wheel_for_testing//file", +) + +py_test( + name = "py_wheel_library_test", + srcs = [ + "py_wheel_library_test.py", + ], + data = [ + ":extracted_wheel_for_testing", + ], + deps = [ + "//python/runfiles", + ], ) py_wheel_library( - name = "extracted_wheel_for_testing", + name = "patched_extracted_wheel_for_testing", patch_args = [ "-p1", ], - patch_tool_target = ":unix_patcher", + patch_tool = "patch", patches = [ "0001-Add-new-file-for-testing-patch-support.patch", ], wheel = "@wheel_for_testing//file", + target_compatible_with = select({ + # We don't have `patch` available on the Windows CI machines. + "@platforms//os:windows": ["@platforms//:incompatible"], + "//conditions:default": [], + }), ) py_test( - name = "py_wheel_library_test", + name = "patched_py_wheel_library_test", srcs = [ - "py_wheel_library_test.py", + "patched_py_wheel_library_test.py", ], data = [ - ":extracted_wheel_for_testing", + ":patched_extracted_wheel_for_testing", ], deps = [ "//python/runfiles", diff --git a/tests/pycross/py_wheel_library_test.py b/tests/pycross/py_wheel_library_test.py index 0ba8605498..25d896a1ae 100644 --- a/tests/pycross/py_wheel_library_test.py +++ b/tests/pycross/py_wheel_library_test.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import platform import unittest from pathlib import Path @@ -42,15 +41,6 @@ def test_file_presence(self): (self.extraction_dir / path).exists(), f"{path} does not exist" ) - @unittest.skipIf( - platform.system() == "Windows", - "Patching on Windows is currently not supported.", - ) - def test_patched_file_contents(self): - """Validate that the patch got applied correctly.""" - file = self.extraction_dir / "site-packages/numpy/file_added_via_patch.txt" - self.assertEqual(file.read_text(), "Hello from a patch!\n") - if __name__ == "__main__": unittest.main() diff --git a/tests/pycross/unix_patcher.py b/tests/pycross/unix_patcher.py deleted file mode 100644 index 1ce38c41ca..0000000000 --- a/tests/pycross/unix_patcher.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2023 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 os -import platform -import sys - - -def main(argv): - # For the purposes of our pycross testing, we can skip patching on Windows - # for now. We don't have a great way to do that at the moment. - if platform.system() == "Windows": - print("Applying patches on Windows is not supported at the moment.") - return - - # On non-Windows systems, delegate to the `patch` tool. - os.execvp("patch", ["patch"] + sys.argv[1:]) - - -if __name__ == "__main__": - sys.exit(main(sys.argv)) From 05f47a65e60112515fdfa63b6c819c3c13a27ae9 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 3 Dec 2023 15:10:58 -0800 Subject: [PATCH 74/96] fix arg type --- .../rules_pycross/pycross/private/tools/wheel_installer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index ad99c1e314..6ce2643488 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -162,7 +162,7 @@ def parse_flags(argv) -> Any: parser.add_argument( "--patch-arg", - type=Path, + type=str, default=[], action="append", help="An argument for the patch tool when applying the patches.", From a4a2c7181c983cf0f45a037b6a904dbee1553078 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 3 Dec 2023 15:47:40 -0800 Subject: [PATCH 75/96] add warning about non-hermeticity. --- third_party/rules_pycross/pycross/private/wheel_library.bzl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index 41032716fc..e26d939f92 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -142,7 +142,8 @@ This option is required to support some packages which cannot handle the convers ), "patch_tool": attr.string( doc = "The patch(1) utility from the host to use. " + - "If set, overrides `patch_tool_target`.", + "If set, overrides `patch_tool_target`. Please note that setting " + + "this means that builds are not completely hermetic.", ), "patch_tool_target": attr.label( executable = True, From 97c0378b991bbb33696aacdfb67a05386052ad11 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 3 Dec 2023 15:54:33 -0800 Subject: [PATCH 76/96] buildifier --- tests/pycross/BUILD.bazel | 4 +- .../pycross/patched_py_wheel_library_test.py | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 tests/pycross/patched_py_wheel_library_test.py diff --git a/tests/pycross/BUILD.bazel b/tests/pycross/BUILD.bazel index 43c523591d..52d1d18480 100644 --- a/tests/pycross/BUILD.bazel +++ b/tests/pycross/BUILD.bazel @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -load("//python:defs.bzl", "py_binary", "py_test") +load("//python:defs.bzl", "py_test") load("//third_party/rules_pycross/pycross/private:wheel_library.bzl", "py_wheel_library") # buildifier: disable=bzl-visibility py_wheel_library( @@ -42,12 +42,12 @@ py_wheel_library( patches = [ "0001-Add-new-file-for-testing-patch-support.patch", ], - wheel = "@wheel_for_testing//file", target_compatible_with = select({ # We don't have `patch` available on the Windows CI machines. "@platforms//os:windows": ["@platforms//:incompatible"], "//conditions:default": [], }), + wheel = "@wheel_for_testing//file", ) py_test( diff --git a/tests/pycross/patched_py_wheel_library_test.py b/tests/pycross/patched_py_wheel_library_test.py new file mode 100644 index 0000000000..4591187f57 --- /dev/null +++ b/tests/pycross/patched_py_wheel_library_test.py @@ -0,0 +1,38 @@ +# Copyright 2023 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 unittest +from pathlib import Path + +from python.runfiles import runfiles + +RUNFILES = runfiles.Create() + + +class TestPyWheelLibrary(unittest.TestCase): + def setUp(self): + self.extraction_dir = Path( + RUNFILES.Rlocation("rules_python/tests/pycross/patched_extracted_wheel_for_testing") + ) + self.assertTrue(self.extraction_dir.exists(), self.extraction_dir) + self.assertTrue(self.extraction_dir.is_dir(), self.extraction_dir) + + def test_patched_file_contents(self): + """Validate that the patch got applied correctly.""" + file = self.extraction_dir / "site-packages/numpy/file_added_via_patch.txt" + self.assertEqual(file.read_text(), "Hello from a patch!\n") + + +if __name__ == "__main__": + unittest.main() From acc51123d58bb16b37b09bb8126a895061f8fe56 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 3 Dec 2023 17:00:53 -0800 Subject: [PATCH 77/96] fix merge conflict --- .../pycross/private/tools/wheel_installer.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index 3d0633618a..6ce2643488 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -98,16 +98,6 @@ def main(args: Any) -> None: setup_namespace_pkg_compatibility(lib_dir) -<<<<<<< HEAD - patch_args = [args.patch_tool] + args.patch_arg - patch_dir = args.patch_dir or "." - for patch in (args.patch or []): - with patch.open("r") as stdin: - # TODO(philsc): Only print stdout/stderr on failure. - subprocess.run(patch_args, stdin=stdin, check=True, cwd=args.directory / patch_dir) - -||||||| d8966b8 -======= if args.patch: if not args.patch_tool and not args.patch_tool_target: raise ValueError("Specify one of 'patch_tool' or 'patch_tool_target'.") @@ -132,7 +122,6 @@ def main(args: Any) -> None: print(error.stdout.decode("utf-8")) raise ->>>>>>> philsc/add-patch-support-to-py-wheel-library def parse_flags(argv) -> Any: parser = argparse.ArgumentParser(description="Extract a Python wheel.") From 692614273b5274b4bd721b55a4ada528297f243f Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 3 Dec 2023 17:34:15 -0800 Subject: [PATCH 78/96] start exposing some custom wheels --- examples/pypi_install/WORKSPACE | 2 +- examples/pypi_install/wheels/BUILD.bazel | 51 +++++++++++++++++++ .../pypi_install/wheels/pypiserver_runner.py | 29 +++++++++++ examples/pypi_install/wheels/requirements.in | 1 + .../pypi_install/wheels/requirements_lock.txt | 0 python/pip_install/requirements.bzl | 1 - 6 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 examples/pypi_install/wheels/BUILD.bazel create mode 100644 examples/pypi_install/wheels/pypiserver_runner.py create mode 100644 examples/pypi_install/wheels/requirements.in create mode 100644 examples/pypi_install/wheels/requirements_lock.txt diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index 40d79e4116..f6827a67b1 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -1,4 +1,4 @@ -workspace(name = "rules_python_pip_parse_example") +workspace(name = "rules_python_pypi_install_example") local_repository( name = "rules_python", diff --git a/examples/pypi_install/wheels/BUILD.bazel b/examples/pypi_install/wheels/BUILD.bazel new file mode 100644 index 0000000000..1765ac48bb --- /dev/null +++ b/examples/pypi_install/wheels/BUILD.bazel @@ -0,0 +1,51 @@ +load("@rules_python//python:pip.bzl", "compile_pip_requirements") +load("@rules_python//python:packaging.bzl", "py_wheel") + +compile_pip_requirements( + name = "requirements", + src = "requirements.in", + requirements_txt = "requirements_lock.txt", + args = [ + "--index-url", + "http://localhost:8989/simple/", + ], +) + +py_wheel( + name = "pkg_a", + distribution = "pkg-a", + version = "1.0", + requires = ["pkg-b"], +) + +py_wheel( + name = "pkg_b", + distribution = "pkg-b", + version = "1.1", + requires = ["pkg-c", "pkg-d"], +) + +py_wheel( + name = "pkg_c", + distribution = "pkg-c", + version = "2.0", +) + +py_wheel( + name = "pkg_d", + distribution = "pkg-d", + version = "3.0", +) + +py_binary( + name = "pypiserver_runner", + srcs = ["pypiserver_runner.py"], + data = [ + ":pkg_a", + ":pkg_b", + ":pkg_c", + ":pkg_d", + "@rules_python//tests:pypiserver", + "@rules_python//python/runfiles", + ], +) diff --git a/examples/pypi_install/wheels/pypiserver_runner.py b/examples/pypi_install/wheels/pypiserver_runner.py new file mode 100644 index 0000000000..5a8367eefa --- /dev/null +++ b/examples/pypi_install/wheels/pypiserver_runner.py @@ -0,0 +1,29 @@ +import tempfile +from pathlib import Path + +from pypiserver.__main__ import main as pypiserver_main + +from python.runfiles import runfiles + +r = runfiles.Create() + +WHEELS = ( + "pkg_a-1.0-py3-none-any.whl", + "pkg_b-1.1-py3-none-any.whl", + "pkg_c-2.0-py3-none-any.whl", + "pkg_d-3.0-py3-none-any.whl", +) + +def main(): + with tempfile.TemporaryDirectory() as tmpdir: + tmpdir = Path(tmpdir) + wheelhouse = tmpdir / "wheelhouse" + wheelhouse.mkdir() + + for wheel in WHEELS: + shutil.copy(r.Rlocation("rules_python_pypi_install_example/wheels/{}".format(wheel)), wheelhouse) + + sys.argv = [ + # TODO(phil): Finish this. + " + pypiserver_main() diff --git a/examples/pypi_install/wheels/requirements.in b/examples/pypi_install/wheels/requirements.in new file mode 100644 index 0000000000..0543075cb5 --- /dev/null +++ b/examples/pypi_install/wheels/requirements.in @@ -0,0 +1 @@ +pkg-a diff --git a/examples/pypi_install/wheels/requirements_lock.txt b/examples/pypi_install/wheels/requirements_lock.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/python/pip_install/requirements.bzl b/python/pip_install/requirements.bzl index 7757bc1579..7ea9a134db 100644 --- a/python/pip_install/requirements.bzl +++ b/python/pip_install/requirements.bzl @@ -152,7 +152,6 @@ def compile_pip_requirements( requirement("build"), requirement("click"), requirement("colorama"), - requirement("packaging"), requirement("importlib_metadata"), requirement("more_itertools"), requirement("packaging"), From d52e57bdbcf21df09c2188d62ca20c48eeef0fde Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 4 Dec 2023 18:45:55 -0800 Subject: [PATCH 79/96] Switch over to use pypiserver more. --- examples/pypi_install/BUILD.bazel | 14 +- .../intermediate_file_x86_64_linux.json | 122 ++-------- examples/pypi_install/main.py | 18 +- examples/pypi_install/requirements.in | 9 +- .../requirements_lock_x86_64_linux.txt | 226 ++---------------- examples/pypi_install/test.py | 10 +- examples/pypi_install/wheels/BUILD.bazel | 40 +++- .../pypi_install/wheels/pypiserver_runner.py | 15 +- examples/pypi_install/wheels/requirements.in | 1 - .../pypi_install/wheels/requirements_lock.txt | 0 examples/pypi_install/wheels/src/pkg_a/foo.py | 2 + python/pip_install/requirements.bzl | 20 +- .../dependency_resolver.py | 1 - 13 files changed, 106 insertions(+), 372 deletions(-) delete mode 100644 examples/pypi_install/wheels/requirements.in delete mode 100644 examples/pypi_install/wheels/requirements_lock.txt create mode 100644 examples/pypi_install/wheels/src/pkg_a/foo.py diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index 5d298030d3..4d6afec36c 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -5,8 +5,7 @@ py_binary( name = "main", srcs = ["main.py"], deps = [ - "@pypi//cognitojwt", - "@pypi//requests", + "@pypi//pkg_a", ], ) @@ -19,7 +18,6 @@ py_test( # This rule adds a convenient way to update the requirements file. compile_pip_requirements( name = "requirements", - extra_args = ["--allow-unsafe"], intermediate_file = { "@//:x86_64_linux": "intermediate_file_x86_64_linux.json", }, @@ -37,6 +35,10 @@ compile_pip_requirements( requirements_txt = { "@//:x86_64_linux": "requirements_lock_x86_64_linux.txt", }, + extra_args = [ + "--index-url", + "http://localhost:8989/simple/", + ], ) py_binary( @@ -53,12 +55,12 @@ config_setting( ) genquery( - name = "cognitojwt_deps", - expression = """filter(@pypi//, kind(".* rule", deps(@pypi//cognitojwt)))""", + name = "pkg_a_deps", + expression = """filter(@pypi//, kind(".* rule", deps(@pypi//pkg_a)))""", opts = [ "--notool_deps", ], - scope = ["@pypi//cognitojwt"], + scope = ["@pypi//pkg_a"], ) sh_test( diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index 2e2f5849b5..a8c30a7e97 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -1,127 +1,37 @@ { - "certifi": { + "pkg-a": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", - "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716", - "deps": [] - } - }, - "cffi": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/2d/86/3ca57cddfa0419f6a95d1c8478f8f622ba597e3581fd501bbb915b20eb75/cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "deps": [ - "pycparser" - ] - } - }, - "charset-normalizer": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/33/97/9967fb2d364a9da38557e4af323abcd58cc05bdd8f77e9fd5ae4882772cc/charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", - "deps": [] - } - }, - "cognitojwt": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/a5/69/97faafdc4f1900fa1b525cedae0f98aa30b0bb086d076f8d66c68a18b1b2/cognitojwt-1.4.1-py3-none-any.whl", - "sha256": "8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce", + "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", + "sha256": "41516d88caba997b8954aca43f3386d36ea505854cb069beba39db7fb490aa02", "deps": [ - "python-jose" + "pkg-b" ] } }, - "cryptography": { + "pkg-b": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/1a/c7/b8193a0859fed883738ae99d33fe90edf05c7e3d0fdb1726f8f53d85859e/cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", - "sha256": "49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83", + "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", + "sha256": "a03f9ddf7d79dead3c9527f3028a531a1787f50b892e76344cfdba395c120bcc", "deps": [ - "cffi" + "pkg-c", + "pkg-d" ] } }, - "ecdsa": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/09/d4/4f05f5d16a4863b30ba96c23b23e942da8889abfa1cdbabf2a0df12a4532/ecdsa-0.18.0-py2.py3-none-any.whl", - "sha256": "80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd", - "deps": [ - "six" - ] - } - }, - "idna": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", - "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", - "deps": [] - } - }, - "pyasn1": { + "pkg-c": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/14/e5/b56a725cbde139aa960c26a1a3ca4d4af437282e20b5314ee6a3501e7dfc/pyasn1-0.5.0-py2.py3-none-any.whl", - "sha256": "87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57", + "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", + "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", "deps": [] } }, - "pycparser": { + "pkg-d": { "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl", - "sha256": "8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", - "deps": [] - } - }, - "python-jose": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/bd/2d/e94b2f7bab6773c70efc70a61d66e312e1febccd9e0db6b9e0adf58cbad1/python_jose-3.3.0-py2.py3-none-any.whl", - "sha256": "9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a", + "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", + "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", "deps": [ - "cryptography", - "ecdsa", - "pyasn1", - "rsa" + "pkg-b" ] } - }, - "requests": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", - "sha256": "58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", - "deps": [ - "certifi", - "charset-normalizer", - "idna", - "urllib3" - ], - "patches": [ - "@//third_party:requests/0001-Add-a-dummy-patch-for-requests.patch" - ], - "patch_args": [ - "-p1" - ], - "patch_dir": "site-packages" - } - }, - "rsa": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", - "sha256": "90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", - "deps": [ - "pyasn1" - ] - } - }, - "six": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", - "sha256": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", - "deps": [] - } - }, - "urllib3": { - "@//:x86_64_linux": { - "url": "https://files.pythonhosted.org/packages/c5/05/c214b32d21c0b465506f95c4f28ccbcba15022e000b043b72b3df7728471/urllib3-1.26.16-py2.py3-none-any.whl", - "sha256": "8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", - "deps": [] - } } } diff --git a/examples/pypi_install/main.py b/examples/pypi_install/main.py index 37e63ebf79..2acff63161 100644 --- a/examples/pypi_install/main.py +++ b/examples/pypi_install/main.py @@ -15,22 +15,18 @@ import sys import pkg_resources -import requests -import requests.hello +import pkg_a.foo -def cognitojwt_version() -> str: - return pkg_resources.require("cognitojwt")[0].version +def pkg_a_version() -> str: + return pkg_resources.require("pkg-a")[0].version -def requests_version() -> str: - return requests.__version__ - -def patched_hello() -> str: - return requests.hello.patched_function() +def pkg_a_function() -> str: + return pkg_a.foo.original_function() def main(argv): - print(f"cognitojwt version: {cognitojwt_version()}") - print(f"requests version: {requests_version()}") + print(f"pkg_a version: {pkg_a_version()}") + print(f"pkg_a function: {pkg_a_function()}") if __name__ == "__main__": sys.exit(main(sys.argv)) diff --git a/examples/pypi_install/requirements.in b/examples/pypi_install/requirements.in index 29d4fe89bb..0543075cb5 100644 --- a/examples/pypi_install/requirements.in +++ b/examples/pypi_install/requirements.in @@ -1,8 +1 @@ -# Dependency which specifies at least one extra in its dependencies. -cognitojwt - -# Common dependency whose functionality is easy to validate. -requests - -# TODO(philsc): Get a package with circular dependencies. -# We want to support those packages. +pkg-a diff --git a/examples/pypi_install/requirements_lock_x86_64_linux.txt b/examples/pypi_install/requirements_lock_x86_64_linux.txt index 8eb4112060..e1c5211f23 100644 --- a/examples/pypi_install/requirements_lock_x86_64_linux.txt +++ b/examples/pypi_install/requirements_lock_x86_64_linux.txt @@ -4,217 +4,19 @@ # # bazel run //:requirements.update # -certifi==2023.5.7 \ - --hash=sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7 \ - --hash=sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716 - # via requests -cffi==1.15.1 \ - --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ - --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ - --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ - --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ - --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ - --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ - --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ - --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ - --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ - --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ - --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ - --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ - --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ - --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ - --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ - --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ - --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ - --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ - --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ - --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ - --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ - --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ - --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ - --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ - --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ - --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ - --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ - --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ - --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ - --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ - --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ - --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ - --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ - --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ - --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ - --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ - --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ - --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ - --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ - --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ - --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ - --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ - --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ - --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ - --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ - --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ - --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ - --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ - --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ - --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ - --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ - --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ - --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ - --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ - --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ - --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ - --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ - --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ - --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ - --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ - --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ - --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ - --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ - --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 - # via cryptography -charset-normalizer==3.1.0 \ - --hash=sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6 \ - --hash=sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1 \ - --hash=sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e \ - --hash=sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373 \ - --hash=sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62 \ - --hash=sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230 \ - --hash=sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be \ - --hash=sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c \ - --hash=sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0 \ - --hash=sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448 \ - --hash=sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f \ - --hash=sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649 \ - --hash=sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d \ - --hash=sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0 \ - --hash=sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706 \ - --hash=sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a \ - --hash=sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59 \ - --hash=sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23 \ - --hash=sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5 \ - --hash=sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb \ - --hash=sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e \ - --hash=sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e \ - --hash=sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c \ - --hash=sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28 \ - --hash=sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d \ - --hash=sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41 \ - --hash=sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974 \ - --hash=sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce \ - --hash=sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f \ - --hash=sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1 \ - --hash=sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d \ - --hash=sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8 \ - --hash=sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017 \ - --hash=sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31 \ - --hash=sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7 \ - --hash=sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8 \ - --hash=sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e \ - --hash=sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14 \ - --hash=sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd \ - --hash=sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d \ - --hash=sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795 \ - --hash=sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b \ - --hash=sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b \ - --hash=sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b \ - --hash=sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203 \ - --hash=sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f \ - --hash=sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19 \ - --hash=sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1 \ - --hash=sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a \ - --hash=sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac \ - --hash=sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9 \ - --hash=sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0 \ - --hash=sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137 \ - --hash=sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f \ - --hash=sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6 \ - --hash=sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5 \ - --hash=sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909 \ - --hash=sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f \ - --hash=sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0 \ - --hash=sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324 \ - --hash=sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755 \ - --hash=sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb \ - --hash=sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854 \ - --hash=sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c \ - --hash=sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60 \ - --hash=sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84 \ - --hash=sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0 \ - --hash=sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b \ - --hash=sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1 \ - --hash=sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531 \ - --hash=sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1 \ - --hash=sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11 \ - --hash=sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326 \ - --hash=sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df \ - --hash=sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab - # via requests -cognitojwt==1.4.1 \ - --hash=sha256:8ee189f82289d140dc750c91e8772436b64b94d071507ace42efc22c525f42ce \ - --hash=sha256:a9f751942517ecf85da9f14674749390aad268e4b0155ef7d133aa50800aa15a +--index-url http://localhost:8989/simple/ + +pkg-a==1.0 \ + --hash=sha256:41516d88caba997b8954aca43f3386d36ea505854cb069beba39db7fb490aa02 # via -r requirements.in -cryptography==41.0.2 \ - --hash=sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711 \ - --hash=sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7 \ - --hash=sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd \ - --hash=sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e \ - --hash=sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58 \ - --hash=sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0 \ - --hash=sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d \ - --hash=sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83 \ - --hash=sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831 \ - --hash=sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766 \ - --hash=sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b \ - --hash=sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c \ - --hash=sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182 \ - --hash=sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f \ - --hash=sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa \ - --hash=sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4 \ - --hash=sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a \ - --hash=sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2 \ - --hash=sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76 \ - --hash=sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5 \ - --hash=sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee \ - --hash=sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f \ - --hash=sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14 - # via python-jose -ecdsa==0.18.0 \ - --hash=sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49 \ - --hash=sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd - # via python-jose -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 - # via requests -pyasn1==0.5.0 \ - --hash=sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57 \ - --hash=sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde +pkg-b==1.1 \ + --hash=sha256:a03f9ddf7d79dead3c9527f3028a531a1787f50b892e76344cfdba395c120bcc # via - # python-jose - # rsa -pycparser==2.21 \ - --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ - --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 - # via cffi -python-jose[cryptography]==3.3.0 \ - --hash=sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a \ - --hash=sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a - # via cognitojwt -requests==2.31.0 \ - --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ - --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 - # via -r requirements.in -rsa==4.9 \ - --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ - --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 - # via python-jose -six==1.16.0 \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via ecdsa -urllib3==1.26.16 \ - --hash=sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f \ - --hash=sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14 - # via requests + # pkg-a + # pkg-d +pkg-c==2.0 \ + --hash=sha256:76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669 + # via pkg-b +pkg-d==3.0 \ + --hash=sha256:f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2 + # via pkg-b diff --git a/examples/pypi_install/test.py b/examples/pypi_install/test.py index f754702dbf..7a450fa08f 100644 --- a/examples/pypi_install/test.py +++ b/examples/pypi_install/test.py @@ -19,11 +19,13 @@ class ExampleTest(unittest.TestCase): def test_main(self): - self.assertEqual("1.4.1", main.cognitojwt_version()) - self.assertEqual("2.31.0", main.requests_version()) + self.assertEqual("1.0", main.pkg_a_version()) - def test_patch(self): - self.assertEqual("Hello from a patch", main.patched_hello()) + def test_original(self): + self.assertEqual("This is pkg_a", main.pkg_a_function()) + + #def test_patch(self): + # self.assertEqual("Hello from a patch", main.patched_hello()) if __name__ == "__main__": diff --git a/examples/pypi_install/wheels/BUILD.bazel b/examples/pypi_install/wheels/BUILD.bazel index 1765ac48bb..a6cd1aa2bf 100644 --- a/examples/pypi_install/wheels/BUILD.bazel +++ b/examples/pypi_install/wheels/BUILD.bazel @@ -1,21 +1,32 @@ +load("@rules_python//python:defs.bzl", "py_library") load("@rules_python//python:pip.bzl", "compile_pip_requirements") -load("@rules_python//python:packaging.bzl", "py_wheel") - -compile_pip_requirements( - name = "requirements", - src = "requirements.in", - requirements_txt = "requirements_lock.txt", - args = [ - "--index-url", - "http://localhost:8989/simple/", - ], -) +load("@rules_python//python:packaging.bzl", "py_package", "py_wheel") + + +[(py_library( + name = "{}_py_library".format(name), + srcs = glob([ + "src/{}/**/*.py".format(name), + ]), +),py_package( + name = "{}_py_package".format(name), + packages = [name], + deps = [":{}_py_library".format(name)], +)) for name in ( + "pkg_a", + "pkg_b", + "pkg_c", + "pkg_d", +)] + py_wheel( name = "pkg_a", distribution = "pkg-a", version = "1.0", requires = ["pkg-b"], + deps = [":pkg_a_py_package"], + strip_path_prefixes = ["src"], ) py_wheel( @@ -23,18 +34,25 @@ py_wheel( distribution = "pkg-b", version = "1.1", requires = ["pkg-c", "pkg-d"], + deps = [":pkg_b_py_package"], + strip_path_prefixes = ["src"], ) py_wheel( name = "pkg_c", distribution = "pkg-c", version = "2.0", + deps = [":pkg_c_py_package"], + strip_path_prefixes = ["src"], ) py_wheel( name = "pkg_d", distribution = "pkg-d", version = "3.0", + requires = ["pkg-b"], + deps = [":pkg_d_py_package"], + strip_path_prefixes = ["src"], ) py_binary( diff --git a/examples/pypi_install/wheels/pypiserver_runner.py b/examples/pypi_install/wheels/pypiserver_runner.py index 5a8367eefa..462f621852 100644 --- a/examples/pypi_install/wheels/pypiserver_runner.py +++ b/examples/pypi_install/wheels/pypiserver_runner.py @@ -1,3 +1,5 @@ +import shutil +import sys import tempfile from pathlib import Path @@ -24,6 +26,15 @@ def main(): shutil.copy(r.Rlocation("rules_python_pypi_install_example/wheels/{}".format(wheel)), wheelhouse) sys.argv = [ - # TODO(phil): Finish this. - " + "pypiserver", + "run", + "-p", + "8989", + str(wheelhouse), + ] + print("Running: " + " ".join(sys.argv)) pypiserver_main() + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/examples/pypi_install/wheels/requirements.in b/examples/pypi_install/wheels/requirements.in deleted file mode 100644 index 0543075cb5..0000000000 --- a/examples/pypi_install/wheels/requirements.in +++ /dev/null @@ -1 +0,0 @@ -pkg-a diff --git a/examples/pypi_install/wheels/requirements_lock.txt b/examples/pypi_install/wheels/requirements_lock.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/examples/pypi_install/wheels/src/pkg_a/foo.py b/examples/pypi_install/wheels/src/pkg_a/foo.py new file mode 100644 index 0000000000..70e4475630 --- /dev/null +++ b/examples/pypi_install/wheels/src/pkg_a/foo.py @@ -0,0 +1,2 @@ +def original_function() -> str: + return "This is pkg_a" diff --git a/python/pip_install/requirements.bzl b/python/pip_install/requirements.bzl index 7ea9a134db..05fcd93ba3 100644 --- a/python/pip_install/requirements.bzl +++ b/python/pip_install/requirements.bzl @@ -132,21 +132,21 @@ def compile_pip_requirements( "--allow-unsafe", ] if generate_hashes: - args.append("--generate-hashes") + args += ["--generate-hashes"] if intermediate_file: - args.append("--intermediate-config") - args.append(_generate_config_select(intermediate_file)) - args.append("--intermediate-file") - args.append(_generate_loc_select(intermediate_file, loc)) + args += ["--intermediate-config"] + args += _generate_config_select(intermediate_file) + args += ["--intermediate-file"] + args += _generate_loc_select(intermediate_file, loc) if intermediate_file_patcher: - args.append("--intermediate-file-patcher={}".format(loc.format(intermediate_file_patcher))) + args += ["--intermediate-file-patcher={}".format(loc.format(intermediate_file_patcher))] if requirements_linux: - args.append("--requirements-linux={}".format(loc.format(requirements_linux))) + args += ["--requirements-linux={}".format(loc.format(requirements_linux))] if requirements_darwin: - args.append("--requirements-darwin={}".format(loc.format(requirements_darwin))) + args += ["--requirements-darwin={}".format(loc.format(requirements_darwin))] if requirements_windows: - args.append("--requirements-windows={}".format(loc.format(requirements_windows))) - args.extend(extra_args) + args += ["--requirements-windows={}".format(loc.format(requirements_windows))] + args += extra_args deps = [ requirement("build"), diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index 28dce855f0..9f3c02fe9f 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -217,7 +217,6 @@ def main( intermediate_file: Optional[str], intermediate_file_patcher: Optional[str], requirements_linux: Optional[str], - requirements_linux: Optional[str], requirements_darwin: Optional[str], requirements_windows: Optional[str], extra_args: Tuple[str, ...], From a8c12de84c2934b723f66747cbbc58aaeeb13040 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 4 Dec 2023 19:28:42 -0800 Subject: [PATCH 80/96] Fix a few more bugs --- examples/pypi_install/BUILD.bazel | 5 +++ examples/pypi_install/WORKSPACE | 6 +-- .../intermediate_file_x86_64_linux.json | 2 +- .../requirements_lock_x86_64_linux.txt | 2 +- examples/pypi_install/wheels/BUILD.bazel | 10 ++--- python/private/pypi.bzl | 37 +++++++++++------ python/private/pypi_repo.bzl | 41 +++++-------------- 7 files changed, 50 insertions(+), 53 deletions(-) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index 4d6afec36c..539f0530cc 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -36,6 +36,11 @@ compile_pip_requirements( "@//:x86_64_linux": "requirements_lock_x86_64_linux.txt", }, extra_args = [ + # Since we may frequently tweak the wheels for development, we can't + # really rely on consistent hashes. + "--no-reuse-hashes", + # Point at the server run via: + # bazel run //wheels:pypiserver_runner "--index-url", "http://localhost:8989/simple/", ], diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index f6827a67b1..f4c330c7c8 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -27,9 +27,9 @@ pypi_install( # repo-relative. # TODO(phil): Add test to make sure that the config settings are mutually # exclusive. - pip_installation_report = { - "@//:x86_64_linux": "//:intermediate_file_x86_64_linux.json", - }, + pip_installation_report = [ + "//:intermediate_file_x86_64_linux.json", + ], ) load("@pypi_install//:packages.bzl", "load_pypi_packages") diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index a8c30a7e97..abd5a20210 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -2,7 +2,7 @@ "pkg-a": { "@//:x86_64_linux": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", - "sha256": "41516d88caba997b8954aca43f3386d36ea505854cb069beba39db7fb490aa02", + "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", "deps": [ "pkg-b" ] diff --git a/examples/pypi_install/requirements_lock_x86_64_linux.txt b/examples/pypi_install/requirements_lock_x86_64_linux.txt index e1c5211f23..7c72eaf551 100644 --- a/examples/pypi_install/requirements_lock_x86_64_linux.txt +++ b/examples/pypi_install/requirements_lock_x86_64_linux.txt @@ -7,7 +7,7 @@ --index-url http://localhost:8989/simple/ pkg-a==1.0 \ - --hash=sha256:41516d88caba997b8954aca43f3386d36ea505854cb069beba39db7fb490aa02 + --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 # via -r requirements.in pkg-b==1.1 \ --hash=sha256:a03f9ddf7d79dead3c9527f3028a531a1787f50b892e76344cfdba395c120bcc diff --git a/examples/pypi_install/wheels/BUILD.bazel b/examples/pypi_install/wheels/BUILD.bazel index a6cd1aa2bf..a2b0684cb3 100644 --- a/examples/pypi_install/wheels/BUILD.bazel +++ b/examples/pypi_install/wheels/BUILD.bazel @@ -10,7 +10,7 @@ load("@rules_python//python:packaging.bzl", "py_package", "py_wheel") ]), ),py_package( name = "{}_py_package".format(name), - packages = [name], + packages = ["wheels.src.{}".format(name)], deps = [":{}_py_library".format(name)], )) for name in ( "pkg_a", @@ -26,7 +26,7 @@ py_wheel( version = "1.0", requires = ["pkg-b"], deps = [":pkg_a_py_package"], - strip_path_prefixes = ["src"], + strip_path_prefixes = ["wheels/src"], ) py_wheel( @@ -35,7 +35,7 @@ py_wheel( version = "1.1", requires = ["pkg-c", "pkg-d"], deps = [":pkg_b_py_package"], - strip_path_prefixes = ["src"], + strip_path_prefixes = ["wheels/src"], ) py_wheel( @@ -43,7 +43,7 @@ py_wheel( distribution = "pkg-c", version = "2.0", deps = [":pkg_c_py_package"], - strip_path_prefixes = ["src"], + strip_path_prefixes = ["wheels/src"], ) py_wheel( @@ -52,7 +52,7 @@ py_wheel( version = "3.0", requires = ["pkg-b"], deps = [":pkg_d_py_package"], - strip_path_prefixes = ["src"], + strip_path_prefixes = ["wheels/src"], ) py_binary( diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index 4efe329257..b6530fe1c5 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -34,14 +34,23 @@ def generate_package_alias(intermediate): info_per_config = intermediate[package] actual_select = {} + underlying_lib_select = {} target_compatible_with_select = { "//conditions:default": ["@platforms//:incompatible"], } for config, info in info_per_config.items(): repo_name = generate_repo_name_for_extracted_wheel(package, info) actual_select[config] = "@{}//:library".format(repo_name) + underlying_lib_select[config] = "@{}//:underlying_library".format(repo_name) target_compatible_with_select[config] = [] + native.alias( + name = "underlying_{}".format(package), + actual = select(underlying_lib_select), + target_compatible_with = select(target_compatible_with_select), + visibility = ["//visibility:public"], + ) + native.alias( name = package, actual = select(actual_select), @@ -80,33 +89,35 @@ def _accumulate_transitive_deps_inner(intermediate, configs, package, already_ac if sets.length(pending_deps) > 0: fail("Failed to accumulate the transitive deps for {} in 1000 iterations!".format(package)) -def _accumulate_transitive_deps(intermediate, configs, package): - already_accumulated = {config: sets.make([package]) for config in configs} - _accumulate_transitive_deps_inner(intermediate, configs, package, already_accumulated) +def _accumulate_transitive_deps(intermediate, all_configs, package): + already_accumulated = {config: sets.make([package]) for config in all_configs} + _accumulate_transitive_deps_inner(intermediate, all_configs, package, already_accumulated) return {config: sets.to_list(sets.remove(set, package)) for config, set in already_accumulated.items()} def to_alias_refs(alias_repo_name, deps): - return ["@{}//{}".format(alias_repo_name, dep) for dep in deps] + return ["@{}//{}:underlying_{}".format(alias_repo_name, dep, dep) for dep in deps] -def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, intermediate, configs, package): +def wrapped_py_wheel_library(name, alias_repo_name, wheel_repo_name, intermediate, all_configs, package): kwargs = {} for arg_name, default in _FORWARDED_ARGS: _forward_arg(kwargs, intermediate, package, arg_name, default, _no_transform) - deps_dict = _accumulate_transitive_deps(intermediate, configs, package) + deps_dict = _accumulate_transitive_deps(intermediate, all_configs, package) deps = select({config: to_alias_refs(alias_repo_name, deps) for config, deps in deps_dict.items()}) - # TODO(phil): Probably need to split this in order to support circular - # dependencies. An "underlying" library and a "high level" that depends on - # the transitive closure of underlying libraries. Need to find a good - # example of this though. torch, dvc[gs]==2.43.1, apache-airflow all - # require sdist support. py_wheel_library( - name = name, + name = "underlying_{}".format(name), wheel = "@{}//file".format(wheel_repo_name), enable_implicit_namespace_pkgs = True, # TODO(phil): Can we restrict visibility? visibility = ["//visibility:public"], - deps = deps, **kwargs ) + + py_library( + name = name, + deps = deps + [ + ":underlying_{}".format(name), + ], + visibility = ["//visibility:public"], + ) diff --git a/python/private/pypi_repo.bzl b/python/private/pypi_repo.bzl index 5c46d388fb..09a9b43ef1 100644 --- a/python/private/pypi_repo.bzl +++ b/python/private/pypi_repo.bzl @@ -13,6 +13,7 @@ # limitations under the License. load("@bazel_skylib//lib:paths.bzl", "paths") +load("@bazel_skylib//lib:new_sets.bzl", "sets") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:normalize_name.bzl", "normalize_name") @@ -20,11 +21,7 @@ load(":pypi_util.bzl", "generate_repo_name_for_download", "generate_repo_name_fo def pypi_install(pip_installation_report = None, **kwargs): pip_install_dependencies() - - pip_installation_report_swapped = {} - for config_setting, report in pip_installation_report.items(): - pip_installation_report_swapped[report] = config_setting - _pypi_install(pip_installation_report = pip_installation_report_swapped, **kwargs) + _pypi_install(pip_installation_report = pip_installation_report, **kwargs) def _clean_info(info): result = dict(**info) @@ -44,21 +41,18 @@ def _clean_intermediate(intermediate): def _pypi_install_impl(repository_ctx): repository_ctx.file("BUILD.bazel", "\n", executable = False) if repository_ctx.attr.pip_installation_report: - intermediate = _combine_intermediate_files( + intermediate, config_settings = _combine_intermediate_files( repository_ctx, repository_ctx.attr.pip_installation_report, ) else: intermediate = {} - - configs = [] - for package in intermediate: - configs.extend(intermediate[package].keys()) + config_settings = sets.make([]) lines = ["INTERMEDIATE = {}".format(json.encode_indent(_clean_intermediate(intermediate))), ""] repository_ctx.file("intermediate.bzl", "\n".join(lines), executable = False) - lines = ["CONFIGS = {}".format(json.encode_indent(configs)), ""] + lines = ["CONFIGS = {}".format(json.encode_indent(sets.to_list(config_settings))), ""] repository_ctx.file("configs.bzl", "\n".join(lines), executable = False) lines = [ @@ -79,8 +73,7 @@ def _pypi_install_impl(repository_ctx): _pypi_install = repository_rule( implementation = _pypi_install_impl, attrs = { - # TODO(phil): Add support for a single installation report. - "pip_installation_report": attr.label_keyed_string_dict( + "pip_installation_report": attr.label_list( allow_files = True, ), }, @@ -88,10 +81,11 @@ _pypi_install = repository_rule( def _combine_intermediate_files(repository_ctx, installation_reports): combined = {} + all_configs = sets.make([]) # TODO(phil): Figure out how to deal with a single intermediate file. What # "config" setting should that have? - for intermediate_label, config_setting in installation_reports.items(): + for intermediate_label in installation_reports: intermediate = json.decode(repository_ctx.read(intermediate_label)) for package in intermediate: config_settings = intermediate[package].keys() @@ -99,6 +93,7 @@ def _combine_intermediate_files(repository_ctx, installation_reports): fail("Expected 1 config setting for package %s in %s, but got %d." % (package, intermediate_label, len(config_settings))) config_setting = config_settings[0] + sets.insert(all_configs, config_setting) info = combined.setdefault(package, {}) if config_setting in info: @@ -106,7 +101,7 @@ def _combine_intermediate_files(repository_ctx, installation_reports): (package, intermediate_label)) info[config_setting] = intermediate[package][config_setting] - return combined + return combined, all_configs def load_pypi_packages_internal(intermediate, intermediate_repo_name, alias_repo_name, **kwargs): # Only download a wheel/tarball once. We do this by tracking which SHA sums @@ -160,7 +155,7 @@ def _wheel_library_repo_impl(repository_ctx): """ alias_repo_name="{}",""".format(repository_ctx.attr.alias_repo_name), """ wheel_repo_name="{}",""".format(repository_ctx.attr.wheel_repo_name), """ intermediate=INTERMEDIATE,""", - """ configs=CONFIGS,""", + """ all_configs=CONFIGS,""", """ package="{}",""".format(repository_ctx.attr.intermediate_package), """)""", ] @@ -183,11 +178,6 @@ def _generate_package_aliases_impl(repository_ctx): fail("Expected intermediate.bzl to start with 'INTERMEDIATE = '. Did the implementation get out of sync?") intermediate = json.decode(bzl_intermediate[len("INTERMEDIATE = "):]) - dep_tracked_lines = [ - """load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")""", - """""", - ] - for package in intermediate: lines = [ """load("{}", "INTERMEDIATE")""".format(repository_ctx.attr.intermediate), @@ -196,15 +186,6 @@ def _generate_package_aliases_impl(repository_ctx): ] repository_ctx.file("{}/BUILD.bazel".format(package), "\n".join(lines), executable = False) - dep_tracked_lines += [ - """bool_flag(""", - """ name="{}",""".format(package), - """ build_setting_default = False,""", - """)""", - ] - - repository_ctx.file("_package_already_included/BUILD.bazel", "\n".join(dep_tracked_lines), executable = False) - generate_package_aliases = repository_rule( implementation = _generate_package_aliases_impl, attrs = { From 4ac70e634ecbf52269cc9f312f8d159b381c9e68 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 4 Dec 2023 20:30:13 -0800 Subject: [PATCH 81/96] Add genquery tests for circular dependencies --- examples/pypi_install/BUILD.bazel | 28 ++++++++++------ examples/pypi_install/cognitojwt_deps_test.sh | 32 ------------------- examples/pypi_install/pkg_a_deps.txt | 4 +++ examples/pypi_install/pkg_d_deps.txt | 3 ++ 4 files changed, 26 insertions(+), 41 deletions(-) delete mode 100755 examples/pypi_install/cognitojwt_deps_test.sh create mode 100755 examples/pypi_install/pkg_a_deps.txt create mode 100755 examples/pypi_install/pkg_d_deps.txt diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index 539f0530cc..f66243587b 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -1,5 +1,6 @@ load("@rules_python//python:defs.bzl", "py_binary", "py_test") load("@rules_python//python:pip.bzl", "compile_pip_requirements") +load("@bazel_skylib//rules:diff_test.bzl", "diff_test") py_binary( name = "main", @@ -62,16 +63,25 @@ config_setting( genquery( name = "pkg_a_deps", expression = """filter(@pypi//, kind(".* rule", deps(@pypi//pkg_a)))""", - opts = [ - "--notool_deps", - ], + opts = ["--notool_deps"], scope = ["@pypi//pkg_a"], ) -sh_test( - name = "cognitojwt_deps_test", - srcs = ["cognitojwt_deps_test.sh"], - data = [ - ":cognitojwt_deps", - ], +diff_test( + name = "pkg_a_deps_test", + file1 = ":pkg_a_deps", + file2 = "pkg_a_deps.txt", +) + +genquery( + name = "pkg_d_deps", + expression = """filter(@pypi//, kind(".* rule", deps(@pypi//pkg_d)))""", + opts = ["--notool_deps"], + scope = ["@pypi//pkg_d"], +) + +diff_test( + name = "pkg_d_deps_test", + file1 = ":pkg_d_deps", + file2 = "pkg_d_deps.txt", ) diff --git a/examples/pypi_install/cognitojwt_deps_test.sh b/examples/pypi_install/cognitojwt_deps_test.sh deleted file mode 100755 index d4e6843d32..0000000000 --- a/examples/pypi_install/cognitojwt_deps_test.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -set -o errexit -set -o nounset -set -o pipefail - -GENQUERY_OUTPUT="$(cat ./cognitojwt_deps)" -readonly GENQUERY_OUTPUT - -EXPECTED_OUTPUT="$(cat <&2 < Date: Sun, 28 Jan 2024 16:28:38 -0800 Subject: [PATCH 82/96] delete some stuff I'm not working on anymore --- .../.gitignore | 1 - .../BUILD.bazel | 51 ------------------- .../MODULE.bazel | 22 -------- .../WORKSPACE | 2 - .../pypiserver_runner.py | 9 ---- .../requirements.in | 1 - .../requirements_lock.txt | 0 .../pycross/private/wheel_library.bzl | 16 +----- 8 files changed, 1 insertion(+), 101 deletions(-) delete mode 100644 tests/compile_pip_requirements_bazel_test/.gitignore delete mode 100644 tests/compile_pip_requirements_bazel_test/BUILD.bazel delete mode 100644 tests/compile_pip_requirements_bazel_test/MODULE.bazel delete mode 100644 tests/compile_pip_requirements_bazel_test/WORKSPACE delete mode 100644 tests/compile_pip_requirements_bazel_test/pypiserver_runner.py delete mode 100644 tests/compile_pip_requirements_bazel_test/requirements.in delete mode 100644 tests/compile_pip_requirements_bazel_test/requirements_lock.txt diff --git a/tests/compile_pip_requirements_bazel_test/.gitignore b/tests/compile_pip_requirements_bazel_test/.gitignore deleted file mode 100644 index ac51a054d2..0000000000 --- a/tests/compile_pip_requirements_bazel_test/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bazel-* diff --git a/tests/compile_pip_requirements_bazel_test/BUILD.bazel b/tests/compile_pip_requirements_bazel_test/BUILD.bazel deleted file mode 100644 index a3b430e28f..0000000000 --- a/tests/compile_pip_requirements_bazel_test/BUILD.bazel +++ /dev/null @@ -1,51 +0,0 @@ -load("@rules_python//python:pip.bzl", "compile_pip_requirements") -load("@rules_python//python:packaging.bzl", "py_wheel") - -compile_pip_requirements( - name = "requirements", - src = "requirements.in", - requirements_txt = "requirements_lock.txt", - args = [ - "--index-url", - "http://localhost:8989/simple/", - ], -) - -py_wheel( - name = "pkg_a", - distribution = "pkg-a", - version = "1.0", - requires = ["pkg-b"], -) - -py_wheel( - name = "pkg_b", - distribution = "pkg-b", - version = "1.1", - requires = ["pkg-c", "pkg-d"], -) - -py_wheel( - name = "pkg_c", - distribution = "pkg-c", - version = "2.0", -) - -py_wheel( - name = "pkg_d", - distribution = "pkg-d", - version = "3.0", -) - -py_binary( - name = "pypiserver_runner", - srcs = ["pypiserver_runner.py"], - data = [ - ":pkg-a", - ":pkg-b", - ":pkg-c", - ":pkg-d", - "@rules_python//tests:pypiserver", - "@rules_python//python/runfiles", - ], -) diff --git a/tests/compile_pip_requirements_bazel_test/MODULE.bazel b/tests/compile_pip_requirements_bazel_test/MODULE.bazel deleted file mode 100644 index 0e984fe360..0000000000 --- a/tests/compile_pip_requirements_bazel_test/MODULE.bazel +++ /dev/null @@ -1,22 +0,0 @@ -module( - name = "example_bzlmod", - version = "0.0.0", - compatibility_level = 1, -) - -bazel_dep(name = "bazel_skylib", version = "1.4.1") -bazel_dep(name = "rules_python", version = "0.0.0") -local_path_override( - module_name = "rules_python", - path = "../..", -) - -# We next initialize the python toolchain using the extension. -# You can set different Python versions in this block. -python = use_extension("@rules_python//python/extensions:python.bzl", "python") -python.toolchain( - configure_coverage_tool = True, - # Only set when you have mulitple toolchain versions. - is_default = True, - python_version = "3.9", -) diff --git a/tests/compile_pip_requirements_bazel_test/WORKSPACE b/tests/compile_pip_requirements_bazel_test/WORKSPACE deleted file mode 100644 index 78cc252e57..0000000000 --- a/tests/compile_pip_requirements_bazel_test/WORKSPACE +++ /dev/null @@ -1,2 +0,0 @@ -# Empty file indicating the root of a Bazel workspace. -# Dependencies and setup are in MODULE.bazel. diff --git a/tests/compile_pip_requirements_bazel_test/pypiserver_runner.py b/tests/compile_pip_requirements_bazel_test/pypiserver_runner.py deleted file mode 100644 index b330af53e0..0000000000 --- a/tests/compile_pip_requirements_bazel_test/pypiserver_runner.py +++ /dev/null @@ -1,9 +0,0 @@ -import tempfile - -from python.runfiles import runfiles - -r = runfiles.Create() - -def main(): - with tempfile.TemporaryDirectory - # TODO(phil): Assemble the wheels into a directory and run pypiserver. diff --git a/tests/compile_pip_requirements_bazel_test/requirements.in b/tests/compile_pip_requirements_bazel_test/requirements.in deleted file mode 100644 index 0543075cb5..0000000000 --- a/tests/compile_pip_requirements_bazel_test/requirements.in +++ /dev/null @@ -1 +0,0 @@ -pkg-a diff --git a/tests/compile_pip_requirements_bazel_test/requirements_lock.txt b/tests/compile_pip_requirements_bazel_test/requirements_lock.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/third_party/rules_pycross/pycross/private/wheel_library.bzl b/third_party/rules_pycross/pycross/private/wheel_library.bzl index fea657ba58..166e1d06eb 100644 --- a/third_party/rules_pycross/pycross/private/wheel_library.bzl +++ b/third_party/rules_pycross/pycross/private/wheel_library.bzl @@ -115,7 +115,7 @@ def _py_wheel_library_impl(ctx): ), ] -_py_wheel_library = rule( +py_wheel_library = rule( implementation = _py_wheel_library_impl, attrs = { "deps": attr.label_list( @@ -172,17 +172,3 @@ This option is required to support some packages which cannot handle the convers ), }, ) - -def py_wheel_library(patches = None, patch_tool = None, patch_tool_target = None, **kwargs): - # If the user has specified patches, but hasn't specified how to apply - # those patches, default to our internally-provided patch binary. - if patches and not patch_tool and not patch_tool_target: - fail("Patches specified, but missing `patch_tool` or `patch_tool_target` attributes. " + - "I.e. unsure how to apply patches.") - - _py_wheel_library( - patches = patches, - patch_tool = patch_tool, - patch_tool_target = patch_tool_target, - **kwargs - ) From 92aae04bba69a556d8ad5cb9110795d59c0fd755 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 28 Jan 2024 16:39:44 -0800 Subject: [PATCH 83/96] re-enable integration test --- .bazelrc | 4 ++-- examples/BUILD.bazel | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.bazelrc b/.bazelrc index eb00db9bb1..01aad58dff 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/pypi_install,examples/pypi_install/third_party,examples/pypi_install/wheels,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/pypi_install,examples/pypi_install/third_party,examples/pypi_install/wheels,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/examples/BUILD.bazel b/examples/BUILD.bazel index f6372eabec..050713742c 100644 --- a/examples/BUILD.bazel +++ b/examples/BUILD.bazel @@ -12,4 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +load("//tests/integration:integration_test.bzl", "rules_python_integration_test") + licenses(["notice"]) # Apache 2.0 + +rules_python_integration_test( + name = "pypi_install", +) From bbc79ec82691d9baad1ef35cdc870623b450611b Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 28 Jan 2024 16:58:46 -0800 Subject: [PATCH 84/96] fix up a few things. --- .bazelignore | 1 + BUILD.bazel | 1 + examples/BUILD.bazel | 1 + examples/pypi_install/intermediate_file_patcher.py | 1 - python/private/pypi.bzl | 1 - .../rules_pycross/pycross/private/BUILD.bazel | 13 +++++++++++++ .../rules_pycross/pycross/private/tools/BUILD.bazel | 11 +++++++++++ 7 files changed, 27 insertions(+), 2 deletions(-) diff --git a/.bazelignore b/.bazelignore index 9bcb523a38..5848203032 100644 --- a/.bazelignore +++ b/.bazelignore @@ -23,6 +23,7 @@ examples/multi_python_versions/bazel-multi_python_versions examples/pip_parse/bazel-pip_parse examples/pip_parse_vendored/bazel-pip_parse_vendored examples/py_proto_library/bazel-py_proto_library +examples/pypi_install/bazel-pypi_install tests/integration/compile_pip_requirements/bazel-compile_pip_requirements tests/integration/ignore_root_user_error/bazel-ignore_root_user_error tests/integration/pip_repository_entry_points/bazel-pip_repository_entry_points diff --git a/BUILD.bazel b/BUILD.bazel index cd4cbc544a..78ba7950e9 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -40,6 +40,7 @@ filegroup( "version.bzl", "//python:distribution", "//python/pip_install:distribution", + "//third_party/rules_pycross/pycross/private:distribution", "//tools:distribution", "@rules_python_gazelle_plugin//:distribution", ], diff --git a/examples/BUILD.bazel b/examples/BUILD.bazel index 050713742c..cd219fcf28 100644 --- a/examples/BUILD.bazel +++ b/examples/BUILD.bazel @@ -18,4 +18,5 @@ licenses(["notice"]) # Apache 2.0 rules_python_integration_test( name = "pypi_install", + bzlmod = False, ) diff --git a/examples/pypi_install/intermediate_file_patcher.py b/examples/pypi_install/intermediate_file_patcher.py index f30f197639..dc9673d30a 100644 --- a/examples/pypi_install/intermediate_file_patcher.py +++ b/examples/pypi_install/intermediate_file_patcher.py @@ -10,7 +10,6 @@ "patch_args": [ "-p1", ], - "patch_dir": "site-packages", }, } diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index b6530fe1c5..8458278132 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -24,7 +24,6 @@ _FORWARDED_ARGS = ( ("patches", None), ("patch_args", None), ("patch_tool", None), - ("patch_dir", None), ) def generate_package_alias(intermediate): diff --git a/third_party/rules_pycross/pycross/private/BUILD.bazel b/third_party/rules_pycross/pycross/private/BUILD.bazel index f59b087027..90f60790b2 100644 --- a/third_party/rules_pycross/pycross/private/BUILD.bazel +++ b/third_party/rules_pycross/pycross/private/BUILD.bazel @@ -12,3 +12,16 @@ # 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. + +filegroup( + name = "distribution", + srcs = [ + "BUILD.bazel", + "providers.bzl", + "wheel_library.bzl", + "//third_party/rules_pycross/pycross/private/tools:distribution", + ], + visibility = [ + "//:__subpackages__", + ], +) diff --git a/third_party/rules_pycross/pycross/private/tools/BUILD.bazel b/third_party/rules_pycross/pycross/private/tools/BUILD.bazel index a87e6aa67e..4d52403700 100644 --- a/third_party/rules_pycross/pycross/private/tools/BUILD.bazel +++ b/third_party/rules_pycross/pycross/private/tools/BUILD.bazel @@ -15,6 +15,17 @@ load("//python:defs.bzl", "py_binary") +filegroup( + name = "distribution", + srcs = [ + "BUILD.bazel", + "wheel_installer.py", + ], + visibility = [ + "//third_party/rules_pycross/pycross/private:__subpackages__", + ], +) + py_binary( name = "wheel_installer", srcs = ["wheel_installer.py"], From 9dc862374892ae996dd362ce9e24734bda15566f Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 28 Jan 2024 17:08:05 -0800 Subject: [PATCH 85/96] Get //examples:pypi_install_bazel_self working --- examples/pypi_install/.bazelrc | 1 + examples/pypi_install/pkg_a_deps.txt | 8 ++++---- examples/pypi_install/pkg_d_deps.txt | 6 +++--- examples/pypi_install/wheels/BUILD.bazel | 4 +++- tests/BUILD.bazel | 7 ------- tests/pypiserver.py | 2 -- 6 files changed, 11 insertions(+), 17 deletions(-) delete mode 100644 tests/pypiserver.py diff --git a/examples/pypi_install/.bazelrc b/examples/pypi_install/.bazelrc index 9e7ef37327..24ca53cef9 100644 --- a/examples/pypi_install/.bazelrc +++ b/examples/pypi_install/.bazelrc @@ -1,2 +1,3 @@ # https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file try-import %workspace%/user.bazelrc +test --test_output=errors diff --git a/examples/pypi_install/pkg_a_deps.txt b/examples/pypi_install/pkg_a_deps.txt index 784e30049d..b8f07d76e5 100755 --- a/examples/pypi_install/pkg_a_deps.txt +++ b/examples/pypi_install/pkg_a_deps.txt @@ -1,4 +1,4 @@ -@pypi//pkg_a:pkg_a -@pypi//pkg_b:underlying_pkg_b -@pypi//pkg_c:underlying_pkg_c -@pypi//pkg_d:underlying_pkg_d +@@pypi//pkg_a:pkg_a +@@pypi//pkg_b:underlying_pkg_b +@@pypi//pkg_c:underlying_pkg_c +@@pypi//pkg_d:underlying_pkg_d diff --git a/examples/pypi_install/pkg_d_deps.txt b/examples/pypi_install/pkg_d_deps.txt index 92550a2cd8..ed2c8b191b 100755 --- a/examples/pypi_install/pkg_d_deps.txt +++ b/examples/pypi_install/pkg_d_deps.txt @@ -1,3 +1,3 @@ -@pypi//pkg_b:underlying_pkg_b -@pypi//pkg_c:underlying_pkg_c -@pypi//pkg_d:pkg_d +@@pypi//pkg_b:underlying_pkg_b +@@pypi//pkg_c:underlying_pkg_c +@@pypi//pkg_d:pkg_d diff --git a/examples/pypi_install/wheels/BUILD.bazel b/examples/pypi_install/wheels/BUILD.bazel index a2b0684cb3..e6142abdce 100644 --- a/examples/pypi_install/wheels/BUILD.bazel +++ b/examples/pypi_install/wheels/BUILD.bazel @@ -58,12 +58,14 @@ py_wheel( py_binary( name = "pypiserver_runner", srcs = ["pypiserver_runner.py"], + deps = [ + "@pypi__pypiserver//:lib", + ], data = [ ":pkg_a", ":pkg_b", ":pkg_c", ":pkg_d", - "@rules_python//tests:pypiserver", "@rules_python//python/runfiles", ], ) diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel index d00cb7f920..f2e4bf89a6 100644 --- a/tests/BUILD.bazel +++ b/tests/BUILD.bazel @@ -5,13 +5,6 @@ package(default_visibility = ["//visibility:public"]) licenses(["notice"]) -py_binary( - name = "pypiserver", - srcs = ["pypiserver.py"], - deps = ["@pypi__pypiserver//:lib"], - visibility = ["//visibility:public"], -) - build_test( name = "bzl_libraries_build_test", targets = [ diff --git a/tests/pypiserver.py b/tests/pypiserver.py deleted file mode 100644 index b350f2f9b3..0000000000 --- a/tests/pypiserver.py +++ /dev/null @@ -1,2 +0,0 @@ -from pypiserver.__main__ import main -main() From e29aba2e69f6fbcddbd06a9751c2e314916e84ca Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 28 Jan 2024 17:16:24 -0800 Subject: [PATCH 86/96] Tried and failed to adapt test based on bazel version. --- examples/pypi_install/BUILD.bazel | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index f66243587b..13bd9f40a4 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -1,5 +1,6 @@ load("@rules_python//python:defs.bzl", "py_binary", "py_test") load("@rules_python//python:pip.bzl", "compile_pip_requirements") +load("@bazel_skylib//lib:versions.bzl", "versions") load("@bazel_skylib//rules:diff_test.bzl", "diff_test") py_binary( @@ -67,9 +68,13 @@ genquery( scope = ["@pypi//pkg_a"], ) +# TODO(phil): This doesn't work. Find a way to make this work. +#IS_BAZEL_6 = versions.parse(versions.get())[0] < 7 + diff_test( name = "pkg_a_deps_test", file1 = ":pkg_a_deps", + #file2 = "pkg_a_deps_bazel_6.txt" if IS_BAZEL_6 else "pkg_a_deps.txt", file2 = "pkg_a_deps.txt", ) @@ -83,5 +88,6 @@ genquery( diff_test( name = "pkg_d_deps_test", file1 = ":pkg_d_deps", + #file2 = "pkg_d_deps_bazel_6.txt" if IS_BAZEL_6 else "pkg_d_deps.txt", file2 = "pkg_d_deps.txt", ) From ad75959e8185c160ed3388faecab01c954c2507e Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 29 Jan 2024 15:09:33 -0800 Subject: [PATCH 87/96] Generate an aarch64 intermediate file --- examples/pypi_install/BUILD.bazel | 10 ++++ examples/pypi_install/MODULE.bazel | 6 ++ examples/pypi_install/WORKSPACE | 4 ++ examples/pypi_install/cc/BUILD.bazel | 29 +++++++++ .../cc/fake_cc_toolchain_config.bzl | 23 +++++++ .../intermediate_file_aarch64_linux.json | 37 ++++++++++++ examples/pypi_install/platforms/BUILD.bazel | 15 +++++ .../requirements_lock_aarch64_linux.txt | 22 +++++++ .../requirements_lock_x86_64_linux.txt | 2 +- .../pypi_install/update_helper/BUILD.bazel | 10 ++++ .../pypi_install/update_helper/Dockerfile | 8 +++ .../update_helper/update_helper.sh | 60 +++++++++++++++++++ 12 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 examples/pypi_install/MODULE.bazel create mode 100644 examples/pypi_install/cc/BUILD.bazel create mode 100644 examples/pypi_install/cc/fake_cc_toolchain_config.bzl create mode 100644 examples/pypi_install/intermediate_file_aarch64_linux.json create mode 100644 examples/pypi_install/platforms/BUILD.bazel create mode 100644 examples/pypi_install/requirements_lock_aarch64_linux.txt create mode 100644 examples/pypi_install/update_helper/BUILD.bazel create mode 100644 examples/pypi_install/update_helper/Dockerfile create mode 100755 examples/pypi_install/update_helper/update_helper.sh diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index 13bd9f40a4..eb076eaa25 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -21,6 +21,7 @@ py_test( compile_pip_requirements( name = "requirements", intermediate_file = { + "@//:aarch64_linux": "intermediate_file_aarch64_linux.json", "@//:x86_64_linux": "intermediate_file_x86_64_linux.json", }, # That binary will let users modify the intermediate file. Then they can: @@ -35,6 +36,7 @@ compile_pip_requirements( # the file. Having these values as dictionaries allows us to do some # validation before the underlying targets get instantiated. requirements_txt = { + "@//:aarch64_linux": "requirements_lock_aarch64_linux.txt", "@//:x86_64_linux": "requirements_lock_x86_64_linux.txt", }, extra_args = [ @@ -53,6 +55,14 @@ py_binary( srcs = ["intermediate_file_patcher.py"], ) +config_setting( + name = "aarch64_linux", + constraint_values = [ + "@platforms//cpu:aarch64", + "@platforms//os:linux", + ], +) + config_setting( name = "x86_64_linux", constraint_values = [ diff --git a/examples/pypi_install/MODULE.bazel b/examples/pypi_install/MODULE.bazel new file mode 100644 index 0000000000..00bb18361f --- /dev/null +++ b/examples/pypi_install/MODULE.bazel @@ -0,0 +1,6 @@ +############################################################################### +# Bazel now uses Bzlmod by default to manage external dependencies. +# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel. +# +# For more details, please check https://github.com/bazelbuild/bazel/issues/18958 +############################################################################### diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index f4c330c7c8..8f824f1969 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -37,3 +37,7 @@ load("@pypi_install//:packages.bzl", "load_pypi_packages") load_pypi_packages( name = "pypi", ) + +register_toolchains( + "//cc:linux_toolchain_definition", +) diff --git a/examples/pypi_install/cc/BUILD.bazel b/examples/pypi_install/cc/BUILD.bazel new file mode 100644 index 0000000000..e835d73d81 --- /dev/null +++ b/examples/pypi_install/cc/BUILD.bazel @@ -0,0 +1,29 @@ +load(":fake_cc_toolchain_config.bzl", "fake_cc_toolchain_config") + +filegroup(name = "empty") + +fake_cc_toolchain_config( + name = "linux_toolchain_config", + target_cpu = "k8", + toolchain_identifier = "linux-toolchain", +) + +cc_toolchain( + name = "linux_toolchain", + all_files = ":empty", + compiler_files = ":empty", + dwp_files = ":empty", + linker_files = ":empty", + objcopy_files = ":empty", + strip_files = ":empty", + supports_param_files = 0, + toolchain_config = ":linux_toolchain_config", + toolchain_identifier = "linux-toolchain", +) + +toolchain( + name = "linux_toolchain_definition", + target_compatible_with = ["@platforms//os:linux"], + toolchain = ":linux_toolchain", + toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", +) diff --git a/examples/pypi_install/cc/fake_cc_toolchain_config.bzl b/examples/pypi_install/cc/fake_cc_toolchain_config.bzl new file mode 100644 index 0000000000..182bc03680 --- /dev/null +++ b/examples/pypi_install/cc/fake_cc_toolchain_config.bzl @@ -0,0 +1,23 @@ +"""Fake for providing CcToolchainConfigInfo.""" + +def _impl(ctx): + return cc_common.create_cc_toolchain_config_info( + ctx = ctx, + toolchain_identifier = ctx.attr.toolchain_identifier, + host_system_name = "local", + target_system_name = "local", + target_cpu = ctx.attr.target_cpu, + target_libc = "unknown", + compiler = "clang", + abi_version = "unknown", + abi_libc_version = "unknown", + ) + +fake_cc_toolchain_config = rule( + implementation = _impl, + attrs = { + "target_cpu": attr.string(), + "toolchain_identifier": attr.string(), + }, + provides = [CcToolchainConfigInfo], +) diff --git a/examples/pypi_install/intermediate_file_aarch64_linux.json b/examples/pypi_install/intermediate_file_aarch64_linux.json new file mode 100644 index 0000000000..5966d21429 --- /dev/null +++ b/examples/pypi_install/intermediate_file_aarch64_linux.json @@ -0,0 +1,37 @@ +{ + "pkg-a": { + "@//:aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", + "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", + "deps": [ + "pkg-b" + ] + } + }, + "pkg-b": { + "@//:aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", + "sha256": "a03f9ddf7d79dead3c9527f3028a531a1787f50b892e76344cfdba395c120bcc", + "deps": [ + "pkg-c", + "pkg-d" + ] + } + }, + "pkg-c": { + "@//:aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", + "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", + "deps": [] + } + }, + "pkg-d": { + "@//:aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", + "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", + "deps": [ + "pkg-b" + ] + } + } +} diff --git a/examples/pypi_install/platforms/BUILD.bazel b/examples/pypi_install/platforms/BUILD.bazel new file mode 100644 index 0000000000..e44c96025a --- /dev/null +++ b/examples/pypi_install/platforms/BUILD.bazel @@ -0,0 +1,15 @@ +platform( + name = "linux_aarch64", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], +) + +platform( + name = "linux_x86", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], +) diff --git a/examples/pypi_install/requirements_lock_aarch64_linux.txt b/examples/pypi_install/requirements_lock_aarch64_linux.txt new file mode 100644 index 0000000000..079ba97476 --- /dev/null +++ b/examples/pypi_install/requirements_lock_aarch64_linux.txt @@ -0,0 +1,22 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# bazel run //:requirements.update +# +--index-url http://localhost:8989/simple/ + +pkg-a==1.0 \ + --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 + # via -r requirements.in +pkg-b==1.1 \ + --hash=sha256:a03f9ddf7d79dead3c9527f3028a531a1787f50b892e76344cfdba395c120bcc + # via + # pkg-a + # pkg-d +pkg-c==2.0 \ + --hash=sha256:76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669 + # via pkg-b +pkg-d==3.0 \ + --hash=sha256:f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2 + # via pkg-b diff --git a/examples/pypi_install/requirements_lock_x86_64_linux.txt b/examples/pypi_install/requirements_lock_x86_64_linux.txt index 7c72eaf551..079ba97476 100644 --- a/examples/pypi_install/requirements_lock_x86_64_linux.txt +++ b/examples/pypi_install/requirements_lock_x86_64_linux.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # bazel run //:requirements.update diff --git a/examples/pypi_install/update_helper/BUILD.bazel b/examples/pypi_install/update_helper/BUILD.bazel new file mode 100644 index 0000000000..6060552140 --- /dev/null +++ b/examples/pypi_install/update_helper/BUILD.bazel @@ -0,0 +1,10 @@ +sh_binary( + name = "update_helper", + srcs = ["update_helper.sh"], + data = [ + "Dockerfile", + ], + deps = [ + "@bazel_tools//tools/bash/runfiles", + ], +) diff --git a/examples/pypi_install/update_helper/Dockerfile b/examples/pypi_install/update_helper/Dockerfile new file mode 100644 index 0000000000..475e41495b --- /dev/null +++ b/examples/pypi_install/update_helper/Dockerfile @@ -0,0 +1,8 @@ +# This Dockerfile sets up a container with the minimum number of things to make +# //:requirements.update target happy. + +FROM ubuntu:22.04 + +RUN apt update +RUN DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y python3 +RUN DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y pkgconf diff --git a/examples/pypi_install/update_helper/update_helper.sh b/examples/pypi_install/update_helper/update_helper.sh new file mode 100755 index 0000000000..8ec76cc334 --- /dev/null +++ b/examples/pypi_install/update_helper/update_helper.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +# --- begin runfiles.bash initialization v3 --- +set -uo pipefail; set +e; f=bazel_tools/tools/bash/runfiles/runfiles.bash +source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \ + source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \ + source "$0.runfiles/$f" 2>/dev/null || \ + source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \ + source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \ + { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e +# --- end runfiles.bash initialization v3 --- + +if (( $# < 2 )); then + echo "Need a docker platform as an argument." >&2 + exit 1 +fi + +readonly DOCKER_PLATFORM="$1" +shift + +DOCKERFILE="$(rlocation rules_python_pypi_install_example/update_helper/Dockerfile)" +CONTEXT_DIR="$(dirname "${DOCKERFILE}")" +CONTAINER_TAG="pip-lock-${DOCKER_PLATFORM}:${USER}" + +# Build the container that has the bare minimum to run the various setup.py +# scripts from our dependencies. +docker build \ + --platform="${DOCKER_PLATFORM}" \ + --file="${DOCKERFILE}" \ + --tag="${CONTAINER_TAG}" \ + "${CONTEXT_DIR}" + +MOUNT_POINT_BAZEL_OUT="$(stat -c %m "${BUILD_WORKSPACE_DIRECTORY}/bazel-out/")" +MOUNT_POINT_HOME="$(stat -c %m "${HOME}")" + +MOUNT_POINT_ARGS=(--volume "${HOME}:${HOME}") +if [[ MOUNT_POINT_BAZEL_OUT != MOUNT_POINT_HOME ]]; then + MOUNT_POINT_ARGS+=(--volume "${MOUNT_POINT_BAZEL_OUT}:${MOUNT_POINT_BAZEL_OUT}") +fi + +# Run the actual update. The assumption here is that mounting the user's home +# directory is sufficient to allow the tool to run inside the container without +# any issues. I.e. the cache and the source tree are available in the +# container. +docker run \ + --rm \ + --tty \ + --env BUILD_WORKSPACE_DIRECTORY="${BUILD_WORKSPACE_DIRECTORY}" \ + --network="host" \ + --workdir "${PWD}" \ + "${MOUNT_POINT_ARGS[@]}" \ + "${CONTAINER_TAG}" \ + "$@" + +# Fix permissions. +sudo chown -R "${USER}:${USER}" bazel-bin/ From 7144829f64a228fe935cd4b1cbe6147349aa3cc4 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 29 Jan 2024 15:21:10 -0800 Subject: [PATCH 88/96] add new package, update isn't working yet. --- .../intermediate_file_aarch64_linux.json | 2 +- .../intermediate_file_x86_64_linux.json | 2 +- .../requirements_lock_aarch64_linux.txt | 2 +- .../requirements_lock_x86_64_linux.txt | 2 +- .../pypi_install/update_helper/update_helper.sh | 2 +- examples/pypi_install/wheels/BUILD.bazel | 17 ++++++++++++++++- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/examples/pypi_install/intermediate_file_aarch64_linux.json b/examples/pypi_install/intermediate_file_aarch64_linux.json index 5966d21429..d91c9503bb 100644 --- a/examples/pypi_install/intermediate_file_aarch64_linux.json +++ b/examples/pypi_install/intermediate_file_aarch64_linux.json @@ -11,7 +11,7 @@ "pkg-b": { "@//:aarch64_linux": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", - "sha256": "a03f9ddf7d79dead3c9527f3028a531a1787f50b892e76344cfdba395c120bcc", + "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", "deps": [ "pkg-c", "pkg-d" diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_x86_64_linux.json index abd5a20210..2fe458a09d 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_x86_64_linux.json @@ -11,7 +11,7 @@ "pkg-b": { "@//:x86_64_linux": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", - "sha256": "a03f9ddf7d79dead3c9527f3028a531a1787f50b892e76344cfdba395c120bcc", + "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", "deps": [ "pkg-c", "pkg-d" diff --git a/examples/pypi_install/requirements_lock_aarch64_linux.txt b/examples/pypi_install/requirements_lock_aarch64_linux.txt index 079ba97476..a78681bf11 100644 --- a/examples/pypi_install/requirements_lock_aarch64_linux.txt +++ b/examples/pypi_install/requirements_lock_aarch64_linux.txt @@ -10,7 +10,7 @@ pkg-a==1.0 \ --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 # via -r requirements.in pkg-b==1.1 \ - --hash=sha256:a03f9ddf7d79dead3c9527f3028a531a1787f50b892e76344cfdba395c120bcc + --hash=sha256:0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3 # via # pkg-a # pkg-d diff --git a/examples/pypi_install/requirements_lock_x86_64_linux.txt b/examples/pypi_install/requirements_lock_x86_64_linux.txt index 079ba97476..a78681bf11 100644 --- a/examples/pypi_install/requirements_lock_x86_64_linux.txt +++ b/examples/pypi_install/requirements_lock_x86_64_linux.txt @@ -10,7 +10,7 @@ pkg-a==1.0 \ --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 # via -r requirements.in pkg-b==1.1 \ - --hash=sha256:a03f9ddf7d79dead3c9527f3028a531a1787f50b892e76344cfdba395c120bcc + --hash=sha256:0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3 # via # pkg-a # pkg-d diff --git a/examples/pypi_install/update_helper/update_helper.sh b/examples/pypi_install/update_helper/update_helper.sh index 8ec76cc334..64e541a327 100755 --- a/examples/pypi_install/update_helper/update_helper.sh +++ b/examples/pypi_install/update_helper/update_helper.sh @@ -57,4 +57,4 @@ docker run \ "$@" # Fix permissions. -sudo chown -R "${USER}:${USER}" bazel-bin/ +sudo chown -R "${USER}:${USER}" "${BUILD_WORKSPACE_DIRECTORY}/bazel-bin/" || : diff --git a/examples/pypi_install/wheels/BUILD.bazel b/examples/pypi_install/wheels/BUILD.bazel index e6142abdce..8db694969a 100644 --- a/examples/pypi_install/wheels/BUILD.bazel +++ b/examples/pypi_install/wheels/BUILD.bazel @@ -17,6 +17,7 @@ load("@rules_python//python:packaging.bzl", "py_package", "py_wheel") "pkg_b", "pkg_c", "pkg_d", + "pkg_e", )] @@ -33,7 +34,11 @@ py_wheel( name = "pkg_b", distribution = "pkg-b", version = "1.1", - requires = ["pkg-c", "pkg-d"], + requires = [ + "pkg-c", + "pkg-d", + 'pkg-e ; platform_machine == "aarch64"', + ], deps = [":pkg_b_py_package"], strip_path_prefixes = ["wheels/src"], ) @@ -55,6 +60,15 @@ py_wheel( strip_path_prefixes = ["wheels/src"], ) +# aarch64-specific. +py_wheel( + name = "pkg_e", + distribution = "pkg-e", + version = "4.0", + deps = [":pkg_e_py_package"], + strip_path_prefixes = ["wheels/src"], +) + py_binary( name = "pypiserver_runner", srcs = ["pypiserver_runner.py"], @@ -66,6 +80,7 @@ py_binary( ":pkg_b", ":pkg_c", ":pkg_d", + ":pkg_e", "@rules_python//python/runfiles", ], ) From 2bda97f1c21063947d50140c8c6c8c3357051b45 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 29 Jan 2024 15:42:00 -0800 Subject: [PATCH 89/96] Get multi-arch intermediate file update working. --- .../pypi_install/update_helper/Dockerfile | 2 +- examples/pypi_install/update_helper/README.md | 19 +++++++++++++++++++ .../update_helper/update_helper.sh | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 examples/pypi_install/update_helper/README.md diff --git a/examples/pypi_install/update_helper/Dockerfile b/examples/pypi_install/update_helper/Dockerfile index 475e41495b..bd9245e35e 100644 --- a/examples/pypi_install/update_helper/Dockerfile +++ b/examples/pypi_install/update_helper/Dockerfile @@ -1,7 +1,7 @@ # This Dockerfile sets up a container with the minimum number of things to make # //:requirements.update target happy. -FROM ubuntu:22.04 +FROM --platform=$TARGETPLATFORM ubuntu:22.04 RUN apt update RUN DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y python3 diff --git a/examples/pypi_install/update_helper/README.md b/examples/pypi_install/update_helper/README.md new file mode 100644 index 0000000000..f5a3a51bd0 --- /dev/null +++ b/examples/pypi_install/update_helper/README.md @@ -0,0 +1,19 @@ +On the host: + +``` +sudo apt update +sudo apt install qemu-user-static +``` + +Then update for x86: + +``` +export DOCKER_BUILDKIT=1 +bazel run //:requirements.update --run_under="//update_helper linux/amd64" --platforms=//platforms:linux_x86 +``` + +And update for arm64: +``` +export DOCKER_BUILDKIT=1 +bazel run //:requirements.update --run_under="//update_helper linux/arm64/v8" --platforms=//platforms:linux_aarch64 +``` diff --git a/examples/pypi_install/update_helper/update_helper.sh b/examples/pypi_install/update_helper/update_helper.sh index 64e541a327..441ccb00ce 100755 --- a/examples/pypi_install/update_helper/update_helper.sh +++ b/examples/pypi_install/update_helper/update_helper.sh @@ -48,6 +48,7 @@ fi # container. docker run \ --rm \ + --platform="${DOCKER_PLATFORM}" \ --tty \ --env BUILD_WORKSPACE_DIRECTORY="${BUILD_WORKSPACE_DIRECTORY}" \ --network="host" \ From 6c818b4f493100fc37cac2a5e0ec5ffac6f66e1b Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 29 Jan 2024 15:48:34 -0800 Subject: [PATCH 90/96] get the basic example working. --- examples/pypi_install/WORKSPACE | 1 + .../pypi_install/intermediate_file_aarch64_linux.json | 10 +++++++++- .../pypi_install/requirements_lock_aarch64_linux.txt | 3 +++ examples/pypi_install/wheels/pypiserver_runner.py | 1 + python/private/pypi.bzl | 2 +- 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index 8f824f1969..70f5f2dbc9 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -29,6 +29,7 @@ pypi_install( # exclusive. pip_installation_report = [ "//:intermediate_file_x86_64_linux.json", + "//:intermediate_file_aarch64_linux.json", ], ) diff --git a/examples/pypi_install/intermediate_file_aarch64_linux.json b/examples/pypi_install/intermediate_file_aarch64_linux.json index d91c9503bb..c1f2041bf9 100644 --- a/examples/pypi_install/intermediate_file_aarch64_linux.json +++ b/examples/pypi_install/intermediate_file_aarch64_linux.json @@ -14,7 +14,8 @@ "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", "deps": [ "pkg-c", - "pkg-d" + "pkg-d", + "pkg-e" ] } }, @@ -33,5 +34,12 @@ "pkg-b" ] } + }, + "pkg-e": { + "@//:aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_e-4.0-py3-none-any.whl", + "sha256": "ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7", + "deps": [] + } } } diff --git a/examples/pypi_install/requirements_lock_aarch64_linux.txt b/examples/pypi_install/requirements_lock_aarch64_linux.txt index a78681bf11..632585b720 100644 --- a/examples/pypi_install/requirements_lock_aarch64_linux.txt +++ b/examples/pypi_install/requirements_lock_aarch64_linux.txt @@ -20,3 +20,6 @@ pkg-c==2.0 \ pkg-d==3.0 \ --hash=sha256:f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2 # via pkg-b +pkg-e==4.0 \ + --hash=sha256:ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7 + # via pkg-b diff --git a/examples/pypi_install/wheels/pypiserver_runner.py b/examples/pypi_install/wheels/pypiserver_runner.py index 462f621852..7601eab2d6 100644 --- a/examples/pypi_install/wheels/pypiserver_runner.py +++ b/examples/pypi_install/wheels/pypiserver_runner.py @@ -14,6 +14,7 @@ "pkg_b-1.1-py3-none-any.whl", "pkg_c-2.0-py3-none-any.whl", "pkg_d-3.0-py3-none-any.whl", + "pkg_e-4.0-py3-none-any.whl", ) def main(): diff --git a/python/private/pypi.bzl b/python/private/pypi.bzl index 8458278132..d8c3b4dfa9 100644 --- a/python/private/pypi.bzl +++ b/python/private/pypi.bzl @@ -79,7 +79,7 @@ def _accumulate_transitive_deps_inner(intermediate, configs, package, already_ac dep = sets.to_list(pending_deps)[0] sets.remove(pending_deps, dep) - deps = intermediate[dep].get(config, "//conditions:default").get("deps", []) + deps = intermediate[dep].get(config, {"//conditions:default": {}}).get("deps", []) new_deps = sets.difference(sets.make(deps), already_accumulated[config]) new_deps = sets.difference(new_deps, pending_deps) already_accumulated[config] = sets.union(already_accumulated[config], new_deps) From d41f49123139ad0a6b0163db2486063704676548 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Mon, 29 Jan 2024 15:55:15 -0800 Subject: [PATCH 91/96] disable bzlmod for now --- examples/pypi_install/.bazelrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/pypi_install/.bazelrc b/examples/pypi_install/.bazelrc index 24ca53cef9..18023a13fb 100644 --- a/examples/pypi_install/.bazelrc +++ b/examples/pypi_install/.bazelrc @@ -1,3 +1,5 @@ # https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file try-import %workspace%/user.bazelrc test --test_output=errors + +common --noenable_bzlmod From 33cdcb39eb9db5cd385b6be715920334d027d150 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 11 Feb 2024 14:04:05 -0800 Subject: [PATCH 92/96] Add a better test for arch-dependent package --- examples/pypi_install/platforms/BUILD.bazel | 2 ++ examples/pypi_install/test/BUILD.bazel | 31 ++++++++++++++++ examples/pypi_install/test/test_binary.py | 0 .../test/transitioned_par_file.bzl | 34 ++++++++++++++++++ .../test/transitioned_par_file_test.py | 35 +++++++++++++++++++ 5 files changed, 102 insertions(+) create mode 100644 examples/pypi_install/test/BUILD.bazel create mode 100644 examples/pypi_install/test/test_binary.py create mode 100644 examples/pypi_install/test/transitioned_par_file.bzl create mode 100644 examples/pypi_install/test/transitioned_par_file_test.py diff --git a/examples/pypi_install/platforms/BUILD.bazel b/examples/pypi_install/platforms/BUILD.bazel index e44c96025a..06dbd14da6 100644 --- a/examples/pypi_install/platforms/BUILD.bazel +++ b/examples/pypi_install/platforms/BUILD.bazel @@ -4,6 +4,7 @@ platform( "@platforms//os:linux", "@platforms//cpu:aarch64", ], + visibility = ["//visibility:public"], ) platform( @@ -12,4 +13,5 @@ platform( "@platforms//os:linux", "@platforms//cpu:x86_64", ], + visibility = ["//visibility:public"], ) diff --git a/examples/pypi_install/test/BUILD.bazel b/examples/pypi_install/test/BUILD.bazel new file mode 100644 index 0000000000..ca6bcb62ad --- /dev/null +++ b/examples/pypi_install/test/BUILD.bazel @@ -0,0 +1,31 @@ +load("@rules_python//python:defs.bzl", "py_binary", "py_test") +load(":transitioned_par_file.bzl", "transitioned_par_file") + +py_binary( + name = "test_binary", + srcs = ["test_binary.py"], + deps = [ + "@pypi//pkg_a", + ], +) + +transitioned_par_file( + name = "test_binary_linux_aarch64", + src = ":test_binary", + platform = "//platforms:linux_aarch64", +) + +transitioned_par_file( + name = "test_binary_linux_x86", + src = ":test_binary", + platform = "//platforms:linux_x86", +) + +py_test( + name = "transitioned_par_file_test", + srcs = ["transitioned_par_file_test.py"], + data = [ + ":test_binary_linux_aarch64", + ":test_binary_linux_x86", + ], +) diff --git a/examples/pypi_install/test/test_binary.py b/examples/pypi_install/test/test_binary.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/pypi_install/test/transitioned_par_file.bzl b/examples/pypi_install/test/transitioned_par_file.bzl new file mode 100644 index 0000000000..62ce62d82e --- /dev/null +++ b/examples/pypi_install/test/transitioned_par_file.bzl @@ -0,0 +1,34 @@ + +def _platform_transition_impl(settings, attr): + return { + "//command_line_option:platforms": str(attr.platform), + } + +_platform_transition = transition( + implementation = _platform_transition_impl, + inputs = [], + outputs = [ + "//command_line_option:platforms", + ], +) + +def _transitioned_par_file_impl(ctx): + files = ctx.attr.src[0][DefaultInfo].default_runfiles.files.to_list() + out_file = ctx.actions.declare_file(ctx.label.name + ".txt") + ctx.actions.write( + output = out_file, + content = "\n".join([file.path for file in files]), + ) + return [DefaultInfo( + files = depset([out_file]), + )] + +transitioned_par_file = rule( + implementation = _transitioned_par_file_impl, + attrs = { + "src": attr.label( + cfg = _platform_transition, + ), + "platform": attr.label(), + }, +) diff --git a/examples/pypi_install/test/transitioned_par_file_test.py b/examples/pypi_install/test/transitioned_par_file_test.py new file mode 100644 index 0000000000..b95bdb3f54 --- /dev/null +++ b/examples/pypi_install/test/transitioned_par_file_test.py @@ -0,0 +1,35 @@ +import unittest +import zipfile +from pathlib import Path + +AARCH64_BIN = "external/python39_aarch64-unknown-linux-gnu/bin/python3" +X86_BIN = "external/python39_x86_64-unknown-linux-gnu/bin/python3" + +def library_is_in_file_list(library_name, file_list): + for name in file_list: + if f"/pypi_extracted_wheel_{library_name}_" in name and name.endswith("/underlying_library"): + return True + + return False + + +class ParFileTest(unittest.TestCase): + + def test_linux_aarch64(self): + file_list = Path("test/test_binary_linux_aarch64.txt").read_text().splitlines() + + self.assertIn(AARCH64_BIN, file_list) + self.assertNotIn(X86_BIN, file_list) + self.assertTrue(library_is_in_file_list("pkg_a", file_list)) + self.assertTrue(library_is_in_file_list("pkg_e", file_list)) + + def test_linux_x86(self): + file_list = Path("test/test_binary_linux_x86.txt").read_text().splitlines() + + self.assertNotIn(AARCH64_BIN, file_list) + self.assertIn(X86_BIN, file_list) + self.assertTrue(library_is_in_file_list("pkg_a", file_list)) + self.assertFalse(library_is_in_file_list("pkg_e", file_list)) + +if __name__ == "__main__": + unittest.main() From fd477fc380f3e147c09570a9a730b8ef3d1bb469 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 11 Feb 2024 21:31:08 -0800 Subject: [PATCH 93/96] Try it out with multiple Python versions. --- examples/pypi_install/.bazelrc | 3 ++ examples/pypi_install/BUILD.bazel | 27 +++++++++-- examples/pypi_install/WORKSPACE | 17 ++++--- ...ntermediate_file_py310_aarch64_linux.json} | 10 ++--- ...intermediate_file_py310_x86_64_linux.json} | 8 ++-- ...intermediate_file_py311_aarch64_linux.json | 45 +++++++++++++++++++ .../intermediate_file_py311_x86_64_linux.json | 37 +++++++++++++++ ...requirements_lock_py310_aarch64_linux.txt} | 0 ... requirements_lock_py310_x86_64_linux.txt} | 0 .../requirements_lock_py311_aarch64_linux.txt | 25 +++++++++++ .../requirements_lock_py311_x86_64_linux.txt | 22 +++++++++ examples/pypi_install/update_helper/README.md | 9 +--- .../pypi_install/update_helper/update_all.sh | 21 +++++++++ 13 files changed, 196 insertions(+), 28 deletions(-) rename examples/pypi_install/{intermediate_file_aarch64_linux.json => intermediate_file_py310_aarch64_linux.json} (87%) rename examples/pypi_install/{intermediate_file_x86_64_linux.json => intermediate_file_py310_x86_64_linux.json} (87%) create mode 100644 examples/pypi_install/intermediate_file_py311_aarch64_linux.json create mode 100644 examples/pypi_install/intermediate_file_py311_x86_64_linux.json rename examples/pypi_install/{requirements_lock_aarch64_linux.txt => requirements_lock_py310_aarch64_linux.txt} (100%) rename examples/pypi_install/{requirements_lock_x86_64_linux.txt => requirements_lock_py310_x86_64_linux.txt} (100%) create mode 100644 examples/pypi_install/requirements_lock_py311_aarch64_linux.txt create mode 100644 examples/pypi_install/requirements_lock_py311_x86_64_linux.txt create mode 100755 examples/pypi_install/update_helper/update_all.sh diff --git a/examples/pypi_install/.bazelrc b/examples/pypi_install/.bazelrc index 18023a13fb..2e216a252d 100644 --- a/examples/pypi_install/.bazelrc +++ b/examples/pypi_install/.bazelrc @@ -3,3 +3,6 @@ try-import %workspace%/user.bazelrc test --test_output=errors common --noenable_bzlmod + +build:py310 --@rules_python//python/config_settings:python_version=3.10 +build:py311 --@rules_python//python/config_settings:python_version=3.11 diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index eb076eaa25..cba006c6cf 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -1,6 +1,7 @@ load("@rules_python//python:defs.bzl", "py_binary", "py_test") load("@rules_python//python:pip.bzl", "compile_pip_requirements") load("@bazel_skylib//lib:versions.bzl", "versions") +load("@bazel_skylib//lib:selects.bzl", "selects") load("@bazel_skylib//rules:diff_test.bzl", "diff_test") py_binary( @@ -21,8 +22,10 @@ py_test( compile_pip_requirements( name = "requirements", intermediate_file = { - "@//:aarch64_linux": "intermediate_file_aarch64_linux.json", - "@//:x86_64_linux": "intermediate_file_x86_64_linux.json", + "@//:py310_aarch64_linux": "intermediate_file_py310_aarch64_linux.json", + "@//:py310_x86_64_linux": "intermediate_file_py310_x86_64_linux.json", + "@//:py311_aarch64_linux": "intermediate_file_py311_aarch64_linux.json", + "@//:py311_x86_64_linux": "intermediate_file_py311_x86_64_linux.json", }, # That binary will let users modify the intermediate file. Then they can: # - Inject dependencies. @@ -36,8 +39,10 @@ compile_pip_requirements( # the file. Having these values as dictionaries allows us to do some # validation before the underlying targets get instantiated. requirements_txt = { - "@//:aarch64_linux": "requirements_lock_aarch64_linux.txt", - "@//:x86_64_linux": "requirements_lock_x86_64_linux.txt", + "@//:py310_aarch64_linux": "requirements_lock_py310_aarch64_linux.txt", + "@//:py310_x86_64_linux": "requirements_lock_py310_x86_64_linux.txt", + "@//:py311_aarch64_linux": "requirements_lock_py311_aarch64_linux.txt", + "@//:py311_x86_64_linux": "requirements_lock_py311_x86_64_linux.txt", }, extra_args = [ # Since we may frequently tweak the wheels for development, we can't @@ -71,6 +76,20 @@ config_setting( ], ) +[selects.config_setting_group( + name = "py{}_{}".format(py_version.replace(".", ""), platform), + match_all = [ + "@rules_python//python/config_settings:is_python_{}".format(py_version), + ":{}".format(platform), + ], +) for py_version in ( + "3.10", + "3.11", +) for platform in ( + "aarch64_linux", + "x86_64_linux", +)] + genquery( name = "pkg_a_deps", expression = """filter(@pypi//, kind(".* rule", deps(@pypi//pkg_a)))""", diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index 70f5f2dbc9..193c218338 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -5,7 +5,7 @@ local_repository( path = "../..", ) -load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains") +load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_multi_toolchains") py_repositories() @@ -13,12 +13,15 @@ load("@rules_python//python/pip_install:repositories.bzl", "pip_install_dependen pip_install_dependencies() -python_register_toolchains( - name = "python39", - python_version = "3.9", +python_register_multi_toolchains( + name = "python", + default_version = "3.10", + python_versions = [ + "3.10", + "3.11", + ], ) -load("@python39//:defs.bzl", "interpreter") load("@rules_python//python:pypi.bzl", "pypi_install") pypi_install( @@ -28,8 +31,8 @@ pypi_install( # TODO(phil): Add test to make sure that the config settings are mutually # exclusive. pip_installation_report = [ - "//:intermediate_file_x86_64_linux.json", - "//:intermediate_file_aarch64_linux.json", + "//:intermediate_file_py310_x86_64_linux.json", + "//:intermediate_file_py310_aarch64_linux.json", ], ) diff --git a/examples/pypi_install/intermediate_file_aarch64_linux.json b/examples/pypi_install/intermediate_file_py310_aarch64_linux.json similarity index 87% rename from examples/pypi_install/intermediate_file_aarch64_linux.json rename to examples/pypi_install/intermediate_file_py310_aarch64_linux.json index c1f2041bf9..d5c6861292 100644 --- a/examples/pypi_install/intermediate_file_aarch64_linux.json +++ b/examples/pypi_install/intermediate_file_py310_aarch64_linux.json @@ -1,6 +1,6 @@ { "pkg-a": { - "@//:aarch64_linux": { + "@//:py310_aarch64_linux": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", "deps": [ @@ -9,7 +9,7 @@ } }, "pkg-b": { - "@//:aarch64_linux": { + "@//:py310_aarch64_linux": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", "deps": [ @@ -20,14 +20,14 @@ } }, "pkg-c": { - "@//:aarch64_linux": { + "@//:py310_aarch64_linux": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", "deps": [] } }, "pkg-d": { - "@//:aarch64_linux": { + "@//:py310_aarch64_linux": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", "deps": [ @@ -36,7 +36,7 @@ } }, "pkg-e": { - "@//:aarch64_linux": { + "@//:py310_aarch64_linux": { "url": "http://localhost:8989/packages/pkg_e-4.0-py3-none-any.whl", "sha256": "ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7", "deps": [] diff --git a/examples/pypi_install/intermediate_file_x86_64_linux.json b/examples/pypi_install/intermediate_file_py310_x86_64_linux.json similarity index 87% rename from examples/pypi_install/intermediate_file_x86_64_linux.json rename to examples/pypi_install/intermediate_file_py310_x86_64_linux.json index 2fe458a09d..6919f5724f 100644 --- a/examples/pypi_install/intermediate_file_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_py310_x86_64_linux.json @@ -1,6 +1,6 @@ { "pkg-a": { - "@//:x86_64_linux": { + "@//:py310_x86_64_linux": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", "deps": [ @@ -9,7 +9,7 @@ } }, "pkg-b": { - "@//:x86_64_linux": { + "@//:py310_x86_64_linux": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", "deps": [ @@ -19,14 +19,14 @@ } }, "pkg-c": { - "@//:x86_64_linux": { + "@//:py310_x86_64_linux": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", "deps": [] } }, "pkg-d": { - "@//:x86_64_linux": { + "@//:py310_x86_64_linux": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", "deps": [ diff --git a/examples/pypi_install/intermediate_file_py311_aarch64_linux.json b/examples/pypi_install/intermediate_file_py311_aarch64_linux.json new file mode 100644 index 0000000000..27f5e8cc6f --- /dev/null +++ b/examples/pypi_install/intermediate_file_py311_aarch64_linux.json @@ -0,0 +1,45 @@ +{ + "pkg-a": { + "@//:py311_aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", + "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", + "deps": [ + "pkg-b" + ] + } + }, + "pkg-b": { + "@//:py311_aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", + "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", + "deps": [ + "pkg-c", + "pkg-d", + "pkg-e" + ] + } + }, + "pkg-c": { + "@//:py311_aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", + "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", + "deps": [] + } + }, + "pkg-d": { + "@//:py311_aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", + "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", + "deps": [ + "pkg-b" + ] + } + }, + "pkg-e": { + "@//:py311_aarch64_linux": { + "url": "http://localhost:8989/packages/pkg_e-4.0-py3-none-any.whl", + "sha256": "ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7", + "deps": [] + } + } +} diff --git a/examples/pypi_install/intermediate_file_py311_x86_64_linux.json b/examples/pypi_install/intermediate_file_py311_x86_64_linux.json new file mode 100644 index 0000000000..6da714946f --- /dev/null +++ b/examples/pypi_install/intermediate_file_py311_x86_64_linux.json @@ -0,0 +1,37 @@ +{ + "pkg-a": { + "@//:py311_x86_64_linux": { + "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", + "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", + "deps": [ + "pkg-b" + ] + } + }, + "pkg-b": { + "@//:py311_x86_64_linux": { + "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", + "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", + "deps": [ + "pkg-c", + "pkg-d" + ] + } + }, + "pkg-c": { + "@//:py311_x86_64_linux": { + "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", + "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", + "deps": [] + } + }, + "pkg-d": { + "@//:py311_x86_64_linux": { + "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", + "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", + "deps": [ + "pkg-b" + ] + } + } +} diff --git a/examples/pypi_install/requirements_lock_aarch64_linux.txt b/examples/pypi_install/requirements_lock_py310_aarch64_linux.txt similarity index 100% rename from examples/pypi_install/requirements_lock_aarch64_linux.txt rename to examples/pypi_install/requirements_lock_py310_aarch64_linux.txt diff --git a/examples/pypi_install/requirements_lock_x86_64_linux.txt b/examples/pypi_install/requirements_lock_py310_x86_64_linux.txt similarity index 100% rename from examples/pypi_install/requirements_lock_x86_64_linux.txt rename to examples/pypi_install/requirements_lock_py310_x86_64_linux.txt diff --git a/examples/pypi_install/requirements_lock_py311_aarch64_linux.txt b/examples/pypi_install/requirements_lock_py311_aarch64_linux.txt new file mode 100644 index 0000000000..cf8eb5ee78 --- /dev/null +++ b/examples/pypi_install/requirements_lock_py311_aarch64_linux.txt @@ -0,0 +1,25 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# bazel run //:requirements.update +# +--index-url http://localhost:8989/simple/ + +pkg-a==1.0 \ + --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 + # via -r requirements.in +pkg-b==1.1 \ + --hash=sha256:0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3 + # via + # pkg-a + # pkg-d +pkg-c==2.0 \ + --hash=sha256:76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669 + # via pkg-b +pkg-d==3.0 \ + --hash=sha256:f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2 + # via pkg-b +pkg-e==4.0 \ + --hash=sha256:ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7 + # via pkg-b diff --git a/examples/pypi_install/requirements_lock_py311_x86_64_linux.txt b/examples/pypi_install/requirements_lock_py311_x86_64_linux.txt new file mode 100644 index 0000000000..2b79b6c353 --- /dev/null +++ b/examples/pypi_install/requirements_lock_py311_x86_64_linux.txt @@ -0,0 +1,22 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# bazel run //:requirements.update +# +--index-url http://localhost:8989/simple/ + +pkg-a==1.0 \ + --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 + # via -r requirements.in +pkg-b==1.1 \ + --hash=sha256:0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3 + # via + # pkg-a + # pkg-d +pkg-c==2.0 \ + --hash=sha256:76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669 + # via pkg-b +pkg-d==3.0 \ + --hash=sha256:f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2 + # via pkg-b diff --git a/examples/pypi_install/update_helper/README.md b/examples/pypi_install/update_helper/README.md index f5a3a51bd0..1b970b516b 100644 --- a/examples/pypi_install/update_helper/README.md +++ b/examples/pypi_install/update_helper/README.md @@ -8,12 +8,5 @@ sudo apt install qemu-user-static Then update for x86: ``` -export DOCKER_BUILDKIT=1 -bazel run //:requirements.update --run_under="//update_helper linux/amd64" --platforms=//platforms:linux_x86 -``` - -And update for arm64: -``` -export DOCKER_BUILDKIT=1 -bazel run //:requirements.update --run_under="//update_helper linux/arm64/v8" --platforms=//platforms:linux_aarch64 +./update_helper/update_all.sh ``` diff --git a/examples/pypi_install/update_helper/update_all.sh b/examples/pypi_install/update_helper/update_all.sh new file mode 100755 index 0000000000..b31610fbdd --- /dev/null +++ b/examples/pypi_install/update_helper/update_all.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +export DOCKER_BUILDKIT=1 + +set -x +for py in py310 py311; do + bazel run \ + --config="${py}" \ + --run_under="//update_helper linux/amd64" \ + --platforms=//platforms:linux_x86 \ + //:requirements.update + bazel run \ + --config="${py}" \ + --run_under="//update_helper linux/arm64/v8" \ + --platforms=//platforms:linux_aarch64 \ + //:requirements.update +done From 93f9df3c601bab2afe41a8312371ab86f1047636 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 11 Feb 2024 21:52:05 -0800 Subject: [PATCH 94/96] Clean up naming. --- examples/pypi_install/BUILD.bazel | 24 ++++++------ examples/pypi_install/WORKSPACE | 6 ++- ...ntermediate_file_py310_linux_aarch64.json} | 10 ++--- ...intermediate_file_py310_linux_x86_64.json} | 8 ++-- ...ntermediate_file_py311_linux_aarch64.json} | 10 ++--- ...intermediate_file_py311_linux_x86_64.json} | 8 ++-- examples/pypi_install/platforms/BUILD.bazel | 2 +- ...requirements_lock_py310_linux_aarch64.txt} | 0 ... requirements_lock_py310_linux_x86_64.txt} | 0 ...requirements_lock_py311_linux_aarch64.txt} | 0 ... requirements_lock_py311_linux_x86_64.txt} | 0 examples/pypi_install/test/BUILD.bazel | 26 +++++++------ .../test/transitioned_par_file.bzl | 3 ++ .../test/transitioned_par_file_test.py | 38 ++++++++++++++----- 14 files changed, 80 insertions(+), 55 deletions(-) rename examples/pypi_install/{intermediate_file_py310_aarch64_linux.json => intermediate_file_py310_linux_aarch64.json} (87%) rename examples/pypi_install/{intermediate_file_py310_x86_64_linux.json => intermediate_file_py310_linux_x86_64.json} (87%) rename examples/pypi_install/{intermediate_file_py311_aarch64_linux.json => intermediate_file_py311_linux_aarch64.json} (87%) rename examples/pypi_install/{intermediate_file_py311_x86_64_linux.json => intermediate_file_py311_linux_x86_64.json} (87%) rename examples/pypi_install/{requirements_lock_py310_aarch64_linux.txt => requirements_lock_py310_linux_aarch64.txt} (100%) rename examples/pypi_install/{requirements_lock_py310_x86_64_linux.txt => requirements_lock_py310_linux_x86_64.txt} (100%) rename examples/pypi_install/{requirements_lock_py311_aarch64_linux.txt => requirements_lock_py311_linux_aarch64.txt} (100%) rename examples/pypi_install/{requirements_lock_py311_x86_64_linux.txt => requirements_lock_py311_linux_x86_64.txt} (100%) diff --git a/examples/pypi_install/BUILD.bazel b/examples/pypi_install/BUILD.bazel index cba006c6cf..2eb7bea1a8 100644 --- a/examples/pypi_install/BUILD.bazel +++ b/examples/pypi_install/BUILD.bazel @@ -22,10 +22,10 @@ py_test( compile_pip_requirements( name = "requirements", intermediate_file = { - "@//:py310_aarch64_linux": "intermediate_file_py310_aarch64_linux.json", - "@//:py310_x86_64_linux": "intermediate_file_py310_x86_64_linux.json", - "@//:py311_aarch64_linux": "intermediate_file_py311_aarch64_linux.json", - "@//:py311_x86_64_linux": "intermediate_file_py311_x86_64_linux.json", + "@//:py310_linux_aarch64": "intermediate_file_py310_linux_aarch64.json", + "@//:py310_linux_x86_64": "intermediate_file_py310_linux_x86_64.json", + "@//:py311_linux_aarch64": "intermediate_file_py311_linux_aarch64.json", + "@//:py311_linux_x86_64": "intermediate_file_py311_linux_x86_64.json", }, # That binary will let users modify the intermediate file. Then they can: # - Inject dependencies. @@ -39,10 +39,10 @@ compile_pip_requirements( # the file. Having these values as dictionaries allows us to do some # validation before the underlying targets get instantiated. requirements_txt = { - "@//:py310_aarch64_linux": "requirements_lock_py310_aarch64_linux.txt", - "@//:py310_x86_64_linux": "requirements_lock_py310_x86_64_linux.txt", - "@//:py311_aarch64_linux": "requirements_lock_py311_aarch64_linux.txt", - "@//:py311_x86_64_linux": "requirements_lock_py311_x86_64_linux.txt", + "@//:py310_linux_aarch64": "requirements_lock_py310_linux_aarch64.txt", + "@//:py310_linux_x86_64": "requirements_lock_py310_linux_x86_64.txt", + "@//:py311_linux_aarch64": "requirements_lock_py311_linux_aarch64.txt", + "@//:py311_linux_x86_64": "requirements_lock_py311_linux_x86_64.txt", }, extra_args = [ # Since we may frequently tweak the wheels for development, we can't @@ -61,7 +61,7 @@ py_binary( ) config_setting( - name = "aarch64_linux", + name = "linux_aarch64", constraint_values = [ "@platforms//cpu:aarch64", "@platforms//os:linux", @@ -69,7 +69,7 @@ config_setting( ) config_setting( - name = "x86_64_linux", + name = "linux_x86_64", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:linux", @@ -86,8 +86,8 @@ config_setting( "3.10", "3.11", ) for platform in ( - "aarch64_linux", - "x86_64_linux", + "linux_aarch64", + "linux_x86_64", )] genquery( diff --git a/examples/pypi_install/WORKSPACE b/examples/pypi_install/WORKSPACE index 193c218338..5128b5ce0b 100644 --- a/examples/pypi_install/WORKSPACE +++ b/examples/pypi_install/WORKSPACE @@ -31,8 +31,10 @@ pypi_install( # TODO(phil): Add test to make sure that the config settings are mutually # exclusive. pip_installation_report = [ - "//:intermediate_file_py310_x86_64_linux.json", - "//:intermediate_file_py310_aarch64_linux.json", + "//:intermediate_file_py310_linux_x86_64.json", + "//:intermediate_file_py310_linux_aarch64.json", + "//:intermediate_file_py311_linux_x86_64.json", + "//:intermediate_file_py311_linux_aarch64.json", ], ) diff --git a/examples/pypi_install/intermediate_file_py310_aarch64_linux.json b/examples/pypi_install/intermediate_file_py310_linux_aarch64.json similarity index 87% rename from examples/pypi_install/intermediate_file_py310_aarch64_linux.json rename to examples/pypi_install/intermediate_file_py310_linux_aarch64.json index d5c6861292..57a903560a 100644 --- a/examples/pypi_install/intermediate_file_py310_aarch64_linux.json +++ b/examples/pypi_install/intermediate_file_py310_linux_aarch64.json @@ -1,6 +1,6 @@ { "pkg-a": { - "@//:py310_aarch64_linux": { + "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", "deps": [ @@ -9,7 +9,7 @@ } }, "pkg-b": { - "@//:py310_aarch64_linux": { + "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", "deps": [ @@ -20,14 +20,14 @@ } }, "pkg-c": { - "@//:py310_aarch64_linux": { + "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", "deps": [] } }, "pkg-d": { - "@//:py310_aarch64_linux": { + "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", "deps": [ @@ -36,7 +36,7 @@ } }, "pkg-e": { - "@//:py310_aarch64_linux": { + "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_e-4.0-py3-none-any.whl", "sha256": "ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7", "deps": [] diff --git a/examples/pypi_install/intermediate_file_py310_x86_64_linux.json b/examples/pypi_install/intermediate_file_py310_linux_x86_64.json similarity index 87% rename from examples/pypi_install/intermediate_file_py310_x86_64_linux.json rename to examples/pypi_install/intermediate_file_py310_linux_x86_64.json index 6919f5724f..2ed8f568c2 100644 --- a/examples/pypi_install/intermediate_file_py310_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_py310_linux_x86_64.json @@ -1,6 +1,6 @@ { "pkg-a": { - "@//:py310_x86_64_linux": { + "@//:py310_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", "deps": [ @@ -9,7 +9,7 @@ } }, "pkg-b": { - "@//:py310_x86_64_linux": { + "@//:py310_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", "deps": [ @@ -19,14 +19,14 @@ } }, "pkg-c": { - "@//:py310_x86_64_linux": { + "@//:py310_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", "deps": [] } }, "pkg-d": { - "@//:py310_x86_64_linux": { + "@//:py310_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", "deps": [ diff --git a/examples/pypi_install/intermediate_file_py311_aarch64_linux.json b/examples/pypi_install/intermediate_file_py311_linux_aarch64.json similarity index 87% rename from examples/pypi_install/intermediate_file_py311_aarch64_linux.json rename to examples/pypi_install/intermediate_file_py311_linux_aarch64.json index 27f5e8cc6f..439f8376c3 100644 --- a/examples/pypi_install/intermediate_file_py311_aarch64_linux.json +++ b/examples/pypi_install/intermediate_file_py311_linux_aarch64.json @@ -1,6 +1,6 @@ { "pkg-a": { - "@//:py311_aarch64_linux": { + "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", "deps": [ @@ -9,7 +9,7 @@ } }, "pkg-b": { - "@//:py311_aarch64_linux": { + "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", "deps": [ @@ -20,14 +20,14 @@ } }, "pkg-c": { - "@//:py311_aarch64_linux": { + "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", "deps": [] } }, "pkg-d": { - "@//:py311_aarch64_linux": { + "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", "deps": [ @@ -36,7 +36,7 @@ } }, "pkg-e": { - "@//:py311_aarch64_linux": { + "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_e-4.0-py3-none-any.whl", "sha256": "ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7", "deps": [] diff --git a/examples/pypi_install/intermediate_file_py311_x86_64_linux.json b/examples/pypi_install/intermediate_file_py311_linux_x86_64.json similarity index 87% rename from examples/pypi_install/intermediate_file_py311_x86_64_linux.json rename to examples/pypi_install/intermediate_file_py311_linux_x86_64.json index 6da714946f..aacdfcc33e 100644 --- a/examples/pypi_install/intermediate_file_py311_x86_64_linux.json +++ b/examples/pypi_install/intermediate_file_py311_linux_x86_64.json @@ -1,6 +1,6 @@ { "pkg-a": { - "@//:py311_x86_64_linux": { + "@//:py311_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", "deps": [ @@ -9,7 +9,7 @@ } }, "pkg-b": { - "@//:py311_x86_64_linux": { + "@//:py311_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", "deps": [ @@ -19,14 +19,14 @@ } }, "pkg-c": { - "@//:py311_x86_64_linux": { + "@//:py311_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", "deps": [] } }, "pkg-d": { - "@//:py311_x86_64_linux": { + "@//:py311_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", "deps": [ diff --git a/examples/pypi_install/platforms/BUILD.bazel b/examples/pypi_install/platforms/BUILD.bazel index 06dbd14da6..7c0983d0f0 100644 --- a/examples/pypi_install/platforms/BUILD.bazel +++ b/examples/pypi_install/platforms/BUILD.bazel @@ -8,7 +8,7 @@ platform( ) platform( - name = "linux_x86", + name = "linux_x86_64", constraint_values = [ "@platforms//os:linux", "@platforms//cpu:x86_64", diff --git a/examples/pypi_install/requirements_lock_py310_aarch64_linux.txt b/examples/pypi_install/requirements_lock_py310_linux_aarch64.txt similarity index 100% rename from examples/pypi_install/requirements_lock_py310_aarch64_linux.txt rename to examples/pypi_install/requirements_lock_py310_linux_aarch64.txt diff --git a/examples/pypi_install/requirements_lock_py310_x86_64_linux.txt b/examples/pypi_install/requirements_lock_py310_linux_x86_64.txt similarity index 100% rename from examples/pypi_install/requirements_lock_py310_x86_64_linux.txt rename to examples/pypi_install/requirements_lock_py310_linux_x86_64.txt diff --git a/examples/pypi_install/requirements_lock_py311_aarch64_linux.txt b/examples/pypi_install/requirements_lock_py311_linux_aarch64.txt similarity index 100% rename from examples/pypi_install/requirements_lock_py311_aarch64_linux.txt rename to examples/pypi_install/requirements_lock_py311_linux_aarch64.txt diff --git a/examples/pypi_install/requirements_lock_py311_x86_64_linux.txt b/examples/pypi_install/requirements_lock_py311_linux_x86_64.txt similarity index 100% rename from examples/pypi_install/requirements_lock_py311_x86_64_linux.txt rename to examples/pypi_install/requirements_lock_py311_linux_x86_64.txt diff --git a/examples/pypi_install/test/BUILD.bazel b/examples/pypi_install/test/BUILD.bazel index ca6bcb62ad..b6253c51f9 100644 --- a/examples/pypi_install/test/BUILD.bazel +++ b/examples/pypi_install/test/BUILD.bazel @@ -9,23 +9,25 @@ py_binary( ], ) -transitioned_par_file( - name = "test_binary_linux_aarch64", +[transitioned_par_file( + name = "test_binary_{}_{}".format(version.replace(".", ""), platform), src = ":test_binary", - platform = "//platforms:linux_aarch64", -) - -transitioned_par_file( - name = "test_binary_linux_x86", - src = ":test_binary", - platform = "//platforms:linux_x86", -) + platform = "//platforms:{}".format(platform), + python_version = version, +) for version in ( + "py3.10", + "py3.11", +) for platform in ( + "linux_aarch64", + "linux_x86_64", +)] py_test( name = "transitioned_par_file_test", srcs = ["transitioned_par_file_test.py"], data = [ - ":test_binary_linux_aarch64", - ":test_binary_linux_x86", + ":test_binary_{}_{}".format(version, platform) + for version in ("py310", "py311") + for platform in ("linux_aarch64", "linux_x86_64") ], ) diff --git a/examples/pypi_install/test/transitioned_par_file.bzl b/examples/pypi_install/test/transitioned_par_file.bzl index 62ce62d82e..e542e4e33e 100644 --- a/examples/pypi_install/test/transitioned_par_file.bzl +++ b/examples/pypi_install/test/transitioned_par_file.bzl @@ -2,6 +2,7 @@ def _platform_transition_impl(settings, attr): return { "//command_line_option:platforms": str(attr.platform), + "@rules_python//python/config_settings:python_version": attr.python_version, } _platform_transition = transition( @@ -9,6 +10,7 @@ _platform_transition = transition( inputs = [], outputs = [ "//command_line_option:platforms", + "@rules_python//python/config_settings:python_version", ], ) @@ -30,5 +32,6 @@ transitioned_par_file = rule( cfg = _platform_transition, ), "platform": attr.label(), + "python_version": attr.string(), }, ) diff --git a/examples/pypi_install/test/transitioned_par_file_test.py b/examples/pypi_install/test/transitioned_par_file_test.py index b95bdb3f54..4f0b90ef3f 100644 --- a/examples/pypi_install/test/transitioned_par_file_test.py +++ b/examples/pypi_install/test/transitioned_par_file_test.py @@ -2,8 +2,10 @@ import zipfile from pathlib import Path -AARCH64_BIN = "external/python39_aarch64-unknown-linux-gnu/bin/python3" -X86_BIN = "external/python39_x86_64-unknown-linux-gnu/bin/python3" +PY310_AARCH64_BIN = "external/python310_aarch64-unknown-linux-gnu/bin/python3" +PY310_X86_64_BIN = "external/python310_x86_64-unknown-linux-gnu/bin/python3" +PY311_AARCH64_BIN = "external/python311_aarch64-unknown-linux-gnu/bin/python3" +PY311_X86_64_BIN = "external/python311_x86_64-unknown-linux-gnu/bin/python3" def library_is_in_file_list(library_name, file_list): for name in file_list: @@ -15,19 +17,35 @@ def library_is_in_file_list(library_name, file_list): class ParFileTest(unittest.TestCase): - def test_linux_aarch64(self): - file_list = Path("test/test_binary_linux_aarch64.txt").read_text().splitlines() + def test_linux_py310_aarch64(self): + file_list = Path("test/test_binary_py310_linux_aarch64.txt").read_text().splitlines() - self.assertIn(AARCH64_BIN, file_list) - self.assertNotIn(X86_BIN, file_list) + self.assertIn(PY310_AARCH64_BIN, file_list) + self.assertNotIn(PY310_X86_64_BIN, file_list) self.assertTrue(library_is_in_file_list("pkg_a", file_list)) self.assertTrue(library_is_in_file_list("pkg_e", file_list)) - def test_linux_x86(self): - file_list = Path("test/test_binary_linux_x86.txt").read_text().splitlines() + def test_linux_py310_x86_64(self): + file_list = Path("test/test_binary_py310_linux_x86_64.txt").read_text().splitlines() - self.assertNotIn(AARCH64_BIN, file_list) - self.assertIn(X86_BIN, file_list) + self.assertNotIn(PY310_AARCH64_BIN, file_list) + self.assertIn(PY310_X86_64_BIN, file_list) + self.assertTrue(library_is_in_file_list("pkg_a", file_list)) + self.assertFalse(library_is_in_file_list("pkg_e", file_list)) + + def test_linux_py311_aarch64(self): + file_list = Path("test/test_binary_py311_linux_aarch64.txt").read_text().splitlines() + + self.assertIn(PY311_AARCH64_BIN, file_list) + self.assertNotIn(PY311_X86_64_BIN, file_list) + self.assertTrue(library_is_in_file_list("pkg_a", file_list)) + self.assertTrue(library_is_in_file_list("pkg_e", file_list)) + + def test_linux_py311_x86_64(self): + file_list = Path("test/test_binary_py311_linux_x86_64.txt").read_text().splitlines() + + self.assertNotIn(PY311_AARCH64_BIN, file_list) + self.assertIn(PY311_X86_64_BIN, file_list) self.assertTrue(library_is_in_file_list("pkg_a", file_list)) self.assertFalse(library_is_in_file_list("pkg_e", file_list)) From 4bd644369535127bd30d9b9b83afa13566667410 Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 11 Feb 2024 21:56:26 -0800 Subject: [PATCH 95/96] fix up tests --- examples/pypi_install/test/transitioned_par_file.bzl | 2 +- examples/pypi_install/test/transitioned_par_file_test.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/pypi_install/test/transitioned_par_file.bzl b/examples/pypi_install/test/transitioned_par_file.bzl index e542e4e33e..cdcea602ef 100644 --- a/examples/pypi_install/test/transitioned_par_file.bzl +++ b/examples/pypi_install/test/transitioned_par_file.bzl @@ -2,7 +2,7 @@ def _platform_transition_impl(settings, attr): return { "//command_line_option:platforms": str(attr.platform), - "@rules_python//python/config_settings:python_version": attr.python_version, + "@rules_python//python/config_settings:python_version": attr.python_version.removeprefix("py"), } _platform_transition = transition( diff --git a/examples/pypi_install/test/transitioned_par_file_test.py b/examples/pypi_install/test/transitioned_par_file_test.py index 4f0b90ef3f..7feedac80d 100644 --- a/examples/pypi_install/test/transitioned_par_file_test.py +++ b/examples/pypi_install/test/transitioned_par_file_test.py @@ -2,10 +2,10 @@ import zipfile from pathlib import Path -PY310_AARCH64_BIN = "external/python310_aarch64-unknown-linux-gnu/bin/python3" -PY310_X86_64_BIN = "external/python310_x86_64-unknown-linux-gnu/bin/python3" -PY311_AARCH64_BIN = "external/python311_aarch64-unknown-linux-gnu/bin/python3" -PY311_X86_64_BIN = "external/python311_x86_64-unknown-linux-gnu/bin/python3" +PY310_AARCH64_BIN = "external/python_3_10_aarch64-unknown-linux-gnu/bin/python3" +PY310_X86_64_BIN = "external/python_3_10_x86_64-unknown-linux-gnu/bin/python3" +PY311_AARCH64_BIN = "external/python_3_11_aarch64-unknown-linux-gnu/bin/python3" +PY311_X86_64_BIN = "external/python_3_11_x86_64-unknown-linux-gnu/bin/python3" def library_is_in_file_list(library_name, file_list): for name in file_list: From 1582943871b5e1568b33ed7d1d601b219c9d26de Mon Sep 17 00:00:00 2001 From: Philipp Schrader Date: Sun, 11 Feb 2024 22:10:09 -0800 Subject: [PATCH 96/96] add version-specific package --- ...intermediate_file_py310_linux_aarch64.json | 10 ++++----- .../intermediate_file_py310_linux_x86_64.json | 8 +++---- ...intermediate_file_py311_linux_aarch64.json | 21 +++++++++++++------ .../intermediate_file_py311_linux_x86_64.json | 19 ++++++++++++----- .../requirements_lock_py310_linux_aarch64.txt | 10 ++++----- .../requirements_lock_py310_linux_x86_64.txt | 8 +++---- .../requirements_lock_py311_linux_aarch64.txt | 13 +++++++----- .../requirements_lock_py311_linux_x86_64.txt | 11 ++++++---- .../test/transitioned_par_file_test.py | 4 ++++ .../pypi_install/update_helper/update_all.sh | 2 +- .../update_helper/update_helper.sh | 1 + examples/pypi_install/wheels/BUILD.bazel | 13 ++++++++++++ .../pypi_install/wheels/pypiserver_runner.py | 1 + 13 files changed, 82 insertions(+), 39 deletions(-) diff --git a/examples/pypi_install/intermediate_file_py310_linux_aarch64.json b/examples/pypi_install/intermediate_file_py310_linux_aarch64.json index 57a903560a..f25b283a16 100644 --- a/examples/pypi_install/intermediate_file_py310_linux_aarch64.json +++ b/examples/pypi_install/intermediate_file_py310_linux_aarch64.json @@ -2,7 +2,7 @@ "pkg-a": { "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", - "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", + "sha256": "a0d9f8c13927e9a2b11260c7add67c827921d9727242247f31c605704bff5ff4", "deps": [ "pkg-b" ] @@ -11,7 +11,7 @@ "pkg-b": { "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", - "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", + "sha256": "05cd20f93e030fcb81b83190bb9926590954d94a3552f0f0567232743e9e8c23", "deps": [ "pkg-c", "pkg-d", @@ -22,14 +22,14 @@ "pkg-c": { "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", - "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", + "sha256": "1fd7e8c2c3a8bfb045b365f4c805d40986f1b7a164537458164d82ffc6aed636", "deps": [] } }, "pkg-d": { "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", - "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", + "sha256": "de78d858ac71ffe1a5f9c7ddc58a8b26938e62f6583f1143fde0957389d3986f", "deps": [ "pkg-b" ] @@ -38,7 +38,7 @@ "pkg-e": { "@//:py310_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_e-4.0-py3-none-any.whl", - "sha256": "ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7", + "sha256": "9d2fcec39f4f7e8b4e0d0d9bc8f1b06ee582af6dea8db258d031aa64089ca363", "deps": [] } } diff --git a/examples/pypi_install/intermediate_file_py310_linux_x86_64.json b/examples/pypi_install/intermediate_file_py310_linux_x86_64.json index 2ed8f568c2..4d183c9900 100644 --- a/examples/pypi_install/intermediate_file_py310_linux_x86_64.json +++ b/examples/pypi_install/intermediate_file_py310_linux_x86_64.json @@ -2,7 +2,7 @@ "pkg-a": { "@//:py310_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", - "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", + "sha256": "a0d9f8c13927e9a2b11260c7add67c827921d9727242247f31c605704bff5ff4", "deps": [ "pkg-b" ] @@ -11,7 +11,7 @@ "pkg-b": { "@//:py310_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", - "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", + "sha256": "05cd20f93e030fcb81b83190bb9926590954d94a3552f0f0567232743e9e8c23", "deps": [ "pkg-c", "pkg-d" @@ -21,14 +21,14 @@ "pkg-c": { "@//:py310_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", - "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", + "sha256": "1fd7e8c2c3a8bfb045b365f4c805d40986f1b7a164537458164d82ffc6aed636", "deps": [] } }, "pkg-d": { "@//:py310_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", - "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", + "sha256": "de78d858ac71ffe1a5f9c7ddc58a8b26938e62f6583f1143fde0957389d3986f", "deps": [ "pkg-b" ] diff --git a/examples/pypi_install/intermediate_file_py311_linux_aarch64.json b/examples/pypi_install/intermediate_file_py311_linux_aarch64.json index 439f8376c3..30e24aca88 100644 --- a/examples/pypi_install/intermediate_file_py311_linux_aarch64.json +++ b/examples/pypi_install/intermediate_file_py311_linux_aarch64.json @@ -2,7 +2,7 @@ "pkg-a": { "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", - "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", + "sha256": "a0d9f8c13927e9a2b11260c7add67c827921d9727242247f31c605704bff5ff4", "deps": [ "pkg-b" ] @@ -11,7 +11,7 @@ "pkg-b": { "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", - "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", + "sha256": "05cd20f93e030fcb81b83190bb9926590954d94a3552f0f0567232743e9e8c23", "deps": [ "pkg-c", "pkg-d", @@ -22,14 +22,16 @@ "pkg-c": { "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", - "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", - "deps": [] + "sha256": "1fd7e8c2c3a8bfb045b365f4c805d40986f1b7a164537458164d82ffc6aed636", + "deps": [ + "pkg-f" + ] } }, "pkg-d": { "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", - "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", + "sha256": "de78d858ac71ffe1a5f9c7ddc58a8b26938e62f6583f1143fde0957389d3986f", "deps": [ "pkg-b" ] @@ -38,7 +40,14 @@ "pkg-e": { "@//:py311_linux_aarch64": { "url": "http://localhost:8989/packages/pkg_e-4.0-py3-none-any.whl", - "sha256": "ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7", + "sha256": "9d2fcec39f4f7e8b4e0d0d9bc8f1b06ee582af6dea8db258d031aa64089ca363", + "deps": [] + } + }, + "pkg-f": { + "@//:py311_linux_aarch64": { + "url": "http://localhost:8989/packages/pkg_f-1.0-py3-none-any.whl", + "sha256": "4245ce524d3cd27f0269902040b6b21ade2aed8f0b2c875ffe2678980713c6c7", "deps": [] } } diff --git a/examples/pypi_install/intermediate_file_py311_linux_x86_64.json b/examples/pypi_install/intermediate_file_py311_linux_x86_64.json index aacdfcc33e..64ac5607fe 100644 --- a/examples/pypi_install/intermediate_file_py311_linux_x86_64.json +++ b/examples/pypi_install/intermediate_file_py311_linux_x86_64.json @@ -2,7 +2,7 @@ "pkg-a": { "@//:py311_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_a-1.0-py3-none-any.whl", - "sha256": "d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1", + "sha256": "a0d9f8c13927e9a2b11260c7add67c827921d9727242247f31c605704bff5ff4", "deps": [ "pkg-b" ] @@ -11,7 +11,7 @@ "pkg-b": { "@//:py311_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_b-1.1-py3-none-any.whl", - "sha256": "0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3", + "sha256": "05cd20f93e030fcb81b83190bb9926590954d94a3552f0f0567232743e9e8c23", "deps": [ "pkg-c", "pkg-d" @@ -21,17 +21,26 @@ "pkg-c": { "@//:py311_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_c-2.0-py3-none-any.whl", - "sha256": "76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669", - "deps": [] + "sha256": "1fd7e8c2c3a8bfb045b365f4c805d40986f1b7a164537458164d82ffc6aed636", + "deps": [ + "pkg-f" + ] } }, "pkg-d": { "@//:py311_linux_x86_64": { "url": "http://localhost:8989/packages/pkg_d-3.0-py3-none-any.whl", - "sha256": "f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2", + "sha256": "de78d858ac71ffe1a5f9c7ddc58a8b26938e62f6583f1143fde0957389d3986f", "deps": [ "pkg-b" ] } + }, + "pkg-f": { + "@//:py311_linux_x86_64": { + "url": "http://localhost:8989/packages/pkg_f-1.0-py3-none-any.whl", + "sha256": "4245ce524d3cd27f0269902040b6b21ade2aed8f0b2c875ffe2678980713c6c7", + "deps": [] + } } } diff --git a/examples/pypi_install/requirements_lock_py310_linux_aarch64.txt b/examples/pypi_install/requirements_lock_py310_linux_aarch64.txt index 632585b720..d8327ba627 100644 --- a/examples/pypi_install/requirements_lock_py310_linux_aarch64.txt +++ b/examples/pypi_install/requirements_lock_py310_linux_aarch64.txt @@ -7,19 +7,19 @@ --index-url http://localhost:8989/simple/ pkg-a==1.0 \ - --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 + --hash=sha256:a0d9f8c13927e9a2b11260c7add67c827921d9727242247f31c605704bff5ff4 # via -r requirements.in pkg-b==1.1 \ - --hash=sha256:0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3 + --hash=sha256:05cd20f93e030fcb81b83190bb9926590954d94a3552f0f0567232743e9e8c23 # via # pkg-a # pkg-d pkg-c==2.0 \ - --hash=sha256:76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669 + --hash=sha256:1fd7e8c2c3a8bfb045b365f4c805d40986f1b7a164537458164d82ffc6aed636 # via pkg-b pkg-d==3.0 \ - --hash=sha256:f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2 + --hash=sha256:de78d858ac71ffe1a5f9c7ddc58a8b26938e62f6583f1143fde0957389d3986f # via pkg-b pkg-e==4.0 \ - --hash=sha256:ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7 + --hash=sha256:9d2fcec39f4f7e8b4e0d0d9bc8f1b06ee582af6dea8db258d031aa64089ca363 # via pkg-b diff --git a/examples/pypi_install/requirements_lock_py310_linux_x86_64.txt b/examples/pypi_install/requirements_lock_py310_linux_x86_64.txt index a78681bf11..cb70f7438b 100644 --- a/examples/pypi_install/requirements_lock_py310_linux_x86_64.txt +++ b/examples/pypi_install/requirements_lock_py310_linux_x86_64.txt @@ -7,16 +7,16 @@ --index-url http://localhost:8989/simple/ pkg-a==1.0 \ - --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 + --hash=sha256:a0d9f8c13927e9a2b11260c7add67c827921d9727242247f31c605704bff5ff4 # via -r requirements.in pkg-b==1.1 \ - --hash=sha256:0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3 + --hash=sha256:05cd20f93e030fcb81b83190bb9926590954d94a3552f0f0567232743e9e8c23 # via # pkg-a # pkg-d pkg-c==2.0 \ - --hash=sha256:76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669 + --hash=sha256:1fd7e8c2c3a8bfb045b365f4c805d40986f1b7a164537458164d82ffc6aed636 # via pkg-b pkg-d==3.0 \ - --hash=sha256:f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2 + --hash=sha256:de78d858ac71ffe1a5f9c7ddc58a8b26938e62f6583f1143fde0957389d3986f # via pkg-b diff --git a/examples/pypi_install/requirements_lock_py311_linux_aarch64.txt b/examples/pypi_install/requirements_lock_py311_linux_aarch64.txt index cf8eb5ee78..98a93db8da 100644 --- a/examples/pypi_install/requirements_lock_py311_linux_aarch64.txt +++ b/examples/pypi_install/requirements_lock_py311_linux_aarch64.txt @@ -7,19 +7,22 @@ --index-url http://localhost:8989/simple/ pkg-a==1.0 \ - --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 + --hash=sha256:a0d9f8c13927e9a2b11260c7add67c827921d9727242247f31c605704bff5ff4 # via -r requirements.in pkg-b==1.1 \ - --hash=sha256:0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3 + --hash=sha256:05cd20f93e030fcb81b83190bb9926590954d94a3552f0f0567232743e9e8c23 # via # pkg-a # pkg-d pkg-c==2.0 \ - --hash=sha256:76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669 + --hash=sha256:1fd7e8c2c3a8bfb045b365f4c805d40986f1b7a164537458164d82ffc6aed636 # via pkg-b pkg-d==3.0 \ - --hash=sha256:f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2 + --hash=sha256:de78d858ac71ffe1a5f9c7ddc58a8b26938e62f6583f1143fde0957389d3986f # via pkg-b pkg-e==4.0 \ - --hash=sha256:ad6b3c87ed3bf7ae7175cd1ecc19e57e22540863ea2fc565db85b4c459d748f7 + --hash=sha256:9d2fcec39f4f7e8b4e0d0d9bc8f1b06ee582af6dea8db258d031aa64089ca363 # via pkg-b +pkg-f==1.0 \ + --hash=sha256:4245ce524d3cd27f0269902040b6b21ade2aed8f0b2c875ffe2678980713c6c7 + # via pkg-c diff --git a/examples/pypi_install/requirements_lock_py311_linux_x86_64.txt b/examples/pypi_install/requirements_lock_py311_linux_x86_64.txt index 2b79b6c353..3b1865e142 100644 --- a/examples/pypi_install/requirements_lock_py311_linux_x86_64.txt +++ b/examples/pypi_install/requirements_lock_py311_linux_x86_64.txt @@ -7,16 +7,19 @@ --index-url http://localhost:8989/simple/ pkg-a==1.0 \ - --hash=sha256:d69d2e3d0ae4c2553808b3045997526e1cdd9cd326af69e764ae07ff8a5b8ab1 + --hash=sha256:a0d9f8c13927e9a2b11260c7add67c827921d9727242247f31c605704bff5ff4 # via -r requirements.in pkg-b==1.1 \ - --hash=sha256:0f63bf2fc636bad7600320b5a94337653f394b39d4d524998b020c4f08e548e3 + --hash=sha256:05cd20f93e030fcb81b83190bb9926590954d94a3552f0f0567232743e9e8c23 # via # pkg-a # pkg-d pkg-c==2.0 \ - --hash=sha256:76cdfc700082ad1baade0c79bd500e2551425e063ebe59caeb0ea5037a5fa669 + --hash=sha256:1fd7e8c2c3a8bfb045b365f4c805d40986f1b7a164537458164d82ffc6aed636 # via pkg-b pkg-d==3.0 \ - --hash=sha256:f8c16f8099eff9d0c0e409ea53471e7c56cdb700348ba314969fe490c3dce2f2 + --hash=sha256:de78d858ac71ffe1a5f9c7ddc58a8b26938e62f6583f1143fde0957389d3986f # via pkg-b +pkg-f==1.0 \ + --hash=sha256:4245ce524d3cd27f0269902040b6b21ade2aed8f0b2c875ffe2678980713c6c7 + # via pkg-c diff --git a/examples/pypi_install/test/transitioned_par_file_test.py b/examples/pypi_install/test/transitioned_par_file_test.py index 7feedac80d..0f66467390 100644 --- a/examples/pypi_install/test/transitioned_par_file_test.py +++ b/examples/pypi_install/test/transitioned_par_file_test.py @@ -24,6 +24,7 @@ def test_linux_py310_aarch64(self): self.assertNotIn(PY310_X86_64_BIN, file_list) self.assertTrue(library_is_in_file_list("pkg_a", file_list)) self.assertTrue(library_is_in_file_list("pkg_e", file_list)) + self.assertFalse(library_is_in_file_list("pkg_f", file_list)) def test_linux_py310_x86_64(self): file_list = Path("test/test_binary_py310_linux_x86_64.txt").read_text().splitlines() @@ -32,6 +33,7 @@ def test_linux_py310_x86_64(self): self.assertIn(PY310_X86_64_BIN, file_list) self.assertTrue(library_is_in_file_list("pkg_a", file_list)) self.assertFalse(library_is_in_file_list("pkg_e", file_list)) + self.assertFalse(library_is_in_file_list("pkg_f", file_list)) def test_linux_py311_aarch64(self): file_list = Path("test/test_binary_py311_linux_aarch64.txt").read_text().splitlines() @@ -40,6 +42,7 @@ def test_linux_py311_aarch64(self): self.assertNotIn(PY311_X86_64_BIN, file_list) self.assertTrue(library_is_in_file_list("pkg_a", file_list)) self.assertTrue(library_is_in_file_list("pkg_e", file_list)) + self.assertTrue(library_is_in_file_list("pkg_f", file_list)) def test_linux_py311_x86_64(self): file_list = Path("test/test_binary_py311_linux_x86_64.txt").read_text().splitlines() @@ -48,6 +51,7 @@ def test_linux_py311_x86_64(self): self.assertIn(PY311_X86_64_BIN, file_list) self.assertTrue(library_is_in_file_list("pkg_a", file_list)) self.assertFalse(library_is_in_file_list("pkg_e", file_list)) + self.assertTrue(library_is_in_file_list("pkg_f", file_list)) if __name__ == "__main__": unittest.main() diff --git a/examples/pypi_install/update_helper/update_all.sh b/examples/pypi_install/update_helper/update_all.sh index b31610fbdd..7129ca1e36 100755 --- a/examples/pypi_install/update_helper/update_all.sh +++ b/examples/pypi_install/update_helper/update_all.sh @@ -11,7 +11,7 @@ for py in py310 py311; do bazel run \ --config="${py}" \ --run_under="//update_helper linux/amd64" \ - --platforms=//platforms:linux_x86 \ + --platforms=//platforms:linux_x86_64 \ //:requirements.update bazel run \ --config="${py}" \ diff --git a/examples/pypi_install/update_helper/update_helper.sh b/examples/pypi_install/update_helper/update_helper.sh index 441ccb00ce..26be26bf8d 100755 --- a/examples/pypi_install/update_helper/update_helper.sh +++ b/examples/pypi_install/update_helper/update_helper.sh @@ -58,4 +58,5 @@ docker run \ "$@" # Fix permissions. +echo "Fixing up permissions after root user ran in docker container." sudo chown -R "${USER}:${USER}" "${BUILD_WORKSPACE_DIRECTORY}/bazel-bin/" || : diff --git a/examples/pypi_install/wheels/BUILD.bazel b/examples/pypi_install/wheels/BUILD.bazel index 8db694969a..927160eb91 100644 --- a/examples/pypi_install/wheels/BUILD.bazel +++ b/examples/pypi_install/wheels/BUILD.bazel @@ -18,6 +18,7 @@ load("@rules_python//python:packaging.bzl", "py_package", "py_wheel") "pkg_c", "pkg_d", "pkg_e", + "pkg_f", )] @@ -47,6 +48,9 @@ py_wheel( name = "pkg_c", distribution = "pkg-c", version = "2.0", + requires = [ + 'pkg-f ; python_version >= "3.11"', + ], deps = [":pkg_c_py_package"], strip_path_prefixes = ["wheels/src"], ) @@ -69,6 +73,14 @@ py_wheel( strip_path_prefixes = ["wheels/src"], ) +py_wheel( + name = "pkg_f", + distribution = "pkg-f", + version = "1.0", + deps = [":pkg_e_py_package"], + strip_path_prefixes = ["wheels/src"], +) + py_binary( name = "pypiserver_runner", srcs = ["pypiserver_runner.py"], @@ -81,6 +93,7 @@ py_binary( ":pkg_c", ":pkg_d", ":pkg_e", + ":pkg_f", "@rules_python//python/runfiles", ], ) diff --git a/examples/pypi_install/wheels/pypiserver_runner.py b/examples/pypi_install/wheels/pypiserver_runner.py index 7601eab2d6..a6fb95d8df 100644 --- a/examples/pypi_install/wheels/pypiserver_runner.py +++ b/examples/pypi_install/wheels/pypiserver_runner.py @@ -15,6 +15,7 @@ "pkg_c-2.0-py3-none-any.whl", "pkg_d-3.0-py3-none-any.whl", "pkg_e-4.0-py3-none-any.whl", + "pkg_f-1.0-py3-none-any.whl", ) def main():