From a1354e9ce0342eadd16ac5a916d58642e8c4dec5 Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Sat, 19 Feb 2022 09:22:31 -0500 Subject: [PATCH 01/12] L96: Python: Setuptools entrypoint for generating file --- L96-python-setuptools-plugin.md | 107 ++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 L96-python-setuptools-plugin.md diff --git a/L96-python-setuptools-plugin.md b/L96-python-setuptools-plugin.md new file mode 100644 index 000000000..d6fc054e6 --- /dev/null +++ b/L96-python-setuptools-plugin.md @@ -0,0 +1,107 @@ +Setuptools entrypoint for generating file +---- +* Author(s): Patrick Lannigan +* Approver: a11r +* Status: Draft +* Implemented in: Python +* Last updated: 2022-02-18 +* Discussion at: (filled after thread exists) + +## Abstract + +Implement a `setuptools` entrypoint for generating files when a Python distribution is being built. +This type of integration would be called automatically by `setuptools` and would not require and +explicit call by the project to generate the files. The entrypoint would be configured using an +established python project configuration file and would only require the `grpc-tools` package to be +listed as a build time dependency. + +## Background + +Currently `grpc_tools` [provides a command][grpc_command] for integrating with `setuptools`. However, +this requires custom integration on the part of the package (example: +[grpc_health_checking][grpc_command_example_integration] and +[explicitly calling the command][grpc_command_example_call] when building the wheel). + +With the introduction of [PEP 517][pep_517] and [PEP 518][pep_518], directly calling `setup.py` will +start becoming less common. Additionally, the use of custom commands will not work with projects that +use this mechanism and solely rely on [setup.cfg][declarative_config]. + +Custom commands are not the only integration point that is available. `setuptools` also supports +entrypoints that allows for packages to act as a plugin and provide custom behavior. This is +[documented with examples][setuptools_entrypoint] of generating files based on revision control +information. This could be used to generate source files based on `.proto` files. + +[Original Feature Request][original_feature_request] + +## Proposal + +Add an entrypoint to `grpc-tools` that would register as a `file_finer` hook with `setuptools`. To +simplify the implementation without introducing an additional code path, the entrypoint will target +the same `main()` function used by the `grpc_tools.protoc` CLI. A [tool table][tool_table] within the +file `pyproject.toml` will be used to accept configuration parameters. This will add a dependency on +tomli for now, but this will [likely not be needed][pep_680] in future versions of Python. + +In order to prevent unintended behavior, the first thing the functionality will do is check the +configuration file to see if the section has been configured. If the file does not exist or the section +is not configured, no additional steps will be taken. `setuptools` will be provided with an empty +list to indicate that there are no additional files to include in the distribution. + +## Rationale + +A downside of this proposal is that it will introduce yet another way to get the Python modules that +correspond to the proto files. + +The primary way generate the Python files is using the +[`grpc_tools.protoc` command line interface][protoc_cli]. The advantage of this mechanism of this +method is also its disadvantage. It is a completely standalone way to generate the source code for +the python modules. While projects are allowed to decide how to work this generated files in the way +that best suits the project, there is no integration point. This means the project **must** decide +how and when this command is executed, likely needing to write a script to execute this CLI. + +For projects that use `setuptools` to publish a package, `grpc-tools` includes a +[custom command][grpc_command]. However, it also requires a specific call like the `grpc_tools.protoc` +CLI and is not compatible with installing from a source distribution for projects that declare +`setuptools` as build system that should be used. Additionally, one of the top result for "grpc +setuptools command" is [this post][setuptools_gen_question], which suggests a custom command that +doesn't rely on the one provided by `grpc-tools`. This suggest that there is a desire for functionality +that doesn't require a specific all and that the existing functionality is under-documented. + +gRPC also provides a way to get the Python [classes at runtime][runtime_classes] +([Proposal][runtime_proposal]). However, it is still [marked as experimental][runtime_api] almost 2 +years later and requires `grpc-tools` to be available at runtime. Similar to the current `setuptools` +integration, it is not mentioned in the basic tutorial documentation. + +## Implementation + +- [ ] Proof of Concept with hard coded values. +- [ ] Configuration file parsing & mapping to CLI arguments. + +Could be done later: + +- [ ] Migrate existing `grpc*` packages to use this functionality. + +I am planning work on it. I will be able to spend a few hours of each work week on this effort. + +## Open issues (if applicable) + +- Looking at the implementation of the [custom command][grpc_command], it looks as though only a + sub-set of the CLI arguments supported by `grpc_tools.protoc` need to be supported. I believe this + will become more clear after starting on the implementation. However, there could always be an + "additional arguments" type parameter to cover this if a project has a specific need. This would + also allow for CLI arguments to be passed to any gRPC plugins that might be used by a project. + +[grpc_command]: https://github.com/grpc/grpc/blob/05e17e92390d4685f1418f535604a201a7f8e1a3/tools/distrib/python/grpcio_tools/grpc_tools/command.py#L50 +[grpc_command_example_integration]: https://github.com/grpc/grpc/blob/2d4f3c56001cd1e1f85734b2f7c5ce5f2797c38a/src/python/grpcio_health_checking/health_commands.py#L48 +[grpc_command_example_call]: https://github.com/grpc/grpc/blob/2d4f3c56001cd1e1f85734b2f7c5ce5f2797c38a/tools/run_tests/artifacts/build_artifact_python.sh#L196-L197 +[pep_517]: https://www.python.org/dev/peps/pep-0517/ +[pep_518]: https://www.python.org/dev/peps/pep-0518/ +[declarative_config]: https://setuptools.pypa.io/en/latest/userguide/declarative_config.html +[setuptools_entrypoint]: https://setuptools.pypa.io/en/latest/userguide/extension.html#adding-support-for-revision-control-systems +[original_feature_request]: https://github.com/grpc/grpc/issues/28662 +[tool_table]: https://www.python.org/dev/peps/pep-0518/#tool-table +[pep_680]: https://www.python.org/dev/peps/pep-0680/ +[protoc_cli]: https://grpc.io/docs/languages/python/basics/#generating-client-and-server-code +[setuptools_gen_question]: https://stackoverflow.com/q/52994857 +[runtime_classes]: https://github.com/grpc/grpc/blob/a72c8ebb7def13a317a1afc7c08455388d1fa2e4/src/python/grpcio/grpc/_runtime_protos.py#L1 +[runtime_proposal]: ./L64-python-runtime-proto-parsing.md +[runtime_api]: https://grpc.github.io/grpc/python/grpc.html#runtime-protobuf-parsing From 00e2e27eb90f9bb807bf4c39a826e54b03645311 Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 25 Feb 2022 09:35:28 -0500 Subject: [PATCH 02/12] Update text because tomllib pep was accepted --- L96-python-setuptools-plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/L96-python-setuptools-plugin.md b/L96-python-setuptools-plugin.md index d6fc054e6..154e266fe 100644 --- a/L96-python-setuptools-plugin.md +++ b/L96-python-setuptools-plugin.md @@ -39,7 +39,7 @@ Add an entrypoint to `grpc-tools` that would register as a `file_finer` hook wit simplify the implementation without introducing an additional code path, the entrypoint will target the same `main()` function used by the `grpc_tools.protoc` CLI. A [tool table][tool_table] within the file `pyproject.toml` will be used to accept configuration parameters. This will add a dependency on -tomli for now, but this will [likely not be needed][pep_680] in future versions of Python. +tomli for now, but this will [not be needed][pep_680] starting in Python 3.11. In order to prevent unintended behavior, the first thing the functionality will do is check the configuration file to see if the section has been configured. If the file does not exist or the section From 338de2ee253829231918803a354d8f83937cb669 Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 11 Mar 2022 10:09:36 -0500 Subject: [PATCH 03/12] Add approvers --- L96-python-setuptools-plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/L96-python-setuptools-plugin.md b/L96-python-setuptools-plugin.md index 154e266fe..63d9f9b71 100644 --- a/L96-python-setuptools-plugin.md +++ b/L96-python-setuptools-plugin.md @@ -1,7 +1,7 @@ Setuptools entrypoint for generating file ---- * Author(s): Patrick Lannigan -* Approver: a11r +* Approver: lidizheng and gnossen * Status: Draft * Implemented in: Python * Last updated: 2022-02-18 From a14885b680796f457d338dc9f7580ac608f06f73 Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 11 Mar 2022 10:32:36 -0500 Subject: [PATCH 04/12] Add discussion link --- L96-python-setuptools-plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/L96-python-setuptools-plugin.md b/L96-python-setuptools-plugin.md index 63d9f9b71..8491b7923 100644 --- a/L96-python-setuptools-plugin.md +++ b/L96-python-setuptools-plugin.md @@ -5,7 +5,7 @@ Setuptools entrypoint for generating file * Status: Draft * Implemented in: Python * Last updated: 2022-02-18 -* Discussion at: (filled after thread exists) +* Discussion at: https://groups.google.com/g/grpc-io/c/H617sSzoV-8 ## Abstract From 3d2e845d85f4368352a674bf2d38db187dfa45eb Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 11 Mar 2022 10:35:51 -0500 Subject: [PATCH 05/12] Correct name of package --- L96-python-setuptools-plugin.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/L96-python-setuptools-plugin.md b/L96-python-setuptools-plugin.md index 8491b7923..a49ff2877 100644 --- a/L96-python-setuptools-plugin.md +++ b/L96-python-setuptools-plugin.md @@ -12,7 +12,7 @@ Setuptools entrypoint for generating file Implement a `setuptools` entrypoint for generating files when a Python distribution is being built. This type of integration would be called automatically by `setuptools` and would not require and explicit call by the project to generate the files. The entrypoint would be configured using an -established python project configuration file and would only require the `grpc-tools` package to be +established python project configuration file and would only require the `grpcio-tools` package to be listed as a build time dependency. ## Background @@ -35,7 +35,7 @@ information. This could be used to generate source files based on `.proto` files ## Proposal -Add an entrypoint to `grpc-tools` that would register as a `file_finer` hook with `setuptools`. To +Add an entrypoint to `grpcio-tools` that would register as a `file_finer` hook with `setuptools`. To simplify the implementation without introducing an additional code path, the entrypoint will target the same `main()` function used by the `grpc_tools.protoc` CLI. A [tool table][tool_table] within the file `pyproject.toml` will be used to accept configuration parameters. This will add a dependency on @@ -58,17 +58,17 @@ the python modules. While projects are allowed to decide how to work this genera that best suits the project, there is no integration point. This means the project **must** decide how and when this command is executed, likely needing to write a script to execute this CLI. -For projects that use `setuptools` to publish a package, `grpc-tools` includes a +For projects that use `setuptools` to publish a package, `grpcio-tools` includes a [custom command][grpc_command]. However, it also requires a specific call like the `grpc_tools.protoc` CLI and is not compatible with installing from a source distribution for projects that declare `setuptools` as build system that should be used. Additionally, one of the top result for "grpc setuptools command" is [this post][setuptools_gen_question], which suggests a custom command that -doesn't rely on the one provided by `grpc-tools`. This suggest that there is a desire for functionality +doesn't rely on the one provided by `grpcio-tools`. This suggest that there is a desire for functionality that doesn't require a specific all and that the existing functionality is under-documented. gRPC also provides a way to get the Python [classes at runtime][runtime_classes] ([Proposal][runtime_proposal]). However, it is still [marked as experimental][runtime_api] almost 2 -years later and requires `grpc-tools` to be available at runtime. Similar to the current `setuptools` +years later and requires `grpcio-tools` to be available at runtime. Similar to the current `setuptools` integration, it is not mentioned in the basic tutorial documentation. ## Implementation From ccfb5a5e5dd62c852f3eaead99f69eb1ab8f3f2e Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 11 Mar 2022 10:57:21 -0500 Subject: [PATCH 06/12] Re-number propsal --- ...thon-setuptools-plugin.md => L97-python-setuptools-plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename L96-python-setuptools-plugin.md => L97-python-setuptools-plugin.md (99%) diff --git a/L96-python-setuptools-plugin.md b/L97-python-setuptools-plugin.md similarity index 99% rename from L96-python-setuptools-plugin.md rename to L97-python-setuptools-plugin.md index a49ff2877..86e7be266 100644 --- a/L96-python-setuptools-plugin.md +++ b/L97-python-setuptools-plugin.md @@ -1,4 +1,4 @@ -Setuptools entrypoint for generating file +L97 - Python: Setuptools entrypoint for generating file ---- * Author(s): Patrick Lannigan * Approver: lidizheng and gnossen From 83113cc609c73dc39608b47c2fb8aa0f43a7258f Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 11 Mar 2022 14:29:48 -0500 Subject: [PATCH 07/12] Clarify declaritive config --- L97-python-setuptools-plugin.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/L97-python-setuptools-plugin.md b/L97-python-setuptools-plugin.md index 86e7be266..30422329f 100644 --- a/L97-python-setuptools-plugin.md +++ b/L97-python-setuptools-plugin.md @@ -24,7 +24,9 @@ this requires custom integration on the part of the package (example: With the introduction of [PEP 517][pep_517] and [PEP 518][pep_518], directly calling `setup.py` will start becoming less common. Additionally, the use of custom commands will not work with projects that -use this mechanism and solely rely on [setup.cfg][declarative_config]. +use this mechanism and solely rely on the [declarative config in `setup.cfg`][declarative_config], +which was added to `setuptools` in [v30.3.0][release_declarative_config] (Dec. 2016). Though, use of +the functionality defined in this proposal does not require a project to use the declarative config. Custom commands are not the only integration point that is available. `setuptools` also supports entrypoints that allows for packages to act as a plugin and provide custom behavior. This is @@ -96,6 +98,7 @@ I am planning work on it. I will be able to spend a few hours of each work week [pep_517]: https://www.python.org/dev/peps/pep-0517/ [pep_518]: https://www.python.org/dev/peps/pep-0518/ [declarative_config]: https://setuptools.pypa.io/en/latest/userguide/declarative_config.html +[release_declarative_config]: https://setuptools.pypa.io/en/latest/history.html#v30-3-0 [setuptools_entrypoint]: https://setuptools.pypa.io/en/latest/userguide/extension.html#adding-support-for-revision-control-systems [original_feature_request]: https://github.com/grpc/grpc/issues/28662 [tool_table]: https://www.python.org/dev/peps/pep-0518/#tool-table From 46446fc10a8e1c2b396c3944c09b84ed57561dd3 Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 11 Mar 2022 14:30:20 -0500 Subject: [PATCH 08/12] Correct spelling --- L97-python-setuptools-plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/L97-python-setuptools-plugin.md b/L97-python-setuptools-plugin.md index 30422329f..5b333b3da 100644 --- a/L97-python-setuptools-plugin.md +++ b/L97-python-setuptools-plugin.md @@ -37,7 +37,7 @@ information. This could be used to generate source files based on `.proto` files ## Proposal -Add an entrypoint to `grpcio-tools` that would register as a `file_finer` hook with `setuptools`. To +Add an entrypoint to `grpcio-tools` that would register as a `file_finder` hook with `setuptools`. To simplify the implementation without introducing an additional code path, the entrypoint will target the same `main()` function used by the `grpc_tools.protoc` CLI. A [tool table][tool_table] within the file `pyproject.toml` will be used to accept configuration parameters. This will add a dependency on From c91a6758c94e40dc6c4354d19b48a781e5b09c8f Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 11 Mar 2022 15:25:56 -0500 Subject: [PATCH 09/12] Restructor proposal into sub-sections Add some more specifics on how the end user would enable to functionality --- L97-python-setuptools-plugin.md | 57 +++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/L97-python-setuptools-plugin.md b/L97-python-setuptools-plugin.md index 5b333b3da..128f8d4af 100644 --- a/L97-python-setuptools-plugin.md +++ b/L97-python-setuptools-plugin.md @@ -37,16 +37,54 @@ information. This could be used to generate source files based on `.proto` files ## Proposal -Add an entrypoint to `grpcio-tools` that would register as a `file_finder` hook with `setuptools`. To -simplify the implementation without introducing an additional code path, the entrypoint will target -the same `main()` function used by the `grpc_tools.protoc` CLI. A [tool table][tool_table] within the -file `pyproject.toml` will be used to accept configuration parameters. This will add a dependency on -tomli for now, but this will [not be needed][pep_680] starting in Python 3.11. +`grpcio-tools` will register a new entrypoint function to respond to the `setuptools.file_finders` +hook. This hook will generate Python files based on the `.proto` files and tell `setuptools where +they were generated. -In order to prevent unintended behavior, the first thing the functionality will do is check the -configuration file to see if the section has been configured. If the file does not exist or the section -is not configured, no additional steps will be taken. `setuptools` will be provided with an empty -list to indicate that there are no additional files to include in the distribution. +### Configuration + +This functionality will use a [tool table][tool_table] in `pyproject.toml` named `tool.grpcio-tools` +to accept configuration parameters. + +__TODO__: List configuration parameters and how they would be used. If anything is required, add it to +the list in "How would a project use this feature". + +### Functional Implementation + +Add an entrypoint function to `grpcio-tools` that would register as a `file_finder` hook with +`setuptools`. To simplify the implementation without introducing an additional code path, the +entrypoint will target the same `main()` function used by the `grpc_tools.protoc` CLI. + +In order to prevent unintended behavior, the first thing the function will do is check the +configuration file to see if the section has been configured (See [Configuration](#configuration)). If +the file does not exist or the section is not configured, no additional steps will be taken. The +function will return an empty list back to `setuptools` to indicate that there are no additional files +to include in the distribution. + +Starting with Python 3.11, the configuration file will be readable using a +[standard library module][pep_680]. For earlier Python versions, `tomli` will be added as an optional +dependency. + +### How would a project use this feature + +A project that would like to use this `setuptools` integration would need to perform two actions to +enable the functionality. + +* List `grpcio-tools` as a [build time dependency][build_dependency]. This will ensure that the library + is installed when the project's package is built. +* Add a `tool.grpcio-tools` table to the file `pyproject.toml`. + +Minimal example for a project using [PEP 518][pep_518]: + +pyproject.toml +```toml +[build-system] +requires = ["setuptools", "wheel", "grpcio-tools >= X.Y.Z"] +build-backend = "setuptools.build_meta" + +[tool.grpcio-tools] +example_parameter = "CHANGE ME" # This is a place holder until the configuration parameters are defined +``` ## Rationale @@ -101,6 +139,7 @@ I am planning work on it. I will be able to spend a few hours of each work week [release_declarative_config]: https://setuptools.pypa.io/en/latest/history.html#v30-3-0 [setuptools_entrypoint]: https://setuptools.pypa.io/en/latest/userguide/extension.html#adding-support-for-revision-control-systems [original_feature_request]: https://github.com/grpc/grpc/issues/28662 +[build_dependency]: https://setuptools.pypa.io/en/latest/userguide/dependency_management.html?highlight=setup_requires#build-system-requirement [tool_table]: https://www.python.org/dev/peps/pep-0518/#tool-table [pep_680]: https://www.python.org/dev/peps/pep-0680/ [protoc_cli]: https://grpc.io/docs/languages/python/basics/#generating-client-and-server-code From 7f1681ab261e8c6425540942e8a45cd4599c7cb9 Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 11 Mar 2022 15:29:15 -0500 Subject: [PATCH 10/12] Add documentation to the todo list --- L97-python-setuptools-plugin.md | 1 + 1 file changed, 1 insertion(+) diff --git a/L97-python-setuptools-plugin.md b/L97-python-setuptools-plugin.md index 128f8d4af..7a87edae5 100644 --- a/L97-python-setuptools-plugin.md +++ b/L97-python-setuptools-plugin.md @@ -115,6 +115,7 @@ integration, it is not mentioned in the basic tutorial documentation. - [ ] Proof of Concept with hard coded values. - [ ] Configuration file parsing & mapping to CLI arguments. +- [ ] Document feature and how projects would use it. Could be done later: From 130004175334482e70a375b3117538df328f4b2f Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Fri, 11 Mar 2022 15:45:08 -0500 Subject: [PATCH 11/12] Example using setup.py --- L97-python-setuptools-plugin.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/L97-python-setuptools-plugin.md b/L97-python-setuptools-plugin.md index 7a87edae5..6fd1d227f 100644 --- a/L97-python-setuptools-plugin.md +++ b/L97-python-setuptools-plugin.md @@ -86,6 +86,26 @@ build-backend = "setuptools.build_meta" example_parameter = "CHANGE ME" # This is a place holder until the configuration parameters are defined ``` +Minimal example for a project using `setup.py`: + +setup.py +```python +from setuptools import setup + +setup( + ..., + setup_requires=[ + 'grpcio-tools >= X.Y.Z' + ], +) +``` + +pyproject.toml +```toml +[tool.grpcio-tools] +example_parameter = "CHANGE ME" # This is a place holder until the configuration parameters are defined +``` + ## Rationale A downside of this proposal is that it will introduce yet another way to get the Python modules that From 6ec57bae3e637ba31f52c94a27199904309818fd Mon Sep 17 00:00:00 2001 From: Patrick Lannigan Date: Wed, 4 May 2022 17:59:20 -0600 Subject: [PATCH 12/12] Update proposal with draft PR --- L97-python-setuptools-plugin.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/L97-python-setuptools-plugin.md b/L97-python-setuptools-plugin.md index 6fd1d227f..a0cb011d8 100644 --- a/L97-python-setuptools-plugin.md +++ b/L97-python-setuptools-plugin.md @@ -29,17 +29,19 @@ which was added to `setuptools` in [v30.3.0][release_declarative_config] (Dec. 2 the functionality defined in this proposal does not require a project to use the declarative config. Custom commands are not the only integration point that is available. `setuptools` also supports -entrypoints that allows for packages to act as a plugin and provide custom behavior. This is -[documented with examples][setuptools_entrypoint] of generating files based on revision control -information. This could be used to generate source files based on `.proto` files. +entrypoints that allows for packages to act as a plugin and provide custom behavior. There are a few +different options for entrypoint hooks ([1][setuptools_customize], [2][setuptools_file_finder]) which +could be used to generate source files based on `.proto` files. (There is also an +[open proposal][setuptools_sub_commands] to allow for adding `build` sub-commands. Which more directly +represents what we are trying to achieve.) [Original Feature Request][original_feature_request] ## Proposal -`grpcio-tools` will register a new entrypoint function to respond to the `setuptools.file_finders` -hook. This hook will generate Python files based on the `.proto` files and tell `setuptools where -they were generated. +`grpcio-tools` will register a new entrypoint function to respond to the +`setuptools.finalize_distribution_options` hook. This hook will generate Python files based on the +`.proto` files. ### Configuration @@ -133,7 +135,9 @@ integration, it is not mentioned in the basic tutorial documentation. ## Implementation -- [ ] Proof of Concept with hard coded values. +[Pull Request][feature_pr] + +- [x] Proof of Concept with hard coded values. - [ ] Configuration file parsing & mapping to CLI arguments. - [ ] Document feature and how projects would use it. @@ -158,7 +162,9 @@ I am planning work on it. I will be able to spend a few hours of each work week [pep_518]: https://www.python.org/dev/peps/pep-0518/ [declarative_config]: https://setuptools.pypa.io/en/latest/userguide/declarative_config.html [release_declarative_config]: https://setuptools.pypa.io/en/latest/history.html#v30-3-0 -[setuptools_entrypoint]: https://setuptools.pypa.io/en/latest/userguide/extension.html#adding-support-for-revision-control-systems +[setuptools_customize]: https://setuptools.pypa.io/en/latest/userguide/extension.html#customizing-distribution-options +[setuptools_file_finder]: https://setuptools.pypa.io/en/latest/userguide/extension.html#adding-support-for-revision-control-systems +[setuptools_sub_commands]: https://github.com/pypa/setuptools/issues/2591 [original_feature_request]: https://github.com/grpc/grpc/issues/28662 [build_dependency]: https://setuptools.pypa.io/en/latest/userguide/dependency_management.html?highlight=setup_requires#build-system-requirement [tool_table]: https://www.python.org/dev/peps/pep-0518/#tool-table @@ -168,3 +174,4 @@ I am planning work on it. I will be able to spend a few hours of each work week [runtime_classes]: https://github.com/grpc/grpc/blob/a72c8ebb7def13a317a1afc7c08455388d1fa2e4/src/python/grpcio/grpc/_runtime_protos.py#L1 [runtime_proposal]: ./L64-python-runtime-proto-parsing.md [runtime_api]: https://grpc.github.io/grpc/python/grpc.html#runtime-protobuf-parsing +[feature_pr]: https://github.com/grpc/grpc/pull/29541 \ No newline at end of file