celluloid-zmq 0.16.1 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +13 -7
- data/Gemfile +2 -8
- data/celluloid-zmq.gemspec +2 -5
- data/culture/CODE_OF_CONDUCT.md +28 -0
- data/culture/Gemfile +9 -0
- data/culture/README.md +22 -0
- data/culture/Rakefile +5 -0
- data/culture/SYNC.md +70 -0
- data/culture/celluloid-culture.gemspec +18 -0
- data/culture/gems/README.md +39 -0
- data/culture/gems/dependencies.yml +84 -0
- data/culture/gems/loader.rb +101 -0
- data/culture/rubocop/README.md +38 -0
- data/culture/rubocop/lint.yml +8 -0
- data/culture/rubocop/metrics.yml +15 -0
- data/culture/rubocop/rubocop.yml +4 -0
- data/culture/rubocop/style.yml +48 -0
- data/culture/spec/gems_spec.rb +2 -0
- data/culture/spec/spec_helper.rb +0 -0
- data/culture/spec/sync_spec.rb +2 -0
- data/culture/sync.rb +56 -0
- data/culture/tasks/rspec.rake +5 -0
- data/culture/tasks/rubocop.rake +2 -0
- data/examples/publish_subscribe.rb +8 -6
- data/lib/celluloid/zmq.rb +17 -3
- data/lib/celluloid/zmq/current.rb +2 -0
- data/lib/celluloid/zmq/deprecate.rb +15 -0
- data/lib/celluloid/zmq/mailbox.rb +1 -1
- data/lib/celluloid/zmq/reactor.rb +4 -3
- data/lib/celluloid/zmq/socket.rb +75 -0
- data/lib/celluloid/zmq/socket/readable.rb +46 -0
- data/lib/celluloid/zmq/socket/types.rb +104 -0
- data/lib/celluloid/zmq/socket/writable.rb +30 -0
- data/lib/celluloid/zmq/version.rb +1 -1
- data/lib/celluloid/zmq/waker.rb +4 -2
- data/log/test.log +23785 -0
- data/spec/celluloid/zmq/actor_spec.rb +1 -1
- data/spec/celluloid/zmq/socket_spec.rb +1 -1
- data/spec/celluloid/zmq_spec.rb +4 -4
- data/spec/spec_helper.rb +23 -0
- metadata +287 -35
- data/lib/celluloid/zmq/sockets.rb +0 -222
@@ -0,0 +1,38 @@
|
|
1
|
+
# About
|
2
|
+
[RuboCop](https://github.com/bbatsov/rubocop) is a ruby static code analyzer.
|
3
|
+
It's more than just a lint. It verifies the code against ruby best practices and performs code correctness analysis.
|
4
|
+
Celluloid culture doesn't always agree with all rubocop default policies and so we provide a rubocop configuration file that overrides its default behavior.
|
5
|
+
|
6
|
+
# Integration
|
7
|
+
|
8
|
+
[Integrate `celluloid/culture`](../README.md#integration), then include `culture/rupocop/.rubocop.yml` in your default rubocop config.
|
9
|
+
|
10
|
+
##### Add celluloid/culture as GIT submodule:
|
11
|
+
|
12
|
+
* See instructions: [Integrate the `celluloid/culture` sub-module](../README.md#integration)
|
13
|
+
|
14
|
+
##### Include `culture/rupocop/rubocop.yml` in the `.rubocop.yml` in the root of your project:
|
15
|
+
```yml
|
16
|
+
inherit_from:
|
17
|
+
- culture/rubocop/rubocop.yml
|
18
|
+
```
|
19
|
+
|
20
|
+
# How to add rubocop to your project
|
21
|
+
|
22
|
+
The `rubocop` gem is automatically included by `Celluloid::Sync.gems` when that is [implemented](../SYNC.md).
|
23
|
+
|
24
|
+
##### Add a 'rubocop' target in your `Rakefile`
|
25
|
+
|
26
|
+
# Hints
|
27
|
+
It's possible to use rubocop for autocorrection of minor problems.
|
28
|
+
|
29
|
+
Always verify these changes by running:
|
30
|
+
|
31
|
+
```sh
|
32
|
+
bundle exec rubocop
|
33
|
+
```
|
34
|
+
|
35
|
+
Once you are ready to auto-corret the issues you are shown, run it with the `-a` option:
|
36
|
+
```sh
|
37
|
+
bundle exec rubocop -a
|
38
|
+
```
|
@@ -0,0 +1,48 @@
|
|
1
|
+
Style/Documentation:
|
2
|
+
Enabled: false
|
3
|
+
|
4
|
+
Style/ModuleFunction:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Style/AndOr:
|
8
|
+
Enabled: true
|
9
|
+
|
10
|
+
Style/StringLiterals:
|
11
|
+
Enabled: true
|
12
|
+
EnforcedStyle: double_quotes
|
13
|
+
|
14
|
+
Style/EachWithObject:
|
15
|
+
Enabled: true
|
16
|
+
|
17
|
+
Style/InfiniteLoop:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
Style/SpaceAroundEqualsInParameterDefault:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
Style/SpaceInsideBlockBraces:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
Style/AccessModifierIndentation:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
Style/TrailingComma:
|
30
|
+
Enabled: true
|
31
|
+
EnforcedStyleForMultiline: comma
|
32
|
+
|
33
|
+
Style/SpaceInsideBlockBraces:
|
34
|
+
Enabled: true
|
35
|
+
EnforcedStyle: space
|
36
|
+
|
37
|
+
Style/SpaceInsideHashLiteralBraces:
|
38
|
+
Enabled: true
|
39
|
+
EnforcedStyle: no_space
|
40
|
+
|
41
|
+
Style/EmptyLinesAroundAccessModifier:
|
42
|
+
Enabled: false
|
43
|
+
|
44
|
+
Style/RescueModifier:
|
45
|
+
Enabled: false
|
46
|
+
|
47
|
+
Style/GlobalVars:
|
48
|
+
Enabled: false
|
File without changes
|
data/culture/sync.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
3
|
+
module Celluloid
|
4
|
+
module Sync
|
5
|
+
class << self
|
6
|
+
undef gem_path rescue nil
|
7
|
+
def gem_path
|
8
|
+
File.expand_path("../../", __FILE__)
|
9
|
+
end
|
10
|
+
|
11
|
+
undef gem_name rescue nil
|
12
|
+
def gem_name
|
13
|
+
Dir["#{File.expand_path('../../', __FILE__)}/*.gemspec"].first.gsub(".gemspec", "").split("/").last
|
14
|
+
end
|
15
|
+
|
16
|
+
undef gem_name? rescue nil
|
17
|
+
def gem_name?
|
18
|
+
!gem_name.nil?
|
19
|
+
end
|
20
|
+
|
21
|
+
undef lib_path rescue nil
|
22
|
+
def lib_path
|
23
|
+
File.expand_path("../../lib", __FILE__)
|
24
|
+
end
|
25
|
+
|
26
|
+
undef lib_gempath rescue nil
|
27
|
+
def lib_gempath
|
28
|
+
"#{lib_path}/#{gem_name.split('-').join('/')}"
|
29
|
+
end
|
30
|
+
|
31
|
+
undef scenario rescue nil
|
32
|
+
def scenario
|
33
|
+
File.basename($PROGRAM_NAME)
|
34
|
+
end
|
35
|
+
|
36
|
+
undef bundler? rescue nil
|
37
|
+
def bundler?
|
38
|
+
scenario == "bundle"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
fail "Missing gemspec." unless gem_name?
|
43
|
+
$LOAD_PATH.push(gem_path)
|
44
|
+
$LOAD_PATH.push(lib_path)
|
45
|
+
|
46
|
+
# TODO: This will likely need to be done differently if INSIDE a cut gem.
|
47
|
+
if scenario == "bundle"
|
48
|
+
`cd #{gem_path}/culture; git pull origin master` if ARGV.first == "update"
|
49
|
+
end
|
50
|
+
|
51
|
+
require("#{gem_path}/culture/gems/loader")
|
52
|
+
if File.exist?(version = "#{lib_gempath}/version.rb")
|
53
|
+
require(version)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
require 'celluloid/zmq'
|
1
|
+
require 'celluloid/zmq/current'
|
2
|
+
|
3
|
+
Celluloid::ZMQ.init
|
2
4
|
|
3
5
|
class PublishSubscribe
|
4
6
|
include Celluloid::ZMQ
|
@@ -6,11 +8,11 @@ class PublishSubscribe
|
|
6
8
|
def run
|
7
9
|
link = "tcp://127.0.0.1:5555"
|
8
10
|
|
9
|
-
s1 =
|
10
|
-
s2 =
|
11
|
-
s3 =
|
12
|
-
s4 =
|
13
|
-
s5 =
|
11
|
+
s1 = Socket::Pub.new
|
12
|
+
s2 = Socket::Sub.new
|
13
|
+
s3 = Socket::Sub.new
|
14
|
+
s4 = Socket::Sub.new
|
15
|
+
s5 = Socket::Sub.new
|
14
16
|
|
15
17
|
s1.linger = 100
|
16
18
|
s2.subscribe('') # receive all
|
data/lib/celluloid/zmq.rb
CHANGED
@@ -1,16 +1,23 @@
|
|
1
1
|
require 'ffi-rzmq'
|
2
2
|
|
3
|
-
|
3
|
+
$CELLULOID_ZMQ_BACKPORTED = (ENV["CELLULOID_ZMQ_BACKPORTED"] != "false") unless defined?($CELLULOID_ZMQ_BACKPORTED)
|
4
|
+
|
5
|
+
require ($CELLULOID_ZMQ_BACKPORTED) ? 'celluloid' : 'celluloid/current'
|
6
|
+
|
4
7
|
require 'celluloid/zmq/mailbox'
|
5
8
|
require 'celluloid/zmq/reactor'
|
6
|
-
require 'celluloid/zmq/
|
9
|
+
require 'celluloid/zmq/socket'
|
7
10
|
require 'celluloid/zmq/version'
|
8
11
|
require 'celluloid/zmq/waker'
|
9
12
|
|
13
|
+
require 'celluloid/zmq/socket/readable'
|
14
|
+
require 'celluloid/zmq/socket/writable'
|
15
|
+
require 'celluloid/zmq/socket/types'
|
16
|
+
|
10
17
|
module Celluloid
|
11
18
|
# Actors which run alongside 0MQ sockets
|
12
19
|
module ZMQ
|
13
|
-
UninitializedError
|
20
|
+
class UninitializedError < Celluloid::Error; end
|
14
21
|
|
15
22
|
class << self
|
16
23
|
attr_writer :context
|
@@ -65,5 +72,12 @@ module Celluloid
|
|
65
72
|
end
|
66
73
|
module_function :wait_writable
|
67
74
|
|
75
|
+
def result_ok?(result)
|
76
|
+
::ZMQ::Util.resultcode_ok?(result)
|
77
|
+
end
|
78
|
+
module_function :result_ok?
|
79
|
+
|
68
80
|
end
|
69
81
|
end
|
82
|
+
|
83
|
+
require 'celluloid/zmq/deprecate' unless $CELLULOID_BACKPORTED == false || $CELLULOID_ZMQ_BACKPORTED == false
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Celluloid
|
2
|
+
module ZMQ
|
3
|
+
ReadableSocket = Socket::Readable
|
4
|
+
WritableSocket = Socket::Writable
|
5
|
+
RepSocket = Socket::Rep
|
6
|
+
ReqSocket = Socket::Req
|
7
|
+
DealerSocket = Socket::Dealer
|
8
|
+
RouterSocket = Socket::Router
|
9
|
+
PushSocket = Socket::Push
|
10
|
+
PullSocket = Socket::Pull
|
11
|
+
PubSocket = Socket::Pub
|
12
|
+
XPubSocket = Socket::XPub
|
13
|
+
SubSocket = Socket::Sub
|
14
|
+
end
|
15
|
+
end
|
@@ -3,10 +3,11 @@ module Celluloid
|
|
3
3
|
# React to incoming 0MQ and Celluloid events. This is kinda sorta supposed
|
4
4
|
# to resemble the Reactor design pattern.
|
5
5
|
class Reactor
|
6
|
-
extend Forwardable
|
7
6
|
|
7
|
+
extend Forwardable
|
8
8
|
def_delegator :@waker, :signal, :wakeup
|
9
9
|
def_delegator :@waker, :cleanup, :shutdown
|
10
|
+
def_delegator ZMQ, :result_ok?
|
10
11
|
|
11
12
|
def initialize
|
12
13
|
@waker = Waker.new
|
@@ -15,7 +16,7 @@ module Celluloid
|
|
15
16
|
@writers = {}
|
16
17
|
|
17
18
|
rc = @poller.register @waker.socket, ::ZMQ::POLLIN
|
18
|
-
unless
|
19
|
+
unless result_ok? rc
|
19
20
|
raise "0MQ poll error: #{::ZMQ::Util.error_string}"
|
20
21
|
end
|
21
22
|
end
|
@@ -55,7 +56,7 @@ module Celluloid
|
|
55
56
|
|
56
57
|
rc = @poller.poll(timeout)
|
57
58
|
|
58
|
-
unless
|
59
|
+
unless result_ok? rc
|
59
60
|
raise IOError, "0MQ poll error: #{::ZMQ::Util.error_string}"
|
60
61
|
end
|
61
62
|
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Celluloid
|
2
|
+
module ZMQ
|
3
|
+
class Socket
|
4
|
+
extend Forwardable
|
5
|
+
def_delegator ZMQ, :result_ok?
|
6
|
+
# Create a new socket
|
7
|
+
def initialize(type)
|
8
|
+
@socket = Celluloid::ZMQ.context.socket ::ZMQ.const_get(type.to_s.upcase)
|
9
|
+
@linger = 0
|
10
|
+
end
|
11
|
+
attr_reader :linger
|
12
|
+
|
13
|
+
# Connect to the given 0MQ address
|
14
|
+
# Address should be in the form: tcp://1.2.3.4:5678/
|
15
|
+
def connect(addr)
|
16
|
+
unless result_ok? @socket.connect addr
|
17
|
+
raise IOError, "error connecting to #{addr}: #{::ZMQ::Util.error_string}"
|
18
|
+
end
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def linger=(value)
|
23
|
+
@linger = value || -1
|
24
|
+
|
25
|
+
unless result_ok? @socket.setsockopt(::ZMQ::LINGER, value)
|
26
|
+
raise IOError, "couldn't set linger: #{::ZMQ::Util.error_string}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def identity=(value)
|
31
|
+
unless result_ok? @socket.setsockopt(::ZMQ::IDENTITY, "#{value}")
|
32
|
+
raise IOError, "couldn't set identity: #{::ZMQ::Util.error_string}"
|
33
|
+
end
|
34
|
+
#de @socket.identity = value
|
35
|
+
end
|
36
|
+
|
37
|
+
def identity
|
38
|
+
#de @socket.identity
|
39
|
+
get(::ZMQ::IDENTITY)
|
40
|
+
end
|
41
|
+
|
42
|
+
def set(option, value, length = nil)
|
43
|
+
unless result_ok? @socket.setsockopt(option, value, length)
|
44
|
+
raise IOError, "couldn't set value for option #{option}: #{::ZMQ::Util.error_string}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def get(option)
|
49
|
+
option_value = []
|
50
|
+
|
51
|
+
unless result_ok? @socket.getsockopt(option, option_value)
|
52
|
+
raise IOError, "couldn't get value for option #{option}: #{::ZMQ::Util.error_string}"
|
53
|
+
end
|
54
|
+
|
55
|
+
option_value[0]
|
56
|
+
end
|
57
|
+
|
58
|
+
# Bind to the given 0MQ address
|
59
|
+
# Address should be in the form: tcp://1.2.3.4:5678/
|
60
|
+
def bind(addr)
|
61
|
+
unless result_ok? @socket.bind(addr)
|
62
|
+
raise IOError, "couldn't bind to #{addr}: #{::ZMQ::Util.error_string}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Close the socket
|
67
|
+
def close
|
68
|
+
@socket.close
|
69
|
+
end
|
70
|
+
|
71
|
+
# Hide ffi-rzmq internals
|
72
|
+
alias_method :inspect, :to_s
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Celluloid
|
2
|
+
module ZMQ
|
3
|
+
class Socket
|
4
|
+
# Readable 0MQ sockets have a read method
|
5
|
+
module Readable
|
6
|
+
extend Forwardable
|
7
|
+
def_delegator ZMQ, :result_ok?
|
8
|
+
|
9
|
+
# always set LINGER on readable sockets
|
10
|
+
def bind(addr)
|
11
|
+
self.linger = @linger
|
12
|
+
super(addr)
|
13
|
+
end
|
14
|
+
|
15
|
+
def connect(addr)
|
16
|
+
self.linger = @linger
|
17
|
+
super(addr)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Read a message from the socket
|
21
|
+
def read(buffer = '')
|
22
|
+
ZMQ.wait_readable(@socket) if ZMQ.evented?
|
23
|
+
|
24
|
+
unless result_ok? @socket.recv_string buffer
|
25
|
+
raise IOError, "error receiving ZMQ string: #{::ZMQ::Util.error_string}"
|
26
|
+
end
|
27
|
+
buffer
|
28
|
+
end
|
29
|
+
|
30
|
+
# Multiparts message ?
|
31
|
+
def_delegator :@socket, :more_parts?
|
32
|
+
|
33
|
+
# Reads a multipart message, stores it into the given buffer and returns
|
34
|
+
# the buffer.
|
35
|
+
def read_multipart(buffer = [])
|
36
|
+
ZMQ.wait_readable(@socket) if ZMQ.evented?
|
37
|
+
|
38
|
+
unless result_ok? @socket.recv_strings buffer
|
39
|
+
raise IOError, "error receiving ZMQ string: #{::ZMQ::Util.error_string}"
|
40
|
+
end
|
41
|
+
buffer
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|