cztop 1.1.0 → 1.1.1
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 +4 -4
- data/.github/workflows/coverage.yml +3 -3
- data/.github/workflows/draft_api.yml +2 -2
- data/.github/workflows/stable_api.yml +4 -5
- data/.projections.json +4 -0
- data/CHANGES.md +9 -0
- data/README.md +80 -20
- data/cztop.gemspec +8 -4
- data/examples/async/async.rb +17 -22
- data/lib/cztop/async.rb +4 -0
- data/lib/cztop/cert_store.rb +6 -0
- data/lib/cztop/certificate.rb +17 -0
- data/lib/cztop/version.rb +1 -1
- data/lib/cztop/zsock_options.rb +84 -62
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 066d9600730db24e49b9b83fee30840882432df13dde7372f9e7f969b3774b33
|
4
|
+
data.tar.gz: 67ee0941443c6a9eadf7d27b4bc084e00d20c2dc7ca4448fc6459edc93a88efb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8852f4b214935ef5b0302a7a6481a2f51148dfc6fac939ca9d9b5f665ab06d8242418bdbe996edb9ad6fe010a84a540fd9b24e379cdd5b3197fd3c7a80f0478
|
7
|
+
data.tar.gz: 506f6e6b9a927e8c68d60c410d3ed84abfae1edef435c43baae8855eb2f02409815692eb4cf18501298ab5c8f9c988cdd48d308a93eb20d1ae136bf51c8283fe
|
@@ -4,13 +4,13 @@ on: [push,pull_request]
|
|
4
4
|
|
5
5
|
jobs:
|
6
6
|
build:
|
7
|
-
runs-on: ubuntu-
|
7
|
+
runs-on: ubuntu-22.04
|
8
8
|
steps:
|
9
|
-
- uses: actions/checkout@
|
9
|
+
- uses: actions/checkout@v4
|
10
10
|
- name: Set up Ruby
|
11
11
|
uses: ruby/setup-ruby@v1
|
12
12
|
with:
|
13
|
-
ruby-version: 3.
|
13
|
+
ruby-version: 3.3
|
14
14
|
- name: Install CZMQ
|
15
15
|
run: sudo apt-get install libczmq-dev
|
16
16
|
- name: Run the default task
|
@@ -7,11 +7,11 @@ jobs:
|
|
7
7
|
runs-on: ubuntu-22.04
|
8
8
|
timeout-minutes: 15
|
9
9
|
steps:
|
10
|
-
- uses: actions/checkout@
|
10
|
+
- uses: actions/checkout@v4
|
11
11
|
- name: Set up Ruby
|
12
12
|
uses: ruby/setup-ruby@v1
|
13
13
|
with:
|
14
|
-
ruby-version: 3.3
|
14
|
+
ruby-version: '3.3'
|
15
15
|
- name: Install ZMQ and CZMQ
|
16
16
|
run: |
|
17
17
|
export PKG_CONFIG_PATH=$HOME/lib/pkgconfig # custom libs (for linking)
|
@@ -8,12 +8,11 @@ jobs:
|
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
10
|
ruby:
|
11
|
-
- 3.
|
12
|
-
- 3.
|
13
|
-
- 3.
|
14
|
-
- 3.3
|
11
|
+
- '3.1'
|
12
|
+
- '3.2'
|
13
|
+
- '3.3'
|
15
14
|
steps:
|
16
|
-
- uses: actions/checkout@
|
15
|
+
- uses: actions/checkout@v4
|
17
16
|
- name: Set up Ruby ${{ matrix.ruby }}
|
18
17
|
uses: ruby/setup-ruby@v1
|
19
18
|
with:
|
data/.projections.json
ADDED
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -10,6 +10,76 @@ FFI binding of [CZMQ](https://github.com/zeromq/czmq) and has a focus on being
|
|
10
10
|
easy to use for Rubyists (POLS) and providing first class support for security
|
11
11
|
mechanisms (like CURVE).
|
12
12
|
|
13
|
+
|
14
|
+
## Example with Async
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
#! /usr/bin/env ruby
|
18
|
+
|
19
|
+
require 'cztop/async'
|
20
|
+
|
21
|
+
Async do |task|
|
22
|
+
task.async do |t|
|
23
|
+
socket = CZTop::Socket::REP.new("inproc://req_rep_example")
|
24
|
+
io = Async::IO.try_convert socket
|
25
|
+
|
26
|
+
socket.options.rcvtimeo = 50 # ms
|
27
|
+
|
28
|
+
loop do
|
29
|
+
msg = io.receive
|
30
|
+
puts "<<< #{msg.to_a.inspect}"
|
31
|
+
io << msg.to_a.map(&:upcase)
|
32
|
+
rescue IO::TimeoutError
|
33
|
+
break
|
34
|
+
end
|
35
|
+
|
36
|
+
puts "REP done."
|
37
|
+
end
|
38
|
+
|
39
|
+
task.async do
|
40
|
+
socket = CZTop::Socket::REQ.new("inproc://req_rep_example")
|
41
|
+
io = Async::IO.try_convert socket
|
42
|
+
|
43
|
+
10.times do |i|
|
44
|
+
io << "foobar ##{i}"
|
45
|
+
msg = io.receive
|
46
|
+
puts ">>> #{msg.to_a.inspect}"
|
47
|
+
end
|
48
|
+
|
49
|
+
puts "REQ done."
|
50
|
+
end
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
|
55
|
+
Output:
|
56
|
+
```
|
57
|
+
<<< ["foobar #0"]
|
58
|
+
>>> ["FOOBAR #0"]
|
59
|
+
<<< ["foobar #1"]
|
60
|
+
>>> ["FOOBAR #1"]
|
61
|
+
<<< ["foobar #2"]
|
62
|
+
>>> ["FOOBAR #2"]
|
63
|
+
<<< ["foobar #3"]
|
64
|
+
>>> ["FOOBAR #3"]
|
65
|
+
<<< ["foobar #4"]
|
66
|
+
>>> ["FOOBAR #4"]
|
67
|
+
<<< ["foobar #5"]
|
68
|
+
>>> ["FOOBAR #5"]
|
69
|
+
<<< ["foobar #6"]
|
70
|
+
>>> ["FOOBAR #6"]
|
71
|
+
<<< ["foobar #7"]
|
72
|
+
>>> ["FOOBAR #7"]
|
73
|
+
<<< ["foobar #8"]
|
74
|
+
>>> ["FOOBAR #8"]
|
75
|
+
<<< ["foobar #9"]
|
76
|
+
>>> ["FOOBAR #9"]
|
77
|
+
REQ done.
|
78
|
+
REP done.
|
79
|
+
0.46user 0.09system 0:00.60elapsed 90%CPU (0avgtext+0avgdata 47296maxresident)k
|
80
|
+
0inputs+0outputs (0major+13669minor)pagefaults 0swaps
|
81
|
+
```
|
82
|
+
|
13
83
|
## Overview
|
14
84
|
|
15
85
|
### Class Hierarchy
|
@@ -59,24 +129,12 @@ More information in the [API documentation](http://www.rubydoc.info/github/paddo
|
|
59
129
|
|
60
130
|
### Features
|
61
131
|
|
132
|
+
* Ruby idiomatic API
|
62
133
|
* compatible with [Async](https://github.com/socketry/async) / [Async::IO](https://github.com/socketry/async-io)
|
63
|
-
*
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
* `socket << ["multi", "frame", "message"]`
|
68
|
-
* `#x=` methods instead of `#set_x` (e.g. socket options)
|
69
|
-
* `#[]` where it makes sense (e.g. on a Message, Config, or Certificate)
|
70
|
-
* no manual error checking needed
|
71
|
-
* if there's an error, an appropriate exception is raised
|
72
|
-
* of course, no manual dealing with the ZMQ context
|
73
|
-
* easy security
|
74
|
-
* use `Socket#CURVE_server!(cert)` on the server
|
75
|
-
* and `Socket#CURVE_client!(client_cert, server_cert)` on the client
|
76
|
-
* socket types as Ruby classes
|
77
|
-
* no need to manually pass type constants
|
78
|
-
* but you can: `CZTop::Socket.new_by_type(:REP)`
|
79
|
-
* e.g. `#subscribe` only exists on `CZTop::Socket::SUB`
|
134
|
+
* errors as exceptions
|
135
|
+
* CURVE security
|
136
|
+
* supports CZMQ DRAFT API
|
137
|
+
* extensive spec coverage
|
80
138
|
|
81
139
|
## Requirements
|
82
140
|
|
@@ -95,9 +153,11 @@ On macOS using Homebrew, run:
|
|
95
153
|
|
96
154
|
### Supported Rubies
|
97
155
|
|
98
|
-
|
99
|
-
|
100
|
-
*
|
156
|
+
At least:
|
157
|
+
|
158
|
+
* Ruby 3.0, 3.1, 3.2, 3.3
|
159
|
+
|
160
|
+
Using CZTop with Async will require Ruby 3.2 because of the use of `IO::TimeoutError`, which was introduced in Ruby 3.2.
|
101
161
|
|
102
162
|
## Installation
|
103
163
|
|
data/cztop.gemspec
CHANGED
@@ -8,7 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["Patrik Wenger"]
|
9
9
|
spec.email = ["paddor@gmail.com"]
|
10
10
|
|
11
|
-
spec.summary =
|
11
|
+
spec.summary = 'CZMQ FFI binding to bring ZMQ sockets to Ruby'
|
12
|
+
spec.description = 'CZMQ binding based on the generated low-level FFI bindings of CZMQ'
|
12
13
|
spec.homepage = "https://rubygems.org/gems/cztop"
|
13
14
|
spec.license = "ISC"
|
14
15
|
spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
|
@@ -22,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
22
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
24
|
spec.require_paths = ["lib"]
|
24
25
|
|
25
|
-
spec.add_runtime_dependency "czmq-ffi-gen", "~> 1.1.0
|
26
|
+
spec.add_runtime_dependency "czmq-ffi-gen", "~> 1.1.0"
|
26
27
|
|
27
28
|
spec.add_development_dependency "bundler"
|
28
29
|
spec.add_development_dependency "rake"
|
@@ -32,6 +33,9 @@ Gem::Specification.new do |spec|
|
|
32
33
|
spec.add_development_dependency "pry"
|
33
34
|
spec.add_development_dependency "yard"
|
34
35
|
spec.add_development_dependency "rubocop", "~> 1.36.0"
|
35
|
-
|
36
|
-
|
36
|
+
|
37
|
+
if RUBY_VERSION >= '3.1'
|
38
|
+
spec.add_development_dependency "async", ">= 2.0.1"
|
39
|
+
spec.add_development_dependency "async-io"
|
40
|
+
end
|
37
41
|
end
|
data/examples/async/async.rb
CHANGED
@@ -4,37 +4,32 @@ require 'cztop/async'
|
|
4
4
|
|
5
5
|
Async do |task|
|
6
6
|
task.async do |t|
|
7
|
-
socket = CZTop::Socket::REP.new("
|
7
|
+
socket = CZTop::Socket::REP.new("inproc://req_rep_example")
|
8
|
+
io = Async::IO.try_convert socket
|
8
9
|
|
9
|
-
|
10
|
-
socket.options.rcvtimeo = 3
|
11
|
-
io = Async::IO.try_convert socket
|
10
|
+
socket.options.rcvtimeo = 50 # ms
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
loop do
|
13
|
+
msg = io.receive
|
14
|
+
puts "<<< #{msg.to_a.inspect}"
|
15
|
+
io << msg.to_a.map(&:upcase)
|
16
|
+
rescue IO::TimeoutError
|
17
|
+
break
|
18
|
+
end
|
16
19
|
|
17
20
|
puts "REP done."
|
18
21
|
end
|
19
22
|
|
20
23
|
task.async do
|
21
|
-
socket = CZTop::Socket::REQ.new("
|
22
|
-
|
24
|
+
socket = CZTop::Socket::REQ.new("inproc://req_rep_example")
|
25
|
+
io = Async::IO.try_convert socket
|
23
26
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
+
10.times do |i|
|
28
|
+
io << "foobar ##{i}"
|
29
|
+
msg = io.receive
|
30
|
+
puts ">>> #{msg.to_a.inspect}"
|
31
|
+
end
|
27
32
|
|
28
|
-
socket.options.rcvtimeo = 3
|
29
|
-
msg = io.receive
|
30
|
-
puts ">>> #{msg.to_a.inspect}"
|
31
33
|
puts "REQ done."
|
32
34
|
end
|
33
|
-
|
34
|
-
task.async do
|
35
|
-
6.times do
|
36
|
-
sleep 0.5
|
37
|
-
puts "tick"
|
38
|
-
end
|
39
|
-
end
|
40
35
|
end
|
data/lib/cztop/async.rb
CHANGED
@@ -49,6 +49,8 @@ module Async
|
|
49
49
|
def wait_readable(timeout = read_timeout)
|
50
50
|
@io_fd ||= ::IO.for_fd @io.fd, autoclose: false
|
51
51
|
|
52
|
+
return true if @io.readable?
|
53
|
+
|
52
54
|
if timeout
|
53
55
|
timeout_at = now + timeout
|
54
56
|
|
@@ -67,6 +69,8 @@ module Async
|
|
67
69
|
def wait_writable(timeout = write_timeout)
|
68
70
|
@io_fd ||= ::IO.for_fd @io.fd, autoclose: false
|
69
71
|
|
72
|
+
return true if @io.writable?
|
73
|
+
|
70
74
|
if timeout
|
71
75
|
timeout_at = now + timeout
|
72
76
|
|
data/lib/cztop/cert_store.rb
CHANGED
@@ -13,6 +13,12 @@ module CZTop
|
|
13
13
|
include HasFFIDelegate
|
14
14
|
extend CZTop::HasFFIDelegate::ClassMethods
|
15
15
|
|
16
|
+
unless ::CZMQ::FFI::Zsys.has_curve
|
17
|
+
def self.new(...)
|
18
|
+
fail NotImplementedError
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
16
22
|
# Initializes a new certificate store.
|
17
23
|
#
|
18
24
|
# @param location [String, #to_s, nil] location the path to the
|
data/lib/cztop/certificate.rb
CHANGED
@@ -8,6 +8,13 @@ module CZTop
|
|
8
8
|
extend CZTop::HasFFIDelegate::ClassMethods
|
9
9
|
include ::CZMQ::FFI
|
10
10
|
|
11
|
+
unless ::CZMQ::FFI::Zsys.has_curve
|
12
|
+
def self.new(...)
|
13
|
+
fail NotImplementedError
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
11
18
|
# Warns if CURVE security isn't available.
|
12
19
|
# @return [void]
|
13
20
|
def self.check_curve_availability
|
@@ -57,6 +64,16 @@ module CZTop
|
|
57
64
|
end
|
58
65
|
|
59
66
|
|
67
|
+
KEY_ALL_ZERO = '0000000000000000000000000000000000000000'
|
68
|
+
|
69
|
+
# @return [Boolean] whether one of the keys is all zeros (happens when CURVE is not available, i.e. libzmq was
|
70
|
+
# compiled without libsodium)
|
71
|
+
# @see .check_curve_availability
|
72
|
+
def zero?
|
73
|
+
public_key(format: :z85) == KEY_ALL_ZERO || secret_key(format: :z85) == KEY_ALL_ZERO
|
74
|
+
end
|
75
|
+
|
76
|
+
|
60
77
|
# Returns the public key either as Z85-encoded ASCII string (default) or
|
61
78
|
# binary string.
|
62
79
|
# @param format [Symbol] +:z85+ for Z85, +:binary+ for binary
|
data/lib/cztop/version.rb
CHANGED
data/lib/cztop/zsock_options.rb
CHANGED
@@ -111,58 +111,8 @@ module CZTop
|
|
111
111
|
|
112
112
|
# @!endgroup
|
113
113
|
|
114
|
-
# @!group Security Mechanisms
|
115
|
-
|
116
|
-
# @return [Boolean] whether this zocket is a CURVE server
|
117
|
-
def CURVE_server?
|
118
|
-
Zsock.curve_server(@zocket).positive?
|
119
|
-
end
|
120
|
-
|
121
|
-
|
122
|
-
# Make this zocket a CURVE server.
|
123
|
-
# @param bool [Boolean]
|
124
|
-
# @note You'll have to use a {CZTop::Authenticator}.
|
125
|
-
def CURVE_server=(bool)
|
126
|
-
Zsock.set_curve_server(@zocket, bool ? 1 : 0)
|
127
|
-
end
|
128
|
-
|
129
|
-
|
130
|
-
# @return [String] Z85 encoded server key set
|
131
|
-
# @return [nil] if the current mechanism isn't CURVE or CURVE isn't
|
132
|
-
# supported
|
133
|
-
def CURVE_serverkey
|
134
|
-
CURVE_key(:curve_serverkey)
|
135
|
-
end
|
136
114
|
|
137
|
-
|
138
|
-
# Get one of the CURVE keys.
|
139
|
-
# @param key_name [Symbol] something like +:curve_serverkey+
|
140
|
-
# @return [String, nil] key, if CURVE is supported and active, or nil
|
141
|
-
def CURVE_key(key_name)
|
142
|
-
return nil if mechanism != :CURVE
|
143
|
-
|
144
|
-
ptr = Zsock.__send__(key_name, @zocket)
|
145
|
-
return nil if ptr.null?
|
146
|
-
|
147
|
-
ptr.read_string
|
148
|
-
end
|
149
|
-
private :CURVE_key
|
150
|
-
|
151
|
-
# Sets the server's public key, so the zocket can authenticate the
|
152
|
-
# remote server.
|
153
|
-
# @param key [String] Z85 (40 bytes) or binary (32 bytes) server key
|
154
|
-
# @raise [ArgumentError] if key has wrong size
|
155
|
-
def CURVE_serverkey=(key)
|
156
|
-
case key.bytesize
|
157
|
-
when 40
|
158
|
-
Zsock.set_curve_serverkey(@zocket, key)
|
159
|
-
when 32
|
160
|
-
ptr = ::FFI::MemoryPointer.from_string(key)
|
161
|
-
Zsock.set_curve_serverkey_bin(@zocket, ptr)
|
162
|
-
else
|
163
|
-
raise ArgumentError, format('invalid server key: %p', key)
|
164
|
-
end
|
165
|
-
end
|
115
|
+
# @!group Security Mechanisms
|
166
116
|
|
167
117
|
# supported security mechanisms and their macro value equivalent
|
168
118
|
MECHANISMS = {
|
@@ -182,20 +132,92 @@ module CZTop
|
|
182
132
|
raise format('unknown ZMQ security mechanism code: %i', code)
|
183
133
|
end
|
184
134
|
|
135
|
+
if ::CZMQ::FFI::Zsys.has_curve
|
136
|
+
# @return [Boolean] whether this zocket is a CURVE server
|
137
|
+
def CURVE_server?
|
138
|
+
Zsock.curve_server(@zocket).positive?
|
139
|
+
end
|
185
140
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
141
|
+
|
142
|
+
# Make this zocket a CURVE server.
|
143
|
+
# @param bool [Boolean]
|
144
|
+
# @note You'll have to use a {CZTop::Authenticator}.
|
145
|
+
def CURVE_server=(bool)
|
146
|
+
Zsock.set_curve_server(@zocket, bool ? 1 : 0)
|
147
|
+
end
|
148
|
+
|
149
|
+
|
150
|
+
# @return [String] Z85 encoded server key set
|
151
|
+
# @return [nil] if the current mechanism isn't CURVE or CURVE isn't
|
152
|
+
# supported
|
153
|
+
def CURVE_serverkey
|
154
|
+
CURVE_key(:curve_serverkey)
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
# Get one of the CURVE keys.
|
159
|
+
# @param key_name [Symbol] something like +:curve_serverkey+
|
160
|
+
# @return [String, nil] key, if CURVE is supported and active, or nil
|
161
|
+
def CURVE_key(key_name)
|
162
|
+
return nil if mechanism != :CURVE
|
163
|
+
|
164
|
+
ptr = Zsock.__send__(key_name, @zocket)
|
165
|
+
return nil if ptr.null?
|
166
|
+
|
167
|
+
ptr.read_string
|
168
|
+
end
|
169
|
+
private :CURVE_key
|
170
|
+
|
171
|
+
# Sets the server's public key, so the zocket can authenticate the
|
172
|
+
# remote server.
|
173
|
+
# @param key [String] Z85 (40 bytes) or binary (32 bytes) server key
|
174
|
+
# @raise [ArgumentError] if key has wrong size
|
175
|
+
def CURVE_serverkey=(key)
|
176
|
+
case key.bytesize
|
177
|
+
when 40
|
178
|
+
Zsock.set_curve_serverkey(@zocket, key)
|
179
|
+
when 32
|
180
|
+
ptr = ::FFI::MemoryPointer.from_string(key)
|
181
|
+
Zsock.set_curve_serverkey_bin(@zocket, ptr)
|
182
|
+
else
|
183
|
+
raise ArgumentError, format('invalid server key: %p', key)
|
184
|
+
end
|
185
|
+
end
|
192
186
|
|
193
187
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
188
|
+
# @return [String] Z85 encoded secret key set
|
189
|
+
# @return [nil] if the current mechanism isn't CURVE or CURVE isn't
|
190
|
+
# supported
|
191
|
+
def CURVE_secretkey
|
192
|
+
CURVE_key(:curve_secretkey)
|
193
|
+
end
|
194
|
+
|
195
|
+
|
196
|
+
# @return [String] Z85 encoded public key set
|
197
|
+
# @return [nil] if the current mechanism isn't CURVE or CURVE isn't
|
198
|
+
# supported
|
199
|
+
def CURVE_publickey
|
200
|
+
CURVE_key(:curve_publickey)
|
201
|
+
end
|
202
|
+
else
|
203
|
+
def CURVE_server?
|
204
|
+
fail NotImplementedError
|
205
|
+
end
|
206
|
+
def CURVE_server=(...)
|
207
|
+
fail NotImplementedError
|
208
|
+
end
|
209
|
+
def CURVE_serverkey(...)
|
210
|
+
fail NotImplementedError
|
211
|
+
end
|
212
|
+
def CURVE_serverkey=(...)
|
213
|
+
fail NotImplementedError
|
214
|
+
end
|
215
|
+
def CURVE_secretkey(...)
|
216
|
+
fail NotImplementedError
|
217
|
+
end
|
218
|
+
def CURVE_publickey(...)
|
219
|
+
fail NotImplementedError
|
220
|
+
end
|
199
221
|
end
|
200
222
|
|
201
223
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cztop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrik Wenger
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.1.0
|
19
|
+
version: 1.1.0
|
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: 1.1.0
|
26
|
+
version: 1.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,7 +164,7 @@ dependencies:
|
|
164
164
|
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
|
-
description:
|
167
|
+
description: CZMQ binding based on the generated low-level FFI bindings of CZMQ
|
168
168
|
email:
|
169
169
|
- paddor@gmail.com
|
170
170
|
executables:
|
@@ -177,6 +177,7 @@ files:
|
|
177
177
|
- ".github/workflows/draft_api.yml"
|
178
178
|
- ".github/workflows/stable_api.yml"
|
179
179
|
- ".gitignore"
|
180
|
+
- ".projections.json"
|
180
181
|
- ".rspec"
|
181
182
|
- ".rubocop.yml"
|
182
183
|
- ".yardopts"
|
@@ -273,5 +274,5 @@ requirements: []
|
|
273
274
|
rubygems_version: 3.5.3
|
274
275
|
signing_key:
|
275
276
|
specification_version: 4
|
276
|
-
summary: CZMQ
|
277
|
+
summary: CZMQ FFI binding to bring ZMQ sockets to Ruby
|
277
278
|
test_files: []
|