Skip to content

joshuaghezzi/proto-schema-parser

 
 

Repository files navigation

Protobuf Schema Parser

Protobuf Schema Parser is a pure-Python library that parses and writes Protobuf schemas to and from an abstract syntax tree (AST).

The library uses proto_schema_parser.parser.Parser to parse the CST into an AST. The proto_schema_parser.generator.Generator class converts the AST back into a CST (a Protobuf schema string).

The lexer and parser are autogenerated from Buf's ANTLR lexer and parser grammar files.

Features

  • ✅ proto2 and proto3 support
  • ✅ message, field, enum, optional, required, repeated
  • ✅ import, package, oneof, map, and option
  • ✅ group and extend (in proto2)
  • ✅ service, rpc, and stream
  • ✅ line and block comment preservation

Installation

Install the package via pip:

pip install proto-schema-parser

Usage

To parse a protobuf schema, create a Parser object and call the parse method:

from proto_schema_parser.parser import Parser

text = """
syntax = "proto3";

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}
"""

result = Parser().parse(text)

This will return an AST object (ast.File) representing the parsed protobuf schema.

File(syntax='proto3',
     file_elements=[Message(name='SearchRequest',
                            elements=[Field(name='query',
                                            number=1,
                                            type='string',
                                            cardinality=None,
                                            options=[]),
                                      Field(name='page_number',
                                            number=2,
                                            type='int32',
                                            cardinality=None,
                                            options=[]),
                                      Field(name='result_per_page',
                                            number=3,
                                            type='int32',
                                            cardinality=None,
                                            options=[])])])

To write the AST back to a protobuf schema, create a Generator object and call the generate method:

from proto_schema_parser.generator import Generator

proto = Generator().generate(result)

The proto variable now contains the string:

syntax = "proto3";
message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

Contributing

I welcome contributions!

  • Submit a PR and I'll review it as soon as I can.
  • Open an issue if you find a bug or have a feature request.

License

Protobuf Schema Parser is licensed under the MIT license.

About

A Pure Python Protobuf Parser

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 97.4%
  • ANTLR 2.6%