aggro 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -5
  3. data/aggro.gemspec +1 -3
  4. data/lib/aggro.rb +25 -7
  5. data/lib/aggro/aggregate.rb +33 -6
  6. data/lib/aggro/attribute_dsl.rb +8 -0
  7. data/lib/aggro/client.rb +4 -0
  8. data/lib/aggro/cluster_config.rb +5 -0
  9. data/lib/aggro/concurrent_actor.rb +1 -1
  10. data/lib/aggro/event_bus.rb +5 -2
  11. data/lib/aggro/event_serializer.rb +2 -2
  12. data/lib/aggro/file_store.rb +2 -2
  13. data/lib/aggro/file_store/reader.rb +11 -3
  14. data/lib/aggro/file_store/writer.rb +2 -2
  15. data/lib/aggro/handler/query.rb +19 -7
  16. data/lib/aggro/logging.rb +16 -0
  17. data/lib/aggro/marshal_stream.rb +123 -0
  18. data/lib/aggro/message/events.rb +6 -2
  19. data/lib/aggro/message/server_error.rb +20 -0
  20. data/lib/aggro/node.rb +3 -1
  21. data/lib/aggro/projection.rb +1 -0
  22. data/lib/aggro/server.rb +1 -5
  23. data/lib/aggro/subscription.rb +16 -2
  24. data/lib/aggro/transform/boolean.rb +14 -2
  25. data/lib/aggro/transform/date.rb +22 -0
  26. data/lib/aggro/transform/string.rb +2 -2
  27. data/lib/aggro/transform/time.rb +22 -0
  28. data/lib/aggro/version.rb +1 -1
  29. data/lib/aggro/zeromq_transport.rb +44 -0
  30. data/lib/aggro/{nanomsg_transport → zeromq_transport}/client.rb +11 -9
  31. data/lib/aggro/{nanomsg_transport → zeromq_transport}/publisher.rb +11 -8
  32. data/lib/aggro/zeromq_transport/server.rb +92 -0
  33. data/lib/aggro/{nanomsg_transport → zeromq_transport}/subscriber.rb +23 -24
  34. data/spec/lib/aggro/event_serializer_spec.rb +1 -1
  35. data/spec/lib/aggro/file_store/reader_spec.rb +2 -1
  36. data/spec/lib/aggro/file_store/writer_spec.rb +10 -7
  37. data/spec/lib/aggro/local_node_spec.rb +2 -2
  38. data/spec/lib/aggro/marshal_stream_spec.rb +17 -0
  39. data/spec/lib/aggro/message/events_spec.rb +4 -3
  40. data/spec/lib/aggro/node_spec.rb +3 -3
  41. data/spec/lib/aggro/subscription_spec.rb +4 -2
  42. data/spec/lib/aggro/{nanomsg_transport_spec.rb → zeromq_transport_spec.rb} +11 -7
  43. data/spec/spec_helper.rb +8 -1
  44. metadata +17 -50
  45. data/lib/aggro/abstract_store.rb +0 -12
  46. data/lib/aggro/nanomsg_transport/connection.rb +0 -98
  47. data/lib/aggro/nanomsg_transport/publish.rb +0 -17
  48. data/lib/aggro/nanomsg_transport/raw_reply.rb +0 -18
  49. data/lib/aggro/nanomsg_transport/raw_request.rb +0 -18
  50. data/lib/aggro/nanomsg_transport/reply.rb +0 -17
  51. data/lib/aggro/nanomsg_transport/request.rb +0 -17
  52. data/lib/aggro/nanomsg_transport/server.rb +0 -84
  53. data/lib/aggro/nanomsg_transport/socket_error.rb +0 -20
  54. data/lib/aggro/nanomsg_transport/subscribe.rb +0 -27
  55. data/spec/lib/aggro/abstract_store_spec.rb +0 -15
  56. data/spec/lib/aggro/nanomsg_transport/socket_error_spec.rb +0 -21
@@ -0,0 +1,92 @@
1
+ module Aggro
2
+ module ZeroMQTransport
3
+ # Public: Server to handle messages from nanomsg clients.
4
+ class Server
5
+ DEFAULT_WORKER_COUNT = 16
6
+
7
+ # Private: Struct to hold request workload data.
8
+ class Workload < Struct.new(:identity, :message, :socket, :mutex)
9
+ def finish(reply)
10
+ mutex.synchronize do
11
+ socket.send_string identity, ZMQ::SNDMORE
12
+ socket.send_string '', ZMQ::SNDMORE
13
+ socket.send_string reply.to_s
14
+ end
15
+ end
16
+ end
17
+
18
+ class ServerAlreadyRunning < RuntimeError; end
19
+
20
+ def initialize(endpoint, callable = nil, &block)
21
+ fail ArgumentError unless callable || block_given?
22
+
23
+ @callable = block_given? ? block : callable
24
+ @endpoint = endpoint
25
+ @inproc_endpoint = "inproc://aggro-server-#{SecureRandom.hex}"
26
+ @reply_mutex = Mutex.new
27
+ @work_queue = Queue.new
28
+ end
29
+
30
+ def start
31
+ fail ServerAlreadyRunning if @running
32
+
33
+ @running = true
34
+ start_master
35
+ DEFAULT_WORKER_COUNT.times { start_worker }
36
+
37
+ self
38
+ end
39
+
40
+ def stop
41
+ return self unless @running
42
+
43
+ @running = false
44
+
45
+ self
46
+ end
47
+
48
+ private
49
+
50
+ def enqueue_request(socket)
51
+ id = ''
52
+ delimiter = ''
53
+ message = ''
54
+
55
+ socket.recv_string id
56
+ socket.recv_string delimiter
57
+ socket.recv_string message
58
+
59
+ @work_queue << Workload.new(id, message, socket, @reply_mutex)
60
+ end
61
+
62
+ def respond_to_request(workload)
63
+ return if workload.nil?
64
+
65
+ response = '00'
66
+ response = @callable.call(workload.message)
67
+ ensure
68
+ workload.finish response unless workload.nil?
69
+ end
70
+
71
+ def start_master
72
+ Concurrent::SingleThreadExecutor.new.post do
73
+ socket = ZeroMQTransport.context.socket(ZMQ::XREP)
74
+ poller = ZeroMQ::Poller.new
75
+ poller.register_readable socket
76
+ socket.setsockopt ZMQ::LINGER, ZeroMQTransport.linger
77
+ socket.bind @endpoint
78
+
79
+ (enqueue_request socket while poller.poll(1) > 0) while @running
80
+
81
+ socket.close
82
+ end
83
+ end
84
+
85
+ def start_worker
86
+ Concurrent::SingleThreadExecutor.new.post do
87
+ respond_to_request @work_queue.pop while @running
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -1,7 +1,5 @@
1
- require 'aggro/nanomsg_transport/subscribe'
2
-
3
1
  module Aggro
4
- module NanomsgTransport
2
+ module ZeroMQTransport
5
3
  # Public: Handles subscribing to messages on a given endpoint.
6
4
  class Subscriber
7
5
  class SubscriberAlreadyRunning < RuntimeError; end
@@ -12,17 +10,12 @@ module Aggro
12
10
  @callable = block_given? ? block : callable
13
11
  @endpoint = endpoint
14
12
  @mutex = Mutex.new
15
- @selector = NIO::Selector.new
16
-
17
- ObjectSpace.define_finalizer self, method(:stop)
18
13
  end
19
14
 
20
15
  def add_subscription(topic)
21
- start unless @running
16
+ start unless @mutex.synchronize { @running }
22
17
 
23
- @mutex.synchronize do
24
- sub_socket.add_subscription(topic)
25
- end
18
+ @mutex.synchronize { sub_socket.setsockopt ZMQ::SUBSCRIBE, topic }
26
19
 
27
20
  self
28
21
  end
@@ -31,10 +24,10 @@ module Aggro
31
24
  @mutex.synchronize do
32
25
  return self if @running
33
26
 
34
- @running = true
27
+ sub_socket
35
28
  start_on_thread
36
29
 
37
- sleep 0.01 while @selector.empty?
30
+ sleep 0.01 until @running
38
31
  end
39
32
 
40
33
  self
@@ -45,9 +38,6 @@ module Aggro
45
38
  return self unless @running
46
39
 
47
40
  @running = false
48
- @selector.wakeup
49
-
50
- sleep 0.01 until @selector.empty?
51
41
  end
52
42
 
53
43
  self
@@ -56,24 +46,33 @@ module Aggro
56
46
  private
57
47
 
58
48
  def handle_message
59
- message = sub_socket.recv_msg
60
- @callable.call(message) if message
49
+ message = ''
50
+ sub_socket.recv_string message
51
+
52
+ @callable.call message if message.present?
61
53
  end
62
54
 
63
55
  def sub_socket
64
- @sub_socket ||= Subscribe.new(@endpoint)
56
+ @sub_socket ||= begin
57
+ socket = ZeroMQTransport.context.socket(ZMQ::SUB)
58
+ socket.connect @endpoint
59
+
60
+ socket
61
+ end
65
62
  end
66
63
 
67
64
  def start_on_thread
68
65
  Concurrent::SingleThreadExecutor.new.post do
69
- io = IO.new(sub_socket.recv_fd, 'rb', autoclose: false)
70
- @selector.register io, :r
66
+ poller = ZeroMQ::Poller.new
67
+ poller.register_readable sub_socket
68
+
69
+ @running = true
70
+
71
+ (handle_message while poller.poll(1) > 0) while @running
71
72
 
72
- @selector.select { handle_message } while @running
73
+ poller.deregister_readable sub_socket
73
74
 
74
- @selector.deregister io
75
- io.close
76
- sub_socket.terminate
75
+ sub_socket.close
77
76
  @sub_socket = nil
78
77
  end
79
78
  end
@@ -5,7 +5,7 @@ RSpec.describe EventSerializer do
5
5
  it 'should convert a hash to some serialized form' do
6
6
  serialized = EventSerializer.serialize event
7
7
 
8
- expect(serialized).to be_a String
8
+ expect(serialized).to be_a Array
9
9
  end
10
10
  end
11
11
 
@@ -4,7 +4,8 @@ RSpec.describe FileStore::Reader do
4
4
  let(:data) { { one: 9000, two: 'pizza', three: ['foo', 123] } }
5
5
  let(:existing_event) { Event.new :tested_pizza, Time.new(2014), data }
6
6
 
7
- let(:data_content) { EventSerializer.serialize(existing_event) }
7
+ let(:raw_content) { EventSerializer.serialize(existing_event) }
8
+ let(:data_content) { Marshal.dump raw_content }
8
9
  let(:index_content) { Marshal.dump data_content.bytesize }
9
10
 
10
11
  let(:data_io) { StringIO.new(data_content, 'rb') }
@@ -26,13 +26,14 @@ RSpec.describe FileStore::Writer do
26
26
  writer.write(events)
27
27
 
28
28
  index_io.rewind
29
- offsets = ObjectStream.new(index_io, type: 'marshal').to_a
29
+ offsets = MarshalStream.new(index_io).to_a
30
30
  expect(offsets.length).to eq 2
31
31
  end
32
32
 
33
33
  context 'when files already contain data' do
34
34
  let(:existing_event) { Event.new 'tested_pizza', Time.new(2014), data }
35
- let(:data_content) { EventSerializer.serialize(existing_event) }
35
+ let(:raw_content) { EventSerializer.serialize(existing_event) }
36
+ let(:data_content) { Marshal.dump raw_content }
36
37
  let(:index_content) { Marshal.dump data_content.bytesize }
37
38
 
38
39
  it 'should write event data to the data file' do
@@ -46,7 +47,7 @@ RSpec.describe FileStore::Writer do
46
47
  writer.write(events)
47
48
 
48
49
  index_io.rewind
49
- offsets = ObjectStream.new(index_io, type: 'marshal').to_a
50
+ offsets = MarshalStream.new(index_io).to_a
50
51
  expect(offsets.length).to eq 3
51
52
  end
52
53
 
@@ -54,12 +55,14 @@ RSpec.describe FileStore::Writer do
54
55
  writer.write(events)
55
56
 
56
57
  index_io.rewind
57
- offsets = ObjectStream.new(index_io, type: 'marshal').to_a
58
+ offsets = MarshalStream.new(index_io).to_a
58
59
 
59
60
  expect do
60
- EventSerializer.deserialize data_content[0...(offsets[0])]
61
- EventSerializer.deserialize data_content[offsets[0]...offsets[1]]
62
- EventSerializer.deserialize data_content[offsets[1]...offsets[2]]
61
+ [
62
+ data_content[0...(offsets[0])],
63
+ data_content[offsets[0]...offsets[1]],
64
+ data_content[offsets[1]...offsets[2]]
65
+ ].each { |data| EventSerializer.deserialize Marshal.load(data) }
63
66
  end.to_not raise_error
64
67
  end
65
68
  end
@@ -20,7 +20,7 @@ RSpec.describe LocalNode do
20
20
  end
21
21
 
22
22
  it 'should have a local TCP endpoint with the correct port' do
23
- expect(node.endpoint).to eq 'tcp://127.0.0.1:6000'
23
+ expect(node.endpoint).to eq 'tcp://*:6000'
24
24
  end
25
25
  end
26
26
 
@@ -30,7 +30,7 @@ RSpec.describe LocalNode do
30
30
  end
31
31
 
32
32
  it 'should have a local TCP endpoint with the correct port' do
33
- expect(node.publisher_endpoint).to eq 'tcp://127.0.0.1:7000'
33
+ expect(node.publisher_endpoint).to eq 'tcp://*:7000'
34
34
  end
35
35
  end
36
36
 
@@ -0,0 +1,17 @@
1
+ RSpec.describe MarshalStream do
2
+ let(:objects) { [1, :test, 'test'] }
3
+ let(:io) { StringIO.new }
4
+
5
+ describe '#each' do
6
+ it 'should work as expected' do
7
+ stream = MarshalStream.new(io).write(*objects)
8
+
9
+ io.rewind
10
+ result = stream.each.to_a
11
+
12
+ expect(result[0]).to eq 1
13
+ expect(result[1]).to eq :test
14
+ expect(result[2]).to eq 'test'
15
+ end
16
+ end
17
+ end
@@ -3,13 +3,14 @@ RSpec.describe Message::Events do
3
3
 
4
4
  let(:id) { SecureRandom.uuid }
5
5
 
6
- let(:event1) { Event.new :tested_pizza, Time.new, foo: 'bar' }
7
- let(:event2) { Event.new :tested_system, Time.new, bar: 'foo' }
6
+ let(:event1) { Event.new :tested_pizza, Time.now.round, foo: 'bar' }
7
+ let(:event2) { Event.new :tested_system, Time.now.round, bar: 'foo' }
8
8
  let(:events) { [event1, event2] }
9
9
 
10
10
  let(:binary_events) do
11
- events.map { |event| EventSerializer.serialize event }.join
11
+ events.map { |event| Marshal.dump EventSerializer.serialize event }.join
12
12
  end
13
+
13
14
  let(:string) { EVENTS_TYPE_CODE + id + binary_events }
14
15
 
15
16
  let(:message) { Message::Events.new(id, events) }
@@ -1,5 +1,5 @@
1
1
  RSpec.describe Node do
2
- subject(:node) { Node.new('flashing-sparkle') }
2
+ subject(:node) { Node.new('flashing-sparkle', 'tcp://127.0.0.1:5000') }
3
3
 
4
4
  describe '#client' do
5
5
  it 'should return a client for the node using the current transport' do
@@ -10,10 +10,10 @@ RSpec.describe Node do
10
10
  describe '#publisher_endpoint' do
11
11
  context 'node returns an Endpoint message' do
12
12
  it 'should ask the node for the publisher endpoint' do
13
- endpoint = Message::Endpoint.new('endpoint')
13
+ endpoint = Message::Endpoint.new('tcp://*:8000')
14
14
  allow(node).to receive(:client).and_return(double post: endpoint)
15
15
 
16
- expect(node.publisher_endpoint).to eq 'endpoint'
16
+ expect(node.publisher_endpoint).to eq 'tcp://127.0.0.1:8000'
17
17
  end
18
18
  end
19
19
 
@@ -8,7 +8,9 @@ RSpec.describe Subscription do
8
8
 
9
9
  let(:correlation_id) { SecureRandom.uuid }
10
10
  let(:details) { { name: 'Sebastian', correlation_id: correlation_id } }
11
- let(:event) { double(name: 'added_contact', details: details) }
11
+ let(:event) do
12
+ double(name: 'added_contact', details: details, occured_at: Time.now)
13
+ end
12
14
 
13
15
  let(:invokr) { spy }
14
16
  before { stub_const 'Invokr', invokr }
@@ -22,7 +24,7 @@ RSpec.describe Subscription do
22
24
  subscription.handle_event event
23
25
 
24
26
  expect(invokr).to have_received(:invoke).with \
25
- on: subscriber, method: 'test_added_contact', using: details
27
+ on: subscriber, method: 'test_added_contact', using: Hash
26
28
  end
27
29
  end
28
30
 
@@ -1,26 +1,28 @@
1
- RSpec.describe NanomsgTransport do
2
- let(:host) { 'tcp://127.0.0.1:7250' }
1
+ RSpec.describe ZeroMQTransport do
3
2
  let(:message) { SecureRandom.hex }
4
3
 
5
- xit 'should work for REQREP' do
6
- server = NanomsgTransport.server(host) { |rec| @rec = rec }.start
7
- client = NanomsgTransport.client host
4
+ it 'should work for REQREP' do
5
+ server = ZeroMQTransport.server('tcp://*:7250') { |rec| @rec = rec }.start
6
+ client = ZeroMQTransport.client 'tcp://localhost:7250'
8
7
 
9
8
  client.post message
10
9
 
11
10
  server.stop
12
11
  client.close_socket
13
12
 
13
+ sleep 0.1
14
+
14
15
  expect(@rec).to eq message
15
16
  end
16
17
 
17
18
  it 'should work for PUBSUB' do
18
- publisher = NanomsgTransport.publisher(host)
19
+ publisher = ZeroMQTransport.publisher('tcp://*:7350')
19
20
  publisher.open_socket
20
21
 
21
22
  @reced = []
22
23
 
23
- subscriber = NanomsgTransport.subscriber(host) { |rec| @reced << rec }
24
+ host = 'tcp://localhost:7350'
25
+ subscriber = ZeroMQTransport.subscriber(host) { |rec| @reced << rec }
24
26
  subscriber.add_subscription('foo').start
25
27
 
26
28
  sleep 0.1
@@ -28,6 +30,8 @@ RSpec.describe NanomsgTransport do
28
30
  publisher.publish 'foobar'
29
31
  publisher.publish 'bazbar'
30
32
 
33
+ sleep 0.1
34
+
31
35
  publisher.close_socket
32
36
  subscriber.stop
33
37
 
@@ -16,7 +16,6 @@ RSpec.configure do |config|
16
16
  end
17
17
 
18
18
  config.before(:each) do
19
- Aggro.reset
20
19
  FileUtils.mkdir_p './tmp/test'
21
20
  Aggro.data_dir = './tmp/test'
22
21
  end
@@ -24,11 +23,19 @@ RSpec.configure do |config|
24
23
  config.after(:each) do
25
24
  FileUtils.rm_r './tmp/test' if File.exist? './tmp/test'
26
25
  Thread.current[:aggro_context] = nil
26
+ Aggro.reset unless Aggro.is_a? RSpec::Mocks::Double
27
+ end
28
+
29
+ config.after(:suite) do
30
+ Aggro.reset
31
+ Aggro.transport.teardown
27
32
  end
28
33
  end
29
34
 
30
35
  require 'aggro'
31
36
 
37
+ Aggro.transport.linger = 0
38
+
32
39
  Aggro.constants.each do |const|
33
40
  eval "#{const} = Aggro::#{const}"
34
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aggro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Edwards
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-08 00:00:00.000000000 Z
11
+ date: 2015-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -151,35 +151,7 @@ dependencies:
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
- name: nio4r
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :runtime
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: nn-core
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '0'
174
- type: :runtime
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: object-stream
154
+ name: zeromqrb
183
155
  requirement: !ruby/object:Gem::Requirement
184
156
  requirements:
185
157
  - - ">="
@@ -210,7 +182,6 @@ files:
210
182
  - Rakefile
211
183
  - aggro.gemspec
212
184
  - lib/aggro.rb
213
- - lib/aggro/abstract_store.rb
214
185
  - lib/aggro/aggregate.rb
215
186
  - lib/aggro/aggregate_ref.rb
216
187
  - lib/aggro/attribute_dsl.rb
@@ -235,6 +206,8 @@ files:
235
206
  - lib/aggro/handler/start_saga.rb
236
207
  - lib/aggro/local_node.rb
237
208
  - lib/aggro/locator.rb
209
+ - lib/aggro/logging.rb
210
+ - lib/aggro/marshal_stream.rb
238
211
  - lib/aggro/message/ask.rb
239
212
  - lib/aggro/message/command.rb
240
213
  - lib/aggro/message/create_aggregate.rb
@@ -247,24 +220,13 @@ files:
247
220
  - lib/aggro/message/publisher_endpoint_inquiry.rb
248
221
  - lib/aggro/message/query.rb
249
222
  - lib/aggro/message/result.rb
223
+ - lib/aggro/message/server_error.rb
250
224
  - lib/aggro/message/start_saga.rb
251
225
  - lib/aggro/message/unhandled_operation.rb
252
226
  - lib/aggro/message/unknown_operation.rb
253
227
  - lib/aggro/message_parser.rb
254
228
  - lib/aggro/message_router.rb
255
229
  - lib/aggro/nanomsg_transport.rb
256
- - lib/aggro/nanomsg_transport/client.rb
257
- - lib/aggro/nanomsg_transport/connection.rb
258
- - lib/aggro/nanomsg_transport/publish.rb
259
- - lib/aggro/nanomsg_transport/publisher.rb
260
- - lib/aggro/nanomsg_transport/raw_reply.rb
261
- - lib/aggro/nanomsg_transport/raw_request.rb
262
- - lib/aggro/nanomsg_transport/reply.rb
263
- - lib/aggro/nanomsg_transport/request.rb
264
- - lib/aggro/nanomsg_transport/server.rb
265
- - lib/aggro/nanomsg_transport/socket_error.rb
266
- - lib/aggro/nanomsg_transport/subscribe.rb
267
- - lib/aggro/nanomsg_transport/subscriber.rb
268
230
  - lib/aggro/node.rb
269
231
  - lib/aggro/node_list.rb
270
232
  - lib/aggro/projection.rb
@@ -277,15 +239,21 @@ files:
277
239
  - lib/aggro/subscriber.rb
278
240
  - lib/aggro/subscription.rb
279
241
  - lib/aggro/transform/boolean.rb
242
+ - lib/aggro/transform/date.rb
280
243
  - lib/aggro/transform/email.rb
281
244
  - lib/aggro/transform/id.rb
282
245
  - lib/aggro/transform/integer.rb
283
246
  - lib/aggro/transform/money.rb
284
247
  - lib/aggro/transform/noop.rb
285
248
  - lib/aggro/transform/string.rb
249
+ - lib/aggro/transform/time.rb
286
250
  - lib/aggro/transform/time_interval.rb
287
251
  - lib/aggro/version.rb
288
- - spec/lib/aggro/abstract_store_spec.rb
252
+ - lib/aggro/zeromq_transport.rb
253
+ - lib/aggro/zeromq_transport/client.rb
254
+ - lib/aggro/zeromq_transport/publisher.rb
255
+ - lib/aggro/zeromq_transport/server.rb
256
+ - lib/aggro/zeromq_transport/subscriber.rb
289
257
  - spec/lib/aggro/aggregate_ref_spec.rb
290
258
  - spec/lib/aggro/aggregate_spec.rb
291
259
  - spec/lib/aggro/channel_spec.rb
@@ -305,6 +273,7 @@ files:
305
273
  - spec/lib/aggro/handler/start_saga_spec.rb
306
274
  - spec/lib/aggro/local_node_spec.rb
307
275
  - spec/lib/aggro/locator_spec.rb
276
+ - spec/lib/aggro/marshal_stream_spec.rb
308
277
  - spec/lib/aggro/message/ask_spec.rb
309
278
  - spec/lib/aggro/message/command_spec.rb
310
279
  - spec/lib/aggro/message/create_aggregate_spec.rb
@@ -321,8 +290,6 @@ files:
321
290
  - spec/lib/aggro/message/unknown_operation_spec.rb
322
291
  - spec/lib/aggro/message_parser_spec.rb
323
292
  - spec/lib/aggro/message_router_spec.rb
324
- - spec/lib/aggro/nanomsg_transport/socket_error_spec.rb
325
- - spec/lib/aggro/nanomsg_transport_spec.rb
326
293
  - spec/lib/aggro/node_list_spec.rb
327
294
  - spec/lib/aggro/node_spec.rb
328
295
  - spec/lib/aggro/projection_spec.rb
@@ -340,6 +307,7 @@ files:
340
307
  - spec/lib/aggro/transform/money_spec.rb
341
308
  - spec/lib/aggro/transform/string_spec.rb
342
309
  - spec/lib/aggro/transform/time_interval_spec.rb
310
+ - spec/lib/aggro/zeromq_transport_spec.rb
343
311
  - spec/lib/aggro_spec.rb
344
312
  - spec/spec_helper.rb
345
313
  homepage: ''
@@ -367,7 +335,6 @@ signing_key:
367
335
  specification_version: 4
368
336
  summary: Distributed in-memory event-store.
369
337
  test_files:
370
- - spec/lib/aggro/abstract_store_spec.rb
371
338
  - spec/lib/aggro/aggregate_ref_spec.rb
372
339
  - spec/lib/aggro/aggregate_spec.rb
373
340
  - spec/lib/aggro/channel_spec.rb
@@ -387,6 +354,7 @@ test_files:
387
354
  - spec/lib/aggro/handler/start_saga_spec.rb
388
355
  - spec/lib/aggro/local_node_spec.rb
389
356
  - spec/lib/aggro/locator_spec.rb
357
+ - spec/lib/aggro/marshal_stream_spec.rb
390
358
  - spec/lib/aggro/message/ask_spec.rb
391
359
  - spec/lib/aggro/message/command_spec.rb
392
360
  - spec/lib/aggro/message/create_aggregate_spec.rb
@@ -403,8 +371,6 @@ test_files:
403
371
  - spec/lib/aggro/message/unknown_operation_spec.rb
404
372
  - spec/lib/aggro/message_parser_spec.rb
405
373
  - spec/lib/aggro/message_router_spec.rb
406
- - spec/lib/aggro/nanomsg_transport/socket_error_spec.rb
407
- - spec/lib/aggro/nanomsg_transport_spec.rb
408
374
  - spec/lib/aggro/node_list_spec.rb
409
375
  - spec/lib/aggro/node_spec.rb
410
376
  - spec/lib/aggro/projection_spec.rb
@@ -422,5 +388,6 @@ test_files:
422
388
  - spec/lib/aggro/transform/money_spec.rb
423
389
  - spec/lib/aggro/transform/string_spec.rb
424
390
  - spec/lib/aggro/transform/time_interval_spec.rb
391
+ - spec/lib/aggro/zeromq_transport_spec.rb
425
392
  - spec/lib/aggro_spec.rb
426
393
  - spec/spec_helper.rb