light-service 0.5.2 → 0.6.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: cce43f62b668f6fa04385c772ca0d006b9e92ca0
4
- data.tar.gz: 3d246a1c22bc6dfa9afef1c64d77c1b15b16618b
3
+ metadata.gz: 55ba3cb29c4ce4e3e59c3129bc8baf4287efe0c2
4
+ data.tar.gz: ba0a1fc827bee6a92346c886948c024753796880
5
5
  SHA512:
6
- metadata.gz: 2c00210b56fb1be0cf27ac8c415f421421902088443ed8919d48ee600f22446e8d2b007586b5a4fae553fe39e11092589face9df3950e6e638f5e1a7fa524a81
7
- data.tar.gz: 4171398c9f082dae55888485c98e7fe0d335cd0bd527c488b095921055b05659ab1495b33be899b1460839ac41783d902d43121c074276e94c8670481646dae9
6
+ metadata.gz: 64a014abda6e16cd5d1c4a62ea188b576a8878e46304f90d5768666f5e944869fc84814c250dfc986b7be67eb7c76fd736d74363171445f5401b5457704d36d4
7
+ data.tar.gz: 77d665f3fcd08eb79c598871fe1c97e6bba9e34b773fe2b083ed8001fa356c383a13fba2195157d187d84110c57fc929f0de81874de07207dfa529b821319ed2
data/README.md CHANGED
@@ -66,7 +66,7 @@ This is how the organizer and actions interact with eachother:
66
66
 
67
67
  ```ruby
68
68
  class CalculatesTax
69
- include LightService::Organizer
69
+ extend LightService::Organizer
70
70
 
71
71
  def self.for_order(order)
72
72
  with(:order => order).reduce(
@@ -78,7 +78,7 @@ class CalculatesTax
78
78
  end
79
79
 
80
80
  class LooksUpTaxPercentageAction
81
- include LightService::Action
81
+ extend LightService::Action
82
82
  expects :order
83
83
  promises :tax_percentage
84
84
 
@@ -104,7 +104,7 @@ class LooksUpTaxPercentageAction
104
104
  end
105
105
 
106
106
  class CalculatesOrderTaxAction
107
- include ::LightService::Action
107
+ extend ::LightService::Action
108
108
  expects :order, :tax_percentage
109
109
 
110
110
  executed do |context|
@@ -114,7 +114,7 @@ class CalculatesOrderTaxAction
114
114
  end
115
115
 
116
116
  class ProvidesFreeShippingAction
117
- include LightService::Action
117
+ extend LightService::Action
118
118
  expects :order
119
119
 
120
120
  executed do |context|
@@ -154,7 +154,7 @@ action is reduced. If either of them are violated, a custom exception is thrown.
154
154
  This is how it's used:
155
155
  ```ruby
156
156
  class FooAction
157
- include LightService::Action
157
+ extend LightService::Action
158
158
  expects :baz
159
159
  promises :bar
160
160
 
@@ -172,7 +172,7 @@ makes it available to you through a reader. You can refactor the action like thi
172
172
 
173
173
  ```ruby
174
174
  class FooAction
175
- include LightService::Action
175
+ extend LightService::Action
176
176
  expects :baz
177
177
  promises :bar
178
178
 
@@ -188,7 +188,7 @@ you use the accessor with the same name. The code above can be further simplifie
188
188
 
189
189
  ```ruby
190
190
  class FooAction
191
- include LightService::Action
191
+ extend LightService::Action
192
192
  expects :baz
193
193
  promises :bar
194
194
 
@@ -200,6 +200,46 @@ end
200
200
 
201
201
  Take a look at [this spec](spec/action_expects_and_promises_spec.rb) to see the refactoring in action.
202
202
 
203
+ ## Key Aliases
204
+ The `aliases` macro sets up pairs of keys and aliases in an Organizer. Actions can access the context using the aliases.
205
+
206
+ This allows you to put together existing Actions from different sources and have them work together without having to modify their code. Aliases will work with or without Action `expects`.
207
+
208
+ Say for example you have actions `AnAction` and `AnotherAction` that you've used in previous projects. `AnAction` provides `:my_key` but `AnotherAction` needs to use that value but expects `:key_alias`. You can use them together in an organizer like so:
209
+
210
+ ```ruby
211
+ class AnOrganizer
212
+ extend LightService::Organizer
213
+
214
+ aliases my_key: :key_alias
215
+
216
+ def self.for_order(order)
217
+ with(:order => order).reduce(
218
+ AnAction,
219
+ AnotherAction,
220
+ )
221
+ end
222
+ end
223
+
224
+ class AnAction
225
+ extend LightService::Action
226
+ promises :my_key
227
+
228
+ executed do |context|
229
+ context.my_key = "value"
230
+ end
231
+ end
232
+
233
+ class AnotherAction
234
+ extend LightService::Action
235
+ expects :key_alias
236
+
237
+ executed do |context|
238
+ context.key_alias # => "value"
239
+ end
240
+ end
241
+ ```
242
+
203
243
  ## Logging
204
244
 
205
245
  Enable LightService's logging to better understand what goes on within the series of actions,
@@ -266,7 +306,7 @@ Normally, when something goes wrong in your actions, you fail the process by set
266
306
 
267
307
  ```ruby
268
308
  class FooAction
269
- include LightService::Action
309
+ extend LightService::Action
270
310
 
271
311
  executed do |context|
272
312
  context.fail!("I don't like what happened here.")
@@ -280,7 +320,7 @@ or in the actions.
280
320
 
281
321
  ```ruby
282
322
  class FooAction
283
- include LightService::Action
323
+ extend LightService::Action
284
324
 
285
325
  executed do |context|
286
326
  unless (service_call.success?)
@@ -305,7 +345,7 @@ the `rolled_back` macro.
305
345
 
306
346
  ```ruby
307
347
  class SaveEntities
308
- include LightService::Action
348
+ extend LightService::Action
309
349
  expects :user
310
350
 
311
351
  executed do |context|
@@ -323,7 +363,7 @@ was triggered.
323
363
 
324
364
  ```ruby
325
365
  class CallExternalApi
326
- include LightService::Action
366
+ extend LightService::Action
327
367
 
328
368
  executed do |context|
329
369
  api_call_result = SomeAPI.save_user(context.user)
@@ -345,7 +385,7 @@ By default LightService provides a mechanism for easily translating your error o
345
385
 
346
386
  ```ruby
347
387
  class FooAction
348
- include LightService::Action
388
+ extend LightService::Action
349
389
 
350
390
  executed do |context|
351
391
  unless service_call.success?
@@ -363,7 +403,7 @@ This also works with nested classes via the ActiveSupport `#underscore` method,
363
403
  ```ruby
364
404
  module PaymentGateway
365
405
  class CaptureFunds
366
- include LightService::Action
406
+ extend LightService::Action
367
407
 
368
408
  executed do |context|
369
409
  if api_service.failed?
@@ -382,7 +422,7 @@ If you need to provide custom variables for interpolation during localization, p
382
422
  ```ruby
383
423
  module PaymentGateway
384
424
  class CaptureFunds
385
- include LightService::Action
425
+ extend LightService::Action
386
426
 
387
427
  executed do |context|
388
428
  if api_service.failed?
data/RELEASES.md CHANGED
@@ -1,5 +1,9 @@
1
1
  A brief list of new features and changes introduced with the specified version.
2
2
 
3
+ ### 0.6.0
4
+ * Using [extend](https://github.com/adomokos/light-service/pull/64) for using class methods in Actions and Organizers
5
+ * Setting [key aliases](https://github.com/adomokos/light-service/pull/69) for the Context from the Organizer
6
+
3
7
  ### 0.5.2
4
8
  * Guarding context keys against the reserved keys the context needs to operate.
5
9
 
@@ -1,7 +1,12 @@
1
1
  module LightService
2
2
  module Action
3
3
 
4
+ def self.extended(base_class)
5
+ base_class.extend Macros
6
+ end
7
+
4
8
  def self.included(base_class)
9
+ ActiveSupport::Deprecation.warn "including LightService::Action is deprecated. Please use `extend LightService::Action` instead"
5
10
  base_class.extend Macros
6
11
  end
7
12
 
@@ -32,7 +37,7 @@ module LightService
32
37
  # Store the action within the context
33
38
  action_context.current_action = self
34
39
 
35
- Context::KeyVerifier.verify_keys(action_context) do
40
+ Context::KeyVerifier.verify_keys(action_context, self) do
36
41
  action_context.define_accessor_methods_for_keys(all_keys)
37
42
 
38
43
  yield(action_context)
@@ -64,7 +69,7 @@ module LightService
64
69
  def all_keys
65
70
  expected_keys + promised_keys
66
71
  end
67
-
68
72
  end
73
+
69
74
  end
70
75
  end
@@ -5,7 +5,7 @@ module LightService
5
5
  end
6
6
 
7
7
  class Context < Hash
8
- attr_accessor :outcome, :message, :error_code, :current_action
8
+ attr_accessor :message, :error_code, :current_action
9
9
 
10
10
  def initialize(context={}, outcome=Outcomes::SUCCESS, message='', error_code=nil)
11
11
  @outcome, @message, @error_code = outcome, message, error_code
@@ -19,8 +19,12 @@ module LightService
19
19
  raise ArgumentError, 'Argument must be Hash or LightService::Context'
20
20
  end
21
21
 
22
- return context if context.is_a?(Context)
23
- self.new(context)
22
+ unless context.is_a?(Context)
23
+ context = self.new(context)
24
+ end
25
+
26
+ context.set_aliases(context.delete(:_aliases)) if context[:_aliases]
27
+ context
24
28
  end
25
29
 
26
30
  def add_to_context(values)
@@ -39,9 +43,9 @@ module LightService
39
43
  @skip_all
40
44
  end
41
45
 
42
- def set_success!(message)
43
- warn '`set_success!` is DEPRECATED: please use `succeed!` instead'
44
- succeed!(message)
46
+ def outcome
47
+ ActiveSupport::Deprecation.warn '`Context#outcome` attribute reader is DEPRECATED and will be removed'
48
+ @outcome
45
49
  end
46
50
 
47
51
  def succeed!(message=nil, options={})
@@ -49,11 +53,6 @@ module LightService
49
53
  @outcome = Outcomes::SUCCESS
50
54
  end
51
55
 
52
- def set_failure!(message)
53
- warn '`set_failure!` is DEPRECATED: please use `fail!` instead'
54
- fail!(message)
55
- end
56
-
57
56
  def fail!(message=nil, options_or_error_code={})
58
57
  options_or_error_code ||= {}
59
58
 
@@ -92,5 +91,25 @@ module LightService
92
91
  define_singleton_method("#{key}=") { |value| self[key] = value }
93
92
  end
94
93
  end
94
+
95
+ def set_aliases(aliases)
96
+ @aliases = aliases
97
+
98
+ aliases.each_pair do |key, key_alias|
99
+ self[key_alias] = self[key]
100
+ end
101
+ end
102
+
103
+ def aliases
104
+ @aliases ||= {}
105
+ end
106
+
107
+ def [](key)
108
+ super(key) || super(aliases.key(key))
109
+ end
110
+
111
+ def fetch(key, default_or_block = nil)
112
+ self[key] ||= super(key, default_or_block)
113
+ end
95
114
  end
96
115
  end
@@ -2,9 +2,9 @@ module LightService; class Context
2
2
  class KeyVerifier
3
3
  attr_reader :context, :action
4
4
 
5
- def initialize(context)
5
+ def initialize(context, action)
6
6
  @context = context
7
- @action = context.current_action
7
+ @action = action
8
8
  end
9
9
 
10
10
  def are_all_keys_in_context?(keys)
@@ -40,13 +40,13 @@ module LightService; class Context
40
40
  context
41
41
  end
42
42
 
43
- def self.verify_keys(context, &block)
44
- ReservedKeysVerifier.new(context).verify
45
- ExpectedKeyVerifier.new(context).verify
43
+ def self.verify_keys(context, action, &block)
44
+ ReservedKeysVerifier.new(context, action).verify
45
+ ExpectedKeyVerifier.new(context, action).verify
46
46
 
47
47
  block.call
48
48
 
49
- PromisedKeyVerifier.new(context).verify
49
+ PromisedKeyVerifier.new(context, action).verify
50
50
  end
51
51
  end
52
52
 
@@ -1,28 +1,31 @@
1
1
  module LightService
2
2
  module Organizer
3
+ def self.extended(base_class)
4
+ base_class.extend ClassMethods
5
+ base_class.extend Macros
6
+ end
3
7
  def self.included(base_class)
8
+ ActiveSupport::Deprecation.warn "including LightService::Organizer is deprecated. Please use `extend LightService::Organizer` instead"
4
9
  base_class.extend ClassMethods
10
+ base_class.extend Macros
5
11
  end
6
12
 
7
13
  # In case this module is included
8
14
  module ClassMethods
9
- def with(data)
15
+ def with(data={})
16
+ data.merge!(:_aliases => @aliases) if @aliases
10
17
  WithReducerFactory.make(self).with(data)
11
18
  end
12
19
 
13
20
  def reduce(*actions)
14
- WithReducerFactory.make(self).with.reduce(actions)
21
+ with({}).reduce(actions)
15
22
  end
16
23
  end
17
24
 
18
- # Provide hooks for extending the class with these methods
19
- def with(data = {})
20
- WithReducerFactory.make(self).with(data)
21
- end
22
-
23
- def reduce(*actions)
24
- WithReducerFactory.make(self).with.reduce(actions)
25
+ module Macros
26
+ def aliases(key_hash)
27
+ @aliases = key_hash
28
+ end
25
29
  end
26
-
27
30
  end
28
31
  end
@@ -11,14 +11,14 @@ module LightService; module Organizer
11
11
  raise "No action(s) were provided" if actions.empty?
12
12
  actions.flatten!
13
13
 
14
- actions.reduce(context) do |context, action|
14
+ actions.reduce(context) do |current_context, action|
15
15
  begin
16
- result = action.execute(context)
16
+ result = action.execute(current_context)
17
17
  rescue FailWithRollbackError
18
18
  result = reduce_rollback(actions)
19
19
  ensure
20
20
  # For logging
21
- yield(context, action) if block_given?
21
+ yield(current_context, action) if block_given?
22
22
  end
23
23
 
24
24
  result
@@ -45,5 +45,6 @@ module LightService; module Organizer
45
45
  # Reverse from the point where the fail was triggered
46
46
  actions.take(index_of_current_action + 1)
47
47
  end
48
+
48
49
  end
49
50
  end; end
@@ -1,3 +1,3 @@
1
1
  module LightService
2
- VERSION = "0.5.2"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'test_doubles'
3
+
4
+ describe "Including is discouraged" do
5
+ context "when including LightService::Organizer" do
6
+ it "gives warning" do
7
+ expect(ActiveSupport::Deprecation).to receive(:warn)
8
+ .with("including LightService::Organizer is deprecated. Please use `extend LightService::Organizer` instead")
9
+
10
+ class OrganizerIncludingLS
11
+ include LightService::Organizer
12
+ end
13
+ end
14
+ end
15
+
16
+ context "when including LightService::Action" do
17
+ it "gives warning" do
18
+ expect(ActiveSupport::Deprecation).to receive(:warn)
19
+ .with("including LightService::Action is deprecated. Please use `extend LightService::Action` instead")
20
+
21
+ class ActionIncludingLS
22
+ include LightService::Action
23
+ end
24
+ end
25
+ end
26
+ end
@@ -14,7 +14,7 @@ class TestsLocalizationAdapter
14
14
  end
15
15
 
16
16
  class TestsLocalizationInvocationOptionsAction
17
- include LightService::Action
17
+ extend LightService::Action
18
18
  expects :pass_or_fail, :message_or_key, :i18n_options
19
19
 
20
20
  executed do |context|
@@ -14,7 +14,7 @@ class RollbackOrganizer
14
14
  end
15
15
 
16
16
  class AddsOneWithRollbackAction
17
- include LightService::Action
17
+ extend LightService::Action
18
18
  expects :number
19
19
  promises :number
20
20
 
@@ -32,7 +32,7 @@ class AddsOneWithRollbackAction
32
32
  end
33
33
 
34
34
  class AddsThreeWithRollbackAction
35
- include LightService::Action
35
+ extend LightService::Action
36
36
  expects :number
37
37
 
38
38
  executed do |context|
@@ -59,7 +59,7 @@ class RollbackOrganizerWithNoRollback
59
59
  end
60
60
 
61
61
  class AddsThreeWithNoRollbackAction
62
- include LightService::Action
62
+ extend LightService::Action
63
63
  expects :number
64
64
 
65
65
  executed do |context|
@@ -82,7 +82,7 @@ class RollbackOrganizerWithMiddleRollback
82
82
  end
83
83
 
84
84
  class AddsTwoActionWithRollback
85
- include LightService::Action
85
+ extend LightService::Action
86
86
  expects :number
87
87
 
88
88
  executed do |context|
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe ":expects and :promises macros" do
4
4
  describe "actions are backward compatible" do
5
5
  class FooAction
6
- include LightService::Action
6
+ extend LightService::Action
7
7
 
8
8
  executed do |context|
9
9
  baz = context.fetch :baz
@@ -21,7 +21,7 @@ describe ":expects and :promises macros" do
21
21
 
22
22
  context "when expected keys are not in context" do
23
23
  class FooNoExpectedKeyAction
24
- include LightService::Action
24
+ extend LightService::Action
25
25
  expects :baz
26
26
 
27
27
  executed do |context|
@@ -40,7 +40,7 @@ describe ":expects and :promises macros" do
40
40
 
41
41
  describe "expected keys" do
42
42
  class FooWithReaderAction
43
- include LightService::Action
43
+ extend LightService::Action
44
44
  expects :baz
45
45
 
46
46
  executed do |context|
@@ -58,7 +58,7 @@ describe ":expects and :promises macros" do
58
58
 
59
59
  context "when promised keys are not in context" do
60
60
  class FooNoPromisedKeyAction
61
- include LightService::Action
61
+ extend LightService::Action
62
62
  expects :baz
63
63
  promises :bar
64
64
 
@@ -75,7 +75,7 @@ describe ":expects and :promises macros" do
75
75
 
76
76
  describe "promised keys" do
77
77
  class FooWithExpectsAndPromisesAction
78
- include LightService::Action
78
+ extend LightService::Action
79
79
  expects :baz
80
80
  promises :bar
81
81
 
@@ -6,7 +6,7 @@ describe ":promises macro" do
6
6
  context "when the promised key is not in the context" do
7
7
  it "raises an ArgumentError" do
8
8
  class TestDoubles::MakesCappuccinoAction1
9
- include LightService::Action
9
+ extend LightService::Action
10
10
  expects :coffee, :milk
11
11
  promises :cappuccino
12
12
  executed do |context|
@@ -22,7 +22,7 @@ describe ":promises macro" do
22
22
 
23
23
  it "can fail the context without fulfilling its promise" do
24
24
  class TestDoubles::MakesCappuccinoAction2
25
- include LightService::Action
25
+ extend LightService::Action
26
26
  expects :coffee, :milk
27
27
  promises :cappuccino
28
28
  executed do |context|
@@ -42,7 +42,7 @@ describe ":promises macro" do
42
42
  context "when the promised key is in the context" do
43
43
  it "can be set with an actual value" do
44
44
  class TestDoubles::MakesCappuccinoAction3
45
- include LightService::Action
45
+ extend LightService::Action
46
46
  expects :coffee, :milk
47
47
  promises :cappuccino
48
48
  executed do |context|
@@ -61,7 +61,7 @@ describe ":promises macro" do
61
61
 
62
62
  it "can be set with nil" do
63
63
  class TestDoubles::MakesCappuccinoAction4
64
- include LightService::Action
64
+ extend LightService::Action
65
65
  expects :coffee, :milk
66
66
  promises :cappuccino
67
67
  executed do |context|
data/spec/context_spec.rb CHANGED
@@ -145,4 +145,31 @@ describe LightService::Context do
145
145
  expect { context.fail_with_rollback!("roll me back") }.to \
146
146
  raise_error(LightService::FailWithRollbackError)
147
147
  end
148
+
149
+ it "warns about the outcome attribute reader being deprecated" do
150
+ expect(ActiveSupport::Deprecation).to receive(:warn)
151
+
152
+ expect(context.outcome).to eq(::LightService::Outcomes::SUCCESS)
153
+ end
154
+
155
+ context "when aliases are included via .make" do
156
+ let(:context) do
157
+ LightService::Context.make(
158
+ :foo => "foobar",
159
+ :_aliases => aliases,
160
+ )
161
+ end
162
+ let(:aliases) { { :foo => :bar } }
163
+
164
+ it "contains the aliases" do
165
+ expect(context.aliases).to eq(aliases)
166
+ expect(context).to include(:foo, :bar)
167
+ end
168
+
169
+ it "returns the correct values for #[] and #fetch" do
170
+ expect(context[:bar]).to eq context[:foo]
171
+ expect(context.fetch(:bar)).to eq context[:foo]
172
+ end
173
+ end
174
+
148
175
  end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require 'test_doubles'
3
+
4
+ describe "organizer aliases macro" do
5
+ let(:organizer_with_alias) do
6
+ Class.new do
7
+ extend LightService::Organizer
8
+
9
+ aliases :promised_key => :expected_key
10
+
11
+ def self.do_something(ctx={})
12
+ with(ctx).reduce([
13
+ TestDoubles::PromisesPromisedKeyAction,
14
+ TestDoubles::ExpectsExpectedKeyAction,
15
+ ])
16
+ end
17
+ end
18
+ end
19
+
20
+ context "when aliases is invoked" do
21
+ it "makes aliases available to the actions" do
22
+ result = organizer_with_alias.do_something
23
+ expect(result[:expected_key]).to eq(result[:promised_key])
24
+ expect(result.expected_key).to eq(result[:promised_key])
25
+ end
26
+ end
27
+ end
@@ -58,4 +58,53 @@ describe LightService::Organizer do
58
58
  .not_to raise_error
59
59
  end
60
60
  end
61
+
62
+ context "when the organizer is also an action", "and the organizer rescues exceptions of its sub-actions" do
63
+ let(:organizer) do
64
+ Class.new do
65
+ extend LightService::Organizer
66
+ extend LightService::Action
67
+
68
+ executed do |ctx|
69
+ begin
70
+ with(ctx).
71
+ reduce(TestDoubles::MakesTeaPromisingKeyButRaisesException)
72
+ rescue
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ it "does not raise an error concerning a sub-action's missing keys" do
79
+ expect { organizer.execute }.not_to raise_error
80
+ end
81
+ end
82
+
83
+ context "when aliases are declared" do
84
+ let(:organizer) do
85
+ Class.new do
86
+ extend LightService::Organizer
87
+ aliases :foo => :bar
88
+
89
+ def self.do_stuff
90
+ with.reduce(TestDoubles::AnAction)
91
+ end
92
+ end
93
+ end
94
+
95
+ it "merges the aliases into the data" do
96
+ with_reducer = double(reduce: true)
97
+
98
+ allow(described_class::WithReducerFactory).to receive(:make).
99
+ and_return(with_reducer)
100
+
101
+ expect(with_reducer).to \
102
+ receive(:with).
103
+ with(hash_including(:_aliases => { :foo => :bar })).
104
+ and_return(with_reducer)
105
+
106
+ organizer.do_stuff
107
+ end
108
+ end
109
+
61
110
  end
@@ -1,5 +1,5 @@
1
1
  class CalculatesOrderTaxAction
2
- include ::LightService::Action
2
+ extend ::LightService::Action
3
3
  expects :order, :tax_percentage
4
4
 
5
5
  executed do |context|
@@ -1,5 +1,5 @@
1
1
  class CalculatesTax
2
- include LightService::Organizer
2
+ extend LightService::Organizer
3
3
 
4
4
  def self.for_order(order)
5
5
  with(:order => order).reduce(
@@ -9,3 +9,4 @@ class CalculatesTax
9
9
  )
10
10
  end
11
11
  end
12
+
@@ -1,5 +1,5 @@
1
1
  class LooksUpTaxPercentageAction
2
- include LightService::Action
2
+ extend LightService::Action
3
3
  expects :order
4
4
  promises :tax_percentage
5
5
 
@@ -1,5 +1,5 @@
1
1
  class ProvidesFreeShippingAction
2
- include LightService::Action
2
+ extend LightService::Action
3
3
  expects :order
4
4
 
5
5
  executed do |context|
data/spec/spec_helper.rb CHANGED
@@ -5,5 +5,6 @@ require 'light-service'
5
5
  require 'ostruct'
6
6
  require 'rspec/its'
7
7
  require 'active_support/core_ext/string'
8
+ require 'pry'
8
9
 
9
10
  I18n.enforce_available_locales = true
data/spec/test_doubles.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module TestDoubles
4
4
  class AddsTwoActionWithFetch
5
- include LightService::Action
5
+ extend LightService::Action
6
6
 
7
7
  executed do |context|
8
8
  number = context.fetch(:number, 0)
@@ -14,7 +14,7 @@ module TestDoubles
14
14
  class AnotherAction; end
15
15
 
16
16
  class AnOrganizer
17
- include LightService::Organizer
17
+ extend LightService::Organizer
18
18
 
19
19
  def self.do_something(action_arguments)
20
20
  with(action_arguments).reduce([AnAction, AnotherAction])
@@ -30,7 +30,7 @@ module TestDoubles
30
30
  end
31
31
 
32
32
  class MakesTeaWithMilkAction
33
- include LightService::Action
33
+ extend LightService::Action
34
34
  expects :tea, :milk
35
35
  promises :milk_tea
36
36
 
@@ -40,7 +40,7 @@ module TestDoubles
40
40
  end
41
41
 
42
42
  class MultipleExpectsAction
43
- include LightService::Action
43
+ extend LightService::Action
44
44
  expects :tea
45
45
  expects :milk, :chocolate
46
46
  promises :milk_tea
@@ -51,13 +51,13 @@ module TestDoubles
51
51
  end
52
52
 
53
53
  class MakesCappuccinoAction
54
- include LightService::Action
54
+ extend LightService::Action
55
55
  expects :coffee, :milk
56
56
  promises :cappuccino
57
57
  end
58
58
 
59
59
  class MakesLatteAction
60
- include LightService::Action
60
+ extend LightService::Action
61
61
  expects :coffee, :milk
62
62
  promises :latte
63
63
 
@@ -82,7 +82,7 @@ module TestDoubles
82
82
  end
83
83
 
84
84
  class MultiplePromisesAction
85
- include LightService::Action
85
+ extend LightService::Action
86
86
  expects :coffee, :milk
87
87
  promises :cappuccino
88
88
  promises :latte
@@ -94,7 +94,7 @@ module TestDoubles
94
94
  end
95
95
 
96
96
  class MakesTeaAndCappuccino
97
- include LightService::Organizer
97
+ extend LightService::Organizer
98
98
 
99
99
  def self.call(tea, milk, coffee)
100
100
  with(:tea => tea, :milk => milk, :coffee => coffee)
@@ -104,7 +104,7 @@ module TestDoubles
104
104
  end
105
105
 
106
106
  class MakesCappuccinoAddsTwo
107
- include LightService::Organizer
107
+ extend LightService::Organizer
108
108
 
109
109
  def self.call(milk, coffee)
110
110
  with(:milk => milk, :coffee => coffee)
@@ -114,7 +114,7 @@ module TestDoubles
114
114
  end
115
115
 
116
116
  class MakesCappuccinoAddsTwoAndFails
117
- include LightService::Organizer
117
+ extend LightService::Organizer
118
118
 
119
119
  def self.call(coffee, this_hot = :very_hot)
120
120
  with(:milk => this_hot, :coffee => coffee)
@@ -125,7 +125,7 @@ module TestDoubles
125
125
  end
126
126
 
127
127
  class MakesCappuccinoSkipsAddsTwo
128
- include LightService::Organizer
128
+ extend LightService::Organizer
129
129
 
130
130
  def self.call(coffee)
131
131
  with(:milk => "5%", :coffee => coffee)
@@ -148,7 +148,7 @@ module TestDoubles
148
148
  end
149
149
 
150
150
  class AddsOneAction
151
- include LightService::Action
151
+ extend LightService::Action
152
152
  expects :number
153
153
  promises :number
154
154
 
@@ -158,7 +158,7 @@ module TestDoubles
158
158
  end
159
159
 
160
160
  class AddsTwoAction
161
- include LightService::Action
161
+ extend LightService::Action
162
162
  expects :number
163
163
 
164
164
  executed do |context|
@@ -167,7 +167,7 @@ module TestDoubles
167
167
  end
168
168
 
169
169
  class AddsThreeAction
170
- include LightService::Action
170
+ extend LightService::Action
171
171
  expects :number
172
172
  promises :product
173
173
 
@@ -177,7 +177,7 @@ module TestDoubles
177
177
  end
178
178
 
179
179
  class MakesTeaExpectingReservedKey
180
- include LightService::Action
180
+ extend LightService::Action
181
181
  expects :tea, :message
182
182
 
183
183
  executed do |context|
@@ -186,7 +186,7 @@ module TestDoubles
186
186
  end
187
187
 
188
188
  class MakesTeaExpectingMultipleReservedKeys
189
- include LightService::Action
189
+ extend LightService::Action
190
190
  expects :tea, :message, :error_code, :current_action
191
191
 
192
192
  executed do |context|
@@ -195,7 +195,7 @@ module TestDoubles
195
195
  end
196
196
 
197
197
  class MakesTeaPromisingReservedKey
198
- include LightService::Action
198
+ extend LightService::Action
199
199
  expects :tea
200
200
  promises :product, :message
201
201
 
@@ -205,7 +205,7 @@ module TestDoubles
205
205
  end
206
206
 
207
207
  class MakesTeaPromisingMultipleReservedKeys
208
- include LightService::Action
208
+ extend LightService::Action
209
209
  expects :tea
210
210
  promises :product, :message, :error_code, :current_action
211
211
 
@@ -213,4 +213,41 @@ module TestDoubles
213
213
  context.product = context.number + 3
214
214
  end
215
215
  end
216
+
217
+ class MakesTeaPromisingKeyButRaisesException
218
+ extend LightService::Action
219
+ promises :product
220
+
221
+ executed do |context|
222
+ context.product = make_product
223
+ end
224
+
225
+ private
226
+
227
+ def self.make_product
228
+ fail "Fail"
229
+ end
230
+ end
231
+
232
+ class PromisesPromisedKeyAction
233
+ extend LightService::Action
234
+
235
+ promises :promised_key
236
+
237
+ executed do |ctx|
238
+ ctx.promised_key = "promised_key"
239
+ end
240
+ end
241
+
242
+ class ExpectsExpectedKeyAction
243
+ extend LightService::Action
244
+
245
+ expects :expected_key
246
+ promises :final_key
247
+
248
+ executed do |ctx|
249
+ ctx.final_key = ctx.expected_key
250
+ end
251
+ end
252
+
216
253
  end
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: light-service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Attila Domokos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-06 00:00:00.000000000 Z
11
+ date: 2015-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '3.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec-its
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: simplecov
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: 0.7.1
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
68
  version: 0.7.1
69
69
  - !ruby/object:Gem::Dependency
@@ -87,9 +87,9 @@ executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
- - .gitignore
91
- - .rspec
92
- - .travis.yml
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
93
  - Gemfile
94
94
  - LICENSE
95
95
  - README.md
@@ -111,6 +111,7 @@ files:
111
111
  - resources/light-service.png
112
112
  - resources/organizer_and_actions.png
113
113
  - spec/acceptance/add_numbers_spec.rb
114
+ - spec/acceptance/include_warning_spec.rb
114
115
  - spec/acceptance/log_from_organizer_spec.rb
115
116
  - spec/acceptance/message_localization_spec.rb
116
117
  - spec/acceptance/rollback_spec.rb
@@ -121,6 +122,7 @@ files:
121
122
  - spec/context_spec.rb
122
123
  - spec/localization_adapter_spec.rb
123
124
  - spec/organizer/with_reducer_spec.rb
125
+ - spec/organizer_key_aliases_spec.rb
124
126
  - spec/organizer_spec.rb
125
127
  - spec/sample/calculates_order_tax_action_spec.rb
126
128
  - spec/sample/calculates_tax_spec.rb
@@ -142,22 +144,23 @@ require_paths:
142
144
  - lib
143
145
  required_ruby_version: !ruby/object:Gem::Requirement
144
146
  requirements:
145
- - - '>='
147
+ - - ">="
146
148
  - !ruby/object:Gem::Version
147
149
  version: '0'
148
150
  required_rubygems_version: !ruby/object:Gem::Requirement
149
151
  requirements:
150
- - - '>='
152
+ - - ">="
151
153
  - !ruby/object:Gem::Version
152
154
  version: '0'
153
155
  requirements: []
154
156
  rubyforge_project:
155
- rubygems_version: 2.0.14
157
+ rubygems_version: 2.4.5
156
158
  signing_key:
157
159
  specification_version: 4
158
160
  summary: A service skeleton with an emphasis on simplicity
159
161
  test_files:
160
162
  - spec/acceptance/add_numbers_spec.rb
163
+ - spec/acceptance/include_warning_spec.rb
161
164
  - spec/acceptance/log_from_organizer_spec.rb
162
165
  - spec/acceptance/message_localization_spec.rb
163
166
  - spec/acceptance/rollback_spec.rb
@@ -168,6 +171,7 @@ test_files:
168
171
  - spec/context_spec.rb
169
172
  - spec/localization_adapter_spec.rb
170
173
  - spec/organizer/with_reducer_spec.rb
174
+ - spec/organizer_key_aliases_spec.rb
171
175
  - spec/organizer_spec.rb
172
176
  - spec/sample/calculates_order_tax_action_spec.rb
173
177
  - spec/sample/calculates_tax_spec.rb