grpc-rest 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c776db1bb156562864c41be6a4af47debe30d420329359847e71db6b5913711
4
- data.tar.gz: 7c4745a5d2dd7e560d0e18b022972473a4487bedf9b9efc4ba387d5cbe42bfc0
3
+ metadata.gz: 3b19a325cd920ec6632682c8f91b54e06a09444cece910dbc176e898f8e504cb
4
+ data.tar.gz: 3fa53b62032088e7e57cae354326188cb93c22312d7dc463111b4d5a6992b68c
5
5
  SHA512:
6
- metadata.gz: 4e7f53b6c264c80f768dd91c0c25da350651cd386d7a51b88f7eedf814d2f0eced41a261ee9e3800ba867fdb69bc4a87ac22700c6b33ae3d50d576555b66875e
7
- data.tar.gz: 456d38962848fc73f1c40f0a59336de1d17017e2e138511f046836674a947a11390b20b7180a4b7d4d5befa6f132a23793d5cc7518263a93c1ed0be8255fa246
6
+ metadata.gz: 235e5ea946e9e6b10be20485775d0f55f46b0ab1ecb7612f75e98c75be7ff0ca75b438e1649d3abc298196501615425675968cf0605f8968e3771cd8cde897e6
7
+ data.tar.gz: 10d3caaa87389dca93982af06ce8143e615d0b6b2133f9485c4d51ec6e18b043faaa836960fcc141954e0fac07b644eba50b256062a22f5fed8c5b5a4f04da4a
data/CHANGELOG CHANGED
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## UNRELEASED
9
9
 
10
+ # 0.1.20 - 2024-09-10
11
+ - Fix: Repeated float values weren't being treated as arrays and were crashing.
12
+
13
+ # 0.1.19 - 2024-08-22
14
+
15
+ - Add `emit_defaults` extension for JSON responses.
16
+
10
17
  # 0.1.18 - 2024-08-15
11
18
  - Automatically add prefixes to enum values if not provided
12
19
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grpc-rest (0.1.17)
4
+ grpc-rest (0.1.19)
5
5
  grpc
6
6
  rails (>= 6.0)
7
7
 
data/README.md CHANGED
@@ -130,9 +130,32 @@ end
130
130
 
131
131
  This gem does not currently support the full path expression capabilities of grpc-gateway or the Google [http proto](https://github.com/googleapis/googleapis/blob/master/google/api/http.proto). It only supports very basic single wildcard globbing (`*`). Contributions are welcome for more complex cases if they are needed.
132
132
 
133
+ ## Proto Options
134
+
135
+ By default, grpc-rest uses the Protobuf default of omitting empty values on response. You can change this behavior by using an OpenAPI extension with the key `x-grpc-rest-emit-defaults`:
136
+
137
+ ```protobuf
138
+ service MyService {
139
+ rpc Test(MyRequest) returns (MyResponse) {
140
+ option (google.api.http) = {
141
+ get: "/test/"
142
+ };
143
+ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
144
+ extensions: {
145
+ key: 'x-grpc-rest-emit-defaults';
146
+ value: {
147
+ bool_value: true;
148
+ }
149
+ }
150
+ };
151
+ }
152
+ }
153
+ ```
154
+
155
+
133
156
  ## To Do
134
157
 
135
- * Replace Go implementation with Ruby (+ executable) once [service and method lookup](https://github.com/protocolbuffers/protobuf/pull/15817) is released.
158
+ * Replace Go implementation with Ruby (+ executable)
136
159
 
137
160
  ## Contributing
138
161
 
@@ -1,3 +1,3 @@
1
1
  module GrpcRest
2
- VERSION = '0.1.18'
2
+ VERSION = '0.1.20'
3
3
  end
data/lib/grpc_rest.rb CHANGED
@@ -63,56 +63,55 @@ module GrpcRest
63
63
  end
64
64
  end
65
65
 
66
- def map_proto_type(proto, params)
66
+ def map_proto_type(descriptor, val)
67
+ if descriptor.subtype.is_a?(Google::Protobuf::EnumDescriptor)
68
+ return handle_enum_values(descriptor, val)
69
+ end
70
+
71
+ case descriptor.type
72
+ when *%i(int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64)
73
+ return val.to_i
74
+ when *%i(float double)
75
+ return val.to_f
76
+ when :bool
77
+ return !!val
78
+ end
79
+
80
+ case descriptor.subtype&.name
81
+ when 'google.protobuf.Struct'
82
+ return Google::Protobuf::Struct.from_hash(val)
83
+ when 'google.protobuf.Timestamp'
84
+ if val.is_a?(Numeric)
85
+ return Google::Protobuf::Timestamp.from_time(Time.at(val))
86
+ else
87
+ return Google::Protobuf::Timestamp.from_time(Time.new(val))
88
+ end
89
+ when 'google.protobuf.Value'
90
+ return Google::Protobuf::Value.from_ruby(val)
91
+ when 'google.protobuf.ListValue'
92
+ return Google::Protobuf::ListValue.from_a(val)
93
+ else
94
+ return map_proto_record(descriptor.subtype, val)
95
+ end
96
+ end
97
+
98
+ def map_proto_record(proto, params)
67
99
  proto.to_a.each do |descriptor|
68
100
  field = descriptor.name
69
101
  val = params[field]
70
102
  next if val.nil?
71
- if descriptor.subtype.is_a?(Google::Protobuf::EnumDescriptor)
72
- if descriptor.label == :repeated
73
- params[field] = val.map { |v| handle_enum_values(descriptor, v)}
74
- else
75
- params[field] = handle_enum_values(descriptor, val)
76
- end
77
- next
78
- end
79
-
80
- case descriptor.type
81
- when *%i(int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64)
82
- params[field] = val.to_i
83
- when *%i(float double)
84
- params[field] = val.to_f
85
- when :bool
86
- params[field] = !!val
87
- end
88
103
 
89
- case descriptor.subtype&.name
90
- when 'google.protobuf.Struct'
91
- params[field] = Google::Protobuf::Struct.from_hash(val)
92
- when 'google.protobuf.Timestamp'
93
- if val.is_a?(Numeric)
94
- params[field] = Google::Protobuf::Timestamp.from_time(Time.at(val))
95
- else
96
- params[field] = Google::Protobuf::Timestamp.from_time(Time.new(val))
97
- end
98
- when 'google.protobuf.Value'
99
- params[field] = Google::Protobuf::Value.from_ruby(val)
100
- when 'google.protobuf.ListValue'
101
- params[field] = Google::Protobuf::ListValue.from_a(val)
104
+ if descriptor.label == :repeated
105
+ params[field] = val.map { |v| map_proto_type(descriptor, v) }
102
106
  else
103
- if params[field].is_a?(Array)
104
- params[field].each do |item|
105
- map_proto_type(descriptor.subtype, item)
106
- end
107
- else
108
- map_proto_type(descriptor.subtype, params[field])
109
- end
107
+ params[field] = map_proto_type(descriptor, val)
110
108
  end
111
109
  end
110
+ params
112
111
  end
113
112
 
114
113
  def init_request(request_class, params)
115
- map_proto_type(request_class.descriptor, params)
114
+ map_proto_record(request_class.descriptor, params)
116
115
  request_class.decode_json(JSON.generate(params), ignore_unknown_fields: true)
117
116
  end
118
117
 
@@ -212,7 +211,7 @@ module GrpcRest
212
211
  klass.new.public_send(method, request)
213
212
  end
214
213
 
215
- def send_request(service, method, request)
214
+ def get_response(service, method, request)
216
215
  if defined?(Gruf)
217
216
  service_obj = service.constantize::Service
218
217
  klass = ::Gruf::Controllers::Base.subclasses.find do |k|
@@ -224,6 +223,15 @@ module GrpcRest
224
223
  end
225
224
  send_grpc_request(service, method, request)
226
225
  end
226
+
227
+ def send_request(service, method, request, options={})
228
+ response = get_response(service, method, request)
229
+ if options[:emit_defaults]
230
+ response.to_json(emit_defaults: true)
231
+ else
232
+ response
233
+ end
234
+ end
227
235
  end
228
236
 
229
237
  end
@@ -5,17 +5,21 @@ go 1.22.0
5
5
  require (
6
6
  github.com/iancoleman/strcase v0.3.0
7
7
  github.com/stretchr/testify v1.8.4
8
- google.golang.org/genproto/googleapis/api v0.0.0-20240228224816-df926f6c8641
9
- google.golang.org/protobuf v1.32.0
8
+ google.golang.org/genproto/googleapis/api v0.0.0-20240820151423-278611b39280
9
+ google.golang.org/protobuf v1.34.2
10
10
  )
11
11
 
12
12
  require (
13
13
  github.com/davecgh/go-spew v1.1.1 // indirect
14
14
  github.com/google/go-cmp v0.6.0 // indirect
15
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
15
16
  github.com/kr/pretty v0.3.1 // indirect
16
17
  github.com/pmezard/go-difflib v1.0.0 // indirect
17
18
  github.com/rogpeppe/go-internal v1.12.0 // indirect
19
+ golang.org/x/text v0.17.0 // indirect
18
20
  google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac // indirect
21
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20240820151423-278611b39280 // indirect
22
+ google.golang.org/grpc v1.65.0 // indirect
19
23
  gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
20
24
  gopkg.in/yaml.v3 v3.0.1 // indirect
21
25
  )
@@ -3,6 +3,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
3
3
  github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4
4
  github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
5
5
  github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
6
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
7
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
6
8
  github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
7
9
  github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
8
10
  github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -20,14 +22,26 @@ github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU
20
22
  github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
21
23
  github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
22
24
  github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
25
+ golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
26
+ golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
23
27
  google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg=
24
28
  google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k=
25
29
  google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe h1:0poefMBYvYbs7g5UkjS6HcxBPaTRAmznle9jnxYoAI8=
26
30
  google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA=
27
31
  google.golang.org/genproto/googleapis/api v0.0.0-20240228224816-df926f6c8641 h1:SO1wX9btGFrwj9EzH3ocqfwiPVOxfv4ggAJajzlHA5s=
28
32
  google.golang.org/genproto/googleapis/api v0.0.0-20240228224816-df926f6c8641/go.mod h1:wLupoVsUfYPgOMwjzhYFbaVklw/INms+dqTp0tc1fv8=
33
+ google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8=
34
+ google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo=
35
+ google.golang.org/genproto/googleapis/api v0.0.0-20240820151423-278611b39280 h1:YDFM9oOjiFhaMAVgbDxfxW+66nRrsvzQzJ51wp3OxC0=
36
+ google.golang.org/genproto/googleapis/api v0.0.0-20240820151423-278611b39280/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g=
37
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20240820151423-278611b39280 h1:XQMA2e105XNlEZ8NRF0HqnUOZzP14sUSsgL09kpdNnU=
38
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20240820151423-278611b39280/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
39
+ google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
40
+ google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
29
41
  google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
30
42
  google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
43
+ google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
44
+ google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
31
45
  gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
32
46
  gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
33
47
  gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -0,0 +1,44 @@
1
+ syntax = "proto3";
2
+
3
+ package grpc.gateway.protoc_gen_openapiv2.options;
4
+
5
+ import "google/protobuf/descriptor.proto";
6
+ import "protoc-gen-openapiv2/options/openapiv2.proto";
7
+
8
+ option go_package = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options";
9
+
10
+ extend google.protobuf.FileOptions {
11
+ // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.
12
+ //
13
+ // All IDs are the same, as assigned. It is okay that they are the same, as they extend
14
+ // different descriptor messages.
15
+ Swagger openapiv2_swagger = 1042;
16
+ }
17
+ extend google.protobuf.MethodOptions {
18
+ // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.
19
+ //
20
+ // All IDs are the same, as assigned. It is okay that they are the same, as they extend
21
+ // different descriptor messages.
22
+ Operation openapiv2_operation = 1042;
23
+ }
24
+ extend google.protobuf.MessageOptions {
25
+ // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.
26
+ //
27
+ // All IDs are the same, as assigned. It is okay that they are the same, as they extend
28
+ // different descriptor messages.
29
+ Schema openapiv2_schema = 1042;
30
+ }
31
+ extend google.protobuf.ServiceOptions {
32
+ // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.
33
+ //
34
+ // All IDs are the same, as assigned. It is okay that they are the same, as they extend
35
+ // different descriptor messages.
36
+ Tag openapiv2_tag = 1042;
37
+ }
38
+ extend google.protobuf.FieldOptions {
39
+ // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project.
40
+ //
41
+ // All IDs are the same, as assigned. It is okay that they are the same, as they extend
42
+ // different descriptor messages.
43
+ JSONSchema openapiv2_field = 1042;
44
+ }