Schematics extension for handling protobuf 3 messages.
Project description
schematics-proto3
Built upon Schematics - Python Data
Structures for Humans™, schematics-proto3 brings the awesome features
of Schematics to Protobuf 3 world.
Caution
Library is currently in WORK IN PROGRESS state.
What is implemented and tested:
- Loading Protobuf 3 messages to Model instances.
- for most of the Protobuf 3 types, including
wrappers,
repeatedoneoffields - Enum type
- for most of the Protobuf 3 types, including
wrappers,
- Validation and structured error messages.
To be done:
- Serializing Model instances to Protobuf 3 messages.
- Make the library more user-friendly.
- Schematics "roles".
Installation
pip install schematics-proto3
Motivation
As good and widely supported as it is, Protobuf 3 still has some quirks which can make working with it painful and repetitive. Especially, building complex gRPC services might reveal a number of deficiencies in available tooling.
schematics-proto3 aims to address this problem, in particular:
-
[#359] default values and testing if a field is set in v3
There is a workaround for this,
schematics-proto3incorporates wrapper types to hide nested messages underneath. -
no proper data handling library
Comparing to Serializers in Django Rest Framework or Marshmallow, there seems to be no full fledged serialization / validation / deserialization library for Protobuf 3. Thanks to Schematics,
schematics-proto3is able to provide:- declarative models
- custom validation functions
- structured error messages (currently only as Python dict)
Example
Let's take Schematics example and modify it to work with Protobuf.
We have a following Protobuf message (and person_pb2 Python module).
syntax = "proto3";
import "google/protobuf/wrappers.proto";
package example;
message Person {
google.protobuf.StringValue name = 1;
google.protobuf.StringValue website = 2;
}
And reflect above message in Model class.
from schematics_proto3 import Model
from schematics_proto3 import types as pbtypes
import person_pb2 as pb2
class PersonModel(Model, protobuf_message=pb2.Person):
name = pbtypes.StringWrapperType()
website = pbtypes.StringWrapperType()
Let's load some data.
msg = pb2.Person()
msg.name.value = 'Jon Doe'
msg.website.value = 'https://example.com'
model = PersonModel.load_protobuf(msg)
model.validate()
assert model.name == 'Jon Doe'
assert model.website == 'https://example.com'
assert model.to_native() == {'name': 'Jon Doe', 'website': 'https://example.com'}
Not setting a field will give you an Unset.
from schematics_proto3.unset import Unset
msg = pb2.Person()
msg.name.value = 'Jon Doe'
model = PersonModel.load_protobuf(msg)
model.validate()
assert model.name == 'Jon Doe'
assert model.website is Unset
Project details
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file schematics-proto3-0.1.3.tar.gz.
File metadata
- Download URL: schematics-proto3-0.1.3.tar.gz
- Upload date:
- Size: 46.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.3.1 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aec8296d87ddd499ea5c0ab6807e595c328a4aa717e212a622cd534816c9a6d8
|
|
| MD5 |
5c8cdace600fcb04a742873a06305d5e
|
|
| BLAKE2b-256 |
b8f91c90d2668b7084bc073c7691fff875a73fd78a6bc47f706eb6fe7d25dc7e
|
File details
Details for the file schematics_proto3-0.1.3-py3-none-any.whl.
File metadata
- Download URL: schematics_proto3-0.1.3-py3-none-any.whl
- Upload date:
- Size: 15.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.3.1 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc12800a8e34b3839f665b7459b25e33e00638537d38775b9e0b309651397bc3
|
|
| MD5 |
ac8f7e9f47d8e5b3e0c639c3832a6bd6
|
|
| BLAKE2b-256 |
5015fdcecb1961e5a8cde70bdd81d18b9677433c96c3294bd3c4096cad773646
|