chickadee 2.0.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 944c2383c13fa3a2189cff7c067510996b817ca4
4
- data.tar.gz: 3118a4d81f007d03b537d7e9ec066ed03f65e6cd
3
+ metadata.gz: 0c871897239bb45e6e02e54b6eb1d12685cc0f2d
4
+ data.tar.gz: 58f8f9827a25bdf7de346254a4d3753be532b2cd
5
5
  SHA512:
6
- metadata.gz: 008659b0df9454eed991171ec0d6d92e1475c0fe961d7b8b0f2026f5812dbb9c5f90507cd782415451d3f55a5282a95fbf83b3b1c630eadf03477482e8b1ef42
7
- data.tar.gz: 30594d643d70eb744a9b32a2e7db927be221f984f0b14edfe04180d80e96c71be2a5461cd290ea074e7621a47260aefb2fc0d02d71753ab5392edde71499f1e4
6
+ metadata.gz: bdd719125dd3d7dd02c80475da5ea912d5e1ece40a473a505438af97343721cd4c564823a93502e154d015fc062aaed6ef5e34ea1ba3b160c55eb84ecb491e14
7
+ data.tar.gz: 0de3dc3407af9782b8a310e27ecc3678422c8dd50e6f743f5d1c9cfd5b74b99b0ecf2aa54da3003fa8596c5b64bead96c97cb811f9a34ab99c0c1ed44045a28b
data/chickadee.gemspec CHANGED
@@ -22,6 +22,6 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
25
- spec.add_development_dependency "mocha", "~> 0.14.0"
25
+ spec.add_development_dependency "mocha", "~> 1.0.0"
26
26
  spec.add_development_dependency "guard-minitest", "~> 2.2.0"
27
27
  end
@@ -9,28 +9,26 @@ module Chickadee
9
9
 
10
10
  def initialize
11
11
  @container = Container.new
12
- @request_dispatcher = RequestDispatcher.new(@container)
13
- @container.register(:event_dispatcher, @request_dispatcher.event_dispatcher, :as => :instance)
12
+ @request_map = {}
14
13
  end
15
14
 
16
15
  def register(*args)
17
16
  @container.register(*args)
18
17
  end
19
18
 
20
- def command(request_class, *handlers)
21
- @request_dispatcher.map(:command, request_class, *handlers)
19
+ def map(request_class, *handlers)
20
+ raise(DispatcherError, "Request already mapped: #{request_class}") if @request_map.key?(request_class)
21
+ @request_map[request_class] = Proc.new{|req| resolve_handler_chain(*handlers).handle(req)}
22
22
  end
23
23
 
24
- def event(request_class, *handlers)
25
- @request_dispatcher.map(:event, request_class, *handlers)
24
+ def execute(request)
25
+ @request_map[request.class].call(request)
26
26
  end
27
27
 
28
- def query(request_class, *handlers)
29
- @request_dispatcher.map(:query, request_class, *handlers)
30
- end
28
+ private
31
29
 
32
- def dispatch(request)
33
- @request_dispatcher.dispatch(request)
30
+ def resolve_handler_chain(*handlers)
31
+ @container.resolve_anonymous(HandlerChainStruct.new(*handlers))
34
32
  end
35
33
  end
36
34
  end
@@ -1,3 +1,3 @@
1
1
  module Chickadee
2
- VERSION = "2.0.0"
2
+ VERSION = "3.0.0"
3
3
  end
data/lib/chickadee.rb CHANGED
@@ -3,12 +3,6 @@ require 'chickadee/version'
3
3
  require 'chickadee/exceptions'
4
4
  require 'chickadee/container'
5
5
  require 'chickadee/handler_chain_struct'
6
- require 'chickadee/message_bus'
7
- require 'chickadee/dispatchers/abstract_dispatcher'
8
- require 'chickadee/dispatchers/event_dispatcher'
9
- require 'chickadee/dispatchers/command_dispatcher'
10
- require 'chickadee/dispatchers/query_dispatcher'
11
- require 'chickadee/dispatchers/request_dispatcher'
12
6
  require 'chickadee/dispatcher'
13
7
 
14
8
  module Chickadee
@@ -2,41 +2,15 @@ require 'spec_helper'
2
2
  require 'chickadee'
3
3
 
4
4
  describe Chickadee::Dispatcher do
5
- it 'can dispatch a command' do
5
+ it 'can dispatch a request' do
6
6
  handler = stub(:handle => 'handler response')
7
- command_class = Class.new
8
- command = command_class.new
7
+ request_class = Class.new
8
+ request = request_class.new
9
9
  dispatcher = new_dispatcher
10
10
 
11
11
  dispatcher.register(:handler, handler, :as => :instance)
12
- dispatcher.command(command_class, :handler)
13
-
14
- handler.expects(:handle).once
15
- dispatcher.dispatch(command).must_be_nil
16
- end
17
-
18
- it 'can dispatch a query' do
19
- handler = stub(:handle => 'handler response')
20
- query_class = Class.new
21
- query = query_class.new
22
- dispatcher = new_dispatcher
23
-
24
- dispatcher.register(:handler, handler, :as => :instance)
25
- dispatcher.query(query_class, :handler)
26
- dispatcher.dispatch(query).must_equal('handler response')
27
- end
28
-
29
- it 'can dispatch an event' do
30
- handler = stub(:handle => 'handler response')
31
- event_class = Class.new
32
- event = event_class.new
33
- dispatcher = new_dispatcher
34
-
35
- dispatcher.register(:handler, handler, :as => :instance)
36
- dispatcher.event(event_class, :handler)
37
-
38
- handler.expects(:handle).once
39
- dispatcher.dispatch(event).must_be_nil
12
+ dispatcher.map(request_class, :handler)
13
+ dispatcher.execute(request).must_equal('handler response')
40
14
  end
41
15
 
42
16
  def new_dispatcher
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chickadee
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Lott
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-27 00:00:00.000000000 Z
11
+ date: 2014-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ioc
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.14.0
61
+ version: 1.0.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.14.0
68
+ version: 1.0.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: guard-minitest
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -97,21 +97,11 @@ files:
97
97
  - lib/chickadee.rb
98
98
  - lib/chickadee/container.rb
99
99
  - lib/chickadee/dispatcher.rb
100
- - lib/chickadee/dispatchers/abstract_dispatcher.rb
101
- - lib/chickadee/dispatchers/command_dispatcher.rb
102
- - lib/chickadee/dispatchers/event_dispatcher.rb
103
- - lib/chickadee/dispatchers/query_dispatcher.rb
104
- - lib/chickadee/dispatchers/request_dispatcher.rb
105
100
  - lib/chickadee/exceptions.rb
106
101
  - lib/chickadee/handler_chain_struct.rb
107
- - lib/chickadee/message_bus.rb
108
102
  - lib/chickadee/version.rb
109
103
  - spec/dispatcher_spec.rb
110
- - spec/dispatchers/command_dispatcher_spec.rb
111
- - spec/dispatchers/event_dispatcher_spec.rb
112
- - spec/dispatchers/query_dispatcher_spec.rb
113
104
  - spec/handler_chain_struct_spec.rb
114
- - spec/message_bus_spec.rb
115
105
  - spec/spec_helper.rb
116
106
  homepage: ''
117
107
  licenses:
@@ -139,9 +129,5 @@ specification_version: 4
139
129
  summary: Lightweight domain driven design library
140
130
  test_files:
141
131
  - spec/dispatcher_spec.rb
142
- - spec/dispatchers/command_dispatcher_spec.rb
143
- - spec/dispatchers/event_dispatcher_spec.rb
144
- - spec/dispatchers/query_dispatcher_spec.rb
145
132
  - spec/handler_chain_struct_spec.rb
146
- - spec/message_bus_spec.rb
147
133
  - spec/spec_helper.rb
@@ -1,21 +0,0 @@
1
- module Chickadee
2
- class AbstractDispatcher
3
- def initialize(container)
4
- @container = container
5
- end
6
-
7
- def map(request_key, *handlers)
8
- raise(NotImplementedError)
9
- end
10
-
11
- def dispatch(request)
12
- raise(NotImplementedError)
13
- end
14
-
15
- private
16
-
17
- def resolve_handler_chain(*handlers)
18
- @container.resolve_anonymous(HandlerChainStruct.new(*handlers))
19
- end
20
- end
21
- end
@@ -1,19 +0,0 @@
1
- module Chickadee
2
- class CommandDispatcher < AbstractDispatcher
3
- def map(request_key, *handlers)
4
- raise(DispatcherError, "Command already mapped: #{request_key}") if bus.topic_exists?(request_key)
5
- bus.subscribe(request_key) {|req| resolve_handler_chain(*handlers).handle(req)}
6
- end
7
-
8
- def dispatch(request)
9
- bus.publish(request.class, request)
10
- nil
11
- end
12
-
13
- private
14
-
15
- def bus
16
- @bus ||= MessageBus.new
17
- end
18
- end
19
- end
@@ -1,22 +0,0 @@
1
- module Chickadee
2
- class EventDispatcher < AbstractDispatcher
3
- def map(request_key, *handlers)
4
- bus.subscribe(request_key) {|req| resolve_handler_chain(*handlers).handle(req)}
5
- end
6
-
7
- def dispatch(request)
8
- bus.publish(request.class, request)
9
- nil
10
- end
11
-
12
- def raise(*args)
13
- dispatch(*args)
14
- end
15
-
16
- private
17
-
18
- def bus
19
- @bus ||= MessageBus.new
20
- end
21
- end
22
- end
@@ -1,18 +0,0 @@
1
- module Chickadee
2
- class QueryDispatcher < AbstractDispatcher
3
- def map(request_key, *handlers)
4
- raise(DispatcherError, "Query already mapped: #{request_key}") if cache.key?(request_key)
5
- cache[request_key] = Proc.new{|req| resolve_handler_chain(*handlers).handle(req)}
6
- end
7
-
8
- def dispatch(request)
9
- cache[request.class].call(request)
10
- end
11
-
12
- private
13
-
14
- def cache
15
- @cache ||= {}
16
- end
17
- end
18
- end
@@ -1,24 +0,0 @@
1
- module Chickadee
2
- class RequestDispatcher
3
-
4
- attr_reader :command_dispatcher, :query_dispatcher, :event_dispatcher
5
-
6
- def initialize(container)
7
- @command_dispatcher = CommandDispatcher.new(container)
8
- @query_dispatcher = QueryDispatcher.new(container)
9
- @event_dispatcher = EventDispatcher.new(container)
10
- @request_dispatcher_map = {}
11
- end
12
-
13
- def map(request_type, request_class, *handlers)
14
- dispatcher = instance_variable_get("@#{request_type}_dispatcher")
15
- @request_dispatcher_map[request_class] = dispatcher
16
- dispatcher.map(request_class, *handlers)
17
- end
18
-
19
- def dispatch(request)
20
- raise(DispatcherError, "Unrecognized request type: #{request.class}") unless @request_dispatcher_map.key?(request.class)
21
- @request_dispatcher_map[request.class].dispatch(request)
22
- end
23
- end
24
- end
@@ -1,65 +0,0 @@
1
- module Chickadee
2
- class MessageBus
3
- class Topic
4
- attr_reader :subscribers
5
-
6
- def initialize
7
- @subscribers = []
8
- end
9
-
10
- def subscribe(obj)
11
- @subscribers << obj
12
- end
13
-
14
- def unsubscribe(subscriber_id)
15
- @subscribers.delete_if{|subscriber| subscriber.id == subscriber_id}
16
- end
17
- end
18
-
19
- class Subscriber
20
- attr_reader :id
21
-
22
- def initialize(id, &block)
23
- @id = id
24
- @block = block
25
- end
26
-
27
- def call(*args)
28
- @block.call(*args)
29
- end
30
- end
31
-
32
- def initialize
33
- @topics = {}
34
- @subscriber_id = -1
35
- end
36
-
37
- def subscribe(topic_key, &block)
38
- subscriber = Subscriber.new(next_subscriber_id, &block)
39
- get_topic(topic_key).subscribe(subscriber)
40
- subscriber.id
41
- end
42
-
43
- def unsubscribe(subscriber_id)
44
- @topics.each {|topic_key, topic| topic.unsubscribe(subscriber_id)}
45
- end
46
-
47
- def publish(topic_key, *args)
48
- get_topic(topic_key).subscribers.each {|s| s.call(*args)}
49
- end
50
-
51
- def topic_exists?(key)
52
- @topics.keys.include?(key)
53
- end
54
-
55
- private
56
-
57
- def get_topic(topic_key)
58
- @topics[topic_key] ||= Topic.new
59
- end
60
-
61
- def next_subscriber_id
62
- @subscriber_id = @subscriber_id + 1
63
- end
64
- end
65
- end
@@ -1,53 +0,0 @@
1
- require 'spec_helper'
2
- require 'chickadee'
3
-
4
- describe Chickadee::CommandDispatcher do
5
- it 'can map handler chain to request' do
6
- container = define_container
7
- dispatcher = define_dispatcher(container)
8
- command_class = Class.new
9
- command = command_class.new
10
- handler1 = stub(:handle => 'handler1_response')
11
- handler2 = stub(:handle => 'handler2_response')
12
-
13
- container.register(:myhandler1, handler1, :as => :instance)
14
- container.register(:myhandler2, handler2, :as => :instance)
15
-
16
- dispatcher.map(command_class, :myhandler1, :myhandler2)
17
-
18
- handler1.expects(:handle).once
19
- handler2.expects(:handle).once
20
- dispatcher.dispatch(command)
21
- end
22
-
23
- it 'complains if same command mapped twice' do
24
- container = define_container
25
- dispatcher = define_dispatcher(container)
26
- command_class = Class.new
27
- command = command_class.new
28
-
29
- dispatcher.map(command_class, stub)
30
- proc{ dispatcher.map(command_class, stub) }.must_raise(Chickadee::DispatcherError)
31
- end
32
-
33
- it 'returns nothing' do
34
- container = define_container
35
- dispatcher = define_dispatcher(container)
36
- command_class = Class.new
37
- command = command_class.new
38
- handler1 = stub(:handle => 'handler1_response')
39
-
40
- container.register(:myhandler1, handler1, :as => :instance)
41
-
42
- dispatcher.map(command_class, :myhandler1)
43
- dispatcher.dispatch(command).must_be_nil
44
- end
45
-
46
- def define_container
47
- Chickadee::Container.new
48
- end
49
-
50
- def define_dispatcher(*args)
51
- Chickadee::CommandDispatcher.new(*args)
52
- end
53
- end
@@ -1,70 +0,0 @@
1
- require 'spec_helper'
2
- require 'chickadee'
3
-
4
- describe Chickadee::EventDispatcher do
5
- it 'can map handler chain to request' do
6
- container = define_container
7
- dispatcher = define_dispatcher(container)
8
- event_class = Class.new
9
- event = event_class.new
10
-
11
- handler1 = stub(:handle => 'handler1_response')
12
- handler2 = stub(:handle => 'handler2_response')
13
-
14
- container.register(:myhandler1, handler1, :as => :instance)
15
- container.register(:myhandler2, handler2, :as => :instance)
16
-
17
- dispatcher.map(event_class, :myhandler1, :myhandler2)
18
-
19
- handler1.expects(:handle).once
20
- handler2.expects(:handle).once
21
- dispatcher.dispatch(event)
22
- end
23
-
24
- it 'can map multiple handler chains to request' do
25
- container = define_container
26
- dispatcher = define_dispatcher(container)
27
- event_class = Class.new
28
- event = event_class.new
29
- handler1 = stub(:handle => 'handler1_response')
30
- handler2 = stub(:handle => 'handler2_response')
31
- handler3 = stub(:handle => 'handler3_response')
32
- handler4 = stub(:handle => 'handler4_response')
33
-
34
- container.register(:myhandler1, handler1, :as => :instance)
35
- container.register(:myhandler2, handler2, :as => :instance)
36
- container.register(:myhandler3, handler3, :as => :instance)
37
- container.register(:myhandler4, handler4, :as => :instance)
38
-
39
- dispatcher.map(event_class, :myhandler1, :myhandler2)
40
- dispatcher.map(event_class, :myhandler3, :myhandler4)
41
-
42
- handler1.expects(:handle).once
43
- handler2.expects(:handle).once
44
- handler3.expects(:handle).once
45
- handler4.expects(:handle).once
46
- dispatcher.dispatch(event)
47
- end
48
-
49
- it 'returns nothing' do
50
- container = define_container
51
- dispatcher = define_dispatcher(container)
52
- event_class = Class.new
53
- event = event_class.new
54
- handler1 = stub(:handle => 'handler1_response')
55
-
56
- container.register(:myhandler1, handler1, :as => :instance)
57
-
58
- dispatcher.map(event_class, :myhandler1)
59
- dispatcher.dispatch(event).must_be_nil
60
- end
61
-
62
-
63
- def define_container
64
- Chickadee::Container.new
65
- end
66
-
67
- def define_dispatcher(*args)
68
- Chickadee::EventDispatcher.new(*args)
69
- end
70
- end
@@ -1,56 +0,0 @@
1
- require 'spec_helper'
2
- require 'chickadee'
3
-
4
- describe Chickadee::QueryDispatcher do
5
- it 'can map handler chain to request' do
6
- container = define_container
7
- dispatcher = define_dispatcher(container)
8
- query_class = Class.new
9
- query = query_class.new
10
- handler1 = stub(:handle => 'handler1_response')
11
- handler2 = stub(:handle => 'handler2_response')
12
-
13
- container.register(:myhandler1, handler1, :as => :instance)
14
- container.register(:myhandler2, handler2, :as => :instance)
15
-
16
- dispatcher.map(query_class, :myhandler1, :myhandler2)
17
-
18
- handler1.expects(:handle).once
19
- handler2.expects(:handle).once
20
- dispatcher.dispatch(query)
21
- end
22
-
23
- it 'complains if same query mapped twice' do
24
- container = define_container
25
- dispatcher = define_dispatcher(container)
26
- query_class = Class.new
27
- query = query_class.new
28
-
29
- dispatcher.map(query_class, stub)
30
- proc{ dispatcher.map(query_class, stub) }.must_raise(Chickadee::DispatcherError)
31
- end
32
-
33
- it 'returns output from last handler in chain' do
34
- container = define_container
35
- dispatcher = define_dispatcher(container)
36
- query_class = Class.new
37
- query = query_class.new
38
- handler1 = stub(:handle => 'handler1_response')
39
- handler2 = stub(:handle => 'handler2_response')
40
-
41
- container.register(:myhandler1, handler1, :as => :instance)
42
- container.register(:myhandler2, handler2, :as => :instance)
43
-
44
- dispatcher.map(query_class, :myhandler1, :myhandler2)
45
- dispatcher.dispatch(query).must_equal('handler2_response')
46
- end
47
-
48
-
49
- def define_container
50
- Chickadee::Container.new
51
- end
52
-
53
- def define_dispatcher(*args)
54
- Chickadee::QueryDispatcher.new(*args)
55
- end
56
- end
@@ -1,73 +0,0 @@
1
- require 'spec_helper'
2
- require 'chickadee'
3
-
4
- describe Chickadee::MessageBus do
5
- it 'can register block with bus topic' do
6
- bus = new_bus
7
-
8
- output = nil
9
-
10
- bus.subscribe("topic") do |msg|
11
- output = msg
12
- end
13
-
14
- output.must_be_nil
15
- bus.publish("topic", 'the proc was called')
16
- output.must_equal('the proc was called')
17
- end
18
-
19
- it 'can pubish a message for a given topic' do
20
- bus = new_bus
21
-
22
- output1 = nil
23
- output2 = nil
24
-
25
- bus.subscribe("topic1") { |msg| output1 = msg }
26
- bus.subscribe("topic2") { |msg| output2 = msg }
27
-
28
- bus.publish("topic1", 'message for topic1')
29
- bus.publish("topic2", 'message for topic2')
30
-
31
- output1.must_equal('message for topic1')
32
- output2.must_equal('message for topic2')
33
- end
34
-
35
- it 'can unsubscribe a listener' do
36
- bus = new_bus
37
-
38
- output = nil
39
- subscriber_id = bus.subscribe("topic") { |msg| output = msg }
40
-
41
- bus.publish("topic", 'i received the message')
42
- output.must_equal('i received the message')
43
-
44
- bus.publish("topic", 'i received the message a second time')
45
- output.must_equal('i received the message a second time')
46
-
47
- bus.unsubscribe(subscriber_id)
48
-
49
- bus.publish("topic", 'i received the message a third time')
50
- output.must_equal('i received the message a second time')
51
- end
52
-
53
- it 'can publish any number of arguments' do
54
- bus = new_bus
55
-
56
- output1 = nil
57
- output2 = nil
58
-
59
- bus.subscribe("topic") do |arg1, arg2|
60
- output1 = arg1
61
- output2 = arg2
62
- end
63
-
64
- bus.publish("topic", 'myarg1', 'myarg2')
65
-
66
- output1.must_equal('myarg1')
67
- output2.must_equal('myarg2')
68
- end
69
-
70
- def new_bus
71
- Chickadee::MessageBus.new
72
- end
73
- end