From a4b648381b344b219e2f99e6997164af1b5224ef Mon Sep 17 00:00:00 2001 From: joerinehart Date: Thu, 20 Feb 2025 08:21:19 -0500 Subject: [PATCH 01/11] DVRL-71 - initial draft of Python README --- README.md | 202 ++++++++++++++++++++---------------------------------- 1 file changed, 76 insertions(+), 126 deletions(-) diff --git a/README.md b/README.md index c01515a..e862659 100644 --- a/README.md +++ b/README.md @@ -1,165 +1,115 @@ -# protovalidate-python +# [![The Buf logo](.github/buf-logo.svg)][buf] protovalidate-python [![CI](https://github.com/bufbuild/protovalidate-python/actions/workflows/ci.yaml/badge.svg)](https://github.com/bufbuild/protovalidate-python/actions/workflows/ci.yaml) [![Conformance](https://github.com/bufbuild/protovalidate-python/actions/workflows/conformance.yaml/badge.svg)](https://github.com/bufbuild/protovalidate-python/actions/workflows/conformance.yaml) [![PyPI version](https://badge.fury.io/py/protovalidate.svg)](https://badge.fury.io/py/protovalidate) -`protovalidate-python` is the Python implementation of [`protovalidate`](https://github.com/bufbuild/protovalidate), -designed to validate Protobuf messages at runtime based on user-defined validation constraints. Powered by Google's -Common Expression Language ([CEL](https://github.com/google/cel-spec)), it provides a flexible and efficient foundation -for defining and evaluating custom validation rules. The primary goal of `protovalidate` is to help developers ensure -data consistency and integrity across the network without requiring generated code. +[Protovalidate][protovalidate] provides standard annotations to validate common constraints on messages and fields, as well as the ability to use [CEL][cel] to write custom constraints. It's the next generation of [protoc-gen-validate][protoc-gen-validate], the only widely used validation library for Protobuf. -## The `protovalidate` project +With Protovalidate, you can annotate your Protobuf messages with both standard and custom validation rules: -Head over to the core [`protovalidate`](https://github.com/bufbuild/protovalidate/) repository for: +```protobuf +syntax = "proto3"; + +package banking.v1; + +import "buf/validate/validate.proto"; -- [The API definition](https://github.com/bufbuild/protovalidate/tree/main/proto/protovalidate/buf/validate/validate.proto): - used to describe validation constraints -- [Documentation](https://github.com/bufbuild/protovalidate/tree/main/docs): how to apply `protovalidate` effectively -- [Migration tooling](https://github.com/bufbuild/protovalidate/tree/main/docs/migrate.md): incrementally migrate - from `protoc-gen-validate` -- [Conformance testing utilities](https://github.com/bufbuild/protovalidate/tree/main/docs/conformance.md): for - acceptance testing of `protovalidate` implementations +message MoneyTransfer { + string to_account_id = 1 [ + // Standard rule: `to_account_id` must be a UUID + (buf.validate.field).string.uuid = true + ]; -Other `protovalidate` runtime implementations include: + string from_account_id = 2 [ + // Standard rule: `from_account_id` must be a UUID + (buf.validate.field).string.uuid = true + ]; -- Go: [`protovalidate-go`](https://github.com/bufbuild/protovalidate-go) -- C++: [`protovalidate-cc`](https://github.com/bufbuild/protovalidate-cc) -- Java: [`protovalidate-java`](https://github.com/bufbuild/protovalidate-java) + // Custom rule: `to_account_id` and `from_account_id` can't be the same. + option (buf.validate.message).cel = { + id: "to_account_id.not.from_account_id" + message: "to_account_id and from_account_id should not be the same value" + expression: "this.to_account_id != this.from_account_id" + }; +} +``` -And others coming soon: +Once you've added `protovalidate-python` to your project, validation is idiomatic Python: -- TypeScript: `protovalidate-ts` +```python +try: + protovalidate.validate(message) +except protovalidate.ValidationError as e: + # Handle failure. +``` ## Installation -To install the package, use pip: +> [!TIP] +> The easiest way to get started with Protovalidate for RPC APIs are the how-to's in Buf's documentation. There's one available for [Python and gRPC][grpc-python]. + +To install the package, use `pip`: ```shell pip install protovalidate ``` -Make sure you have the latest version of `protovalidate-python` by checking the -project's [PyPI page](https://pypi.org/project/protovalidate/). +# Documentation -## Usage +Comprehensive documentation for Protovalidate is available in [Buf's documentation library][protovalidate]. -### Implementing validation constraints +Highlights for Python developers include: -Validation constraints are defined directly within `.proto` files. Documentation for adding constraints can be found in -the `protovalidate` project [README](https://github.com/bufbuild/protovalidate) and -its [comprehensive docs](https://github.com/bufbuild/protovalidate/tree/main/docs). +* The [developer quickstart][quickstart] +* A comprehensive RPC how-to for [Python and gRPC][grpc-python] +* A [migration guide for protoc-gen-validate][migration-guide] users -```protobuf -syntax = "proto3"; +# Additional Languages and Repositories -package my.package; - -import "google/protobuf/timestamp.proto"; -import "buf/validate/validate.proto"; +Protovalidate isn't just for Python! You might be interested in sibling repositories for other languages: -message Transaction { - uint64 id = 1 [(buf.validate.field).uint64.gt = 999]; - google.protobuf.Timestamp purchase_date = 2; - google.protobuf.Timestamp delivery_date = 3; +- [`protovalidate-go`][pv-go] (Go) +- [`protovalidate-java`][pv-java] (Java) +- [`protovalidate-cc`][pv-cc] (C++) +- `protovalidate-ts` (TypeScript, coming soon!) - string price = 4 [(buf.validate.field).cel = { - id: "transaction.price", - message: "price must be positive and include a valid currency symbol ($ or £)", - expression: "(this.startsWith('$') || this.startsWith('£')) && double(this.substring(1)) > 0" - }]; +For a peek into how Protovalidate works, you might also want to check out [`protovalidate's core repository`](https://github.com/bufbuild/protovalidate), where `validate.proto` defines the entire cross-language API. - option (buf.validate.message).cel = { - id: "transaction.delivery_date", - message: "delivery date must be after purchase date", - expression: "this.delivery_date > this.purchase_date" - }; -} -``` +## Related Sites -### Generating Code with `buf` - -When using the runtime library after installing it with `pip`, it's necessary to generate the Python code for the core `buf.protovalidate` Protobuf package. `buf` provides an efficient method for this: - -1. **Initialize a New Configuration File**: - ```shell - buf config init - ``` - This initializes the `buf.yaml` configuration file at the root of the Protobuf source files. - -2. **Module Configuration and Dependencies**: - ```yaml - # buf.yaml - version: v2 - deps: - - buf.build/bufbuild/protovalidate - ``` - - Ensure your dependencies are up-to-date with: - ```shell - buf dep update - ``` - -3. **Setup Code Generation**: - ```yaml - # buf.gen.yaml - version: v2 - plugins: - - remote: buf.build/protocolbuffers/python - out: gen - ``` - -4. **Generate Code**: - To generate the required Python code: - ```shell - buf generate --include-imports - ``` - -5. **Specify import paths**: - Ensure that the generated code is importable by setting the `PYTHONPATH` environment variable: - ```shell - export PYTHONPATH=$PYTHONPATH:gen - ``` - -If your goal is to generate code specifically for the `buf.protovalidate` Protobuf package, run: -```shell -buf generate buf.build/bufbuild/protovalidate -``` +- [Buf][buf] - Enterprise-grade Kafka and gRPC for the modern age +- [Common Expression Language (CEL)][cel] - The open-source technology at the core of Protovalidate -> **Note:** For users familiar with `protoc`, while it's an alternative to `buf`, it is recommended to use tooling or frameworks like Bazel for direct code generation, as it provides an encapsulated environment for such tasks. +# Contribution -### Example +We genuinely appreciate any help! If you'd like to contribute, the following will be of interest: -```python -import protovalidate -from google.protobuf.timestamp_pb2 import Timestamp -from my.package import Transaction +- [Contributing Guidelines][contributing] - Guidelines to make your contribution process straightforward and meaningful +- [Conformance testing utilities](https://github.com/bufbuild/protovalidate/tree/main/docs/conformance.md) - Utilities providing acceptance testing of `protovalidate` implementations -transaction = Transaction() -transaction.id = 1234 -transaction.price = "$5.67" -transaction.purchase_date.CopyFrom(Timestamp()) -transaction.delivery_date.CopyFrom(Timestamp()) +# Legal -try: - protovalidate.validate(transaction) -except protovalidate.ValidationError as e: -# Report the violations -``` +Offered under the [Apache 2 license][license]. -### Ecosystem +[buf]: https://buf.build +[cel]: https://cel.dev -- [`protovalidate`](https://github.com/bufbuild/protovalidate) core repository -- [Buf](https://buf.build) -- [CEL Spec](https://github.com/google/cel-spec) +[pv-go]: https://github.com/bufbuild/protovalidate-go +[pv-java]: https://github.com/bufbuild/protovalidate-java +[pv-python]: https://github.com/bufbuild/protovalidate-python +[pv-cc]: https://github.com/bufbuild/protovalidate-cc -## Legal +[buf-mod]: https://buf.build/bufbuild/protovalidate +[license]: LICENSE +[contributing]: .github/CONTRIBUTING.md -Offered under the [Apache 2 license][license]. +[protoc-gen-validate]: https://github.com/bufbuild/protoc-gen-validate -[license]: LICENSE -[buf]: https://buf.build -[buf-mod]: https://buf.build/bufbuild/protovalidate -[cel-go]: https://github.com/google/cel-go -[cel-spec]: https://github.com/google/cel-spec +[protovalidate]: https://buf.build/docs/protovalidate/overview/ +[quickstart]: https://buf.build/docs/protovalidate/quickstart/ +[connect-go]: https://buf.build/docs/protovalidate/how-to/connect-go/ +[grpc-go]: https://buf.build/docs/protovalidate/how-to/grpc-go/ +[grpc-java]: https://buf.build/docs/protovalidate/how-to/grpc-java/ +[grpc-python]: https://buf.build/docs/protovalidate/how-to/grpc-python/ +[migration-guide]: https://buf.build/docs/migration-guides/migrate-from-protoc-gen-validate/ From 0a77cfe91b42130ecf49522780d4c33283ae5776 Mon Sep 17 00:00:00 2001 From: joerinehart Date: Thu, 20 Feb 2025 09:07:20 -0500 Subject: [PATCH 02/11] DVRL-71 - fixing header sizes --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 23779eb..bb76a7a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -36,8 +36,8 @@ assignees: '' - **Version**: - **Compiler/Toolchain**: - **Protobuf Compiler & Version**: -- **Protoc-gen-validate Version**: - **Protovalidate Version**: +- **Protoc-gen-validate Version**: ## Possible Solution diff --git a/README.md b/README.md index e862659..3736332 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ except protovalidate.ValidationError as e: # Handle failure. ``` -## Installation +# Installation > [!TIP] > The easiest way to get started with Protovalidate for RPC APIs are the how-to's in Buf's documentation. There's one available for [Python and gRPC][grpc-python]. @@ -76,7 +76,7 @@ Protovalidate isn't just for Python! You might be interested in sibling reposito For a peek into how Protovalidate works, you might also want to check out [`protovalidate's core repository`](https://github.com/bufbuild/protovalidate), where `validate.proto` defines the entire cross-language API. -## Related Sites +# Related Sites - [Buf][buf] - Enterprise-grade Kafka and gRPC for the modern age - [Common Expression Language (CEL)][cel] - The open-source technology at the core of Protovalidate From 144d2937818c29026af92140a21ea52e01940246 Mon Sep 17 00:00:00 2001 From: joerinehart Date: Tue, 25 Feb 2025 09:42:40 -0500 Subject: [PATCH 03/11] DVRL-61 - revisions before PR --- README.md | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3736332..485e625 100644 --- a/README.md +++ b/README.md @@ -74,19 +74,24 @@ Protovalidate isn't just for Python! You might be interested in sibling reposito - [`protovalidate-cc`][pv-cc] (C++) - `protovalidate-ts` (TypeScript, coming soon!) -For a peek into how Protovalidate works, you might also want to check out [`protovalidate's core repository`](https://github.com/bufbuild/protovalidate), where `validate.proto` defines the entire cross-language API. +Additionally, [protovalidate's core repository](https://github.com/bufbuild/protovalidate) provides: -# Related Sites - -- [Buf][buf] - Enterprise-grade Kafka and gRPC for the modern age -- [Common Expression Language (CEL)][cel] - The open-source technology at the core of Protovalidate +- [Protovalidate's Protobuf API][validate-proto] +- [Migration tooling][migrate] for `protoc-gen-validate` users +- [Example][examples] `.proto` files using `protovalidate` +- [Conformance testing utilities][conformance] for acceptance testing of `protovalidate` implementations # Contribution We genuinely appreciate any help! If you'd like to contribute, the following will be of interest: -- [Contributing Guidelines][contributing] - Guidelines to make your contribution process straightforward and meaningful -- [Conformance testing utilities](https://github.com/bufbuild/protovalidate/tree/main/docs/conformance.md) - Utilities providing acceptance testing of `protovalidate` implementations +- [Contributing Guidelines][contributing]: Guidelines to make your contribution process straightforward and meaningful +- [Conformance testing utilities](https://github.com/bufbuild/protovalidate/tree/main/docs/conformance.md): Utilities providing acceptance testing of `protovalidate` implementations + +# Related Sites + +- [Buf][buf]: Enterprise-grade Kafka and gRPC for the modern age +- [Common Expression Language (CEL)][cel]: The open-source technology at the core of Protovalidate # Legal @@ -113,3 +118,10 @@ Offered under the [Apache 2 license][license]. [grpc-java]: https://buf.build/docs/protovalidate/how-to/grpc-java/ [grpc-python]: https://buf.build/docs/protovalidate/how-to/grpc-python/ [migration-guide]: https://buf.build/docs/migration-guides/migrate-from-protoc-gen-validate/ +[conformance-executable]: ./internal/cmd/protovalidate-conformance-go/README.md +[pkg-go]: https://pkg.go.dev/github.com/bufbuild/protovalidate-go + +[validate-proto]: https://buf.build/bufbuild/protovalidate/docs/main:buf.validate +[conformance]: https://github.com/bufbuild/protovalidate/blob/main/docs/conformance.md +[examples]: https://github.com/bufbuild/protovalidate/tree/main/examples +[migrate]: https://buf.build/docs/migration-guides/migrate-from-protoc-gen-validate/ From f87c2f190b3ef45c271283b3f4c8806fd30d8914 Mon Sep 17 00:00:00 2001 From: joerinehart Date: Tue, 25 Feb 2025 10:41:45 -0500 Subject: [PATCH 04/11] DVRL-61 - removing duplicative link --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 485e625..fa9d925 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,6 @@ Protovalidate isn't just for Python! You might be interested in sibling reposito Additionally, [protovalidate's core repository](https://github.com/bufbuild/protovalidate) provides: - [Protovalidate's Protobuf API][validate-proto] -- [Migration tooling][migrate] for `protoc-gen-validate` users - [Example][examples] `.proto` files using `protovalidate` - [Conformance testing utilities][conformance] for acceptance testing of `protovalidate` implementations From 84dfdc4de11fa30c4a7546f2850b8ff05c899a4d Mon Sep 17 00:00:00 2001 From: joerinehart Date: Tue, 25 Feb 2025 11:00:53 -0500 Subject: [PATCH 05/11] DVRL-61 - fixing headers --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index fa9d925..5038e7a 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ except protovalidate.ValidationError as e: # Handle failure. ``` -# Installation +## Installation > [!TIP] > The easiest way to get started with Protovalidate for RPC APIs are the how-to's in Buf's documentation. There's one available for [Python and gRPC][grpc-python]. @@ -55,7 +55,7 @@ To install the package, use `pip`: pip install protovalidate ``` -# Documentation +## Documentation Comprehensive documentation for Protovalidate is available in [Buf's documentation library][protovalidate]. @@ -65,7 +65,7 @@ Highlights for Python developers include: * A comprehensive RPC how-to for [Python and gRPC][grpc-python] * A [migration guide for protoc-gen-validate][migration-guide] users -# Additional Languages and Repositories +## Additional Languages and Repositories Protovalidate isn't just for Python! You might be interested in sibling repositories for other languages: @@ -80,19 +80,19 @@ Additionally, [protovalidate's core repository](https://github.com/bufbuild/prot - [Example][examples] `.proto` files using `protovalidate` - [Conformance testing utilities][conformance] for acceptance testing of `protovalidate` implementations -# Contribution +## Contribution We genuinely appreciate any help! If you'd like to contribute, the following will be of interest: - [Contributing Guidelines][contributing]: Guidelines to make your contribution process straightforward and meaningful - [Conformance testing utilities](https://github.com/bufbuild/protovalidate/tree/main/docs/conformance.md): Utilities providing acceptance testing of `protovalidate` implementations -# Related Sites +## Related Sites - [Buf][buf]: Enterprise-grade Kafka and gRPC for the modern age - [Common Expression Language (CEL)][cel]: The open-source technology at the core of Protovalidate -# Legal +## Legal Offered under the [Apache 2 license][license]. From ed4a8e2bec51871a1e54929562d080828677eea1 Mon Sep 17 00:00:00 2001 From: joerinehart Date: Tue, 25 Feb 2025 11:36:09 -0500 Subject: [PATCH 06/11] DVRL-61 - updating bug report --- .github/ISSUE_TEMPLATE/bug_report.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index bb76a7a..49e66eb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -37,7 +37,6 @@ assignees: '' - **Compiler/Toolchain**: - **Protobuf Compiler & Version**: - **Protovalidate Version**: -- **Protoc-gen-validate Version**: ## Possible Solution From 9a4bbee4bea814b4c2d35d76d19ec84ce6f1c27c Mon Sep 17 00:00:00 2001 From: joerinehart Date: Tue, 25 Feb 2025 13:23:27 -0500 Subject: [PATCH 07/11] DVRL-61 - consistent logo treatment --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5038e7a..f48f00b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# [![The Buf logo](.github/buf-logo.svg)][buf] protovalidate-python +[![The Buf logo](.github/buf-logo.svg)][buf] + +# protovalidate-python [![CI](https://github.com/bufbuild/protovalidate-python/actions/workflows/ci.yaml/badge.svg)](https://github.com/bufbuild/protovalidate-python/actions/workflows/ci.yaml) [![Conformance](https://github.com/bufbuild/protovalidate-python/actions/workflows/conformance.yaml/badge.svg)](https://github.com/bufbuild/protovalidate-python/actions/workflows/conformance.yaml) From cf7ba8024ce4b6adfe010188174d2f917ad83b25 Mon Sep 17 00:00:00 2001 From: jrinehart-buf Date: Tue, 25 Feb 2025 18:06:30 -0500 Subject: [PATCH 08/11] Apply suggestions from code review Co-authored-by: Carol Gunby --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f48f00b..26a75c0 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ Additionally, [protovalidate's core repository](https://github.com/bufbuild/prot ## Contribution -We genuinely appreciate any help! If you'd like to contribute, the following will be of interest: +We genuinely appreciate any help! If you'd like to contribute, check out these resources: - [Contributing Guidelines][contributing]: Guidelines to make your contribution process straightforward and meaningful - [Conformance testing utilities](https://github.com/bufbuild/protovalidate/tree/main/docs/conformance.md): Utilities providing acceptance testing of `protovalidate` implementations From 9787b2568e67516b4c7f97bcbebfa5c4edcc8e1a Mon Sep 17 00:00:00 2001 From: joerinehart Date: Fri, 28 Mar 2025 09:43:57 -0400 Subject: [PATCH 09/11] DVRL-61 - correcting protovalidate-es name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f48f00b..3f002ee 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Protovalidate isn't just for Python! You might be interested in sibling reposito - [`protovalidate-go`][pv-go] (Go) - [`protovalidate-java`][pv-java] (Java) - [`protovalidate-cc`][pv-cc] (C++) -- `protovalidate-ts` (TypeScript, coming soon!) +- `protovalidate-es` (TypeScript and JavaScript, coming soon!) Additionally, [protovalidate's core repository](https://github.com/bufbuild/protovalidate) provides: From d9aa18ac804e1ba0237264a7c7c75d3cf5a34d66 Mon Sep 17 00:00:00 2001 From: joerinehart Date: Thu, 3 Apr 2025 08:44:21 -0400 Subject: [PATCH 10/11] DVRL-61 - removing stale reference to examples --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index c8b792a..abab8c1 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,6 @@ Protovalidate isn't just for Python! You might be interested in sibling reposito Additionally, [protovalidate's core repository](https://github.com/bufbuild/protovalidate) provides: - [Protovalidate's Protobuf API][validate-proto] -- [Example][examples] `.proto` files using `protovalidate` - [Conformance testing utilities][conformance] for acceptance testing of `protovalidate` implementations ## Contribution From 75fa82d65824ee519bac5ea46b24101197ec76c0 Mon Sep 17 00:00:00 2001 From: joerinehart Date: Thu, 3 Apr 2025 15:03:51 -0400 Subject: [PATCH 11/11] DVRL-61 - updating links to docs --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index abab8c1..744853f 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ except protovalidate.ValidationError as e: ## Installation > [!TIP] -> The easiest way to get started with Protovalidate for RPC APIs are the how-to's in Buf's documentation. There's one available for [Python and gRPC][grpc-python]. +> The easiest way to get started with Protovalidate for RPC APIs are the quickstarts in Buf's documentation. There's one available for [Python and gRPC][grpc-python]. To install the package, use `pip`: @@ -64,7 +64,7 @@ Comprehensive documentation for Protovalidate is available in [Buf's documentati Highlights for Python developers include: * The [developer quickstart][quickstart] -* A comprehensive RPC how-to for [Python and gRPC][grpc-python] +* A comprehensive RPC quickstart for [Python and gRPC][grpc-python] * A [migration guide for protoc-gen-validate][migration-guide] users ## Additional Languages and Repositories @@ -111,12 +111,12 @@ Offered under the [Apache 2 license][license]. [protoc-gen-validate]: https://github.com/bufbuild/protoc-gen-validate -[protovalidate]: https://buf.build/docs/protovalidate/overview/ +[protovalidate]: https://buf.build/docs/protovalidate [quickstart]: https://buf.build/docs/protovalidate/quickstart/ -[connect-go]: https://buf.build/docs/protovalidate/how-to/connect-go/ -[grpc-go]: https://buf.build/docs/protovalidate/how-to/grpc-go/ -[grpc-java]: https://buf.build/docs/protovalidate/how-to/grpc-java/ -[grpc-python]: https://buf.build/docs/protovalidate/how-to/grpc-python/ +[connect-go]: https://buf.build/docs/protovalidate/quickstart/connect-go/ +[grpc-go]: https://buf.build/docs/protovalidate/quickstart/grpc-go/ +[grpc-java]: https://buf.build/docs/protovalidate/quickstart/grpc-java/ +[grpc-python]: https://buf.build/docs/protovalidate/quickstart/grpc-python/ [migration-guide]: https://buf.build/docs/migration-guides/migrate-from-protoc-gen-validate/ [conformance-executable]: ./internal/cmd/protovalidate-conformance-go/README.md [pkg-go]: https://pkg.go.dev/github.com/bufbuild/protovalidate-go