light-service 0.17.0 → 0.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/project-build.yml +3 -6
- data/.rubocop.yml +117 -3
- data/README.md +101 -31
- data/RELEASES.md +11 -0
- data/lib/generators/light_service/generator_utils.rb +0 -2
- data/lib/light-service/action.rb +3 -5
- data/lib/light-service/configuration.rb +10 -2
- data/lib/light-service/context/key_verifier.rb +4 -2
- data/lib/light-service/context.rb +10 -15
- data/lib/light-service/deprecation_warning.rb +17 -0
- data/lib/light-service/errors.rb +4 -0
- data/lib/light-service/i18n/localization_adapter.rb +46 -0
- data/lib/light-service/localization_adapter.rb +14 -27
- data/lib/light-service/localization_map.rb +7 -0
- data/lib/light-service/orchestrator.rb +3 -3
- data/lib/light-service/organizer/reduce_case.rb +48 -0
- data/lib/light-service/organizer/verify_call_method_exists.rb +1 -1
- data/lib/light-service/organizer/with_reducer.rb +6 -8
- data/lib/light-service/organizer/with_reducer_log_decorator.rb +2 -2
- data/lib/light-service/organizer.rb +5 -3
- data/lib/light-service/testing/context_factory.rb +4 -0
- data/lib/light-service/version.rb +1 -1
- data/lib/light-service.rb +5 -2
- data/light-service.gemspec +3 -6
- data/spec/acceptance/after_actions_spec.rb +3 -9
- data/spec/acceptance/before_actions_spec.rb +3 -9
- data/spec/acceptance/include_warning_spec.rb +2 -2
- data/spec/acceptance/message_localization_spec.rb +7 -7
- data/spec/acceptance/not_having_call_method_warning_spec.rb +3 -3
- data/spec/acceptance/organizer/reduce_case_spec.rb +53 -0
- data/spec/acceptance/organizer/reduce_if_spec.rb +2 -0
- data/spec/acceptance/skip_all_warning_spec.rb +1 -1
- data/spec/context/inspect_spec.rb +5 -21
- data/spec/context_spec.rb +2 -2
- data/spec/i18n_localization_adapter_spec.rb +83 -0
- 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/localization_adapter_spec.rb +17 -38
- data/spec/sample/calculates_tax_spec.rb +0 -1
- data/spec/sample/looks_up_tax_percentage_action_spec.rb +3 -1
- data/spec/support.rb +1 -1
- data/spec/test_doubles.rb +20 -5
- data/spec/testing/context_factory_spec.rb +15 -0
- metadata +19 -42
- data/Appraisals +0 -11
- data/gemfiles/activesupport_5.gemfile +0 -7
- data/gemfiles/activesupport_6.gemfile +0 -7
@@ -114,9 +114,9 @@ module LightService
|
|
114
114
|
end
|
115
115
|
|
116
116
|
def issue_deprecation_warning_for(method_name)
|
117
|
-
|
118
|
-
|
119
|
-
|
117
|
+
warning_msg = "`Orchestrator##{method_name}` is DEPRECATED and will be " \
|
118
|
+
"removed, please switch to `Organizer##{method_name} instead. "
|
119
|
+
LightService::Deprecation.warn(warning_msg)
|
120
120
|
end
|
121
121
|
end
|
122
122
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module LightService
|
2
|
+
module Organizer
|
3
|
+
class ReduceCase
|
4
|
+
extend ScopedReducable
|
5
|
+
|
6
|
+
class Arguments
|
7
|
+
attr_reader :value, :when, :else
|
8
|
+
|
9
|
+
def initialize(**args)
|
10
|
+
validate_arguments(**args)
|
11
|
+
@value = args[:value]
|
12
|
+
@when = args[:when]
|
13
|
+
@else = args[:else]
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
# rubocop:disable Style/MultilineIfModifier
|
19
|
+
def validate_arguments(**args)
|
20
|
+
raise(
|
21
|
+
ArgumentError,
|
22
|
+
"Expected keyword arguments: [:value, :when, :else]. Given: #{args.keys}"
|
23
|
+
) unless args.keys.intersection(mandatory_arguments).count == mandatory_arguments.count
|
24
|
+
end
|
25
|
+
# rubocop:enable Style/MultilineIfModifier
|
26
|
+
|
27
|
+
def mandatory_arguments
|
28
|
+
%i[value when else]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.run(organizer, **args)
|
33
|
+
arguments = Arguments.new(**args)
|
34
|
+
|
35
|
+
lambda do |ctx|
|
36
|
+
return ctx if ctx.stop_processing?
|
37
|
+
|
38
|
+
matched_case = arguments.when.keys.find { |k| k.eql?(ctx[arguments.value]) }
|
39
|
+
steps = arguments.when[matched_case] || arguments.else
|
40
|
+
|
41
|
+
ctx = scoped_reduce(organizer, ctx, steps)
|
42
|
+
|
43
|
+
ctx
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -15,7 +15,7 @@ module LightService
|
|
15
15
|
"its entry method (the one that calls with & reduce) " \
|
16
16
|
"should be named `call`. " \
|
17
17
|
"Please use #{klass}.call going forward."
|
18
|
-
|
18
|
+
LightService.deprecation_warning(warning_msg)
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.caller_method(first_caller)
|
@@ -34,14 +34,12 @@ module LightService
|
|
34
34
|
actions.flatten!
|
35
35
|
|
36
36
|
actions.each_with_object(context) do |action, current_context|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
yield(current_context, action) if block_given?
|
44
|
-
end
|
37
|
+
invoke_action(current_context, action)
|
38
|
+
rescue FailWithRollbackError
|
39
|
+
reduce_rollback(actions)
|
40
|
+
ensure
|
41
|
+
# For logging
|
42
|
+
yield(current_context, action) if block_given?
|
45
43
|
end
|
46
44
|
end
|
47
45
|
|
@@ -5,7 +5,7 @@ module LightService
|
|
5
5
|
|
6
6
|
alias logged? logged
|
7
7
|
|
8
|
-
def initialize(organizer, decorated: WithReducer.new
|
8
|
+
def initialize(organizer, logger:, decorated: WithReducer.new)
|
9
9
|
@decorated = decorated
|
10
10
|
@organizer = organizer
|
11
11
|
|
@@ -22,7 +22,7 @@ module LightService
|
|
22
22
|
|
23
23
|
logger.info do
|
24
24
|
"[LightService] - keys in context: " \
|
25
|
-
|
25
|
+
"#{extract_keys(decorated.context.keys)}"
|
26
26
|
end
|
27
27
|
self
|
28
28
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'active_support/deprecation'
|
2
|
-
|
3
1
|
module LightService
|
4
2
|
module Organizer
|
5
3
|
def self.extended(base_class)
|
@@ -10,7 +8,7 @@ module LightService
|
|
10
8
|
def self.included(base_class)
|
11
9
|
warning_msg = "including LightService::Organizer is deprecated. " \
|
12
10
|
"Please use `extend LightService::Organizer` instead"
|
13
|
-
|
11
|
+
LightService::Deprecation.warn(warning_msg)
|
14
12
|
extended(base_class)
|
15
13
|
end
|
16
14
|
|
@@ -49,6 +47,10 @@ module LightService
|
|
49
47
|
ReduceUntil.run(self, condition_block, steps)
|
50
48
|
end
|
51
49
|
|
50
|
+
def reduce_case(**args)
|
51
|
+
ReduceCase.run(self, **args)
|
52
|
+
end
|
53
|
+
|
52
54
|
def iterate(collection_key, steps)
|
53
55
|
Iterate.run(self, collection_key, steps)
|
54
56
|
end
|
@@ -26,11 +26,15 @@ module LightService
|
|
26
26
|
|
27
27
|
# More than one arguments can be passed to the
|
28
28
|
# Organizer's #call method
|
29
|
+
# rubocop:disable Style/ArgumentsForwarding
|
29
30
|
def with(*args, &block)
|
30
31
|
catch(:return_ctx_from_execution) do
|
31
32
|
@organizer.call(*args, &block)
|
32
33
|
end
|
33
34
|
end
|
35
|
+
# rubocop:enable Style/ArgumentsForwarding
|
36
|
+
|
37
|
+
ruby2_keywords :with if RUBY_VERSION >= "2.7"
|
34
38
|
|
35
39
|
def initialize(organizer)
|
36
40
|
@organizer = organizer
|
data/lib/light-service.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'logger'
|
2
|
-
require 'active_support/core_ext/string'
|
3
2
|
|
4
3
|
require 'light-service/version'
|
5
4
|
|
6
5
|
require 'light-service/errors'
|
7
6
|
require 'light-service/configuration'
|
8
|
-
require 'light-service/localization_adapter'
|
9
7
|
require 'light-service/context'
|
10
8
|
require 'light-service/context/key_verifier'
|
9
|
+
require 'light-service/deprecation_warning'
|
10
|
+
require 'light-service/i18n/localization_adapter'
|
11
|
+
require 'light-service/localization_adapter'
|
12
|
+
require 'light-service/localization_map'
|
11
13
|
require 'light-service/organizer/scoped_reducable'
|
12
14
|
require 'light-service/organizer/with_reducer'
|
13
15
|
require 'light-service/organizer/with_reducer_log_decorator'
|
@@ -15,6 +17,7 @@ require 'light-service/organizer/with_reducer_factory'
|
|
15
17
|
require 'light-service/organizer/reduce_if'
|
16
18
|
require 'light-service/organizer/reduce_if_else'
|
17
19
|
require 'light-service/organizer/reduce_until'
|
20
|
+
require 'light-service/organizer/reduce_case'
|
18
21
|
require 'light-service/organizer/iterate'
|
19
22
|
require 'light-service/organizer/execute'
|
20
23
|
require 'light-service/organizer/with_callback'
|
data/light-service.gemspec
CHANGED
@@ -15,17 +15,14 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.name = "light-service"
|
16
16
|
gem.require_paths = ["lib"]
|
17
17
|
gem.version = LightService::VERSION
|
18
|
-
gem.required_ruby_version = '>= 2.
|
19
|
-
|
20
|
-
gem.add_runtime_dependency("activesupport", ">= 4.0.0")
|
18
|
+
gem.required_ruby_version = '>= 2.6.0'
|
21
19
|
|
22
20
|
gem.add_development_dependency("generator_spec", "~> 0.9.4")
|
23
21
|
gem.add_development_dependency("test-unit", "~> 3.0") # Needed for generator specs.
|
24
|
-
gem.add_development_dependency("appraisal", "~> 2.3")
|
25
22
|
gem.add_development_dependency("rspec", "~> 3.0")
|
26
23
|
gem.add_development_dependency("simplecov", "~> 0.17")
|
27
24
|
gem.add_development_dependency("codecov", "~> 0.1")
|
28
|
-
gem.add_development_dependency("rubocop", "~>
|
25
|
+
gem.add_development_dependency("rubocop", "~> 1.26.0")
|
29
26
|
gem.add_development_dependency("rubocop-performance", "~> 1.2.0")
|
30
|
-
gem.add_development_dependency("pry", "~> 0.
|
27
|
+
gem.add_development_dependency("pry", "~> 0.14")
|
31
28
|
end
|
@@ -34,14 +34,10 @@ RSpec.describe 'Action after_actions' do
|
|
34
34
|
class AdditionOrganizer
|
35
35
|
extend LightService::Organizer
|
36
36
|
after_actions (lambda do |ctx|
|
37
|
-
if ctx.current_action == TestDoubles::AddsOneAction
|
38
|
-
ctx.number -= 2
|
39
|
-
end
|
37
|
+
ctx.number -= 2 if ctx.current_action == TestDoubles::AddsOneAction
|
40
38
|
end),
|
41
39
|
(lambda do |ctx|
|
42
|
-
if ctx.current_action == TestDoubles::AddsThreeAction
|
43
|
-
ctx.number -= 3
|
44
|
-
end
|
40
|
+
ctx.number -= 3 if ctx.current_action == TestDoubles::AddsThreeAction
|
45
41
|
end)
|
46
42
|
|
47
43
|
def self.call(number)
|
@@ -69,9 +65,7 @@ RSpec.describe 'Action after_actions' do
|
|
69
65
|
it 'ensures the correct :current_action is set' do
|
70
66
|
TestDoubles::TestWithCallback.after_actions = [
|
71
67
|
lambda do |ctx|
|
72
|
-
if ctx.current_action == TestDoubles::IterateCollectionAction
|
73
|
-
ctx.total -= 1000
|
74
|
-
end
|
68
|
+
ctx.total -= 1000 if ctx.current_action == TestDoubles::IterateCollectionAction
|
75
69
|
end
|
76
70
|
]
|
77
71
|
|
@@ -34,14 +34,10 @@ RSpec.describe 'Action before_actions' do
|
|
34
34
|
class AdditionOrganizer
|
35
35
|
extend LightService::Organizer
|
36
36
|
before_actions (lambda do |ctx|
|
37
|
-
if ctx.current_action == TestDoubles::AddsOneAction
|
38
|
-
ctx.number -= 2
|
39
|
-
end
|
37
|
+
ctx.number -= 2 if ctx.current_action == TestDoubles::AddsOneAction
|
40
38
|
end),
|
41
39
|
(lambda do |ctx|
|
42
|
-
if ctx.current_action == TestDoubles::AddsThreeAction
|
43
|
-
ctx.number -= 3
|
44
|
-
end
|
40
|
+
ctx.number -= 3 if ctx.current_action == TestDoubles::AddsThreeAction
|
45
41
|
end)
|
46
42
|
|
47
43
|
def self.call(number)
|
@@ -69,9 +65,7 @@ RSpec.describe 'Action before_actions' do
|
|
69
65
|
it 'can interact with actions from the outside' do
|
70
66
|
TestDoubles::TestWithCallback.before_actions = [
|
71
67
|
lambda do |ctx|
|
72
|
-
if ctx.current_action == TestDoubles::AddToTotalAction
|
73
|
-
ctx.total -= 1000
|
74
|
-
end
|
68
|
+
ctx.total -= 1000 if ctx.current_action == TestDoubles::AddToTotalAction
|
75
69
|
end
|
76
70
|
]
|
77
71
|
result = TestDoubles::TestWithCallback.call
|
@@ -5,7 +5,7 @@ describe "Including is discouraged" do
|
|
5
5
|
it "gives warning" do
|
6
6
|
expected_msg = "including LightService::Organizer is deprecated. " \
|
7
7
|
"Please use `extend LightService::Organizer` instead"
|
8
|
-
expect(
|
8
|
+
expect(LightService::Deprecation).to receive(:warn)
|
9
9
|
.with(expected_msg)
|
10
10
|
|
11
11
|
class OrganizerIncludingLS
|
@@ -18,7 +18,7 @@ describe "Including is discouraged" do
|
|
18
18
|
it "gives warning" do
|
19
19
|
expected_msg = "including LightService::Action is deprecated. " \
|
20
20
|
"Please use `extend LightService::Action` instead"
|
21
|
-
expect(
|
21
|
+
expect(LightService::Deprecation).to receive(:warn)
|
22
22
|
.with(expected_msg)
|
23
23
|
|
24
24
|
class ActionIncludingLS
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "test_doubles"
|
3
3
|
|
4
|
-
class
|
4
|
+
class TestsI18nLocalizationAdapter
|
5
5
|
extend LightService::Organizer
|
6
6
|
|
7
7
|
def self.call(pass_or_fail, message_or_key, i18n_options = {})
|
@@ -9,11 +9,11 @@ class TestsLocalizationAdapter
|
|
9
9
|
:pass_or_fail => pass_or_fail,
|
10
10
|
:message_or_key => message_or_key,
|
11
11
|
:i18n_options => i18n_options
|
12
|
-
).reduce(
|
12
|
+
).reduce(TestsI18nLocalizationInvocationOptionsAction)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
class
|
16
|
+
class TestsI18nLocalizationInvocationOptionsAction
|
17
17
|
extend LightService::Action
|
18
18
|
expects :pass_or_fail, :message_or_key, :i18n_options
|
19
19
|
|
@@ -27,18 +27,18 @@ class TestsLocalizationInvocationOptionsAction
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def pass_with(message_or_key, i18n_options = {})
|
30
|
-
|
30
|
+
TestsI18nLocalizationAdapter.call(true, message_or_key, i18n_options)
|
31
31
|
end
|
32
32
|
|
33
33
|
def fail_with(message_or_key, i18n_options = {})
|
34
|
-
|
34
|
+
TestsI18nLocalizationAdapter.call(false, message_or_key, i18n_options)
|
35
35
|
end
|
36
36
|
|
37
|
-
describe "Localization Adapter" do
|
37
|
+
describe "I18n Localization Adapter" do
|
38
38
|
before do
|
39
39
|
I18n.backend.store_translations(
|
40
40
|
:en,
|
41
|
-
:
|
41
|
+
:tests_i18n_localization_invocation_options_action =>
|
42
42
|
{
|
43
43
|
:light_service => {
|
44
44
|
:failures => {
|
@@ -4,8 +4,8 @@ require 'test_doubles'
|
|
4
4
|
describe "Organizer should invoke with/reduce from a call method" do
|
5
5
|
context "when the organizer does not have a `call` method" do
|
6
6
|
it "gives warning" do
|
7
|
-
expect(
|
8
|
-
.to receive(:
|
7
|
+
expect(LightService)
|
8
|
+
.to receive(:deprecation_warning)
|
9
9
|
.with(/^The <OrganizerWithoutCallMethod> class is an organizer/)
|
10
10
|
|
11
11
|
class OrganizerWithoutCallMethod
|
@@ -22,7 +22,7 @@ describe "Organizer should invoke with/reduce from a call method" do
|
|
22
22
|
|
23
23
|
context "when the organizer has the `call` method" do
|
24
24
|
it "does not issue a warning" do
|
25
|
-
expect(
|
25
|
+
expect(LightService::Deprecation)
|
26
26
|
.not_to receive(:warn)
|
27
27
|
|
28
28
|
class OrganizerWithCallMethod
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'test_doubles'
|
3
|
+
|
4
|
+
RSpec.describe LightService::Organizer do
|
5
|
+
class TestReduceCase
|
6
|
+
extend LightService::Organizer
|
7
|
+
|
8
|
+
def self.call(context)
|
9
|
+
with(context).reduce(actions)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.actions
|
13
|
+
[
|
14
|
+
reduce_case(
|
15
|
+
:value => :incr_num,
|
16
|
+
:when => {
|
17
|
+
:one => [TestDoubles::AddsOneAction],
|
18
|
+
:two => [TestDoubles::AddsTwoAction],
|
19
|
+
:three => [TestDoubles::AddsThreeAction]
|
20
|
+
},
|
21
|
+
:else => [TestDoubles::FailureAction]
|
22
|
+
)
|
23
|
+
]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'adds one if the incr_num is one' do
|
28
|
+
result = TestReduceCase.call(:number => 0, :incr_num => :one)
|
29
|
+
|
30
|
+
expect(result).to be_success
|
31
|
+
expect(result[:number]).to eq(1)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'adds two if the incr_num is two' do
|
35
|
+
result = TestReduceCase.call(:number => 0, :incr_num => :two)
|
36
|
+
|
37
|
+
expect(result).to be_success
|
38
|
+
expect(result[:number]).to eq(2)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'adds three if the incr_num is three' do
|
42
|
+
result = TestReduceCase.call(:number => 0, :incr_num => :three)
|
43
|
+
|
44
|
+
expect(result).to be_success
|
45
|
+
expect(result[:number]).to eq(3)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'will fail if the incr_num is neither one, two, or three' do
|
49
|
+
result = TestReduceCase.call(:number => 0, :incr_num => :four)
|
50
|
+
|
51
|
+
expect(result).to be_failure
|
52
|
+
end
|
53
|
+
end
|
@@ -63,6 +63,7 @@ RSpec.describe LightService::Organizer do
|
|
63
63
|
reduce(actions)
|
64
64
|
end
|
65
65
|
|
66
|
+
# rubocop:disable Metrics/AbcSize
|
66
67
|
def self.actions
|
67
68
|
[
|
68
69
|
reduce_if(
|
@@ -76,6 +77,7 @@ RSpec.describe LightService::Organizer do
|
|
76
77
|
execute(->(c) { c[:last_outside] = true })
|
77
78
|
]
|
78
79
|
end
|
80
|
+
# rubocop:enable Metrics/AbcSize
|
79
81
|
end
|
80
82
|
|
81
83
|
result = org.call
|
@@ -12,7 +12,7 @@ RSpec.describe "skip_all! has been deprecated" do
|
|
12
12
|
|
13
13
|
expected_msg = "Using skip_all! has been deprecated, " \
|
14
14
|
"please use `skip_remaining!` instead."
|
15
|
-
expect(
|
15
|
+
expect(LightService::Deprecation).to receive(:warn)
|
16
16
|
.with(expected_msg)
|
17
17
|
|
18
18
|
SkipAllDeprecatedAction.execute
|
@@ -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
@@ -152,7 +152,7 @@ RSpec.describe LightService::Context do
|
|
152
152
|
end
|
153
153
|
|
154
154
|
it "warns about the outcome attribute reader being deprecated" do
|
155
|
-
expect(
|
155
|
+
expect(LightService::Deprecation).to receive(:warn)
|
156
156
|
|
157
157
|
expect(context.outcome).to eq(::LightService::Outcomes::SUCCESS)
|
158
158
|
end
|
@@ -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
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require 'test_doubles'
|
3
|
+
|
4
|
+
describe LightService::I18n::LocalizationAdapter do
|
5
|
+
let(:action_class) { TestDoubles::AnAction }
|
6
|
+
let(:adapter) { described_class.new }
|
7
|
+
|
8
|
+
describe "#failure" do
|
9
|
+
subject { adapter.failure(message_or_key, action_class) }
|
10
|
+
|
11
|
+
context "when provided a Symbol" do
|
12
|
+
let(:message_or_key) { :not_found }
|
13
|
+
|
14
|
+
it "translates the message" do
|
15
|
+
expected_scope = "test_doubles/an_action.light_service.failures"
|
16
|
+
|
17
|
+
expect(I18n).to receive(:t)
|
18
|
+
.with(message_or_key, :scope => expected_scope)
|
19
|
+
.and_return("message")
|
20
|
+
|
21
|
+
expect(subject).to eq("message")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "allows passing interpolation options to I18n layer" do
|
25
|
+
expect(I18n).to receive(:t)
|
26
|
+
.with(message_or_key, hash_including(:i18n_variable => "value"))
|
27
|
+
.and_return("message")
|
28
|
+
|
29
|
+
subject = adapter.failure(message_or_key,
|
30
|
+
action_class,
|
31
|
+
:i18n_variable => "value")
|
32
|
+
|
33
|
+
expect(subject).to eq("message")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when provided a String" do
|
38
|
+
let(:message_or_key) { "action failed" }
|
39
|
+
|
40
|
+
it "returns the message" do
|
41
|
+
expect(subject).to eq(message_or_key)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#success" do
|
47
|
+
subject { adapter.success(message_or_key, action_class) }
|
48
|
+
|
49
|
+
context "when provided a Symbol" do
|
50
|
+
let(:message_or_key) { :not_found }
|
51
|
+
|
52
|
+
it "translates the message" do
|
53
|
+
expected_scope = "test_doubles/an_action.light_service.successes"
|
54
|
+
|
55
|
+
expect(I18n).to receive(:t)
|
56
|
+
.with(message_or_key, :scope => expected_scope)
|
57
|
+
.and_return("message")
|
58
|
+
|
59
|
+
expect(subject).to eq("message")
|
60
|
+
end
|
61
|
+
|
62
|
+
it "allows passing interpolation options to I18n layer" do
|
63
|
+
expect(I18n).to receive(:t)
|
64
|
+
.with(message_or_key, hash_including(:i18n_variable => "value"))
|
65
|
+
.and_return("message")
|
66
|
+
|
67
|
+
subject = adapter.success(message_or_key,
|
68
|
+
action_class,
|
69
|
+
:i18n_variable => "value")
|
70
|
+
|
71
|
+
expect(subject).to eq("message")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "when provided a String" do
|
76
|
+
let(:message_or_key) { "action failed" }
|
77
|
+
|
78
|
+
it "returns the message" do
|
79
|
+
expect(subject).to eq(message_or_key)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -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
|