light-service 0.15.0 → 0.18.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 +4 -4
- data/.github/workflows/project-build.yml +28 -0
- data/.rubocop.yml +117 -3
- data/.travis.yml +3 -8
- data/README.md +89 -37
- data/RELEASES.md +18 -1
- data/lib/generators/light_service/generator_utils.rb +0 -2
- data/lib/light-service/action.rb +61 -4
- data/lib/light-service/context/key_verifier.rb +22 -3
- data/lib/light-service/context.rb +10 -12
- data/lib/light-service/errors.rb +5 -0
- data/lib/light-service/orchestrator.rb +1 -1
- data/lib/light-service/organizer/reduce_case.rb +48 -0
- data/lib/light-service/organizer/reduce_if_else.rb +21 -0
- data/lib/light-service/organizer/with_reducer.rb +11 -14
- data/lib/light-service/organizer/with_reducer_log_decorator.rb +2 -2
- data/lib/light-service/organizer.rb +20 -3
- data/lib/light-service/testing/context_factory.rb +2 -0
- data/lib/light-service/version.rb +1 -1
- data/lib/light-service.rb +2 -0
- data/light-service.gemspec +3 -2
- data/spec/acceptance/after_actions_spec.rb +17 -6
- data/spec/acceptance/around_each_spec.rb +15 -0
- data/spec/acceptance/before_actions_spec.rb +3 -9
- data/spec/acceptance/log_from_organizer_spec.rb +1 -1
- data/spec/acceptance/organizer/add_to_context_spec.rb +27 -0
- data/spec/acceptance/organizer/execute_with_add_to_context_spec.rb +28 -0
- data/spec/acceptance/organizer/reduce_case_spec.rb +53 -0
- data/spec/acceptance/organizer/reduce_if_else_spec.rb +60 -0
- data/spec/acceptance/organizer/reduce_if_spec.rb +2 -0
- data/spec/action_optional_expected_keys_spec.rb +82 -0
- data/spec/context/inspect_spec.rb +5 -21
- data/spec/context_spec.rb +1 -1
- data/spec/lib/generators/action_generator_advanced_spec.rb +1 -1
- data/spec/lib/generators/action_generator_simple_spec.rb +1 -1
- data/spec/lib/generators/organizer_generator_advanced_spec.rb +1 -1
- data/spec/lib/generators/organizer_generator_simple_spec.rb +1 -1
- data/spec/sample/calculates_tax_spec.rb +0 -1
- data/spec/sample/looks_up_tax_percentage_action_spec.rb +3 -1
- data/spec/test_doubles.rb +48 -5
- metadata +22 -13
- data/gemfiles/activesupport_4.gemfile +0 -7
- data/resources/orchestrators_deprecated.svg +0 -10
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'test_doubles'
|
3
|
+
|
4
|
+
describe ":expects macro using defaults" do
|
5
|
+
context "when all expected keys are supplied" do
|
6
|
+
it "is expected to ignore default values" do
|
7
|
+
outcome = TestDoubles::AddsNumbersWithOptionalDefaults.execute(
|
8
|
+
:first_number => 3,
|
9
|
+
:second_number => 5,
|
10
|
+
:third_number => 7
|
11
|
+
)
|
12
|
+
|
13
|
+
expect(outcome.total).to eq 15
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when defaults are supplied" do
|
18
|
+
it "is expected to use static values" do
|
19
|
+
outcome = TestDoubles::AddsNumbersWithOptionalDefaults.execute(
|
20
|
+
:first_number => 3,
|
21
|
+
:second_number => 7
|
22
|
+
)
|
23
|
+
|
24
|
+
expect(outcome.total).to eq 20
|
25
|
+
end
|
26
|
+
|
27
|
+
it "is expected to use dynamic values" do
|
28
|
+
outcome = TestDoubles::AddsNumbersWithOptionalDefaults.execute(
|
29
|
+
:first_number => 3,
|
30
|
+
:third_number => 5
|
31
|
+
)
|
32
|
+
|
33
|
+
expect(outcome.total).to eq 18
|
34
|
+
end
|
35
|
+
|
36
|
+
it "is expected to process defaults in their defined order" do
|
37
|
+
outcome = TestDoubles::AddsNumbersWithOptionalDefaults.execute(
|
38
|
+
:third_number => 5,
|
39
|
+
:first_number => 3
|
40
|
+
)
|
41
|
+
|
42
|
+
expect(outcome.total).to eq 18
|
43
|
+
end
|
44
|
+
|
45
|
+
it "is expected to use all defaults if required" do
|
46
|
+
outcome = TestDoubles::AddsNumbersWithOptionalDefaults.execute(
|
47
|
+
:first_number => 3
|
48
|
+
)
|
49
|
+
|
50
|
+
expect(outcome.total).to eq 23
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when used within an organizer" do
|
55
|
+
it "is expected to process required defaults" do
|
56
|
+
outcome = TestDoubles::OrganizerWithActionsUsingDefaults.call
|
57
|
+
|
58
|
+
expect(outcome.total).to eq 20
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when defaults are misconfigured" do
|
63
|
+
it "is expected to raise an exception" do
|
64
|
+
expect do
|
65
|
+
# Needs to be specified in the block
|
66
|
+
# as error is raised at define time
|
67
|
+
class AddsNumbersWithIncorrectDefaults
|
68
|
+
extend LightService::Action
|
69
|
+
|
70
|
+
expects :first, :default => 10 # This one is fine. Other two arent
|
71
|
+
expects :second, :defalut => ->(ctx) { ctx[:first] + 7 }
|
72
|
+
expects :third, :deafult => 10
|
73
|
+
promises :total
|
74
|
+
|
75
|
+
executed do |ctx|
|
76
|
+
ctx.total = ctx.first + ctx.second + ctx.third
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end.to raise_error(LightService::UnusableExpectKeyDefaultError)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -13,13 +13,7 @@ RSpec.describe LightService::Context do
|
|
13
13
|
describe '#inspect' do
|
14
14
|
it 'inspects the hash with all the fields' do
|
15
15
|
inspected_context =
|
16
|
-
|
17
|
-
+ 'success: true, ' \
|
18
|
-
+ 'message: \'\', ' \
|
19
|
-
+ 'error_code: nil, ' \
|
20
|
-
+ 'skip_remaining: false, ' \
|
21
|
-
+ 'aliases: {}' \
|
22
|
-
+ ')'
|
16
|
+
"LightService::Context({}, success: true, message: '', error_code: nil, skip_remaining: false, aliases: {})"
|
23
17
|
|
24
18
|
expect(context.inspect).to eq(inspected_context)
|
25
19
|
end
|
@@ -28,13 +22,8 @@ RSpec.describe LightService::Context do
|
|
28
22
|
context.fail!('There was an error')
|
29
23
|
|
30
24
|
inspected_context =
|
31
|
-
|
32
|
-
|
33
|
-
+ 'message: \'There was an error\', ' \
|
34
|
-
+ 'error_code: nil, ' \
|
35
|
-
+ 'skip_remaining: false, ' \
|
36
|
-
+ 'aliases: {}' \
|
37
|
-
+ ')'
|
25
|
+
"LightService::Context({}, success: false, message: 'There was an error', error_code: nil, " \
|
26
|
+
"skip_remaining: false, aliases: {})"
|
38
27
|
|
39
28
|
expect(context.inspect).to eq(inspected_context)
|
40
29
|
end
|
@@ -43,13 +32,8 @@ RSpec.describe LightService::Context do
|
|
43
32
|
context.skip_remaining!('No need to process')
|
44
33
|
|
45
34
|
inspected_context =
|
46
|
-
|
47
|
-
|
48
|
-
+ 'message: \'No need to process\', ' \
|
49
|
-
+ 'error_code: nil, ' \
|
50
|
-
+ 'skip_remaining: true, ' \
|
51
|
-
+ 'aliases: {}' \
|
52
|
-
+ ')'
|
35
|
+
"LightService::Context({}, success: true, message: 'No need to process', error_code: nil, " \
|
36
|
+
"skip_remaining: true, aliases: {})"
|
53
37
|
|
54
38
|
expect(context.inspect).to eq(inspected_context)
|
55
39
|
end
|
data/spec/context_spec.rb
CHANGED
@@ -167,7 +167,7 @@ RSpec.describe LightService::Context do
|
|
167
167
|
end
|
168
168
|
|
169
169
|
it "allows a default block value for #fetch" do
|
170
|
-
expect(context.fetch(:madeup
|
170
|
+
expect(context.fetch(:madeup, :default)).to eq(:default)
|
171
171
|
end
|
172
172
|
|
173
173
|
context "when aliases are included via .make" do
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
require_relative '../../../lib/generators/light_service/action_generator
|
3
|
+
require_relative '../../../lib/generators/light_service/action_generator'
|
4
4
|
require_relative './full_generator_test_blobs'
|
5
5
|
|
6
6
|
describe LightService::Generators::ActionGenerator, :type => :generator do
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
require_relative '../../../lib/generators/light_service/action_generator
|
3
|
+
require_relative '../../../lib/generators/light_service/action_generator'
|
4
4
|
require_relative './full_generator_test_blobs'
|
5
5
|
|
6
6
|
describe LightService::Generators::ActionGenerator, :type => :generator do
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
require_relative '../../../lib/generators/light_service/organizer_generator
|
3
|
+
require_relative '../../../lib/generators/light_service/organizer_generator'
|
4
4
|
require_relative './full_generator_test_blobs'
|
5
5
|
|
6
6
|
describe LightService::Generators::OrganizerGenerator, :type => :generator do
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
require_relative '../../../lib/generators/light_service/organizer_generator
|
3
|
+
require_relative '../../../lib/generators/light_service/organizer_generator'
|
4
4
|
require_relative './full_generator_test_blobs'
|
5
5
|
|
6
6
|
describe LightService::Generators::OrganizerGenerator, :type => :generator do
|
data/spec/test_doubles.rb
CHANGED
@@ -45,6 +45,7 @@ module TestDoubles
|
|
45
45
|
|
46
46
|
class TestLogger
|
47
47
|
attr_accessor :logs
|
48
|
+
|
48
49
|
def initialize
|
49
50
|
@logs = []
|
50
51
|
end
|
@@ -74,6 +75,16 @@ module TestDoubles
|
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
78
|
+
class AroundEachWithReduceIfOrganizer
|
79
|
+
extend LightService::Organizer
|
80
|
+
|
81
|
+
def self.call(action_arguments)
|
82
|
+
with(action_arguments)
|
83
|
+
.around_each(AroundEachLoggerHandler)
|
84
|
+
.reduce(ReduceIfOrganizer.actions)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
77
88
|
class AddsTwoActionWithFetch
|
78
89
|
extend LightService::Action
|
79
90
|
|
@@ -83,8 +94,13 @@ module TestDoubles
|
|
83
94
|
end
|
84
95
|
end
|
85
96
|
|
86
|
-
class AnAction
|
87
|
-
|
97
|
+
class AnAction
|
98
|
+
extend LightService::Action
|
99
|
+
end
|
100
|
+
|
101
|
+
class AnotherAction
|
102
|
+
extend LightService::Action
|
103
|
+
end
|
88
104
|
|
89
105
|
class AnOrganizer
|
90
106
|
extend LightService::Organizer
|
@@ -166,9 +182,7 @@ module TestDoubles
|
|
166
182
|
promises :latte
|
167
183
|
|
168
184
|
executed do |context|
|
169
|
-
if context.milk == :very_hot
|
170
|
-
context.fail!("Can't make a latte from a milk that's very hot!")
|
171
|
-
end
|
185
|
+
context.fail!("Can't make a latte from a milk that's very hot!") if context.milk == :very_hot
|
172
186
|
|
173
187
|
if context.milk == :super_hot
|
174
188
|
error_message = "Can't make a latte from a milk that's super hot!"
|
@@ -478,7 +492,9 @@ module TestDoubles
|
|
478
492
|
class NullAction
|
479
493
|
extend LightService::Action
|
480
494
|
|
495
|
+
# rubocop:disable Lint/EmptyBlock
|
481
496
|
executed { |_ctx| }
|
497
|
+
# rubocop:enable Lint/EmptyBlock
|
482
498
|
end
|
483
499
|
|
484
500
|
class TestIterate
|
@@ -566,6 +582,33 @@ module TestDoubles
|
|
566
582
|
end
|
567
583
|
end
|
568
584
|
|
585
|
+
class AddsNumbersWithOptionalDefaults
|
586
|
+
extend LightService::Action
|
587
|
+
|
588
|
+
expects :first_number
|
589
|
+
expects :second_number, :default => ->(ctx) { ctx[:first_number] + 7 }
|
590
|
+
expects :third_number, :default => 10
|
591
|
+
promises :total
|
592
|
+
|
593
|
+
executed do |ctx|
|
594
|
+
ctx.total = ctx.first_number + ctx.second_number + ctx.third_number
|
595
|
+
end
|
596
|
+
end
|
597
|
+
|
598
|
+
class OrganizerWithActionsUsingDefaults
|
599
|
+
extend LightService::Organizer
|
600
|
+
def self.call
|
601
|
+
with(:first_number => 1, :number => 1).reduce(actions)
|
602
|
+
end
|
603
|
+
|
604
|
+
def self.actions
|
605
|
+
[
|
606
|
+
AddsNumbersWithOptionalDefaults,
|
607
|
+
AddToTotalAction
|
608
|
+
]
|
609
|
+
end
|
610
|
+
end
|
611
|
+
|
569
612
|
class AnOrganizerThatAddsToContext
|
570
613
|
extend LightService::Organizer
|
571
614
|
def self.call
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: light-service
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Attila Domokos
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 4.0.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
|
-
version:
|
26
|
+
version: 4.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: generator_spec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: 1.26.0
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: 1.26.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rubocop-performance
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,6 +157,7 @@ executables: []
|
|
157
157
|
extensions: []
|
158
158
|
extra_rdoc_files: []
|
159
159
|
files:
|
160
|
+
- ".github/workflows/project-build.yml"
|
160
161
|
- ".gitignore"
|
161
162
|
- ".rspec"
|
162
163
|
- ".rubocop.yml"
|
@@ -168,7 +169,6 @@ files:
|
|
168
169
|
- README.md
|
169
170
|
- RELEASES.md
|
170
171
|
- Rakefile
|
171
|
-
- gemfiles/activesupport_4.gemfile
|
172
172
|
- gemfiles/activesupport_5.gemfile
|
173
173
|
- gemfiles/activesupport_6.gemfile
|
174
174
|
- lib/generators/light_service/action_generator.rb
|
@@ -189,7 +189,9 @@ files:
|
|
189
189
|
- lib/light-service/organizer.rb
|
190
190
|
- lib/light-service/organizer/execute.rb
|
191
191
|
- lib/light-service/organizer/iterate.rb
|
192
|
+
- lib/light-service/organizer/reduce_case.rb
|
192
193
|
- lib/light-service/organizer/reduce_if.rb
|
194
|
+
- lib/light-service/organizer/reduce_if_else.rb
|
193
195
|
- lib/light-service/organizer/reduce_until.rb
|
194
196
|
- lib/light-service/organizer/scoped_reducable.rb
|
195
197
|
- lib/light-service/organizer/verify_call_method_exists.rb
|
@@ -203,7 +205,6 @@ files:
|
|
203
205
|
- light-service.gemspec
|
204
206
|
- resources/fail_actions.png
|
205
207
|
- resources/light-service.png
|
206
|
-
- resources/orchestrators_deprecated.svg
|
207
208
|
- resources/organizer_and_actions.png
|
208
209
|
- resources/skip_actions.png
|
209
210
|
- spec/acceptance/add_numbers_spec.rb
|
@@ -228,7 +229,10 @@ files:
|
|
228
229
|
- spec/acceptance/organizer/around_each_with_reduce_if_spec.rb
|
229
230
|
- spec/acceptance/organizer/context_failure_and_skipping_spec.rb
|
230
231
|
- spec/acceptance/organizer/execute_spec.rb
|
232
|
+
- spec/acceptance/organizer/execute_with_add_to_context_spec.rb
|
231
233
|
- spec/acceptance/organizer/iterate_spec.rb
|
234
|
+
- spec/acceptance/organizer/reduce_case_spec.rb
|
235
|
+
- spec/acceptance/organizer/reduce_if_else_spec.rb
|
232
236
|
- spec/acceptance/organizer/reduce_if_spec.rb
|
233
237
|
- spec/acceptance/organizer/reduce_until_spec.rb
|
234
238
|
- spec/acceptance/organizer/with_callback_spec.rb
|
@@ -237,6 +241,7 @@ files:
|
|
237
241
|
- spec/acceptance/testing/context_factory_spec.rb
|
238
242
|
- spec/action_expected_keys_spec.rb
|
239
243
|
- spec/action_expects_and_promises_spec.rb
|
244
|
+
- spec/action_optional_expected_keys_spec.rb
|
240
245
|
- spec/action_promised_keys_spec.rb
|
241
246
|
- spec/action_spec.rb
|
242
247
|
- spec/context/inspect_spec.rb
|
@@ -270,7 +275,7 @@ homepage: https://github.com/adomokos/light-service
|
|
270
275
|
licenses:
|
271
276
|
- MIT
|
272
277
|
metadata: {}
|
273
|
-
post_install_message:
|
278
|
+
post_install_message:
|
274
279
|
rdoc_options: []
|
275
280
|
require_paths:
|
276
281
|
- lib
|
@@ -278,15 +283,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
278
283
|
requirements:
|
279
284
|
- - ">="
|
280
285
|
- !ruby/object:Gem::Version
|
281
|
-
version:
|
286
|
+
version: 2.6.0
|
282
287
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
283
288
|
requirements:
|
284
289
|
- - ">="
|
285
290
|
- !ruby/object:Gem::Version
|
286
291
|
version: '0'
|
287
292
|
requirements: []
|
288
|
-
rubygems_version: 3.
|
289
|
-
signing_key:
|
293
|
+
rubygems_version: 3.3.12
|
294
|
+
signing_key:
|
290
295
|
specification_version: 4
|
291
296
|
summary: A service skeleton with an emphasis on simplicity
|
292
297
|
test_files:
|
@@ -312,7 +317,10 @@ test_files:
|
|
312
317
|
- spec/acceptance/organizer/around_each_with_reduce_if_spec.rb
|
313
318
|
- spec/acceptance/organizer/context_failure_and_skipping_spec.rb
|
314
319
|
- spec/acceptance/organizer/execute_spec.rb
|
320
|
+
- spec/acceptance/organizer/execute_with_add_to_context_spec.rb
|
315
321
|
- spec/acceptance/organizer/iterate_spec.rb
|
322
|
+
- spec/acceptance/organizer/reduce_case_spec.rb
|
323
|
+
- spec/acceptance/organizer/reduce_if_else_spec.rb
|
316
324
|
- spec/acceptance/organizer/reduce_if_spec.rb
|
317
325
|
- spec/acceptance/organizer/reduce_until_spec.rb
|
318
326
|
- spec/acceptance/organizer/with_callback_spec.rb
|
@@ -321,6 +329,7 @@ test_files:
|
|
321
329
|
- spec/acceptance/testing/context_factory_spec.rb
|
322
330
|
- spec/action_expected_keys_spec.rb
|
323
331
|
- spec/action_expects_and_promises_spec.rb
|
332
|
+
- spec/action_optional_expected_keys_spec.rb
|
324
333
|
- spec/action_promised_keys_spec.rb
|
325
334
|
- spec/action_spec.rb
|
326
335
|
- spec/context/inspect_spec.rb
|
@@ -1,10 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="utf-8"?>
|
2
|
-
<svg version="1.1"
|
3
|
-
xmlns="http://www.w3.org/2000/svg"
|
4
|
-
xmlns:xlink="http://www.w3.org/1999/xlink"
|
5
|
-
width="350" height="20"
|
6
|
-
>
|
7
|
-
<text font-size="20" x="0" y="20" font-family="Verdana">
|
8
|
-
<tspan fill="red">Orchestrators are DEPRECATED!</tspan>
|
9
|
-
</text>
|
10
|
-
</svg>
|