light-service-ext 0.1.10 → 0.1.11
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 +4 -4
- data/lib/light-service-ext/application_action.rb +22 -0
- data/lib/light-service-ext/around_action_execute_extension.rb +7 -0
- data/lib/light-service-ext/record_actions.rb +10 -28
- data/lib/light-service-ext/version.rb +1 -1
- data/spec/light-service-ext/application_action_spec.rb +49 -15
- data/spec/light-service-ext/application_context_spec.rb +1 -0
- data/spec/light-service-ext/record_actions_spec.rb +0 -34
- metadata +2 -4
- data/spec/light-service-ext/around_action_execute_extension_spec.rb +0 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce41945d8919b3cef73709b2a43f77621fb19019d35f22b6719de3d4c4af7948
|
4
|
+
data.tar.gz: 1f899858676cc260d26d381a4d2c8dbb19688b3aedd666d5e3380c164bf6f495
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a60af56510f4c620b78d97f2609c668b69fd595e6ed6f1acd50056a963ffd9a499e8843ff0147c533f184901f3e636d2e397bfc536b7eeb68af0ec19f970dee
|
7
|
+
data.tar.gz: e0c0bcb40521c6ea56cec36a555f1ffc6ebb11b7942b4709d616e7ce75ddb34aa79132f4396602cdacb534338e72d7f37a8e62b51f0609ad636fbae5564a18fb
|
@@ -4,9 +4,31 @@ module LightServiceExt
|
|
4
4
|
class ApplicationAction
|
5
5
|
extend LightService::Action
|
6
6
|
|
7
|
+
|
7
8
|
def self.inherited(base)
|
9
|
+
base.extend LifecycleMethods
|
8
10
|
base.singleton_class.prepend AroundActionExecuteExtension
|
9
11
|
super
|
10
12
|
end
|
13
|
+
|
14
|
+
module LifecycleMethods
|
15
|
+
attr_writer :before_execute_block, :after_execute_block, :after_success_block, :after_failure_block
|
16
|
+
|
17
|
+
def before_execute_block
|
18
|
+
@before_execute_block ||= ->(_context) {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def after_execute_block
|
22
|
+
@after_execute_block ||= ->(_context) {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def after_success_block
|
26
|
+
@after_success_block ||= ->(_context) {}
|
27
|
+
end
|
28
|
+
|
29
|
+
def after_failure_block
|
30
|
+
@after_failure_block ||= ->(_context) {}
|
31
|
+
end
|
32
|
+
end
|
11
33
|
end
|
12
34
|
end
|
@@ -3,10 +3,17 @@
|
|
3
3
|
module LightServiceExt
|
4
4
|
module AroundActionExecuteExtension
|
5
5
|
def execute(context)
|
6
|
+
return context if context.status == Status::COMPLETE
|
7
|
+
self.before_execute_block.call(context)
|
8
|
+
|
6
9
|
result = super(context.merge(invoked_action: self))
|
7
10
|
|
8
11
|
context.merge!(result)
|
9
12
|
context.fail! if result.errors.present?
|
13
|
+
|
14
|
+
self.after_execute_block.call(context)
|
15
|
+
self.after_success_block.call(context) if result.success?
|
16
|
+
self.after_failure_block.call(context) if result.failure?
|
10
17
|
result
|
11
18
|
end
|
12
19
|
end
|
@@ -6,44 +6,26 @@ module LightServiceExt
|
|
6
6
|
|
7
7
|
def self.call(context)
|
8
8
|
with_error_handler(ctx: context) do
|
9
|
-
self.before_execute_block.call(context)
|
10
|
-
|
11
9
|
result = yield || context
|
10
|
+
return context if outcomes_complete?(ctx: context, result: result)
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
invoked_action = result.invoked_action
|
13
|
+
return context if invoked_action.nil?
|
14
|
+
|
15
|
+
context.add_to_successful_actions(invoked_action.name)
|
16
16
|
|
17
|
-
return context if outcomes_complete?(ctx: context, result: result)
|
18
17
|
merge_api_responses!(ctx: context, result: result)
|
18
|
+
context
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
class << self
|
23
|
-
attr_writer :before_execute_block, :after_execute_block, :after_success_block, :after_failure_block
|
24
|
-
|
25
|
-
def before_execute_block
|
26
|
-
@before_execute_block ||= ->(_context) {}
|
27
|
-
end
|
28
|
-
|
29
|
-
def after_execute_block
|
30
|
-
@after_execute_block ||= ->(_context) {}
|
31
|
-
end
|
32
|
-
|
33
|
-
def after_success_block
|
34
|
-
@after_success_block ||= ->(_context) {}
|
35
|
-
end
|
36
|
-
|
37
|
-
def after_failure_block
|
38
|
-
@after_failure_block ||= ->(_context) {}
|
39
|
-
end
|
40
23
|
def merge_api_responses!(ctx:, result:)
|
41
|
-
|
42
|
-
return if
|
24
|
+
api_response = result.current_api_response
|
25
|
+
return if api_response.blank?
|
43
26
|
|
44
|
-
ctx.
|
45
|
-
|
46
|
-
ctx
|
27
|
+
ctx.add_to_api_responses(api_response)
|
28
|
+
nil
|
47
29
|
end
|
48
30
|
|
49
31
|
def outcomes_complete?(ctx:, result:)
|
@@ -1,19 +1,17 @@
|
|
1
1
|
module LightServiceExt
|
2
2
|
RSpec.describe ApplicationAction do
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
let(:fake_action) do
|
4
|
+
Class.new(described_class) do
|
5
|
+
executed do |context|
|
6
|
+
value = context.dig(:input, :callback).call
|
7
|
+
context.add_params(value: value)
|
8
|
+
context.add_errors!(value: value)
|
9
|
+
end
|
8
10
|
end
|
9
11
|
end
|
10
12
|
|
11
13
|
let(:organizer_class) do
|
12
|
-
Class.new(ApplicationOrganizer) do
|
13
|
-
def self.steps
|
14
|
-
[FakeApplicationAction]
|
15
|
-
end
|
16
|
-
end
|
14
|
+
Class.new(ApplicationOrganizer) do end
|
17
15
|
end
|
18
16
|
|
19
17
|
let(:value) { 'some-value' }
|
@@ -22,18 +20,54 @@ module LightServiceExt
|
|
22
20
|
let(:ctx) do
|
23
21
|
LightService::Testing::ContextFactory
|
24
22
|
.make_from(organizer_class)
|
25
|
-
.for(
|
23
|
+
.for(fake_action)
|
26
24
|
.with(callback: callback)
|
27
25
|
end
|
28
26
|
|
29
|
-
subject(:
|
30
|
-
|
27
|
+
subject(:executed_ctx) { fake_action.execute(ctx) }
|
28
|
+
|
29
|
+
before do
|
30
|
+
allow(organizer_class).to receive(:steps) { [fake_action] }
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'adds value returned by callback to params' do
|
34
|
-
expect(
|
34
|
+
expect(executed_ctx.keys).to include(:input, :errors, :params)
|
35
|
+
|
36
|
+
expect(executed_ctx[:params]).to eql({ value: value })
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'lifecycle callbacks' do
|
40
|
+
before do
|
41
|
+
allow(fake_action.before_execute_block).to receive(:call)
|
42
|
+
allow(fake_action.after_execute_block).to receive(:call)
|
43
|
+
allow(fake_action.after_success_block).to receive(:call)
|
44
|
+
allow(fake_action.after_failure_block).to receive(:call)
|
45
|
+
end
|
35
46
|
|
36
|
-
|
47
|
+
it 'calls appropriate lifecycle callbacks' do
|
48
|
+
executed_ctx
|
49
|
+
|
50
|
+
expect(fake_action.before_execute_block).to have_received(:call).with(kind_of(ApplicationContext)).at_least(:once)
|
51
|
+
expect(fake_action.after_execute_block).to have_received(:call).with(kind_of(ApplicationContext))
|
52
|
+
expect(fake_action.after_success_block).not_to have_received(:call).with(kind_of(ApplicationContext))
|
53
|
+
expect(fake_action.after_failure_block).to have_received(:call).at_least(:once)
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'with failure' do
|
57
|
+
before do
|
58
|
+
allow_any_instance_of(ApplicationContext).to receive(:errors) { {} }
|
59
|
+
allow_any_instance_of(ApplicationContext).to receive(:success?) { true }
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'calls appropriate lifecycle callbacks' do
|
63
|
+
executed_ctx
|
64
|
+
|
65
|
+
expect(fake_action.before_execute_block).to have_received(:call).with(kind_of(ApplicationContext)).at_least(:once)
|
66
|
+
expect(fake_action.after_execute_block).to have_received(:call).with(kind_of(ApplicationContext)).at_least(:once)
|
67
|
+
expect(fake_action.after_success_block).to have_received(:call).with(kind_of(ApplicationContext))
|
68
|
+
expect(fake_action.after_failure_block).to_not have_received(:call)
|
69
|
+
end
|
70
|
+
end
|
37
71
|
end
|
38
72
|
end
|
39
73
|
end
|
@@ -19,40 +19,6 @@ module LightServiceExt
|
|
19
19
|
|
20
20
|
subject(:called_ctx) { described_class.call(ctx, &proc) }
|
21
21
|
|
22
|
-
describe 'lifecycle callbacks' do
|
23
|
-
before do
|
24
|
-
allow(described_class.before_execute_block).to receive(:call)
|
25
|
-
allow(described_class.after_execute_block).to receive(:call)
|
26
|
-
allow(described_class.after_success_block).to receive(:call)
|
27
|
-
allow(described_class.after_failure_block).to receive(:call)
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'calls appropriate lifecycle callbacks' do
|
31
|
-
called_ctx
|
32
|
-
|
33
|
-
expect(described_class.before_execute_block).to have_received(:call).with(kind_of(ApplicationContext))
|
34
|
-
expect(described_class.after_execute_block).to have_received(:call).with(kind_of(ApplicationContext))
|
35
|
-
expect(described_class.after_success_block).to have_received(:call).with(kind_of(ApplicationContext))
|
36
|
-
expect(described_class.after_failure_block).not_to have_received(:call)
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'with failure' do
|
40
|
-
before do
|
41
|
-
allow_any_instance_of(ApplicationContext).to receive(:success?) { false }
|
42
|
-
allow_any_instance_of(ApplicationContext).to receive(:failure?) { true }
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'calls appropriate lifecycle callbacks' do
|
46
|
-
called_ctx
|
47
|
-
|
48
|
-
expect(described_class.before_execute_block).to have_received(:call).with(kind_of(ApplicationContext))
|
49
|
-
expect(described_class.after_execute_block).to have_received(:call).with(kind_of(ApplicationContext))
|
50
|
-
expect(described_class.after_failure_block).to have_received(:call).with(kind_of(ApplicationContext))
|
51
|
-
expect(described_class.after_success_block).not_to have_received(:call)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
22
|
it 'returns expected context' do
|
57
23
|
expect(called_ctx.success?).to be_truthy
|
58
24
|
expect(called_ctx.successful_actions).to be_empty
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: light-service-ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Desmond O'Leary
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-09-
|
11
|
+
date: 2023-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: light-service
|
@@ -205,7 +205,6 @@ files:
|
|
205
205
|
- spec/light-service-ext/application_orchestrator_spec.rb
|
206
206
|
- spec/light-service-ext/application_organizer_spec.rb
|
207
207
|
- spec/light-service-ext/application_validator_action_spec.rb
|
208
|
-
- spec/light-service-ext/around_action_execute_extension_spec.rb
|
209
208
|
- spec/light-service-ext/configuration_spec.rb
|
210
209
|
- spec/light-service-ext/context_error_spec.rb
|
211
210
|
- spec/light-service-ext/error_info_spec.rb
|
@@ -249,7 +248,6 @@ test_files:
|
|
249
248
|
- spec/light-service-ext/application_orchestrator_spec.rb
|
250
249
|
- spec/light-service-ext/application_organizer_spec.rb
|
251
250
|
- spec/light-service-ext/application_validator_action_spec.rb
|
252
|
-
- spec/light-service-ext/around_action_execute_extension_spec.rb
|
253
251
|
- spec/light-service-ext/configuration_spec.rb
|
254
252
|
- spec/light-service-ext/context_error_spec.rb
|
255
253
|
- spec/light-service-ext/error_info_spec.rb
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module LightServiceExt
|
2
|
-
RSpec.describe AroundActionExecuteExtension do
|
3
|
-
let(:fake_action) do
|
4
|
-
Class.new do
|
5
|
-
prepend AroundActionExecuteExtension
|
6
|
-
|
7
|
-
def execute(_ctx)
|
8
|
-
fake_resultant_ctx # HACK: to allow us to control returned value from prepended execute method
|
9
|
-
end
|
10
|
-
|
11
|
-
def fake_resultant_ctx; end
|
12
|
-
end.new
|
13
|
-
end
|
14
|
-
|
15
|
-
describe '#execute' do
|
16
|
-
let(:input) { { key: 'some-value' } }
|
17
|
-
let(:orig_ctx) { ApplicationContext.make_with_defaults }
|
18
|
-
let(:errors) { {} }
|
19
|
-
let(:frozen_resultant_ctx) do
|
20
|
-
ApplicationContext.make_with_defaults.merge({ key: 'some-value', errors: errors }).freeze
|
21
|
-
end
|
22
|
-
|
23
|
-
subject(:executed_ctx) { fake_action.execute(orig_ctx) }
|
24
|
-
|
25
|
-
before do
|
26
|
-
allow(fake_action).to receive(:fake_resultant_ctx) { frozen_resultant_ctx }
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'returns unmodified resultant context' do
|
30
|
-
expect(executed_ctx).to eql(frozen_resultant_ctx)
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'calls underlying prepended execute method' do
|
34
|
-
executed_ctx
|
35
|
-
|
36
|
-
expect(fake_action).to have_received(:fake_resultant_ctx)
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'merges key value pairs from underlying execute to original context' do
|
40
|
-
executed_ctx
|
41
|
-
|
42
|
-
expect(orig_ctx.keys).to include(:key)
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'with resultant ctx with errors' do
|
46
|
-
let(:errors) { { key: 'must be filled' } }
|
47
|
-
|
48
|
-
it 'fails original context' do
|
49
|
-
executed_ctx
|
50
|
-
|
51
|
-
expect(orig_ctx.failure?).to be_truthy
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|