aggro 0.0.3 → 0.0.4

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.
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