Yet another tool that compiles .proto strings and import the outcome Python modules.
Project description
A Python package that
- takes a
str
containing protobuf messages definitions - returns a
types.ModuleType
instance
It is useful for programs needing to en/decode protobuf messages for which the definition is provided as a string at runtime.
Installation
pip install proto-topy
Prerequisite: proto-topy
needs protoc to be installed. On macOS, a simple brew install protobuf
shall suffice.
single proto example: address book
Adaptation of the protocolbuffers
example:
import requests
from pathlib import Path
from proto_topy import ProtoModule
# Retrieve protobuf messages definitions as a string
example_source = requests.get(
"https://raw.githubusercontent.com/protocolbuffers/protobuf/main/"
"examples/addressbook.proto").text
example_path = Path(
"protocolbuffers/protobuf/blob/main/examples/addressbook.proto")
# Compile and import
module = ProtoModule(file_path=example_path, source=example_source).compiled()
# Produce a serialized address book
address_book = module.py.AddressBook()
person = address_book.people.add()
person.id = 111
person.name = "A Name"
person.email = "a.name@mail.com"
phone_number = person.phones.add()
phone_number.number = "+1234567"
phone_number.type = module.py.Person.MOBILE
with open("address_book.data", "wb") as o:
o.write(address_book.SerializeToString())
# Use a serialized address book
address_book = module.py.AddressBook()
with open("address_book.data", "rb") as i:
address_book.ParseFromString(i.read())
for person in address_book.people:
print(person.id, person.name, person.email, phone_number.number)
multiple protos example
When several .proto
need to be considered, use a ProtoCollection
:
import sys
from pathlib import Path
from proto_topy import ProtoModule, ProtoCollection
module1 = ProtoModule(
file_path=Path("p1/p2/other2.proto"),
source="""
syntax = "proto3";
import "google/protobuf/timestamp.proto";
message OtherThing2 {
google.protobuf.Timestamp created = 1;
};"""
)
module2 = ProtoModule(
file_path=Path("p3/p4/test6.proto"),
source="""
syntax = "proto3";
import "p1/p2/other2.proto";
message Test6 {
OtherThing2 foo = 1;
};"""
)
collection = ProtoCollection(module1, module2).compiled()
sys.modules.update({proto.name: proto.py
for proto in collection.modules.values()})
print(sys.modules['test6'].Test6,
sys.modules['other2'].OtherThing2)
Stream of delimited messages
To decode a stream of contiguous protobuf messages of the same type, use DelimitedMessageFactory
. Example:
from io import BytesIO
from pathlib import Path
from proto_topy import ProtoModule, DelimitedMessageFactory
# Generate Python module
module = ProtoModule(
file_path=Path("int32_streams.proto"),
source="""
syntax = "proto3";
message TestInt { int32 val = 1; };"""
).compiled()
# Feed a DelimitedMessageFactory with a sequence of TestInt instances for a range of 10 ints
integers = (module.py.TestInt(val=val) for val in range(10))
factory = DelimitedMessageFactory(BytesIO(), *integers)
# Rewind and read the stream of 10 protobuf messages
factory.rewind()
for offset_val in factory.message_read(module.py.TestInt):
print(f"TestInt message of val set to {offset_val[1]}")
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file proto-topy-1.0.4.tar.gz
.
File metadata
- Download URL: proto-topy-1.0.4.tar.gz
- Upload date:
- Size: 9.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 89184790bd5c944e604adada3cbaed4296a2c8a492bd25cfee9ac945fc7fb272 |
|
MD5 | bdc812444f63d49197303952db5c2386 |
|
BLAKE2b-256 | 604ce11153a90419a7ba2ac006f14246102a66f098868b752ba42fcab3f8d8ef |
File details
Details for the file proto_topy-1.0.4-py3-none-any.whl
.
File metadata
- Download URL: proto_topy-1.0.4-py3-none-any.whl
- Upload date:
- Size: 7.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bc3cf15f52223728cc47b6f92d0d7d57e0f77ad35bfc0bbf111300c2e5c5d63a |
|
MD5 | 57ff0975853bbc45bb3332b1d22e61cc |
|
BLAKE2b-256 | 330c4f73c058b3ff372abe391fd9fb0cc6a941e6e39ff2d1c2a7084245deb90e |