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.
Install the package via pip:
pip install proto-schema-parser
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;
}
The library also supports protobuf editions, which provide more flexibility than proto2/proto3 syntax:
from proto_schema_parser.parser import Parser
from proto_schema_parser.generator import Generator
# Parse a protobuf file using edition syntax
text = """
edition = "2023";
message SearchRequest {
string query = 1;
int32 page_number = 2;
}
"""
result = Parser().parse(text)
# result.edition will be "2023"
# result.syntax will be None
# Generate back to protobuf format
proto = Generator().generate(result)
Supported editions:
edition = "2023"; - Edition 2023 specedition = "2024"; - Edition 2024 specI welcome contributions!
Protobuf Schema Parser is licensed under the MIT license.
Python
97.9%
ANTLR
2.1%
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.
Install the package via pip:
pip install proto-schema-parser
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;
}
The library also supports protobuf editions, which provide more flexibility than proto2/proto3 syntax:
from proto_schema_parser.parser import Parser
from proto_schema_parser.generator import Generator
# Parse a protobuf file using edition syntax
text = """
edition = "2023";
message SearchRequest {
string query = 1;
int32 page_number = 2;
}
"""
result = Parser().parse(text)
# result.edition will be "2023"
# result.syntax will be None
# Generate back to protobuf format
proto = Generator().generate(result)
Supported editions:
edition = "2023"; - Edition 2023 specedition = "2024"; - Edition 2024 specI welcome contributions!
Protobuf Schema Parser is licensed under the MIT license.
Python
97.9%
ANTLR
2.1%