cztop 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f398a80bc75445bfd115544ca7f3e4c9f894cd1b9d58a9f0e2a90f6c0841275
4
- data.tar.gz: 4d6b4c393b573c8bd64f4a65317bd6bbf258c5c2a7137ecabc681be6713c6f6a
3
+ metadata.gz: 0a5218cd3606b597506aa29ea2bc0ccfe2ccd8030f1a0ce1c6ea90791fe7c88e
4
+ data.tar.gz: 3ad76dccf7e6bad9aff9a19f679bb3420dcf08ec742b109ff6c0a688f3fce4e4
5
5
  SHA512:
6
- metadata.gz: 12567ad2f7cadeb6067edcf61fb3ba975635d236edd4a5dd5465b6dcb931cf7c8b4f5852892c5bd4c0c5f0aaa87488f21b7ccb81a73a5d4134928b55f276ce4a
7
- data.tar.gz: 99d6274e17d86865e80328184825f525f2959dbe926e052c9af88423f40e0fbf6f53531ef5de8eb22225315f2629e3580fd34f094031c21bbb37a665946d58b7
6
+ metadata.gz: 36ac2f1e2b1f0ddfb78f3cd77fc7fbfdb78591c1c379b3fb96b92d80566fc8e07e39f666c78b1b2aa6771fcd2fb22d6e6b7a173040b9c489053af27030689220
7
+ data.tar.gz: ef8061d7082e73bf757335d5c6cd550aeb39dfbdb54314b893e44350e9065ea96874d09b89720fbbe4b98873a0e1b575f76f91266025dcb2d5d45b88b5c11c90
data/CHANGES.md CHANGED
@@ -1,3 +1,14 @@
1
+ 1.2.0 (1/7/2024)
2
+ -----
3
+ * refactor waiting for socket readability/writability
4
+ * fix ROUTER socket hanging in busy loop if ZMQ_ROUTER_MANDATORY flag is set and sending a message while no peers are connected
5
+ * same for unconnected CLIENT sockets
6
+ * slim down packaged gem
7
+ * modernize examples
8
+ * require Ruby 3.2
9
+ * some exceptions changed from EAGAIN to IO::TimeoutError
10
+ * Certificate.load and .new_from raise NotImplementedError if CURVE is not available
11
+
1
12
  1.1.2 (1/5/2024)
2
13
  -----
3
14
  * refactor to make code Fiber Scheduler agnostic
data/cztop.gemspec CHANGED
@@ -12,13 +12,13 @@ Gem::Specification.new do |spec|
12
12
  spec.description = 'CZMQ binding based on the generated low-level FFI bindings of CZMQ'
13
13
  spec.homepage = "https://rubygems.org/gems/cztop"
14
14
  spec.license = "ISC"
15
- spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
15
+ spec.required_ruby_version = Gem::Requirement.new(">= 3.2.0")
16
16
 
17
17
  spec.metadata["homepage_uri"] = spec.homepage
18
18
  spec.metadata["source_code_uri"] = "https://github.com/paddor/cztop"
19
19
  spec.metadata["changelog_uri"] = "https://github.com/paddor/cztop/blob/master/CHANGELOG.md"
20
20
 
21
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match?(%r{^(\.|Rakefile|spec/|examples/|ci/|perf/)}) }
22
22
  spec.bindir = "exe"
23
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  spec.require_paths = ["lib"]
@@ -32,7 +32,6 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "rspec-given", "~> 3.8.0"
33
33
  spec.add_development_dependency "pry"
34
34
  spec.add_development_dependency "yard"
35
- spec.add_development_dependency "rubocop", "~> 1.36.0"
36
35
 
37
36
  if RUBY_VERSION >= '3.1'
38
37
  spec.add_development_dependency "async", ">= 2.0.1"
data/lib/cztop/actor.rb CHANGED
@@ -12,7 +12,7 @@ module CZTop
12
12
  #
13
13
  # = About termination
14
14
  # Actors should be terminated explicitly, either by calling {#terminate}
15
- # from the current process or sending them the "$TERM" command (from
15
+ # from the current process or sending them the {TERMINATE} command (from
16
16
  # outside). Not terminating them explicitly might make the process block at
17
17
  # exit.
18
18
  #
@@ -48,12 +48,20 @@ module CZTop
48
48
  class DeadActorError < RuntimeError; end
49
49
 
50
50
 
51
+ # the command which causes an actor handler to terminate
52
+ TERMINATE = '$TERM'
53
+
54
+
55
+ # timeout to use when sending the actor a message
56
+ SEND_TIMEOUT = 20 # ms
57
+
58
+
51
59
  # @return [Exception] the exception that crashed this actor, if any
52
60
  attr_reader :exception
53
61
 
54
62
 
55
63
  # Creates a new actor. Either pass a callback directly or a block. The
56
- # block will be called for every received message.
64
+ # callback/block will be called for every received message.
57
65
  #
58
66
  # In case the given callback is an FFI::Pointer (to a C function), it's
59
67
  # used as-is. It is expected to do the handshake (signal) itself.
@@ -71,8 +79,9 @@ module CZTop
71
79
  @callback = callback || handler
72
80
  @callback = shim(@callback) unless @callback.is_a? ::FFI::Pointer
73
81
  ffi_delegate = Zactor.new(@callback, c_args)
82
+
74
83
  attach_ffi_delegate(ffi_delegate)
75
- options.sndtimeo = 20 # ms # see #<<
84
+ options.sndtimeo = SEND_TIMEOUT # see #<<
76
85
  end
77
86
 
78
87
 
@@ -83,11 +92,11 @@ module CZTop
83
92
  # @raise [IO::EAGAINWaitWritable, RuntimeError] anything that could be
84
93
  # raised by {Message#send_to}
85
94
  # @note Normally this method is asynchronous, but if the message is
86
- # "$TERM", it blocks until the actor is terminated.
95
+ # {TERMINATE}, it blocks until the actor is terminated.
87
96
  def <<(message)
88
97
  message = Message.coerce(message)
89
98
 
90
- if TERM == message[0]
99
+ if TERMINATE == message[0]
91
100
  # NOTE: can't just send this to the actor. The sender might call
92
101
  # #terminate immediately, which most likely causes a hang due to race
93
102
  # conditions.
@@ -99,7 +108,7 @@ module CZTop
99
108
 
100
109
  message.send_to(self)
101
110
  end
102
- rescue IO::EAGAINWaitWritable
111
+ rescue IO::EAGAINWaitWritable, IO::TimeoutError
103
112
  # The sndtimeo has been reached.
104
113
  #
105
114
  # This should fix the race condition (mainly on JRuby) between
@@ -111,9 +120,8 @@ module CZTop
111
120
  # at least when using a Ruby handler.
112
121
  #
113
122
  # In case of a C function handler, it MUST NOT crash and only
114
- # terminate when being sent the "$TERM" message using #terminate (so
115
- # #await_handler_death can set
116
- # @running to false).
123
+ # terminate when being sent the {TERMINATE} message using #terminate (so
124
+ # #await_handler_death can set @running to false).
117
125
  retry
118
126
  end
119
127
  end
@@ -138,13 +146,13 @@ module CZTop
138
146
  # it.
139
147
  # @param message [Message] the request to the actor
140
148
  # @return [Message] the actor's response
141
- # @raise [ArgumentError] if the message is "$TERM" (use {#terminate})
149
+ # @raise [ArgumentError] if the message is {TERMINATE} (use {#terminate})
142
150
  def request(message)
143
151
  @mtx.synchronize do
144
152
  raise DeadActorError unless @running
145
153
 
146
154
  message = Message.coerce(message)
147
- raise ArgumentError, 'use #terminate' if TERM == message[0]
155
+ raise ArgumentError, 'use #terminate' if TERMINATE == message[0]
148
156
 
149
157
  message.send_to(self)
150
158
  Message.receive_from(self)
@@ -189,11 +197,11 @@ module CZTop
189
197
  @mtx.synchronize do
190
198
  return false unless @running
191
199
 
192
- Message.new(TERM).send_to(self)
200
+ Message.new(TERMINATE).send_to(self)
193
201
  await_handler_death
194
202
  true
195
203
  end
196
- rescue IO::EAGAINWaitWritable
204
+ rescue IO::EAGAINWaitWritable, IO::TimeoutError
197
205
  # same as in #<<
198
206
  retry
199
207
  end
@@ -236,8 +244,8 @@ module CZTop
236
244
  end
237
245
 
238
246
  process_messages(handler)
239
- rescue Exception
240
- @exception = $ERROR_INFO
247
+ rescue Exception => e
248
+ @exception = e
241
249
  ensure
242
250
  signal_shimmed_handler_death
243
251
  end
@@ -251,16 +259,12 @@ module CZTop
251
259
  end
252
260
 
253
261
 
254
- # the command which causes an actor handler to terminate
255
- TERM = '$TERM'
256
-
257
-
258
262
  # Successively receive messages that were sent to the actor and
259
263
  # yield them to the given handler to process them. The a pipe (a
260
264
  # {Socket::PAIR} socket) is also passed to the handler so it can send back
261
265
  # the result of a command, if needed.
262
266
  #
263
- # When a message is "$TERM", or when the waiting for a message is
267
+ # When a message is {TERMINATE}, or when the waiting for a message is
264
268
  # interrupted, execution is aborted and the actor will terminate.
265
269
  #
266
270
  # @param handler [Proc, #call] the handler used to process messages
@@ -274,7 +278,7 @@ module CZTop
274
278
  rescue Interrupt
275
279
  break
276
280
  else
277
- break if TERM == message[0]
281
+ break if TERMINATE == message[0]
278
282
  end
279
283
 
280
284
  handler.call(message, @pipe)
@@ -294,7 +298,7 @@ module CZTop
294
298
  #
295
299
  # This is needed to avoid the race condition between zactor_destroy()
296
300
  # which will wait for a signal from the handler in case it was able to
297
- # send the "$TERM" command, and the @callback which might still haven't
301
+ # send the {TERMINATE} command, and the @callback which might still haven't
298
302
  # returned, but doesn't receive any messages anymore.
299
303
  #
300
304
  # @return [void]
@@ -8,19 +8,15 @@ 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
-
18
11
  # Warns if CURVE security isn't available.
19
- # @return [void]
12
+ # @return [Boolean] whether it's available
20
13
  def self.check_curve_availability
21
- return if Zsys.has_curve
22
-
23
- warn "CZTop: CURVE isn't available. Consider installing libsodium."
14
+ if Zsys.has_curve
15
+ true
16
+ else
17
+ warn "CZTop: CURVE isn't available. Consider installing libsodium."
18
+ false
19
+ end
24
20
  end
25
21
 
26
22
 
@@ -57,6 +53,18 @@ module CZTop
57
53
  from_ffi_delegate(ptr)
58
54
  end
59
55
 
56
+ unless ::CZMQ::FFI::Zsys.has_curve
57
+ def self.new(...)
58
+ fail NotImplementedError
59
+ end
60
+ def self.load(...)
61
+ fail NotImplementedError
62
+ end
63
+ def self.new_from(...)
64
+ fail NotImplementedError
65
+ end
66
+ end
67
+
60
68
 
61
69
  # Initialize a new in-memory certificate with random keys.
62
70
  def initialize
data/lib/cztop/message.rb CHANGED
@@ -49,7 +49,7 @@ module CZTop
49
49
  # @raise [IO::EAGAINWaitWritable] if the send timeout has been reached
50
50
  # (see {ZsockOptions::OptionsAccessor#sndtimeo=})
51
51
  # @raise [SocketError] if the message can't be routed to the destination
52
- # (either if ROUTER_MANDATORY flag is set on a {Socket::ROUTER} socket
52
+ # (either if ZMQ_ROUTER_MANDATORY flag is set on a {Socket::ROUTER} socket
53
53
  # and the peer isn't connected or its SNDHWM is reached (see
54
54
  # {ZsockOptions::OptionsAccessor#router_mandatory=}, or if it's
55
55
  # a {Socket::SERVER} socket and there's no connected CLIENT
@@ -61,7 +61,7 @@ module CZTop
61
61
  # returns with failure. Please report as bug.
62
62
  #
63
63
  def send_to(destination)
64
- destination.wait_writable if Fiber.scheduler
64
+ destination.wait_writable
65
65
 
66
66
  rc = Zmsg.send(ffi_delegate, destination)
67
67
  return if rc.zero?
@@ -81,7 +81,7 @@ module CZTop
81
81
  # @raise [SystemCallError] for any other error code set after +zmsg_recv+
82
82
  # returns with failure. Please report as bug.
83
83
  def self.receive_from(source)
84
- source.wait_readable if Fiber.scheduler
84
+ source.wait_readable
85
85
 
86
86
  delegate = Zmsg.recv(source)
87
87
  return from_ffi_delegate(delegate) unless delegate.null?
@@ -10,7 +10,7 @@ module CZTop
10
10
  # Sends a message.
11
11
  #
12
12
  # @param message [Message, String, Array<parts>] the message to send
13
- # @raise [IO::EAGAINWaitWritable] if send timeout has been reached (see
13
+ # @raise [IO::EAGAINWaitWritable, IO::TimeoutError] if send timeout has been reached (see
14
14
  # {ZsockOptions::OptionsAccessor#sndtimeo=})
15
15
  # @raise [Interrupt, ArgumentError, SystemCallError] anything raised by
16
16
  # {Message#send_to}
@@ -26,7 +26,7 @@ module CZTop
26
26
  # Receives a message.
27
27
  #
28
28
  # @return [Message]
29
- # @raise [IO::EAGAINWaitReadable] if receive timeout has been reached (see
29
+ # @raise [IO::EAGAINWaitReadable, IO::TimeoutError] if receive timeout has been reached (see
30
30
  # {ZsockOptions::OptionsAccessor#rcvtimeo=})
31
31
  # @raise [Interrupt, ArgumentError, SystemCallError] anything raised by
32
32
  # {Message.receive_from}
@@ -36,7 +36,13 @@ module CZTop
36
36
  end
37
37
 
38
38
 
39
+ JIFFY = 0.015 # 15 ms
40
+
41
+
39
42
  # Waits for socket to become readable.
43
+ # @param timeout [Numeric, nil] timeout in seconds
44
+ # @return [true] if readable within timeout
45
+ # @raise [IO::EAGAINWaitReadable, IO::TimeoutError] if timeout has been reached
40
46
  def wait_readable(timeout = read_timeout)
41
47
  return true if readable?
42
48
 
@@ -47,16 +53,29 @@ module CZTop
47
53
 
48
54
  while true
49
55
  @fd_io.wait_readable(timeout)
50
- break if readable? # NOTE: ZMQ FD can't be trusted 100%
56
+ break if readable? # NOTE: ZMQ FD can't be trusted
51
57
  raise ::IO::TimeoutError if now >= timeout_at
58
+
59
+ # HACK for edge case: avoid hogging CPU if FD for socket type doesn't block and just insists
60
+ sleep JIFFY
52
61
  end
53
62
  else
54
- @fd_io.wait_readable until readable?
63
+ until readable?
64
+ @fd_io.wait_readable
65
+
66
+ # HACK for edge case: avoid hogging CPU if FD for socket type doesn't block and just insists
67
+ sleep JIFFY
68
+ end
55
69
  end
70
+
71
+ true
56
72
  end
57
73
 
58
74
 
59
75
  # Waits for socket to become writable.
76
+ # @param timeout [Numeric, nil] timeout in seconds
77
+ # @return [true] if writable within timeout
78
+ # @raise [IO::EAGAINWaitReadable, IO::TimeoutError] if timeout has been reached
60
79
  def wait_writable(timeout = write_timeout)
61
80
  return true if writable?
62
81
 
@@ -67,12 +86,22 @@ module CZTop
67
86
 
68
87
  while true
69
88
  @fd_io.wait_writable(timeout)
70
- break if writable? # NOTE: ZMQ FD can't be trusted 100%
89
+ break if writable? # NOTE: ZMQ FD can't be trusted
71
90
  raise ::IO::TimeoutError if now >= timeout_at
91
+
92
+ # HACK for edge case: avoid hogging CPU if FD for socket type doesn't block and just insists
93
+ sleep JIFFY
72
94
  end
73
95
  else
74
- @fd_io.wait_writable until writable?
96
+ until writable?
97
+ @fd_io.wait_writable
98
+
99
+ # HACK for edge case: avoid hogging CPU if FD for socket type doesn't block and just insists
100
+ sleep JIFFY
101
+ end
75
102
  end
103
+
104
+ true
76
105
  end
77
106
 
78
107
 
@@ -76,6 +76,15 @@ module CZTop
76
76
  attach_ffi_delegate(Zsock.new_client(endpoints))
77
77
  end
78
78
 
79
+
80
+ # @raise [SocketError] if no peer is connected
81
+ def wait_writable(...)
82
+ if !writable?
83
+ fail SocketError, "no peer connected"
84
+ end
85
+
86
+ super
87
+ end
79
88
  end
80
89
 
81
90
 
@@ -160,6 +169,15 @@ module CZTop
160
169
  self << message
161
170
  end
162
171
 
172
+
173
+ # @raise [SocketError] if ZMQ_ROUTER_MANDATORY option and message is currently not routable
174
+ def wait_writable(...)
175
+ if options.router_mandatory? && !writable?
176
+ fail SocketError, "no peer connected"
177
+ end
178
+
179
+ super
180
+ end
163
181
  end
164
182
 
165
183
 
data/lib/cztop/version.rb CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  module CZTop
4
4
 
5
- VERSION = '1.1.2'
5
+ VERSION = '1.2.0'
6
6
 
7
7
  end
@@ -325,11 +325,19 @@ module CZTop
325
325
 
326
326
  # @!endgroup
327
327
 
328
- # Accept only routable messages on ROUTER sockets. Default is off.
329
- # @param bool [Boolean] whether to error if a message isn't routable
328
+ # ZMQ_ROUTER_MANDATORY: Accept only routable messages on ROUTER sockets. Default is off.
329
+ # @param bool [Boolean] whether to raise a SocketError if a message isn't routable
330
330
  # (either if the that peer isn't connected or its SNDHWM is reached)
331
+ # @see https://libzmq.readthedocs.io/en/latest/zmq_setsockopt.html#_zmq_router_mandatory_accept_only_routable_messages_on_router_sockets
331
332
  def router_mandatory=(bool)
332
333
  Zsock.set_router_mandatory(@zocket, bool ? 1 : 0)
334
+ @router_mandatory = bool # NOTE: no way to read this option, so we need to remember
335
+ end
336
+
337
+
338
+ # @return [Boolean] whether ZMQ_ROUTER_MANDATORY has been set
339
+ def router_mandatory?
340
+ @router_mandatory
333
341
  end
334
342
 
335
343
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cztop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrik Wenger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-05 00:00:00.000000000 Z
11
+ date: 2024-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: czmq-ffi-gen
@@ -122,20 +122,6 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: rubocop
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: 1.36.0
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: 1.36.0
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: async
141
127
  requirement: !ruby/object:Gem::Requirement
@@ -159,39 +145,14 @@ executables:
159
145
  extensions: []
160
146
  extra_rdoc_files: []
161
147
  files:
162
- - ".github/workflows/coverage.yml"
163
- - ".github/workflows/draft_api.yml"
164
- - ".github/workflows/stable_api.yml"
165
- - ".gitignore"
166
- - ".projections.json"
167
- - ".rspec"
168
- - ".rubocop.yml"
169
- - ".yardopts"
170
148
  - AUTHORS
171
149
  - CHANGES.md
172
150
  - Gemfile
173
151
  - LICENSE
174
152
  - README.md
175
- - Rakefile
176
153
  - bin/console
177
154
  - bin/setup
178
- - ci/install-libczmq
179
- - ci/install-libzmq
180
155
  - cztop.gemspec
181
- - examples/ruby_actor/actor.rb
182
- - examples/simple_req_rep/rep.rb
183
- - examples/simple_req_rep/req.rb
184
- - examples/taxi_system/.gitignore
185
- - examples/taxi_system/Makefile
186
- - examples/taxi_system/README.gsl
187
- - examples/taxi_system/README.md
188
- - examples/taxi_system/broker.rb
189
- - examples/taxi_system/client.rb
190
- - examples/taxi_system/generate_keys.rb
191
- - examples/taxi_system/start_broker.sh
192
- - examples/taxi_system/start_clients.sh
193
- - examples/weather_pub_sub/pub.rb
194
- - examples/weather_pub_sub/sub.rb
195
156
  - exe/z85decode
196
157
  - exe/z85encode
197
158
  - lib/cztop.rb
@@ -225,11 +186,6 @@ files:
225
186
  - lib/cztop/z85/pipe.rb
226
187
  - lib/cztop/zap.rb
227
188
  - lib/cztop/zsock_options.rb
228
- - perf/README.md
229
- - perf/inproc_lat.rb
230
- - perf/inproc_thru.rb
231
- - perf/local_lat.rb
232
- - perf/remote_lat.rb
233
189
  homepage: https://rubygems.org/gems/cztop
234
190
  licenses:
235
191
  - ISC
@@ -245,7 +201,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
245
201
  requirements:
246
202
  - - ">="
247
203
  - !ruby/object:Gem::Version
248
- version: 3.0.0
204
+ version: 3.2.0
249
205
  required_rubygems_version: !ruby/object:Gem::Requirement
250
206
  requirements:
251
207
  - - ">="
@@ -1,20 +0,0 @@
1
- name: Coverage
2
-
3
- on: [push,pull_request]
4
-
5
- jobs:
6
- build:
7
- runs-on: ubuntu-22.04
8
- steps:
9
- - uses: actions/checkout@v4
10
- - name: Set up Ruby
11
- uses: ruby/setup-ruby@v1
12
- with:
13
- ruby-version: 3.3
14
- - name: Install CZMQ
15
- run: sudo apt-get install libczmq-dev
16
- - name: Run the default task
17
- run: |
18
- gem install bundler
19
- bundle install
20
- env REPORT_COVERAGE=true bundle exec rake
@@ -1,27 +0,0 @@
1
- name: DRAFT API
2
-
3
- on: [push,pull_request]
4
-
5
- jobs:
6
- build:
7
- runs-on: ubuntu-22.04
8
- timeout-minutes: 15
9
- steps:
10
- - uses: actions/checkout@v4
11
- - name: Set up Ruby
12
- uses: ruby/setup-ruby@v1
13
- with:
14
- ruby-version: '3.3'
15
- - name: Install ZMQ and CZMQ
16
- run: |
17
- export PKG_CONFIG_PATH=$HOME/lib/pkgconfig # custom libs (for linking)
18
- env
19
- env ZMQ_VERSION=HEAD ci/install-libzmq
20
- env CZMQ_VERSION=HEAD ci/install-libczmq
21
- - name: Run the default task
22
- run: |
23
- export LD_LIBRARY_PATH=$HOME/lib # custom libs (for execution)
24
- env
25
- gem install bundler
26
- bundle install
27
- bundle exec rake
@@ -1,26 +0,0 @@
1
- name: STABLE API
2
-
3
- on: [push,pull_request]
4
-
5
- jobs:
6
- build:
7
- runs-on: ubuntu-22.04
8
- strategy:
9
- matrix:
10
- ruby:
11
- - '3.1'
12
- - '3.2'
13
- - '3.3'
14
- steps:
15
- - uses: actions/checkout@v4
16
- - name: Set up Ruby ${{ matrix.ruby }}
17
- uses: ruby/setup-ruby@v1
18
- with:
19
- ruby-version: ${{ matrix.ruby }}
20
- - name: Install CZMQ
21
- run: sudo apt-get install libczmq-dev
22
- - name: Run the default task
23
- run: |
24
- gem install bundler
25
- bundle install
26
- bundle exec rake
data/.gitignore DELETED
@@ -1,10 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- /*.vimsession
data/.projections.json DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "lib/*.rb": { "alternate": "spec/{}_spec.rb" },
3
- "spec/*_spec.rb": { "alternate": "lib/{}.rb", "dispatch": "bundle exec rspec -ff {file}" }
4
- }
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --format documentation
2
- --color