@@ -17,6 +17,13 @@ _PyProtoInfo = provider(
17
17
(depset[File]) Files from the transitive closure implicit proto
18
18
dependencies""",
19
19
"transitive_sources": """(depset[File]) The Python sources.""",
20
+
"direct_pyi_files": """
21
+
(depset[File]) Type definition files (usually `.pyi` files)
22
+
for the Python modules provided by this target.""",
23
+
"transitive_pyi_files": """
24
+
(depset[File]) The transitive set of type definition files
25
+
(usually `.pyi` files) for the Python modules for this target
26
+
and its transitive dependencies.""",
20
27
},
21
28
)
22
29
@@ -61,6 +68,7 @@ def _py_proto_aspect_impl(target, ctx):
61
68
api_deps = [proto_lang_toolchain_info.runtime]
62
69
63
70
generated_sources = []
71
+
generated_stubs = []
64
72
proto_info = target[ProtoInfo]
65
73
proto_root = proto_info.proto_source_root
66
74
if proto_info.direct_sources:
@@ -72,6 +80,14 @@ def _py_proto_aspect_impl(target, ctx):
72
80
name_mapper = lambda name: name.replace("-", "_").replace(".", "/"),
73
81
)
74
82
83
+
# Generate pyi files
84
+
generated_stubs = proto_common.declare_generated_files(
85
+
actions = ctx.actions,
86
+
proto_info = proto_info,
87
+
extension = "_pb2.pyi",
88
+
name_mapper = lambda name: name.replace("-", "_").replace(".", "/"),
89
+
)
90
+
75
91
# Handles multiple repository and virtual import cases
76
92
if proto_root.startswith(ctx.bin_dir.path):
77
93
proto_root = proto_root[len(ctx.bin_dir.path) + 1:]
@@ -84,12 +100,17 @@ def _py_proto_aspect_impl(target, ctx):
84
100
else:
85
101
proto_root = ctx.workspace_name + "/" + proto_root
86
102
103
+
additional_args = ctx.actions.args()
104
+
if generated_stubs:
105
+
additional_args.add(plugin_output, format = "--pyi_out=%s")
106
+
87
107
proto_common.compile(
88
108
actions = ctx.actions,
89
109
proto_info = proto_info,
90
110
proto_lang_toolchain_info = proto_lang_toolchain_info,
91
-
generated_files = generated_sources,
111
+
generated_files = generated_sources + generated_stubs,
92
112
plugin_output = plugin_output,
113
+
additional_args = additional_args,
93
114
)
94
115
95
116
# Generated sources == Python sources
@@ -104,6 +125,13 @@ def _py_proto_aspect_impl(target, ctx):
104
125
direct = python_sources,
105
126
transitive = [dep.transitive_sources for dep in deps],
106
127
)
128
+
direct_pyi_files = depset(
129
+
direct = generated_stubs,
130
+
)
131
+
transitive_pyi_files = depset(
132
+
direct = generated_stubs,
133
+
transitive = [dep.transitive_pyi_files for dep in deps],
134
+
)
107
135
108
136
return [
109
137
_PyProtoInfo(
@@ -119,6 +147,8 @@ def _py_proto_aspect_impl(target, ctx):
119
147
),
120
148
runfiles_from_proto_deps = runfiles_from_proto_deps,
121
149
transitive_sources = transitive_sources,
150
+
direct_pyi_files = direct_pyi_files,
151
+
transitive_pyi_files = transitive_pyi_files,
122
152
),
123
153
]
124
154
@@ -150,6 +180,13 @@ def _py_proto_library_rule(ctx):
150
180
default_outputs = depset(
151
181
transitive = [info.transitive_sources for info in pyproto_infos],
152
182
)
183
+
direct_pyi_files = []
184
+
for info in pyproto_infos:
185
+
direct_pyi_files.extend(info.direct_pyi_files.to_list())
186
+
transitive_pyi_files = depset(
187
+
direct = direct_pyi_files,
188
+
transitive = [info.transitive_pyi_files for info in pyproto_infos],
189
+
)
153
190
154
191
return [
155
192
DefaultInfo(
@@ -166,6 +203,8 @@ def _py_proto_library_rule(ctx):
166
203
PyInfo(
167
204
transitive_sources = default_outputs,
168
205
imports = depset(transitive = [info.imports for info in pyproto_infos]),
206
+
direct_pyi_files = depset(direct = direct_pyi_files),
207
+
transitive_pyi_files = transitive_pyi_files,
169
208
# Proto always produces 2- and 3- compatible source files
170
209
has_py2_only_sources = False,
171
210
has_py3_only_sources = False,
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4