diff --git a/.bazelrc b/.bazelrc index 498f0cd48..be0aa7bc0 100644 --- a/.bazelrc +++ b/.bazelrc @@ -10,8 +10,10 @@ common --define=SOME_VAR=SOME_VALUE common --@pypi//venv=default common --incompatible_enable_cc_toolchain_resolution +common --incompatible_enable_proto_toolchain_resolution common --@toolchains_llvm_bootstrapped//config:experimental_stub_libgcc_s common --@rules_cc//cc/toolchains/args/archiver_flags:use_libtool_on_macos=false +common --@protobuf//bazel/toolchains:prefer_prebuilt_protoc # TODO(bzlmod): Don't break proto common --per_file_copt=external/.*protobuf.*@--PROTOBUF_WAS_NOT_SUPPOSED_TO_BE_BUILT diff --git a/MODULE.bazel b/MODULE.bazel index 5ec2e2268..106d6dae3 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -18,6 +18,9 @@ bazel_dep(name = "rules_cc", version = "0.2.16") bazel_dep(name = "rules_pkg", version = "1.1.0") bazel_dep(name = "tar.bzl", version = "0.5.5") +# NB: LOWER BOUND on earliest BCR release of protobuf module, to avoid upgrading the root module by accident +bazel_dep(name = "protobuf", version = "3.19.6") + bazel_lib_toolchains = use_extension("@tar.bzl//tar:extensions.bzl", "toolchains") use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") @@ -103,6 +106,17 @@ bazel_dep(name = "xz", version = "5.4.5.bcr.7", dev_dependency = IS_RELEASE) bazel_dep(name = "zstd", version = "1.5.7", dev_dependency = IS_RELEASE) bazel_dep(name = "rules_multitool", version = "1.9.0", dev_dependency = IS_RELEASE) +# Support examples/protobuf +single_version_override( + module_name = "protobuf", + version = "33.4", +) + +register_toolchains( + "//examples/protobuf/toolchains:all", + dev_dependency = True, +) + multitool = use_extension("@rules_multitool//multitool:extension.bzl", "multitool", dev_dependency = IS_RELEASE) multitool.hub(lockfile = "//tools:tools.lock.json") use_repo(multitool, "multitool") diff --git a/examples/protobuf/BUILD.bazel b/examples/protobuf/BUILD.bazel new file mode 100644 index 000000000..815852a40 --- /dev/null +++ b/examples/protobuf/BUILD.bazel @@ -0,0 +1,13 @@ +load("@aspect_rules_py//py:defs.bzl", "py_binary") +load("@protobuf//bazel:proto_library.bzl", "proto_library") + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], +) + +py_binary( + name = "main", + srcs = ["__main__.py"], + deps = [":foo_proto"], +) diff --git a/examples/protobuf/__main__.py b/examples/protobuf/__main__.py new file mode 100644 index 000000000..be7ecc7c7 --- /dev/null +++ b/examples/protobuf/__main__.py @@ -0,0 +1,6 @@ +from examples.protobuf import foo_pb2 + +foo = foo_pb2.Foo() +foo.name = "Hello, World!" + +print(foo) diff --git a/examples/protobuf/foo.proto b/examples/protobuf/foo.proto new file mode 100644 index 000000000..0ad0063ff --- /dev/null +++ b/examples/protobuf/foo.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package foo; + +message Foo { + string name = 1; +} diff --git a/examples/protobuf/foo_pb2.pyi b/examples/protobuf/foo_pb2.pyi new file mode 100755 index 000000000..a7d85b6d2 --- /dev/null +++ b/examples/protobuf/foo_pb2.pyi @@ -0,0 +1,11 @@ +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from typing import ClassVar as _ClassVar, Optional as _Optional + +DESCRIPTOR: _descriptor.FileDescriptor + +class Foo(_message.Message): + __slots__ = ("name",) + NAME_FIELD_NUMBER: _ClassVar[int] + name: str + def __init__(self, name: _Optional[str] = ...) -> None: ... diff --git a/examples/protobuf/toolchains/BUILD.bazel b/examples/protobuf/toolchains/BUILD.bazel new file mode 100644 index 000000000..c24c1d4ad --- /dev/null +++ b/examples/protobuf/toolchains/BUILD.bazel @@ -0,0 +1,26 @@ +load("@aspect_rules_py//py:proto.bzl", "py_proto_toolchain") + +# FIXME(arrdem): does rules_py uv-created package support any way to invoke the console script of a package? +# py_console_script_binary( +# name = "protoc-gen-grpc", +# pkg = "@pypi//grpcio_tools", +# script = "protoc", +# ) + +py_proto_toolchain( + name = "builtin_protoc_plugin", + plugin_bin = None, # use the python emit embedded in protoc + plugin_name = "python", + plugin_options = [], + runtime = "@pypi//protobuf", +) + +# TODO: support gRPC as well, which is NOT built-in +# py_proto_toolchain( +# name = "grpcio_protoc_plugin", +# plugin_bin = ":protoc-gen-grpc", +# plugin_name = "python", +# plugin_options = [ +# ], +# # runtime = "//:node_modules/@bufbuild/protobuf", +# ) diff --git a/py/BUILD.bazel b/py/BUILD.bazel index 615f86d03..3e0ab3598 100644 --- a/py/BUILD.bazel +++ b/py/BUILD.bazel @@ -52,3 +52,13 @@ bzl_library( "@bazel_tools//tools/build_defs/repo:http.bzl", ], ) + +bzl_library( + name = "proto", + srcs = ["proto.bzl"], + visibility = ["//visibility:public"], + deps = [ + "//py/private:proto", + "@protobuf//bazel/toolchains:proto_lang_toolchain_bzl", + ], +) diff --git a/py/private/proto.bzl b/py/private/proto.bzl new file mode 100644 index 000000000..cf12345bb --- /dev/null +++ b/py/private/proto.bzl @@ -0,0 +1,98 @@ +"""An aspect that generates Python code from .proto files. + +The aspect converts a ProtoInfo provider into a PyInfo provider so that proto_library may be a dep to python rules. +""" + +load("@protobuf//bazel/common:proto_common.bzl", "proto_common") +load("@protobuf//bazel/common:proto_info.bzl", "ProtoInfo") +load("@rules_python//python:defs.bzl", "PyInfo") + +LANG_PROTO_TOOLCHAIN = Label("//py/private/toolchain:protoc_plugin_toolchain_type") + +def _py_proto_aspect_impl(target, ctx): + proto_info = target[ProtoInfo] + proto_lang_toolchain_info = ctx.toolchains[LANG_PROTO_TOOLCHAIN].proto + proto_deps = [d for d in ctx.rule.attr.deps if PyInfo in d] + python_naming = lambda name: name.replace("-", "_").replace(".", "/") + py_outputs = proto_common.declare_generated_files( + actions = ctx.actions, + proto_info = proto_info, + extension = "_pb2.py", + name_mapper = python_naming, + ) + + generated_stubs = [] + if True: # len([o for o in proto_lang_toolchain_info.command_line.split() if o.startswith("--pyi_out=")]) > 0: + generated_stubs = proto_common.declare_generated_files( + actions = ctx.actions, + proto_info = proto_info, + extension = "_pb2.pyi", + name_mapper = python_naming, + ) + + # Determine root folder, mapping output paths to inputs, i.e. bazel-bin/arch/bin/foo to foo + proto_root = proto_info.proto_source_root + if proto_root.startswith(ctx.bin_dir.path): + proto_root = proto_root[len(ctx.bin_dir.path) + 1:] + + # FIXME: this is plugin-specific and fishy. + # the user should specify their pyi_out preference in the lang_proto_toolchain construction + additional_args = ctx.actions.args() + additional_args.add(py_outputs[0].root.path, format = "--pyi_out=%s") + + # It's possible for proto_library to have only deps but no srcs + if proto_info.direct_sources: + proto_common.compile( + actions = ctx.actions, + proto_info = proto_info, + proto_lang_toolchain_info = proto_lang_toolchain_info, + generated_files = py_outputs + generated_stubs, + plugin_output = py_outputs[0].root.path, + additional_args = additional_args, + ) + + # Import path within the runfiles tree + if proto_root.startswith("external/"): + import_path = proto_root[len("external") + 1:] + else: + import_path = ctx.workspace_name + "/" + proto_root + return [ + DefaultInfo(files = depset(generated_stubs)), + PyInfo( + imports = depset( + # Adding to PYTHONPATH so the generated modules can be + # imported. This is necessary when there is + # strip_import_prefix, the Python modules are generated under + # _virtual_imports. But it's undesirable otherwise, because it + # will put the repo root at the top of the PYTHONPATH, ahead of + # directories added through `imports` attributes. + [import_path] if "_virtual_imports" in import_path else [], + transitive = [dep.imports for dep in proto_deps] + ( + [proto_lang_toolchain_info.runtime[PyInfo].imports] if proto_lang_toolchain_info.runtime else [] + ), + ), + # direct_pyi_files = depset(direct = direct_pyi_files), + # transitive_pyi_files = transitive_pyi_files, + transitive_sources = depset( + py_outputs + generated_stubs, + transitive = [dep.transitive_sources for dep in proto_deps] + ( + [proto_lang_toolchain_info.runtime[PyInfo].transitive_sources] if proto_lang_toolchain_info.runtime else [] + ), + ), + # Proto always produces 2- and 3- compatible source files + has_py2_only_sources = False, + has_py3_only_sources = False, + uses_shared_libraries = False, + ), + ] + +py_proto_aspect = aspect( + implementation = _py_proto_aspect_impl, + # Traverse the "deps" graph edges starting from the target + attr_aspects = ["deps"], + # Only visit nodes that produce a ProtoInfo provider + required_providers = [ProtoInfo], + # Be a valid dependency of a py_library rule + provides = [PyInfo], + toolchains = [LANG_PROTO_TOOLCHAIN], +) diff --git a/py/private/py_library.bzl b/py/private/py_library.bzl index ffc1abcc7..94642a657 100644 --- a/py/private/py_library.bzl +++ b/py/private/py_library.bzl @@ -9,6 +9,7 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") load("@rules_python//python:defs.bzl", "PyInfo") load("//py/private:providers.bzl", "PyVirtualInfo") +load(":proto.bzl", "py_proto_aspect") def _make_instrumented_files_info(ctx, extra_source_attributes = [], extra_dependency_attributes = []): return coverage_common.instrumented_files_info( @@ -206,6 +207,7 @@ _attrs = dict({ "deps": attr.label_list( doc = "Targets that produce Python code, commonly `py_library` rules.", providers = [[PyInfo], [PyVirtualInfo], [CcInfo]], + aspects = [py_proto_aspect], ), "data": attr.label_list( doc = """Runtime dependencies of the program. diff --git a/py/private/toolchain/BUILD.bazel b/py/private/toolchain/BUILD.bazel index e6322e423..cd6cc7a86 100644 --- a/py/private/toolchain/BUILD.bazel +++ b/py/private/toolchain/BUILD.bazel @@ -6,6 +6,11 @@ exports_files( visibility = ["//visibility:public"], ) +toolchain_type( + name = "protoc_plugin_toolchain_type", + visibility = ["//visibility:public"], +) + toolchain_type( name = "unpack_toolchain_type", visibility = ["//visibility:public"], diff --git a/py/proto.bzl b/py/proto.bzl new file mode 100644 index 000000000..6feae7b74 --- /dev/null +++ b/py/proto.bzl @@ -0,0 +1,101 @@ +"""**EXPERIMENTAL**: Protobuf and gRPC support for Python. + +This API is subject to breaking changes outside our usual semver policy. +In a future release of rules_py this should become stable. + +### Typical setup + +1. Choose any code generator plugin for protoc. + For example, https://pypi.org/project/grpcio-tools/ which provides `protoc` and + Python gRPC code generation. +2. Declare a binary target that runs the generator, for example: + +```starlark +load("@rules_python//python/entry_points:py_console_script_binary.bzl", "py_console_script_binary") + +py_console_script_binary( + name = "protoc-gen-grpc", + pkg = "@pypi//grpcio_tools", + script = "protoc", +) +``` +3. Instead, it's also possible to use the Python plugin which is built-in to protoc. +3. Define a `py_proto_toolchain` that specifies the plugin. See the rule documentation below. +4. Update `MODULE.bazel` to register it, typically with + `register_toolchains("//tools/toolchains:all")`. + +### Usage + +Write `proto_library` targets as usual, or have Gazelle generate them. +Then reference them anywhere a `py_library` could appear. +Note this attribute is not supported by rules_python, meaning your BUILD files will be specific to rules_py. + +For example: + +```starlark +load("@aspect_rules_py//py:defs.bzl", "py_library") +load("@protobuf//bazel:proto_library.bzl", "proto_library") + +proto_library( + name = "eliza_proto", + srcs = ["eliza.proto"], +) + +py_library( + name = "proto", + deps = [":eliza_proto"], +) +``` +""" + +load("@protobuf//bazel/toolchains:proto_lang_toolchain.bzl", "proto_lang_toolchain") +load("//py/private:proto.bzl", "LANG_PROTO_TOOLCHAIN") + +def py_proto_toolchain(name, plugin_name, plugin_options, plugin_bin, runtime = None, **kwargs): + """Define a proto_lang_toolchain that uses the plugin. + + Example: + + ```starlark + py_proto_toolchain( + name = "gen_es_protoc_plugin", + plugin_bin = ":protoc-gen-grpc", + plugin_name = "python", + plugin_options = [ + ], + runtime = "@pypi//:protobuf", + ) + ``` + + Args: + name: The name of the toolchain. A target named [name]_toolchain is also created, which is the one to be used in register_toolchains. + plugin_name: The `NAME` of the plugin program, used in command-line flags to protoc, as follows: + + > `protoc --plugin=protoc-gen-NAME=path/to/mybinary --NAME_out=OUT_DIR` + + See https://protobuf.dev/reference/cpp/api-docs/google.protobuf.compiler.plugin + + plugin_options: (List of strings) Command line flags used to invoke the plugin, + based on documentation for the generator. + + plugin_bin: The plugin to use. This should be the label of a binary target that you declared in step 2 above. + If `None`, the Python plugin which is built-in to protoc will be used. + + runtime: Optional runtime dependency imported by generated code. + + **kwargs: Additional arguments to pass to the [proto_lang_toolchain](https://bazel.build/reference/be/protocol-buffer#proto_lang_toolchain) rule. + """ + command_line_flags = ["--{}_opt=%s".format(plugin_name) % o for o in plugin_options] + command_line_flags.append("--{}_out=$(OUT)".format(plugin_name)) + attrs = dict(kwargs) + if runtime != None: + attrs["runtime"] = runtime + + proto_lang_toolchain( + name = name, + command_line = " ".join(command_line_flags), + plugin_format_flag = "--plugin=protoc-gen-{}=%s".format(plugin_name), + toolchain_type = LANG_PROTO_TOOLCHAIN, + plugin = plugin_bin, + **attrs + ) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..6b93c8435 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,4 @@ +[tool.pyright] +# Bazel-generated modules may provide `.pyi` in source, while `.py` appears only +# in runfiles/venv at runtime. Suppress missing-source diagnostics for this case. +reportMissingModuleSource = "none" diff --git a/requirements.in b/requirements.in index 69f5f7189..65f1a8a96 100644 --- a/requirements.in +++ b/requirements.in @@ -11,3 +11,5 @@ ftfy==6.2.0 neptune==1.10.2 six bazel-runfiles +grpcio-tools +protobuf==6.33.4 diff --git a/requirements.txt b/requirements.txt index 4ceab5d59..5aa201677 100644 --- a/requirements.txt +++ b/requirements.txt @@ -243,6 +243,132 @@ gitpython==3.1.43 \ --hash=sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c \ --hash=sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff # via neptune +grpcio==1.78.1 \ + --hash=sha256:02b82dcd2fa580f5e82b4cf62ecde1b3c7cc9ba27b946421200706a6e5acaf85 \ + --hash=sha256:07eb016ea7444a22bef465cce045512756956433f54450aeaa0b443b8563b9ca \ + --hash=sha256:09fbd4bcaadb6d8604ed1504b0bdf7ac18e48467e83a9d930a70a7fefa27e862 \ + --hash=sha256:0fa9943d4c7f4a14a9a876153a4e8ee2bb20a410b65c09f31510b2a42271f41b \ + --hash=sha256:13937b28986f45fee342806b07c6344db785ad74a549ebcb00c659142973556f \ + --hash=sha256:15f6e636d1152667ddb4022b37534c161c8477274edb26a0b65b215dd0a81e97 \ + --hash=sha256:1a56bf3ee99af5cf32d469de91bf5de79bdac2e18082b495fc1063ea33f4f2d0 \ + --hash=sha256:263307118791bc350f4642749a9c8c2d13fec496228ab11070973e568c256bfd \ + --hash=sha256:27b5cb669603efb7883a882275db88b6b5d6b6c9f0267d5846ba8699b7ace338 \ + --hash=sha256:27c625532d33ace45d57e775edf1982e183ff8641c72e4e91ef7ba667a149d72 \ + --hash=sha256:2b7ad2981550ce999e25ce3f10c8863f718a352a2fd655068d29ea3fd37b4907 \ + --hash=sha256:2c473b54ef1618f4fb85e82ff4994de18143b74efc088b91b5a935a3a45042ba \ + --hash=sha256:34b6cb16f4b67eeb5206250dc5b4d5e8e3db939535e58efc330e4c61341554bd \ + --hash=sha256:36aeff5ba8aaf70ceb2cbf6cbba9ad6beef715ad744841f3e0cd977ec02e5966 \ + --hash=sha256:389b77484959bdaad6a2b7dda44d7d1228381dd669a03f5660392aa0e9385b22 \ + --hash=sha256:39d21fd30d38a5afb93f0e2e71e2ec2bd894605fb75d41d5a40060c2f98f8d11 \ + --hash=sha256:39da1680d260c0c619c3b5fa2dc47480ca24d5704c7a548098bca7de7f5dd17f \ + --hash=sha256:3a8aa79bc6e004394c0abefd4b034c14affda7b66480085d87f5fbadf43b593b \ + --hash=sha256:409bfe22220889b9906739910a0ee4c197a967c21b8dd14b4b06dd477f8819ce \ + --hash=sha256:41e4605c923e0e9a84a2718e4948a53a530172bfaf1a6d1ded16ef9c5849fca2 \ + --hash=sha256:4393bef64cf26dc07cd6f18eaa5170ae4eebaafd4418e7e3a59ca9526a6fa30b \ + --hash=sha256:43b930cf4f9c4a2262bb3e5d5bc40df426a72538b4f98e46f158b7eb112d2d70 \ + --hash=sha256:4b8d7fda614cf2af0f73bbb042f3b7fee2ecd4aea69ec98dbd903590a1083529 \ + --hash=sha256:4d50329b081c223d444751076bb5b389d4f06c2b32d51b31a1e98172e6cecfb9 \ + --hash=sha256:5380268ab8513445740f1f77bd966d13043d07e2793487e61fd5b5d0935071eb \ + --hash=sha256:5572c5dd1e43dbb452b466be9794f77e3502bdb6aa6a1a7feca72c98c5085ca7 \ + --hash=sha256:559f58b6823e1abc38f82e157800aff649146f8906f7998c356cd48ae274d512 \ + --hash=sha256:5ce1855e8cfc217cdf6bcfe0cf046d7cf81ddcc3e6894d6cfd075f87a2d8f460 \ + --hash=sha256:656a5bd142caeb8b1efe1fe0b4434ecc7781f44c97cfc7927f6608627cf178c0 \ + --hash=sha256:716a544969660ed609164aff27b2effd3ff84e54ac81aa4ce77b1607ca917d22 \ + --hash=sha256:75fa92c47d048d696f12b81a775316fca68385ffc6e6cb1ed1d76c8562579f74 \ + --hash=sha256:7e836778c13ff70edada16567e8da0c431e8818eaae85b80d11c1ba5782eccbb \ + --hash=sha256:849cc62eb989bc3be5629d4f3acef79be0d0ff15622201ed251a86d17fef6494 \ + --hash=sha256:86edb3966778fa05bfdb333688fde5dc9079f9e2a9aa6a5c42e9564b7656ba04 \ + --hash=sha256:888ceb7821acd925b1c90f0cdceaed1386e69cfe25e496e0771f6c35a156132f \ + --hash=sha256:8942bdfc143b467c264b048862090c4ba9a0223c52ae28c9ae97754361372e42 \ + --hash=sha256:8991c2add0d8505178ff6c3ae54bd9386279e712be82fa3733c54067aae9eda1 \ + --hash=sha256:8e1fcb419da5811deb47b7749b8049f7c62b993ba17822e3c7231e3e0ba65b79 \ + --hash=sha256:8f27683ca68359bd3f0eb4925824d71e538f84338b3ae337ead2ae43977d7541 \ + --hash=sha256:917047c19cd120b40aab9a4b8a22e9ce3562f4a1343c0d62b3cd2d5199da3d67 \ + --hash=sha256:99550e344482e3c21950c034f74668fccf8a546d50c1ecb4f717543bbdc071ba \ + --hash=sha256:9a00992d6fafe19d648b9ccb4952200c50d8e36d0cce8cf026c56ed3fdc28465 \ + --hash=sha256:9dee66d142f4a8cca36b5b98a38f006419138c3c89e72071747f8fca415a6d8f \ + --hash=sha256:a40515b69ac50792f9b8ead260f194ba2bb3285375b6c40c7ff938f14c3df17d \ + --hash=sha256:a6afd191551fd72e632367dfb083e33cd185bf9ead565f2476bba8ab864ae496 \ + --hash=sha256:b071dccac245c32cd6b1dd96b722283b855881ca0bf1c685cf843185f5d5d51e \ + --hash=sha256:b2acd83186305c0802dbc4d81ed0ec2f3e8658d7fde97cfba2f78d7372f05b89 \ + --hash=sha256:b5d5881d72a09b8336a8f874784a8eeffacde44a7bc1a148bce5a0243a265ef0 \ + --hash=sha256:ca6aebae928383e971d5eace4f1a217fd7aadaf18d5ddd3163d80354105e9068 \ + --hash=sha256:cd26048d066b51f39fe9206e2bcc2cea869a5e5b2d13c8d523f4179193047ebd \ + --hash=sha256:d101fe49b1e0fb4a7aa36ed0c3821a0f67a5956ef572745452d2cd790d723a3f \ + --hash=sha256:d6fb962947e4fe321eeef3be1ba5ba49d32dea9233c825fcbade8e858c14aaf4 \ + --hash=sha256:db681513a1bdd879c0b24a5a6a70398da5eaaba0e077a306410dc6008426847a \ + --hash=sha256:e2a6b33d1050dce2c6f563c5caf7f7cbeebf7fba8cde37ffe3803d50526900d1 \ + --hash=sha256:e49e720cd6b092504ec7bb2f60eb459aaaf4ce0e5fe20521c201b179e93b5d5d \ + --hash=sha256:e840405a3f1249509892be2399f668c59b9d492068a2cf326d661a8c79e5e747 \ + --hash=sha256:ebeec1383aed86530a5f39646984e92d6596c050629982ac54eeb4e2f6ead668 \ + --hash=sha256:f81816faa426da461e9a597a178832a351d6f1078102590a4b32c77d251b71eb \ + --hash=sha256:f8759a1347f3b4f03d9a9d4ce8f9f31ad5e5d0144ba06ccfb1ffaeb0ba4c1e20 \ + --hash=sha256:ff7de398bb3528d44d17e6913a7cfe639e3b15c65595a71155322df16978c5e1 \ + --hash=sha256:ffbb760df1cd49e0989f9826b2fd48930700db6846ac171eaff404f3cfbe5c28 + # via grpcio-tools +grpcio-tools==1.78.1 \ + --hash=sha256:086cda613dc3a5b58ebd0852273fa76498d61e5296710654d66861309ea30faa \ + --hash=sha256:08704fd6df74dd95c28a2c095f59e10aec61abe64e2c44f1109d725f728688ba \ + --hash=sha256:090aeaa053f728539d0f84658bb5d88411a913cbcc49e990b5a80acd3c46dc94 \ + --hash=sha256:11c6a338c227e5aab76954f35959682d59c432a5b6d7db053fa1a99c7124bbde \ + --hash=sha256:203347a50b00e6a1793c35af437a39449b247b9461a9f1f9b9baf954b4255cd8 \ + --hash=sha256:2fd5b9ba19849afb511f05f9eaf621aaf21d8582b06d23179b31fb72f2b0add1 \ + --hash=sha256:35668bc67bb5600d3f72e9cfbbe15a2ad2f616013b0598877a06396e7de3fa2f \ + --hash=sha256:36dbd00415376a3db03cd57a8063dfb5506c3ec69737945488f6c28a3e8b5cf1 \ + --hash=sha256:3ab437967bd61034b278ca1043a5f2f70ab3a8b45f2531b4295ffc7da27893c9 \ + --hash=sha256:3ad2cfae254f965776e296635d0ef96bdb2e6fde54c3d8e0f1ed98161ec00a8f \ + --hash=sha256:3e2148b0b15dea87d2fea17d1eda3ae0cdc6dd378fe75903f17515cbb6e5f4a3 \ + --hash=sha256:3edc65d8d547e2c3e90937896bce58f1a4187b45a5ac2d97c84d0501c917c6e7 \ + --hash=sha256:40aad3da94bf261792ff998084117f6ce092b7b137dcea257628def834b91e96 \ + --hash=sha256:58714482282ba4f6ebe550a43284b3383761e7bf1c1cafa009740d4b20cfc5fd \ + --hash=sha256:5aa5720e07b81e82107c33f1951572f4371b668933da110418146e8fe51813ec \ + --hash=sha256:6080c1541487071c6e2763be5ffee452139a919dc5fc9e0eaeca9737af913337 \ + --hash=sha256:63c91efb22a6977111bbde16f58e393ab75f1f4ff95850abc24fd279402a02f7 \ + --hash=sha256:63d578f37a6ccad7f61b1da29b219005874c097664a78967f8b60637f6f3f567 \ + --hash=sha256:63e87dd399a4071c0cfdf131cf382a7c3859f2bee9cff8ec996dd8dea3e3afbb \ + --hash=sha256:6d284037ff456842324fa12b0a6455fce0b3ab92f218677b34c33cf4787a54c4 \ + --hash=sha256:6e8cdf8f75d24a70511b3db9e4e09cd7a4420ff1a3707e30cefc08f4be189e1f \ + --hash=sha256:77b8f61e5b6b774521875595d5f978dbd534086bc39205126345c7459cf18a44 \ + --hash=sha256:7c14f58e9d4fc0fefe215862b52bcc79fefc1085e33d938b5070663985bed8e2 \ + --hash=sha256:7c3cef48b10cccfc039b5ae054d7ad8d7b907ff03a283b606b3999ce3843b5a5 \ + --hash=sha256:7e465bf6e49c8d3905997b079d4cab233cd1e0ad558aa3b93ce074172ad75fa1 \ + --hash=sha256:7ecc57c2a82a7f67d07c1491eea39aec9660306a8b67b7b0116ade52c3466297 \ + --hash=sha256:7f4469a91556442330aad0710ffc16a853681e1aa7c0752b2db2e8255c872897 \ + --hash=sha256:8736a6e33f077183593ade99064d7e7e6d77874ef0d6001f214ba909e4112c5e \ + --hash=sha256:99479dfa64faa8ed887df22a1489e6bd4027e38efdad7de9fdc6038e67569f0a \ + --hash=sha256:a5fbe7d04212248a94acfea86460f1e249f0e42b636de4e71ad518aaf7b24cc9 \ + --hash=sha256:a62857bdd681469f7ea603078187399aa8bd8cd7bdeeb603497c993a06d0bb8d \ + --hash=sha256:a81b30b0981cc64853bf28daa4d45f2ce8e4da47d831186a509c05660f23b133 \ + --hash=sha256:a8b7119294179b409cd78a072d93c233533cc12067be16dca4398e1f20627289 \ + --hash=sha256:abb2aee19b91d619670a3598faaa8036b31dd96708ab82d8fb990da4b5c3fc01 \ + --hash=sha256:acb9849783dc7cf0e7359cbd60c6bf3154008bf9aeff12c696ec7289599eb3a8 \ + --hash=sha256:b0abde2cd28a5925da36776977064e0fe9be667a96ea454acad1eabc3eb7ec48 \ + --hash=sha256:b5d4c75fa44d560e694b65b19df3d7e73d89c2bf9e2d7b672a9e650f40ca33df \ + --hash=sha256:b6307ce936cd5f7714bba75e8b7c71f4e6a4da625b907960227568022ee812fa \ + --hash=sha256:c05507d90035e8c0b9617d2ff5c888b7e93e47c111e7880d8a2d190ca5734622 \ + --hash=sha256:c7a33d981d33b54183e2fa872a4abea632396ef824ca60c268ce50e2fdb9d930 \ + --hash=sha256:cd0aec543a809ab8eeeec35c66f7b86be01d669799ffac7e6c2cca5644e996c7 \ + --hash=sha256:ce974c88b36f3354574b77df26c9530efd90476f2bb7f71a2bc21096c235d931 \ + --hash=sha256:d10c27480bf3bf729de01979f3569aa128f5e5685c4cbed69c9bdbb200d62bcc \ + --hash=sha256:d54640c46d496ed9367caaa36a5742adca9b215ea06cf6714dcf1aa190a43b6d \ + --hash=sha256:d6406f04b93e48ae3b4dca8f9f312f345265502dc54408056796813c1877f98a \ + --hash=sha256:d665399893f79dfce1018143602b1e53cc6434cb919b141ad5ce9d09d25b6c88 \ + --hash=sha256:df604903f86adae37eb90f4168db13090f723b3602bac89519aff451aea46ea3 \ + --hash=sha256:e0335ba2e6b903b9156151a49d03e74d2876259d5233ac97de53b4c847a56000 \ + --hash=sha256:e1e19c3cb8c4bbfcc20c74b6ef50bd2fb18f82593e65c5b031a92f6794ab9a6d \ + --hash=sha256:e33de930d02e16d28a2e06d2a629cd5be18c0f386e8bc6c483b073f8898c283c \ + --hash=sha256:e53faada7c186ae5a46b236a4961284c45f9eb069888c651021346f9360d58e0 \ + --hash=sha256:e84f4a25e99fe5c6223142cae0ad18224759b4d11bd1ba35f47532f2c11a3cce \ + --hash=sha256:e886a3f3284fbff5b4a5c0299427b42df1e1ad6ec9c88c41cfe94557ac191a34 \ + --hash=sha256:eb7ed3e69e6cbc13a10c1651bc59c8255cef56b35b2248211c341a0dd84d80fe \ + --hash=sha256:ec4483749c7174c301a554191f6a9b28e2388636736a21886fe20025137cdaa5 \ + --hash=sha256:ec86147000d713bcf5116350607b16b488432fcae89e7fbb6ac4d388c241273b \ + --hash=sha256:ecb698ba221b279356590d65e456d2a3ba63b1668515c85c5a340bf98399acb7 \ + --hash=sha256:f46fa1430958fe93082d361711e261a482d5a505a9928bc28f7df3fb432d7203 \ + --hash=sha256:f47b746b06a940954b9aa86b1824aa4874f068a7ec2d4b407980d202c86a691a \ + --hash=sha256:f617dd5a74fcd15f333254edb55695ea439dfdf00a0a3fe157e020be13572bca \ + --hash=sha256:fb484640c759ab94d68f8944e00db94e590714e3d5a5a492816e19e3e8e25334 + # via -r requirements.in idna==3.7 \ --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 @@ -510,6 +636,20 @@ pluggy==1.4.0 \ --hash=sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981 \ --hash=sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be # via pytest +protobuf==6.33.4 \ + --hash=sha256:0f12ddbf96912690c3582f9dffb55530ef32015ad8e678cd494312bd78314c4f \ + --hash=sha256:1fe3730068fcf2e595816a6c34fe66eeedd37d51d0400b72fabc848811fdc1bc \ + --hash=sha256:2fe67f6c014c84f655ee06f6f66213f9254b3a8b6bda6cda0ccd4232c73c06f0 \ + --hash=sha256:3df850c2f8db9934de4cf8f9152f8dc2558f49f298f37f90c517e8e5c84c30e9 \ + --hash=sha256:757c978f82e74d75cba88eddec479df9b99a42b31193313b75e492c06a51764e \ + --hash=sha256:8f11ffae31ec67fc2554c2ef891dcb561dae9a2a3ed941f9e134c2db06657dbc \ + --hash=sha256:918966612c8232fc6c24c78e1cd89784307f5814ad7506c308ee3cf86662850d \ + --hash=sha256:955478a89559fa4568f5a81dce77260eabc5c686f9e8366219ebd30debf06aa6 \ + --hash=sha256:c7c64f259c618f0bef7bee042075e390debbf9682334be2b67408ec7c1c09ee6 \ + --hash=sha256:dc2e61bca3b10470c1912d166fe0af67bfc20eb55971dcef8dfa48ce14f0ed91 + # via + # -r requirements.in + # grpcio-tools psutil==5.9.8 \ --hash=sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d \ --hash=sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73 \ @@ -890,6 +1030,7 @@ typing-extensions==4.12.2 \ # via # asgiref # bravado + # grpcio # neptune # swagger-spec-validator tzdata==2024.1 \ @@ -928,4 +1069,6 @@ zipp==3.23.0 \ setuptools==80.9.0 \ --hash=sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922 \ --hash=sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c - # via -r requirements.in + # via + # -r requirements.in + # grpcio-tools diff --git a/uv.lock b/uv.lock index 994519a62..75a85ea31 100644 --- a/uv.lock +++ b/uv.lock @@ -349,6 +349,8 @@ dependencies = [ { name = "future" }, { name = "gitdb" }, { name = "gitpython" }, + { name = "grpcio" }, + { name = "grpcio-tools" }, { name = "idna" }, { name = "importlib-metadata" }, { name = "iniconfig" }, @@ -367,6 +369,7 @@ dependencies = [ { name = "pandas" }, { name = "pillow" }, { name = "pluggy" }, + { name = "protobuf" }, { name = "psutil" }, { name = "pyjwt" }, { name = "pyproject-hooks" }, @@ -424,6 +427,8 @@ requires-dist = [ { name = "future", specifier = "==1.0.0" }, { name = "gitdb", specifier = "==4.0.12" }, { name = "gitpython", specifier = "==3.1.43" }, + { name = "grpcio", specifier = "==1.78.1" }, + { name = "grpcio-tools", specifier = "==1.78.1" }, { name = "idna", specifier = "==3.7" }, { name = "importlib-metadata", specifier = "==8.7.0" }, { name = "iniconfig", specifier = "==2.0.0" }, @@ -442,6 +447,7 @@ requires-dist = [ { name = "pandas", specifier = "==2.2.2" }, { name = "pillow", specifier = "==10.3.0" }, { name = "pluggy", specifier = "==1.4.0" }, + { name = "protobuf", specifier = "==6.33.4" }, { name = "psutil", specifier = "==5.9.8" }, { name = "pyjwt", specifier = "==2.8.0" }, { name = "pyproject-hooks", specifier = "==1.2.0" }, @@ -538,6 +544,150 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/bd/cc3a402a6439c15c3d4294333e13042b915bbeab54edc457c723931fed3f/GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff", size = 207337, upload-time = "2024-03-31T08:07:31.194Z" }, ] +[[package]] +name = "grpcio" +version = "1.78.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/de/de568532d9907552700f80dcec38219d8d298ad9e71f5e0a095abaf2761e/grpcio-1.78.1.tar.gz", hash = "sha256:27c625532d33ace45d57e775edf1982e183ff8641c72e4e91ef7ba667a149d72", size = 12835760, upload-time = "2026-02-20T01:16:10.869Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/30/0534b643dafd54824769d6260b89c71d518e4ef8b5ad16b84d1ae9272978/grpcio-1.78.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:4393bef64cf26dc07cd6f18eaa5170ae4eebaafd4418e7e3a59ca9526a6fa30b", size = 5947661, upload-time = "2026-02-20T01:12:34.922Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f8/f678566655ab822da0f713789555e7eddca7ef93da99f480c63de3aa94b4/grpcio-1.78.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:917047c19cd120b40aab9a4b8a22e9ce3562f4a1343c0d62b3cd2d5199da3d67", size = 11819948, upload-time = "2026-02-20T01:12:39.709Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/a4b4210d946055f4e5a8430f2802202ae8f831b4b00d36d55055c5cf4b6a/grpcio-1.78.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff7de398bb3528d44d17e6913a7cfe639e3b15c65595a71155322df16978c5e1", size = 6519850, upload-time = "2026-02-20T01:12:42.715Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d9/a1e657a73000a71fa75ec7140ff3a8dc32eb3427560620e477c6a2735527/grpcio-1.78.1-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:15f6e636d1152667ddb4022b37534c161c8477274edb26a0b65b215dd0a81e97", size = 7198654, upload-time = "2026-02-20T01:12:46.164Z" }, + { url = "https://files.pythonhosted.org/packages/aa/28/a61c5bdf53c1638e657bb5eebb93c789837820e1fdb965145f05eccc2994/grpcio-1.78.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:27b5cb669603efb7883a882275db88b6b5d6b6c9f0267d5846ba8699b7ace338", size = 6727238, upload-time = "2026-02-20T01:12:48.472Z" }, + { url = "https://files.pythonhosted.org/packages/9d/3e/aa143d0687801986a29d85788c96089449f36651cd4e2a493737ae0c5be9/grpcio-1.78.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:86edb3966778fa05bfdb333688fde5dc9079f9e2a9aa6a5c42e9564b7656ba04", size = 7300960, upload-time = "2026-02-20T01:12:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/30/d3/53e0f26b46417f28d14b5951fc6a1eff79c08c8a339e967c0a19ec7cf9e9/grpcio-1.78.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:849cc62eb989bc3be5629d4f3acef79be0d0ff15622201ed251a86d17fef6494", size = 8285274, upload-time = "2026-02-20T01:12:53.315Z" }, + { url = "https://files.pythonhosted.org/packages/29/d0/e0e9fd477ce86c07ed1ed1d5c34790f050b6d58bfde77b02b36e23f8b235/grpcio-1.78.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9a00992d6fafe19d648b9ccb4952200c50d8e36d0cce8cf026c56ed3fdc28465", size = 7726620, upload-time = "2026-02-20T01:12:56.498Z" }, + { url = "https://files.pythonhosted.org/packages/5e/b5/e138a9f7810d196081b2e047c378ca12358c5906d79c42ddec41bb43d528/grpcio-1.78.1-cp310-cp310-win32.whl", hash = "sha256:f8759a1347f3b4f03d9a9d4ce8f9f31ad5e5d0144ba06ccfb1ffaeb0ba4c1e20", size = 4076778, upload-time = "2026-02-20T01:12:59.098Z" }, + { url = "https://files.pythonhosted.org/packages/4e/95/9b02316b85731df0943a635ca6d02f155f673c4f17e60be0c4892a6eb051/grpcio-1.78.1-cp310-cp310-win_amd64.whl", hash = "sha256:e840405a3f1249509892be2399f668c59b9d492068a2cf326d661a8c79e5e747", size = 4798925, upload-time = "2026-02-20T01:13:03.186Z" }, + { url = "https://files.pythonhosted.org/packages/bf/1e/ad774af3b2c84f49c6d8c4a7bea4c40f02268ea8380630c28777edda463b/grpcio-1.78.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:3a8aa79bc6e004394c0abefd4b034c14affda7b66480085d87f5fbadf43b593b", size = 5951132, upload-time = "2026-02-20T01:13:05.942Z" }, + { url = "https://files.pythonhosted.org/packages/48/9d/ad3c284bedd88c545e20675d98ae904114d8517a71b0efc0901e9166628f/grpcio-1.78.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8e1fcb419da5811deb47b7749b8049f7c62b993ba17822e3c7231e3e0ba65b79", size = 11831052, upload-time = "2026-02-20T01:13:09.604Z" }, + { url = "https://files.pythonhosted.org/packages/6d/08/20d12865e47242d03c3ade9bb2127f5b4aded964f373284cfb357d47c5ac/grpcio-1.78.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b071dccac245c32cd6b1dd96b722283b855881ca0bf1c685cf843185f5d5d51e", size = 6524749, upload-time = "2026-02-20T01:13:21.692Z" }, + { url = "https://files.pythonhosted.org/packages/c6/53/a8b72f52b253ec0cfdf88a13e9236a9d717c332b8aa5f0ba9e4699e94b55/grpcio-1.78.1-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d6fb962947e4fe321eeef3be1ba5ba49d32dea9233c825fcbade8e858c14aaf4", size = 7198995, upload-time = "2026-02-20T01:13:24.275Z" }, + { url = "https://files.pythonhosted.org/packages/13/3c/ac769c8ded1bcb26bb119fb472d3374b481b3cf059a0875db9fc77139c17/grpcio-1.78.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6afd191551fd72e632367dfb083e33cd185bf9ead565f2476bba8ab864ae496", size = 6730770, upload-time = "2026-02-20T01:13:26.522Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c3/2275ef4cc5b942314321f77d66179be4097ff484e82ca34bf7baa5b1ddbc/grpcio-1.78.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b2acd83186305c0802dbc4d81ed0ec2f3e8658d7fde97cfba2f78d7372f05b89", size = 7305036, upload-time = "2026-02-20T01:13:30.923Z" }, + { url = "https://files.pythonhosted.org/packages/91/cb/3c2aa99e12cbbfc72c2ed8aa328e6041709d607d668860380e6cd00ba17d/grpcio-1.78.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5380268ab8513445740f1f77bd966d13043d07e2793487e61fd5b5d0935071eb", size = 8288641, upload-time = "2026-02-20T01:13:39.42Z" }, + { url = "https://files.pythonhosted.org/packages/0d/b2/21b89f492260ac645775d9973752ca873acfd0609d6998e9d3065a21ea2f/grpcio-1.78.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:389b77484959bdaad6a2b7dda44d7d1228381dd669a03f5660392aa0e9385b22", size = 7730967, upload-time = "2026-02-20T01:13:41.697Z" }, + { url = "https://files.pythonhosted.org/packages/24/03/6b89eddf87fdffb8fa9d37375d44d3a798f4b8116ac363a5f7ca84caa327/grpcio-1.78.1-cp311-cp311-win32.whl", hash = "sha256:9dee66d142f4a8cca36b5b98a38f006419138c3c89e72071747f8fca415a6d8f", size = 4076680, upload-time = "2026-02-20T01:13:43.781Z" }, + { url = "https://files.pythonhosted.org/packages/a7/a8/204460b1bc1dff9862e98f56a2d14be3c4171f929f8eaf8c4517174b4270/grpcio-1.78.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b930cf4f9c4a2262bb3e5d5bc40df426a72538b4f98e46f158b7eb112d2d70", size = 4801074, upload-time = "2026-02-20T01:13:46.315Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ed/d2eb9d27fded1a76b2a80eb9aa8b12101da7e41ce2bac0ad3651e88a14ae/grpcio-1.78.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:41e4605c923e0e9a84a2718e4948a53a530172bfaf1a6d1ded16ef9c5849fca2", size = 5913389, upload-time = "2026-02-20T01:13:49.005Z" }, + { url = "https://files.pythonhosted.org/packages/69/1b/40034e9ab010eeb3fa41ec61d8398c6dbf7062f3872c866b8f72700e2522/grpcio-1.78.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:39da1680d260c0c619c3b5fa2dc47480ca24d5704c7a548098bca7de7f5dd17f", size = 11811839, upload-time = "2026-02-20T01:13:51.839Z" }, + { url = "https://files.pythonhosted.org/packages/b4/69/fe16ef2979ea62b8aceb3a3f1e7a8bbb8b717ae2a44b5899d5d426073273/grpcio-1.78.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b5d5881d72a09b8336a8f874784a8eeffacde44a7bc1a148bce5a0243a265ef0", size = 6475805, upload-time = "2026-02-20T01:13:55.423Z" }, + { url = "https://files.pythonhosted.org/packages/5b/1e/069e0a9062167db18446917d7c00ae2e91029f96078a072bedc30aaaa8c3/grpcio-1.78.1-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:888ceb7821acd925b1c90f0cdceaed1386e69cfe25e496e0771f6c35a156132f", size = 7169955, upload-time = "2026-02-20T01:13:59.553Z" }, + { url = "https://files.pythonhosted.org/packages/38/fc/44a57e2bb4a755e309ee4e9ed2b85c9af93450b6d3118de7e69410ee05fa/grpcio-1.78.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8942bdfc143b467c264b048862090c4ba9a0223c52ae28c9ae97754361372e42", size = 6690767, upload-time = "2026-02-20T01:14:02.31Z" }, + { url = "https://files.pythonhosted.org/packages/b8/87/21e16345d4c75046d453916166bc72a3309a382c8e97381ec4b8c1a54729/grpcio-1.78.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:716a544969660ed609164aff27b2effd3ff84e54ac81aa4ce77b1607ca917d22", size = 7266846, upload-time = "2026-02-20T01:14:12.974Z" }, + { url = "https://files.pythonhosted.org/packages/11/df/d6261983f9ca9ef4d69893765007a9a3211b91d9faf85a2591063df381c7/grpcio-1.78.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d50329b081c223d444751076bb5b389d4f06c2b32d51b31a1e98172e6cecfb9", size = 8253522, upload-time = "2026-02-20T01:14:17.407Z" }, + { url = "https://files.pythonhosted.org/packages/de/7c/4f96a0ff113c5d853a27084d7590cd53fdb05169b596ea9f5f27f17e021e/grpcio-1.78.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e836778c13ff70edada16567e8da0c431e8818eaae85b80d11c1ba5782eccbb", size = 7698070, upload-time = "2026-02-20T01:14:20.032Z" }, + { url = "https://files.pythonhosted.org/packages/17/3c/7b55c0b5af88fbeb3d0c13e25492d3ace41ac9dbd0f5f8f6c0fb613b6706/grpcio-1.78.1-cp312-cp312-win32.whl", hash = "sha256:07eb016ea7444a22bef465cce045512756956433f54450aeaa0b443b8563b9ca", size = 4066474, upload-time = "2026-02-20T01:14:22.602Z" }, + { url = "https://files.pythonhosted.org/packages/5d/17/388c12d298901b0acf10b612b650692bfed60e541672b1d8965acbf2d722/grpcio-1.78.1-cp312-cp312-win_amd64.whl", hash = "sha256:02b82dcd2fa580f5e82b4cf62ecde1b3c7cc9ba27b946421200706a6e5acaf85", size = 4797537, upload-time = "2026-02-20T01:14:25.444Z" }, + { url = "https://files.pythonhosted.org/packages/df/72/754754639cfd16ad04619e1435a518124b2d858e5752225376f9285d4c51/grpcio-1.78.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:2b7ad2981550ce999e25ce3f10c8863f718a352a2fd655068d29ea3fd37b4907", size = 5919437, upload-time = "2026-02-20T01:14:29.403Z" }, + { url = "https://files.pythonhosted.org/packages/5c/84/6267d1266f8bc335d3a8b7ccf981be7de41e3ed8bd3a49e57e588212b437/grpcio-1.78.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:409bfe22220889b9906739910a0ee4c197a967c21b8dd14b4b06dd477f8819ce", size = 11803701, upload-time = "2026-02-20T01:14:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/f3/56/c9098e8b920a54261cd605bbb040de0cde1ca4406102db0aa2c0b11d1fb4/grpcio-1.78.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:34b6cb16f4b67eeb5206250dc5b4d5e8e3db939535e58efc330e4c61341554bd", size = 6479416, upload-time = "2026-02-20T01:14:35.926Z" }, + { url = "https://files.pythonhosted.org/packages/86/cf/5d52024371ee62658b7ed72480200524087528844ec1b65265bbcd31c974/grpcio-1.78.1-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:39d21fd30d38a5afb93f0e2e71e2ec2bd894605fb75d41d5a40060c2f98f8d11", size = 7174087, upload-time = "2026-02-20T01:14:39.98Z" }, + { url = "https://files.pythonhosted.org/packages/31/e6/5e59551afad4279e27335a6d60813b8aa3ae7b14fb62cea1d329a459c118/grpcio-1.78.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09fbd4bcaadb6d8604ed1504b0bdf7ac18e48467e83a9d930a70a7fefa27e862", size = 6692881, upload-time = "2026-02-20T01:14:42.466Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/940062de2d14013c02f51b079eb717964d67d46f5d44f22038975c9d9576/grpcio-1.78.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:db681513a1bdd879c0b24a5a6a70398da5eaaba0e077a306410dc6008426847a", size = 7269092, upload-time = "2026-02-20T01:14:45.826Z" }, + { url = "https://files.pythonhosted.org/packages/09/87/9db657a4b5f3b15560ec591db950bc75a1a2f9e07832578d7e2b23d1a7bd/grpcio-1.78.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f81816faa426da461e9a597a178832a351d6f1078102590a4b32c77d251b71eb", size = 8252037, upload-time = "2026-02-20T01:14:48.57Z" }, + { url = "https://files.pythonhosted.org/packages/e2/37/b980e0265479ec65e26b6e300a39ceac33ecb3f762c2861d4bac990317cf/grpcio-1.78.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffbb760df1cd49e0989f9826b2fd48930700db6846ac171eaff404f3cfbe5c28", size = 7695243, upload-time = "2026-02-20T01:14:51.376Z" }, + { url = "https://files.pythonhosted.org/packages/98/46/5fc42c100ab702fa1ea41a75c890c563c3f96432b4a287d5a6369654f323/grpcio-1.78.1-cp313-cp313-win32.whl", hash = "sha256:1a56bf3ee99af5cf32d469de91bf5de79bdac2e18082b495fc1063ea33f4f2d0", size = 4065329, upload-time = "2026-02-20T01:14:53.952Z" }, + { url = "https://files.pythonhosted.org/packages/b0/da/806d60bb6611dfc16cf463d982bd92bd8b6bd5f87dfac66b0a44dfe20995/grpcio-1.78.1-cp313-cp313-win_amd64.whl", hash = "sha256:8991c2add0d8505178ff6c3ae54bd9386279e712be82fa3733c54067aae9eda1", size = 4797637, upload-time = "2026-02-20T01:14:57.276Z" }, + { url = "https://files.pythonhosted.org/packages/96/3a/2d2ec4d2ce2eb9d6a2b862630a0d9d4ff4239ecf1474ecff21442a78612a/grpcio-1.78.1-cp314-cp314-linux_armv7l.whl", hash = "sha256:d101fe49b1e0fb4a7aa36ed0c3821a0f67a5956ef572745452d2cd790d723a3f", size = 5920256, upload-time = "2026-02-20T01:15:00.23Z" }, + { url = "https://files.pythonhosted.org/packages/9c/92/dccb7d087a1220ed358753945230c1ddeeed13684b954cb09db6758f1271/grpcio-1.78.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:5ce1855e8cfc217cdf6bcfe0cf046d7cf81ddcc3e6894d6cfd075f87a2d8f460", size = 11813749, upload-time = "2026-02-20T01:15:03.312Z" }, + { url = "https://files.pythonhosted.org/packages/ef/47/c20e87f87986da9998f30f14776ce27e61f02482a3a030ffe265089342c6/grpcio-1.78.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd26048d066b51f39fe9206e2bcc2cea869a5e5b2d13c8d523f4179193047ebd", size = 6488739, upload-time = "2026-02-20T01:15:14.349Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c2/088bd96e255133d7d87c3eed0d598350d16cde1041bdbe2bb065967aaf91/grpcio-1.78.1-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4b8d7fda614cf2af0f73bbb042f3b7fee2ecd4aea69ec98dbd903590a1083529", size = 7173096, upload-time = "2026-02-20T01:15:17.687Z" }, + { url = "https://files.pythonhosted.org/packages/60/ce/168db121073a03355ce3552b3b1f790b5ded62deffd7d98c5f642b9d3d81/grpcio-1.78.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:656a5bd142caeb8b1efe1fe0b4434ecc7781f44c97cfc7927f6608627cf178c0", size = 6693861, upload-time = "2026-02-20T01:15:20.911Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d0/90b30ec2d9425215dd56922d85a90babbe6ee7e8256ba77d866b9c0d3aba/grpcio-1.78.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:99550e344482e3c21950c034f74668fccf8a546d50c1ecb4f717543bbdc071ba", size = 7278083, upload-time = "2026-02-20T01:15:23.698Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fb/73f9ba0b082bcd385d46205095fd9c917754685885b28fce3741e9f54529/grpcio-1.78.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8f27683ca68359bd3f0eb4925824d71e538f84338b3ae337ead2ae43977d7541", size = 8252546, upload-time = "2026-02-20T01:15:26.517Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/6a89ea3cb5db6c3d9ed029b0396c49f64328c0cf5d2630ffeed25711920a/grpcio-1.78.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a40515b69ac50792f9b8ead260f194ba2bb3285375b6c40c7ff938f14c3df17d", size = 7696289, upload-time = "2026-02-20T01:15:29.718Z" }, + { url = "https://files.pythonhosted.org/packages/3d/05/63a7495048499ef437b4933d32e59b7f737bd5368ad6fb2479e2bd83bf2c/grpcio-1.78.1-cp314-cp314-win32.whl", hash = "sha256:2c473b54ef1618f4fb85e82ff4994de18143b74efc088b91b5a935a3a45042ba", size = 4142186, upload-time = "2026-02-20T01:15:32.786Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ce/adfe7e5f701d503be7778291757452e3fab6b19acf51917c79f5d1cf7f8a/grpcio-1.78.1-cp314-cp314-win_amd64.whl", hash = "sha256:e2a6b33d1050dce2c6f563c5caf7f7cbeebf7fba8cde37ffe3803d50526900d1", size = 4932000, upload-time = "2026-02-20T01:15:36.127Z" }, + { url = "https://files.pythonhosted.org/packages/66/3a/0195cdf3f4fcde27fe82e2ec93913bf6575e7c7449b006bb5eff1fa75faf/grpcio-1.78.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:559f58b6823e1abc38f82e157800aff649146f8906f7998c356cd48ae274d512", size = 5949570, upload-time = "2026-02-20T01:15:39.478Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4a/59741882c26c4d21a9af0b3552262711e3e9b0c4eb67696568366790cfc2/grpcio-1.78.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:36aeff5ba8aaf70ceb2cbf6cbba9ad6beef715ad744841f3e0cd977ec02e5966", size = 11825370, upload-time = "2026-02-20T01:15:42.432Z" }, + { url = "https://files.pythonhosted.org/packages/31/a9/a62a0b0fe9bc5fe2cce031c0df5746115296ffd35e5eb075f04c2460c378/grpcio-1.78.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0fa9943d4c7f4a14a9a876153a4e8ee2bb20a410b65c09f31510b2a42271f41b", size = 6521350, upload-time = "2026-02-20T01:15:46.334Z" }, + { url = "https://files.pythonhosted.org/packages/ad/37/39c1ac921df29b530d56a67457195d5883462360771eaf635399390cf680/grpcio-1.78.1-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:75fa92c47d048d696f12b81a775316fca68385ffc6e6cb1ed1d76c8562579f74", size = 7198980, upload-time = "2026-02-20T01:15:49.779Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ce/12062fc4d702e274a11bfa6e76ef87d0da38cb49872f62c24dac178aedd5/grpcio-1.78.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ca6aebae928383e971d5eace4f1a217fd7aadaf18d5ddd3163d80354105e9068", size = 6727055, upload-time = "2026-02-20T01:15:52.38Z" }, + { url = "https://files.pythonhosted.org/packages/ab/28/33a96519cf0315fe065e028a8241e6cf15e175df3a58e902890f112556b3/grpcio-1.78.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5572c5dd1e43dbb452b466be9794f77e3502bdb6aa6a1a7feca72c98c5085ca7", size = 7298944, upload-time = "2026-02-20T01:15:55.624Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f3/fd420ef1e0fef3202f5a2f83264dc9f030f3547dcc9cf42c53294de33237/grpcio-1.78.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e49e720cd6b092504ec7bb2f60eb459aaaf4ce0e5fe20521c201b179e93b5d5d", size = 8285531, upload-time = "2026-02-20T01:15:58.957Z" }, + { url = "https://files.pythonhosted.org/packages/60/43/808c927e5fe8d82eba42c38e6b5bfb53f82c182baee3f35e70992ba05580/grpcio-1.78.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ebeec1383aed86530a5f39646984e92d6596c050629982ac54eeb4e2f6ead668", size = 7724167, upload-time = "2026-02-20T01:16:02.439Z" }, + { url = "https://files.pythonhosted.org/packages/34/c4/c91ad78f61b274405fcdc2430cf16da8f31cc1ccf82c9e97573c603f5e91/grpcio-1.78.1-cp39-cp39-win32.whl", hash = "sha256:263307118791bc350f4642749a9c8c2d13fec496228ab11070973e568c256bfd", size = 4077361, upload-time = "2026-02-20T01:16:05.053Z" }, + { url = "https://files.pythonhosted.org/packages/a0/4a/bbb2eeb77dab12e1b8d1a3a19af37aa783913b64f67340a9f65bde2bd1af/grpcio-1.78.1-cp39-cp39-win_amd64.whl", hash = "sha256:13937b28986f45fee342806b07c6344db785ad74a549ebcb00c659142973556f", size = 4800213, upload-time = "2026-02-20T01:16:07.75Z" }, +] + +[[package]] +name = "grpcio-tools" +version = "1.78.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "grpcio" }, + { name = "protobuf" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/e5/311efa9278a451291e317286babf3f69b1479f8e6fd244836e3803e4b81d/grpcio_tools-1.78.1.tar.gz", hash = "sha256:f47b746b06a940954b9aa86b1824aa4874f068a7ec2d4b407980d202c86a691a", size = 5392610, upload-time = "2026-02-20T01:19:44.109Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/cc/4c6010153ec59ea8833375bc0cce0150b31a8fece551867cc4dfd57f799c/grpcio_tools-1.78.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:ec86147000d713bcf5116350607b16b488432fcae89e7fbb6ac4d388c241273b", size = 2545568, upload-time = "2026-02-20T01:16:27.181Z" }, + { url = "https://files.pythonhosted.org/packages/e2/18/9448e26f026ddad65e84702e44db558c58fa5f3a8ee85dffb68565b1f964/grpcio_tools-1.78.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:ecb698ba221b279356590d65e456d2a3ba63b1668515c85c5a340bf98399acb7", size = 5708709, upload-time = "2026-02-20T01:16:32.204Z" }, + { url = "https://files.pythonhosted.org/packages/21/e2/862d3defacf28e2d95856a2242c6524fb337470cda8e03bc162a2bab10a3/grpcio_tools-1.78.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:77b8f61e5b6b774521875595d5f978dbd534086bc39205126345c7459cf18a44", size = 2591906, upload-time = "2026-02-20T01:16:34.156Z" }, + { url = "https://files.pythonhosted.org/packages/79/e3/e6fb73def5661233a0ab3cfd398894e5d2be2beb6d653d0a3364c762e2b2/grpcio_tools-1.78.1-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:6080c1541487071c6e2763be5ffee452139a919dc5fc9e0eaeca9737af913337", size = 2905270, upload-time = "2026-02-20T01:16:36.76Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/a9f09051aa7490007aa49508b7bb5f865e5bbfa03541e606ba5be8f915f5/grpcio_tools-1.78.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:086cda613dc3a5b58ebd0852273fa76498d61e5296710654d66861309ea30faa", size = 2656237, upload-time = "2026-02-20T01:16:41.685Z" }, + { url = "https://files.pythonhosted.org/packages/37/86/a9af580c764976451cb607ca56ffb7e02e2995c4c5ea80e3275a54705fb1/grpcio_tools-1.78.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:35668bc67bb5600d3f72e9cfbbe15a2ad2f616013b0598877a06396e7de3fa2f", size = 3105766, upload-time = "2026-02-20T01:16:44.893Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8a/1a6bd95d5e581191bf4e3865ae9a2c87f493367721ebfc1d5869ddf007be/grpcio_tools-1.78.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63d578f37a6ccad7f61b1da29b219005874c097664a78967f8b60637f6f3f567", size = 3654897, upload-time = "2026-02-20T01:16:47.601Z" }, + { url = "https://files.pythonhosted.org/packages/26/48/685979f30f9f55a455c2da90bb2898a65657be13062d1708097a4f29f4e9/grpcio_tools-1.78.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c05507d90035e8c0b9617d2ff5c888b7e93e47c111e7880d8a2d190ca5734622", size = 3322530, upload-time = "2026-02-20T01:16:49.669Z" }, + { url = "https://files.pythonhosted.org/packages/31/39/c289037c267bf58e6839936880ca552b0b1b569ea411e65711884c5c3b16/grpcio_tools-1.78.1-cp310-cp310-win32.whl", hash = "sha256:c7a33d981d33b54183e2fa872a4abea632396ef824ca60c268ce50e2fdb9d930", size = 993638, upload-time = "2026-02-20T01:16:52.451Z" }, + { url = "https://files.pythonhosted.org/packages/ea/66/b319aabc3907d6947d9bd502b87842b14c470ab62fd7beadc053cd3ad17a/grpcio_tools-1.78.1-cp310-cp310-win_amd64.whl", hash = "sha256:6e8cdf8f75d24a70511b3db9e4e09cd7a4420ff1a3707e30cefc08f4be189e1f", size = 1158503, upload-time = "2026-02-20T01:16:54.451Z" }, + { url = "https://files.pythonhosted.org/packages/47/c3/b598440ea531f7abdb9c1c5298919e13f4442f0289900dd9ef6667ab72b9/grpcio_tools-1.78.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:ec4483749c7174c301a554191f6a9b28e2388636736a21886fe20025137cdaa5", size = 2545903, upload-time = "2026-02-20T01:16:57.182Z" }, + { url = "https://files.pythonhosted.org/packages/1f/7f/c81ca206047e600ced7c3147f84c894d1ab7eb07642d0a1a4d8511bca7d7/grpcio_tools-1.78.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a81b30b0981cc64853bf28daa4d45f2ce8e4da47d831186a509c05660f23b133", size = 5709065, upload-time = "2026-02-20T01:17:00.054Z" }, + { url = "https://files.pythonhosted.org/packages/80/cd/9b4a601afabf017dadff24d066d0dc6cedfab1e4cdc8e52bcca08291e7e0/grpcio_tools-1.78.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d6406f04b93e48ae3b4dca8f9f312f345265502dc54408056796813c1877f98a", size = 2591744, upload-time = "2026-02-20T01:17:02.539Z" }, + { url = "https://files.pythonhosted.org/packages/46/be/e20b48c5fbbf7c279e3998a62d086f35e0c6efb0d7a9a3ab2966a235b89d/grpcio_tools-1.78.1-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f46fa1430958fe93082d361711e261a482d5a505a9928bc28f7df3fb432d7203", size = 2905111, upload-time = "2026-02-20T01:17:04.659Z" }, + { url = "https://files.pythonhosted.org/packages/68/6b/72b97c60767bc5b256e5e4ba5c4a01dd27dc925c983d85fa8c9ca428f0c9/grpcio_tools-1.78.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a5fbe7d04212248a94acfea86460f1e249f0e42b636de4e71ad518aaf7b24cc9", size = 2656443, upload-time = "2026-02-20T01:17:07.154Z" }, + { url = "https://files.pythonhosted.org/packages/83/92/1023bf1bfa1eaa3b98582f4ba2fcae7153b5b3382b2b3d5b00b47b6e0f57/grpcio_tools-1.78.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e886a3f3284fbff5b4a5c0299427b42df1e1ad6ec9c88c41cfe94557ac191a34", size = 3106129, upload-time = "2026-02-20T01:17:09.385Z" }, + { url = "https://files.pythonhosted.org/packages/d7/55/2c1d64e9efcd0a55b0fc2e6426e65c33edecc590510e67f623e8bd92bfdf/grpcio_tools-1.78.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e1e19c3cb8c4bbfcc20c74b6ef50bd2fb18f82593e65c5b031a92f6794ab9a6d", size = 3654955, upload-time = "2026-02-20T01:17:12.046Z" }, + { url = "https://files.pythonhosted.org/packages/41/76/cc00f693a085e6ddc2477d6dc59ad3e0b0a2f8797ff3703b45e25ddca387/grpcio_tools-1.78.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b0abde2cd28a5925da36776977064e0fe9be667a96ea454acad1eabc3eb7ec48", size = 3322628, upload-time = "2026-02-20T01:17:14.592Z" }, + { url = "https://files.pythonhosted.org/packages/c0/8f/4efdc5a359ae37b079008eda939cf063ab51608a9767f808c672fc542780/grpcio_tools-1.78.1-cp311-cp311-win32.whl", hash = "sha256:a62857bdd681469f7ea603078187399aa8bd8cd7bdeeb603497c993a06d0bb8d", size = 993780, upload-time = "2026-02-20T01:17:20.463Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1c/f6925bfdab52eed2dbaf54ca656de6401e880d079800df53d59cf89a2098/grpcio_tools-1.78.1-cp311-cp311-win_amd64.whl", hash = "sha256:e33de930d02e16d28a2e06d2a629cd5be18c0f386e8bc6c483b073f8898c283c", size = 1158625, upload-time = "2026-02-20T01:17:22.593Z" }, + { url = "https://files.pythonhosted.org/packages/c5/74/928b78c079cf84436e6d6abd52879178c00c1d0dd9bcaf294c3601db8c73/grpcio_tools-1.78.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:2fd5b9ba19849afb511f05f9eaf621aaf21d8582b06d23179b31fb72f2b0add1", size = 2546822, upload-time = "2026-02-20T01:17:24.899Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a4/22b29fa672535b525070d5b665b064903e4dddce694f036fae115978245f/grpcio_tools-1.78.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3e2148b0b15dea87d2fea17d1eda3ae0cdc6dd378fe75903f17515cbb6e5f4a3", size = 5706796, upload-time = "2026-02-20T01:17:30.223Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ac/8ab479655b52bb8a1f55fd73df0b7b9fe6e5470775a3432b6265ff2782df/grpcio_tools-1.78.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58714482282ba4f6ebe550a43284b3383761e7bf1c1cafa009740d4b20cfc5fd", size = 2593971, upload-time = "2026-02-20T01:17:32.843Z" }, + { url = "https://files.pythonhosted.org/packages/3c/89/f7b48b112ef8b457e2a30d13cb357947bbb98635b016db6d4e1885c5160e/grpcio_tools-1.78.1-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3edc65d8d547e2c3e90937896bce58f1a4187b45a5ac2d97c84d0501c917c6e7", size = 2905532, upload-time = "2026-02-20T01:17:35.512Z" }, + { url = "https://files.pythonhosted.org/packages/94/3c/c74185dbbaa5930ac124121e9546f7aec54790ad2b2a352ae13606c2d0a5/grpcio_tools-1.78.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa5720e07b81e82107c33f1951572f4371b668933da110418146e8fe51813ec", size = 2656908, upload-time = "2026-02-20T01:17:37.914Z" }, + { url = "https://files.pythonhosted.org/packages/5a/6f/a5dfcdec7d2eabcd1aafa20dd1c558fe34907e86672a39afdea1ed48556f/grpcio_tools-1.78.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d665399893f79dfce1018143602b1e53cc6434cb919b141ad5ce9d09d25b6c88", size = 3109782, upload-time = "2026-02-20T01:17:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/66/c5/c3a9a79f2da4ae99cc1290f2a90e5d798525e9556d6b2e7f7090d4a05271/grpcio_tools-1.78.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3ab437967bd61034b278ca1043a5f2f70ab3a8b45f2531b4295ffc7da27893c9", size = 3658761, upload-time = "2026-02-20T01:17:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/69/42/656a38e78cebed3b98bb737630faa30d0f22915112166b892e89a843e08f/grpcio_tools-1.78.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:63c91efb22a6977111bbde16f58e393ab75f1f4ff95850abc24fd279402a02f7", size = 3325115, upload-time = "2026-02-20T01:17:46.089Z" }, + { url = "https://files.pythonhosted.org/packages/00/c0/8e3444d127c243170a7dc732d6cbd009c3de78a86002f7abdc317ce7f828/grpcio_tools-1.78.1-cp312-cp312-win32.whl", hash = "sha256:7ecc57c2a82a7f67d07c1491eea39aec9660306a8b67b7b0116ade52c3466297", size = 993478, upload-time = "2026-02-20T01:17:48.194Z" }, + { url = "https://files.pythonhosted.org/packages/a5/cc/e2211fe54ae29b31ed20154e002184546ed08800105aeb8692898f7b4a6f/grpcio_tools-1.78.1-cp312-cp312-win_amd64.whl", hash = "sha256:7e465bf6e49c8d3905997b079d4cab233cd1e0ad558aa3b93ce074172ad75fa1", size = 1158466, upload-time = "2026-02-20T01:17:50.284Z" }, + { url = "https://files.pythonhosted.org/packages/09/44/b8371d238bcb6141b178f91d65477e5aec9fe6d3f7c245e581bdb73e6330/grpcio_tools-1.78.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:3ad2cfae254f965776e296635d0ef96bdb2e6fde54c3d8e0f1ed98161ec00a8f", size = 2546284, upload-time = "2026-02-20T01:17:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/68/e1/db6f388ad57d23ec7e3fdc4a1d12495cadc022df8a6138b827dbc6ad1b79/grpcio_tools-1.78.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:b5d4c75fa44d560e694b65b19df3d7e73d89c2bf9e2d7b672a9e650f40ca33df", size = 5705688, upload-time = "2026-02-20T01:17:56.279Z" }, + { url = "https://files.pythonhosted.org/packages/16/44/9b2dc99c0fdc8f83ffa72e51fc52f0ad5015fc6c0dc733ba0e0eeb289916/grpcio_tools-1.78.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:63e87dd399a4071c0cfdf131cf382a7c3859f2bee9cff8ec996dd8dea3e3afbb", size = 2592788, upload-time = "2026-02-20T01:17:58.729Z" }, + { url = "https://files.pythonhosted.org/packages/5e/f2/885039af8fcda73eca2d244fcd295381c682919b39f2078453e6cb002879/grpcio_tools-1.78.1-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08704fd6df74dd95c28a2c095f59e10aec61abe64e2c44f1109d725f728688ba", size = 2905157, upload-time = "2026-02-20T01:18:01.295Z" }, + { url = "https://files.pythonhosted.org/packages/98/a4/859e99a1a728367bbe4d5671e92c984536077e2690fef5637c5e66434b5b/grpcio_tools-1.78.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e53faada7c186ae5a46b236a4961284c45f9eb069888c651021346f9360d58e0", size = 2656161, upload-time = "2026-02-20T01:18:03.386Z" }, + { url = "https://files.pythonhosted.org/packages/7f/6e/2f8b6b6e06d5728c571ec4b702a3a249743816b771b78f2dc79be67dea33/grpcio_tools-1.78.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99479dfa64faa8ed887df22a1489e6bd4027e38efdad7de9fdc6038e67569f0a", size = 3109110, upload-time = "2026-02-20T01:18:08.877Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f5/1cf1b232a996b8eb560adb4a75d468fa0badf804ce182a0ce7b03b796299/grpcio_tools-1.78.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e0335ba2e6b903b9156151a49d03e74d2876259d5233ac97de53b4c847a56000", size = 3657864, upload-time = "2026-02-20T01:18:18.75Z" }, + { url = "https://files.pythonhosted.org/packages/ee/52/0714adbb17bd12661fb7cd247991a175069de9269bd506cff3cd9638f6c4/grpcio_tools-1.78.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d54640c46d496ed9367caaa36a5742adca9b215ea06cf6714dcf1aa190a43b6d", size = 3324749, upload-time = "2026-02-20T01:18:21.394Z" }, + { url = "https://files.pythonhosted.org/packages/3a/15/bb6ac754ce74980ea78bdd428b8d5fdeda77e04a674388aac81c885595ea/grpcio_tools-1.78.1-cp313-cp313-win32.whl", hash = "sha256:df604903f86adae37eb90f4168db13090f723b3602bac89519aff451aea46ea3", size = 993050, upload-time = "2026-02-20T01:18:24.132Z" }, + { url = "https://files.pythonhosted.org/packages/c8/83/9d75e3ad324b11de988a7534d22c066e0da7cffc5656f973993e719efab1/grpcio_tools-1.78.1-cp313-cp313-win_amd64.whl", hash = "sha256:7f4469a91556442330aad0710ffc16a853681e1aa7c0752b2db2e8255c872897", size = 1158153, upload-time = "2026-02-20T01:18:27.844Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5b/76d7969539159a22dfa20c23c3885ce9024a12d88e23d76063a1e1df566d/grpcio_tools-1.78.1-cp314-cp314-linux_armv7l.whl", hash = "sha256:11c6a338c227e5aab76954f35959682d59c432a5b6d7db053fa1a99c7124bbde", size = 2546269, upload-time = "2026-02-20T01:18:30.673Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8a/a1d180e7165bbdd30d109a448c95d6077eaa9afe40a2ed159f40bec64ce3/grpcio_tools-1.78.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:090aeaa053f728539d0f84658bb5d88411a913cbcc49e990b5a80acd3c46dc94", size = 5705752, upload-time = "2026-02-20T01:18:33.396Z" }, + { url = "https://files.pythonhosted.org/packages/43/5c/067b95424eee7cb980a2237c3ecd23935ea742b17acf4411064a727ec9b0/grpcio_tools-1.78.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:203347a50b00e6a1793c35af437a39449b247b9461a9f1f9b9baf954b4255cd8", size = 2593895, upload-time = "2026-02-20T01:18:36.746Z" }, + { url = "https://files.pythonhosted.org/packages/01/1f/6edd882a7c47f74321aeec98ef20b7c54c4fa61c81bb08039b14c1777de2/grpcio_tools-1.78.1-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:7c3cef48b10cccfc039b5ae054d7ad8d7b907ff03a283b606b3999ce3843b5a5", size = 2905296, upload-time = "2026-02-20T01:18:41.875Z" }, + { url = "https://files.pythonhosted.org/packages/a4/15/2ecacd23670fd8bc945fa1a3ae5ad0916c95d9803ceda0b7427d9dfc4ee0/grpcio_tools-1.78.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:abb2aee19b91d619670a3598faaa8036b31dd96708ab82d8fb990da4b5c3fc01", size = 2656183, upload-time = "2026-02-20T01:18:44.556Z" }, + { url = "https://files.pythonhosted.org/packages/60/36/ec4b0172f803f7add82bcc16346b47a80ca983539dc5bf779da1d44f3b4a/grpcio_tools-1.78.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b6307ce936cd5f7714bba75e8b7c71f4e6a4da625b907960227568022ee812fa", size = 3109860, upload-time = "2026-02-20T01:18:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/79/85/6fb37b10667764505f9bc6baab9bccaaa0777bfe07aa786f9e1d4f482253/grpcio_tools-1.78.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:40aad3da94bf261792ff998084117f6ce092b7b137dcea257628def834b91e96", size = 3657914, upload-time = "2026-02-20T01:18:59.138Z" }, + { url = "https://files.pythonhosted.org/packages/42/11/da86c93b0d00f5180d283740c89aa998f955c7389ff268128b99c5bebdb9/grpcio_tools-1.78.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:36dbd00415376a3db03cd57a8063dfb5506c3ec69737945488f6c28a3e8b5cf1", size = 3324719, upload-time = "2026-02-20T01:19:01.55Z" }, + { url = "https://files.pythonhosted.org/packages/9d/b6/6a00609300fbfe2163183522005911f4676bc80db374d55c2a9d9e70997e/grpcio_tools-1.78.1-cp314-cp314-win32.whl", hash = "sha256:6d284037ff456842324fa12b0a6455fce0b3ab92f218677b34c33cf4787a54c4", size = 1015537, upload-time = "2026-02-20T01:19:04.289Z" }, + { url = "https://files.pythonhosted.org/packages/05/76/ef3d2f5a86da2b3a2abcef7141bc4d2d8d119b0da389029811a4507b499b/grpcio_tools-1.78.1-cp314-cp314-win_amd64.whl", hash = "sha256:acb9849783dc7cf0e7359cbd60c6bf3154008bf9aeff12c696ec7289599eb3a8", size = 1190123, upload-time = "2026-02-20T01:19:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/21/38/6ce3fa4db36b6840404dbf3ee4c59f433d3a281984046abdedddb1ae24b9/grpcio_tools-1.78.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:d10c27480bf3bf729de01979f3569aa128f5e5685c4cbed69c9bdbb200d62bcc", size = 2546130, upload-time = "2026-02-20T01:19:09.844Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b9/ae72e3734aa3e02c90cbd9baec7d8bcf616c54fe1d8ca86ad26bb490aa17/grpcio_tools-1.78.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:fb484640c759ab94d68f8944e00db94e590714e3d5a5a492816e19e3e8e25334", size = 5709555, upload-time = "2026-02-20T01:19:13.4Z" }, + { url = "https://files.pythonhosted.org/packages/c0/e8/fd7999f35a86d40090fd83c17b6eb7dd37b336a62ba0512e1dedf22fa388/grpcio_tools-1.78.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ce974c88b36f3354574b77df26c9530efd90476f2bb7f71a2bc21096c235d931", size = 2592039, upload-time = "2026-02-20T01:19:16.166Z" }, + { url = "https://files.pythonhosted.org/packages/2a/76/bb68ddcd7d381b2e4ed8221057d51f8db2c39bc9239d7856e9ac03366904/grpcio_tools-1.78.1-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:7c14f58e9d4fc0fefe215862b52bcc79fefc1085e33d938b5070663985bed8e2", size = 2905454, upload-time = "2026-02-20T01:19:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/fb/8f/c5516a38d92096243fffd813d05e3be4c29c0931a238e2bb3f57bc7199e0/grpcio_tools-1.78.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:eb7ed3e69e6cbc13a10c1651bc59c8255cef56b35b2248211c341a0dd84d80fe", size = 2657022, upload-time = "2026-02-20T01:19:21.386Z" }, + { url = "https://files.pythonhosted.org/packages/4f/a0/d8a1706042c3181f6f7f7e71da665b4f4cccf247a84e98d071b6ff688ca1/grpcio_tools-1.78.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f617dd5a74fcd15f333254edb55695ea439dfdf00a0a3fe157e020be13572bca", size = 3106545, upload-time = "2026-02-20T01:19:24.806Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4e/9c772b490f2d9a3bbc0358de1f8583d75595e1f335993e51d67228c67f6d/grpcio_tools-1.78.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a8b7119294179b409cd78a072d93c233533cc12067be16dca4398e1f20627289", size = 3655123, upload-time = "2026-02-20T01:19:33.263Z" }, + { url = "https://files.pythonhosted.org/packages/d1/30/ec5d6c02debdb05bb3ca53fd9f87b156c15c349fbe50456ffc4bf7281491/grpcio_tools-1.78.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cd0aec543a809ab8eeeec35c66f7b86be01d669799ffac7e6c2cca5644e996c7", size = 3323120, upload-time = "2026-02-20T01:19:35.767Z" }, + { url = "https://files.pythonhosted.org/packages/a0/20/0be675115430f7e585d7cc54a36f90197209535aa2007c6c87d54b52cd34/grpcio_tools-1.78.1-cp39-cp39-win32.whl", hash = "sha256:8736a6e33f077183593ade99064d7e7e6d77874ef0d6001f214ba909e4112c5e", size = 994036, upload-time = "2026-02-20T01:19:38.021Z" }, + { url = "https://files.pythonhosted.org/packages/25/be/f402e4c104fa559d0ec53bb2b88bbf5557c417321f10f63012823f5eb43f/grpcio_tools-1.78.1-cp39-cp39-win_amd64.whl", hash = "sha256:e84f4a25e99fe5c6223142cae0ad18224759b4d11bd1ba35f47532f2c11a3cce", size = 1158925, upload-time = "2026-02-20T01:19:40.863Z" }, +] + [[package]] name = "idna" version = "3.7" @@ -915,6 +1065,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a5/5b/0cc789b59e8cc1bf288b38111d002d8c5917123194d45b29dcdac64723cc/pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", size = 20120, upload-time = "2024-01-24T13:45:14.227Z" }, ] +[[package]] +name = "protobuf" +version = "6.33.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/b8/cda15d9d46d03d4aa3a67cb6bffe05173440ccf86a9541afaf7ac59a1b6b/protobuf-6.33.4.tar.gz", hash = "sha256:dc2e61bca3b10470c1912d166fe0af67bfc20eb55971dcef8dfa48ce14f0ed91", size = 444346, upload-time = "2026-01-12T18:33:40.109Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/be/24ef9f3095bacdf95b458543334d0c4908ccdaee5130420bf064492c325f/protobuf-6.33.4-cp310-abi3-win32.whl", hash = "sha256:918966612c8232fc6c24c78e1cd89784307f5814ad7506c308ee3cf86662850d", size = 425612, upload-time = "2026-01-12T18:33:29.656Z" }, + { url = "https://files.pythonhosted.org/packages/31/ad/e5693e1974a28869e7cd244302911955c1cebc0161eb32dfa2b25b6e96f0/protobuf-6.33.4-cp310-abi3-win_amd64.whl", hash = "sha256:8f11ffae31ec67fc2554c2ef891dcb561dae9a2a3ed941f9e134c2db06657dbc", size = 436962, upload-time = "2026-01-12T18:33:31.345Z" }, + { url = "https://files.pythonhosted.org/packages/66/15/6ee23553b6bfd82670207ead921f4d8ef14c107e5e11443b04caeb5ab5ec/protobuf-6.33.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2fe67f6c014c84f655ee06f6f66213f9254b3a8b6bda6cda0ccd4232c73c06f0", size = 427612, upload-time = "2026-01-12T18:33:32.646Z" }, + { url = "https://files.pythonhosted.org/packages/2b/48/d301907ce6d0db75f959ca74f44b475a9caa8fcba102d098d3c3dd0f2d3f/protobuf-6.33.4-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:757c978f82e74d75cba88eddec479df9b99a42b31193313b75e492c06a51764e", size = 324484, upload-time = "2026-01-12T18:33:33.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/1c/e53078d3f7fe710572ab2dcffd993e1e3b438ae71cfc031b71bae44fcb2d/protobuf-6.33.4-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c7c64f259c618f0bef7bee042075e390debbf9682334be2b67408ec7c1c09ee6", size = 339256, upload-time = "2026-01-12T18:33:35.231Z" }, + { url = "https://files.pythonhosted.org/packages/e8/8e/971c0edd084914f7ee7c23aa70ba89e8903918adca179319ee94403701d5/protobuf-6.33.4-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:3df850c2f8db9934de4cf8f9152f8dc2558f49f298f37f90c517e8e5c84c30e9", size = 323311, upload-time = "2026-01-12T18:33:36.305Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bd/5c6cda3fbdde7473edcfd4c93a698a3021ffdcc92f3c101203a93bfd9c04/protobuf-6.33.4-cp39-cp39-win32.whl", hash = "sha256:955478a89559fa4568f5a81dce77260eabc5c686f9e8366219ebd30debf06aa6", size = 425734, upload-time = "2026-01-12T18:33:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/a128b3eb55954074074bdba124003e64d255314a12888fd41faecc458798/protobuf-6.33.4-cp39-cp39-win_amd64.whl", hash = "sha256:0f12ddbf96912690c3582f9dffb55530ef32015ad8e678cd494312bd78314c4f", size = 436984, upload-time = "2026-01-12T18:33:38.303Z" }, + { url = "https://files.pythonhosted.org/packages/75/b1/1dc83c2c661b4c62d56cc081706ee33a4fc2835bd90f965baa2663ef7676/protobuf-6.33.4-py3-none-any.whl", hash = "sha256:1fe3730068fcf2e595816a6c34fe66eeedd37d51d0400b72fabc848811fdc1bc", size = 170532, upload-time = "2026-01-12T18:33:39.199Z" }, +] + [[package]] name = "psutil" version = "5.9.8"