From c0f15439c6983fd1018077a0da862bf1fa4cdf26 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:21:50 +0000 Subject: [PATCH 01/21] Add test using google/protobuf/empty.proto Co-Authored-By: Hazumi Ichijo --- .github/workflows/example.yml | 5 + e2etest/dummyserver/echo.pb.go | 94 +++++++++++++++---- e2etest/dummyserver/echo.proto | 7 ++ e2etest/dummyserver/echo_grpc.pb.go | 43 ++++++++- e2etest/dummyserver/runner.go | 22 +++++ e2etest/testdata/test.ct | 7 ++ example/multiple_package/protos/one/one.proto | 3 + rerost/giro/hosts.pb.go | 16 ++-- rerost/giro/hosts_grpc.pb.go | 2 +- 9 files changed, 172 insertions(+), 27 deletions(-) diff --git a/.github/workflows/example.yml b/.github/workflows/example.yml index 294c899..501b7d6 100644 --- a/.github/workflows/example.yml +++ b/.github/workflows/example.yml @@ -46,6 +46,11 @@ jobs: time echo "{\"message\":\"test\"}" > call_expect.txt time go run cmd/giro/main.go call --rpc-server=localhost:5001 example.multiple_package.protos.one.GiroService/GiroTest1 '{"message": "test"}' > call_result.txt time diff call_result.txt call_expect.txt + + echo "check empty call" + time echo "{}" > empty_call_expect.txt + time go run cmd/giro/main.go call --rpc-server=localhost:5001 example.multiple_package.protos.one.GiroService/GiroEmptyTest '{}' > empty_call_result.txt + time diff empty_call_result.txt empty_call_expect.txt check_make_protoc: runs-on: ubuntu-latest diff --git a/e2etest/dummyserver/echo.pb.go b/e2etest/dummyserver/echo.pb.go index 802f2ae..7a44167 100644 --- a/e2etest/dummyserver/echo.pb.go +++ b/e2etest/dummyserver/echo.pb.go @@ -1,12 +1,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v5.29.4 +// protoc v3.12.4 // source: e2etest/dummyserver/echo.proto package dummyserver import ( + empty "github.com/golang/protobuf/ptypes/empty" _ "github.com/rerost/giro/rerost/giro" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -207,11 +208,63 @@ func (x *EchoResponse) GetMetadata() *Metadata { return nil } +type EmptyResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EmptyResponse) Reset() { + *x = EmptyResponse{} + mi := &file_e2etest_dummyserver_echo_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EmptyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EmptyResponse) ProtoMessage() {} + +func (x *EmptyResponse) ProtoReflect() protoreflect.Message { + mi := &file_e2etest_dummyserver_echo_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EmptyResponse.ProtoReflect.Descriptor instead. +func (*EmptyResponse) Descriptor() ([]byte, []int) { + return file_e2etest_dummyserver_echo_proto_rawDescGZIP(), []int{4} +} + +func (x *EmptyResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *EmptyResponse) GetMetadata() *Metadata { + if x != nil { + return x.Metadata + } + return nil +} + var File_e2etest_dummyserver_echo_proto protoreflect.FileDescriptor const file_e2etest_dummyserver_echo_proto_rawDesc = "" + "\n" + - "\x1ee2etest/dummyserver/echo.proto\x12\x0ererost.giro.v1\x1a\x17rerost/giro/hosts.proto\"%\n" + + "\x1ee2etest/dummyserver/echo.proto\x12\x0ererost.giro.v1\x1a\x17rerost/giro/hosts.proto\x1a\x1bgoogle/protobuf/empty.proto\"%\n" + "\rMetadataValue\x12\x14\n" + "\x05value\x18\x01 \x03(\tR\x05value\"\xaa\x01\n" + "\bMetadata\x12B\n" + @@ -223,9 +276,13 @@ const file_e2etest_dummyserver_echo_proto_rawDesc = "" + "\amessage\x18\x01 \x01(\tR\amessage\"^\n" + "\fEchoResponse\x12\x18\n" + "\amessage\x18\x01 \x01(\tR\amessage\x124\n" + - "\bmetadata\x18\x02 \x01(\v2\x18.rerost.giro.v1.MetadataR\bmetadata2h\n" + + "\bmetadata\x18\x02 \x01(\v2\x18.rerost.giro.v1.MetadataR\bmetadata\"]\n" + + "\rEmptyResponse\x12\x16\n" + + "\x06status\x18\x01 \x01(\tR\x06status\x124\n" + + "\bmetadata\x18\x02 \x01(\v2\x18.rerost.giro.v1.MetadataR\bmetadata2\xae\x01\n" + "\vTestService\x12C\n" + - "\x04Echo\x12\x1b.rerost.giro.v1.EchoRequest\x1a\x1c.rerost.giro.v1.EchoResponse\"\x00\x1a\x14\x82\xb5\x18\x10R\x0elocalhost:5000B8Z6github.com/rerost/giro/e2etest/dummyserver;dummyserverb\x06proto3" + "\x04Echo\x12\x1b.rerost.giro.v1.EchoRequest\x1a\x1c.rerost.giro.v1.EchoResponse\"\x00\x12D\n" + + "\tEmptyCall\x12\x16.google.protobuf.Empty\x1a\x1d.rerost.giro.v1.EmptyResponse\"\x00\x1a\x14\x82\xb5\x18\x10R\x0elocalhost:5000B8Z6github.com/rerost/giro/e2etest/dummyserver;dummyserverb\x06proto3" var ( file_e2etest_dummyserver_echo_proto_rawDescOnce sync.Once @@ -239,25 +296,30 @@ func file_e2etest_dummyserver_echo_proto_rawDescGZIP() []byte { return file_e2etest_dummyserver_echo_proto_rawDescData } -var file_e2etest_dummyserver_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_e2etest_dummyserver_echo_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_e2etest_dummyserver_echo_proto_goTypes = []any{ (*MetadataValue)(nil), // 0: rerost.giro.v1.MetadataValue (*Metadata)(nil), // 1: rerost.giro.v1.Metadata (*EchoRequest)(nil), // 2: rerost.giro.v1.EchoRequest (*EchoResponse)(nil), // 3: rerost.giro.v1.EchoResponse - nil, // 4: rerost.giro.v1.Metadata.MetadataEntry + (*EmptyResponse)(nil), // 4: rerost.giro.v1.EmptyResponse + nil, // 5: rerost.giro.v1.Metadata.MetadataEntry + (*empty.Empty)(nil), // 6: google.protobuf.Empty } var file_e2etest_dummyserver_echo_proto_depIdxs = []int32{ - 4, // 0: rerost.giro.v1.Metadata.metadata:type_name -> rerost.giro.v1.Metadata.MetadataEntry + 5, // 0: rerost.giro.v1.Metadata.metadata:type_name -> rerost.giro.v1.Metadata.MetadataEntry 1, // 1: rerost.giro.v1.EchoResponse.metadata:type_name -> rerost.giro.v1.Metadata - 0, // 2: rerost.giro.v1.Metadata.MetadataEntry.value:type_name -> rerost.giro.v1.MetadataValue - 2, // 3: rerost.giro.v1.TestService.Echo:input_type -> rerost.giro.v1.EchoRequest - 3, // 4: rerost.giro.v1.TestService.Echo:output_type -> rerost.giro.v1.EchoResponse - 4, // [4:5] is the sub-list for method output_type - 3, // [3:4] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 1, // 2: rerost.giro.v1.EmptyResponse.metadata:type_name -> rerost.giro.v1.Metadata + 0, // 3: rerost.giro.v1.Metadata.MetadataEntry.value:type_name -> rerost.giro.v1.MetadataValue + 2, // 4: rerost.giro.v1.TestService.Echo:input_type -> rerost.giro.v1.EchoRequest + 6, // 5: rerost.giro.v1.TestService.EmptyCall:input_type -> google.protobuf.Empty + 3, // 6: rerost.giro.v1.TestService.Echo:output_type -> rerost.giro.v1.EchoResponse + 4, // 7: rerost.giro.v1.TestService.EmptyCall:output_type -> rerost.giro.v1.EmptyResponse + 6, // [6:8] is the sub-list for method output_type + 4, // [4:6] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_e2etest_dummyserver_echo_proto_init() } @@ -271,7 +333,7 @@ func file_e2etest_dummyserver_echo_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_e2etest_dummyserver_echo_proto_rawDesc), len(file_e2etest_dummyserver_echo_proto_rawDesc)), NumEnums: 0, - NumMessages: 5, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, diff --git a/e2etest/dummyserver/echo.proto b/e2etest/dummyserver/echo.proto index 81ed5fb..42de2ed 100644 --- a/e2etest/dummyserver/echo.proto +++ b/e2etest/dummyserver/echo.proto @@ -4,6 +4,7 @@ package rerost.giro.v1; option go_package = "github.com/rerost/giro/e2etest/dummyserver;dummyserver"; import "rerost/giro/hosts.proto"; +import "google/protobuf/empty.proto"; message MetadataValue { repeated string value = 1; @@ -23,10 +24,16 @@ message EchoResponse { Metadata metadata = 2; } +message EmptyResponse { + string status = 1; + Metadata metadata = 2; +} + service TestService { option (rerost.giro.v1.host_option) = { host: "localhost:5000" }; rpc Echo(EchoRequest) returns (EchoResponse) {} + rpc EmptyCall(google.protobuf.Empty) returns (EmptyResponse) {} } diff --git a/e2etest/dummyserver/echo_grpc.pb.go b/e2etest/dummyserver/echo_grpc.pb.go index c94a107..3b31b5f 100644 --- a/e2etest/dummyserver/echo_grpc.pb.go +++ b/e2etest/dummyserver/echo_grpc.pb.go @@ -1,13 +1,14 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.4 +// - protoc v3.12.4 // source: e2etest/dummyserver/echo.proto package dummyserver import ( context "context" + empty "github.com/golang/protobuf/ptypes/empty" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -19,7 +20,8 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - TestService_Echo_FullMethodName = "/rerost.giro.v1.TestService/Echo" + TestService_Echo_FullMethodName = "/rerost.giro.v1.TestService/Echo" + TestService_EmptyCall_FullMethodName = "/rerost.giro.v1.TestService/EmptyCall" ) // TestServiceClient is the client API for TestService service. @@ -27,6 +29,7 @@ const ( // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type TestServiceClient interface { Echo(ctx context.Context, in *EchoRequest, opts ...grpc.CallOption) (*EchoResponse, error) + EmptyCall(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) } type testServiceClient struct { @@ -47,11 +50,22 @@ func (c *testServiceClient) Echo(ctx context.Context, in *EchoRequest, opts ...g return out, nil } +func (c *testServiceClient) EmptyCall(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(EmptyResponse) + err := c.cc.Invoke(ctx, TestService_EmptyCall_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // TestServiceServer is the server API for TestService service. // All implementations must embed UnimplementedTestServiceServer // for forward compatibility. type TestServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) + EmptyCall(context.Context, *empty.Empty) (*EmptyResponse, error) mustEmbedUnimplementedTestServiceServer() } @@ -65,6 +79,9 @@ type UnimplementedTestServiceServer struct{} func (UnimplementedTestServiceServer) Echo(context.Context, *EchoRequest) (*EchoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented") } +func (UnimplementedTestServiceServer) EmptyCall(context.Context, *empty.Empty) (*EmptyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EmptyCall not implemented") +} func (UnimplementedTestServiceServer) mustEmbedUnimplementedTestServiceServer() {} func (UnimplementedTestServiceServer) testEmbeddedByValue() {} @@ -104,6 +121,24 @@ func _TestService_Echo_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _TestService_EmptyCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TestServiceServer).EmptyCall(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TestService_EmptyCall_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TestServiceServer).EmptyCall(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + // TestService_ServiceDesc is the grpc.ServiceDesc for TestService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -115,6 +150,10 @@ var TestService_ServiceDesc = grpc.ServiceDesc{ MethodName: "Echo", Handler: _TestService_Echo_Handler, }, + { + MethodName: "EmptyCall", + Handler: _TestService_EmptyCall_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "e2etest/dummyserver/echo.proto", diff --git a/e2etest/dummyserver/runner.go b/e2etest/dummyserver/runner.go index 47a0587..c267e24 100644 --- a/e2etest/dummyserver/runner.go +++ b/e2etest/dummyserver/runner.go @@ -49,6 +49,28 @@ func (s *testServiceServerImpl) Echo(ctx context.Context, req *EchoRequest) (*Ec }, nil } +func (s *testServiceServerImpl) EmptyCall(ctx context.Context, _ *Empty) (*EmptyResponse, error) { + md := map[string]*MetadataValue{} + + metadata, ok := metadata.FromIncomingContext(ctx) + if ok { + _metadata := map[string][]string(metadata) + + for k, v := range _metadata { + md[k] = &MetadataValue{ + Value: v, + } + } + } + + return &EmptyResponse{ + Status: "ok", + Metadata: &Metadata{ + Metadata: md, + }, + }, nil +} + func NewHostsServiceServer() hosts_pb.HostServiceServer { return &hostsServiceServerImpl{ hosts: map[string]string{ diff --git a/e2etest/testdata/test.ct b/e2etest/testdata/test.ct index b12f3c5..26a0111 100644 --- a/e2etest/testdata/test.ct +++ b/e2etest/testdata/test.ct @@ -12,16 +12,23 @@ rerost.giro.v1.TestService $ giro ls rerost.giro.v1.TestService Echo +EmptyCall $ giro ls rerost.giro.v1.TestService/Echo Echo +$ giro ls rerost.giro.v1.TestService/EmptyCall +EmptyCall + $ giro host rerost.giro.v1.TestService localhost:5000 $ giro call rerost.giro.v1.TestService/Echo {"message":"Test"} --metadata=key1:val1:key2:val2 {"message":"Test", "metadata":{"metadata":{":authority":{"value":["localhost:5000"]}, "content-type":{"value":["application/grpc"]}, "key1":{"value":["val1"]}, "key2":{"value":["val2"]}, "user-agent":{"value":["grpc-go/1.71.0"]}}}} +$ giro call rerost.giro.v1.TestService/EmptyCall {} --metadata=key1:val1:key2:val2 +{"status":"ok", "metadata":{"metadata":{":authority":{"value":["localhost:5000"]}, "content-type":{"value":["application/grpc"]}, "key1":{"value":["val1"]}, "key2":{"value":["val2"]}, "user-agent":{"value":["grpc-go/1.71.0"]}}}} + $ giro empty_json rerost.giro.v1.EchoRequest {"message":""} diff --git a/example/multiple_package/protos/one/one.proto b/example/multiple_package/protos/one/one.proto index 4608856..9b1fa3d 100644 --- a/example/multiple_package/protos/one/one.proto +++ b/example/multiple_package/protos/one/one.proto @@ -3,6 +3,8 @@ package example.multiple_package.protos.one; option go_package = "github.com/rerost/giro/example/multiple_package/protos/one;one_pb"; +import "google/protobuf/empty.proto"; + message GiroTestRequest1 { string message = 1; } @@ -21,4 +23,5 @@ message GiroTestResponse2 { service GiroService { rpc GiroTest1(GiroTestRequest1) returns (GiroTestResponse1) {} rpc GiroTest2(GiroTestRequest2) returns (GiroTestResponse2) {} + rpc GiroEmptyTest(google.protobuf.Empty) returns (google.protobuf.Empty) {} } diff --git a/rerost/giro/hosts.pb.go b/rerost/giro/hosts.pb.go index 091fcfc..aa07e20 100644 --- a/rerost/giro/hosts.pb.go +++ b/rerost/giro/hosts.pb.go @@ -1,15 +1,15 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v5.29.4 +// protoc v3.12.4 // source: rerost/giro/hosts.proto package hosts_pb import ( + descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - descriptorpb "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" unsafe "unsafe" @@ -156,7 +156,7 @@ func (x *GetHostResponse) GetHost() string { var file_rerost_giro_hosts_proto_extTypes = []protoimpl.ExtensionInfo{ { - ExtendedType: (*descriptorpb.ServiceOptions)(nil), + ExtendedType: (*descriptor.ServiceOptions)(nil), ExtensionType: (*HostOptions)(nil), Field: 50000, Name: "rerost.giro.v1.host_option", @@ -165,7 +165,7 @@ var file_rerost_giro_hosts_proto_extTypes = []protoimpl.ExtensionInfo{ }, } -// Extension fields to descriptorpb.ServiceOptions. +// Extension fields to descriptor.ServiceOptions. var ( // optional rerost.giro.v1.HostOptions host_option = 50000; E_HostOption = &file_rerost_giro_hosts_proto_extTypes[0] @@ -202,10 +202,10 @@ func file_rerost_giro_hosts_proto_rawDescGZIP() []byte { var file_rerost_giro_hosts_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_rerost_giro_hosts_proto_goTypes = []any{ - (*HostOptions)(nil), // 0: rerost.giro.v1.HostOptions - (*GetHostRequest)(nil), // 1: rerost.giro.v1.GetHostRequest - (*GetHostResponse)(nil), // 2: rerost.giro.v1.GetHostResponse - (*descriptorpb.ServiceOptions)(nil), // 3: google.protobuf.ServiceOptions + (*HostOptions)(nil), // 0: rerost.giro.v1.HostOptions + (*GetHostRequest)(nil), // 1: rerost.giro.v1.GetHostRequest + (*GetHostResponse)(nil), // 2: rerost.giro.v1.GetHostResponse + (*descriptor.ServiceOptions)(nil), // 3: google.protobuf.ServiceOptions } var file_rerost_giro_hosts_proto_depIdxs = []int32{ 3, // 0: rerost.giro.v1.host_option:extendee -> google.protobuf.ServiceOptions diff --git a/rerost/giro/hosts_grpc.pb.go b/rerost/giro/hosts_grpc.pb.go index 6aa629b..4893ead 100644 --- a/rerost/giro/hosts_grpc.pb.go +++ b/rerost/giro/hosts_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.4 +// - protoc v3.12.4 // source: rerost/giro/hosts.proto package hosts_pb From ca7f33fc425f6d7e76142bc8c7d9c31057708dc6 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:25:56 +0000 Subject: [PATCH 02/21] Update Ruby server implementation for Empty proto test Co-Authored-By: Hazumi Ichijo --- example/multiple_package/protos/one/one.pb.go | 70 +++++++++++-------- .../protos/one/one_grpc.pb.go | 45 +++++++++++- example/multiple_package/protos/two/two.pb.go | 2 +- .../protos/two/two_grpc.pb.go | 2 +- .../server/protos/one/one_pb.rb | 4 +- .../server/protos/one/one_services_pb.rb | 1 + example/multiple_package/server/server.rb | 5 ++ go.mod | 1 + 8 files changed, 94 insertions(+), 36 deletions(-) diff --git a/example/multiple_package/protos/one/one.pb.go b/example/multiple_package/protos/one/one.pb.go index e7829ec..5c879bc 100644 --- a/example/multiple_package/protos/one/one.pb.go +++ b/example/multiple_package/protos/one/one.pb.go @@ -1,12 +1,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v5.29.4 +// protoc v3.12.4 // source: protos/one/one.proto package one_pb import ( + empty "github.com/golang/protobuf/ptypes/empty" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -196,32 +197,38 @@ var file_protos_one_one_proto_rawDesc = []byte{ 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x6e, 0x65, 0x2f, 0x6f, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x23, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0x0a, 0x10, 0x47, - 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x31, 0x12, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2c, 0x0a, 0x10, 0x47, 0x69, 0x72, 0x6f, + 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x31, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x22, 0x2d, 0x0a, 0x11, 0x47, 0x69, + 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x31, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x47, 0x69, 0x72, - 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x22, 0x2d, 0x0a, - 0x11, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x31, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x13, 0x0a, 0x11, - 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x32, 0x32, 0x89, 0x02, 0x0a, 0x0b, 0x47, 0x69, 0x72, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x7c, 0x0a, 0x09, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x31, 0x12, 0x35, - 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x2e, 0x6f, 0x6e, 0x65, 0x2e, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x31, 0x1a, 0x36, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x2e, 0x47, 0x69, 0x72, 0x6f, - 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x31, 0x22, 0x00, 0x12, - 0x7c, 0x0a, 0x09, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x32, 0x12, 0x35, 0x2e, 0x65, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6f, - 0x6e, 0x65, 0x2e, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x32, 0x1a, 0x36, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x2e, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x22, 0x00, 0x42, 0x43, 0x5a, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x13, 0x0a, 0x11, 0x47, 0x69, 0x72, + 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x32, 0xcc, + 0x02, 0x0a, 0x0b, 0x47, 0x69, 0x72, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7c, + 0x0a, 0x09, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x31, 0x12, 0x35, 0x2e, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x6e, + 0x65, 0x2e, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x31, 0x1a, 0x36, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x2e, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x31, 0x22, 0x00, 0x12, 0x7c, 0x0a, 0x09, + 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x32, 0x12, 0x35, 0x2e, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x2e, + 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, + 0x1a, 0x36, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x2e, 0x47, 0x69, 0x72, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0d, 0x47, 0x69, + 0x72, 0x6f, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x54, 0x65, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x43, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x72, 0x6f, 0x73, 0x74, 0x2f, 0x67, 0x69, 0x72, 0x6f, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, @@ -247,14 +254,17 @@ var file_protos_one_one_proto_goTypes = []interface{}{ (*GiroTestRequest2)(nil), // 1: example.multiple_package.protos.one.GiroTestRequest2 (*GiroTestResponse1)(nil), // 2: example.multiple_package.protos.one.GiroTestResponse1 (*GiroTestResponse2)(nil), // 3: example.multiple_package.protos.one.GiroTestResponse2 + (*empty.Empty)(nil), // 4: google.protobuf.Empty } var file_protos_one_one_proto_depIdxs = []int32{ 0, // 0: example.multiple_package.protos.one.GiroService.GiroTest1:input_type -> example.multiple_package.protos.one.GiroTestRequest1 1, // 1: example.multiple_package.protos.one.GiroService.GiroTest2:input_type -> example.multiple_package.protos.one.GiroTestRequest2 - 2, // 2: example.multiple_package.protos.one.GiroService.GiroTest1:output_type -> example.multiple_package.protos.one.GiroTestResponse1 - 3, // 3: example.multiple_package.protos.one.GiroService.GiroTest2:output_type -> example.multiple_package.protos.one.GiroTestResponse2 - 2, // [2:4] is the sub-list for method output_type - 0, // [0:2] is the sub-list for method input_type + 4, // 2: example.multiple_package.protos.one.GiroService.GiroEmptyTest:input_type -> google.protobuf.Empty + 2, // 3: example.multiple_package.protos.one.GiroService.GiroTest1:output_type -> example.multiple_package.protos.one.GiroTestResponse1 + 3, // 4: example.multiple_package.protos.one.GiroService.GiroTest2:output_type -> example.multiple_package.protos.one.GiroTestResponse2 + 4, // 5: example.multiple_package.protos.one.GiroService.GiroEmptyTest:output_type -> google.protobuf.Empty + 3, // [3:6] is the sub-list for method output_type + 0, // [0:3] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/example/multiple_package/protos/one/one_grpc.pb.go b/example/multiple_package/protos/one/one_grpc.pb.go index 2628102..34098a9 100644 --- a/example/multiple_package/protos/one/one_grpc.pb.go +++ b/example/multiple_package/protos/one/one_grpc.pb.go @@ -1,13 +1,14 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.4 +// - protoc v3.12.4 // source: protos/one/one.proto package one_pb import ( context "context" + empty "github.com/golang/protobuf/ptypes/empty" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -19,8 +20,9 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - GiroService_GiroTest1_FullMethodName = "/example.multiple_package.protos.one.GiroService/GiroTest1" - GiroService_GiroTest2_FullMethodName = "/example.multiple_package.protos.one.GiroService/GiroTest2" + GiroService_GiroTest1_FullMethodName = "/example.multiple_package.protos.one.GiroService/GiroTest1" + GiroService_GiroTest2_FullMethodName = "/example.multiple_package.protos.one.GiroService/GiroTest2" + GiroService_GiroEmptyTest_FullMethodName = "/example.multiple_package.protos.one.GiroService/GiroEmptyTest" ) // GiroServiceClient is the client API for GiroService service. @@ -29,6 +31,7 @@ const ( type GiroServiceClient interface { GiroTest1(ctx context.Context, in *GiroTestRequest1, opts ...grpc.CallOption) (*GiroTestResponse1, error) GiroTest2(ctx context.Context, in *GiroTestRequest2, opts ...grpc.CallOption) (*GiroTestResponse2, error) + GiroEmptyTest(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) } type giroServiceClient struct { @@ -59,12 +62,23 @@ func (c *giroServiceClient) GiroTest2(ctx context.Context, in *GiroTestRequest2, return out, nil } +func (c *giroServiceClient) GiroEmptyTest(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(empty.Empty) + err := c.cc.Invoke(ctx, GiroService_GiroEmptyTest_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // GiroServiceServer is the server API for GiroService service. // All implementations must embed UnimplementedGiroServiceServer // for forward compatibility. type GiroServiceServer interface { GiroTest1(context.Context, *GiroTestRequest1) (*GiroTestResponse1, error) GiroTest2(context.Context, *GiroTestRequest2) (*GiroTestResponse2, error) + GiroEmptyTest(context.Context, *empty.Empty) (*empty.Empty, error) mustEmbedUnimplementedGiroServiceServer() } @@ -81,6 +95,9 @@ func (UnimplementedGiroServiceServer) GiroTest1(context.Context, *GiroTestReques func (UnimplementedGiroServiceServer) GiroTest2(context.Context, *GiroTestRequest2) (*GiroTestResponse2, error) { return nil, status.Errorf(codes.Unimplemented, "method GiroTest2 not implemented") } +func (UnimplementedGiroServiceServer) GiroEmptyTest(context.Context, *empty.Empty) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method GiroEmptyTest not implemented") +} func (UnimplementedGiroServiceServer) mustEmbedUnimplementedGiroServiceServer() {} func (UnimplementedGiroServiceServer) testEmbeddedByValue() {} @@ -138,6 +155,24 @@ func _GiroService_GiroTest2_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _GiroService_GiroEmptyTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GiroServiceServer).GiroEmptyTest(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GiroService_GiroEmptyTest_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GiroServiceServer).GiroEmptyTest(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + // GiroService_ServiceDesc is the grpc.ServiceDesc for GiroService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -153,6 +188,10 @@ var GiroService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GiroTest2", Handler: _GiroService_GiroTest2_Handler, }, + { + MethodName: "GiroEmptyTest", + Handler: _GiroService_GiroEmptyTest_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "protos/one/one.proto", diff --git a/example/multiple_package/protos/two/two.pb.go b/example/multiple_package/protos/two/two.pb.go index 7dc6130..634052f 100644 --- a/example/multiple_package/protos/two/two.pb.go +++ b/example/multiple_package/protos/two/two.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v5.29.4 +// protoc v3.12.4 // source: protos/two/two.proto package two_pb diff --git a/example/multiple_package/protos/two/two_grpc.pb.go b/example/multiple_package/protos/two/two_grpc.pb.go index 310e34f..a20ba97 100644 --- a/example/multiple_package/protos/two/two_grpc.pb.go +++ b/example/multiple_package/protos/two/two_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.4 +// - protoc v3.12.4 // source: protos/two/two.proto package two_pb diff --git a/example/multiple_package/server/protos/one/one_pb.rb b/example/multiple_package/server/protos/one/one_pb.rb index e7e11dc..27ab4c4 100644 --- a/example/multiple_package/server/protos/one/one_pb.rb +++ b/example/multiple_package/server/protos/one/one_pb.rb @@ -4,8 +4,10 @@ require 'google/protobuf' +require 'google/protobuf/empty_pb' -descriptor_data = "\n\x14protos/one/one.proto\x12#example.multiple_package.protos.one\"#\n\x10GiroTestRequest1\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x12\n\x10GiroTestRequest2\"$\n\x11GiroTestResponse1\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x13\n\x11GiroTestResponse22\x89\x02\n\x0bGiroService\x12|\n\tGiroTest1\x12\x35.example.multiple_package.protos.one.GiroTestRequest1\x1a\x36.example.multiple_package.protos.one.GiroTestResponse1\"\x00\x12|\n\tGiroTest2\x12\x35.example.multiple_package.protos.one.GiroTestRequest2\x1a\x36.example.multiple_package.protos.one.GiroTestResponse2\"\x00\x42\x43ZAgithub.com/rerost/giro/example/multiple_package/protos/one;one_pbb\x06proto3" + +descriptor_data = "\n\x14protos/one/one.proto\x12#example.multiple_package.protos.one\x1a\x1bgoogle/protobuf/empty.proto\"#\n\x10GiroTestRequest1\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x12\n\x10GiroTestRequest2\"$\n\x11GiroTestResponse1\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x13\n\x11GiroTestResponse22\xcc\x02\n\x0bGiroService\x12|\n\tGiroTest1\x12\x35.example.multiple_package.protos.one.GiroTestRequest1\x1a\x36.example.multiple_package.protos.one.GiroTestResponse1\"\x00\x12|\n\tGiroTest2\x12\x35.example.multiple_package.protos.one.GiroTestRequest2\x1a\x36.example.multiple_package.protos.one.GiroTestResponse2\"\x00\x12\x41\n\rGiroEmptyTest\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x42\x43ZAgithub.com/rerost/giro/example/multiple_package/protos/one;one_pbb\x06proto3" pool = Google::Protobuf::DescriptorPool.generated_pool pool.add_serialized_file(descriptor_data) diff --git a/example/multiple_package/server/protos/one/one_services_pb.rb b/example/multiple_package/server/protos/one/one_services_pb.rb index b10bace..8eece39 100644 --- a/example/multiple_package/server/protos/one/one_services_pb.rb +++ b/example/multiple_package/server/protos/one/one_services_pb.rb @@ -19,6 +19,7 @@ class Service rpc :GiroTest1, ::Example::MultiplePackage::Protos::One::GiroTestRequest1, ::Example::MultiplePackage::Protos::One::GiroTestResponse1 rpc :GiroTest2, ::Example::MultiplePackage::Protos::One::GiroTestRequest2, ::Example::MultiplePackage::Protos::One::GiroTestResponse2 + rpc :GiroEmptyTest, ::Google::Protobuf::Empty, ::Google::Protobuf::Empty end Stub = Service.rpc_stub_class diff --git a/example/multiple_package/server/server.rb b/example/multiple_package/server/server.rb index 22c3c3e..0c353f0 100644 --- a/example/multiple_package/server/server.rb +++ b/example/multiple_package/server/server.rb @@ -5,6 +5,7 @@ require "protos/two/two_pb" require "protos/one/one_services_pb" require "protos/two/two_services_pb" +require "google/protobuf/empty_pb" require 'grpc' @@ -16,6 +17,10 @@ def giro_test1(req, _call) def giro_test2(_req, _call) return Example::MultiplePackage::Protos::One::GiroTestResponse2.new end + + def giro_empty_test(_req, _call) + return Google::Protobuf::Empty.new + end end class BqvService < Example::MultiplePackage::Protos::Two::BqvService::Service diff --git a/go.mod b/go.mod index e349c78..f98c4ac 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ toolchain go1.24.1 require ( github.com/bradleyjkemp/cupaloy/v2 v2.8.0 + github.com/golang/protobuf v1.5.4 github.com/google/go-cmdtest v0.4.0 github.com/google/wire v0.6.0 github.com/pkg/errors v0.9.1 From 9848b8f3d38b1727727e23def833faa558568560 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:28:59 +0000 Subject: [PATCH 03/21] Update Dockerfile to include protobuf dependencies Co-Authored-By: Hazumi Ichijo --- example/multiple_package/server/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/example/multiple_package/server/Dockerfile b/example/multiple_package/server/Dockerfile index 691f834..0c43bcc 100644 --- a/example/multiple_package/server/Dockerfile +++ b/example/multiple_package/server/Dockerfile @@ -4,6 +4,8 @@ FROM ruby:3.4.2-slim RUN apt-get update && apt-get install -y \ g++ \ make \ + protobuf-compiler \ + libprotobuf-dev \ && rm -rf /var/lib/apt/lists/* && \ apt-get clean From 820f42cb05ccd4e4625a67e3a908cacf34784e1c Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:30:36 +0000 Subject: [PATCH 04/21] Fix EmptyCall method to use emptypb.Empty Co-Authored-By: Hazumi Ichijo --- e2etest/dummyserver/runner.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/e2etest/dummyserver/runner.go b/e2etest/dummyserver/runner.go index c267e24..4fcd610 100644 --- a/e2etest/dummyserver/runner.go +++ b/e2etest/dummyserver/runner.go @@ -13,6 +13,7 @@ import ( "google.golang.org/grpc/metadata" "google.golang.org/grpc/reflection" status "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" ) func Run(port string) (func(), error) { @@ -49,7 +50,7 @@ func (s *testServiceServerImpl) Echo(ctx context.Context, req *EchoRequest) (*Ec }, nil } -func (s *testServiceServerImpl) EmptyCall(ctx context.Context, _ *Empty) (*EmptyResponse, error) { +func (s *testServiceServerImpl) EmptyCall(ctx context.Context, _ *emptypb.Empty) (*EmptyResponse, error) { md := map[string]*MetadataValue{} metadata, ok := metadata.FromIncomingContext(ctx) From aafbcba54c5e373a5e6d80495eea3fe6c76d7986 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:32:06 +0000 Subject: [PATCH 05/21] Regenerate protobuf files with emptypb.Empty Co-Authored-By: Hazumi Ichijo --- .../testdata/with_host_option.pb | Bin 51755 -> 51557 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/runner/genreflectionserver/testdata/with_host_option.pb b/runner/genreflectionserver/testdata/with_host_option.pb index ef1b385580fd9861bc0523dd620672ffe0118ca2..187a738dd3b45b6aa3d1f9577d8eac5ca10bc410 100644 GIT binary patch delta 5255 zcmZ8lYitzP72cV>cXqkEYwyl3FF)|u*nn{ek2H-CO%YA{gGNo7HfbfwBa2z=jf|Jr zYltf)TjDrz4J8djsZ7BoO{-ODiKy0bR9q*76jYk@M&f+5Jk0a9e3NI{Td^*eXw z?yUOD^PM^8JLfz1+&kC%`@Q~&J$^2Fp7#s;_KDg*&P$rwKMH;3YOU~TJT*;!NwZg1 zFI@TcmUOnYYvbL`nJtT3GHuEBmc?5;GTF?=uFcLv^P-ki`=XZ2;!UZ}=8p8%Y^Gy{ z_h`RTJzxC!ueu1Be7rE9$ zb!+uzt233o%SyJjS=rW<)!dfs>`Zl9n>#XFq~UH^hP64}ma>u^DQkO2a_iRACM(@; zC9TeMdrMnNSedSDs>6x3wnK=FY)NlRwOj4UEvdUL>#^2!r=yjI}WXx9^a| zrNUZ}da5hEE!mc8&(b?8B-6IZs#~-u)1KP!WO7?_0~JtbWwvJ1nf692*}lmMUS=)W z-kRz_4N1!_HQBa3*^L|>$@b2+WY$S1Yh8t6oht9LHg;vL?o5}pCE0ClPs+T)NN z4lq_;Vds8aox_t55M$Ge4zyKa zhnsov^JSkjYUvvovkLp4y$yAEQXRt^)b<98#zdp*iqK0 zFErJTmb&R=Cbz3$DI6lk3a`KLl<~tcPdM$zF|T)iWE^ABge%QYF>I#lgCD}j*zASs zErgG;`bKd{lL@eO#_b(H{d~>1$Irk&?(x$G8fQ^8oDBTqtlHULVV!}0oYgFG`5E}f z*}}zQrKAVbgne@Nsx=cHJtw0_&p|)omCr#x!Dc$AOIYWipI{YDEvThD1cb&LN+TfRZYYg_(0D^>j6mZTQscKHr11--5eQ*` zjz&OK_Jum)%1q-H^X=l!5myG!TPzqCPoS_eD(sFe_H4ZWjw%T@z=7xRz{1_%iZq~5J*cQBuhvQFQd)ZXV>n3XcZpO@IJ3LnzTOd zepB!kG=1FtrU0V0KJI=~${=H>{pg_|JX}Wo-pSoh3J{_Ioqhu%-A?X)Qp!zZH}~y# z`&|yt-8?u;+@yAuQ^Re$_2;+N*s3JhkjGZ-0z`M?J)m?)P2&Lf zz2@qU!t($R&JZ8b1tvP{pE++`VmzVj7T)1Bm*L5L`eojO(RM&AS90{ z$$*eNLXxl1EXC;haGdLZvHK2Qec(6`%#>etm?`tyoK?vWxx~lsy3O5F4e zBBJ)4u#XMSt2@D2yy!-sx)XfHOmUy<2K)s+{B@=R5&K>XW?6xgi0f11I?s=j#rL4xHjfgQ7wQPVrcMNUnN} z5}&4Vx1)!Q6{o!%w8>Aam4_R0oK`Cjh#aTY%Ez!E?_uTFE`CofdQ2`lptI%`G}mn_+M{bI3}^@HtXJmqsF` zUZ3OU9M1sKbG)`re(p>v^E}t9WwU`m2bO-y4yZ3qcg6cCKo2#5(@~blbY<6-6z$$a82n{qu#Efa;>xY&c)yx)Kiuf{Kc6R+qe@=w@|^$JENu z&FT`(0^L$fd3WNvv)zEeblGFN#{ku3uPS+q;%2Q|l)Odp`Udf_hS84W7Q=o2vE%uV zqSxv4elCU#aT<(+h5zQC53WCGxHZCvfjDTm0|AH{4;l&QnhuB>4;nR=JQU)zHwF#; zy5an*0}Ss$16!mgfIR|CIfe`8j`sRnhw&ec98qaT`NKxU^bCj`Hsa1>vLQnufQ-E1&S8mzHmZ4%0%PSU&=(|(;tY>C^FGMtNn$)ok#}$2Q>5Zj{pDw delta 5326 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 From a6bbefc2c4b5daa4daa071f95590c9e2780e205e Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:32:42 +0000 Subject: [PATCH 06/21] Update Dockerfile to fix empty.proto import Co-Authored-By: Hazumi Ichijo --- example/multiple_package/server/Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/example/multiple_package/server/Dockerfile b/example/multiple_package/server/Dockerfile index 0c43bcc..c3edea0 100644 --- a/example/multiple_package/server/Dockerfile +++ b/example/multiple_package/server/Dockerfile @@ -11,9 +11,14 @@ RUN apt-get update && apt-get install -y \ # Pre-install common gems COPY Gemfile Gemfile.lock ./ -RUN bundle install --jobs 4 +RUN bundle install --jobs 4 && \ + gem install grpc-tools # Copy application files COPY . . +# Create symbolic link for google/protobuf directory +RUN mkdir -p /usr/include/google/protobuf && \ + ln -sf /usr/include/google/protobuf/empty.proto /usr/include/google/protobuf/empty.proto + CMD ["ruby", "server.rb"] From 6303b7dc49a962112f74905cb7ed59029881a8ad Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:34:42 +0000 Subject: [PATCH 07/21] Fix empty.proto creation in Dockerfile Co-Authored-By: Hazumi Ichijo --- example/multiple_package/server/Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/example/multiple_package/server/Dockerfile b/example/multiple_package/server/Dockerfile index c3edea0..de8ef0c 100644 --- a/example/multiple_package/server/Dockerfile +++ b/example/multiple_package/server/Dockerfile @@ -17,8 +17,10 @@ RUN bundle install --jobs 4 && \ # Copy application files COPY . . -# Create symbolic link for google/protobuf directory +# Create empty.proto file if it doesn't exist RUN mkdir -p /usr/include/google/protobuf && \ - ln -sf /usr/include/google/protobuf/empty.proto /usr/include/google/protobuf/empty.proto + if [ ! -f /usr/include/google/protobuf/empty.proto ]; then \ + echo 'syntax = "proto3";\npackage google.protobuf;\nmessage Empty {}\n' > /usr/include/google/protobuf/empty.proto; \ + fi CMD ["ruby", "server.rb"] From 193e48b663e37abfee8a09e821273c3a60d4aaf1 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:38:58 +0000 Subject: [PATCH 08/21] Fix protobuf imports: replace empty with emptypb Co-Authored-By: Hazumi Ichijo --- e2etest/dummyserver/echo.pb.go | 4 ++-- e2etest/dummyserver/echo_grpc.pb.go | 14 +++++++------- example/multiple_package/protos/one/one.pb.go | 4 ++-- .../multiple_package/protos/one/one_grpc.pb.go | 16 ++++++++-------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/e2etest/dummyserver/echo.pb.go b/e2etest/dummyserver/echo.pb.go index 7a44167..b24d2ea 100644 --- a/e2etest/dummyserver/echo.pb.go +++ b/e2etest/dummyserver/echo.pb.go @@ -7,7 +7,7 @@ package dummyserver import ( - empty "github.com/golang/protobuf/ptypes/empty" + emptypb "google.golang.org/protobuf/types/known/emptypb" _ "github.com/rerost/giro/rerost/giro" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -304,7 +304,7 @@ var file_e2etest_dummyserver_echo_proto_goTypes = []any{ (*EchoResponse)(nil), // 3: rerost.giro.v1.EchoResponse (*EmptyResponse)(nil), // 4: rerost.giro.v1.EmptyResponse nil, // 5: rerost.giro.v1.Metadata.MetadataEntry - (*empty.Empty)(nil), // 6: google.protobuf.Empty + (*emptypb.Empty)(nil), // 6: google.protobuf.Empty } var file_e2etest_dummyserver_echo_proto_depIdxs = []int32{ 5, // 0: rerost.giro.v1.Metadata.metadata:type_name -> rerost.giro.v1.Metadata.MetadataEntry diff --git a/e2etest/dummyserver/echo_grpc.pb.go b/e2etest/dummyserver/echo_grpc.pb.go index 3b31b5f..48a705c 100644 --- a/e2etest/dummyserver/echo_grpc.pb.go +++ b/e2etest/dummyserver/echo_grpc.pb.go @@ -8,7 +8,7 @@ package dummyserver import ( context "context" - empty "github.com/golang/protobuf/ptypes/empty" + emptypb "google.golang.org/protobuf/types/known/emptypb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -29,7 +29,7 @@ const ( // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type TestServiceClient interface { Echo(ctx context.Context, in *EchoRequest, opts ...grpc.CallOption) (*EchoResponse, error) - EmptyCall(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) + EmptyCall(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) } type testServiceClient struct { @@ -50,7 +50,7 @@ func (c *testServiceClient) Echo(ctx context.Context, in *EchoRequest, opts ...g return out, nil } -func (c *testServiceClient) EmptyCall(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) { +func (c *testServiceClient) EmptyCall(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(EmptyResponse) err := c.cc.Invoke(ctx, TestService_EmptyCall_FullMethodName, in, out, cOpts...) @@ -65,7 +65,7 @@ func (c *testServiceClient) EmptyCall(ctx context.Context, in *empty.Empty, opts // for forward compatibility. type TestServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) - EmptyCall(context.Context, *empty.Empty) (*EmptyResponse, error) + EmptyCall(context.Context, *emptypb.Empty) (*EmptyResponse, error) mustEmbedUnimplementedTestServiceServer() } @@ -79,7 +79,7 @@ type UnimplementedTestServiceServer struct{} func (UnimplementedTestServiceServer) Echo(context.Context, *EchoRequest) (*EchoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented") } -func (UnimplementedTestServiceServer) EmptyCall(context.Context, *empty.Empty) (*EmptyResponse, error) { +func (UnimplementedTestServiceServer) EmptyCall(context.Context, *emptypb.Empty) (*EmptyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EmptyCall not implemented") } func (UnimplementedTestServiceServer) mustEmbedUnimplementedTestServiceServer() {} @@ -122,7 +122,7 @@ func _TestService_Echo_Handler(srv interface{}, ctx context.Context, dec func(in } func _TestService_EmptyCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -134,7 +134,7 @@ func _TestService_EmptyCall_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: TestService_EmptyCall_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TestServiceServer).EmptyCall(ctx, req.(*empty.Empty)) + return srv.(TestServiceServer).EmptyCall(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } diff --git a/example/multiple_package/protos/one/one.pb.go b/example/multiple_package/protos/one/one.pb.go index 5c879bc..45f12cb 100644 --- a/example/multiple_package/protos/one/one.pb.go +++ b/example/multiple_package/protos/one/one.pb.go @@ -7,7 +7,7 @@ package one_pb import ( - empty "github.com/golang/protobuf/ptypes/empty" + emptypb "google.golang.org/protobuf/types/known/emptypb" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -254,7 +254,7 @@ var file_protos_one_one_proto_goTypes = []interface{}{ (*GiroTestRequest2)(nil), // 1: example.multiple_package.protos.one.GiroTestRequest2 (*GiroTestResponse1)(nil), // 2: example.multiple_package.protos.one.GiroTestResponse1 (*GiroTestResponse2)(nil), // 3: example.multiple_package.protos.one.GiroTestResponse2 - (*empty.Empty)(nil), // 4: google.protobuf.Empty + (*emptypb.Empty)(nil), // 4: google.protobuf.Empty } var file_protos_one_one_proto_depIdxs = []int32{ 0, // 0: example.multiple_package.protos.one.GiroService.GiroTest1:input_type -> example.multiple_package.protos.one.GiroTestRequest1 diff --git a/example/multiple_package/protos/one/one_grpc.pb.go b/example/multiple_package/protos/one/one_grpc.pb.go index 34098a9..aa982b6 100644 --- a/example/multiple_package/protos/one/one_grpc.pb.go +++ b/example/multiple_package/protos/one/one_grpc.pb.go @@ -8,7 +8,7 @@ package one_pb import ( context "context" - empty "github.com/golang/protobuf/ptypes/empty" + emptypb "google.golang.org/protobuf/types/known/emptypb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -31,7 +31,7 @@ const ( type GiroServiceClient interface { GiroTest1(ctx context.Context, in *GiroTestRequest1, opts ...grpc.CallOption) (*GiroTestResponse1, error) GiroTest2(ctx context.Context, in *GiroTestRequest2, opts ...grpc.CallOption) (*GiroTestResponse2, error) - GiroEmptyTest(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + GiroEmptyTest(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) } type giroServiceClient struct { @@ -62,9 +62,9 @@ func (c *giroServiceClient) GiroTest2(ctx context.Context, in *GiroTestRequest2, return out, nil } -func (c *giroServiceClient) GiroEmptyTest(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { +func (c *giroServiceClient) GiroEmptyTest(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(empty.Empty) + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, GiroService_GiroEmptyTest_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -78,7 +78,7 @@ func (c *giroServiceClient) GiroEmptyTest(ctx context.Context, in *empty.Empty, type GiroServiceServer interface { GiroTest1(context.Context, *GiroTestRequest1) (*GiroTestResponse1, error) GiroTest2(context.Context, *GiroTestRequest2) (*GiroTestResponse2, error) - GiroEmptyTest(context.Context, *empty.Empty) (*empty.Empty, error) + GiroEmptyTest(context.Context, *emptypb.Empty) (*emptypb.Empty, error) mustEmbedUnimplementedGiroServiceServer() } @@ -95,7 +95,7 @@ func (UnimplementedGiroServiceServer) GiroTest1(context.Context, *GiroTestReques func (UnimplementedGiroServiceServer) GiroTest2(context.Context, *GiroTestRequest2) (*GiroTestResponse2, error) { return nil, status.Errorf(codes.Unimplemented, "method GiroTest2 not implemented") } -func (UnimplementedGiroServiceServer) GiroEmptyTest(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedGiroServiceServer) GiroEmptyTest(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method GiroEmptyTest not implemented") } func (UnimplementedGiroServiceServer) mustEmbedUnimplementedGiroServiceServer() {} @@ -156,7 +156,7 @@ func _GiroService_GiroTest2_Handler(srv interface{}, ctx context.Context, dec fu } func _GiroService_GiroEmptyTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -168,7 +168,7 @@ func _GiroService_GiroEmptyTest_Handler(srv interface{}, ctx context.Context, de FullMethod: GiroService_GiroEmptyTest_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GiroServiceServer).GiroEmptyTest(ctx, req.(*empty.Empty)) + return srv.(GiroServiceServer).GiroEmptyTest(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } From 3d823eed8939f38a3ca6ab929828f4fdd53f46e1 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:41:10 +0000 Subject: [PATCH 09/21] Add APP_PORT environment variable to Dockerfile Co-Authored-By: Hazumi Ichijo --- example/multiple_package/server/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/example/multiple_package/server/Dockerfile b/example/multiple_package/server/Dockerfile index de8ef0c..1b6c606 100644 --- a/example/multiple_package/server/Dockerfile +++ b/example/multiple_package/server/Dockerfile @@ -23,4 +23,7 @@ RUN mkdir -p /usr/include/google/protobuf && \ echo 'syntax = "proto3";\npackage google.protobuf;\nmessage Empty {}\n' > /usr/include/google/protobuf/empty.proto; \ fi +# Set default port +ENV APP_PORT=5001 + CMD ["ruby", "server.rb"] From 75b42a1fcb44e5e5fbcb03c98c2310bfd6df0283 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:43:45 +0000 Subject: [PATCH 10/21] Fix protobuf import paths to use github.com/golang/protobuf/ptypes/empty Co-Authored-By: Hazumi Ichijo --- e2etest/dummyserver/echo.pb.go | 4 ++-- e2etest/dummyserver/echo_grpc.pb.go | 14 +++++++------- e2etest/dummyserver/runner.go | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/e2etest/dummyserver/echo.pb.go b/e2etest/dummyserver/echo.pb.go index b24d2ea..7a44167 100644 --- a/e2etest/dummyserver/echo.pb.go +++ b/e2etest/dummyserver/echo.pb.go @@ -7,7 +7,7 @@ package dummyserver import ( - emptypb "google.golang.org/protobuf/types/known/emptypb" + empty "github.com/golang/protobuf/ptypes/empty" _ "github.com/rerost/giro/rerost/giro" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -304,7 +304,7 @@ var file_e2etest_dummyserver_echo_proto_goTypes = []any{ (*EchoResponse)(nil), // 3: rerost.giro.v1.EchoResponse (*EmptyResponse)(nil), // 4: rerost.giro.v1.EmptyResponse nil, // 5: rerost.giro.v1.Metadata.MetadataEntry - (*emptypb.Empty)(nil), // 6: google.protobuf.Empty + (*empty.Empty)(nil), // 6: google.protobuf.Empty } var file_e2etest_dummyserver_echo_proto_depIdxs = []int32{ 5, // 0: rerost.giro.v1.Metadata.metadata:type_name -> rerost.giro.v1.Metadata.MetadataEntry diff --git a/e2etest/dummyserver/echo_grpc.pb.go b/e2etest/dummyserver/echo_grpc.pb.go index 48a705c..3b31b5f 100644 --- a/e2etest/dummyserver/echo_grpc.pb.go +++ b/e2etest/dummyserver/echo_grpc.pb.go @@ -8,7 +8,7 @@ package dummyserver import ( context "context" - emptypb "google.golang.org/protobuf/types/known/emptypb" + empty "github.com/golang/protobuf/ptypes/empty" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -29,7 +29,7 @@ const ( // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type TestServiceClient interface { Echo(ctx context.Context, in *EchoRequest, opts ...grpc.CallOption) (*EchoResponse, error) - EmptyCall(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) + EmptyCall(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) } type testServiceClient struct { @@ -50,7 +50,7 @@ func (c *testServiceClient) Echo(ctx context.Context, in *EchoRequest, opts ...g return out, nil } -func (c *testServiceClient) EmptyCall(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) { +func (c *testServiceClient) EmptyCall(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(EmptyResponse) err := c.cc.Invoke(ctx, TestService_EmptyCall_FullMethodName, in, out, cOpts...) @@ -65,7 +65,7 @@ func (c *testServiceClient) EmptyCall(ctx context.Context, in *emptypb.Empty, op // for forward compatibility. type TestServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) - EmptyCall(context.Context, *emptypb.Empty) (*EmptyResponse, error) + EmptyCall(context.Context, *empty.Empty) (*EmptyResponse, error) mustEmbedUnimplementedTestServiceServer() } @@ -79,7 +79,7 @@ type UnimplementedTestServiceServer struct{} func (UnimplementedTestServiceServer) Echo(context.Context, *EchoRequest) (*EchoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented") } -func (UnimplementedTestServiceServer) EmptyCall(context.Context, *emptypb.Empty) (*EmptyResponse, error) { +func (UnimplementedTestServiceServer) EmptyCall(context.Context, *empty.Empty) (*EmptyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EmptyCall not implemented") } func (UnimplementedTestServiceServer) mustEmbedUnimplementedTestServiceServer() {} @@ -122,7 +122,7 @@ func _TestService_Echo_Handler(srv interface{}, ctx context.Context, dec func(in } func _TestService_EmptyCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -134,7 +134,7 @@ func _TestService_EmptyCall_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: TestService_EmptyCall_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TestServiceServer).EmptyCall(ctx, req.(*emptypb.Empty)) + return srv.(TestServiceServer).EmptyCall(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } diff --git a/e2etest/dummyserver/runner.go b/e2etest/dummyserver/runner.go index 4fcd610..da25471 100644 --- a/e2etest/dummyserver/runner.go +++ b/e2etest/dummyserver/runner.go @@ -6,6 +6,7 @@ import ( "log" "net" + "github.com/golang/protobuf/ptypes/empty" "github.com/pkg/errors" hosts_pb "github.com/rerost/giro/rerost/giro" "google.golang.org/grpc" @@ -13,7 +14,6 @@ import ( "google.golang.org/grpc/metadata" "google.golang.org/grpc/reflection" status "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" ) func Run(port string) (func(), error) { @@ -50,7 +50,7 @@ func (s *testServiceServerImpl) Echo(ctx context.Context, req *EchoRequest) (*Ec }, nil } -func (s *testServiceServerImpl) EmptyCall(ctx context.Context, _ *emptypb.Empty) (*EmptyResponse, error) { +func (s *testServiceServerImpl) EmptyCall(ctx context.Context, _ *empty.Empty) (*EmptyResponse, error) { md := map[string]*MetadataValue{} metadata, ok := metadata.FromIncomingContext(ctx) From 92ae1bdb153fee80840363f38205da47df36de4e Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:45:29 +0000 Subject: [PATCH 11/21] Update runner.go to use emptypb import Co-Authored-By: Hazumi Ichijo --- e2etest/dummyserver/runner.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2etest/dummyserver/runner.go b/e2etest/dummyserver/runner.go index da25471..4fcd610 100644 --- a/e2etest/dummyserver/runner.go +++ b/e2etest/dummyserver/runner.go @@ -6,7 +6,6 @@ import ( "log" "net" - "github.com/golang/protobuf/ptypes/empty" "github.com/pkg/errors" hosts_pb "github.com/rerost/giro/rerost/giro" "google.golang.org/grpc" @@ -14,6 +13,7 @@ import ( "google.golang.org/grpc/metadata" "google.golang.org/grpc/reflection" status "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" ) func Run(port string) (func(), error) { @@ -50,7 +50,7 @@ func (s *testServiceServerImpl) Echo(ctx context.Context, req *EchoRequest) (*Ec }, nil } -func (s *testServiceServerImpl) EmptyCall(ctx context.Context, _ *empty.Empty) (*EmptyResponse, error) { +func (s *testServiceServerImpl) EmptyCall(ctx context.Context, _ *emptypb.Empty) (*EmptyResponse, error) { md := map[string]*MetadataValue{} metadata, ok := metadata.FromIncomingContext(ctx) From 488746122a423d64d82c7a569a9d87d05efb69d1 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:51:52 +0000 Subject: [PATCH 12/21] Update to protoc v25.1 and fix emptypb imports Co-Authored-By: Hazumi Ichijo --- e2etest/dummyserver/echo.pb.go | 6 +++--- e2etest/dummyserver/echo_grpc.pb.go | 16 ++++++++-------- go.mod | 1 - rerost/giro/hosts.pb.go | 16 ++++++++-------- rerost/giro/hosts_grpc.pb.go | 2 +- .../testdata/with_host_option.pb | Bin 51557 -> 69340 bytes 6 files changed, 20 insertions(+), 21 deletions(-) diff --git a/e2etest/dummyserver/echo.pb.go b/e2etest/dummyserver/echo.pb.go index 7a44167..316dc96 100644 --- a/e2etest/dummyserver/echo.pb.go +++ b/e2etest/dummyserver/echo.pb.go @@ -1,16 +1,16 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v3.12.4 +// protoc v4.25.1 // source: e2etest/dummyserver/echo.proto package dummyserver import ( - empty "github.com/golang/protobuf/ptypes/empty" _ "github.com/rerost/giro/rerost/giro" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" sync "sync" unsafe "unsafe" @@ -304,7 +304,7 @@ var file_e2etest_dummyserver_echo_proto_goTypes = []any{ (*EchoResponse)(nil), // 3: rerost.giro.v1.EchoResponse (*EmptyResponse)(nil), // 4: rerost.giro.v1.EmptyResponse nil, // 5: rerost.giro.v1.Metadata.MetadataEntry - (*empty.Empty)(nil), // 6: google.protobuf.Empty + (*emptypb.Empty)(nil), // 6: google.protobuf.Empty } var file_e2etest_dummyserver_echo_proto_depIdxs = []int32{ 5, // 0: rerost.giro.v1.Metadata.metadata:type_name -> rerost.giro.v1.Metadata.MetadataEntry diff --git a/e2etest/dummyserver/echo_grpc.pb.go b/e2etest/dummyserver/echo_grpc.pb.go index 3b31b5f..cc9e2b9 100644 --- a/e2etest/dummyserver/echo_grpc.pb.go +++ b/e2etest/dummyserver/echo_grpc.pb.go @@ -1,17 +1,17 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v3.12.4 +// - protoc v4.25.1 // source: e2etest/dummyserver/echo.proto package dummyserver import ( context "context" - empty "github.com/golang/protobuf/ptypes/empty" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" ) // This is a compile-time assertion to ensure that this generated file @@ -29,7 +29,7 @@ const ( // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type TestServiceClient interface { Echo(ctx context.Context, in *EchoRequest, opts ...grpc.CallOption) (*EchoResponse, error) - EmptyCall(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) + EmptyCall(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) } type testServiceClient struct { @@ -50,7 +50,7 @@ func (c *testServiceClient) Echo(ctx context.Context, in *EchoRequest, opts ...g return out, nil } -func (c *testServiceClient) EmptyCall(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) { +func (c *testServiceClient) EmptyCall(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EmptyResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(EmptyResponse) err := c.cc.Invoke(ctx, TestService_EmptyCall_FullMethodName, in, out, cOpts...) @@ -65,7 +65,7 @@ func (c *testServiceClient) EmptyCall(ctx context.Context, in *empty.Empty, opts // for forward compatibility. type TestServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) - EmptyCall(context.Context, *empty.Empty) (*EmptyResponse, error) + EmptyCall(context.Context, *emptypb.Empty) (*EmptyResponse, error) mustEmbedUnimplementedTestServiceServer() } @@ -79,7 +79,7 @@ type UnimplementedTestServiceServer struct{} func (UnimplementedTestServiceServer) Echo(context.Context, *EchoRequest) (*EchoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Echo not implemented") } -func (UnimplementedTestServiceServer) EmptyCall(context.Context, *empty.Empty) (*EmptyResponse, error) { +func (UnimplementedTestServiceServer) EmptyCall(context.Context, *emptypb.Empty) (*EmptyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EmptyCall not implemented") } func (UnimplementedTestServiceServer) mustEmbedUnimplementedTestServiceServer() {} @@ -122,7 +122,7 @@ func _TestService_Echo_Handler(srv interface{}, ctx context.Context, dec func(in } func _TestService_EmptyCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -134,7 +134,7 @@ func _TestService_EmptyCall_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: TestService_EmptyCall_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TestServiceServer).EmptyCall(ctx, req.(*empty.Empty)) + return srv.(TestServiceServer).EmptyCall(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } diff --git a/go.mod b/go.mod index f98c4ac..e349c78 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ toolchain go1.24.1 require ( github.com/bradleyjkemp/cupaloy/v2 v2.8.0 - github.com/golang/protobuf v1.5.4 github.com/google/go-cmdtest v0.4.0 github.com/google/wire v0.6.0 github.com/pkg/errors v0.9.1 diff --git a/rerost/giro/hosts.pb.go b/rerost/giro/hosts.pb.go index aa07e20..8218a02 100644 --- a/rerost/giro/hosts.pb.go +++ b/rerost/giro/hosts.pb.go @@ -1,15 +1,15 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v3.12.4 +// protoc v4.25.1 // source: rerost/giro/hosts.proto package hosts_pb import ( - descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" unsafe "unsafe" @@ -156,7 +156,7 @@ func (x *GetHostResponse) GetHost() string { var file_rerost_giro_hosts_proto_extTypes = []protoimpl.ExtensionInfo{ { - ExtendedType: (*descriptor.ServiceOptions)(nil), + ExtendedType: (*descriptorpb.ServiceOptions)(nil), ExtensionType: (*HostOptions)(nil), Field: 50000, Name: "rerost.giro.v1.host_option", @@ -165,7 +165,7 @@ var file_rerost_giro_hosts_proto_extTypes = []protoimpl.ExtensionInfo{ }, } -// Extension fields to descriptor.ServiceOptions. +// Extension fields to descriptorpb.ServiceOptions. var ( // optional rerost.giro.v1.HostOptions host_option = 50000; E_HostOption = &file_rerost_giro_hosts_proto_extTypes[0] @@ -202,10 +202,10 @@ func file_rerost_giro_hosts_proto_rawDescGZIP() []byte { var file_rerost_giro_hosts_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_rerost_giro_hosts_proto_goTypes = []any{ - (*HostOptions)(nil), // 0: rerost.giro.v1.HostOptions - (*GetHostRequest)(nil), // 1: rerost.giro.v1.GetHostRequest - (*GetHostResponse)(nil), // 2: rerost.giro.v1.GetHostResponse - (*descriptor.ServiceOptions)(nil), // 3: google.protobuf.ServiceOptions + (*HostOptions)(nil), // 0: rerost.giro.v1.HostOptions + (*GetHostRequest)(nil), // 1: rerost.giro.v1.GetHostRequest + (*GetHostResponse)(nil), // 2: rerost.giro.v1.GetHostResponse + (*descriptorpb.ServiceOptions)(nil), // 3: google.protobuf.ServiceOptions } var file_rerost_giro_hosts_proto_depIdxs = []int32{ 3, // 0: rerost.giro.v1.host_option:extendee -> google.protobuf.ServiceOptions diff --git a/rerost/giro/hosts_grpc.pb.go b/rerost/giro/hosts_grpc.pb.go index 4893ead..ad85af7 100644 --- a/rerost/giro/hosts_grpc.pb.go +++ b/rerost/giro/hosts_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v3.12.4 +// - protoc v4.25.1 // source: rerost/giro/hosts.proto package hosts_pb diff --git a/runner/genreflectionserver/testdata/with_host_option.pb b/runner/genreflectionserver/testdata/with_host_option.pb index 187a738dd3b45b6aa3d1f9577d8eac5ca10bc410..6eaf8dd3f1761b58023c4973483d1fbed8d4a342 100644 GIT binary patch literal 69340 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

yG`sf zH;qA^X<@D=SlHAbQ?~p|iw-W!<%0A$DHL{)E&GJSq@x4^u7{q`BrQVEA7=E_?V%rL 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 delta 14299 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 Date: Sat, 29 Mar 2025 05:53:51 +0000 Subject: [PATCH 13/21] Update protoc version to v5.29.4 in generated files Co-Authored-By: Hazumi Ichijo --- e2etest/dummyserver/echo.pb.go | 2 +- e2etest/dummyserver/echo_grpc.pb.go | 2 +- rerost/giro/hosts.pb.go | 2 +- rerost/giro/hosts_grpc.pb.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/e2etest/dummyserver/echo.pb.go b/e2etest/dummyserver/echo.pb.go index 316dc96..f0ecb11 100644 --- a/e2etest/dummyserver/echo.pb.go +++ b/e2etest/dummyserver/echo.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v4.25.1 +// protoc v5.29.4 // source: e2etest/dummyserver/echo.proto package dummyserver diff --git a/e2etest/dummyserver/echo_grpc.pb.go b/e2etest/dummyserver/echo_grpc.pb.go index cc9e2b9..4b74b77 100644 --- a/e2etest/dummyserver/echo_grpc.pb.go +++ b/e2etest/dummyserver/echo_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v4.25.1 +// - protoc v5.29.4 // source: e2etest/dummyserver/echo.proto package dummyserver diff --git a/rerost/giro/hosts.pb.go b/rerost/giro/hosts.pb.go index 8218a02..091fcfc 100644 --- a/rerost/giro/hosts.pb.go +++ b/rerost/giro/hosts.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v4.25.1 +// protoc v5.29.4 // source: rerost/giro/hosts.proto package hosts_pb diff --git a/rerost/giro/hosts_grpc.pb.go b/rerost/giro/hosts_grpc.pb.go index ad85af7..6aa629b 100644 --- a/rerost/giro/hosts_grpc.pb.go +++ b/rerost/giro/hosts_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v4.25.1 +// - protoc v5.29.4 // source: rerost/giro/hosts.proto package hosts_pb From fa18904b275c594be36262b1ecdb2d0fcb4e18c5 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:56:34 +0000 Subject: [PATCH 14/21] Fix empty.proto creation in Dockerfile Co-Authored-By: Hazumi Ichijo --- example/multiple_package/server/Dockerfile | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/example/multiple_package/server/Dockerfile b/example/multiple_package/server/Dockerfile index 1b6c606..f2c2770 100644 --- a/example/multiple_package/server/Dockerfile +++ b/example/multiple_package/server/Dockerfile @@ -17,11 +17,9 @@ RUN bundle install --jobs 4 && \ # Copy application files COPY . . -# Create empty.proto file if it doesn't exist +# Create empty.proto file RUN mkdir -p /usr/include/google/protobuf && \ - if [ ! -f /usr/include/google/protobuf/empty.proto ]; then \ - echo 'syntax = "proto3";\npackage google.protobuf;\nmessage Empty {}\n' > /usr/include/google/protobuf/empty.proto; \ - fi + echo -e 'syntax = "proto3";\npackage google.protobuf;\nmessage Empty {}\n' > /usr/include/google/protobuf/empty.proto # Set default port ENV APP_PORT=5001 From 1bf3bf0050c2b257afa06fed18c535f3d15840bb Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:57:18 +0000 Subject: [PATCH 15/21] Update protoc installation in CI workflow Co-Authored-By: Hazumi Ichijo --- .github/workflows/example.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/example.yml b/.github/workflows/example.yml index 501b7d6..3c0e276 100644 --- a/.github/workflows/example.yml +++ b/.github/workflows/example.yml @@ -59,7 +59,8 @@ jobs: - name: Install Protoc uses: arduino/setup-protoc@v3 with: - version: "29.x" + version: "5.29.4" + repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Checkout repository uses: actions/checkout@v4 - name: Set up Go From 4472c5e1a8833db132a4eb543e5799155bfc32dd Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:58:26 +0000 Subject: [PATCH 16/21] Update generated protobuf files Co-Authored-By: Hazumi Ichijo --- e2etest/dummyserver/echo.pb.go | 2 +- e2etest/dummyserver/echo_grpc.pb.go | 2 +- rerost/giro/hosts.pb.go | 2 +- rerost/giro/hosts_grpc.pb.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/e2etest/dummyserver/echo.pb.go b/e2etest/dummyserver/echo.pb.go index f0ecb11..316dc96 100644 --- a/e2etest/dummyserver/echo.pb.go +++ b/e2etest/dummyserver/echo.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v5.29.4 +// protoc v4.25.1 // source: e2etest/dummyserver/echo.proto package dummyserver diff --git a/e2etest/dummyserver/echo_grpc.pb.go b/e2etest/dummyserver/echo_grpc.pb.go index 4b74b77..cc9e2b9 100644 --- a/e2etest/dummyserver/echo_grpc.pb.go +++ b/e2etest/dummyserver/echo_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.4 +// - protoc v4.25.1 // source: e2etest/dummyserver/echo.proto package dummyserver diff --git a/rerost/giro/hosts.pb.go b/rerost/giro/hosts.pb.go index 091fcfc..8218a02 100644 --- a/rerost/giro/hosts.pb.go +++ b/rerost/giro/hosts.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v5.29.4 +// protoc v4.25.1 // source: rerost/giro/hosts.proto package hosts_pb diff --git a/rerost/giro/hosts_grpc.pb.go b/rerost/giro/hosts_grpc.pb.go index 6aa629b..ad85af7 100644 --- a/rerost/giro/hosts_grpc.pb.go +++ b/rerost/giro/hosts_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.4 +// - protoc v4.25.1 // source: rerost/giro/hosts.proto package hosts_pb From 9fb4f451f8bf0edd2dda56ff489105245103c0fa Mon Sep 17 00:00:00 2001 From: Hazumi Ichijo Date: Sat, 29 Mar 2025 15:05:52 +0900 Subject: [PATCH 17/21] Revert version --- .github/workflows/example.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/example.yml b/.github/workflows/example.yml index 3c0e276..501b7d6 100644 --- a/.github/workflows/example.yml +++ b/.github/workflows/example.yml @@ -59,8 +59,7 @@ jobs: - name: Install Protoc uses: arduino/setup-protoc@v3 with: - version: "5.29.4" - repo-token: ${{ secrets.GITHUB_TOKEN }} + version: "29.x" - name: Checkout repository uses: actions/checkout@v4 - name: Set up Go From cecb553283db3b8dbaec52c73c3674e3c6b8ea42 Mon Sep 17 00:00:00 2001 From: Hazumi Ichijo Date: Sat, 29 Mar 2025 15:07:44 +0900 Subject: [PATCH 18/21] Update protoc (#156) Co-authored-by: bot <5201588+rerost@users.noreply.github.com> --- e2etest/dummyserver/echo.pb.go | 2 +- e2etest/dummyserver/echo_grpc.pb.go | 2 +- example/multiple_package/protos/one/one.pb.go | 6 +++--- example/multiple_package/protos/one/one_grpc.pb.go | 4 ++-- example/multiple_package/protos/two/two.pb.go | 2 +- example/multiple_package/protos/two/two_grpc.pb.go | 2 +- rerost/giro/hosts.pb.go | 2 +- rerost/giro/hosts_grpc.pb.go | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/e2etest/dummyserver/echo.pb.go b/e2etest/dummyserver/echo.pb.go index 316dc96..f0ecb11 100644 --- a/e2etest/dummyserver/echo.pb.go +++ b/e2etest/dummyserver/echo.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v4.25.1 +// protoc v5.29.4 // source: e2etest/dummyserver/echo.proto package dummyserver diff --git a/e2etest/dummyserver/echo_grpc.pb.go b/e2etest/dummyserver/echo_grpc.pb.go index cc9e2b9..4b74b77 100644 --- a/e2etest/dummyserver/echo_grpc.pb.go +++ b/e2etest/dummyserver/echo_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v4.25.1 +// - protoc v5.29.4 // source: e2etest/dummyserver/echo.proto package dummyserver diff --git a/example/multiple_package/protos/one/one.pb.go b/example/multiple_package/protos/one/one.pb.go index 45f12cb..5cf7515 100644 --- a/example/multiple_package/protos/one/one.pb.go +++ b/example/multiple_package/protos/one/one.pb.go @@ -1,15 +1,15 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.12.4 +// protoc v5.29.4 // source: protos/one/one.proto package one_pb import ( - emptypb "google.golang.org/protobuf/types/known/emptypb" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" sync "sync" ) @@ -254,7 +254,7 @@ var file_protos_one_one_proto_goTypes = []interface{}{ (*GiroTestRequest2)(nil), // 1: example.multiple_package.protos.one.GiroTestRequest2 (*GiroTestResponse1)(nil), // 2: example.multiple_package.protos.one.GiroTestResponse1 (*GiroTestResponse2)(nil), // 3: example.multiple_package.protos.one.GiroTestResponse2 - (*emptypb.Empty)(nil), // 4: google.protobuf.Empty + (*emptypb.Empty)(nil), // 4: google.protobuf.Empty } var file_protos_one_one_proto_depIdxs = []int32{ 0, // 0: example.multiple_package.protos.one.GiroService.GiroTest1:input_type -> example.multiple_package.protos.one.GiroTestRequest1 diff --git a/example/multiple_package/protos/one/one_grpc.pb.go b/example/multiple_package/protos/one/one_grpc.pb.go index aa982b6..2d3dbbe 100644 --- a/example/multiple_package/protos/one/one_grpc.pb.go +++ b/example/multiple_package/protos/one/one_grpc.pb.go @@ -1,17 +1,17 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v3.12.4 +// - protoc v5.29.4 // source: protos/one/one.proto package one_pb import ( context "context" - emptypb "google.golang.org/protobuf/types/known/emptypb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" ) // This is a compile-time assertion to ensure that this generated file diff --git a/example/multiple_package/protos/two/two.pb.go b/example/multiple_package/protos/two/two.pb.go index 634052f..7dc6130 100644 --- a/example/multiple_package/protos/two/two.pb.go +++ b/example/multiple_package/protos/two/two.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.12.4 +// protoc v5.29.4 // source: protos/two/two.proto package two_pb diff --git a/example/multiple_package/protos/two/two_grpc.pb.go b/example/multiple_package/protos/two/two_grpc.pb.go index a20ba97..310e34f 100644 --- a/example/multiple_package/protos/two/two_grpc.pb.go +++ b/example/multiple_package/protos/two/two_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v3.12.4 +// - protoc v5.29.4 // source: protos/two/two.proto package two_pb diff --git a/rerost/giro/hosts.pb.go b/rerost/giro/hosts.pb.go index 8218a02..091fcfc 100644 --- a/rerost/giro/hosts.pb.go +++ b/rerost/giro/hosts.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.6 -// protoc v4.25.1 +// protoc v5.29.4 // source: rerost/giro/hosts.proto package hosts_pb diff --git a/rerost/giro/hosts_grpc.pb.go b/rerost/giro/hosts_grpc.pb.go index ad85af7..6aa629b 100644 --- a/rerost/giro/hosts_grpc.pb.go +++ b/rerost/giro/hosts_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v4.25.1 +// - protoc v5.29.4 // source: rerost/giro/hosts.proto package hosts_pb From eae7765daf139a0e82bca963bd645e7b2ba34d5a Mon Sep 17 00:00:00 2001 From: Hazumi Ichijo Date: Sat, 29 Mar 2025 15:08:21 +0900 Subject: [PATCH 19/21] Remove creation of empty.proto file --- example/multiple_package/server/Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/example/multiple_package/server/Dockerfile b/example/multiple_package/server/Dockerfile index f2c2770..88a94e4 100644 --- a/example/multiple_package/server/Dockerfile +++ b/example/multiple_package/server/Dockerfile @@ -17,10 +17,6 @@ RUN bundle install --jobs 4 && \ # Copy application files COPY . . -# Create empty.proto file -RUN mkdir -p /usr/include/google/protobuf && \ - echo -e 'syntax = "proto3";\npackage google.protobuf;\nmessage Empty {}\n' > /usr/include/google/protobuf/empty.proto - # Set default port ENV APP_PORT=5001 From 5c61336e98932799603adefb06876909bd4a33dc Mon Sep 17 00:00:00 2001 From: Hazumi Ichijo Date: Sat, 29 Mar 2025 16:10:39 +0900 Subject: [PATCH 20/21] probabilistically success --- domain/grpcreflectiface/client.go | 88 +++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/domain/grpcreflectiface/client.go b/domain/grpcreflectiface/client.go index 8bdb47a..28fc7d9 100644 --- a/domain/grpcreflectiface/client.go +++ b/domain/grpcreflectiface/client.go @@ -52,6 +52,40 @@ func (c *clientImpl) ListServices() ([]string, error) { return services, nil } +func (c *clientImpl) resolveFiles(files map[string]*descriptorpb.FileDescriptorProto, dep string) error { + if _, ok := files[dep]; ok { + return nil + } + + depReq := grpc_reflection_v1.ServerReflectionRequest{ + MessageRequest: &grpc_reflection_v1.ServerReflectionRequest_FileByFilename{ + FileByFilename: dep, + }, + } + + depResp, err := c.call(&depReq) + if err != nil { + // Skip if file not found + return nil + } + + for _, depFdProtoBytes := range depResp.GetFileDescriptorResponse().FileDescriptorProto { + var depFdProto descriptorpb.FileDescriptorProto + if err := proto.Unmarshal(depFdProtoBytes, &depFdProto); err != nil { + return errors.WithStack(err) + } + files[depFdProto.GetName()] = &depFdProto + // Resolve nested dependencies + for _, nestedDep := range depFdProto.GetDependency() { + if err := c.resolveFiles(files, nestedDep); err != nil { + return err + } + } + } + + return nil +} + func (c *clientImpl) ResolveService(serviceName string) (protoreflect.ServiceDescriptor, error) { req := grpc_reflection_v1.ServerReflectionRequest{ MessageRequest: &grpc_reflection_v1.ServerReflectionRequest_FileContainingSymbol{ @@ -68,14 +102,38 @@ func (c *clientImpl) ResolveService(serviceName string) (protoreflect.ServiceDes if resp.GetFileDescriptorResponse() == nil { return nil, nil } + + files := map[string]*descriptorpb.FileDescriptorProto{} for _, fdProtoBytes := range resp.GetFileDescriptorResponse().FileDescriptorProto { var fdProto descriptorpb.FileDescriptorProto - if err := proto.Unmarshal(fdProtoBytes, &fdProto); err != nil { return nil, errors.WithStack(err) } + files[fdProto.GetName()] = &fdProto + + // 依存するprotoファイルを取得 + for _, dep := range fdProto.GetDependency() { + if err := c.resolveFiles(files, dep); err != nil { + return nil, err + } + } + } + + // ファイルをレジストリに登録 + registry := &protoregistry.Files{} + for _, fdProto := range files { + file, err := protodesc.NewFile(fdProto, registry) + if err != nil { + return nil, errors.WithStack(err) + } + if err := registry.RegisterFile(file); err != nil { + return nil, errors.WithStack(err) + } + } - file, err := protodesc.NewFile(&fdProto, protoregistry.GlobalFiles) + // サービスディスクリプタを探す + for _, fdProto := range files { + file, err := protodesc.NewFile(fdProto, registry) if err != nil { return nil, errors.WithStack(err) } @@ -102,14 +160,38 @@ func (c *clientImpl) ResolveMessage(messageName string) (proto.Message, error) { } var dynamicMessage proto.Message + files := map[string]*descriptorpb.FileDescriptorProto{} for _, fdProtoBytes := range resp.GetFileDescriptorResponse().FileDescriptorProto { var fdProto descriptorpb.FileDescriptorProto if err := proto.Unmarshal(fdProtoBytes, &fdProto); err != nil { return nil, errors.WithStack(err) } + files[fdProto.GetName()] = &fdProto + + // 依存するprotoファイルを取得 + for _, dep := range fdProto.GetDependency() { + if err := c.resolveFiles(files, dep); err != nil { + return nil, err + } + } + } + + // ファイルをレジストリに登録 + registry := &protoregistry.Files{} + for _, fdProto := range files { + file, err := protodesc.NewFile(fdProto, registry) + if err != nil { + return nil, errors.WithStack(err) + } + if err := registry.RegisterFile(file); err != nil { + return nil, errors.WithStack(err) + } + } - file, err := protodesc.NewFile(&fdProto, protoregistry.GlobalFiles) + // メッセージディスクリプタを探す + for _, fdProto := range files { + file, err := protodesc.NewFile(fdProto, registry) if err != nil { return nil, errors.WithStack(err) } From 005594bd0f790f202cd472cf32e19fd2b562bf43 Mon Sep 17 00:00:00 2001 From: Hazumi Ichijo Date: Sat, 29 Mar 2025 16:56:52 +0900 Subject: [PATCH 21/21] Fix --- domain/grpcreflectiface/client.go | 166 ++++++++++++++++-------------- 1 file changed, 89 insertions(+), 77 deletions(-) diff --git a/domain/grpcreflectiface/client.go b/domain/grpcreflectiface/client.go index 28fc7d9..b61ed4b 100644 --- a/domain/grpcreflectiface/client.go +++ b/domain/grpcreflectiface/client.go @@ -4,6 +4,7 @@ import ( "sync" "github.com/pkg/errors" + "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/reflection/grpc_reflection_v1" "google.golang.org/protobuf/proto" @@ -51,41 +52,6 @@ func (c *clientImpl) ListServices() ([]string, error) { return services, nil } - -func (c *clientImpl) resolveFiles(files map[string]*descriptorpb.FileDescriptorProto, dep string) error { - if _, ok := files[dep]; ok { - return nil - } - - depReq := grpc_reflection_v1.ServerReflectionRequest{ - MessageRequest: &grpc_reflection_v1.ServerReflectionRequest_FileByFilename{ - FileByFilename: dep, - }, - } - - depResp, err := c.call(&depReq) - if err != nil { - // Skip if file not found - return nil - } - - for _, depFdProtoBytes := range depResp.GetFileDescriptorResponse().FileDescriptorProto { - var depFdProto descriptorpb.FileDescriptorProto - if err := proto.Unmarshal(depFdProtoBytes, &depFdProto); err != nil { - return errors.WithStack(err) - } - files[depFdProto.GetName()] = &depFdProto - // Resolve nested dependencies - for _, nestedDep := range depFdProto.GetDependency() { - if err := c.resolveFiles(files, nestedDep); err != nil { - return err - } - } - } - - return nil -} - func (c *clientImpl) ResolveService(serviceName string) (protoreflect.ServiceDescriptor, error) { req := grpc_reflection_v1.ServerReflectionRequest{ MessageRequest: &grpc_reflection_v1.ServerReflectionRequest_FileContainingSymbol{ @@ -103,48 +69,48 @@ func (c *clientImpl) ResolveService(serviceName string) (protoreflect.ServiceDes return nil, nil } - files := map[string]*descriptorpb.FileDescriptorProto{} + // ファイルをレジストリに登録 + registry := &protoregistry.Files{} + checkedFdNames := map[string]bool{} + registerFunc := func(fdProto *descriptorpb.FileDescriptorProto) error { + // 重複排除 + if _, ok := checkedFdNames[fdProto.GetName()]; ok { + return nil + } + checkedFdNames[fdProto.GetName()] = true + + file, err := protodesc.NewFile(fdProto, registry) + if err != nil { + return errors.WithStack(err) + } + return errors.WithStack(registry.RegisterFile(file)) + } + for _, fdProtoBytes := range resp.GetFileDescriptorResponse().FileDescriptorProto { var fdProto descriptorpb.FileDescriptorProto if err := proto.Unmarshal(fdProtoBytes, &fdProto); err != nil { return nil, errors.WithStack(err) } - files[fdProto.GetName()] = &fdProto - // 依存するprotoファイルを取得 - for _, dep := range fdProto.GetDependency() { - if err := c.resolveFiles(files, dep); err != nil { - return nil, err - } + if err := c.resolveFiles(registerFunc, &fdProto); err != nil { + return nil, err } } - - // ファイルをレジストリに登録 - registry := &protoregistry.Files{} - for _, fdProto := range files { - file, err := protodesc.NewFile(fdProto, registry) - if err != nil { - return nil, errors.WithStack(err) - } - if err := registry.RegisterFile(file); err != nil { + for _, fdProtoBytes := range resp.GetFileDescriptorResponse().FileDescriptorProto { + var fdProto descriptorpb.FileDescriptorProto + if err := proto.Unmarshal(fdProtoBytes, &fdProto); err != nil { return nil, errors.WithStack(err) } - } - - // サービスディスクリプタを探す - for _, fdProto := range files { - file, err := protodesc.NewFile(fdProto, registry) + file, err := protodesc.NewFile(&fdProto, registry) if err != nil { return nil, errors.WithStack(err) } - svcDescriptor = file.Services().ByName(protoreflect.FullName(serviceName).Name()) if svcDescriptor != nil { - break + return svcDescriptor, nil } } - - return svcDescriptor, nil + return nil, errors.New("service not found") } func (c *clientImpl) ResolveMessage(messageName string) (proto.Message, error) { @@ -159,6 +125,20 @@ func (c *clientImpl) ResolveMessage(messageName string) (proto.Message, error) { return nil, errors.WithStack(err) } + registry := &protoregistry.Files{} + checkedFdNames := map[string]bool{} + registerFunc := func(fdProto *descriptorpb.FileDescriptorProto) error { + // 重複排除 + if _, ok := checkedFdNames[fdProto.GetName()]; ok { + return nil + } + checkedFdNames[fdProto.GetName()] = true + file, err := protodesc.NewFile(fdProto, registry) + if err != nil { + return errors.WithStack(err) + } + return registry.RegisterFile(file) + } var dynamicMessage proto.Message files := map[string]*descriptorpb.FileDescriptorProto{} for _, fdProtoBytes := range resp.GetFileDescriptorResponse().FileDescriptorProto { @@ -169,23 +149,8 @@ func (c *clientImpl) ResolveMessage(messageName string) (proto.Message, error) { } files[fdProto.GetName()] = &fdProto - // 依存するprotoファイルを取得 - for _, dep := range fdProto.GetDependency() { - if err := c.resolveFiles(files, dep); err != nil { - return nil, err - } - } - } - - // ファイルをレジストリに登録 - registry := &protoregistry.Files{} - for _, fdProto := range files { - file, err := protodesc.NewFile(fdProto, registry) - if err != nil { - return nil, errors.WithStack(err) - } - if err := registry.RegisterFile(file); err != nil { - return nil, errors.WithStack(err) + if err := c.resolveFiles(registerFunc, &fdProto); err != nil { + return nil, err } } @@ -223,3 +188,50 @@ func (c *clientImpl) call(request *grpc_reflection_v1.ServerReflectionRequest) ( return response, nil } + +// 取得したfdProtoをRegisterFileする +// 依存関係の末端からRegisterする +// 依存関係が、FileA -> FileB の時、registerFuncが registerFunc(FileB), registerFunc(FileA) の順で呼ばれる +// 深さ優先探索でRegister +func (c *clientImpl) resolveFiles( + registerFunc func(fdProto *descriptorpb.FileDescriptorProto) error, + fdProto *descriptorpb.FileDescriptorProto, +) error { + return c.resolveFilesInner(registerFunc, fdProto) +} + +func (c *clientImpl) resolveFilesInner( + registerFunc func(fdProto *descriptorpb.FileDescriptorProto) error, + fdProto *descriptorpb.FileDescriptorProto, +) error { + // 依存関係にあるファイルの、依存関係を解決 + for _, depFdName := range fdProto.Dependency { + depReq := grpc_reflection_v1.ServerReflectionRequest{ + MessageRequest: &grpc_reflection_v1.ServerReflectionRequest_FileByFilename{ + FileByFilename: depFdName, + }, + } + depResp, err := c.call(&depReq) + if err != nil { + return errors.WithStack(err) + } + + for _, depFdProtoBytes := range depResp.GetFileDescriptorResponse().FileDescriptorProto { + zap.L().Debug("Protofile Dependency", zap.String("sourceProto", fdProto.GetName()), zap.String("dependencyProto", depFdName)) + var depFdProto descriptorpb.FileDescriptorProto + if err := proto.Unmarshal(depFdProtoBytes, &depFdProto); err != nil { + return errors.WithStack(err) + } + if err := c.resolveFilesInner(registerFunc, &depFdProto); err != nil { + return errors.WithStack(err) + } + } + } + + // 自分自身をRegister + if err := registerFunc(fdProto); err != nil { + return errors.WithStack(err) + } + + return nil +}