substation 0.0.4 → 0.0.5
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.
- data/Changelog.md +16 -0
- data/README.md +20 -4
- data/config/flay.yml +1 -1
- data/config/reek.yml +1 -0
- data/lib/substation/dispatcher.rb +44 -13
- data/lib/substation/version.rb +1 -1
- data/spec/unit/substation/dispatcher/action/class_methods/coerce_spec.rb +37 -22
- metadata +2 -2
data/Changelog.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
# v0.0.5 2013-05-17
|
2
|
+
|
3
|
+
* [feature] Shorter action config when no observers are needed (snusnu)
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
dispatcher = Substation::Dispatcher.coerce({
|
7
|
+
:some_use_case => App::SomeUseCase
|
8
|
+
}, env)
|
9
|
+
|
10
|
+
dispatcher = Substation::Dispatcher.coerce({
|
11
|
+
:some_use_case => Proc.new { |request| request.success(:data) }
|
12
|
+
}, env)
|
13
|
+
```
|
14
|
+
|
15
|
+
[Compare v0.0.4..v0.0.5](https://github.com/snusnu/substation/compare/v0.0.4...v0.0.5)
|
16
|
+
|
1
17
|
# v0.0.4 2013-05-15
|
2
18
|
|
3
19
|
* [changed] Bump concord dependency to ~> 0.1.0 (snusnu)
|
data/README.md
CHANGED
@@ -200,6 +200,12 @@ be found in the next paragraph.
|
|
200
200
|
An example configuration for an action without any observers:
|
201
201
|
|
202
202
|
```ruby
|
203
|
+
# short form
|
204
|
+
dispatcher = Substation::Dispatcher.coerce({
|
205
|
+
'some_use_case' => 'App::SomeUseCase'
|
206
|
+
}, env)
|
207
|
+
|
208
|
+
# long form
|
203
209
|
dispatcher = Substation::Dispatcher.coerce({
|
204
210
|
'some_use_case' => { 'action' => 'App::SomeUseCase' }
|
205
211
|
}, env)
|
@@ -232,13 +238,19 @@ dispatcher = Substation::Dispatcher.coerce({
|
|
232
238
|
|
233
239
|
The above configuration examples are tailored towards being read from a
|
234
240
|
(yaml) config file and therefore accept strings as keys and values. It's
|
235
|
-
also possible to use symbols as keys and values. Values correspond to
|
236
|
-
action or observer "handlers" and can also be given as either constants
|
237
|
-
or procs. In any case, handlers must respond to `call(object)`.
|
241
|
+
also possible to use symbols as keys (and values). Values correspond to
|
242
|
+
action or observer "handlers" and can also be given as either constants,
|
243
|
+
symbols, or procs. In any case, handlers must respond to `call(object)`.
|
238
244
|
|
239
245
|
An example configuration using symbol keys and constants for handlers:
|
240
246
|
|
241
247
|
```ruby
|
248
|
+
# short form (without observers)
|
249
|
+
dispatcher = Substation::Dispatcher.coerce({
|
250
|
+
:some_use_case => App::SomeUseCase
|
251
|
+
}, env)
|
252
|
+
|
253
|
+
# long form
|
242
254
|
dispatcher = Substation::Dispatcher.coerce({
|
243
255
|
:some_use_case => {
|
244
256
|
:action => App::SomeUseCase,
|
@@ -250,6 +262,11 @@ dispatcher = Substation::Dispatcher.coerce({
|
|
250
262
|
An example configuration using symbol keys and procs for handlers:
|
251
263
|
|
252
264
|
```ruby
|
265
|
+
# short form (without observers)
|
266
|
+
dispatcher = Substation::Dispatcher.coerce({
|
267
|
+
:some_use_case => Proc.new { |request| request.success(:data) }
|
268
|
+
}, env)
|
269
|
+
|
253
270
|
dispatcher = Substation::Dispatcher.coerce({
|
254
271
|
:some_use_case => {
|
255
272
|
:action => Proc.new { |request| request.success(:foo) },
|
@@ -258,7 +275,6 @@ dispatcher = Substation::Dispatcher.coerce({
|
|
258
275
|
}, env)
|
259
276
|
```
|
260
277
|
|
261
|
-
|
262
278
|
## Application environments
|
263
279
|
|
264
280
|
In order to provide your actions with objects typically needed during
|
data/config/flay.yml
CHANGED
data/config/reek.yml
CHANGED
@@ -15,8 +15,8 @@ module Substation
|
|
15
15
|
|
16
16
|
# Coerce the given +name+ and +config+ to an {Action} instance
|
17
17
|
#
|
18
|
-
# @param [Hash<Symbol, Object>] config
|
19
|
-
# the configuration
|
18
|
+
# @param [#call, Hash<Symbol, Object>] config
|
19
|
+
# the action configuration object
|
20
20
|
#
|
21
21
|
# @return [Action]
|
22
22
|
# the coerced instance
|
@@ -29,10 +29,17 @@ module Substation
|
|
29
29
|
#
|
30
30
|
# @api private
|
31
31
|
def self.coerce(config)
|
32
|
-
|
33
|
-
|
32
|
+
if config.respond_to?(:fetch)
|
33
|
+
action = config.fetch(:action) { raise(MissingHandlerError) }
|
34
|
+
observer = config[:observer]
|
35
|
+
else
|
36
|
+
action = config
|
37
|
+
end
|
34
38
|
|
35
|
-
|
39
|
+
action_handler = Utils.coerce_callable(action)
|
40
|
+
observer_handler = Observer.coerce(observer)
|
41
|
+
|
42
|
+
new(action_handler, observer_handler)
|
36
43
|
end
|
37
44
|
|
38
45
|
include Concord.new(:handler, :observer)
|
@@ -81,12 +88,36 @@ module Substation
|
|
81
88
|
# # do something
|
82
89
|
# end
|
83
90
|
# end
|
91
|
+
#
|
92
|
+
# class AnotherObserver
|
93
|
+
# def self.call(response)
|
94
|
+
# # do something
|
95
|
+
# end
|
96
|
+
# end
|
84
97
|
# end
|
85
98
|
#
|
86
99
|
# storage = SomeStorageAbstraction.new
|
87
100
|
# env = App::Environment.new(storage, Logger.new($stdout))
|
88
101
|
#
|
89
|
-
# @example without observers
|
102
|
+
# @example without observers (short form, symbol keys)
|
103
|
+
#
|
104
|
+
# dispatcher = Substation::Dispatcher.coerce({
|
105
|
+
# :some_use_case => App::SomeUseCase
|
106
|
+
# }, env)
|
107
|
+
#
|
108
|
+
# dispatcher = Substation::Dispatcher.coerce({
|
109
|
+
# :some_use_case => 'App::SomeUseCase'
|
110
|
+
# }, env)
|
111
|
+
#
|
112
|
+
# dispatcher = Substation::Dispatcher.coerce({
|
113
|
+
# :some_use_case => :App::SomeUseCase
|
114
|
+
# }, env)
|
115
|
+
#
|
116
|
+
# dispatcher = Substation::Dispatcher.coerce({
|
117
|
+
# :some_use_case => Proc.new { |request| request.success(:data) }
|
118
|
+
# }, env)
|
119
|
+
#
|
120
|
+
# @example without observers (long form, string keys)
|
90
121
|
#
|
91
122
|
# dispatcher = Substation::Dispatcher.coerce({
|
92
123
|
# 'some_use_case' => { 'action' => 'SomeUseCase' }
|
@@ -96,8 +127,8 @@ module Substation
|
|
96
127
|
#
|
97
128
|
# dispatcher = Substation::Dispatcher.coerce({
|
98
129
|
# 'some_use_case' => {
|
99
|
-
# 'action' => 'SomeUseCase',
|
100
|
-
# 'observer' => 'SomeObserver'
|
130
|
+
# 'action' => 'App::SomeUseCase',
|
131
|
+
# 'observer' => 'App::SomeObserver'
|
101
132
|
# }
|
102
133
|
# }, env)
|
103
134
|
#
|
@@ -105,10 +136,10 @@ module Substation
|
|
105
136
|
#
|
106
137
|
# dispatcher = Substation::Dispatcher.coerce({
|
107
138
|
# 'some_use_case' => {
|
108
|
-
# 'action' => 'SomeUseCase',
|
139
|
+
# 'action' => 'App::SomeUseCase',
|
109
140
|
# 'observer' => [
|
110
|
-
# 'SomeObserver',
|
111
|
-
# 'AnotherObserver'
|
141
|
+
# 'App::SomeObserver',
|
142
|
+
# 'App::AnotherObserver'
|
112
143
|
# ]
|
113
144
|
# }
|
114
145
|
# }, env)
|
@@ -167,8 +198,8 @@ module Substation
|
|
167
198
|
#
|
168
199
|
# @api private
|
169
200
|
def self.normalize_config(config)
|
170
|
-
Utils.symbolize_keys(config).each_with_object({}) { |(name,
|
171
|
-
actions[name] = Action.coerce(
|
201
|
+
Utils.symbolize_keys(config).each_with_object({}) { |(name, action), actions|
|
202
|
+
actions[name] = Action.coerce(action)
|
172
203
|
}
|
173
204
|
end
|
174
205
|
|
data/lib/substation/version.rb
CHANGED
@@ -9,38 +9,53 @@ describe Dispatcher::Action, '.coerce' do
|
|
9
9
|
let(:action) { Spec::Action::Success }
|
10
10
|
let(:coerced) { Dispatcher::Action.new(action, observer) }
|
11
11
|
|
12
|
-
context "when
|
12
|
+
context "when config is a hash" do
|
13
|
+
context "and coercion is possible" do
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
let(:config) {{
|
16
|
+
:action => action,
|
17
|
+
:observer => observer_value
|
18
|
+
}}
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
before do
|
21
|
+
Observer.should_receive(:coerce).with(observer_value).and_return(observer)
|
22
|
+
Utils.should_receive(:coerce_callable).with(action).and_return(action)
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'with an action and an observer' do
|
26
|
+
let(:observer_value) { observer }
|
27
|
+
let(:observer) { Spec::Observer }
|
28
|
+
|
29
|
+
it { should eql(coerced) }
|
30
|
+
end
|
23
31
|
|
24
|
-
|
25
|
-
|
26
|
-
|
32
|
+
context 'with an action and no observer' do
|
33
|
+
let(:observer_value) { nil }
|
34
|
+
let(:observer) { Observer::NULL }
|
27
35
|
|
28
|
-
|
36
|
+
it { should eql(coerced) }
|
37
|
+
end
|
29
38
|
end
|
30
39
|
|
31
|
-
context 'with
|
32
|
-
let(:
|
33
|
-
let(:observer) { Observer::NULL }
|
40
|
+
context 'with no action' do
|
41
|
+
let(:config) { {} }
|
34
42
|
|
35
|
-
|
43
|
+
specify {
|
44
|
+
expect { subject }.to raise_error(described_class::MissingHandlerError)
|
45
|
+
}
|
36
46
|
end
|
37
47
|
end
|
38
48
|
|
39
|
-
context
|
40
|
-
let(:config)
|
49
|
+
context "when config is no hash" do
|
50
|
+
let(:config) { action }
|
51
|
+
let(:observer_value) { nil }
|
52
|
+
let(:observer) { Observer::NULL }
|
53
|
+
|
54
|
+
before do
|
55
|
+
Observer.should_receive(:coerce).with(observer_value).and_return(observer)
|
56
|
+
Utils.should_receive(:coerce_callable).with(config).and_return(action)
|
57
|
+
end
|
41
58
|
|
42
|
-
|
43
|
-
expect { subject }.to raise_error(described_class::MissingHandlerError)
|
44
|
-
}
|
59
|
+
it { should eql(coerced) }
|
45
60
|
end
|
46
61
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: substation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: adamantium
|