celluloid-zmq 0.16.1 → 0.17.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 +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
|