diff options
author | shadchin <shadchin@yandex-team.ru> | 2022-02-10 16:44:30 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:44:30 +0300 |
commit | 2598ef1d0aee359b4b6d5fdd1758916d5907d04f (patch) | |
tree | 012bb94d777798f1f56ac1cec429509766d05181 /contrib/python/mypy-protobuf | |
parent | 6751af0b0c1b952fede40b19b71da8025b5d8bcf (diff) | |
download | ydb-2598ef1d0aee359b4b6d5fdd1758916d5907d04f.tar.gz |
Restoring authorship annotation for <shadchin@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/python/mypy-protobuf')
-rw-r--r-- | contrib/python/mypy-protobuf/LICENSE | 404 | ||||
-rw-r--r-- | contrib/python/mypy-protobuf/README.md | 526 | ||||
-rw-r--r-- | contrib/python/mypy-protobuf/bin/protoc-gen-mypy/bin/ya.make | 24 | ||||
-rw-r--r-- | contrib/python/mypy-protobuf/bin/protoc-gen-mypy/ya.make | 26 | ||||
-rw-r--r-- | contrib/python/mypy-protobuf/bin/ya.make | 6 | ||||
-rw-r--r-- | contrib/python/mypy-protobuf/ya.make | 50 |
6 files changed, 518 insertions, 518 deletions
diff --git a/contrib/python/mypy-protobuf/LICENSE b/contrib/python/mypy-protobuf/LICENSE index bd760ffabd..9375eba48f 100644 --- a/contrib/python/mypy-protobuf/LICENSE +++ b/contrib/python/mypy-protobuf/LICENSE @@ -1,202 +1,202 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (c) 2017 Dropbox, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2017 Dropbox, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/contrib/python/mypy-protobuf/README.md b/contrib/python/mypy-protobuf/README.md index ef79728324..9ed59bca85 100644 --- a/contrib/python/mypy-protobuf/README.md +++ b/contrib/python/mypy-protobuf/README.md @@ -1,263 +1,263 @@ -mypy-protobuf: Generate mypy stub files from protobuf specs - -[![CI](https://github.com/dropbox/mypy-protobuf/workflows/CI/badge.svg)](https://github.com/dropbox/mypy-protobuf/actions?query=branch%3Amain) -[![pypi](https://img.shields.io/pypi/v/mypy-protobuf?logo=Pypi)](https://pypi.org/project/mypy-protobuf/) -[![license](https://img.shields.io/github/license/dropbox/mypy-protobuf)](https://github.com/dropbox/mypy-protobuf/blob/main/LICENSE) -=========================================================== - -2.10 will be the last version of mypy-protobuf which supports targeting python 2.7. Next will be -mypy-protobuf 3.0 which will auspiciously only support targeting python3 - -See [Changelog](CHANGELOG.md) for recent changes. - -## Requirements to run mypy-protobuf -[protoc >= 3.17.3](https://github.com/protocolbuffers/protobuf/releases) -[python-protobuf >= 3.17.3](https://pypi.org/project/protobuf/) - matching protoc release -[python >= 3.6](https://www.python.org/downloads/source/) - for running mypy-protobuf plugin. - -## Requirements to run mypy on stubs generated by mypy-protobuf -[mypy >= v0.910](https://pypi.org/project/mypy) -[python-protobuf >= 3.17.3](https://pypi.org/project/protobuf/) - matching protoc release -[types-protobuf==3.17.3](https://pypi.org/project/types-protobuf/) - for stubs from the google.protobuf library - -### To run mypy on code generated with grpc plugin - you'll additionally need -[grpcio>=1.38.1](https://pypi.org/project/grpcio/) -[grpcio-tools>=1.38.1](https://pypi.org/project/grpcio-tools/) -[grpc-stubs>=1.24.6](https://pypi.org/project/grpc-stubs/) - -Other configurations may work, but are not supported in testing currently. We would be open to expanding this list if a need arises - file an issue on the issue tracker. - -## Installation - -The plugin can be installed with -``` -pip3 install mypy-protobuf -``` -To install unreleased -``` -REV=main # or whichever unreleased git rev you'd like -pip3 install git+https://github.com/dropbox/mypy-protobuf.git@$REV - -# For older (1.x) versions of mypy protobuf - you may need -pip3 install git+https://github.com/dropbox/mypy-protobuf.git@$REV#subdirectory=python -``` - -In order to run mypy on the generated code, you'll need to install -``` -pip3 install mypy>=0.910 types-protobuf>=0.1.14 -``` - -# Usage - -On posix, protoc-gen-mypy is installed to python's executable bin. Assuming that's -on your $PATH, you can run -``` -protoc --python_out=output/location --mypy_out=output/location -``` -Alternately, you can explicitly provide the path: -``` -protoc --plugin=protoc-gen-mypy=path/to/protoc-gen-mypy --python_out=output/location --mypy_out=output/location -``` -Check the version number with -``` -> protoc-gen-mypy --version -``` - -## Getting Help - -Find other developers in the mypy-protobuf slack workspace ([Invitation Link](https://join.slack.com/t/mypy-protobuf/shared_invite/zt-scogn8b5-MhetFnFYGi6V513aRsbe_Q)). If your company uses slack and mypy-protobuf, you may opt to use slack-connect to make a shared channel. - -## Implementation - -The implementation of the plugin is in `mypy_protobuf/main.py`, which installs to -an executable protoc-gen-mypy. On windows it installs to `protoc-gen-mypy.exe` - -## Features - -See [Changelog](CHANGELOG.md) for full listing - -### Bring comments from .proto files to docstrings in .pyi files - -Comments in the .proto files on messages, fields, enums, enum variants, extensions, services, and methods -will appear as docstrings in .pyi files. Useful in IDEs for showing completions with comments. - -### Types enum int values more strongly - -Enum int values produce stubs which wrap the int values in NewType -``` -enum MyEnum { - FOO = 0; - BAR = 1; -} -``` -Will yield an [enum type wrapper](https://github.com/python/typeshed/blob/16ae4c61201cd8b96b8b22cdfb2ab9e89ba5bcf2/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi) whose methods type to `MyEnum.V` rather than `int`. -This allows mypy to catch bugs where the wrong enum value is being used. - -mypy-protobuf autogenerates an instance of the EnumTypeWrapper as follows. - -``` -class MyEnum(_MyEnum, metaclass=_MyEnumEnumTypeWrapper): - pass -class _MyEnum: - V = typing.NewType('V', builtins.int) -class _MyEnumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_MyEnum.V], builtins.type): - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor = ... - FOO = MyEnum.V(0) - BAR = MyEnum.V(1) -FOO = MyEnum.V(0) -BAR = MyEnum.V(1) -``` - -`_MyEnumEnumTypeWrapper` extends the EnumTypeWrapper to take/return MyEnum.V rather than int -`MyEnum` is an instance of the `EnumTypeWrapper`. -- Use `_MyEnum` and of metaclass is an implementation detail to make MyEnum.V a valid type w/o a circular dependency - -Calling code may be typed as follows. - -In python >= 3.7 -``` -# Need [PEP 563](https://www.python.org/dev/peps/pep-0563/) to postpone evaluation of annotations -from __future__ import annotations # Not needed with python>=3.10 -def f(x: MyEnum.V): - print(x) -f(MyEnum.Value("FOO")) -``` - -Note that for usages of cast, the type of `x` must be quoted -until [upstream protobuf](https://github.com/protocolbuffers/protobuf/pull/8182) includes `V` -``` -cast('MyEnum.V', x) -``` - -### Supports generating type wrappers for fields and maps - -M.proto -``` -message M { - uint32 user_id = 1 [(mypy_protobuf.casttype)="mymod.UserId" - map<uint32, string> email_by_uid = 2 [ - (mypy_protobuf.keytype)="path/to/mymod.UserId", - (mypy_protobuf.valuetype)="path/to/mymod.Email" - ]; -} -``` -mymod.py -``` -UserId = NewType("UserId", int) -Email = NewType("Email", Text) -``` - -### `py_generic_services` -If `py_generic_services` is set in your proto file, then mypy-protobuf will -generate service stubs. If you want GRPC stubs instead - use the GRPC instructions. - -### `readable_stubs` -If `readable_stubs` is set, mypy-protobuf will generate easier-to-read stubs. The downside -to this approach - is that it's possible to generate stubs which do not pass mypy - particularly -in the case of name collisions. mypy-protobuf defaults to generating stubs with fully qualified -imports and mangled global-level identifiers to defend against name collisions between global -identifiers and field names. - -If you're ok with this risk, try it out! -``` -protoc --python_out=output/location --mypy_out=readable_stubs:output/location -``` - -### `relax_strict_optional_primitives` - -If you are using proto3, then primitives cannot be represented as NULL on the wire - -only as their zero value. By default mypy-protobuf types message constructors to have -non-nullable primitives (eg `int` instead of `Optional[int]`). python-protobuf itself will -internally convert None -> zero value. If you intentionally want to use this behavior, -set this flag! We recommend avoiding this, as it can lead to developer error - confusing -NULL and 0 as distinct on the wire. -However, it may be helpful when migrating existing proto2 code, where the distinction is meaningful - -``` -protoc --python_out=output/location --mypy_out=relax_strict_optional_primitives:output/location -``` - -### Output suppression -To suppress output, you can run -``` -protoc --python_out=output/location --mypy_out=quiet:output/location -``` - -### GRPC - -This plugin provides stubs generation for grpcio generated code. -``` -protoc \ - --python_out=output/location \ - --mypy_out=output/location \ - --grpc_out=output/location \ - --mypy_grpc_out=output/location -``` - -Note that generated code for grpc will work only together with code for python and locations should be the same. -If you need stubs for grpc internal code we suggest using this package https://github.com/shabbyrobe/grpc-stubs - -### Targeting python2 support - -mypy-protobuf's drops support for targeting python2 with version 3.0. If you still need python2 support - -``` -python3 -m pip install mypy_protobuf==2.10 -protoc --python_out=output/location --mypy_out=output/location -mypy --target-version=2.7 {files} -``` - - -## Contributing -Contributions to the implementation are welcome. Please run tests using `./run_test.sh`. -Ensure code is formatted using black. -``` -pip3 install black -black . -``` - -## Contributors - -### Dropboxers -- [@nipunn1313](https://github.com/nipunn1313) -- [@dzbarsky](https://github.com/dzbarsky) -- [@gvanrossum](https://github.com/gvanrossum) -- [@peterlvilim](https://github.com/peterlvilim) -- [@msullivan](https://github.com/msullivan) -- [@bradenaw](https://github.com/bradenaw) -- [@ilevkivskyi](https://github.com/ilevkivskyi) - -### Others -- [@Ketouem](https://github.com/Ketouem) -- [@nmiculinic](https://github.com/nmiculinic) -- [@onto](https://github.com/onto) -- [@jcppkkk](https://github.com/jcppkkk) -- [@drather19](https://github.com/drather19) -- [@smessmer](https://github.com/smessmer) -- [@pcorpet](https://github.com/pcorpet) -- [@zozoens31](https://github.com/zozoens31) -- [@abhishekrb19](https://github.com/abhishekrb19) -- [@jaens](https://github.com/jaens) -- [@arussellsaw](https://github.com/arussellsaw) -- [@shabbyrobe](https://github.com/shabbyrobe) -- [@reorx](https://github.com/reorx) -- [@zifter](https://github.com/zifter) -- [@juzna](https://github.com/juzna) -- [@mikolajz](https://github.com/mikolajz) -- [@chadrik](https://github.com/chadrik) -- [@EPronovost](https://github.com/EPronovost) -- [@chrislawlor](https://github.com/chrislawlor) -- [@henribru](https://github.com/henribru) -- [@Evgenus](https://github.com/Evgenus) -- [@MHDante](https://github.com/MHDante) -- [@nelfin](https://github.com/nelfin) -- [@alkasm](https://github.com/alkasm) -- [@tarmath](https://github.com/tarmath) - -Licence etc. ------------- - -1. License: Apache 2.0. -2. Copyright attribution: Copyright (c) 2017 Dropbox, Inc. -3. External contributions to the project should be subject to - Dropbox's Contributor License Agreement (CLA): - https://opensource.dropbox.com/cla/ +mypy-protobuf: Generate mypy stub files from protobuf specs + +[![CI](https://github.com/dropbox/mypy-protobuf/workflows/CI/badge.svg)](https://github.com/dropbox/mypy-protobuf/actions?query=branch%3Amain) +[![pypi](https://img.shields.io/pypi/v/mypy-protobuf?logo=Pypi)](https://pypi.org/project/mypy-protobuf/) +[![license](https://img.shields.io/github/license/dropbox/mypy-protobuf)](https://github.com/dropbox/mypy-protobuf/blob/main/LICENSE) +=========================================================== + +2.10 will be the last version of mypy-protobuf which supports targeting python 2.7. Next will be +mypy-protobuf 3.0 which will auspiciously only support targeting python3 + +See [Changelog](CHANGELOG.md) for recent changes. + +## Requirements to run mypy-protobuf +[protoc >= 3.17.3](https://github.com/protocolbuffers/protobuf/releases) +[python-protobuf >= 3.17.3](https://pypi.org/project/protobuf/) - matching protoc release +[python >= 3.6](https://www.python.org/downloads/source/) - for running mypy-protobuf plugin. + +## Requirements to run mypy on stubs generated by mypy-protobuf +[mypy >= v0.910](https://pypi.org/project/mypy) +[python-protobuf >= 3.17.3](https://pypi.org/project/protobuf/) - matching protoc release +[types-protobuf==3.17.3](https://pypi.org/project/types-protobuf/) - for stubs from the google.protobuf library + +### To run mypy on code generated with grpc plugin - you'll additionally need +[grpcio>=1.38.1](https://pypi.org/project/grpcio/) +[grpcio-tools>=1.38.1](https://pypi.org/project/grpcio-tools/) +[grpc-stubs>=1.24.6](https://pypi.org/project/grpc-stubs/) + +Other configurations may work, but are not supported in testing currently. We would be open to expanding this list if a need arises - file an issue on the issue tracker. + +## Installation + +The plugin can be installed with +``` +pip3 install mypy-protobuf +``` +To install unreleased +``` +REV=main # or whichever unreleased git rev you'd like +pip3 install git+https://github.com/dropbox/mypy-protobuf.git@$REV + +# For older (1.x) versions of mypy protobuf - you may need +pip3 install git+https://github.com/dropbox/mypy-protobuf.git@$REV#subdirectory=python +``` + +In order to run mypy on the generated code, you'll need to install +``` +pip3 install mypy>=0.910 types-protobuf>=0.1.14 +``` + +# Usage + +On posix, protoc-gen-mypy is installed to python's executable bin. Assuming that's +on your $PATH, you can run +``` +protoc --python_out=output/location --mypy_out=output/location +``` +Alternately, you can explicitly provide the path: +``` +protoc --plugin=protoc-gen-mypy=path/to/protoc-gen-mypy --python_out=output/location --mypy_out=output/location +``` +Check the version number with +``` +> protoc-gen-mypy --version +``` + +## Getting Help + +Find other developers in the mypy-protobuf slack workspace ([Invitation Link](https://join.slack.com/t/mypy-protobuf/shared_invite/zt-scogn8b5-MhetFnFYGi6V513aRsbe_Q)). If your company uses slack and mypy-protobuf, you may opt to use slack-connect to make a shared channel. + +## Implementation + +The implementation of the plugin is in `mypy_protobuf/main.py`, which installs to +an executable protoc-gen-mypy. On windows it installs to `protoc-gen-mypy.exe` + +## Features + +See [Changelog](CHANGELOG.md) for full listing + +### Bring comments from .proto files to docstrings in .pyi files + +Comments in the .proto files on messages, fields, enums, enum variants, extensions, services, and methods +will appear as docstrings in .pyi files. Useful in IDEs for showing completions with comments. + +### Types enum int values more strongly + +Enum int values produce stubs which wrap the int values in NewType +``` +enum MyEnum { + FOO = 0; + BAR = 1; +} +``` +Will yield an [enum type wrapper](https://github.com/python/typeshed/blob/16ae4c61201cd8b96b8b22cdfb2ab9e89ba5bcf2/stubs/protobuf/google/protobuf/internal/enum_type_wrapper.pyi) whose methods type to `MyEnum.V` rather than `int`. +This allows mypy to catch bugs where the wrong enum value is being used. + +mypy-protobuf autogenerates an instance of the EnumTypeWrapper as follows. + +``` +class MyEnum(_MyEnum, metaclass=_MyEnumEnumTypeWrapper): + pass +class _MyEnum: + V = typing.NewType('V', builtins.int) +class _MyEnumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_MyEnum.V], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor = ... + FOO = MyEnum.V(0) + BAR = MyEnum.V(1) +FOO = MyEnum.V(0) +BAR = MyEnum.V(1) +``` + +`_MyEnumEnumTypeWrapper` extends the EnumTypeWrapper to take/return MyEnum.V rather than int +`MyEnum` is an instance of the `EnumTypeWrapper`. +- Use `_MyEnum` and of metaclass is an implementation detail to make MyEnum.V a valid type w/o a circular dependency + +Calling code may be typed as follows. + +In python >= 3.7 +``` +# Need [PEP 563](https://www.python.org/dev/peps/pep-0563/) to postpone evaluation of annotations +from __future__ import annotations # Not needed with python>=3.10 +def f(x: MyEnum.V): + print(x) +f(MyEnum.Value("FOO")) +``` + +Note that for usages of cast, the type of `x` must be quoted +until [upstream protobuf](https://github.com/protocolbuffers/protobuf/pull/8182) includes `V` +``` +cast('MyEnum.V', x) +``` + +### Supports generating type wrappers for fields and maps + +M.proto +``` +message M { + uint32 user_id = 1 [(mypy_protobuf.casttype)="mymod.UserId" + map<uint32, string> email_by_uid = 2 [ + (mypy_protobuf.keytype)="path/to/mymod.UserId", + (mypy_protobuf.valuetype)="path/to/mymod.Email" + ]; +} +``` +mymod.py +``` +UserId = NewType("UserId", int) +Email = NewType("Email", Text) +``` + +### `py_generic_services` +If `py_generic_services` is set in your proto file, then mypy-protobuf will +generate service stubs. If you want GRPC stubs instead - use the GRPC instructions. + +### `readable_stubs` +If `readable_stubs` is set, mypy-protobuf will generate easier-to-read stubs. The downside +to this approach - is that it's possible to generate stubs which do not pass mypy - particularly +in the case of name collisions. mypy-protobuf defaults to generating stubs with fully qualified +imports and mangled global-level identifiers to defend against name collisions between global +identifiers and field names. + +If you're ok with this risk, try it out! +``` +protoc --python_out=output/location --mypy_out=readable_stubs:output/location +``` + +### `relax_strict_optional_primitives` + +If you are using proto3, then primitives cannot be represented as NULL on the wire - +only as their zero value. By default mypy-protobuf types message constructors to have +non-nullable primitives (eg `int` instead of `Optional[int]`). python-protobuf itself will +internally convert None -> zero value. If you intentionally want to use this behavior, +set this flag! We recommend avoiding this, as it can lead to developer error - confusing +NULL and 0 as distinct on the wire. +However, it may be helpful when migrating existing proto2 code, where the distinction is meaningful + +``` +protoc --python_out=output/location --mypy_out=relax_strict_optional_primitives:output/location +``` + +### Output suppression +To suppress output, you can run +``` +protoc --python_out=output/location --mypy_out=quiet:output/location +``` + +### GRPC + +This plugin provides stubs generation for grpcio generated code. +``` +protoc \ + --python_out=output/location \ + --mypy_out=output/location \ + --grpc_out=output/location \ + --mypy_grpc_out=output/location +``` + +Note that generated code for grpc will work only together with code for python and locations should be the same. +If you need stubs for grpc internal code we suggest using this package https://github.com/shabbyrobe/grpc-stubs + +### Targeting python2 support + +mypy-protobuf's drops support for targeting python2 with version 3.0. If you still need python2 support - +``` +python3 -m pip install mypy_protobuf==2.10 +protoc --python_out=output/location --mypy_out=output/location +mypy --target-version=2.7 {files} +``` + + +## Contributing +Contributions to the implementation are welcome. Please run tests using `./run_test.sh`. +Ensure code is formatted using black. +``` +pip3 install black +black . +``` + +## Contributors + +### Dropboxers +- [@nipunn1313](https://github.com/nipunn1313) +- [@dzbarsky](https://github.com/dzbarsky) +- [@gvanrossum](https://github.com/gvanrossum) +- [@peterlvilim](https://github.com/peterlvilim) +- [@msullivan](https://github.com/msullivan) +- [@bradenaw](https://github.com/bradenaw) +- [@ilevkivskyi](https://github.com/ilevkivskyi) + +### Others +- [@Ketouem](https://github.com/Ketouem) +- [@nmiculinic](https://github.com/nmiculinic) +- [@onto](https://github.com/onto) +- [@jcppkkk](https://github.com/jcppkkk) +- [@drather19](https://github.com/drather19) +- [@smessmer](https://github.com/smessmer) +- [@pcorpet](https://github.com/pcorpet) +- [@zozoens31](https://github.com/zozoens31) +- [@abhishekrb19](https://github.com/abhishekrb19) +- [@jaens](https://github.com/jaens) +- [@arussellsaw](https://github.com/arussellsaw) +- [@shabbyrobe](https://github.com/shabbyrobe) +- [@reorx](https://github.com/reorx) +- [@zifter](https://github.com/zifter) +- [@juzna](https://github.com/juzna) +- [@mikolajz](https://github.com/mikolajz) +- [@chadrik](https://github.com/chadrik) +- [@EPronovost](https://github.com/EPronovost) +- [@chrislawlor](https://github.com/chrislawlor) +- [@henribru](https://github.com/henribru) +- [@Evgenus](https://github.com/Evgenus) +- [@MHDante](https://github.com/MHDante) +- [@nelfin](https://github.com/nelfin) +- [@alkasm](https://github.com/alkasm) +- [@tarmath](https://github.com/tarmath) + +Licence etc. +------------ + +1. License: Apache 2.0. +2. Copyright attribution: Copyright (c) 2017 Dropbox, Inc. +3. External contributions to the project should be subject to + Dropbox's Contributor License Agreement (CLA): + https://opensource.dropbox.com/cla/ diff --git a/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/bin/ya.make b/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/bin/ya.make index b63a9d4a51..f681773d08 100644 --- a/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/bin/ya.make +++ b/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/bin/ya.make @@ -1,13 +1,13 @@ -OWNER(torkve g:python-contrib) - +OWNER(torkve g:python-contrib) + PY3_PROGRAM_BIN(protoc-gen-mypy) - -PEERDIR( - contrib/python/mypy-protobuf -) - -PY_MAIN(mypy_protobuf.main:main) - -NO_LINT() - -END() + +PEERDIR( + contrib/python/mypy-protobuf +) + +PY_MAIN(mypy_protobuf.main:main) + +NO_LINT() + +END() diff --git a/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/ya.make b/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/ya.make index c460171166..2579852a1b 100644 --- a/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/ya.make +++ b/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/ya.make @@ -1,13 +1,13 @@ -OWNER(torkve g:python-contrib) - -IF (USE_PREBUILT_TOOLS) - INCLUDE(${ARCADIA_ROOT}/build/prebuilt/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/ya.make.prebuilt) -ENDIF() - -IF (NOT PREBUILT) - INCLUDE(${ARCADIA_ROOT}/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/bin/ya.make) -ENDIF() - -RECURSE( - bin -) +OWNER(torkve g:python-contrib) + +IF (USE_PREBUILT_TOOLS) + INCLUDE(${ARCADIA_ROOT}/build/prebuilt/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/ya.make.prebuilt) +ENDIF() + +IF (NOT PREBUILT) + INCLUDE(${ARCADIA_ROOT}/contrib/python/mypy-protobuf/bin/protoc-gen-mypy/bin/ya.make) +ENDIF() + +RECURSE( + bin +) diff --git a/contrib/python/mypy-protobuf/bin/ya.make b/contrib/python/mypy-protobuf/bin/ya.make index b14eec5f93..31721ceca9 100644 --- a/contrib/python/mypy-protobuf/bin/ya.make +++ b/contrib/python/mypy-protobuf/bin/ya.make @@ -1,6 +1,6 @@ OWNER(torkve g:python-contrib) -RECURSE( - protoc-gen-mypy - protoc-gen-mypy_grpc +RECURSE( + protoc-gen-mypy + protoc-gen-mypy_grpc ) diff --git a/contrib/python/mypy-protobuf/ya.make b/contrib/python/mypy-protobuf/ya.make index 4f86fe6bf9..8679bc41c2 100644 --- a/contrib/python/mypy-protobuf/ya.make +++ b/contrib/python/mypy-protobuf/ya.make @@ -1,33 +1,33 @@ -PY3_LIBRARY() - +PY3_LIBRARY() + OWNER(torkve g:python-contrib) -VERSION(2.10) +VERSION(2.10) -LICENSE(Apache-2.0) +LICENSE(Apache-2.0) -PEERDIR( +PEERDIR( contrib/python/protobuf -) - -NO_LINT() - -PY_SRCS( - TOP_LEVEL - mypy_protobuf/__init__.py - mypy_protobuf/extensions_pb2.py - mypy_protobuf/main.py -) - -RESOURCE_FILES( - PREFIX contrib/python/mypy-protobuf/ - .dist-info/METADATA - .dist-info/entry_points.txt - .dist-info/top_level.txt -) - -END() - +) + +NO_LINT() + +PY_SRCS( + TOP_LEVEL + mypy_protobuf/__init__.py + mypy_protobuf/extensions_pb2.py + mypy_protobuf/main.py +) + +RESOURCE_FILES( + PREFIX contrib/python/mypy-protobuf/ + .dist-info/METADATA + .dist-info/entry_points.txt + .dist-info/top_level.txt +) + +END() + RECURSE( bin ) |