zyre 0.5.0 → 0.7.0

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: 18eb57b31a6b9b451f723f8c845c00d4fd4547ab5b7b9c3615d32062256e855c
4
- data.tar.gz: 5b8ae5d09f519edf6386d71f2cfebd62dbab3e757c5769d9e598ea4494360e63
3
+ metadata.gz: 7b5427b9f8cbdcbec3727b0a998a82b60b70cf7a82e36f6e3a0a86e6d9aba74a
4
+ data.tar.gz: 898dcb7df592fc24617fedc60d8f54b9f22f421ae04459215ee3c48adc581ff0
5
5
  SHA512:
6
- metadata.gz: fe19f91ae8dfb44aa6fcd3184724201662d4852cbdcec3db9e326780f7d5587e6323414f7f49f64d129a00549fbade302c07344fec05128c69a27ff7aa7db8f0
7
- data.tar.gz: 5bf176e26bfb6c442f7d647defe621d4dbc058d6b59c8b95170d303359f3d9ddb81247a594341d05e1d7673103b8f010f66ba297b843c68e5fe285be93056141
6
+ metadata.gz: 774f4c450b24db21b8db0d52bde9334b80edf4d196b51e5f3be468b20cba83469418862b0ad862c617d2366b39cbe003d2e6e5d518c59c8b6f09ccbf2e8253da
7
+ data.tar.gz: f53e49334e7b4a5dd308080addafc65a6d3dd222463651b8c038ddd2de12cf6ba2b30a3d959649ab001e44d41fbf2d41c9ac969800fdbe10d25238cfa653e24d
checksums.yaml.gz.sig CHANGED
Binary file
data/History.md CHANGED
@@ -1,6 +1,25 @@
1
1
  # Release History for zyre
2
2
 
3
3
  ---
4
+
5
+ ## v0.7.0 [2025-08-05] Michael Granger <ged@faeriemud.org>
6
+
7
+ Improvements:
8
+
9
+ - Add ZAUTH
10
+
11
+ Fixes:
12
+
13
+ - Move the interface method setting to the Zyre toplevel since it's actually global
14
+
15
+
16
+ ## v0.6.0 [2023-08-08] Michael Granger <ged@faeriemud.org>
17
+
18
+ Improvements:
19
+
20
+ - Reset the zyre interface list when it's fetched
21
+
22
+
4
23
  ## v0.5.0 [2023-02-14] Michael Granger <ged@faeriemud.org>
5
24
 
6
25
  Improvements:
data/ext/zyre_ext/node.c CHANGED
@@ -286,6 +286,7 @@ rzyre_node_interface_eq( VALUE self, VALUE interface )
286
286
  zyre_t *ptr = rzyre_get_node( self );
287
287
  const char *interface_str = StringValueCStr( interface );
288
288
 
289
+ rb_warn( "Setting #interface on a Node sets it globally." );
289
290
  zyre_set_interface( ptr, interface_str );
290
291
 
291
292
  return Qtrue;
@@ -17,6 +17,8 @@
17
17
 
18
18
  VALUE rzyre_mZyre;
19
19
 
20
+ static zactor_t *auth;
21
+
20
22
 
21
23
  /* --------------------------------------------------------------
22
24
  * Logging Functions
@@ -148,7 +150,7 @@ rzyre_make_zmsg_from( VALUE messages )
148
150
  *
149
151
  */
150
152
  static VALUE
151
- rzyre_s_zyre_version()
153
+ rzyre_s_zyre_version( VALUE _mod )
152
154
  {
153
155
  static uint64_t version;
154
156
 
@@ -176,7 +178,10 @@ rzyre_s_zyre_version()
176
178
  static VALUE
177
179
  rzyre_s_interfaces( VALUE module )
178
180
  {
181
+
179
182
  ziflist_t *iflist = ziflist_new();
183
+ ziflist_reload( iflist );
184
+
180
185
  const VALUE rval = rb_hash_new();
181
186
  const char *iface = ziflist_first( iflist );
182
187
 
@@ -290,10 +295,172 @@ rzyre_s_z85_decode( VALUE module, VALUE string )
290
295
  }
291
296
 
292
297
 
298
+
299
+ /*
300
+ * call-seq:
301
+ * Zyre.start_authenticator -> true
302
+ *
303
+ * Start the ZAUTH authenticator actor. If it's already running, this
304
+ * call is silently ignored.
305
+ *
306
+ */
293
307
  static VALUE
294
308
  rzyre_s_start_authenticator( VALUE module )
295
309
  {
296
- return Qnil;
310
+ if ( !auth ) {
311
+ rzyre_log_obj( rzyre_mZyre, "info", "starting up the ZAUTH actor." );
312
+ auth = zactor_new( zauth, NULL );
313
+ assert( auth );
314
+ }
315
+
316
+ return Qtrue;
317
+ }
318
+
319
+
320
+ /*
321
+ * call-seq:
322
+ * Zyre.authenticator_started? -> true or false
323
+ *
324
+ * Returns `true` if the ZAUTH authenticator actor is running.
325
+ *
326
+ */
327
+ static VALUE
328
+ rzyre_s_authenticator_started_p( VALUE module )
329
+ {
330
+ if ( auth ) {
331
+ return Qtrue;
332
+ } else {
333
+ return Qfalse;
334
+ }
335
+ }
336
+
337
+
338
+ /*
339
+ * call-seq:
340
+ * Zyre.stop_authenticator -> true
341
+ *
342
+ * Stop the ZAUTH authenticator actor if it is running. If it's not running, this
343
+ * call is silently ignored.
344
+ *
345
+ */
346
+ static VALUE
347
+ rzyre_s_stop_authenticator( VALUE module )
348
+ {
349
+ if ( auth ) {
350
+ rzyre_log_obj( rzyre_mZyre, "info", "shutting down the ZAUTH actor." );
351
+ zactor_destroy( &auth );
352
+ }
353
+
354
+ return Qtrue;
355
+ }
356
+
357
+
358
+ /*
359
+ * Async wait function; called without the GVL.
360
+ */
361
+ static void *
362
+ rzyre_wait_for_auth_without_gvl( void *_unused )
363
+ {
364
+ zsock_wait( auth );
365
+ return NULL;
366
+ }
367
+
368
+
369
+ /*
370
+ * call-seq:
371
+ * Zyre.verbose_auth!
372
+ *
373
+ * Enable the ZAUTH actor's verbose logging.
374
+ *
375
+ */
376
+ static VALUE
377
+ rzyre_s_verbose_auth_bang( VALUE module )
378
+ {
379
+ if ( auth ) {
380
+ zstr_sendx( auth, "VERBOSE", NULL );
381
+ rb_thread_call_without_gvl2( rzyre_wait_for_auth_without_gvl, 0, RUBY_UBF_IO, 0 );
382
+ } else {
383
+ rb_raise( rb_eRuntimeError, "can't enable verbose auth: authenticator is not started." );
384
+ }
385
+
386
+ return Qtrue;
387
+ }
388
+
389
+
390
+ /*
391
+ * call-seq:
392
+ * Zyre.enable_curve_auth( cert_dir=nil )
393
+ *
394
+ * Enable CURVE authentication, using the specified +cert_dir+ for allowed
395
+ * public certificates. If no +cert_dir+ is given, any connection presenting a valid CURVE
396
+ * certificate will be allowed.
397
+ *
398
+ */
399
+ static VALUE
400
+ rzyre_s_enable_curve_auth( int argc, VALUE *argv, VALUE module )
401
+ {
402
+ VALUE cert_dir = Qnil;
403
+ char *cert_dir_s;
404
+
405
+ rb_scan_args( argc, argv, "01", &cert_dir );
406
+
407
+ if ( argc ) {
408
+ cert_dir_s = StringValueCStr( cert_dir );
409
+ zstr_sendx( auth, "CURVE", cert_dir_s, NULL );
410
+ } else {
411
+ zstr_sendx( auth, "CURVE", CURVE_ALLOW_ANY, NULL );
412
+ }
413
+
414
+ rb_thread_call_without_gvl2( rzyre_wait_for_auth_without_gvl, 0, RUBY_UBF_IO, 0 );
415
+
416
+ return Qtrue;
417
+ }
418
+
419
+
420
+ /*
421
+ * call-seq:
422
+ * Zyre.interface -> string
423
+ *
424
+ * Return network interface to use for broadcasts, or nil if none was set.
425
+ *
426
+ */
427
+ static VALUE
428
+ rzyre_s_interface( VALUE module )
429
+ {
430
+ const char *interface = zsys_interface();
431
+
432
+ if ( strnlen(interface, 1) == 0 ) {
433
+ return Qnil;
434
+ }
435
+
436
+ return rb_utf8_str_new_cstr( interface );
437
+ }
438
+
439
+
440
+ /*
441
+ * call-seq:
442
+ * Zyre.interface = string
443
+ *
444
+ * Set network interface name to use for broadcasts.
445
+ *
446
+ * This lets the interface be configured for test environments where required.
447
+ * For example, on Mac OS X, zbeacon cannot bind to 255.255.255.255 which is
448
+ * the default when there is no specified interface. If the environment
449
+ * variable ZSYS_INTERFACE is set, use that as the default interface name.
450
+ * Setting the interface to "*" means "use all available interfaces".
451
+ *
452
+ */
453
+ static VALUE
454
+ rzyre_s_interface_eq( VALUE module, VALUE new_interface )
455
+ {
456
+ if ( NIL_P(new_interface) ) {
457
+ zsys_set_interface( "" );
458
+ } else {
459
+ const char *new_interface_s = StringValueCStr( new_interface );
460
+ zsys_set_interface( new_interface_s );
461
+ }
462
+
463
+ return Qtrue;
297
464
  }
298
465
 
299
466
 
@@ -323,15 +490,23 @@ Init_zyre_ext()
323
490
 
324
491
  rb_define_singleton_method( rzyre_mZyre, "zyre_version", rzyre_s_zyre_version, 0 );
325
492
  rb_define_singleton_method( rzyre_mZyre, "interfaces", rzyre_s_interfaces, 0 );
326
- rb_define_singleton_method( rzyre_mZyre, "disable_zsys_handler", rzyre_s_disable_zsys_handler, 0 );
493
+ rb_define_singleton_method( rzyre_mZyre, "disable_zsys_handler",
494
+ rzyre_s_disable_zsys_handler, 0 );
327
495
 
328
496
  rb_define_singleton_method( rzyre_mZyre, "z85_encode", rzyre_s_z85_encode, 1 );
329
497
  rb_define_singleton_method( rzyre_mZyre, "z85_decode", rzyre_s_z85_decode, 1 );
330
498
 
331
- // :TODO: Allow for startup of the zauth agent. This will require enough of a
332
- // subset of CZMQ that I hesitate to do it in Zyre. Maybe better to just write a
333
- // decent CZMQ library instead?
334
- rb_define_singleton_method( rzyre_mZyre, "start_authenticator", rzyre_s_start_authenticator, 0 );
499
+ rb_define_singleton_method( rzyre_mZyre, "start_authenticator",
500
+ rzyre_s_start_authenticator, 0 );
501
+ rb_define_singleton_method( rzyre_mZyre, "authenticator_started?",
502
+ rzyre_s_authenticator_started_p, 0 );
503
+ rb_define_singleton_method( rzyre_mZyre, "stop_authenticator", rzyre_s_stop_authenticator, 0 );
504
+
505
+ rb_define_singleton_method( rzyre_mZyre, "verbose_auth!", rzyre_s_verbose_auth_bang, 0 );
506
+ rb_define_singleton_method( rzyre_mZyre, "enable_curve_auth", rzyre_s_enable_curve_auth, -1 );
507
+
508
+ rb_define_singleton_method( rzyre_mZyre, "interface", rzyre_s_interface, 0 );
509
+ rb_define_singleton_method( rzyre_mZyre, "interface=", rzyre_s_interface_eq, 1 );
335
510
 
336
511
  // :TODO: set up zsys_set_logsender()
337
512
 
data/lib/zyre.rb CHANGED
@@ -13,7 +13,7 @@ module Zyre
13
13
 
14
14
 
15
15
  # Gem version (semver)
16
- VERSION = '0.5.0'
16
+ VERSION = '0.7.0'
17
17
 
18
18
  # Set up a logger for Zyre classes
19
19
  log_as :zyre
@@ -46,7 +46,7 @@ RSpec.describe( Zyre::Cert ) do
46
46
 
47
47
  expect( result ).to be_a( described_class )
48
48
  expect( result.public_key ).to eq( cert.public_key )
49
- expect( result.secret_key ).to eq( Zyre::Cert::EMPTY_KEY )
49
+ expect( result.secret_key ).to eq( described_class::EMPTY_KEY )
50
50
  end
51
51
 
52
52
 
@@ -197,7 +197,7 @@ RSpec.describe( Zyre::Cert ) do
197
197
 
198
198
  it "can be applied to a Zyre node", :draft_apis do
199
199
  node = instance_double( Zyre::Node )
200
- cert = Zyre::Cert.new
200
+ cert = described_class.new
201
201
 
202
202
  expect( node ).to receive( :zcert= ).with( cert )
203
203
  cert.apply( node )
@@ -212,6 +212,8 @@ RSpec.describe( Zyre::Cert ) do
212
212
  other = cert.dup
213
213
 
214
214
  expect( other.object_id ).not_to eq( cert.object_id )
215
+ expect( other[:node_id] ).to eq( cert[:node_id] )
216
+ expect( other[:node_order] ).to eq( cert[:node_order] )
215
217
  end
216
218
 
217
219
 
@@ -26,6 +26,14 @@ RSpec.describe( Zyre::Node ) do
26
26
  TEST_BINARY_STRING = TEST_BINARY_STRING_PARTS.join( '' )
27
27
 
28
28
 
29
+ before( :each ) do
30
+ @interface = Zyre.interface
31
+ end
32
+ after( :each ) do
33
+ Zyre.interface = @interface
34
+ end
35
+
36
+
29
37
  it "can be created anonymously" do
30
38
  node = described_class.new
31
39
 
@@ -108,11 +116,11 @@ RSpec.describe( Zyre::Node ) do
108
116
  end
109
117
 
110
118
 
111
- it "can be set to communicate on a particular network interface" do
119
+ it "has a backward-compatible method for setting the interface on a Node" do
112
120
  node = described_class.new
113
121
  expect {
114
122
  node.interface = 'lo0'
115
- }.to_not raise_error
123
+ }.to change { Zyre.interface }.to( 'lo0' )
116
124
  end
117
125
 
118
126
 
data/spec/zyre_spec.rb CHANGED
@@ -7,6 +7,14 @@ require 'zyre'
7
7
 
8
8
  RSpec.describe( Zyre ) do
9
9
 
10
+ before( :each ) do
11
+ @interface = described_class.interface
12
+ end
13
+ after( :each ) do
14
+ described_class.interface = @interface
15
+ described_class.stop_authenticator
16
+ end
17
+
10
18
 
11
19
  # Pattern for matching IPv4 addresses
12
20
  IPV4_ADDRESS = /^((?:(?:^|\.)(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){4})$/
@@ -64,6 +72,21 @@ RSpec.describe( Zyre ) do
64
72
  end
65
73
 
66
74
 
75
+ it "can set the interface used by all nodes" do
76
+ expect {
77
+ described_class.interface = 'LENNY'
78
+ }.to change { described_class.interface }.to( 'LENNY' )
79
+ end
80
+
81
+
82
+ it "clears the interface setting if set to `nil`" do
83
+ described_class.interface = "eth0"
84
+ expect {
85
+ described_class.interface = nil
86
+ }.to change { described_class.interface }.to( nil )
87
+ end
88
+
89
+
67
90
  describe "Z85 encoding/decoding" do
68
91
 
69
92
  # From the 32/Z85 reference code:
@@ -126,5 +149,95 @@ RSpec.describe( Zyre ) do
126
149
 
127
150
  end
128
151
 
152
+
153
+ describe "ZAUTH authenticator" do
154
+
155
+ it "can be started" do
156
+ expect {
157
+ described_class.start_authenticator
158
+ }.to change { described_class.authenticator_started? }.to( true )
159
+ end
160
+
161
+
162
+ it "ignores call to start if it's already started" do
163
+ described_class.start_authenticator
164
+
165
+ expect {
166
+ described_class.start_authenticator
167
+ }.not_to raise_error
168
+ end
169
+
170
+
171
+ it "can be stopped" do
172
+ described_class.start_authenticator
173
+
174
+ expect {
175
+ described_class.stop_authenticator
176
+ }.to change { described_class.authenticator_started? }.to( false )
177
+ end
178
+
179
+
180
+ it "ignores calls to stop if it's not started" do
181
+ expect {
182
+ described_class.stop_authenticator
183
+ }.not_to raise_error
184
+ end
185
+
186
+
187
+ it "can enable verbose auth logging" do
188
+ described_class.start_authenticator
189
+ expect {
190
+ described_class.verbose_auth!
191
+ }.not_to raise_error
192
+ end
193
+
194
+
195
+ it "raises an error if verbose auth logging is enabled before the authenticator is started" do
196
+ expect {
197
+ described_class.verbose_auth!
198
+ }.to raise_error( /authenticator is not started/i )
199
+ end
200
+
201
+
202
+ it "supports any-cert style authentication" do
203
+ described_class.start_authenticator
204
+ # described_class.verbose_auth!
205
+ described_class.enable_curve_auth
206
+
207
+ server_cert = Zyre::Cert.new
208
+ server = Zyre::Node.new( 'server' )
209
+ # server.verbose!
210
+ server.zap_domain = 'TEST'
211
+ server.zcert = server_cert
212
+ server.set_header( 'X-PUBLICKEY', server_cert.public_txt )
213
+ server.join( 'TEST' )
214
+ server.start
215
+
216
+ client_cert = Zyre::Cert.new
217
+ authed_client = Zyre::Node.new( 'authed_client' )
218
+ # authed_client.verbose!
219
+ authed_client.zap_domain = 'TEST'
220
+ authed_client.zcert = client_cert
221
+ authed_client.set_header( 'X-PUBLICKEY', client_cert.public_txt )
222
+ authed_client.join( 'TEST' )
223
+ authed_client.start
224
+ authed_client.shout( 'TEST', 'authed_client hello' )
225
+
226
+ result = server.wait_for( :JOIN, timeout: 0.2 )
227
+ expect( result ).to be_a( Zyre::Event::Join )
228
+
229
+ noauth_client = Zyre::Node.new( 'noauth_client' )
230
+ # noauth_client.verbose!
231
+ noauth_client.zap_domain = 'TEST'
232
+ noauth_client.join( 'TEST' )
233
+ noauth_client.start
234
+ noauth_client.shout( 'TEST', 'noauth_client hello' )
235
+
236
+ result = server.wait_for( :JOIN, timeout: 0.2 )
237
+ expect( result ).to be_nil
238
+ end
239
+
240
+ end
241
+
129
242
  end
130
243
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,39 +1,40 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zyre
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain:
11
10
  - |
12
11
  -----BEGIN CERTIFICATE-----
13
- MIID+DCCAmCgAwIBAgIBBTANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
14
- REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMzAxMTYxNzE2MDlaFw0yNDAxMTYxNzE2
15
- MDlaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
16
- hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
17
- L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
18
- M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
19
- 5PU2AEbf04GGSrmqADGWXeaslaoRdb1fu/0M5qfPTRn5V39sWD9umuDAF9qqil/x
20
- Sl6phTvgBrG8GExHbNZpLARd3xrBYLEFsX7RvBn2UPfgsrtvpdXjsHGfpT3IPN+B
21
- vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
22
- dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
23
- ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
24
- N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
25
- VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
26
- 9w0BAQsFAAOCAYEARYCeUVBWARNKqF0cvNnLJvFf4hdW2+Rtc7NfC5jQvX9a1oom
27
- sfVvS96eER/9cbrphu+vc59EELw4zT+RY3/IesnoE7CaX6zIOFmSmG7K61OHsSLR
28
- KqMygcWwyuPXT2JG7JsGHuxbzgaRWe29HbSjBbLYxiMH8Zxh4tKutxzKF7jb0Ggq
29
- KAf9MH5LwG8IHVIfV5drT14PvgR3tcvmrn1timPyJl+eZ3LNnm9ofOCweuZCq1cy
30
- 4Q8LV3vP2Cofy9q+az3DHdaUGlmMiZZZqKixDr1KSS9nvh0ZrKMOUL1sWj/IaxrQ
31
- RV3y6td14q49t+xnbj00hPlbW7uE2nLJLt2NAoXiE1Nonndz1seB2c6HL79W9fps
32
- E/O12pQjCp/aPUZMt8/8tKW31RIy/KP8XO6OTJNWA8A/oNEI0g5p/LmmEtJKWYr1
33
- WmEdESlpWhzFECctefIF2lsN9vaOuof57RM77t2otrtcscDtNarIqjZsIyqtDvtL
34
- DttITiit0Vwz7bY0
12
+ MIIEbDCCAtSgAwIBAgIBATANBgkqhkiG9w0BAQsFADA+MQwwCgYDVQQDDANnZWQx
13
+ GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
14
+ HhcNMjUwMTAxMDMzMTA5WhcNMjYwMTAxMDMzMTA5WjA+MQwwCgYDVQQDDANnZWQx
15
+ GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
16
+ ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC/JWGRHO+USzR97vXjkFgt
17
+ 83qeNf2KHkcvrRTSnR64i6um/ziin0I0oX23H7VYrDJC9A/uoUa5nGRJS5Zw/+wW
18
+ ENcvWVZS4iUzi4dsYJGY6yEOsXh2CcF46+QevV8iE+UmbkU75V7Dy1JCaUOyizEt
19
+ TH5UHsOtUU7k9TYARt/TgYZKuaoAMZZd5qyVqhF1vV+7/Qzmp89NGflXf2xYP26a
20
+ 4MAX2qqKX/FKXqmFO+AGsbwYTEds1mksBF3fGsFgsQWxftG8GfZQ9+Cyu2+l1eOw
21
+ cZ+lPcg834G9DrqW2zhqUoLr1MTly4pqxYGb7XoDhoR7dd1kFE2a067+DzWC/ADt
22
+ +QkcqWUm5oh1fN0eqr7NsZlVJDulFgdiiYPQiIN7UNsii4Wc9aZqBoGcYfBeQNPZ
23
+ soo/6za/bWajOKUmDhpqvaiRv9EDpVLzuj53uDoukMMwxCMfgb04+ckQ0t2G7wqc
24
+ /D+K9JW9DDs3Yjgv9k4h7YMhW5gftosd+NkNC/+Y2CkCAwEAAaN1MHMwCQYDVR0T
25
+ BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
26
+ MBwGA1UdEQQVMBOBEWdlZEBGYWVyaWVNVUQub3JnMBwGA1UdEgQVMBOBEWdlZEBG
27
+ YWVyaWVNVUQub3JnMA0GCSqGSIb3DQEBCwUAA4IBgQBjrBzCKWzXFigswYSPzGO8
28
+ 9atBtY/eQdcN6KCL+PTzQBD9yePGF7H/xsww3awRauP+D1VUjCFbiiC3Qb0Ww0Qd
29
+ OVA0s10T9KpZ8nb2XyKocSK7TfgDhcyr0V4H2MPxwK9SWYjGGh8z9z9HmT0i3PyX
30
+ fXOSzzEoG6u26HIOg0nxSpitEjiAHBekQxy9ka5NuQbxoxMg+eIHU4rU9IUhu0Rf
31
+ wl4wuvPVE3UQK0v0uqT6rJukEKQ1iNgK5R8klgEIv79XhQPgTkMt31FGfrwOp6HB
32
+ OE0HMwOwY9B0w3aOxxdMQyyRxaZVv3eWE5RimQI7T0TUaxPngtS33ByMZjTeidxi
33
+ ESIUEPVXoBCkFgLW1EVlBb+rG7WLYod4eVll4tKA42Bi2Ju90tqiJ1YQiyuRfCnp
34
+ 8qAqdfV+4u6Huu1KzAuDQCheyEyISsLST37sU/irV3czV6BiFipWag1XiJciRT3A
35
+ wZqCfTNVHTdtsCbfdA1DsA3RdG2iEH3TOHzv1Rqzqh4=
35
36
  -----END CERTIFICATE-----
36
- date: 2023-02-14 00:00:00.000000000 Z
37
+ date: 2025-08-05 00:00:00.000000000 Z
37
38
  dependencies:
38
39
  - !ruby/object:Gem::Dependency
39
40
  name: loggability
@@ -61,20 +62,14 @@ dependencies:
61
62
  requirements:
62
63
  - - "~>"
63
64
  - !ruby/object:Gem::Version
64
- version: '0.15'
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: 0.15.1
65
+ version: '0.22'
68
66
  type: :development
69
67
  prerelease: false
70
68
  version_requirements: !ruby/object:Gem::Requirement
71
69
  requirements:
72
70
  - - "~>"
73
71
  - !ruby/object:Gem::Version
74
- version: '0.15'
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- version: 0.15.1
72
+ version: '0.22'
78
73
  - !ruby/object:Gem::Dependency
79
74
  name: rake-compiler
80
75
  requirement: !ruby/object:Gem::Requirement
@@ -213,7 +208,6 @@ metadata:
213
208
  documentation_uri: https://deveiate.org/code/zyre
214
209
  changelog_uri: https://deveiate.org/code/zyre/History_md.html
215
210
  source_uri: https://gitlab.com/ravngroup/open-source/ruby-zyre/-/tree/master
216
- post_install_message:
217
211
  rdoc_options: []
218
212
  require_paths:
219
213
  - lib
@@ -228,8 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
228
222
  - !ruby/object:Gem::Version
229
223
  version: '0'
230
224
  requirements: []
231
- rubygems_version: 3.4.6
232
- signing_key:
225
+ rubygems_version: 3.6.9
233
226
  specification_version: 4
234
227
  summary: A ZRE library for Ruby.
235
228
  test_files: []
metadata.gz.sig CHANGED
Binary file