chickadee 2.0.0 → 3.0.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 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