Skip to content

Commit 02a974c

Browse files
authored
Modularize gen-protos script (#465)
1 parent 4904054 commit 02a974c

File tree

1 file changed

+65
-56
lines changed

1 file changed

+65
-56
lines changed

scripts/gen_protos.py

Lines changed: 65 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,16 @@ def fix_generated_output(base_path: Path):
118118
f.write("except ImportError:\n pass")
119119

120120

121-
if __name__ == "__main__":
122-
# Due to issues with the Python protobuf 3.x vs protobuf 4.x libraries, we
123-
# must require that grpcio tools be on 1.48.x and protobuf be on 3.x for
124-
# generation of protos. We can't check __version__ on the module (not
125-
# present), and we can't use importlib.metadata due to its absence in 3.7,
126-
# so we just run pip and check there.
121+
def check_proto_toolchain_versions():
122+
"""
123+
Check protobuf and grpcio versions.
124+
125+
Due to issues with the Python protobuf 3.x vs protobuf 4.x libraries, we
126+
must require that grpcio tools be on 1.48.x and protobuf be on 3.x for
127+
generation of protos. We can't check __version__ on the module (not
128+
present), and we can't use importlib.metadata due to its absence in 3.7,
129+
so we just run pip and check there.
130+
"""
127131
proc = subprocess.run(
128132
["pip", "list", "--format", "freeze"],
129133
check=True,
@@ -144,56 +148,61 @@ def fix_generated_output(base_path: Path):
144148
"1.48."
145149
), f"expected 1.48.x grpcio-tools, found {grpcio_tools_version}"
146150

147-
print("Generating protos...", file=sys.stderr)
148-
with tempfile.TemporaryDirectory(dir=base_dir) as temp_dir_raw:
149-
temp_dir = Path(temp_dir_raw)
150-
subprocess.check_call(
151-
[
152-
sys.executable,
153-
"-mgrpc_tools.protoc",
154-
f"--proto_path={api_proto_dir}",
155-
f"--proto_path={core_proto_dir}",
156-
f"--proto_path={testsrv_proto_dir}",
157-
f"--proto_path={health_proto_dir}",
158-
f"--proto_path={test_proto_dir}",
159-
f"--proto_path={additional_proto_dir}",
160-
f"--python_out={temp_dir}",
161-
f"--grpc_python_out={temp_dir}",
162-
f"--mypy_out={temp_dir}",
163-
f"--mypy_grpc_out={temp_dir}",
164-
*map(str, proto_paths),
165-
]
151+
152+
def generate_protos(output_dir: Path):
153+
subprocess.check_call(
154+
[
155+
sys.executable,
156+
"-mgrpc_tools.protoc",
157+
f"--proto_path={api_proto_dir}",
158+
f"--proto_path={core_proto_dir}",
159+
f"--proto_path={testsrv_proto_dir}",
160+
f"--proto_path={health_proto_dir}",
161+
f"--proto_path={test_proto_dir}",
162+
f"--proto_path={additional_proto_dir}",
163+
f"--python_out={output_dir}",
164+
f"--grpc_python_out={output_dir}",
165+
f"--mypy_out={output_dir}",
166+
f"--mypy_grpc_out={output_dir}",
167+
*map(str, proto_paths),
168+
]
169+
)
170+
# Remove every _grpc.py file that isn't part of a Temporal "service"
171+
for grpc_file in output_dir.glob("**/*_grpc.py*"):
172+
if (
173+
len(grpc_file.parents) < 2
174+
or grpc_file.parents[0].name != "v1"
175+
or not grpc_file.parents[1].name.endswith("service")
176+
):
177+
grpc_file.unlink()
178+
# Apply fixes before moving code
179+
fix_generated_output(output_dir)
180+
# Move protos
181+
for p in (output_dir / "temporal" / "api").iterdir():
182+
shutil.rmtree(api_out_dir / p.name, ignore_errors=True)
183+
p.replace(api_out_dir / p.name)
184+
shutil.rmtree(api_out_dir / "dependencies", ignore_errors=True)
185+
for p in (output_dir / "temporal" / "sdk" / "core").iterdir():
186+
shutil.rmtree(sdk_out_dir / p.name, ignore_errors=True)
187+
p.replace(sdk_out_dir / p.name)
188+
shutil.rmtree(sdk_out_dir / "health", ignore_errors=True)
189+
(output_dir / "health").replace(sdk_out_dir / "health")
190+
# Move test protos
191+
for v in ["__init__.py", "proto_message_pb2.py", "proto_message_pb2.pyi"]:
192+
shutil.copy2(
193+
output_dir / "worker" / "workflow_sandbox" / "testmodules" / "proto" / v,
194+
test_proto_dir
195+
/ "worker"
196+
/ "workflow_sandbox"
197+
/ "testmodules"
198+
/ "proto"
199+
/ v,
166200
)
167-
# Remove every _grpc.py file that isn't part of a Temporal "service"
168-
for grpc_file in temp_dir.glob("**/*_grpc.py*"):
169-
if (
170-
len(grpc_file.parents) < 2
171-
or grpc_file.parents[0].name != "v1"
172-
or not grpc_file.parents[1].name.endswith("service")
173-
):
174-
grpc_file.unlink()
175-
# Apply fixes before moving code
176-
fix_generated_output(temp_dir)
177-
# Move protos
178-
for p in (temp_dir / "temporal" / "api").iterdir():
179-
shutil.rmtree(api_out_dir / p.name, ignore_errors=True)
180-
p.replace(api_out_dir / p.name)
181-
shutil.rmtree(api_out_dir / "dependencies", ignore_errors=True)
182-
for p in (temp_dir / "temporal" / "sdk" / "core").iterdir():
183-
shutil.rmtree(sdk_out_dir / p.name, ignore_errors=True)
184-
p.replace(sdk_out_dir / p.name)
185-
shutil.rmtree(sdk_out_dir / "health", ignore_errors=True)
186-
(temp_dir / "health").replace(sdk_out_dir / "health")
187-
# Move test protos
188-
for v in ["__init__.py", "proto_message_pb2.py", "proto_message_pb2.pyi"]:
189-
shutil.copy2(
190-
temp_dir / "worker" / "workflow_sandbox" / "testmodules" / "proto" / v,
191-
test_proto_dir
192-
/ "worker"
193-
/ "workflow_sandbox"
194-
/ "testmodules"
195-
/ "proto"
196-
/ v,
197-
)
198201

202+
203+
if __name__ == "__main__":
204+
check_proto_toolchain_versions()
205+
print("Generating protos...", file=sys.stderr)
206+
with tempfile.TemporaryDirectory(dir=base_dir) as temp_dir:
207+
generate_protos(Path(temp_dir))
199208
print("Done", file=sys.stderr)

0 commit comments

Comments
 (0)