Skip to content
This repository was archived by the owner on Jun 9, 2025. It is now read-only.

Commit 2c988e5

Browse files
committed
Redefine method definition for sync stubs
1 parent a5256e2 commit 2c988e5

File tree

4 files changed

+77
-18
lines changed

4 files changed

+77
-18
lines changed

src/betterproto2_compiler/plugin/typing_compiler.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ def async_iterable(self, type_: str) -> str:
3737
def async_iterator(self, type_: str) -> str:
3838
raise NotImplementedError
3939

40+
@abc.abstractmethod
41+
def sync_iterable(self, type_: str) -> str:
42+
raise NotImplementedError
43+
44+
@abc.abstractmethod
45+
def sync_iterator(self, type_: str) -> str:
46+
raise NotImplementedError
47+
4048
@abc.abstractmethod
4149
def imports(self) -> builtins.dict[str, set[str] | None]:
4250
"""
@@ -89,6 +97,14 @@ def async_iterator(self, type_: str) -> str:
8997
self._imports["typing"].add("AsyncIterator")
9098
return f"AsyncIterator[{type_}]"
9199

100+
def sync_iterable(self, type_: str) -> str:
101+
self._imports["typing"].add("Iterable")
102+
return f"Iterable[{type_}]"
103+
104+
def sync_iterator(self, type_: str) -> str:
105+
self._imports["typing"].add("Iterator")
106+
return f"Iterator[{type_}]"
107+
92108
def imports(self) -> builtins.dict[str, set[str] | None]:
93109
return {k: v if v else None for k, v in self._imports.items()}
94110

@@ -124,6 +140,14 @@ def async_iterable(self, type_: str) -> str:
124140
def async_iterator(self, type_: str) -> str:
125141
self._imported = True
126142
return f"typing.AsyncIterator[{type_}]"
143+
144+
def sync_iterable(self, type_: str) -> str:
145+
self._imported = True
146+
return f"typing.Iterable[{type_}]"
147+
148+
def sync_iterator(self, type_: str) -> str:
149+
self._imported = True
150+
return f"typing.Iterator[{type_}]"
127151

128152
def imports(self) -> builtins.dict[str, set[str] | None]:
129153
if self._imported:
@@ -159,5 +183,13 @@ def async_iterator(self, type_: str) -> str:
159183
self._imports["collections.abc"].add("AsyncIterator")
160184
return f"AsyncIterator[{type_}]"
161185

186+
def async_iterable(self, type_: str) -> str:
187+
self._imports["collections.abc"].add("Iterable")
188+
return f"Iterable[{type_}]"
189+
190+
def async_iterator(self, type_: str) -> str:
191+
self._imports["collections.abc"].add("Iterator")
192+
return f"Iterator[{type_}]"
193+
162194
def imports(self) -> builtins.dict[str, set[str] | None]:
163195
return {k: v if v else None for k, v in self._imports.items()}

src/betterproto2_compiler/templates/service_stub.py.j2

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,7 @@ class {% block class_name %}{% endblock %}({% block inherit_from %}{% endblock %
1010
{% block class_content %}{% endblock %}
1111

1212
{% for method in service.methods %}
13-
async def {{ method.py_name }}(self
14-
{%- if not method.client_streaming -%}
15-
, {{ method.py_input_message_param }}:
16-
{%- if method.is_input_msg_empty -%}
17-
"{{ method.py_input_message_type }} | None" = None
18-
{%- else -%}
19-
"{{ method.py_input_message_type }}"
20-
{%- endif -%}
21-
{%- else -%}
22-
{# Client streaming: need a request iterator instead #}
23-
, {{ method.py_input_message_param }}_iterator: "{{ output_file.typing_compiler.union(output_file.typing_compiler.async_iterable(method.py_input_message_type), output_file.typing_compiler.iterable(method.py_input_message_type)) }}"
24-
{%- endif -%}
25-
,
26-
*
27-
, timeout: {{ output_file.typing_compiler.optional("float") }} = None
28-
, deadline: "{{ output_file.typing_compiler.optional("Deadline") }}" = None
29-
, metadata: "{{ output_file.typing_compiler.optional("MetadataLike") }}" = None
30-
) -> "{% if method.server_streaming %}{{ output_file.typing_compiler.async_iterator(method.py_output_message_type ) }}{% else %}{{ method.py_output_message_type }}{% endif %}":
13+
{% block method_definition scoped required %}{% endblock %}
3114
{% if method.comment %}
3215
"""
3316
{{ method.comment | indent(8) }}

src/betterproto2_compiler/templates/service_stub_async.py.j2

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,25 @@
33
{# Class definition #}
44
{% block class_name %}{{ service.py_name }}Stub{% endblock %}
55
{% block inherit_from %}betterproto2.ServiceStub{% endblock %}
6+
7+
{# Methods definition #}
8+
{% block method_definition %}
9+
async def {{ method.py_name }}(self
10+
{%- if not method.client_streaming -%}
11+
, {{ method.py_input_message_param }}:
12+
{%- if method.is_input_msg_empty -%}
13+
"{{ method.py_input_message_type }} | None" = None
14+
{%- else -%}
15+
"{{ method.py_input_message_type }}"
16+
{%- endif -%}
17+
{%- else -%}
18+
{# Client streaming: need a request iterator instead #}
19+
, {{ method.py_input_message_param }}_iterator: "{{ output_file.typing_compiler.union(output_file.typing_compiler.async_iterable(method.py_input_message_type), output_file.typing_compiler.iterable(method.py_input_message_type)) }}"
20+
{%- endif -%}
21+
,
22+
*
23+
, timeout: {{ output_file.typing_compiler.optional("float") }} = None
24+
, deadline: "{{ output_file.typing_compiler.optional("Deadline") }}" = None
25+
, metadata: "{{ output_file.typing_compiler.optional("MetadataLike") }}" = None
26+
) -> "{% if method.server_streaming %}{{ output_file.typing_compiler.async_iterator(method.py_output_message_type ) }}{% else %}{{ method.py_output_message_type }}{% endif %}":
27+
{% endblock %}

src/betterproto2_compiler/templates/service_stub_sync.py.j2

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,25 @@
88
def __init__(self, channel: grpc.Channel):
99
self._channel = channel
1010
{% endblock %}
11+
12+
{# Methods definition #}
13+
{% block method_definition %}
14+
def {{ method.py_name }}(self
15+
{%- if not method.client_streaming -%}
16+
, {{ method.py_input_message_param }}:
17+
{%- if method.is_input_msg_empty -%}
18+
"{{ method.py_input_message_type }} | None" = None
19+
{%- else -%}
20+
"{{ method.py_input_message_type }}"
21+
{%- endif -%}
22+
{%- else -%}
23+
{# Client streaming: need a request iterator instead #}
24+
, {{ method.py_input_message_param }}_iterator: "{{ output_file.typing_compiler.iterable(method.py_input_message_type) }}"
25+
{%- endif -%}
26+
,
27+
*
28+
, timeout: {{ output_file.typing_compiler.optional("float") }} = None
29+
, deadline: "{{ output_file.typing_compiler.optional("Deadline") }}" = None
30+
, metadata: "{{ output_file.typing_compiler.optional("MetadataLike") }}" = None
31+
) -> "{% if method.server_streaming %}{{ output_file.typing_compiler.sync_iterator(method.py_output_message_type ) }}{% else %}{{ method.py_output_message_type }}{% endif %}":
32+
{% endblock %}

0 commit comments

Comments
 (0)