0mq 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +104 -1
- data/lib/0mq.rb +5 -0
- data/lib/0mq/context.rb +16 -6
- data/lib/0mq/curve.rb +26 -0
- data/lib/0mq/error_map.rb +10 -4
- data/lib/0mq/poll.rb +8 -4
- data/lib/0mq/proxy.rb +15 -3
- data/lib/0mq/socket.rb +29 -18
- data/lib/0mq/version.rb +102 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 620201ac4bf75176a5ab224bd0bf0f0c3598e028
|
4
|
+
data.tar.gz: c360991d9cf9aa84873672945bd84252cb191263
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32f96897d84651bcc51e2e9037401ceb4839963a2523b534cbd9a46ffa6c4bad2f58a7c35e641505bc8a8b924a6153f5342bdd57c73a3cd9dc99f2e94f2572a2
|
7
|
+
data.tar.gz: 448432e63a64c0fe205e277c0040cb41fa13e90772b57c9f0b03c7eae8e100f16ae0afe011dd301df7c7f3d34e126e3647b03d2efda86a215ac7fdba736ec034
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# 0mq
|
2
|
+
_Works like ZeroMQ. Feels like Ruby._
|
2
3
|
|
3
4
|
[![Build Status](https://travis-ci.org/jemc/0mq.png)](https://travis-ci.org/jemc/0mq)
|
4
5
|
[![Gem Version](https://badge.fury.io/rb/0mq.png)](http://badge.fury.io/rb/0mq)
|
@@ -21,10 +22,112 @@ Supported Ruby versions:
|
|
21
22
|
|
22
23
|
## Feature Requests / Bug Reports
|
23
24
|
|
24
|
-
File them as issues or pull requests on
|
25
|
+
File them as issues or pull requests on the [0mq github repository](https://github.com/jemc/0mq).
|
25
26
|
|
26
27
|
## Authors
|
27
28
|
|
28
29
|
- Joe McIlvain
|
29
30
|
|
30
31
|
- Alex McLain
|
32
|
+
|
33
|
+
## Installation / Prerequisites
|
34
|
+
|
35
|
+
- Requires the [libzmq library](http://zeromq.org/intro:get-the-software).
|
36
|
+
|
37
|
+
- PGM (multicast) requires compiling libzmq with ./configure --with-pgm
|
38
|
+
|
39
|
+
- Curve cryptography requires compiling libzmq with [libsodium](https://github.com/jedisct1/libsodium).
|
40
|
+
|
41
|
+
## ZeroMQ Documentation
|
42
|
+
|
43
|
+
- Manual: http://zeromq.org/intro:read-the-manual
|
44
|
+
|
45
|
+
- API: http://api.zeromq.org/
|
46
|
+
|
47
|
+
## Code Examples
|
48
|
+
|
49
|
+
### Using The 0mq Gem
|
50
|
+
|
51
|
+
``` ruby
|
52
|
+
require '0mq'
|
53
|
+
```
|
54
|
+
|
55
|
+
### Create A Socket
|
56
|
+
|
57
|
+
Sockets can be created by specifying the [ZMQ socket type](http://api.zeromq.org/4-0:zmq-socket). Any errors will be raised as exceptions.
|
58
|
+
|
59
|
+
``` ruby
|
60
|
+
socket = ZMQ::Socket.new ZMQ::PULL
|
61
|
+
socket.connect 'tcp://127.0.0.1:10000'
|
62
|
+
```
|
63
|
+
|
64
|
+
### Send And Receive Data
|
65
|
+
|
66
|
+
``` ruby
|
67
|
+
address = 'tcp://127.0.0.1:10000'
|
68
|
+
|
69
|
+
push = ZMQ::Socket.new ZMQ::PUSH
|
70
|
+
push.bind address
|
71
|
+
|
72
|
+
pull = ZMQ::Socket.new ZMQ::PULL
|
73
|
+
pull.connect address
|
74
|
+
|
75
|
+
push.send_string 'test'
|
76
|
+
|
77
|
+
string = pull.recv_string
|
78
|
+
|
79
|
+
puts string
|
80
|
+
```
|
81
|
+
|
82
|
+
### Poll A Socket For Data
|
83
|
+
|
84
|
+
``` ruby
|
85
|
+
address = 'inproc://poll_example'
|
86
|
+
|
87
|
+
pull = ZMQ::Socket.new ZMQ::PULL
|
88
|
+
pull.bind address
|
89
|
+
|
90
|
+
# Push a message after a delay.
|
91
|
+
Thread.new do
|
92
|
+
push = ZMQ::Socket.new ZMQ::PUSH
|
93
|
+
push.connect address
|
94
|
+
sleep 3
|
95
|
+
|
96
|
+
push.send_string 'test'
|
97
|
+
end
|
98
|
+
|
99
|
+
# Check if pull has any data (it doesn't yet).
|
100
|
+
# (Non-blocking demonstration.)
|
101
|
+
result = ZMQ::Poll.poll_nonblock pull
|
102
|
+
puts "No data available yet." if result.empty?
|
103
|
+
|
104
|
+
# Do a blocking poll until the pull socket has data.
|
105
|
+
ZMQ::Poll.poll pull do |socket, event|
|
106
|
+
puts socket.recv_string
|
107
|
+
end
|
108
|
+
```
|
109
|
+
|
110
|
+
### Proxy Sockets
|
111
|
+
|
112
|
+
A proxy can be used to funnel multiple endpoints into a single connection.
|
113
|
+
See: [Pub-Sub Network with a Proxy](http://zguide.zeromq.org/page:all#The-Dynamic-Discovery-Problem)
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
# ---------------- ---------------- ---------------- ----------------
|
117
|
+
# | Endpoint REQ | --> | Proxy ROUTER | --> | Proxy DEALER | --> | Endpoint REP |
|
118
|
+
# ---------------- ---------------- ---------------- ----------------
|
119
|
+
|
120
|
+
# Create sockets.
|
121
|
+
endpoint_req = ZMQ::Socket.new(ZMQ::REQ).tap { |s| s.bind 'inproc://proxy_in' }
|
122
|
+
proxy_router = ZMQ::Socket.new(ZMQ::ROUTER).tap { |s| s.connect 'inproc://proxy_in' }
|
123
|
+
proxy_dealer = ZMQ::Socket.new(ZMQ::DEALER).tap { |s| s.bind 'inproc://proxy_out' }
|
124
|
+
endpoint_rep = ZMQ::Socket.new(ZMQ::REP).tap { |s| s.connect 'inproc://proxy_out' }
|
125
|
+
|
126
|
+
# Create the proxy.
|
127
|
+
Thread.new { ZMQ::Proxy.proxy proxy_router, proxy_dealer }
|
128
|
+
|
129
|
+
# Send a message.
|
130
|
+
endpoint_req.send_string 'test'
|
131
|
+
|
132
|
+
puts endpoint_rep.recv_string
|
133
|
+
```
|
data/lib/0mq.rb
CHANGED
data/lib/0mq/context.rb
CHANGED
@@ -1,22 +1,26 @@
|
|
1
1
|
|
2
2
|
module ZMQ
|
3
3
|
|
4
|
+
# The context object encapsulates all the global state associated
|
5
|
+
# with the library.
|
4
6
|
class Context
|
5
|
-
|
7
|
+
|
8
|
+
# The FFI pointer to the context.
|
9
|
+
attr_reader :pointer
|
6
10
|
|
7
11
|
def initialize
|
8
|
-
@
|
12
|
+
@pointer = LibZMQ.zmq_ctx_new
|
9
13
|
end
|
10
14
|
|
11
15
|
# Destroy the ØMQ context.
|
12
16
|
def terminate
|
13
|
-
if @
|
17
|
+
if @pointer
|
14
18
|
rc = LibZMQ.version4? ?
|
15
|
-
LibZMQ.zmq_ctx_term(@
|
16
|
-
LibZMQ.zmq_term(@
|
19
|
+
LibZMQ.zmq_ctx_term(@pointer) :
|
20
|
+
LibZMQ.zmq_term(@pointer)
|
17
21
|
ZMQ.error_check true if rc == -1
|
18
22
|
|
19
|
-
@
|
23
|
+
@pointer = nil
|
20
24
|
end
|
21
25
|
end
|
22
26
|
|
@@ -26,8 +30,14 @@ module ZMQ
|
|
26
30
|
ZMQ::Socket.new type, opts
|
27
31
|
end
|
28
32
|
|
33
|
+
# Returns the context's FFI pointer.
|
34
|
+
def to_ptr
|
35
|
+
@pointer
|
36
|
+
end
|
37
|
+
|
29
38
|
end
|
30
39
|
|
40
|
+
# The default context to be used if another context is not provided.
|
31
41
|
DefaultContext = Context.new
|
32
42
|
|
33
43
|
end
|
data/lib/0mq/curve.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
module ZMQ
|
3
|
+
|
4
|
+
# Secure authentication and confidentiality.
|
5
|
+
class Curve
|
6
|
+
|
7
|
+
# Generate a keypair.
|
8
|
+
# Returns a hash with the :public and :private keys.
|
9
|
+
def self.keypair
|
10
|
+
public_key = FFI::MemoryPointer.new :char, 41, true
|
11
|
+
private_key = FFI::MemoryPointer.new :char, 41, true
|
12
|
+
|
13
|
+
rc = LibZMQ::zmq_curve_keypair public_key, private_key
|
14
|
+
|
15
|
+
begin
|
16
|
+
ZMQ.error_check true if rc==-1
|
17
|
+
rescue Errno::EOPNOTSUPP
|
18
|
+
raise Errno::EOPNOTSUPP, "Curve requires libzmq to be compiled with libsodium."
|
19
|
+
end
|
20
|
+
|
21
|
+
{ public: public_key.read_string, private: private_key.read_string }
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/lib/0mq/error_map.rb
CHANGED
@@ -1,18 +1,24 @@
|
|
1
1
|
|
2
2
|
module ZMQ
|
3
3
|
|
4
|
+
# A hash of error number => exception class.
|
5
|
+
# Example: 1 => Errno::EPERM
|
4
6
|
ErrorMap = Hash.new
|
5
7
|
|
6
8
|
Errno.constants
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
.map { |x| Errno.const_get x }
|
10
|
+
.select { |x| x.is_a?(Class) && x < SystemCallError }
|
11
|
+
.each { |x| ErrorMap[x.const_get(:Errno)] = x }
|
10
12
|
|
13
|
+
|
14
|
+
# Checks the libzmq global error number and raises it as an exception.
|
15
|
+
# Should be used after calling a libzmq resource that returns -1 on error.
|
16
|
+
# Example: ZMQ.error_check if rc == -1
|
11
17
|
def self.error_check(adjust_backtrace=false)
|
12
18
|
errno = LibZMQ.zmq_errno
|
13
19
|
return true if errno == 25
|
14
20
|
|
15
|
-
#
|
21
|
+
# TODO: Use adjust_backtrace
|
16
22
|
str = ''
|
17
23
|
raise ErrorMap[errno], str, caller[0...-2]
|
18
24
|
end
|
data/lib/0mq/poll.rb
CHANGED
@@ -15,7 +15,8 @@ module ZMQ
|
|
15
15
|
# See #initialize for parameters.
|
16
16
|
# See #run for block and return value.
|
17
17
|
def self.poll(*sockets, &block)
|
18
|
-
new
|
18
|
+
poller = new *sockets
|
19
|
+
poller.run &block
|
19
20
|
end
|
20
21
|
|
21
22
|
# Non-blocking version of poll.
|
@@ -58,7 +59,7 @@ module ZMQ
|
|
58
59
|
# This is an easy way to reconnect PollItem to ZMQ::Socket without
|
59
60
|
# having to store multiple dimensions in the socks hash.
|
60
61
|
@socket_lookup = {}
|
61
|
-
@socks.each { |socket, event| @socket_lookup[socket.
|
62
|
+
@socks.each { |socket, event| @socket_lookup[socket.to_ptr.address] = socket }
|
62
63
|
|
63
64
|
# Allocate space for C PollItem (zmq_pollitem_t) structs.
|
64
65
|
@poll_structs = FFI::MemoryPointer.new LibZMQ::PollItem, @socks.count, true
|
@@ -90,7 +91,7 @@ module ZMQ
|
|
90
91
|
|
91
92
|
# Poll
|
92
93
|
rc = LibZMQ::zmq_poll @poll_structs, @poll_items.count, timeout
|
93
|
-
ZMQ.error_check true if rc
|
94
|
+
ZMQ.error_check true if rc == -1
|
94
95
|
|
95
96
|
# Create a hash of the items with triggered events.
|
96
97
|
# (ZMQ::Socket => revents)
|
@@ -115,7 +116,10 @@ module ZMQ
|
|
115
116
|
end
|
116
117
|
|
117
118
|
|
119
|
+
# :nodoc:
|
118
120
|
module LibZMQ
|
121
|
+
|
122
|
+
# :nodoc:
|
119
123
|
class PollItem
|
120
124
|
|
121
125
|
# Get the event flags:
|
@@ -142,7 +146,7 @@ module LibZMQ
|
|
142
146
|
# Set the socket to poll for events on.
|
143
147
|
# Accepts a ZMQ::Socket or a pointer.
|
144
148
|
def socket=(sock)
|
145
|
-
self[:socket] = sock.is_a?(FFI::Pointer) ? sock : sock.
|
149
|
+
self[:socket] = sock.is_a?(FFI::Pointer) ? sock : sock.to_ptr
|
146
150
|
end
|
147
151
|
|
148
152
|
end
|
data/lib/0mq/proxy.rb
CHANGED
@@ -1,12 +1,24 @@
|
|
1
1
|
|
2
2
|
module ZMQ
|
3
3
|
|
4
|
+
# The proxy connects a frontend socket to a backend socket. Conceptually,
|
5
|
+
# data flows from frontend to backend. Depending on the socket types,
|
6
|
+
# replies may flow in the opposite direction. The direction is conceptual
|
7
|
+
# only; the proxy is fully symmetric and there is no technical difference
|
8
|
+
# between frontend and backend.
|
4
9
|
class Proxy
|
5
10
|
|
11
|
+
# Create a running proxy object.
|
12
|
+
def self.proxy(frontend, backend, capture = nil)
|
13
|
+
new(frontend, backend, capture).tap { |p| p.run }
|
14
|
+
end
|
15
|
+
|
16
|
+
# Accepts a frontend, backend, and optional capture socket.
|
17
|
+
# See http://api.zeromq.org/4-0:zmq-proxy
|
6
18
|
def initialize(frontend, backend, capture = nil)
|
7
|
-
@frontend = frontend.nil? ? nil : frontend.
|
8
|
-
@backend = backend.nil? ? nil : backend.
|
9
|
-
@capture = capture.nil? ? nil : capture.
|
19
|
+
@frontend = frontend.nil? ? nil : frontend.to_ptr
|
20
|
+
@backend = backend.nil? ? nil : backend.to_ptr
|
21
|
+
@capture = capture.nil? ? nil : capture.to_ptr
|
10
22
|
end
|
11
23
|
|
12
24
|
# Block the current thread with the event loop of the proxy
|
data/lib/0mq/socket.rb
CHANGED
@@ -3,16 +3,22 @@ require_relative 'socket/options'
|
|
3
3
|
|
4
4
|
module ZMQ
|
5
5
|
|
6
|
+
# See http://api.zeromq.org/4-0:zmq-socket
|
7
|
+
# Not thread safe.
|
6
8
|
class Socket
|
7
|
-
|
9
|
+
|
10
|
+
# The FFI pointer to the socket.
|
11
|
+
attr_reader :pointer
|
12
|
+
# The socket's ZMQ::Context.
|
8
13
|
attr_reader :context
|
14
|
+
# The socket's ZeroMQ socket type (e.g. ZMQ::ROUTER).
|
9
15
|
attr_reader :type
|
10
16
|
|
11
17
|
def initialize(type, opts={})
|
12
18
|
@context = opts.fetch :context, ZMQ::DefaultContext
|
13
19
|
@type = type
|
14
|
-
@
|
15
|
-
ZMQ.error_check true if @
|
20
|
+
@pointer = LibZMQ.zmq_socket @context.pointer, @type
|
21
|
+
ZMQ.error_check true if @pointer.null?
|
16
22
|
|
17
23
|
@msgptr = FFI::MemoryPointer.new LibZMQ::Message.size, 1, false
|
18
24
|
|
@@ -22,20 +28,20 @@ module ZMQ
|
|
22
28
|
|
23
29
|
# Close the socket
|
24
30
|
def close
|
25
|
-
if @
|
31
|
+
if @pointer
|
26
32
|
ObjectSpace.undefine_finalizer self
|
27
33
|
@temp_buffers.clear if @temp_buffers
|
28
34
|
|
29
|
-
rc = LibZMQ.zmq_close @
|
35
|
+
rc = LibZMQ.zmq_close @pointer
|
30
36
|
ZMQ.error_check true if rc==-1
|
31
37
|
|
32
|
-
@
|
38
|
+
@pointer = nil
|
33
39
|
end
|
34
40
|
end
|
35
41
|
|
36
|
-
# Create a safe finalizer for the socket
|
37
|
-
def self.finalizer(
|
38
|
-
Proc.new { LibZMQ.zmq_close
|
42
|
+
# Create a safe finalizer for the socket pointer to close on GC of the object
|
43
|
+
def self.finalizer(pointer, pid)
|
44
|
+
Proc.new { LibZMQ.zmq_close pointer if Process.pid == pid }
|
39
45
|
end
|
40
46
|
|
41
47
|
# Get the socket type name as a symbol
|
@@ -45,25 +51,25 @@ module ZMQ
|
|
45
51
|
|
46
52
|
# Bind to an endpoint
|
47
53
|
def bind(endpoint)
|
48
|
-
rc = LibZMQ.zmq_bind @
|
54
|
+
rc = LibZMQ.zmq_bind @pointer, endpoint
|
49
55
|
ZMQ.error_check true if rc==-1
|
50
56
|
end
|
51
57
|
|
52
58
|
# Connect to an endpoint
|
53
59
|
def connect(endpoint)
|
54
|
-
rc = LibZMQ.zmq_connect @
|
60
|
+
rc = LibZMQ.zmq_connect @pointer, endpoint
|
55
61
|
ZMQ.error_check true if rc==-1
|
56
62
|
end
|
57
63
|
|
58
64
|
# Unbind from an endpoint
|
59
65
|
def unbind(endpoint)
|
60
|
-
rc = LibZMQ.zmq_unbind @
|
66
|
+
rc = LibZMQ.zmq_unbind @pointer, endpoint
|
61
67
|
ZMQ.error_check true if rc==-1
|
62
68
|
end
|
63
69
|
|
64
|
-
# Disconnect
|
70
|
+
# Disconnect from an endpoint
|
65
71
|
def disconnect(endpoint)
|
66
|
-
rc = LibZMQ.zmq_disconnect @
|
72
|
+
rc = LibZMQ.zmq_disconnect @pointer, endpoint
|
67
73
|
ZMQ.error_check true if rc==-1
|
68
74
|
end
|
69
75
|
|
@@ -77,7 +83,7 @@ module ZMQ
|
|
77
83
|
rc = LibZMQ.zmq_msg_init_data @msgptr, @msgbuf, size, LibC::Free, nil
|
78
84
|
ZMQ.error_check true if rc==-1
|
79
85
|
|
80
|
-
rc = LibZMQ.zmq_sendmsg @
|
86
|
+
rc = LibZMQ.zmq_sendmsg @pointer, @msgptr, flags
|
81
87
|
ZMQ.error_check true if rc==-1
|
82
88
|
|
83
89
|
rc = LibZMQ.zmq_msg_close @msgptr
|
@@ -89,7 +95,7 @@ module ZMQ
|
|
89
95
|
rc = LibZMQ.zmq_msg_init @msgptr
|
90
96
|
ZMQ.error_check true if rc==-1
|
91
97
|
|
92
|
-
rc = LibZMQ.zmq_recvmsg @
|
98
|
+
rc = LibZMQ.zmq_recvmsg @pointer, @msgptr, flags
|
93
99
|
ZMQ.error_check true if rc==-1
|
94
100
|
|
95
101
|
str = LibZMQ.zmq_msg_data(@msgptr)
|
@@ -163,7 +169,7 @@ module ZMQ
|
|
163
169
|
value = valptr
|
164
170
|
end
|
165
171
|
|
166
|
-
rc = LibZMQ.zmq_setsockopt @
|
172
|
+
rc = LibZMQ.zmq_setsockopt @pointer, option, value, value.size
|
167
173
|
ZMQ.error_check true if rc==-1
|
168
174
|
|
169
175
|
value
|
@@ -176,7 +182,7 @@ module ZMQ
|
|
176
182
|
|
177
183
|
value, size = get_opt_pointers type
|
178
184
|
|
179
|
-
rc = LibZMQ.zmq_getsockopt @
|
185
|
+
rc = LibZMQ.zmq_getsockopt @pointer, option, value, size
|
180
186
|
ZMQ.error_check true if rc==-1
|
181
187
|
|
182
188
|
if type == :string
|
@@ -188,6 +194,11 @@ module ZMQ
|
|
188
194
|
end
|
189
195
|
end
|
190
196
|
|
197
|
+
# Returns the socket's FFI pointer.
|
198
|
+
def to_ptr
|
199
|
+
@pointer
|
200
|
+
end
|
201
|
+
|
191
202
|
private
|
192
203
|
|
193
204
|
def get_opt_pointers(type)
|
data/lib/0mq/version.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
|
2
|
+
module ZMQ
|
3
|
+
|
4
|
+
# Returns a ZMQ::Version object containing the libzmq library version.
|
5
|
+
def self.version
|
6
|
+
ZMQ::Version
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
# libzmq library version.
|
11
|
+
class Version
|
12
|
+
|
13
|
+
@version = LibZMQ.version
|
14
|
+
|
15
|
+
private_class_method :new
|
16
|
+
|
17
|
+
class << self
|
18
|
+
|
19
|
+
# :nodoc:
|
20
|
+
def major
|
21
|
+
@version[:major]
|
22
|
+
end
|
23
|
+
|
24
|
+
# :nodoc:
|
25
|
+
def minor
|
26
|
+
@version[:minor]
|
27
|
+
end
|
28
|
+
|
29
|
+
# :nodoc:
|
30
|
+
def patch
|
31
|
+
@version[:patch]
|
32
|
+
end
|
33
|
+
|
34
|
+
# :nodoc:
|
35
|
+
def to_s
|
36
|
+
"#{major}.#{minor}.#{patch}"
|
37
|
+
end
|
38
|
+
|
39
|
+
# :nodoc:
|
40
|
+
def inspect
|
41
|
+
"#{super} \"#{to_s}\""
|
42
|
+
end
|
43
|
+
|
44
|
+
# Compare this version to another version.
|
45
|
+
# Examples: "3.2.0", "3.2", "3", 3
|
46
|
+
def <=>(value)
|
47
|
+
expression = /(?<major>\d+)(\.(?<minor>\d+))?(\.(?<patch>\d+))?/
|
48
|
+
|
49
|
+
# Convert both versions into an array of [major, minor, patch].
|
50
|
+
this_version = self.to_s
|
51
|
+
other_version = value.to_s
|
52
|
+
|
53
|
+
this_version =~ expression
|
54
|
+
this_set = $~.captures.map { |item| item.to_i if item }.select { |item| item }
|
55
|
+
|
56
|
+
other_version =~ expression
|
57
|
+
other_set = $~.captures.map { |item| item.to_i if item }.select { |item| item }
|
58
|
+
|
59
|
+
# Compare each section (major/minor/patch) of the version number.
|
60
|
+
other_set.count.times do |i|
|
61
|
+
return 1 if this_set[i] > other_set[i]
|
62
|
+
return -1 if this_set[i] < other_set[i]
|
63
|
+
end
|
64
|
+
|
65
|
+
0 # If the iterator didn't return, the versions are equal.
|
66
|
+
end
|
67
|
+
|
68
|
+
# :nodoc:
|
69
|
+
def ==(value)
|
70
|
+
(self <=> value) == 0 ? true : false
|
71
|
+
end
|
72
|
+
|
73
|
+
# :nodoc:
|
74
|
+
def !=(value)
|
75
|
+
(self <=> value) != 0 ? true : false
|
76
|
+
end
|
77
|
+
|
78
|
+
# :nodoc:
|
79
|
+
def >(value)
|
80
|
+
(self <=> value) == 1 ? true : false
|
81
|
+
end
|
82
|
+
|
83
|
+
# :nodoc:
|
84
|
+
def >=(value)
|
85
|
+
(self <=> value) != -1 ? true : false
|
86
|
+
end
|
87
|
+
|
88
|
+
# :nodoc:
|
89
|
+
def <(value)
|
90
|
+
(self <=> value) == -1 ? true : false
|
91
|
+
end
|
92
|
+
|
93
|
+
# :nodoc:
|
94
|
+
def <=(value)
|
95
|
+
(self <=> value) != 1 ? true : false
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: 0mq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe McIlvain
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-03-
|
12
|
+
date: 2014-03-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi-rzmq-core
|
@@ -119,11 +119,13 @@ files:
|
|
119
119
|
- README.md
|
120
120
|
- lib/0mq.rb
|
121
121
|
- lib/0mq/context.rb
|
122
|
+
- lib/0mq/curve.rb
|
122
123
|
- lib/0mq/error_map.rb
|
123
124
|
- lib/0mq/poll.rb
|
124
125
|
- lib/0mq/proxy.rb
|
125
126
|
- lib/0mq/socket.rb
|
126
127
|
- lib/0mq/socket/options.rb
|
128
|
+
- lib/0mq/version.rb
|
127
129
|
homepage: https://github.com/jemc/0mq/
|
128
130
|
licenses:
|
129
131
|
- MIT
|