Skip to content

Commit c93351e

Browse files
authored
Factor code template compilation out into a separate module
1 parent 80bef7c commit c93351e

File tree

3 files changed

+55
-29
lines changed

3 files changed

+55
-29
lines changed

src/betterproto/plugin/compiler.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import os.path
2+
3+
try:
4+
# betterproto[compiler] specific dependencies
5+
import black
6+
import jinja2
7+
except ImportError as err:
8+
missing_import = err.args[0][17:-1]
9+
print(
10+
"\033[31m"
11+
f"Unable to import `{missing_import}` from betterproto plugin! "
12+
"Please ensure that you've installed betterproto as "
13+
'`pip install "betterproto[compiler]"` so that compiler dependencies '
14+
"are included."
15+
"\033[0m"
16+
)
17+
raise SystemExit(1)
18+
19+
from betterproto.plugin.models import OutputTemplate
20+
21+
22+
def outputfile_compiler(output_file: OutputTemplate) -> str:
23+
24+
templates_folder = os.path.abspath(
25+
os.path.join(os.path.dirname(__file__), "..", "templates")
26+
)
27+
28+
env = jinja2.Environment(
29+
trim_blocks=True,
30+
lstrip_blocks=True,
31+
loader=jinja2.FileSystemLoader(templates_folder),
32+
)
33+
template = env.get_template("template.py.j2")
34+
35+
res = black.format_str(
36+
template.render(output_file=output_file),
37+
mode=black.FileMode(target_versions={black.TargetVersion.PY37}),
38+
)
39+
40+
return res

src/betterproto/plugin/parser.py

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
import itertools
2-
import os.path
32
import pathlib
43
import sys
54
from typing import List, Iterator
65

76
try:
87
# betterproto[compiler] specific dependencies
9-
import black
108
from google.protobuf.compiler import plugin_pb2 as plugin
119
from google.protobuf.descriptor_pb2 import (
1210
DescriptorProto,
1311
EnumDescriptorProto,
1412
FieldDescriptorProto,
1513
ServiceDescriptorProto,
1614
)
17-
import jinja2
1815
except ImportError as err:
1916
missing_import = err.args[0][17:-1]
2017
print(
@@ -41,6 +38,8 @@
4138
is_oneof,
4239
)
4340

41+
from betterproto.plugin.compiler import outputfile_compiler
42+
4443

4544
def traverse(proto_file: FieldDescriptorProto) -> Iterator:
4645
# Todo: Keep information about nested hierarchy
@@ -70,16 +69,6 @@ def generate_code(
7069
) -> None:
7170
plugin_options = request.parameter.split(",") if request.parameter else []
7271

73-
templates_folder = os.path.abspath(
74-
os.path.join(os.path.dirname(__file__), "..", "templates")
75-
)
76-
77-
env = jinja2.Environment(
78-
trim_blocks=True,
79-
lstrip_blocks=True,
80-
loader=jinja2.FileSystemLoader(templates_folder),
81-
)
82-
template = env.get_template("template.py.j2")
8372
request_data = PluginRequestCompiler(plugin_request_obj=request)
8473
# Gather output packages
8574
for proto_file in request.proto_file:
@@ -116,7 +105,7 @@ def generate_code(
116105

117106
# Generate output files
118107
output_paths: pathlib.Path = set()
119-
for output_package_name, template_data in request_data.output_packages.items():
108+
for output_package_name, output_package in request_data.output_packages.items():
120109

121110
# Add files to the response object
122111
output_path = pathlib.Path(*output_package_name.split("."), "__init__.py")
@@ -126,10 +115,7 @@ def generate_code(
126115
f.name: str = str(output_path)
127116

128117
# Render and then format the output file
129-
f.content: str = black.format_str(
130-
template.render(description=template_data),
131-
mode=black.FileMode(target_versions={black.TargetVersion.PY37}),
132-
)
118+
f.content: str = outputfile_compiler(output_file=output_package)
133119

134120
# Make each output directory a package with __init__ file
135121
init_files = (

src/betterproto/templates/template.py.j2

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
# Generated by the protocol buffer compiler. DO NOT EDIT!
2-
# sources: {{ ', '.join(description.input_filenames) }}
2+
# sources: {{ ', '.join(output_file.input_filenames) }}
33
# plugin: python-betterproto
4-
{% for i in description.python_module_imports|sort %}
4+
{% for i in output_file.python_module_imports|sort %}
55
import {{ i }}
66
{% endfor %}
77
from dataclasses import dataclass
8-
{% if description.datetime_imports %}
9-
from datetime import {% for i in description.datetime_imports|sort %}{{ i }}{% if not loop.last %}, {% endif %}{% endfor %}
8+
{% if output_file.datetime_imports %}
9+
from datetime import {% for i in output_file.datetime_imports|sort %}{{ i }}{% if not loop.last %}, {% endif %}{% endfor %}
1010

1111
{% endif%}
12-
{% if description.typing_imports %}
13-
from typing import {% for i in description.typing_imports|sort %}{{ i }}{% if not loop.last %}, {% endif %}{% endfor %}
12+
{% if output_file.typing_imports %}
13+
from typing import {% for i in output_file.typing_imports|sort %}{{ i }}{% if not loop.last %}, {% endif %}{% endfor %}
1414

1515
{% endif %}
1616

1717
import betterproto
18-
{% if description.services %}
18+
{% if output_file.services %}
1919
import grpclib
2020
{% endif %}
2121

2222

23-
{% if description.enums %}{% for enum in description.enums %}
23+
{% if output_file.enums %}{% for enum in output_file.enums %}
2424
class {{ enum.py_name }}(betterproto.Enum):
2525
{% if enum.comment %}
2626
{{ enum.comment }}
@@ -36,7 +36,7 @@ class {{ enum.py_name }}(betterproto.Enum):
3636

3737
{% endfor %}
3838
{% endif %}
39-
{% for message in description.messages %}
39+
{% for message in output_file.messages %}
4040
@dataclass
4141
class {{ message.py_name }}(betterproto.Message):
4242
{% if message.comment %}
@@ -67,7 +67,7 @@ class {{ message.py_name }}(betterproto.Message):
6767

6868

6969
{% endfor %}
70-
{% for service in description.services %}
70+
{% for service in output_file.services %}
7171
class {{ service.py_name }}Stub(betterproto.ServiceStub):
7272
{% if service.comment %}
7373
{{ service.comment }}
@@ -154,6 +154,6 @@ class {{ service.py_name }}Stub(betterproto.ServiceStub):
154154
{% endfor %}
155155
{% endfor %}
156156

157-
{% for i in description.imports|sort %}
157+
{% for i in output_file.imports|sort %}
158158
{{ i }}
159159
{% endfor %}

0 commit comments

Comments
 (0)