grpc 1.31.1-universal-darwin → 1.32.0.pre1-universal-darwin

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eee55d3aee8df780639c8d39286071311acbf30476d109690a43aa1cc5dbbfe7
4
- data.tar.gz: 761e86bcfca944eaab0b7f7a609c4f8e820974c20f0a5447b67d03e61b368a25
3
+ metadata.gz: 03ad97e8bab81c23d0c059ce78946472d59183456400f8bedf60038c2c03f12a
4
+ data.tar.gz: 4f817a8d2932f1bf6dcd4bc5f2bb3ccafac4ee03975f7796ee2ac832b67523f7
5
5
  SHA512:
6
- metadata.gz: bdbbeef61662c11729e856b151af5f3600d2b7e047cfdbac42ef5037a96bfe3f31833692db31a3eefd2f1949a0193e238f75143e5990d935ca2bea57a9f64f16
7
- data.tar.gz: 16cae038ab790647d6acf9c69ff3e83a2104a54725c9c4f9749b347dec3c2f48b4243b3c1c5095c556617de0ab0eb357fd73a76753671f382d7fa5f620b0a3b9
6
+ metadata.gz: 20119b3ca4e98bfa82bb3f0ed6da9bb9f3f054d80a46b9a2c26dba653ace4ea2ed36c9f397b66bfa6a9a3d5327bf8a1d6a57f482e0270bc9c35c1446f7aed656
7
+ data.tar.gz: 7ebc15f8aee3f1a1ada15067aa6e31b093054cd3d87d5dbabf663c50ac19aafcee6914e0983e3337e034d2d8aee3919912da77b836685b1f76457a9fe7101114
@@ -165,6 +165,15 @@ static VALUE grpc_rb_channel_credentials_init(int argc, VALUE* argv,
165
165
  if (pem_private_key == Qnil && pem_cert_chain == Qnil) {
166
166
  creds = grpc_ssl_credentials_create(pem_root_certs_cstr, NULL, NULL, NULL);
167
167
  } else {
168
+ if (pem_private_key == Qnil) {
169
+ rb_raise(
170
+ rb_eRuntimeError,
171
+ "could not create a credentials because pem_private_key is NULL");
172
+ }
173
+ if (pem_cert_chain == Qnil) {
174
+ rb_raise(rb_eRuntimeError,
175
+ "could not create a credentials because pem_cert_chain is NULL");
176
+ }
168
177
  key_cert_pair.private_key = RSTRING_PTR(pem_private_key);
169
178
  key_cert_pair.cert_chain = RSTRING_PTR(pem_cert_chain);
170
179
  creds = grpc_ssl_credentials_create(pem_root_certs_cstr, &key_cert_pair,
@@ -120,12 +120,12 @@ grpc_auth_context_set_peer_identity_property_name_type grpc_auth_context_set_pee
120
120
  grpc_ssl_session_cache_create_lru_type grpc_ssl_session_cache_create_lru_import;
121
121
  grpc_ssl_session_cache_destroy_type grpc_ssl_session_cache_destroy_import;
122
122
  grpc_ssl_session_cache_create_channel_arg_type grpc_ssl_session_cache_create_channel_arg_import;
123
+ grpc_call_credentials_release_type grpc_call_credentials_release_import;
123
124
  grpc_channel_credentials_release_type grpc_channel_credentials_release_import;
124
125
  grpc_google_default_credentials_create_type grpc_google_default_credentials_create_import;
125
126
  grpc_set_ssl_roots_override_callback_type grpc_set_ssl_roots_override_callback_import;
126
127
  grpc_ssl_credentials_create_type grpc_ssl_credentials_create_import;
127
128
  grpc_ssl_credentials_create_ex_type grpc_ssl_credentials_create_ex_import;
128
- grpc_call_credentials_release_type grpc_call_credentials_release_import;
129
129
  grpc_composite_channel_credentials_create_type grpc_composite_channel_credentials_create_import;
130
130
  grpc_composite_call_credentials_create_type grpc_composite_call_credentials_create_import;
131
131
  grpc_google_compute_engine_credentials_create_type grpc_google_compute_engine_credentials_create_import;
@@ -394,12 +394,12 @@ void grpc_rb_load_imports(HMODULE library) {
394
394
  grpc_ssl_session_cache_create_lru_import = (grpc_ssl_session_cache_create_lru_type) GetProcAddress(library, "grpc_ssl_session_cache_create_lru");
395
395
  grpc_ssl_session_cache_destroy_import = (grpc_ssl_session_cache_destroy_type) GetProcAddress(library, "grpc_ssl_session_cache_destroy");
396
396
  grpc_ssl_session_cache_create_channel_arg_import = (grpc_ssl_session_cache_create_channel_arg_type) GetProcAddress(library, "grpc_ssl_session_cache_create_channel_arg");
397
+ grpc_call_credentials_release_import = (grpc_call_credentials_release_type) GetProcAddress(library, "grpc_call_credentials_release");
397
398
  grpc_channel_credentials_release_import = (grpc_channel_credentials_release_type) GetProcAddress(library, "grpc_channel_credentials_release");
398
399
  grpc_google_default_credentials_create_import = (grpc_google_default_credentials_create_type) GetProcAddress(library, "grpc_google_default_credentials_create");
399
400
  grpc_set_ssl_roots_override_callback_import = (grpc_set_ssl_roots_override_callback_type) GetProcAddress(library, "grpc_set_ssl_roots_override_callback");
400
401
  grpc_ssl_credentials_create_import = (grpc_ssl_credentials_create_type) GetProcAddress(library, "grpc_ssl_credentials_create");
401
402
  grpc_ssl_credentials_create_ex_import = (grpc_ssl_credentials_create_ex_type) GetProcAddress(library, "grpc_ssl_credentials_create_ex");
402
- grpc_call_credentials_release_import = (grpc_call_credentials_release_type) GetProcAddress(library, "grpc_call_credentials_release");
403
403
  grpc_composite_channel_credentials_create_import = (grpc_composite_channel_credentials_create_type) GetProcAddress(library, "grpc_composite_channel_credentials_create");
404
404
  grpc_composite_call_credentials_create_import = (grpc_composite_call_credentials_create_type) GetProcAddress(library, "grpc_composite_call_credentials_create");
405
405
  grpc_google_compute_engine_credentials_create_import = (grpc_google_compute_engine_credentials_create_type) GetProcAddress(library, "grpc_google_compute_engine_credentials_create");
@@ -335,10 +335,13 @@ extern grpc_ssl_session_cache_destroy_type grpc_ssl_session_cache_destroy_import
335
335
  typedef grpc_arg(*grpc_ssl_session_cache_create_channel_arg_type)(grpc_ssl_session_cache* cache);
336
336
  extern grpc_ssl_session_cache_create_channel_arg_type grpc_ssl_session_cache_create_channel_arg_import;
337
337
  #define grpc_ssl_session_cache_create_channel_arg grpc_ssl_session_cache_create_channel_arg_import
338
+ typedef void(*grpc_call_credentials_release_type)(grpc_call_credentials* creds);
339
+ extern grpc_call_credentials_release_type grpc_call_credentials_release_import;
340
+ #define grpc_call_credentials_release grpc_call_credentials_release_import
338
341
  typedef void(*grpc_channel_credentials_release_type)(grpc_channel_credentials* creds);
339
342
  extern grpc_channel_credentials_release_type grpc_channel_credentials_release_import;
340
343
  #define grpc_channel_credentials_release grpc_channel_credentials_release_import
341
- typedef grpc_channel_credentials*(*grpc_google_default_credentials_create_type)(void);
344
+ typedef grpc_channel_credentials*(*grpc_google_default_credentials_create_type)(grpc_call_credentials* call_credentials);
342
345
  extern grpc_google_default_credentials_create_type grpc_google_default_credentials_create_import;
343
346
  #define grpc_google_default_credentials_create grpc_google_default_credentials_create_import
344
347
  typedef void(*grpc_set_ssl_roots_override_callback_type)(grpc_ssl_roots_override_callback cb);
@@ -350,9 +353,6 @@ extern grpc_ssl_credentials_create_type grpc_ssl_credentials_create_import;
350
353
  typedef grpc_channel_credentials*(*grpc_ssl_credentials_create_ex_type)(const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pair, const grpc_ssl_verify_peer_options* verify_options, void* reserved);
351
354
  extern grpc_ssl_credentials_create_ex_type grpc_ssl_credentials_create_ex_import;
352
355
  #define grpc_ssl_credentials_create_ex grpc_ssl_credentials_create_ex_import
353
- typedef void(*grpc_call_credentials_release_type)(grpc_call_credentials* creds);
354
- extern grpc_call_credentials_release_type grpc_call_credentials_release_import;
355
- #define grpc_call_credentials_release grpc_call_credentials_release_import
356
356
  typedef grpc_channel_credentials*(*grpc_composite_channel_credentials_create_type)(grpc_channel_credentials* channel_creds, grpc_call_credentials* call_creds, void* reserved);
357
357
  extern grpc_composite_channel_credentials_create_type grpc_composite_channel_credentials_create_import;
358
358
  #define grpc_composite_channel_credentials_create grpc_composite_channel_credentials_create_import
@@ -14,5 +14,5 @@
14
14
 
15
15
  # GRPC contains the General RPC module.
16
16
  module GRPC
17
- VERSION = '1.31.1'
17
+ VERSION = '1.32.0.pre1'
18
18
  end
@@ -81,6 +81,7 @@ class TestTarget < Grpc::Testing::LoadBalancerStatsService::Service
81
81
  watcher = {}
82
82
  $watchers_mutex.synchronize do
83
83
  watcher = {
84
+ "rpcs_by_method" => Hash.new(),
84
85
  "rpcs_by_peer" => Hash.new(0),
85
86
  "rpcs_needed" => req['num_rpcs'],
86
87
  "no_remote_peer" => 0
@@ -95,17 +96,45 @@ class TestTarget < Grpc::Testing::LoadBalancerStatsService::Service
95
96
  end
96
97
  $watchers.delete_at($watchers.index(watcher))
97
98
  end
99
+ # convert results into proper proto object
100
+ rpcs_by_method = {}
101
+ watcher['rpcs_by_method'].each do |rpc_name, rpcs_by_peer|
102
+ rpcs_by_method[rpc_name] = LoadBalancerStatsResponse::RpcsByPeer.new(
103
+ rpcs_by_peer: rpcs_by_peer
104
+ )
105
+ end
98
106
  LoadBalancerStatsResponse.new(
107
+ rpcs_by_method: rpcs_by_method,
99
108
  rpcs_by_peer: watcher['rpcs_by_peer'],
100
109
  num_failures: watcher['no_remote_peer'] + watcher['rpcs_needed']
101
110
  );
102
111
  end
103
112
  end
104
113
 
114
+ # execute 1 RPC and return remote hostname
115
+ def execute_rpc(op, fail_on_failed_rpcs)
116
+ remote_peer = ""
117
+ begin
118
+ op.execute
119
+ if op.metadata.key?('hostname')
120
+ remote_peer = op.metadata['hostname']
121
+ end
122
+ rescue GRPC::BadStatus => e
123
+ GRPC.logger.info("ruby xds: rpc failed:|#{e.message}|, " \
124
+ "this may or may not be expected")
125
+ if fail_on_failed_rpcs
126
+ raise e
127
+ end
128
+ end
129
+ remote_peer
130
+ end
131
+
105
132
  # send 1 rpc every 1/qps second
106
- def run_test_loop(stub, target_seconds_between_rpcs, fail_on_failed_rpcs)
133
+ def run_test_loop(stub, target_seconds_between_rpcs, fail_on_failed_rpcs,
134
+ rpcs_to_send, metadata_to_send)
107
135
  include Grpc::Testing
108
- req = SimpleRequest.new()
136
+ simple_req = SimpleRequest.new()
137
+ empty_req = Empty.new()
109
138
  target_next_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
110
139
  while !$shutdown
111
140
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
@@ -121,25 +150,42 @@ def run_test_loop(stub, target_seconds_between_rpcs, fail_on_failed_rpcs)
121
150
  target_next_start += target_seconds_between_rpcs
122
151
  sleep(sleep_seconds)
123
152
  end
124
- begin
125
- deadline = GRPC::Core::TimeConsts::from_relative_time(30) # 30 seconds
126
- resp = stub.unary_call(req, deadline: deadline)
127
- remote_peer = resp.hostname
128
- rescue GRPC::BadStatus => e
129
- remote_peer = ""
130
- GRPC.logger.info("ruby xds: rpc failed:|#{e.message}|, " \
131
- "this may or may not be expected")
132
- if fail_on_failed_rpcs
133
- raise e
153
+ deadline = GRPC::Core::TimeConsts::from_relative_time(30) # 30 seconds
154
+ results = {}
155
+ rpcs_to_send.each do |rpc|
156
+ metadata = metadata_to_send.key?(rpc) ? metadata_to_send[rpc] : {}
157
+ if rpc == 'UnaryCall'
158
+ op = stub.unary_call(simple_req,
159
+ metadata: metadata,
160
+ deadline: deadline,
161
+ return_op: true)
162
+ elsif rpc == 'EmptyCall'
163
+ op = stub.empty_call(empty_req,
164
+ metadata: metadata,
165
+ deadline: deadline,
166
+ return_op: true)
167
+ else
168
+ raise "Unsupported rpc %s" % [rpc]
134
169
  end
170
+ results[rpc] = execute_rpc(op, fail_on_failed_rpcs)
135
171
  end
136
172
  $watchers_mutex.synchronize do
137
173
  $watchers.each do |watcher|
174
+ # this is counted once when each group of all rpcs_to_send were done
138
175
  watcher['rpcs_needed'] -= 1
139
- if remote_peer.strip.empty?
140
- watcher['no_remote_peer'] += 1
141
- else
142
- watcher['rpcs_by_peer'][remote_peer] += 1
176
+ results.each do |rpc_name, remote_peer|
177
+ if remote_peer.strip.empty?
178
+ # error is counted per individual RPC
179
+ watcher['no_remote_peer'] += 1
180
+ else
181
+ if not watcher['rpcs_by_method'].key?(rpc_name)
182
+ watcher['rpcs_by_method'][rpc_name] = Hash.new(0)
183
+ end
184
+ # increment the remote hostname distribution histogram
185
+ # both by overall, and broken down per RPC
186
+ watcher['rpcs_by_method'][rpc_name][remote_peer] += 1
187
+ watcher['rpcs_by_peer'][remote_peer] += 1
188
+ end
143
189
  end
144
190
  end
145
191
  $watchers_cv.broadcast
@@ -149,6 +195,7 @@ end
149
195
 
150
196
  # Args is used to hold the command line info.
151
197
  Args = Struct.new(:fail_on_failed_rpcs, :num_channels,
198
+ :rpc, :metadata,
152
199
  :server, :stats_port, :qps)
153
200
 
154
201
  # validates the command line options, returning them as a Hash.
@@ -156,6 +203,8 @@ def parse_args
156
203
  args = Args.new
157
204
  args['fail_on_failed_rpcs'] = false
158
205
  args['num_channels'] = 1
206
+ args['rpc'] = 'UnaryCall'
207
+ args['metadata'] = ''
159
208
  OptionParser.new do |opts|
160
209
  opts.on('--fail_on_failed_rpcs BOOL', ['false', 'true']) do |v|
161
210
  args['fail_on_failed_rpcs'] = v == 'true'
@@ -163,6 +212,12 @@ def parse_args
163
212
  opts.on('--num_channels CHANNELS', 'number of channels') do |v|
164
213
  args['num_channels'] = v.to_i
165
214
  end
215
+ opts.on('--rpc RPCS_TO_SEND', 'list of RPCs to send') do |v|
216
+ args['rpc'] = v
217
+ end
218
+ opts.on('--metadata METADATA_TO_SEND', 'metadata to send per RPC') do |v|
219
+ args['metadata'] = v
220
+ end
166
221
  opts.on('--server SERVER_HOST', 'server hostname') do |v|
167
222
  GRPC.logger.info("ruby xds: server address is #{v}")
168
223
  args['server'] = v
@@ -195,11 +250,40 @@ def main
195
250
  # The client just sends unary rpcs continuously in a regular interval
196
251
  stub = create_stub(opts)
197
252
  target_seconds_between_rpcs = (1.0 / opts['qps'].to_f)
253
+ rpcs_to_send = []
254
+ if opts['rpc']
255
+ rpcs_to_send = opts['rpc'].split(',')
256
+ end
257
+ # Convert 'metadata' input in the form of
258
+ # rpc1:k1:v1,rpc2:k2:v2,rpc1:k3:v3
259
+ # into
260
+ # {
261
+ # 'rpc1' => {
262
+ # 'k1' => 'v1',
263
+ # 'k3' => 'v3',
264
+ # },
265
+ # 'rpc2' => {
266
+ # 'k2' => 'v2'
267
+ # },
268
+ # }
269
+ metadata_to_send = {}
270
+ if opts['metadata']
271
+ metadata_entries = opts['metadata'].split(',')
272
+ metadata_entries.each do |e|
273
+ (rpc_name, metadata_key, metadata_value) = e.split(':')
274
+ # initialize if we haven't seen this rpc_name yet
275
+ if !metadata_to_send.key?(rpc_name)
276
+ metadata_to_send[rpc_name] = {}
277
+ end
278
+ metadata_to_send[rpc_name][metadata_key] = metadata_value
279
+ end
280
+ end
198
281
  client_threads = Array.new
199
282
  opts['num_channels'].times {
200
283
  client_threads << Thread.new {
201
284
  run_test_loop(stub, target_seconds_between_rpcs,
202
- opts['fail_on_failed_rpcs'])
285
+ opts['fail_on_failed_rpcs'],
286
+ rpcs_to_send, metadata_to_send)
203
287
  }
204
288
  }
205
289
 
@@ -50,6 +50,16 @@ describe GRPC::Core::ChannelCredentials do
50
50
  blk = proc { ChannelCredentials.new(nil) }
51
51
  expect(&blk).not_to raise_error
52
52
  end
53
+
54
+ it 'fails gracefully with constructed with a nil private key' do
55
+ blk = proc { GRPC::Core::ChannelCredentials.new(nil, nil, '') }
56
+ expect(&blk).to raise_error
57
+ end
58
+
59
+ it 'fails gracefully with constructed with a nil cert chain' do
60
+ blk = proc { GRPC::Core::ChannelCredentials.new(nil, '', nil) }
61
+ expect(&blk).to raise_error
62
+ end
53
63
  end
54
64
 
55
65
  describe '#compose' do
@@ -43,6 +43,16 @@ describe GRPC::ActiveCall do
43
43
  @server = new_core_server_for_testing(nil)
44
44
  server_port = @server.add_http2_port(host, :this_port_is_insecure)
45
45
  @server.start
46
+ @received_rpcs_queue = Queue.new
47
+ @server_thread = Thread.new do
48
+ begin
49
+ received_rpc = @server.request_call
50
+ rescue GRPC::Core::CallError, StandardError => e
51
+ # enqueue the exception in this case as a way to indicate the error
52
+ received_rpc = e
53
+ end
54
+ @received_rpcs_queue.push(received_rpc)
55
+ end
46
56
  @ch = GRPC::Core::Channel.new("0.0.0.0:#{server_port}", nil,
47
57
  :this_channel_is_insecure)
48
58
  end
@@ -50,6 +60,7 @@ describe GRPC::ActiveCall do
50
60
  after(:each) do
51
61
  @server.shutdown_and_notify(deadline)
52
62
  @server.close
63
+ @server_thread.join
53
64
  end
54
65
 
55
66
  describe 'restricted view methods' do
@@ -105,7 +116,7 @@ describe GRPC::ActiveCall do
105
116
  client_call.remote_send(msg)
106
117
 
107
118
  # check that server rpc new was received
108
- recvd_rpc = @server.request_call
119
+ recvd_rpc = @received_rpcs_queue.pop
109
120
  expect(recvd_rpc).to_not eq nil
110
121
  recvd_call = recvd_rpc.call
111
122
 
@@ -130,7 +141,7 @@ describe GRPC::ActiveCall do
130
141
  client_call.remote_send(msg)
131
142
 
132
143
  # confirm that the message was marshalled
133
- recvd_rpc = @server.request_call
144
+ recvd_rpc = @received_rpcs_queue.pop
134
145
  recvd_call = recvd_rpc.call
135
146
  server_ops = {
136
147
  CallOps::SEND_INITIAL_METADATA => nil
@@ -160,7 +171,7 @@ describe GRPC::ActiveCall do
160
171
  call.run_batch(CallOps::SEND_CLOSE_FROM_CLIENT => nil) if f == 1
161
172
 
162
173
  # confirm that the message was marshalled
163
- recvd_rpc = @server.request_call
174
+ recvd_rpc = @received_rpcs_queue.pop
164
175
  recvd_call = recvd_rpc.call
165
176
  server_ops = {
166
177
  CallOps::SEND_INITIAL_METADATA => nil
@@ -321,7 +332,7 @@ describe GRPC::ActiveCall do
321
332
  call = make_test_call
322
333
  metadata = { k1: 'v1', k2: 'v2' }
323
334
  ActiveCall.client_invoke(call, metadata)
324
- recvd_rpc = @server.request_call
335
+ recvd_rpc = @received_rpcs_queue.pop
325
336
  recvd_call = recvd_rpc.call
326
337
  expect(recvd_call).to_not be_nil
327
338
  expect(recvd_rpc.metadata).to_not be_nil
@@ -339,7 +350,7 @@ describe GRPC::ActiveCall do
339
350
  call = make_test_call
340
351
  ActiveCall.client_invoke(call)
341
352
 
342
- recvd_rpc = @server.request_call
353
+ recvd_rpc = @received_rpcs_queue.pop
343
354
  server_call = ActiveCall.new(
344
355
  recvd_rpc.call,
345
356
  @pass_through,
@@ -405,7 +416,7 @@ describe GRPC::ActiveCall do
405
416
  client_call = make_test_call
406
417
  ActiveCall.client_invoke(client_call)
407
418
 
408
- recvd_rpc = @server.request_call
419
+ recvd_rpc = @received_rpcs_queue.pop
409
420
  recvd_call = recvd_rpc.call
410
421
 
411
422
  server_call = ActiveCall.new(
@@ -575,7 +586,7 @@ describe GRPC::ActiveCall do
575
586
  @client_call = make_test_call
576
587
  @client_call.run_batch(CallOps::SEND_INITIAL_METADATA => {})
577
588
 
578
- recvd_rpc = @server.request_call
589
+ recvd_rpc = @received_rpcs_queue.pop
579
590
  recvd_call = recvd_rpc.call
580
591
  @server_call = ActiveCall.new(
581
592
  recvd_call,
@@ -654,7 +665,7 @@ describe GRPC::ActiveCall do
654
665
  end
655
666
 
656
667
  def expect_server_to_be_invoked(**kw)
657
- recvd_rpc = @server.request_call
668
+ recvd_rpc = @received_rpcs_queue.pop
658
669
  expect(recvd_rpc).to_not eq nil
659
670
  recvd_call = recvd_rpc.call
660
671
  recvd_call.run_batch(CallOps::SEND_INITIAL_METADATA => kw)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.31.1
4
+ version: 1.32.0.pre1
5
5
  platform: universal-darwin
6
6
  authors:
7
7
  - gRPC Authors
8
8
  autorequire:
9
9
  bindir: src/ruby/bin
10
10
  cert_chain: []
11
- date: 2020-08-17 00:00:00.000000000 Z
11
+ date: 2020-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.12'
19
+ version: '3.13'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.12'
26
+ version: '3.13'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: googleapis-common-protos-types
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -346,9 +346,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
346
346
  version: 2.8.dev
347
347
  required_rubygems_version: !ruby/object:Gem::Requirement
348
348
  requirements:
349
- - - ">="
349
+ - - ">"
350
350
  - !ruby/object:Gem::Version
351
- version: '0'
351
+ version: 1.3.1
352
352
  requirements: []
353
353
  rubygems_version: 3.1.4
354
354
  signing_key: