{"library":"protobuf-to-pydantic","title":"Protobuf to Pydantic","description":"protobuf-to-pydantic is a Python library that generates `pydantic.BaseModel` classes with parameter verification functions directly from Protobuf files (proto3 syntax). It supports both runtime object generation and plugin-based code generation, enabling robust data validation for Protobuf messages within Python applications. The library is actively maintained with frequent minor releases, currently at version 0.3.3.1.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install protobuf-to-pydantic","pip install protobuf-to-pydantic[mypy-protobuf]"],"cli":{"name":"protobuf-to-pydantic","version":"sh: 1: protobuf-to-pydantic: not found"}},"imports":["from protobuf_to_pydantic import msg_to_pydantic_model","from protobuf_to_pydantic.template import Template"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import sys\nfrom typing import Type\nfrom pydantic import BaseModel, Field\nfrom google.protobuf.message import Message\nfrom google.protobuf import descriptor_pool, descriptor_pb2\nfrom protobuf_to_pydantic import msg_to_pydantic_model\n\n# Simulate a generated protobuf message `demo_pb2.UserMessage`\n# In a real scenario, this would come from `import demo_pb2`\n\npool = descriptor_pool.Default()\ndescriptor = descriptor_pb2.DescriptorProto()\ndescriptor.name = 'UserMessage'\ndescriptor.field.add(name='uid', number=1, type=descriptor_pb2.FieldDescriptorProto.TYPE_STRING)\ndescriptor.field.add(name='age', number=2, type=descriptor_pb2.FieldDescriptorProto.TYPE_INT32)\ndescriptor.field.add(name='user_name', number=3, type=descriptor_pb2.FieldDescriptorProto.TYPE_STRING)\n\npool.Add(descriptor)\n\n# Create a mock Message class based on the descriptor\nclass UserMessage(Message):\n    def __init__(self, uid='', age=0, user_name='', **kwargs):\n        super().__init__(**kwargs)\n        self.uid = uid\n        self.age = age\n        self.user_name = user_name\n    DESCRIPTOR = pool.FindMessageTypeByName('UserMessage')\n\n# Convert the Protobuf Message object to a Pydantic BaseModel\nUserModel: Type[BaseModel] = msg_to_pydantic_model(UserMessage)\n\n# Example usage of the generated Pydantic model\nuser_data = UserModel(uid='123', age=30, user_name='John Doe')\nprint(user_data.model_dump_json(indent=2))\n\n# Access field info\n# print({k: v.field_info for k, v in UserModel.__fields__.items()}) # For Pydantic v1\nprint({k: v.json_schema_extra for k, v in UserModel.model_fields.items()}) # For Pydantic v2+\n","lang":"python","description":"This quickstart demonstrates how to convert a Protobuf Message object into a Pydantic `BaseModel` at runtime using `msg_to_pydantic_model`. It includes a minimal simulated Protobuf message for immediate execution. For actual use, `UserMessage` would be imported from your generated `_pb2.py` files.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"0.3.3.1","pypi_latest":"0.3.3.1","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":3.8,"avg_import_s":0.69,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":0.61,"mem_mb":14,"disk_size":"31.8M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":0.59,"mem_mb":14,"disk_size":"32.4M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":4.3,"import_time_s":0.36,"mem_mb":13.1,"disk_size":"32M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":4.3,"import_time_s":0.37,"mem_mb":13.1,"disk_size":"32M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":1.11,"mem_mb":15.5,"disk_size":"35.2M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":1.09,"mem_mb":15.5,"disk_size":"35.9M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":3.4,"import_time_s":0.64,"mem_mb":14.6,"disk_size":"35M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":3.6,"import_time_s":0.64,"mem_mb":14.6,"disk_size":"36M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":1.22,"mem_mb":15.3,"disk_size":"26.9M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":1.25,"mem_mb":15.3,"disk_size":"27.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":3,"import_time_s":0.87,"mem_mb":14.4,"disk_size":"27M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":3.1,"import_time_s":0.87,"mem_mb":14.4,"disk_size":"28M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":0.76,"mem_mb":12.6,"disk_size":"26.7M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":0.77,"mem_mb":12.6,"disk_size":"27.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":3,"import_time_s":0.48,"mem_mb":11.7,"disk_size":"27M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":3.3,"import_time_s":0.48,"mem_mb":11.7,"disk_size":"27M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":0.45,"mem_mb":13.4,"disk_size":"31.2M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":0.47,"mem_mb":13.4,"disk_size":"31.8M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"protobuf-to-pydantic","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":5,"import_time_s":0.42,"mem_mb":12.5,"disk_size":"31M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"mypy-protobuf","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":5.1,"import_time_s":0.44,"mem_mb":12.5,"disk_size":"32M"}]}}