Skip to main content

py2proto

py2proto is a powerful Python library that simplifies the process of creating gRPC services and Protocol Buffer definitions. It automatically generates .proto files, gRPC code, and Swagger UI documentation from Python class definitions.

Features

  • Automatic generation of .proto files from Python classes
  • Generation of gRPC Python code
  • Swagger UI generation for easy API testing and documentation
  • Support for complex data types (lists, dictionaries)
  • Custom output directory setting
  • Built-in Swagger UI server
  • Creating server and client codes for Python and JavaScript programming languages.

Installation

Install py2proto using pip:

pip install py2proto

Usage

  1. Import necessary modules:
from py2proto import ProtoGenerator, relation
from typing import List, Dict
  1. Define your message classes:
class MessageProto(ProtoGenerator):
    class MessageRequest(ProtoGenerator):
        message: str
        number: int

    class MessageResponse(ProtoGenerator):
        message: str

    # relation(`relation Name`, `request function`, `returnes fucntion`)
    service = relation("SendMessage", "MessageRequest", "MessageResponse")
  1. Generate files and run Swagger UI:
if __name__ == "__main__":
if __name__ == "__main__":
    # Set output directory
    MessageProto.set_output_directory("outputs")
    
    # Generate proto file
    proto_file = MessageProto.generate_proto("messageservice", "message_service")
    
    # Generate pb2 files
    MessageProto.generate_pb2(proto_file)
    
    # Generate Swagger file
    swagger_file = MessageProto.generate_swagger(proto_file)
    
    # Generate gRPC server & client files for Python and JavaScript
    MessageProto.generate_grpc_files(['python', 'javascript'], proto_file, port=50051)
    
    # Run Swagger UI
    MessageProto.run_flask()

This script will generate a .proto file in the 'protos/' directory and pb2 files in the 'outputs/' directory. Finally, the output of the generated proto file will be as follows:

Detailed Function Explanations

relation(method_name: str, request: str, response: str)

Defines a gRPC service method with its request and response types.

Example:

service = relation("SendMessage", "MessageRequest", "MessageResponse")

set_output_directory(directory: str)

Sets the output directory for generated files.

Example:

MessageProto.set_output_directory("custom_output")

generate_proto(package_name: str, file_name: str) -> str

Generates a .proto file based on the defined classes.

Example:

proto_file = MessageProto.generate_proto("mypackage", "myservice")

generate_pb2(proto_file: str)

Generates Python gRPC code from the .proto file.

Example:

MessageProto.generate_pb2(proto_file)

generate_swagger(proto_file: str) -> str

Generates a Swagger JSON file for API documentation.

Example:

swagger_file = MessageProto.generate_swagger(proto_file)

run_swagger()

Starts a Flask server to serve the Swagger UI.

Example:

MessageProto.run_swagger()

generate_grpc_files(languages: List[str], proto_file: str, port: int = 50051)

Generates gRPC code for the specified languages.

Example:

MessageProto.generate_grpc_files(['python', 'javascript'], proto_file, port=50051)

Advanced Usage

You can use complex data types in your message definitions:

class ComplexProto(ProtoGenerator):
    class ComplexRequest(ProtoGenerator):
        list_field: List[str]
        dict_field: Dict[str, int]

    class ComplexResponse(ProtoGenerator):
        result: List[Dict[str, str]]

    service = relation("ComplexRequest", "ComplexResponse")

Multiple Services

Define multiple services in a single Proto class:

class MultiServiceProto(ProtoGenerator):
    class Request1(ProtoGenerator):
        field1: str

    class Response1(ProtoGenerator):
        result1: str

    class Request2(ProtoGenerator):
        field2: int

    class Response2(ProtoGenerator):
        result2: int

    service1 = relation("Request1", "Response1")
    service2 = relation("Request2", "Response2")

Why Use py2proto?

  1. Simplicity: Define your gRPC services using familiar Python syntax.
  2. Automation: Automatically generate .proto files and gRPC code.
  3. Documentation: Get Swagger UI documentation out of the box.
  4. Flexibility: Support for complex data types and multiple services.
  5. Time-saving: Reduce boilerplate code and manual proto file writing.

Requirements

  • Python 3.6+
  • grpcio
  • grpcio-tools
  • Flask (for Swagger UI)

Supported Data Types

py2proto supports the following Protocol Buffer data types:

  • str (string)
  • int (int32)
  • float (float)
  • bool (bool)
  • bytes (bytes)
  • "int64" (int64)
  • "uint32" (uint32)
  • "uint64" (uint64)
  • "sint32" (sint32)
  • "sint64" (sint64)
  • "fixed32" (fixed32)
  • "fixed64" (fixed64)
  • "sfixed32" (sfixed32)
  • "sfixed64" (sfixed64)
  • "double" (double)
  • List[Type] (repeated)
  • Dict[KeyType, ValueType] (map)

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Metadata

Release files for py2proto 2.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for py2proto 2.3.1
File Size Uploaded
py2proto-2.3.1.tar.gz 11.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for py2proto 2.3.1
File Interpreter ABI Platform
py2proto-2.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 20.6 kB

Release files / py2proto-2.3.1.tar.gz

Download URL py2proto-2.3.1.tar.gz
Size 11.2 kB
Tags Source
SHA-256 checksum
How to use checksums
ef63064e12da3bc38d29e9dd674685a07cbec28a6159f25c6960423c5e8a1990
BLAKE2b-256 checksum
How to use checksums
1b6ebd1ad56756c5a356539962877f2822e56fef6bc1442447911d2b965e8dee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.12.3

Release files / py2proto-2.3.1-py3-none-any.whl

Download URL py2proto-2.3.1-py3-none-any.whl
Size 9.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
de614aa24be9df00f5b4fb5869850b686e0f0f87000a7b5b86a740c80012bdc3
BLAKE2b-256 checksum
How to use checksums
d81164950d73030ca03470fcbd4df223243db751e364b58f89ffa8ba07359ba4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.12.3

Release history Release notifications | RSS feed

This release

2.3.1 This release

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.4

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page