cztop 0.12.1 → 1.0.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 +5 -5
- data/.github/workflows/main.yml +26 -0
- data/.ruby-version +1 -0
- data/CHANGES.md +30 -0
- data/Gemfile +1 -10
- data/README.md +15 -264
- data/cztop.gemspec +13 -15
- data/lib/cztop/certificate.rb +1 -1
- data/lib/cztop/frame.rb +3 -3
- data/lib/cztop/message.rb +10 -1
- data/lib/cztop/monitor.rb +19 -5
- data/lib/cztop/poller/zmq.rb +3 -2
- data/lib/cztop/version.rb +1 -1
- data/lib/cztop/zsock_options.rb +21 -2
- metadata +22 -106
- data/.travis.yml +0 -37
- data/Guardfile +0 -61
- data/Procfile +0 -3
- data/ci-scripts/install-deps +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '0099b49a3147e57b4e29b8ca7288370f56e06694230c2f390e36308ac1f0cb1e'
|
4
|
+
data.tar.gz: d4431ae33cc4c35f9911d755d4377913f502156c26317b04a720c598f1f3eb3b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48f93f12b32aaed87a7cdbdf3f83ff064e69f1fef3e27e4dfaee21a7d721698bd8e7e1675d6fa1110b7597ae7651d971d4502b631a5505345cbb0dbf8ecc19e8
|
7
|
+
data.tar.gz: 90540f6ccab41b27361fc1372feb5198351a725b20a69509285ed459073f438a149a7e5e11043a1936b978610c664a0f7096bbb27c6801054cb85ff6fcd6a0b4
|
@@ -0,0 +1,26 @@
|
|
1
|
+
name: Specs
|
2
|
+
|
3
|
+
on: [push,pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-20.04
|
8
|
+
strategy:
|
9
|
+
matrix:
|
10
|
+
ruby:
|
11
|
+
- "2.6"
|
12
|
+
- "2.7"
|
13
|
+
- "3.0"
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v2
|
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 install libczmq-dev
|
22
|
+
- name: Run the default task
|
23
|
+
run: |
|
24
|
+
gem install bundler -v 2.2.3
|
25
|
+
bundle install
|
26
|
+
bundle exec rake
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.0
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
1.0.0 (01/08/2021)
|
2
|
+
-----
|
3
|
+
* modernized project
|
4
|
+
|
5
|
+
0.13.1 (03/04/2018)
|
6
|
+
-----
|
7
|
+
* fix specs
|
8
|
+
|
9
|
+
0.13.0 (03/04/2018)
|
10
|
+
-----
|
11
|
+
* use czmq-ffi-gen 0.15.x
|
12
|
+
* CZTop::Monitor#listen: removed HANDSHAKE_FAILED and HANDSHAKE_SUCCEED events
|
13
|
+
and added HANDSHAKE_SUCCEEDED, HANDSHAKE_FAILED_NO_DETAIL,
|
14
|
+
HANDSHAKE:FAILED_PROTOCOL, HANDSHAKE_FAILED_AUTH to reflect changes in CZMQ
|
15
|
+
* add CZTop::Monitor#fd and #readable?
|
16
|
+
* add CZTop::ZsockOptions#fd (so #fd can be called on Sockets and Actors directly)
|
17
|
+
* CZTop::Message#to_a: create less intermediate objects
|
18
|
+
* support ZMQ_RECONNECT_IVL option
|
19
|
+
* CZTop::Frame#group: return nil if group string is empty
|
20
|
+
|
21
|
+
0.12.2 (11/24/2017)
|
22
|
+
-----
|
23
|
+
* no changes, but this release includes an up-to-date version of this file
|
24
|
+
|
25
|
+
0.12.1 (11/23/2017)
|
26
|
+
-----
|
27
|
+
* actually include the change for CZTop::Poller#wait documented in 0.12.0
|
28
|
+
* more robust specs around CZTop::Monitor
|
29
|
+
* test recent rubies on CI
|
30
|
+
|
1
31
|
0.12.0 (11/23/2017)
|
2
32
|
-----
|
3
33
|
* CZTop::Monitor#listen: accept HANDSHAKE_FAILED and HANDSHAKE_SUCCEED events
|
data/Gemfile
CHANGED
@@ -2,13 +2,4 @@ source 'https://rubygems.org'
|
|
2
2
|
gemspec
|
3
3
|
|
4
4
|
# useful when working on czmq-ffi-gen in parallel
|
5
|
-
#gem "czmq-ffi-gen",
|
6
|
-
#gem "rspec-core", git: "file:///Users/paddor/src/ruby/rspec-core"
|
7
|
-
|
8
|
-
group :development do
|
9
|
-
gem 'rubocop', require: false
|
10
|
-
gem 'coveralls', require: false, platform: :mri
|
11
|
-
|
12
|
-
# >= 3.1 doesn't work on Rubinius, see guard/listen#391
|
13
|
-
gem 'listen', '~> 3.0.x', require: false
|
14
|
-
end
|
5
|
+
# gem "czmq-ffi-gen", path: "../czmq-ffi-gen"
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+

|
2
|
+
|
1
3
|
# CZTop
|
2
4
|
|
3
5
|
CZTop is a CZMQ binding for Ruby. It is based on
|
@@ -6,33 +8,6 @@ FFI binding of [CZMQ](https://github.com/zeromq/czmq) and has a focus on being
|
|
6
8
|
easy to use for Rubyists (POLS) and providing first class support for security
|
7
9
|
mechanisms (like CURVE).
|
8
10
|
|
9
|
-
You might wanna check out
|
10
|
-
[cztop-patterns](https://github.com/paddor/cztop-patterns). It's still very
|
11
|
-
new, but will contain some reusable patterns described in the Zguide.
|
12
|
-
|
13
|
-
[](https://travis-ci.org/paddor/cztop?branch=master)
|
14
|
-
[](https://codeclimate.com/repos/56677a7849f50a141c001784/feed)
|
15
|
-
[](http://inch-ci.org/github/paddor/cztop)
|
16
|
-
[](https://gemnasium.com/paddor/cztop)
|
17
|
-
[](https://coveralls.io/github/paddor/cztop?branch=master)
|
18
|
-
[](LICENSE)
|
19
|
-
|
20
|
-
## Goals
|
21
|
-
|
22
|
-
Here are some some of the goals I have/had in mind for this library:
|
23
|
-
|
24
|
-
- [x] as easy as possible, Ruby-esque API
|
25
|
-
- [x] first class support for security (CURVE mechanism)
|
26
|
-
- [x] including handling of certificates
|
27
|
-
- [x] support MRI, Rubinius, and JRuby
|
28
|
-
- [x] high-quality API documentation
|
29
|
-
- [x] 100% test coverage
|
30
|
-
- [x] provide a portable Z85 implementation
|
31
|
-
* unlike [fpesce/z85](https://github.com/fpesce/z85), which is a C extension
|
32
|
-
- [x] use it to replace the [Celluloid::ZMQ](https://github.com/celluloid/celluloid-zmq) part of [Celluloid](https://github.com/celluloid/celluloid)
|
33
|
-
* [celluloid/celluloid-zmq#56](https://github.com/celluloid/celluloid-zmq/issues/56)
|
34
|
-
- [ ] implement some of the missing (CZMQ based) Ruby examples in the [ZMQ Guide](http://zguide.zeromq.org/page:all)
|
35
|
-
|
36
11
|
## Overview
|
37
12
|
|
38
13
|
### Class Hierarchy
|
@@ -96,51 +71,28 @@ More information in the [API documentation](http://www.rubydoc.info/github/paddo
|
|
96
71
|
* use `Socket#CURVE_server!(cert)` on the server
|
97
72
|
* and `Socket#CURVE_client!(client_cert, server_cert)` on the client
|
98
73
|
* socket types as Ruby classes
|
99
|
-
* no need to manually pass
|
74
|
+
* no need to manually pass type constants
|
100
75
|
* but you can: `CZTop::Socket.new_by_type(:REP)`
|
101
|
-
* e.g. `#subscribe` only exists on CZTop::Socket::SUB
|
102
|
-
* DRAFT API ready
|
103
|
-
* CLIENT/SERVER/RADIO/DISH/SCATTER/GATHER and other DRAFT methods are supported if the libraries (ZMQ/CZMQ) have been compiled with DRAFT APIs enabled (`--enable-drafts`)
|
104
|
-
* there is `#routing_id` and `#routing_id=` on the following classes:
|
105
|
-
* CZTop::Message
|
106
|
-
* CZTop::Frame
|
107
|
-
* there is `#group` and `#group=` on CZTop::Frame
|
108
|
-
* ZMTP 3.1 heartbeat ready
|
109
|
-
* `socket.options.heartbeat_ivl = 2000`
|
110
|
-
* `socket.options.heartbeat_timeout = 8000`
|
76
|
+
* e.g. `#subscribe` only exists on `CZTop::Socket::SUB`
|
111
77
|
|
112
78
|
## Requirements
|
113
79
|
|
114
|
-
You'll need:
|
115
|
-
|
116
|
-
* CZMQ >= 4.0.0
|
117
|
-
* ZMQ >= 4.2.0
|
118
80
|
|
119
|
-
|
120
|
-
ZMQ
|
81
|
+
* CZMQ >= 4.2
|
82
|
+
* ZMQ >= 4.3
|
121
83
|
|
122
|
-
To install on OSX using homebrew, run:
|
123
84
|
|
124
|
-
|
125
|
-
$ brew install zmq --HEAD --with-libsodium
|
126
|
-
$ brew install czmq --HEAD
|
85
|
+
On Ubuntu 20.04+:
|
127
86
|
|
128
|
-
|
129
|
-
to get more help. Make sure to install CZMQ, not only ZMQ.
|
87
|
+
$ sudo apt install libczmq-dev
|
130
88
|
|
131
|
-
|
132
|
-
be required to pass `--enable-drafts` to `./configure` to make sure all the
|
133
|
-
`zmq_poller_*()` functions are available. However, this doesn't seem to be the
|
134
|
-
case on all systems.
|
89
|
+
On macOS using Homebrew, run:
|
135
90
|
|
136
|
-
|
91
|
+
$ brew install czmq
|
137
92
|
|
138
|
-
|
139
|
-
is tested.
|
93
|
+
### Supported Rubies
|
140
94
|
|
141
|
-
|
142
|
-
|
143
|
-
* MRI (2.3, 2.2)
|
95
|
+
* MRI (2.6, 2.7, 3.0)
|
144
96
|
* Rubinius (HEAD)
|
145
97
|
* JRuby 9000 (HEAD)
|
146
98
|
|
@@ -165,222 +117,21 @@ Or install it yourself as:
|
|
165
117
|
The API should be fairly straight-forward to anyone who is familiar with CZMQ
|
166
118
|
and Ruby. The following API documentation is currently available:
|
167
119
|
|
168
|
-
* [YARD API documentation](http://www.rubydoc.info/github/paddor/cztop) (HEAD)
|
169
120
|
* [YARD API documentation](http://www.rubydoc.info/gems/cztop) (release)
|
170
121
|
|
171
122
|
Feel free to start a [wiki](https://github.com/paddor/cztop/wiki) page.
|
172
123
|
|
173
124
|
## Performance
|
174
125
|
|
175
|
-
|
176
|
-
reasonably thin. CZTop is basically only a convenience layer on top, with some
|
177
|
-
nice error checking. But hey, it's Ruby. Don't expect 5M messages per second
|
178
|
-
with a latency of 3us.
|
179
|
-
|
180
|
-
The measured latency on my laptop ranges from ~20us to ~60us per message for
|
181
|
-
1kb messages, depending on whether transport is inproc, IPC, or TCP/IP.
|
126
|
+
CZTop is just a convenience layer on top of the thin czmq-ffi-gen library.
|
182
127
|
|
183
|
-
Make sure
|
128
|
+
Make sure to check out the
|
184
129
|
[perf](https://github.com/paddor/cztop/blob/master/perf) directory for latency
|
185
130
|
and throughput measurement scripts.
|
186
131
|
|
187
132
|
## Usage
|
188
133
|
|
189
|
-
See the [examples](https://github.com/paddor/cztop/blob/master/examples) directory for some examples.
|
190
|
-
|
191
|
-
### rep.rb:
|
192
|
-
|
193
|
-
```ruby
|
194
|
-
#!/usr/bin/env ruby
|
195
|
-
require 'cztop'
|
196
|
-
|
197
|
-
# create and bind socket
|
198
|
-
socket = CZTop::Socket::REP.new("ipc:///tmp/req_rep_example")
|
199
|
-
puts "<<< Socket bound to #{socket.last_endpoint.inspect}"
|
200
|
-
|
201
|
-
# Simply echo every message, with every frame String#upcase'd.
|
202
|
-
while msg = socket.receive
|
203
|
-
puts "<<< #{msg.to_a.inspect}"
|
204
|
-
socket << msg.to_a.map(&:upcase)
|
205
|
-
end
|
206
|
-
```
|
207
|
-
|
208
|
-
### req.rb:
|
209
|
-
|
210
|
-
```ruby
|
211
|
-
#!/usr/bin/env ruby
|
212
|
-
require 'cztop'
|
213
|
-
|
214
|
-
# connect
|
215
|
-
socket = CZTop::Socket::REQ.new("ipc:///tmp/req_rep_example")
|
216
|
-
puts ">>> Socket connected."
|
217
|
-
|
218
|
-
# simple string
|
219
|
-
socket << "foobar"
|
220
|
-
msg = socket.receive
|
221
|
-
puts ">>> #{msg.to_a.inspect}"
|
222
|
-
|
223
|
-
# multi frame message as array
|
224
|
-
socket << %w[foo bar baz]
|
225
|
-
msg = socket.receive
|
226
|
-
puts ">>> #{msg.to_a.inspect}"
|
227
|
-
|
228
|
-
# manually instantiating a Message
|
229
|
-
msg = CZTop::Message.new("bla")
|
230
|
-
msg << "another frame" # append a frame
|
231
|
-
socket << msg
|
232
|
-
msg = socket.receive
|
233
|
-
puts ">>> #{msg.to_a.inspect}"
|
234
|
-
|
235
|
-
##
|
236
|
-
# This will send 20 additional messages:
|
237
|
-
#
|
238
|
-
# $ ./req.rb 20
|
239
|
-
#
|
240
|
-
if ARGV.first
|
241
|
-
ARGV.first.to_i.times do
|
242
|
-
socket << ["fooooooooo", "baaaaaar"]
|
243
|
-
puts ">>> " + socket.receive.to_a.inspect
|
244
|
-
end
|
245
|
-
end
|
246
|
-
```
|
247
|
-
|
248
|
-
### Running it
|
249
|
-
|
250
|
-
```
|
251
|
-
$ ./rep.rb & ./req.rb 3
|
252
|
-
[3] 35321
|
253
|
-
>>> Socket connected.
|
254
|
-
<<< Socket bound to "ipc:///tmp/req_rep_example"
|
255
|
-
<<< ["foobar"]
|
256
|
-
>>> ["FOOBAR"]
|
257
|
-
<<< ["foo", "bar", "baz"]
|
258
|
-
>>> ["FOO", "BAR", "BAZ"]
|
259
|
-
<<< ["bla", "another frame"]
|
260
|
-
>>> ["BLA", "ANOTHER FRAME"]
|
261
|
-
<<< ["fooooooooo", "baaaaaar"]
|
262
|
-
>>> ["FOOOOOOOOO", "BAAAAAAR"]
|
263
|
-
<<< ["fooooooooo", "baaaaaar"]
|
264
|
-
>>> ["FOOOOOOOOO", "BAAAAAAR"]
|
265
|
-
<<< ["fooooooooo", "baaaaaar"]
|
266
|
-
>>> ["FOOOOOOOOO", "BAAAAAAR"]
|
267
|
-
$
|
268
|
-
```
|
269
|
-
|
270
|
-
## TODO
|
271
|
-
|
272
|
-
* [x] pack generated code into its own gem ([czmq-ffi-gen](https://github.com/paddor/czmq-ffi-gen))
|
273
|
-
* think of a neat Ruby API, including:
|
274
|
-
- [x] Actor
|
275
|
-
- [x] Beacon
|
276
|
-
- [x] Certificate
|
277
|
-
- [x] Socket
|
278
|
-
- [50%] access to all socket options
|
279
|
-
- [x] Security mechanisms
|
280
|
-
- [x] Message
|
281
|
-
- [x] Frame
|
282
|
-
- [x] enumerable Frames
|
283
|
-
- [x] Authenticator
|
284
|
-
- [x] Loop
|
285
|
-
- [x] Monitor
|
286
|
-
- [x] Poller
|
287
|
-
- [x] Proxy
|
288
|
-
- [x] Config
|
289
|
-
- [x] Z85
|
290
|
-
* write the missing XML API files in CZMQ
|
291
|
-
- [x] zarmour.xml
|
292
|
-
- [x] zconfig.xml
|
293
|
-
- [x] zsock_option.xml
|
294
|
-
- [x] zcert.xml
|
295
|
-
- [x] zcertstore.xml
|
296
|
-
* [x] check availability of libsodium within CZTop
|
297
|
-
* [x] read error strings for exceptions where appropriate (zmq_strerror)
|
298
|
-
* [x] add support for ZMTP 3.1 heartbeats in CZMQ
|
299
|
-
* [x] add padded variant of Z85
|
300
|
-
* add more examples
|
301
|
-
* [x] [simple REQ/REP](https://github.com/paddor/cztop/tree/master/examples/simple_req_rep)
|
302
|
-
* [x] [Taxy System](https://github.com/paddor/cztop/tree/master/examples/taxi_system) with CURVE security and heartbeating
|
303
|
-
* [x] change from ROUTER/DEALER to SERVER/CLIENT
|
304
|
-
* [x] [Actor](https://github.com/paddor/cztop/tree/master/examples/ruby_actor) with Ruby block
|
305
|
-
* [ ] PUSH/PULL
|
306
|
-
* [ ] PUB/SUB
|
307
|
-
* [ ] add performance benchmarks
|
308
|
-
* [x] inproc latency
|
309
|
-
* [x] inproc throughput
|
310
|
-
* [x] local/remote latency
|
311
|
-
* [ ] local/remote throughput
|
312
|
-
* see [perf](https://github.com/paddor/cztop/blob/master/perf) directory
|
313
|
-
* [x] support older versions of ZMQ
|
314
|
-
* [x] ZMQ HEAD
|
315
|
-
* [x] tested on CI
|
316
|
-
* [x] ZMQ 4.1
|
317
|
-
* [x] tested on CI
|
318
|
-
* as of April 2016, this isn't the case anymore
|
319
|
-
* [x] ZMQ 4.0
|
320
|
-
* [x] tested on CI
|
321
|
-
* as of March 2016, this isn't the case anymore
|
322
|
-
* [ ] ZMQ 3.2
|
323
|
-
* too big a pain ([d5172ab](https://github.com/paddor/czmq-ffi-gen/commit/d5172ab6db64999c50ba24f71569acf1dd45af51))
|
324
|
-
* [x] support multiple versions of CZMQ
|
325
|
-
* [x] CZMQ HEAD
|
326
|
-
* [x] test on CI
|
327
|
-
* [x] CZMQ 3.0.2 (current stable)
|
328
|
-
* no `zcert_meta_unset()` ([zeromq/czmq#1246](https://github.com/zeromq/czmq/issues/1246))
|
329
|
-
* [x] adapt czmq-ffi-gen so it doesn't raise while `attach_function`
|
330
|
-
* no `zproc`(especially no `zproc_has_curve()`)
|
331
|
-
* [x] adapt czmq-ffi-gen so it doesn't raise while `attach_function`, attach `zsys_has_curve()` instead (under same name)
|
332
|
-
* [x] adapt test suite to skip affected test examples
|
333
|
-
* [x] test on CI
|
334
|
-
* as of March, 2016, this isn't the case anymore
|
335
|
-
* [x] port [Poller](http://www.rubydoc.info/gems/cztop/CZTop/Poller) to `zmq_poll()`
|
336
|
-
* backwards compatible (`#add_reader`, `#add_writer`, `#wait` behave the same)
|
337
|
-
* but in addition, it has `#readables` and `#writables` which return arrays of sockets
|
338
|
-
* could then be used in Celluloid::ZMQ
|
339
|
-
* [ ] add `Message#to_s`
|
340
|
-
* return frame as string, if there's only one frame
|
341
|
-
* raise if there are multiple frames
|
342
|
-
* only safe to use on messages from SERVER/CLIENT sockets
|
343
|
-
* single-part messages are the future
|
344
|
-
* not sure yet
|
345
|
-
* [x] get rid of Loop
|
346
|
-
* cannot handle CLIENT/SERVER sockets
|
347
|
-
* there good timer gems for Ruby
|
348
|
-
* Poller can be used to embed in an existing event loop (Celluloid), or make your own trivial one
|
349
|
-
* [x] provide `z85encode` and `z85decode` utilities
|
350
|
-
* can be used in a pipeline (limited memory usage)
|
351
|
-
* reusable interface: `Z85::Pipe`
|
352
|
-
|
353
|
-
## Reasons
|
354
|
-
|
355
|
-
Why another CZMQ Ruby binding? Here is a list of existing projects I found and
|
356
|
-
the issues with them, from my point of view:
|
357
|
-
|
358
|
-
* [Asmod4n/ruby-ffi-czmq](https://github.com/Asmod4n/ruby-ffi-czmq)
|
359
|
-
* outdated
|
360
|
-
* according to its author, it's an "abomination"
|
361
|
-
* [methodmissing/rbczmq](https://github.com/methodmissing/rbczmq)
|
362
|
-
* no support for security features (see [methodmissing/rbczmq#28](https://github.com/methodmissing/rbczmq/issues/28))
|
363
|
-
* no JRuby support (see [methodmissing/rbczmq#48](https://github.com/methodmissing/rbczmq/issues/48))
|
364
|
-
* doesn't feel like Ruby
|
365
|
-
* [mtortonesi/ruby-czmq](https://github.com/mtortonesi/ruby-czmq)
|
366
|
-
* no tests
|
367
|
-
* no documentation
|
368
|
-
* outdated
|
369
|
-
* doesn't feel like Ruby
|
370
|
-
* [chuckremes/ffi-rzmq](https://github.com/chuckremes/ffi-rzmq)
|
371
|
-
* support discontinued
|
372
|
-
* low level ZMQ gem, not CZMQ
|
373
|
-
|
374
|
-
Furthermore, I knew about the generated low-level Ruby FFI binding in the
|
375
|
-
[zeromq/czmq](https://github.com/zeromq/czmq) repository. I wanted to make use
|
376
|
-
of it because I love that it's generated (and thus, most likely correct
|
377
|
-
and up-to-date). Unfortunately, it was in pretty bad shape and missing a few
|
378
|
-
CZMQ classes.
|
379
|
-
|
380
|
-
So I decided to improve the quality and usability of the binding and add the
|
381
|
-
missing classes. The result is
|
382
|
-
[czmq-ffi-gen](https://github.com/paddor/czmq-ffi-gen) which provides a solid
|
383
|
-
foundation for CZTop.
|
134
|
+
See the [examples](https://github.com/paddor/cztop/blob/master/examples) directory for some examples.
|
384
135
|
|
385
136
|
|
386
137
|
## Contributing
|
data/cztop.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
require 'cztop/version'
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/cztop/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
6
|
spec.name = "cztop"
|
@@ -9,28 +8,27 @@ Gem::Specification.new do |spec|
|
|
9
8
|
spec.authors = ["Patrik Wenger"]
|
10
9
|
spec.email = ["paddor@gmail.com"]
|
11
10
|
|
12
|
-
spec.summary = %q{CZMQ Ruby binding
|
13
|
-
spec.homepage = "https://
|
11
|
+
spec.summary = %q{CZMQ Ruby binding based on the generated low-level FFI bindings of CZMQ}
|
12
|
+
spec.homepage = "https://rubygems.org/gems/cztop"
|
14
13
|
spec.license = "ISC"
|
14
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
|
15
|
+
|
16
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
+
spec.metadata["source_code_uri"] = "https://github.com/paddor/cztop"
|
18
|
+
spec.metadata["changelog_uri"] = "https://github.com/paddor/cztop/blob/master/CHANGELOG.md"
|
15
19
|
|
16
20
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
21
|
spec.bindir = "exe"
|
18
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
23
|
spec.require_paths = ["lib"]
|
20
24
|
|
21
|
-
spec.add_runtime_dependency "czmq-ffi-gen", "~>
|
25
|
+
spec.add_runtime_dependency "czmq-ffi-gen", "~> 1.0"
|
22
26
|
|
23
|
-
spec.add_development_dependency "bundler"
|
24
|
-
spec.add_development_dependency "rake"
|
27
|
+
spec.add_development_dependency "bundler"
|
28
|
+
spec.add_development_dependency "rake"
|
25
29
|
spec.add_development_dependency "rspec"
|
26
30
|
spec.add_development_dependency "minitest"
|
27
31
|
spec.add_development_dependency "rspec-given", "~> 3.8.0"
|
28
32
|
spec.add_development_dependency "pry"
|
29
33
|
spec.add_development_dependency "yard"
|
30
|
-
spec.add_development_dependency "guard"
|
31
|
-
spec.add_development_dependency "guard-rspec"
|
32
|
-
spec.add_development_dependency "guard-yard"
|
33
|
-
spec.add_development_dependency "guard-shell"
|
34
|
-
spec.add_development_dependency 'terminal-notifier-guard'
|
35
|
-
spec.add_development_dependency 'foreman'
|
36
34
|
end
|
data/lib/cztop/certificate.rb
CHANGED
data/lib/cztop/frame.rb
CHANGED
@@ -156,13 +156,13 @@ module CZTop
|
|
156
156
|
end
|
157
157
|
|
158
158
|
# Gets the group (radio/dish pattern).
|
159
|
-
# @note This only set when the frame has been read from
|
159
|
+
# @note This is only set when the frame has been read from
|
160
160
|
# a {CZTop::Socket::DISH} socket.
|
161
161
|
# @return [String] the group
|
162
162
|
# @return [nil] when no group has been set
|
163
163
|
def group
|
164
164
|
group = ffi_delegate.group
|
165
|
-
return nil if group.empty?
|
165
|
+
return nil if group.nil? || group.empty?
|
166
166
|
group
|
167
167
|
end
|
168
168
|
|
@@ -174,7 +174,7 @@ module CZTop
|
|
174
174
|
# @return [new_group]
|
175
175
|
def group=(new_group)
|
176
176
|
rc = ffi_delegate.set_group(new_group)
|
177
|
-
raise_zmq_err("unable to set group to %p" %
|
177
|
+
raise_zmq_err("unable to set group to %p" % new_group) if rc == -1
|
178
178
|
end
|
179
179
|
end
|
180
180
|
end
|
data/lib/cztop/message.rb
CHANGED
@@ -142,7 +142,16 @@ module CZTop
|
|
142
142
|
# strings. This can be a problem if the message is huge/has huge frames.
|
143
143
|
# @return [Array<String>] all frames
|
144
144
|
def to_a
|
145
|
-
|
145
|
+
ffi_delegate = ffi_delegate()
|
146
|
+
frame = ffi_delegate.first
|
147
|
+
return [] if frame.null?
|
148
|
+
|
149
|
+
arr = [ frame.data.read_bytes(frame.size) ]
|
150
|
+
while frame = ffi_delegate.next and not frame.null?
|
151
|
+
arr << frame.data.read_bytes(frame.size)
|
152
|
+
end
|
153
|
+
|
154
|
+
return arr
|
146
155
|
end
|
147
156
|
|
148
157
|
# Inspects this {Message}.
|
data/lib/cztop/monitor.rb
CHANGED
@@ -39,6 +39,7 @@ module CZTop
|
|
39
39
|
|
40
40
|
# @return [Array<String>] types of valid events
|
41
41
|
EVENTS = %w[
|
42
|
+
ALL
|
42
43
|
CONNECTED
|
43
44
|
CONNECT_DELAYED
|
44
45
|
CONNECT_RETRIED
|
@@ -50,9 +51,10 @@ module CZTop
|
|
50
51
|
CLOSE_FAILED
|
51
52
|
DISCONNECTED
|
52
53
|
MONITOR_STOPPED
|
53
|
-
|
54
|
-
|
55
|
-
|
54
|
+
HANDSHAKE_SUCCEEDED
|
55
|
+
HANDSHAKE_FAILED_NO_DETAIL
|
56
|
+
HANDSHAKE_FAILED_PROTOCOL
|
57
|
+
HANDSHAKE_FAILED_AUTH
|
56
58
|
]
|
57
59
|
|
58
60
|
# Configure monitor to listen for specific events.
|
@@ -73,6 +75,18 @@ module CZTop
|
|
73
75
|
@actor.wait
|
74
76
|
end
|
75
77
|
|
78
|
+
# Useful for registration in an event-loop.
|
79
|
+
# @return [Integer] the FD
|
80
|
+
# @see ZsockOptions#fd
|
81
|
+
def fd
|
82
|
+
@actor.fd
|
83
|
+
end
|
84
|
+
|
85
|
+
# @return [Boolean] whether there's at least one event available
|
86
|
+
def readable?
|
87
|
+
@actor.readable?
|
88
|
+
end
|
89
|
+
|
76
90
|
# Get next event. This blocks until the next event is available.
|
77
91
|
# @example
|
78
92
|
# socket = CZTop::Socket::ROUTER.new("tcp://127.0.0.1:5050")
|
@@ -93,8 +107,8 @@ module CZTop
|
|
93
107
|
# end
|
94
108
|
# end
|
95
109
|
#
|
96
|
-
# @return [
|
97
|
-
# <tt>["ACCEPTED", "73", "tcp://127.0.0.1:55585"]</tt>
|
110
|
+
# @return [Message] one of the events from (after {#to_a} it's something like
|
111
|
+
# <tt>["ACCEPTED", "73", "tcp://127.0.0.1:55585"]</tt>)
|
98
112
|
def next
|
99
113
|
@actor.receive
|
100
114
|
end
|
data/lib/cztop/poller/zmq.rb
CHANGED
@@ -9,8 +9,9 @@ module CZTop
|
|
9
9
|
|
10
10
|
extend ::FFI::Library
|
11
11
|
lib_name = 'libzmq'
|
12
|
-
|
13
|
-
|
12
|
+
lib_dirs = ['/usr/local/lib', '/opt/local/lib', '/usr/lib64']
|
13
|
+
lib_dirs = [*ENV['LIBZMQ_PATH'].split(':'), *lib_dirs] if ENV['LIBZMQ_PATH']
|
14
|
+
lib_paths = lib_dirs.map { |path| "#{path}/#{lib_name}.#{::FFI::Platform::LIBSUFFIX}" }
|
14
15
|
ffi_lib lib_paths + [lib_name]
|
15
16
|
|
16
17
|
# This represents a +zmq_poller_event_t+ as in:
|
data/lib/cztop/version.rb
CHANGED
data/lib/cztop/zsock_options.rb
CHANGED
@@ -29,6 +29,13 @@ module CZTop
|
|
29
29
|
(options.events & Poller::ZMQ::POLLOUT) > 0
|
30
30
|
end
|
31
31
|
|
32
|
+
# Useful for registration in an event-loop.
|
33
|
+
# @return [Integer]
|
34
|
+
# @see OptionsAccessor#fd
|
35
|
+
def fd
|
36
|
+
options.fd
|
37
|
+
end
|
38
|
+
|
32
39
|
# Used to access the options of a {Socket} or {Actor}.
|
33
40
|
class OptionsAccessor
|
34
41
|
# @return [Socket, Actor] whose options this {OptionsAccessor} instance
|
@@ -312,6 +319,20 @@ module CZTop
|
|
312
319
|
# @see CZTop::Poller::ZMQ::POLLIN and CZTop::Poller::ZMQ::POLLOUT
|
313
320
|
def events() Zsock.events(@zocket) end
|
314
321
|
|
322
|
+
# @return [Integer] current value of RECONNECT_IVL
|
323
|
+
def reconnect_ivl() Zsock.reconnect_ivl(@zocket) end
|
324
|
+
# This defines the number of milliseconds to wait while
|
325
|
+
# closing/disconnecting a socket if there are outstanding messages to
|
326
|
+
# send.
|
327
|
+
#
|
328
|
+
# Default is 0, which means to not wait at all. -1 means to wait
|
329
|
+
# indefinitely
|
330
|
+
#
|
331
|
+
# @param new_value [Integer] new value for RECONNECT_IVL
|
332
|
+
def reconnect_ivl=(new_value)
|
333
|
+
Zsock.set_reconnect_ivl(@zocket, new_value)
|
334
|
+
end
|
335
|
+
|
315
336
|
# TODO: a reasonable subset of these
|
316
337
|
#// Get socket options
|
317
338
|
#int zsock_gssapi_server (void *self);
|
@@ -325,7 +346,6 @@ module CZTop
|
|
325
346
|
#int zsock_recovery_ivl (void *self);
|
326
347
|
#int zsock_sndbuf (void *self);
|
327
348
|
#int zsock_rcvbuf (void *self);
|
328
|
-
#int zsock_reconnect_ivl (void *self);
|
329
349
|
#int zsock_reconnect_ivl_max (void *self);
|
330
350
|
#int zsock_backlog (void *self);
|
331
351
|
#int zsock_maxmsgsize (void *self);
|
@@ -366,7 +386,6 @@ module CZTop
|
|
366
386
|
#void zsock_set_recovery_ivl (void *self, int recovery_ivl);
|
367
387
|
#void zsock_set_sndbuf (void *self, int sndbuf);
|
368
388
|
#void zsock_set_rcvbuf (void *self, int rcvbuf);
|
369
|
-
#void zsock_set_reconnect_ivl (void *self, int reconnect_ivl);
|
370
389
|
#void zsock_set_reconnect_ivl_max (void *self, int reconnect_ivl_max);
|
371
390
|
#void zsock_set_backlog (void *self, int backlog);
|
372
391
|
#void zsock_set_maxmsgsize (void *self, int maxmsgsize);
|
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: 0.
|
4
|
+
version: 1.0.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:
|
11
|
+
date: 2021-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: czmq-ffi-gen
|
@@ -16,42 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '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:
|
26
|
+
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,90 +122,6 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: guard
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: guard-rspec
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: guard-yard
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: guard-shell
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - ">="
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '0'
|
174
|
-
type: :development
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - ">="
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: '0'
|
181
|
-
- !ruby/object:Gem::Dependency
|
182
|
-
name: terminal-notifier-guard
|
183
|
-
requirement: !ruby/object:Gem::Requirement
|
184
|
-
requirements:
|
185
|
-
- - ">="
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
version: '0'
|
188
|
-
type: :development
|
189
|
-
prerelease: false
|
190
|
-
version_requirements: !ruby/object:Gem::Requirement
|
191
|
-
requirements:
|
192
|
-
- - ">="
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
version: '0'
|
195
|
-
- !ruby/object:Gem::Dependency
|
196
|
-
name: foreman
|
197
|
-
requirement: !ruby/object:Gem::Requirement
|
198
|
-
requirements:
|
199
|
-
- - ">="
|
200
|
-
- !ruby/object:Gem::Version
|
201
|
-
version: '0'
|
202
|
-
type: :development
|
203
|
-
prerelease: false
|
204
|
-
version_requirements: !ruby/object:Gem::Requirement
|
205
|
-
requirements:
|
206
|
-
- - ">="
|
207
|
-
- !ruby/object:Gem::Version
|
208
|
-
version: '0'
|
209
125
|
description:
|
210
126
|
email:
|
211
127
|
- paddor@gmail.com
|
@@ -215,21 +131,19 @@ executables:
|
|
215
131
|
extensions: []
|
216
132
|
extra_rdoc_files: []
|
217
133
|
files:
|
134
|
+
- ".github/workflows/main.yml"
|
218
135
|
- ".gitignore"
|
219
136
|
- ".rspec"
|
220
|
-
- ".
|
137
|
+
- ".ruby-version"
|
221
138
|
- ".yardopts"
|
222
139
|
- AUTHORS
|
223
140
|
- CHANGES.md
|
224
141
|
- Gemfile
|
225
|
-
- Guardfile
|
226
142
|
- LICENSE
|
227
|
-
- Procfile
|
228
143
|
- README.md
|
229
144
|
- Rakefile
|
230
145
|
- bin/console
|
231
146
|
- bin/setup
|
232
|
-
- ci-scripts/install-deps
|
233
147
|
- cztop.gemspec
|
234
148
|
- examples/ruby_actor/actor.rb
|
235
149
|
- examples/simple_req_rep/rep.rb
|
@@ -283,10 +197,13 @@ files:
|
|
283
197
|
- perf/inproc_thru.rb
|
284
198
|
- perf/local_lat.rb
|
285
199
|
- perf/remote_lat.rb
|
286
|
-
homepage: https://
|
200
|
+
homepage: https://rubygems.org/gems/cztop
|
287
201
|
licenses:
|
288
202
|
- ISC
|
289
|
-
metadata:
|
203
|
+
metadata:
|
204
|
+
homepage_uri: https://rubygems.org/gems/cztop
|
205
|
+
source_code_uri: https://github.com/paddor/cztop
|
206
|
+
changelog_uri: https://github.com/paddor/cztop/blob/master/CHANGELOG.md
|
290
207
|
post_install_message:
|
291
208
|
rdoc_options: []
|
292
209
|
require_paths:
|
@@ -295,16 +212,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
295
212
|
requirements:
|
296
213
|
- - ">="
|
297
214
|
- !ruby/object:Gem::Version
|
298
|
-
version:
|
215
|
+
version: 2.5.0
|
299
216
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
300
217
|
requirements:
|
301
218
|
- - ">="
|
302
219
|
- !ruby/object:Gem::Version
|
303
220
|
version: '0'
|
304
221
|
requirements: []
|
305
|
-
|
306
|
-
rubygems_version: 2.6.8
|
222
|
+
rubygems_version: 3.2.4
|
307
223
|
signing_key:
|
308
224
|
specification_version: 4
|
309
|
-
summary: CZMQ Ruby binding
|
225
|
+
summary: CZMQ Ruby binding based on the generated low-level FFI bindings of CZMQ
|
310
226
|
test_files: []
|
data/.travis.yml
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
dist: trusty
|
3
|
-
sudo: false
|
4
|
-
cache:
|
5
|
-
directories:
|
6
|
-
- $HOME/.ccache
|
7
|
-
- $HOME/.bundle
|
8
|
-
rvm:
|
9
|
-
- 2.4.2
|
10
|
-
- 2.3.5
|
11
|
-
- 2.2.8
|
12
|
-
- jruby-head
|
13
|
-
- rubinius-3.86
|
14
|
-
env:
|
15
|
-
# NOTE: These are recognized by czmq-ffi-gen's CI scripts.
|
16
|
-
- CZMQ_VERSION=HEAD ZMQ_VERSION=HEAD
|
17
|
-
- CZMQ_VERSION=stable ZMQ_VERSION=stable
|
18
|
-
matrix:
|
19
|
-
exclude:
|
20
|
-
- rvm: 2.3.5
|
21
|
-
env: CZMQ_VERSION=HEAD ZMQ_VERSION=HEAD
|
22
|
-
- rvm: 2.2.8
|
23
|
-
env: CZMQ_VERSION=HEAD ZMQ_VERSION=HEAD
|
24
|
-
- rvm: jruby-head
|
25
|
-
env: CZMQ_VERSION=HEAD ZMQ_VERSION=HEAD
|
26
|
-
- rvm: rubinius-3.86
|
27
|
-
env: CZMQ_VERSION=HEAD ZMQ_VERSION=HEAD
|
28
|
-
allow_failures:
|
29
|
-
- rvm: rubinius-3.86
|
30
|
-
before_install:
|
31
|
-
- PATH="/usr/lib/ccache:$PATH" # enable ccache
|
32
|
-
- export LD_LIBRARY_PATH=$HOME/lib # custom libs (for execution)
|
33
|
-
- export PKG_CONFIG_PATH=$HOME/lib/pkgconfig # custom libs (for linking)
|
34
|
-
- export BUNDLE_PATH=$HOME/.bundle # bundle caching
|
35
|
-
- ci-scripts/install-deps
|
36
|
-
- gem install bundler -v 1.10.6
|
37
|
-
script: bundle exec rake spec
|
data/Guardfile
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require "guard/rspec/dsl"
|
2
|
-
|
3
|
-
# Start using
|
4
|
-
#
|
5
|
-
# bundle exec guard -g doc & bundle exec guard -g spec
|
6
|
-
#
|
7
|
-
# This way you get parallel execution, so
|
8
|
-
# * documentation is regenerated immediately
|
9
|
-
# * specs are run immediately
|
10
|
-
|
11
|
-
README_FILE = %r{^README\.md}
|
12
|
-
|
13
|
-
# set these later using help from guard-rspec
|
14
|
-
ruby_lib_files = nil
|
15
|
-
spec_files = nil
|
16
|
-
|
17
|
-
# I don't need no shell that hogs my CPU whenever I hit return.
|
18
|
-
interactor :off
|
19
|
-
|
20
|
-
group :spec do
|
21
|
-
guard :rspec, cmd: "bundle exec rspec" do
|
22
|
-
dsl = Guard::RSpec::Dsl.new(self)
|
23
|
-
|
24
|
-
# RSpec files
|
25
|
-
rspec = dsl.rspec
|
26
|
-
watch(rspec.spec_helper) { rspec.spec_dir }
|
27
|
-
watch(rspec.spec_support) { rspec.spec_dir }
|
28
|
-
watch(rspec.spec_files)
|
29
|
-
spec_files = rspec.spec_files
|
30
|
-
|
31
|
-
# Ruby files
|
32
|
-
ruby = dsl.ruby
|
33
|
-
watch(ruby.lib_files) { |m| rspec.spec.(m[1]) }
|
34
|
-
ruby_lib_files = ruby.lib_files
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
puts "README pattern: %p" % README_FILE
|
39
|
-
puts "ruby lib files pattern: %p" % ruby_lib_files
|
40
|
-
puts "spec files pattern: %p" % spec_files
|
41
|
-
end
|
42
|
-
|
43
|
-
group :syntax_check do
|
44
|
-
guard :shell do
|
45
|
-
# check Ruby syntax
|
46
|
-
watch(Regexp.union(ruby_lib_files, spec_files)) do |m|
|
47
|
-
puts "Checking Ruby syntax of %p ..." % m[0]
|
48
|
-
if not system("ruby -c #{m[0]}")
|
49
|
-
n "#{m[0]} is incorrect", 'Ruby Syntax', :failed
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
YARD_OPTS = "--use-cache .yardoc/cache.db"
|
56
|
-
|
57
|
-
group :doc do
|
58
|
-
guard 'yard' do
|
59
|
-
watch(Regexp.union(README_FILE, ruby_lib_files))
|
60
|
-
end
|
61
|
-
end
|
data/Procfile
DELETED