{"id":13493586,"url":"https://github.com/nipunn1313/mypy-protobuf","last_synced_at":"2026-04-02T02:07:58.276Z","repository":{"id":36990674,"uuid":"113912678","full_name":"nipunn1313/mypy-protobuf","owner":"nipunn1313","description":"open source tools to generate mypy stubs from protobufs","archived":false,"fork":false,"pushed_at":"2026-01-13T17:04:40.000Z","size":2611,"stargazers_count":694,"open_issues_count":28,"forks_count":82,"subscribers_count":17,"default_branch":"main","last_synced_at":"2026-01-18T15:32:15.008Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nipunn1313.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-12-11T21:55:05.000Z","updated_at":"2026-01-13T17:04:44.000Z","dependencies_parsed_at":"2024-11-07T19:42:24.384Z","dependency_job_id":"7073c0d3-e9b7-4f37-9552-bfd151619a18","html_url":"https://github.com/nipunn1313/mypy-protobuf","commit_stats":{"total_commits":471,"total_committers":37,"mean_commits":12.72972972972973,"dds":0.5605095541401274,"last_synced_commit":"ed77525352cefd90b03b8b8a69cc06d0e191d7be"},"previous_names":["dropbox/mypy-protobuf"],"tags_count":42,"template":false,"template_full_name":null,"purl":"pkg:github/nipunn1313/mypy-protobuf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nipunn1313%2Fmypy-protobuf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nipunn1313%2Fmypy-protobuf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nipunn1313%2Fmypy-protobuf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nipunn1313%2Fmypy-protobuf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nipunn1313","download_url":"https://codeload.github.com/nipunn1313/mypy-protobuf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nipunn1313%2Fmypy-protobuf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31294398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T01:43:37.129Z","status":"online","status_checked_at":"2026-04-02T02:00:08.535Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T19:01:16.813Z","updated_at":"2026-04-02T02:07:58.218Z","avatar_url":"https://github.com/nipunn1313.png","language":"Python","funding_links":[],"categories":["Python","Linters \u0026 Style Checkers"],"sub_categories":[],"readme":"mypy-protobuf: Generate mypy stub files from protobuf specs\n\n[![CI](https://github.com/nipunn1313/mypy-protobuf/workflows/CI/badge.svg)](https://github.com/nipunn1313/mypy-protobuf/actions?query=branch%3Amain)\n[![pypi](https://img.shields.io/pypi/v/mypy-protobuf?logo=Pypi)](https://pypi.org/project/mypy-protobuf/)\n[![license](https://img.shields.io/github/license/nipunn1313/mypy-protobuf)](https://github.com/nipunn1313/mypy-protobuf/blob/main/LICENSE)\n===========================================================\n\n2.10 is the last version of mypy-protobuf which supports targeting python 2.7.\n\nBuilt originally with love at [Dropbox](https://github.com/dropbox)\n\nSee [Changelog](CHANGELOG.md) for recent changes.\n\n## Requirements to run mypy-protobuf\n\nEarlier releases might work, but aren't tested\n\n- [protoc \u003e= 32.0](https://github.com/protocolbuffers/protobuf/releases)\n- [python-protobuf \u003e= 6.32](https://pypi.org/project/protobuf/) - matching protoc release\n- [python \u003e= 3.9](https://www.python.org/downloads/source/) - for running mypy-protobuf plugin.\n\n## Requirements to run typecheckers on stubs generated by mypy-protobuf\n\nEarlier releases might work, but aren't tested\n\n- [mypy \u003e= v1.14.0](https://pypi.org/project/mypy) or [pyright \u003e= 1.1.383](https://github.com/microsoft/pyright)\n- [python-protobuf \u003e= 6.32](https://pypi.org/project/protobuf/) - matching protoc release\n- [types-protobuf \u003e= 6.32](https://pypi.org/project/types-protobuf/) - for stubs from the google.protobuf library\n\n### To run typecheckers on code generated with grpc plugin - you'll additionally need\n\nEarlier releases might work, but aren't tested\n\n- [grpcio\u003e=1.70](https://pypi.org/project/grpcio/)\n- [grpcio-tools\u003e=1.70](https://pypi.org/project/grpcio-tools/)\n- [types-grpcio\u003e=1.0.0.20251009](https://pypi.org/project/types-grpcio/)\n\nOther configurations may work, but are not continuously tested currently.\nWe would be open to expanding this list - file an issue on the issue tracker.\n\n## Installation\n\nThe plugin can be installed with\n\n```\npip3 install mypy-protobuf\n```\n\nTo install unreleased\n\n```\nREV=main  # or whichever unreleased git rev you'd like\npip3 install git+https://github.com/nipunn1313/mypy-protobuf.git@$REV\n\n# For older (1.x) versions of mypy protobuf - you may need\npip3 install git+https://github.com/nipunn1313/mypy-protobuf.git@$REV#subdirectory=python\n```\n\nIn order to run mypy on the generated code, you'll need to install\n\n```\npip3 install mypy\u003e=0.910 types-protobuf\u003e=0.1.14\n```\n\n# Usage\n\nOn posix, protoc-gen-mypy is installed to python's executable bin. Assuming that's\non your $PATH, you can run\n\n```\nprotoc --python_out=output/location --mypy_out=output/location\n```\n\nAlternately, you can explicitly provide the path:\n\n```\nprotoc --plugin=protoc-gen-mypy=path/to/protoc-gen-mypy --python_out=output/location --mypy_out=output/location\n```\n\nCheck the version number with\n\n```\n\u003e protoc-gen-mypy --version\n```\n\n## Implementation\n\nThe implementation of the plugin is in `mypy_protobuf/main.py`, which installs to\nan executable protoc-gen-mypy. On windows it installs to `protoc-gen-mypy.exe`\n\n## Features\n\nSee [Changelog](CHANGELOG.md) for full listing\n\n### Differences between the protobuf compiler (`--pyi_out`) and `mypy-protobuf`\n\n(As of 11/17/2025)\n\n* `mypy-protobuf` generates stubs for GRPC services and clients\n* `mypy-protobuf` generates correctly typed `HasField` methods depending on field presence, `pyi_out` does not type `HasField` arguments\n* `mypy-protobuf` generates correctly typed constructors dependinding on field presence.\n* `mypy-protobuf` generates correctly typed `HasField`, `WhichOneof`, and `ClearField` methods.\n* There are differences in how `mypy-protobuf` and `pyi_out` generate enums. See [this issue](https://github.com/protocolbuffers/protobuf/issues/8175) for details\n* Type aliases exported for `HasField`, `WhichOneof` and `ClearField` arguments\n* Parses comments as docstrings\n* `mypy-protobuf` marks enums, enum values, messages, message fields, services, and methods with `@warnings.deprecated` if the deprecation option is set to true.\n\n#### Examples\n\n`mypy-protobuf`:\n\n```python\n\"\"\"\n@generated by mypy-protobuf.  Do not edit manually!\nisort:skip_file\nEdition version of proto2 file\"\"\"\n\nimport builtins\nimport google.protobuf.descriptor\nimport google.protobuf.message\nimport sys\nimport typing\n\nif sys.version_info \u003e= (3, 10):\n    import typing as typing_extensions\nelse:\n    import typing_extensions\n\nDESCRIPTOR: google.protobuf.descriptor.FileDescriptor\n\n@typing.final\nclass Editions2024SubMessage(google.protobuf.message.Message):\n    DESCRIPTOR: google.protobuf.descriptor.Descriptor\n\n    THING_FIELD_NUMBER: builtins.int\n    thing: builtins.str\n    def __init__(\n        self,\n        *,\n        thing: builtins.str | None = ...,\n    ) -\u003e None: ...\n    _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal[\"thing\", b\"thing\"]\n    def HasField(self, field_name: _HasFieldArgType) -\u003e builtins.bool: ...\n    _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal[\"thing\", b\"thing\"]\n    def ClearField(self, field_name: _ClearFieldArgType) -\u003e None: ...\n\nGlobal___Editions2024SubMessage: typing_extensions.TypeAlias = Editions2024SubMessage\n\n@typing.final\nclass Editions2024Test(google.protobuf.message.Message):\n    DESCRIPTOR: google.protobuf.descriptor.Descriptor\n\n    LEGACY_FIELD_NUMBER: builtins.int\n    EXPLICIT_SINGULAR_FIELD_NUMBER: builtins.int\n    MESSAGE_FIELD_FIELD_NUMBER: builtins.int\n    IMPLICIT_SINGULAR_FIELD_NUMBER: builtins.int\n    DEFAULT_SINGULAR_FIELD_NUMBER: builtins.int\n    legacy: builtins.str\n    \"\"\"Expect to be always set\"\"\"\n    explicit_singular: builtins.str\n    \"\"\"Expect HasField generated\"\"\"\n    implicit_singular: builtins.str\n    \"\"\"Expect implicit field presence, no HasField generated\"\"\"\n    default_singular: builtins.str\n    \"\"\"Not set, should default to EXPLICIT\"\"\"\n    @property\n    def message_field(self) -\u003e Global___Editions2024SubMessage:\n        \"\"\"Expect HasField generated?\"\"\"\n\n    def __init__(\n        self,\n        *,\n        legacy: builtins.str | None = ...,\n        explicit_singular: builtins.str | None = ...,\n        message_field: Global___Editions2024SubMessage | None = ...,\n        implicit_singular: builtins.str = ...,\n        default_singular: builtins.str | None = ...,\n    ) -\u003e None: ...\n    _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal[\"default_singular\", b\"default_singular\", \"explicit_singular\", b\"explicit_singular\", \"legacy\", b\"legacy\", \"message_field\", b\"message_field\"]\n    def HasField(self, field_name: _HasFieldArgType) -\u003e builtins.bool: ...\n    _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal[\"default_singular\", b\"default_singular\", \"explicit_singular\", b\"explicit_singular\", \"implicit_singular\", b\"implicit_singular\", \"legacy\", b\"legacy\", \"message_field\", b\"message_field\"]\n    def ClearField(self, field_name: _ClearFieldArgType) -\u003e None: ...\n\nGlobal___Editions2024Test: typing_extensions.TypeAlias = Editions2024Test\n\n```\n\nBuiltin pyi generator:\n\n```python\nfrom google.protobuf import descriptor as _descriptor\nfrom google.protobuf import message as _message\nfrom collections.abc import Mapping as _Mapping\nfrom typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union\n\nDESCRIPTOR: _descriptor.FileDescriptor\n\nclass Editions2024SubMessage(_message.Message):\n    __slots__ = ()\n    THING_FIELD_NUMBER: _ClassVar[int]\n    thing: str\n    def __init__(self, thing: _Optional[str] = ...) -\u003e None: ...\n\nclass Editions2024Test(_message.Message):\n    __slots__ = ()\n    LEGACY_FIELD_NUMBER: _ClassVar[int]\n    EXPLICIT_SINGULAR_FIELD_NUMBER: _ClassVar[int]\n    MESSAGE_FIELD_FIELD_NUMBER: _ClassVar[int]\n    IMPLICIT_SINGULAR_FIELD_NUMBER: _ClassVar[int]\n    DEFAULT_SINGULAR_FIELD_NUMBER: _ClassVar[int]\n    legacy: str\n    explicit_singular: str\n    message_field: Editions2024SubMessage\n    implicit_singular: str\n    default_singular: str\n    def __init__(self, legacy: _Optional[str] = ..., explicit_singular: _Optional[str] = ..., message_field: _Optional[_Union[Editions2024SubMessage, _Mapping]] = ..., implicit_singular: _Optional[str] = ..., default_singular: _Optional[str] = ...) -\u003e None: ...\n```\n\n### Bring comments from .proto files to docstrings in .pyi files\n\nComments in the .proto files on messages, fields, enums, enum variants, extensions, services, and methods\nwill appear as docstrings in .pyi files. Useful in IDEs for showing completions with comments.\n\n### Types enum int values more strongly\n\nEnum int values produce stubs which wrap the int values in NewType\n\n```proto\nenum MyEnum {\n  HELLO = 0;\n  WORLD = 1;\n}\n```\n\nWill 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.ValueType` (a `NewType(int)` rather than `int`.\nThis allows mypy to catch bugs where the wrong enum value is being used.\n\nCalling code may be typed as follows.\n\nIn python \u003e= 3.7\n\n```python\n# May need [PEP 563](https://www.python.org/dev/peps/pep-0563/) to postpone evaluation of annotations\n# from __future__ import annotations  # Not needed with python\u003e=3.11 or protobuf\u003e=3.20.0\ndef f(x: MyEnum.ValueType):\n    print(x)\nf(MyEnum.Value(\"HELLO\"))\n```\n\nWith protobuf \u003c= 3.20.0, for usages of cast, the type of `x` must be quoted\nAfter protobuf \u003e= 3.20.0 - `ValueType` exists in the python code and quotes aren't needed\nuntil [upstream protobuf](https://github.com/protocolbuffers/protobuf/pull/8182) includes `ValueType`\n\n```python\ncast('MyEnum.ValueType', x)\n```\n\nSimilarly, for type aliases with protobuf \u003c 3.20.0, you must either quote the type or hide it behind `TYPE_CHECKING`\n\n```python\nfrom typing import Tuple, TYPE_CHECKING\nHELLO = Tuple['MyEnum.ValueType', 'MyEnum.ValueType']\nif TYPE_CHECKING:\n    HELLO = Tuple[MyEnum.ValueType, MyEnum.ValueType]\n```\n\n#### Enum int impl details\n\nmypy-protobuf autogenerates an instance of the EnumTypeWrapper as follows.\n\n```python\nclass _MyEnum:\n    ValueType = typing.NewType('ValueType', builtins.int)\n    V: typing_extensions.TypeAlias = ValueType\nclass _MyEnumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_MyEnum.ValueType], builtins.type):\n    DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor\n    HELLO: _MyEnum.ValueType  # 0\n    WORLD: _MyEnum.ValueType  # 1\nclass MyEnum(_MyEnum, metaclass=_MyEnumEnumTypeWrapper):\n    pass\n\nHELLO: MyEnum.ValueType  # 0\nWORLD: MyEnum.ValueType  # 1\n```\n\n`_MyEnumEnumTypeWrapper` extends the EnumTypeWrapper to take/return MyEnum.ValueType rather than int\n`MyEnum` is an instance of the `EnumTypeWrapper`.\n\n- Use `_MyEnum` and of metaclass is an implementation detail to make MyEnum.ValueType a valid type w/o a circular dependency\n- `V` is supported as an alias of `ValueType` for backward compatibility\n\n### Supports generating type wrappers for fields and maps\n\nM.proto\n\n```proto\nmessage M {\n  uint32 user_id = 1 [(mypy_protobuf.options).casttype=\"mymod.UserId\"];\n  map\u003cuint32, string\u003e email_by_uid = 2 [\n    (mypy_protobuf.options).keytype=\"path/to/mymod.UserId\",\n    (mypy_protobuf.options).valuetype=\"path/to/mymod.Email\"\n  ];\n}\n```\n\nmymod.py\n\n```python\nUserId = NewType(\"UserId\", int)\nEmail = NewType(\"Email\", Text)\n```\n\n### `py_generic_services`\n\nIf `py_generic_services` is set in your proto file, then mypy-protobuf will\ngenerate service stubs. If you want GRPC stubs instead - use the GRPC instructions.\n\n### `readable_stubs`\n\nIf `readable_stubs` is set, mypy-protobuf will generate easier-to-read stubs. The downside\nto this approach - is that it's possible to generate stubs which do not pass mypy - particularly\nin the case of name collisions. mypy-protobuf defaults to generating stubs with fully qualified\nimports and mangled global-level identifiers to defend against name collisions between global\nidentifiers and field names.\n\nIf you're ok with this risk, try it out!\n\n```\nprotoc --python_out=output/location --mypy_out=readable_stubs:output/location\n```\n\n### `relax_strict_optional_primitives`\n\nIf you are using proto3, then primitives cannot be represented as NULL on the wire -\nonly as their zero value. By default mypy-protobuf types message constructors to have\nnon-nullable primitives (eg `int` instead of `Optional[int]`). python-protobuf itself will\ninternally convert None -\u003e zero value. If you intentionally want to use this behavior,\nset this flag! We recommend avoiding this, as it can lead to developer error - confusing\nNULL and 0 as distinct on the wire.\nHowever, it may be helpful when migrating existing proto2 code, where the distinction is meaningful\n\n```\nprotoc --python_out=output/location --mypy_out=relax_strict_optional_primitives:output/location\n```\n\n### `use_default_deprecation_warnings`\n\nBy default mypy-protobuf will pull the leading and trailing comments from the deprecation option definition,\nand insert it into the deprecation warning. This option will instead use a standard deprecation warning instead of comments.\n\n```\nprotoc --python_out=output/location --mypy_out=use_default_deprecation_warning:output/location\n```\n\n### `generate_concrete_servicer_stubs`\n\nBy default mypy-protobuf will output servicer stubs with abstract methods. To output concrete stubs, set this option\n\n```\nprotoc --python_out=output/location --mypy_grpc_out=generate_concrete_servicer_stubs:output/location\n```\n\n### `sync_only/async_only`\n\nBy default, generated GRPC stubs are compatible with both sync and async variants. If you only\nwant sync or async GRPC stubs, use this option:\n\n```\nprotoc --python_out=output/location --mypy_grpc_out=sync_only:output/location\n```\n\nor\n\n```\nprotoc --python_out=output/location --mypy_grpc_out=async_only:output/location\n```\n\n### Output suppression\n\nTo suppress output, you can run\n\n```\nprotoc --python_out=output/location --mypy_out=quiet:output/location\n```\n\n### GRPC\n\nThis plugin provides stubs generation for grpcio generated code.\n\n```\nprotoc \\\n    --python_out=output/location \\\n    --mypy_out=output/location \\\n    --grpc_out=output/location \\\n    --mypy_grpc_out=output/location\n```\n\nNote that generated code for grpc will work only together with code for python and locations should be the same.\nIf you need stubs for grpc internal code we suggest using this package https://pypi.org/project/types-grpcio/\n\n#### Async GRPC usage\n\n`mypy-protobuf` generates stubs that are compatible with both sync and async usage, with a few caveats.\n\nIn a simple use case, the stubs work as expected.\n\n```python\nstub = dummy_Pb2_grpc.DummyServiceStub(grpc.aio.insecure_channel(\"localhost:1234\"))\nresult = await stub.UnaryUnary(dummy_pb2.DummyRequest(value=\"cprg\"))\ntyping.assert_type(result, dummy_pb2.DummyReply)\n```\n\nIf you need to explicitly type something as an async stub (class attr, etc) then you must use deferred annotations, and the async stub, as it does not exist at runtime.\n\n```python\nclass TestAttribute:\n    stub: \"dummy_pb2_grpc.DummyServiceAsyncStub\"\n\n    def __init__(self) -\u003e None:\n        self.stub = dummy_pb2_grpc.DummyServiceStub(grpc.aio.insecure_channel(\"localhost:1234\"))\n\n    async def test(self) -\u003e None:\n        result = await self.stub.UnaryUnary(dummy_pb2.DummyRequest(value=\"cprg\"))\n        typing.assert_type(result, dummy_pb2.DummyReply)\n```\n\n### `_ClearFieldArgType`, `_WhichOneofArgType_\u003coneof_name\u003e`, `_WhichOneofReturnType_\u003coneof_name\u003e` and `_HasFieldArgType` aliases\n\nWhere applicable, type aliases are generated for the arguments to `ClearField`, `WhichOneof` and `HasField`. These can be used to create typed functions for field manipulation:\n\n```python\n  from testproto.edition2024_pb2 import Editions2024Test\n\n  def test_hasfield_alias(msg: Editions2024Test, field: \"Editions2024Test._HasFieldArgType\") -\u003e bool:\n      return msg.HasField(field)\n\n  test_hasfield_alias(Editions2024Test(), \"legacy\")\n\n  def test_whichoneof_alias(\n      msg: SimpleProto3,\n      oneof: \"SimpleProto3._WhichOneofArgType_a_oneof\",\n  ) -\u003e \"SimpleProto3._WhichOneofReturnType_a_oneof | None\":\n      return msg.WhichOneof(oneof)\n\n  test_whichoneof_alias(SimpleProto3(), \"a_oneof\")\n```\n\nNote the deferred evaluation (string reference, or `from __future__ import annotations`. This bypasses the fact that the alias does not exist on the runtime class)\n\n### Targeting python2 support\n\nmypy-protobuf's drops support for targeting python2 with version 3.0. If you still need python2 support -\n\n```\npython3 -m pip install mypy_protobuf==2.10\nprotoc --python_out=output/location --mypy_out=output/location\nmypy --target-version=2.7 {files}\n```\n\n## Releasing to pypi (TODO: Automate)\n\n1. Checkout the commit you need to release\n2. Make sure it is tagged with the release version\n3. Make sure the working tree is clean\n4. Clean dist (`rm -rf dist`)\n5. `uv venv`\n6. `uv pip install --upgrade build`\n7. `uv run python3 -m build`\n8. `uv pip install --upgrade twine`\n9. `uv run twine upload --repository testpypi dist/*`\n10. `uv run twine upload dist/*`\n\n## 3rd Party Tests\n\n3rd Party proto files can be added in `run_tests.sh`, they should be cloned in, generated, type checked, then cleaned up.\n\n## Contributing\n\nContributions to the implementation are welcome. Please run tests using `./run_test.sh`.\nEnsure code is formatted using black.\n\n```\npip3 install black\nblack .\n```\n\n## Contributors\n\n- [@nipunn1313](https://github.com/nipunn1313)\n- [@dzbarsky](https://github.com/dzbarsky)\n- [@gvanrossum](https://github.com/gvanrossum)\n- [@peterlvilim](https://github.com/peterlvilim)\n- [@msullivan](https://github.com/msullivan)\n- [@bradenaw](https://github.com/bradenaw)\n- [@ilevkivskyi](https://github.com/ilevkivskyi)\n- [@Ketouem](https://github.com/Ketouem)\n- [@nmiculinic](https://github.com/nmiculinic)\n- [@onto](https://github.com/onto)\n- [@jcppkkk](https://github.com/jcppkkk)\n- [@drather19](https://github.com/drather19)\n- [@smessmer](https://github.com/smessmer)\n- [@pcorpet](https://github.com/pcorpet)\n- [@zozoens31](https://github.com/zozoens31)\n- [@abhishekrb19](https://github.com/abhishekrb19)\n- [@jaens](https://github.com/jaens)\n- [@arussellsaw](https://github.com/arussellsaw)\n- [@shabbyrobe](https://github.com/shabbyrobe)\n- [@reorx](https://github.com/reorx)\n- [@zifter](https://github.com/zifter)\n- [@juzna](https://github.com/juzna)\n- [@mikolajz](https://github.com/mikolajz)\n- [@chadrik](https://github.com/chadrik)\n- [@EPronovost](https://github.com/EPronovost)\n- [@chrislawlor](https://github.com/chrislawlor)\n- [@henribru](https://github.com/henribru)\n- [@Evgenus](https://github.com/Evgenus)\n- [@MHDante](https://github.com/MHDante)\n- [@nelfin](https://github.com/nelfin)\n- [@alkasm](https://github.com/alkasm)\n- [@tarmath](https://github.com/tarmath)\n- [@jaredkhan](https://github.com/jaredkhan)\n- [@sodul](https://github.com/sodul)\n- [@miaachan](https://github.com/miaachan)\n- [@Alphadelta14](https://github.com/Alphadelta14)\n- [@fergyfresh](https://github.com/fergyfresh)\n- [@AlexWaygood](https://github.com/AlexWaygood)\n- [@Avasam](https://github.com/Avasam)\n- [@artificial-aidan](https://github.com/artificial-aidan)\n\n## Licence etc.\n\n1. License: Apache 2.0.\n2. Copyright attribution: Copyright (c) 2022 Nipunn Koorapati\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnipunn1313%2Fmypy-protobuf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnipunn1313%2Fmypy-protobuf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnipunn1313%2Fmypy-protobuf/lists"}