Skip to content

Commit 0cd8fc4

Browse files
Add .pyi debug symbols to python wheel (opensearch-project#253)
* Migrate top level BUILD.bazel to python_proto_library. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Move py output back to py_library rule and fix deps/protos usage in python_proto_library. Signed-off-by: Finn Carroll <carrofin@amazon.com> * protos mandatory for python_proto_library. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Migrate service/schema python to compile rules for additional flags and options. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Fix imports. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Remove python generation in schema/service - Aggregate all at top level. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Remove py libraries from schema/service dirs - Now aggregated in top level. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Incremental bazelmod for rules-proto-grpc. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Bump bazel -> 7.3.0 for compatibility as well as C++ -> 17. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Refactor python wheel genrule due to libraries aggregated at top level. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Try explicit file names. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Bazel may not allow wildcards in genrules. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Fix path in pywheel genrule. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Include seperate target for .pyi files in genrule deps. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Pass genrule artifacts directly to py_wheel rule. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Rules library to python 3.10. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Follow symlink to fix sed failure. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Add gRPC dependencies back in to wheel with .pyi symbols. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Formatting + comments. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Move to rules_proto_grpc 5.2.0. Still support protobuf 3.x. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Revert bazelmod migration - Move everything back to WORKSPACE and fix genrule paths. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Add protoc genrule to create pyi files and copy into wheel. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Changelog. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Remove unused diff. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Update docker + docs with new py commands. Signed-off-by: Finn Carroll <carrofin@amazon.com> * Combine python schema/service commands in docs/ci/docker. Signed-off-by: Finn Carroll <carrofin@amazon.com> --------- Signed-off-by: Finn Carroll <carrofin@amazon.com>
1 parent 8edbd81 commit 0cd8fc4

7 files changed

Lines changed: 77 additions & 106 deletions

File tree

.github/workflows/build-protobufs-python.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ jobs:
1515
distribution: temurin # Temurin is a distribution of adoptium
1616
java-version: 21
1717
- name: build protobufs python
18-
run: bazel build //:python_protos_all
18+
run: bazel build //:python_schemas //:python_services

BUILD.bazel

Lines changed: 73 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
load("@io_bazel_rules_go//go:def.bzl", "go_library")
22
load("@versioning//:version.bzl", "VERSION")
3+
load("@rules_proto_grpc//python:defs.bzl", "python_proto_library", "python_grpc_library")
4+
load("@rules_python//python:packaging.bzl", "py_wheel")
35

46
package(default_visibility = ["//visibility:public"])
57

6-
load("@rules_python//python:defs.bzl", "py_library")
7-
load("@rules_python//python:packaging.bzl", "py_wheel")
8-
98
java_library(
109
name = "java_protos_all",
1110
visibility = ["//visibility:public"],
@@ -18,18 +17,28 @@ java_library(
1817
],
1918
)
2019

21-
py_library(
22-
name = "python_protos_all",
20+
python_proto_library(
21+
name = "python_schemas",
2322
visibility = ["//visibility:public"],
24-
deps = [
25-
"//protos/schemas:common_python_proto",
26-
"//protos/schemas:document_python_proto",
27-
"//protos/schemas:search_python_proto",
28-
"//protos/services:document_service_python_proto",
29-
"//protos/services:search_service_python_proto",
23+
protos = [
24+
"//protos/schemas:common_proto",
25+
"//protos/schemas:document_proto",
26+
"//protos/schemas:search_proto",
3027
],
3128
)
3229

30+
python_grpc_library(
31+
name = "python_services",
32+
visibility = ["//visibility:public"],
33+
protos = [
34+
"//protos/services:document_service_proto",
35+
"//protos/services:search_service_proto",
36+
],
37+
deps = [
38+
":python_schemas"
39+
]
40+
)
41+
3342
go_library(
3443
name = "go_protos_all",
3544
visibility = ["//visibility:public"],
@@ -44,96 +53,85 @@ go_library(
4453

4554
"""
4655
Package python libraries into a wheel.
47-
Here we seperate schema and service libraries between two py_library definitions and execute
48-
genrules on both to fix the imports. Protoc does not provide a package option for python so we must fix
49-
the import statements in these proto files manually. See issues:
56+
Protoc does not provide a package option for python so we must fix the import statements in these proto files manually:
5057
https://github.com/protocolbuffers/protobuf/issues/7061
5158
https://github.com/protocolbuffers/protobuf/issues/2283
59+
Additionally rules_proto_grpc 4.5.0 (and all pre 5.0.0/bazel mod versions) do not support pyi generation.
60+
To supply debug symbols an additional genrule is needed to compile them manually with protoc.
5261
"""
5362

54-
py_library(
55-
name = "opensearch_protos_schemas",
63+
genrule(
64+
name = "generate_pyi_files",
5665
srcs = [
57-
"//protos/schemas:common_python_proto",
58-
"//protos/schemas:document_python_proto",
59-
"//protos/schemas:search_python_proto",
66+
"//protos/schemas:common.proto",
67+
"//protos/schemas:document.proto",
68+
"//protos/schemas:search.proto",
69+
"//protos/services:document_service.proto",
70+
"//protos/services:search_service.proto",
71+
"@com_google_protobuf//:well_known_type_protos",
6072
],
61-
)
62-
63-
py_library(
64-
name = "opensearch_protos_services",
65-
srcs = [
66-
"//protos/services:document_service_python_proto",
67-
"//protos/services:search_service_python_proto",
73+
outs = [
74+
"python_pyi/schemas/common_pb2.pyi",
75+
"python_pyi/schemas/document_pb2.pyi",
76+
"python_pyi/schemas/search_pb2.pyi",
77+
"python_pyi/services/document_service_pb2.pyi",
78+
"python_pyi/services/search_service_pb2.pyi",
6879
],
69-
deps = [":opensearch_protos_schemas"],
80+
cmd = """
81+
# Use protoc with --pyi_out to generate debug symbols
82+
$(location @com_google_protobuf//:protoc) \
83+
--proto_path=. \
84+
--proto_path=external/com_google_protobuf/src \
85+
--pyi_out=$(RULEDIR) \
86+
protos/schemas/common.proto \
87+
protos/schemas/document.proto \
88+
protos/schemas/search.proto \
89+
protos/services/document_service.proto \
90+
protos/services/search_service.proto
91+
92+
mkdir -p $(RULEDIR)/python_pyi/
93+
mv $(RULEDIR)/protos/schemas $(RULEDIR)/python_pyi
94+
mv $(RULEDIR)/protos/services $(RULEDIR)/python_pyi
95+
""",
96+
tools = ["@com_google_protobuf//:protoc"],
7097
)
7198

7299
genrule(
73-
name = "fix_schemas_imports",
74-
srcs = [":opensearch_protos_schemas"],
100+
name = "fix_python_imports",
101+
srcs = [":python_schemas", ":python_services", ":generate_pyi_files"],
75102
outs = [
76103
"opensearch/protobufs/schemas/common_pb2.py",
104+
"opensearch/protobufs/schemas/common_pb2.pyi",
77105
"opensearch/protobufs/schemas/document_pb2.py",
106+
"opensearch/protobufs/schemas/document_pb2.pyi",
78107
"opensearch/protobufs/schemas/search_pb2.py",
79-
"opensearch/protobufs/schemas/__init__.py",
80-
],
81-
cmd = """
82-
mkdir -p $(RULEDIR)/opensearch/protobufs/schemas
83-
84-
for pb in common document search; do
85-
cp $(BINDIR)/protos/schemas/$${pb}_python_proto_pb/protos/schemas/$${pb}_pb2.py $(RULEDIR)/opensearch/protobufs/schemas/
86-
sed -i \
87-
-e 's/from protos\\.schemas import \\([^_ ]\\+\\)_pb2 as protos_dot_schemas_dot_\\1__pb2/from opensearch.protobufs.schemas import \\1_pb2/g' \
88-
$(RULEDIR)/opensearch/protobufs/schemas/$${pb}_pb2.py
89-
done
90-
91-
touch $(RULEDIR)/opensearch/protobufs/schemas/__init__.py
92-
""",
93-
)
94-
95-
genrule(
96-
name = "fix_services_imports",
97-
srcs = [":opensearch_protos_services"],
98-
outs = [
108+
"opensearch/protobufs/schemas/search_pb2.pyi",
99109
"opensearch/protobufs/services/document_service_pb2.py",
110+
"opensearch/protobufs/services/document_service_pb2.pyi",
100111
"opensearch/protobufs/services/document_service_pb2_grpc.py",
101112
"opensearch/protobufs/services/search_service_pb2.py",
113+
"opensearch/protobufs/services/search_service_pb2.pyi",
102114
"opensearch/protobufs/services/search_service_pb2_grpc.py",
115+
"opensearch/protobufs/schemas/__init__.py",
103116
"opensearch/protobufs/services/__init__.py",
104117
],
105118
cmd = """
106-
mkdir -p $(RULEDIR)/opensearch/protobufs/services
119+
mkdir -p $(RULEDIR)/opensearch/protobufs/
120+
121+
cp -rL $(BINDIR)/python_schemas_pb/protos/schemas $(RULEDIR)/opensearch/protobufs
122+
cp -rL $(BINDIR)/python_services_pb/protos/services $(RULEDIR)/opensearch/protobufs
107123
108-
for pb in document_service search_service; do
109-
cp $(BINDIR)/protos/services/$${pb}_python_proto_pb/protos/services/$${pb}_pb2.py $(RULEDIR)/opensearch/protobufs/services/
110-
cp $(BINDIR)/protos/services/$${pb}_python_proto_pb/protos/services/$${pb}_pb2_grpc.py $(RULEDIR)/opensearch/protobufs/services/
111-
112-
# Fix imports in both pb2 and pb2_grpc files
113-
sed -i \
114-
-e 's/from protos\\.schemas import/from opensearch.protobufs.schemas import/g' \
115-
$(RULEDIR)/opensearch/protobufs/services/$${pb}_pb2*.py
116-
done
124+
cp -rL $(BINDIR)/python_pyi/schemas $(RULEDIR)/opensearch/protobufs
125+
cp -rL $(BINDIR)/python_pyi/services $(RULEDIR)/opensearch/protobufs
117126
127+
# Find and replace "from protos" with "from opensearch.protobufs" in all files
128+
find $(RULEDIR)/opensearch/protobufs/ -type f -exec sed -i 's/from protos/from opensearch.protobufs/g' {} +
129+
130+
touch $(RULEDIR)/opensearch/protobufs/schemas/__init__.py
118131
touch $(RULEDIR)/opensearch/protobufs/services/__init__.py
119132
""",
120133
)
121134

122-
py_library(
123-
name = "fixed_schemas",
124-
srcs = [":fix_schemas_imports"],
125-
imports = ["."],
126-
visibility = ["//visibility:public"],
127-
)
128-
129-
py_library(
130-
name = "fixed_services",
131-
srcs = [":fix_services_imports"],
132-
imports = ["."],
133-
deps = [":fixed_schemas"],
134-
visibility = ["//visibility:public"],
135-
)
136-
137135
py_wheel(
138136
name = "opensearch_protos_wheel",
139137
distribution = "opensearch-protobufs",
@@ -159,7 +157,6 @@ py_wheel(
159157
platform = "any",
160158
python_requires = ">=3.10",
161159
deps = [
162-
":fixed_schemas",
163-
":fixed_services",
160+
":fix_python_imports",
164161
],
165162
)

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
44

55
## [Unreleased]
66
### Added
7+
- Add .pyi type hints to the python wheel ([#253](https://github.com/opensearch-project/opensearch-protobufs/pull/253))
78

89
### Changed
910

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ RUN ./gradlew :plugins:transport-grpc:internalClusterTest -Drepos.mavenLocal
9090

9191
FROM build-bazel AS build-bazel-python
9292

93-
RUN bazel build //:python_protos_all
93+
RUN bazel build //:python_schemas //:python_services
9494

9595
FROM build-bazel-python AS package-bazel-python
9696

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Generate protobuf libraries for your preferred language:
1717
bazel build //:java_protos_all
1818

1919
# Python
20-
bazel build //:python_protos_all
20+
bazel build //:python_schemas //:python_services
2121

2222
# Go
2323
bazel build //:go_protos_all

protos/schemas/BUILD.bazel

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# protos/schemas/BUILD.bazel
22
load("@rules_proto//proto:defs.bzl", "proto_library")
33
load("@rules_proto_grpc//java:defs.bzl", "java_proto_library")
4-
load("@rules_proto_grpc//python:defs.bzl", "python_proto_library")
54
load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
65

76
package(default_visibility = ["//visibility:public"])
@@ -47,21 +46,6 @@ java_proto_library(
4746
deps = [":common_java_proto"],
4847
)
4948

50-
python_proto_library(
51-
name = "common_python_proto",
52-
protos = [":common_proto"],
53-
)
54-
55-
python_proto_library(
56-
name = "document_python_proto",
57-
protos = [":document_proto"],
58-
)
59-
60-
python_proto_library(
61-
name = "search_python_proto",
62-
protos = [":search_proto"],
63-
)
64-
6549
go_proto_library(
6650
name = "common_go_proto",
6751
protos = [":common_proto"],

protos/services/BUILD.bazel

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# protos/services/BUILD.bazel
22
load("@rules_proto//proto:defs.bzl", "proto_library")
33
load("@rules_proto_grpc//java:defs.bzl", "java_grpc_library")
4-
load("@rules_proto_grpc//python:defs.bzl", "python_grpc_library")
54
load("@io_bazel_rules_go//proto:def.bzl", "go_grpc_library")
65

76
package(default_visibility = ["//visibility:public"])
@@ -30,16 +29,6 @@ java_grpc_library(
3029
deps = ["//protos/schemas:search_java_proto"],
3130
)
3231

33-
python_grpc_library(
34-
name = "document_service_python_proto",
35-
protos = [":document_service_proto"],
36-
)
37-
38-
python_grpc_library(
39-
name = "search_service_python_proto",
40-
protos = [":search_service_proto"],
41-
)
42-
4332
go_grpc_library(
4433
name = "document_service_go_proto",
4534
protos = [":document_service_proto"],

0 commit comments

Comments
 (0)