stn-dcell 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +7 -0
  4. data/.rspec +4 -0
  5. data/.travis.yml +30 -0
  6. data/CHANGES.md +53 -0
  7. data/Gemfile +18 -0
  8. data/LICENSE.txt +20 -0
  9. data/README.md +168 -0
  10. data/Rakefile +4 -0
  11. data/benchmarks/messaging.rb +73 -0
  12. data/benchmarks/receiver.rb +37 -0
  13. data/dcell.gemspec +29 -0
  14. data/examples/itchy.rb +26 -0
  15. data/examples/scratchy.rb +12 -0
  16. data/explorer/css/bootstrap-responsive.css +686 -0
  17. data/explorer/css/bootstrap-responsive.min.css +12 -0
  18. data/explorer/css/bootstrap.css +3990 -0
  19. data/explorer/css/bootstrap.min.css +689 -0
  20. data/explorer/css/explorer.css +28 -0
  21. data/explorer/ico/favicon.ico +0 -0
  22. data/explorer/img/glyphicons-halflings-white.png +0 -0
  23. data/explorer/img/glyphicons-halflings.png +0 -0
  24. data/explorer/img/logo.png +0 -0
  25. data/explorer/index.html.erb +94 -0
  26. data/explorer/js/bootstrap.js +1726 -0
  27. data/explorer/js/bootstrap.min.js +6 -0
  28. data/lib/dcell.rb +127 -0
  29. data/lib/dcell/actor_proxy.rb +30 -0
  30. data/lib/dcell/celluloid_ext.rb +120 -0
  31. data/lib/dcell/directory.rb +31 -0
  32. data/lib/dcell/explorer.rb +74 -0
  33. data/lib/dcell/future_proxy.rb +32 -0
  34. data/lib/dcell/global.rb +23 -0
  35. data/lib/dcell/info_service.rb +122 -0
  36. data/lib/dcell/mailbox_proxy.rb +53 -0
  37. data/lib/dcell/messages.rb +65 -0
  38. data/lib/dcell/node.rb +138 -0
  39. data/lib/dcell/node_manager.rb +79 -0
  40. data/lib/dcell/registries/cassandra_adapter.rb +126 -0
  41. data/lib/dcell/registries/mongodb_adapter.rb +85 -0
  42. data/lib/dcell/registries/redis_adapter.rb +95 -0
  43. data/lib/dcell/registries/zk_adapter.rb +123 -0
  44. data/lib/dcell/responses.rb +16 -0
  45. data/lib/dcell/router.rb +46 -0
  46. data/lib/dcell/rpc.rb +95 -0
  47. data/lib/dcell/rspec.rb +1 -0
  48. data/lib/dcell/server.rb +73 -0
  49. data/lib/dcell/version.rb +3 -0
  50. data/logo.png +0 -0
  51. data/spec/dcell/actor_proxy_spec.rb +72 -0
  52. data/spec/dcell/celluloid_ext_spec.rb +32 -0
  53. data/spec/dcell/directory_spec.rb +22 -0
  54. data/spec/dcell/explorer_spec.rb +17 -0
  55. data/spec/dcell/global_spec.rb +25 -0
  56. data/spec/dcell/node_spec.rb +23 -0
  57. data/spec/dcell/registries/mongodb_adapter_spec.rb +7 -0
  58. data/spec/dcell/registries/redis_adapter_spec.rb +6 -0
  59. data/spec/dcell/registries/zk_adapter_spec.rb +28 -0
  60. data/spec/options/01-options.rb +10 -0
  61. data/spec/options/02-registry.rb +13 -0
  62. data/spec/spec_helper.rb +28 -0
  63. data/spec/support/helpers.rb +46 -0
  64. data/spec/support/registry_examples.rb +35 -0
  65. data/spec/test_node.rb +38 -0
  66. data/tasks/cassandra.task +84 -0
  67. data/tasks/rspec.task +7 -0
  68. data/tasks/zookeeper.task +58 -0
  69. metadata +239 -0
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'dcell/registries/zk_adapter'
3
+
4
+ describe DCell::Registry::ZkAdapter, :pending => TEST_ADEPTER != 'zk' && "no zookeeper" do
5
+ subject { DCell::Registry::ZkAdapter.new TEST_DB[:zk] }
6
+ it_behaves_like "a DCell registry" do
7
+ context "when one znode changes" do
8
+ it "updates a node" do
9
+ expect(DCell::Node).to receive(:update).with("foo")
10
+ subject.set_node("foo", "tcp://fooaddress")
11
+ # WARNING: only by calling get_node we renew the watcher
12
+ subject.get_node("foo").should eq("tcp://fooaddress")
13
+ subject.set_node("foo", "tcp://newaddress")
14
+ sleep 0.8 # takes some time to zookeeper watchers to take full effect
15
+ end
16
+ end
17
+ context "when one znode is deleted" do
18
+ it "deletes a node" do
19
+ expect(DCell::Node).to receive(:remove).with("foo")
20
+ subject.set_node("foo", "tcp://fooaddress")
21
+ # WARNING: only by calling get_node we renew the watcher
22
+ subject.get_node("foo").should eq("tcp://fooaddress")
23
+ subject.remove_node "foo"
24
+ sleep 0.8 # takes some time to zookeeper watchers to take full effect
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ TEST_DB = {
2
+ :redis => {:server => 'localhost', :env => 'test'},
3
+ :zk => {:server => 'localhost', :env => 'test'},
4
+ :mongodb => {:db => 'dcell-test'},
5
+ }
6
+ TEST_NODE = {
7
+ :id => 'test_node',
8
+ :addr => "127.0.0.1",
9
+ :port => 21264,
10
+ }
@@ -0,0 +1,13 @@
1
+ TEST_ADEPTER = ENV['DCELL_TEST_ADAPTER'] || 'redis'
2
+
3
+ require "dcell/registries/#{TEST_ADEPTER}_adapter"
4
+
5
+ def test_db_options
6
+ options = {}
7
+ adapter = TEST_ADEPTER
8
+ if adapter
9
+ options[:registry] = {:adapter => adapter}
10
+ options[:registry].merge! TEST_DB[adapter.to_sym]
11
+ end
12
+ options
13
+ end
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+
6
+ require 'dcell'
7
+ Dir['./spec/options/*.rb'].map { |f| require f }
8
+ Dir['./spec/support/*.rb'].map { |f| require f }
9
+
10
+ RSpec.configure do |config|
11
+ config.before(:suite) do
12
+ options = {}
13
+ options.merge! test_db_options
14
+ begin
15
+ DCell.start options
16
+ rescue => e
17
+ puts e
18
+ raise
19
+ end
20
+
21
+ TestNode.start
22
+ TestNode.wait_until_ready
23
+ end
24
+
25
+ config.after(:suite) do
26
+ TestNode.stop
27
+ end
28
+ end
@@ -0,0 +1,46 @@
1
+ # For Gem.ruby, and almost certainly already loaded
2
+ require 'rubygems'
3
+
4
+ module TestNode
5
+ def self.start
6
+ @pid = Process.spawn Gem.ruby, File.expand_path("../../test_node.rb", __FILE__)
7
+ unless @pid
8
+ STDERR.print "ERROR: Couldn't start test node. Do you have Redis installed?"
9
+ exit 1
10
+ end
11
+ end
12
+
13
+ def self.wait_until_ready
14
+ STDERR.print "Waiting for test node to start up..."
15
+
16
+ socket = nil
17
+ 30.times do
18
+ begin
19
+ socket = TCPSocket.open(TEST_NODE[:addr], TEST_NODE[:port])
20
+ break if socket
21
+ rescue Errno::ECONNREFUSED
22
+ STDERR.print "."
23
+ sleep 1
24
+ end
25
+ end
26
+
27
+ if socket
28
+ STDERR.puts " done!"
29
+ socket.close
30
+ else
31
+ STDERR.puts " FAILED!"
32
+ raise "couldn't connect to test node!"
33
+ end
34
+ end
35
+
36
+ def self.stop
37
+ unless @pid
38
+ STDERR.print "ERROR: Test node was never started!"
39
+ exit 1
40
+ end
41
+ Process.kill 9, @pid
42
+ rescue Errno::ESRCH
43
+ ensure
44
+ Process.wait @pid rescue nil
45
+ end
46
+ end
@@ -0,0 +1,35 @@
1
+ shared_context "a DCell registry" do
2
+ context "node registry" do
3
+ before :each do
4
+ subject.clear_all_nodes
5
+ end
6
+
7
+ it "stores node addresses" do
8
+ address = "tcp://localhost:7777"
9
+
10
+ subject.set_node("foobar", address)
11
+ subject.get_node("foobar").should == address
12
+ end
13
+
14
+ it "stores the IDs of all nodes" do
15
+ subject.set_node("foobar", "tcp://localhost:7777")
16
+ subject.nodes.should include "foobar"
17
+ end
18
+ end
19
+
20
+ context "global registry" do
21
+ before :each do
22
+ subject.clear_globals
23
+ end
24
+
25
+ it "stores values" do
26
+ subject.set_global("foobar", [1,2,3])
27
+ subject.get_global("foobar").should == [1,2,3]
28
+ end
29
+
30
+ it "stores the keys of all globals" do
31
+ subject.set_global("foobar", true)
32
+ subject.global_keys.should include "foobar"
33
+ end
34
+ end
35
+ end
data/spec/test_node.rb ADDED
@@ -0,0 +1,38 @@
1
+ # The DCell specs start a completely separate Ruby VM running this code
2
+ # for complete integration testing using 0MQ over TCP
3
+
4
+ require 'rubygems'
5
+ require 'bundler'
6
+ Bundler.setup
7
+
8
+ require 'dcell'
9
+ Dir['./spec/options/*.rb'].map { |f| require f }
10
+
11
+ options = {:id => TEST_NODE[:id], :addr => "tcp://#{TEST_NODE[:addr]}:#{TEST_NODE[:port]}"}
12
+ options.merge! test_db_options
13
+ DCell.start options
14
+
15
+ class TestActor
16
+ include Celluloid
17
+ attr_reader :value
18
+
19
+ def initialize
20
+ @value = 42
21
+ end
22
+
23
+ def the_answer
24
+ DCell::Global[:the_answer]
25
+ end
26
+
27
+ def win(&block)
28
+ yield 10000
29
+ 20000
30
+ end
31
+
32
+ def crash
33
+ raise "the spec purposely crashed me :("
34
+ end
35
+ end
36
+
37
+ TestActor.supervise_as :test_actor
38
+ sleep
@@ -0,0 +1,84 @@
1
+ require 'rake/clean'
2
+
3
+ namespace :cassandra do
4
+ CASS_VERSION = "1.0.8"
5
+ CASS_TARBALL = "apache-cassandra-#{CASS_VERSION}-bin.tar.gz"
6
+ CASS_MD5 = "676887f6d185689c3383908f3ad8e015"
7
+
8
+ task :download => "tmp/#{CASS_TARBALL}"
9
+ directory 'tmp'
10
+
11
+ file "tmp/#{CASS_TARBALL}" => "tmp" do
12
+ require 'digest/md5'
13
+ tarball = "tmp/#{CASS_TARBALL}"
14
+
15
+ puts "*** Downloading Cassandra"
16
+ sh "curl http://archive.apache.org/dist/cassandra/#{CASS_VERSION}/#{CASS_TARBALL} -o #{tarball}"
17
+ digest = Digest::MD5.hexdigest(File.read(tarball))
18
+ unless digest == CASS_MD5
19
+ rm tarball
20
+ raise "Expected MD5 #{CASS_MD5} but got #{digest}."
21
+ end
22
+ end
23
+
24
+ task :install => :download do
25
+ require 'yaml'
26
+ puts "*** Unpacking Cassandra"
27
+
28
+ rm_rf "cassandra" if File.exists? "cassandra"
29
+ sh "tar -zxvf tmp/#{CASS_TARBALL}"
30
+ mv "apache-cassandra-#{CASS_VERSION}", "cassandra"
31
+ home = File.expand_path("../../cassandra", __FILE__)
32
+
33
+ # Create base configuration
34
+ data = File.join(home, "data").encode("us-ascii")
35
+ mkdir_p data
36
+ commit = File.join(home, "commit").encode("us-ascii")
37
+ mkdir_p commit
38
+ caches = File.join(home, "caches").encode("us-ascii")
39
+ mkdir_p caches
40
+ config_file = File.join(home, "conf", "cassandra.yaml")
41
+ env_file = File.join(home, "conf", "cassandra-env.sh")
42
+
43
+ conf = YAML::load_file(config_file)
44
+ conf.merge!({
45
+ "initial_token" => 0,
46
+ "partitioner" => "org.apache.cassandra.dht.RandomPartitioner",
47
+ "data_file_directories" => [data],
48
+ "commitlog_directory" => commit,
49
+ "saved_caches_directory" => caches,
50
+ "storage_port" => 27000,
51
+ "ssl_storage_port" => 27001,
52
+ "listen_address" => "127.0.0.1",
53
+ "rpc_address" => "127.0.0.1",
54
+ "rpc_port" => 29160,
55
+ # DSE doesn't work OOTB as a single node unless you switch to simplesnitch
56
+ "endpoint_snitch" => "org.apache.cassandra.locator.SimpleSnitch",
57
+ })
58
+ File.open(config_file, "w") { |file| file.puts YAML::dump(conf) }
59
+
60
+ env = File.read(env_file)
61
+ env.sub!(/JMX_PORT=['"]?\d+['"]?/, 'JMX_PORT="27199"')
62
+ File.open(env_file, "w") { |file| file.puts env }
63
+ end
64
+
65
+ task :start => :cassandra do
66
+ puts "*** Starting Cassandra"
67
+
68
+ # adding the -Dcassandra.for=dcell makes it easier to kill the right
69
+ # cassandra if you're running more than one, e.g. pkill -f dcell
70
+ # or DTRT and kill $(< cassandra/cassandra.pid)
71
+ sh "cd cassandra && bin/cassandra -p cassandra.pid -Dcassandra.for=dcell"
72
+ puts "*** waiting for Cassandra to come up before creating schema ..."
73
+ sleep 2
74
+ puts "*** creating schema ..."
75
+ sh "echo 'create keyspace dcell;' | cassandra/bin/cassandra-cli -h 127.0.0.1 -p 29160"
76
+ sh "echo 'create column family dcell;' | cassandra/bin/cassandra-cli -h 127.0.0.1 -p 29160 -k dcell"
77
+ end
78
+ end
79
+
80
+ file 'cassandra' do
81
+ Rake::Task['cassandra:install'].invoke
82
+ end
83
+
84
+ CLEAN.include "tmp", "cassandra"
data/tasks/rspec.task ADDED
@@ -0,0 +1,7 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new
4
+
5
+ RSpec::Core::RakeTask.new(:rcov) do |task|
6
+ task.rcov = true
7
+ end
@@ -0,0 +1,58 @@
1
+ require 'rake/clean'
2
+
3
+ namespace :zookeeper do
4
+ ZK_VERSION = "3.3.3"
5
+ ZK_TARBALL = "zookeeper-#{ZK_VERSION}.tar.gz"
6
+
7
+ task :download => "tmp/#{ZK_TARBALL}"
8
+ directory 'tmp'
9
+
10
+ file "tmp/#{ZK_TARBALL}" => "tmp" do
11
+ puts "*** Downloading Zookeeper"
12
+ sh "curl http://archive.apache.org/dist/zookeeper/zookeeper-#{ZK_VERSION}/#{ZK_TARBALL} -o tmp/#{ZK_TARBALL}"
13
+ end
14
+
15
+ task :install => :download do
16
+ puts "*** Unpacking Zookeeper"
17
+
18
+ rm_rf "zookeeper" if File.exists? "zookeeper"
19
+ sh "tar -zxvf tmp/#{ZK_TARBALL}"
20
+ mv "zookeeper-#{ZK_VERSION}", "zookeeper"
21
+ home = File.expand_path("../../zookeeper", __FILE__)
22
+
23
+ # Create base configuration
24
+ data = File.join(home, "data")
25
+ mkdir_p data
26
+ config = File.join(home, "conf", "zoo.cfg")
27
+ rm_r File.join(home, "conf", "zoo_sample.cfg")
28
+
29
+ File.open(config, "w") do |file|
30
+ # Maybe some kind soul will move this ugly heredoc into a template
31
+ file << <<-ZK_CONFIG
32
+ # The number of milliseconds of each tick
33
+ tickTime=2000
34
+ # The number of ticks that the initial
35
+ # synchronization phase can take
36
+ initLimit=10
37
+ # The number of ticks that can pass between
38
+ # sending a request and getting an acknowledgement
39
+ syncLimit=5
40
+ # the directory where the snapshot is stored.
41
+ dataDir=#{data}
42
+ # the port at which the clients will connect
43
+ clientPort=2181
44
+ ZK_CONFIG
45
+ end
46
+ end
47
+
48
+ task :start => :zookeeper do
49
+ puts "*** Starting Zookeeper"
50
+ sh "cd zookeeper && bin/zkServer.sh start"
51
+ end
52
+ end
53
+
54
+ file 'zookeeper' do
55
+ Rake::Task['zookeeper:install'].invoke
56
+ end
57
+
58
+ CLEAN.include "tmp", "zookeeper"
metadata ADDED
@@ -0,0 +1,239 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stn-dcell
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.16.0
5
+ platform: ruby
6
+ authors:
7
+ - Tony Arcieri
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: celluloid
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.16.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.16.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: celluloid-zmq
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.16.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.16.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: reel
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.4.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.4.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: http
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.5.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.5.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: celluloid-redis
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: redis-namespace
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 2.14.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 2.14.0
125
+ description: DCell is an distributed object framework based on Celluloid built on
126
+ 0MQ and Zookeeper
127
+ email:
128
+ - tony.arcieri@gmail.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".coveralls.yml"
134
+ - ".gitignore"
135
+ - ".rspec"
136
+ - ".travis.yml"
137
+ - CHANGES.md
138
+ - Gemfile
139
+ - LICENSE.txt
140
+ - README.md
141
+ - Rakefile
142
+ - benchmarks/messaging.rb
143
+ - benchmarks/receiver.rb
144
+ - dcell.gemspec
145
+ - examples/itchy.rb
146
+ - examples/scratchy.rb
147
+ - explorer/css/bootstrap-responsive.css
148
+ - explorer/css/bootstrap-responsive.min.css
149
+ - explorer/css/bootstrap.css
150
+ - explorer/css/bootstrap.min.css
151
+ - explorer/css/explorer.css
152
+ - explorer/ico/favicon.ico
153
+ - explorer/img/glyphicons-halflings-white.png
154
+ - explorer/img/glyphicons-halflings.png
155
+ - explorer/img/logo.png
156
+ - explorer/index.html.erb
157
+ - explorer/js/bootstrap.js
158
+ - explorer/js/bootstrap.min.js
159
+ - lib/dcell.rb
160
+ - lib/dcell/actor_proxy.rb
161
+ - lib/dcell/celluloid_ext.rb
162
+ - lib/dcell/directory.rb
163
+ - lib/dcell/explorer.rb
164
+ - lib/dcell/future_proxy.rb
165
+ - lib/dcell/global.rb
166
+ - lib/dcell/info_service.rb
167
+ - lib/dcell/mailbox_proxy.rb
168
+ - lib/dcell/messages.rb
169
+ - lib/dcell/node.rb
170
+ - lib/dcell/node_manager.rb
171
+ - lib/dcell/registries/cassandra_adapter.rb
172
+ - lib/dcell/registries/mongodb_adapter.rb
173
+ - lib/dcell/registries/redis_adapter.rb
174
+ - lib/dcell/registries/zk_adapter.rb
175
+ - lib/dcell/responses.rb
176
+ - lib/dcell/router.rb
177
+ - lib/dcell/rpc.rb
178
+ - lib/dcell/rspec.rb
179
+ - lib/dcell/server.rb
180
+ - lib/dcell/version.rb
181
+ - logo.png
182
+ - spec/dcell/actor_proxy_spec.rb
183
+ - spec/dcell/celluloid_ext_spec.rb
184
+ - spec/dcell/directory_spec.rb
185
+ - spec/dcell/explorer_spec.rb
186
+ - spec/dcell/global_spec.rb
187
+ - spec/dcell/node_spec.rb
188
+ - spec/dcell/registries/mongodb_adapter_spec.rb
189
+ - spec/dcell/registries/redis_adapter_spec.rb
190
+ - spec/dcell/registries/zk_adapter_spec.rb
191
+ - spec/options/01-options.rb
192
+ - spec/options/02-registry.rb
193
+ - spec/spec_helper.rb
194
+ - spec/support/helpers.rb
195
+ - spec/support/registry_examples.rb
196
+ - spec/test_node.rb
197
+ - tasks/cassandra.task
198
+ - tasks/rspec.task
199
+ - tasks/zookeeper.task
200
+ homepage: http://github.com/celluloid/dcell
201
+ licenses:
202
+ - MIT
203
+ metadata: {}
204
+ post_install_message:
205
+ rdoc_options: []
206
+ require_paths:
207
+ - lib
208
+ required_ruby_version: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ required_rubygems_version: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ requirements: []
219
+ rubyforge_project:
220
+ rubygems_version: 2.2.2
221
+ signing_key:
222
+ specification_version: 4
223
+ summary: An asynchronous distributed object framework based on Celluloid
224
+ test_files:
225
+ - spec/dcell/actor_proxy_spec.rb
226
+ - spec/dcell/celluloid_ext_spec.rb
227
+ - spec/dcell/directory_spec.rb
228
+ - spec/dcell/explorer_spec.rb
229
+ - spec/dcell/global_spec.rb
230
+ - spec/dcell/node_spec.rb
231
+ - spec/dcell/registries/mongodb_adapter_spec.rb
232
+ - spec/dcell/registries/redis_adapter_spec.rb
233
+ - spec/dcell/registries/zk_adapter_spec.rb
234
+ - spec/options/01-options.rb
235
+ - spec/options/02-registry.rb
236
+ - spec/spec_helper.rb
237
+ - spec/support/helpers.rb
238
+ - spec/support/registry_examples.rb
239
+ - spec/test_node.rb