functional-light-service 6.2.0 → 6.3.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/lib/functional-light-service.rb +6 -36
- metadata +14 -307
- data/.github/workflows/project-build.yml +0 -71
- data/.gitignore +0 -24
- data/.rspec +0 -3
- data/.rubocop.yml +0 -101
- data/.solargraph.yml +0 -11
- data/AUDIT-functional-light-service.md +0 -352
- data/Appraisals +0 -7
- data/CHANGELOG.md +0 -292
- data/CODE_OF_CONDUCT.md +0 -22
- data/Gemfile +0 -4
- data/LICENSE +0 -22
- data/README.md +0 -1663
- data/Rakefile +0 -12
- data/VERSION +0 -1
- data/audit/bench.rb +0 -99
- data/audit/verify_findings.rb +0 -172
- data/functional-light-service.gemspec +0 -35
- data/gemfiles/dry_inflector_0_2_1.gemfile +0 -5
- data/gemfiles/i18n_1_8_11.gemfile +0 -5
- data/lib/functional-light-service/action.rb +0 -145
- data/lib/functional-light-service/configuration.rb +0 -36
- data/lib/functional-light-service/context/key_verifier.rb +0 -124
- data/lib/functional-light-service/context.rb +0 -208
- data/lib/functional-light-service/deprecations.rb +0 -26
- data/lib/functional-light-service/errors.rb +0 -9
- data/lib/functional-light-service/functional/enum.rb +0 -286
- data/lib/functional-light-service/functional/maybe.rb +0 -21
- data/lib/functional-light-service/functional/monad.rb +0 -77
- data/lib/functional-light-service/functional/null.rb +0 -88
- data/lib/functional-light-service/functional/option.rb +0 -100
- data/lib/functional-light-service/functional/result.rb +0 -129
- data/lib/functional-light-service/functional/sequencer.rb +0 -144
- data/lib/functional-light-service/i18n/localization_adapter.rb +0 -50
- data/lib/functional-light-service/localization_adapter.rb +0 -39
- data/lib/functional-light-service/localization_map.rb +0 -9
- data/lib/functional-light-service/organizer/execute.rb +0 -16
- data/lib/functional-light-service/organizer/iterate.rb +0 -30
- data/lib/functional-light-service/organizer/reduce_case.rb +0 -50
- data/lib/functional-light-service/organizer/reduce_if.rb +0 -19
- data/lib/functional-light-service/organizer/reduce_if_else.rb +0 -23
- data/lib/functional-light-service/organizer/reduce_until.rb +0 -22
- data/lib/functional-light-service/organizer/reduce_while.rb +0 -31
- data/lib/functional-light-service/organizer/scoped_reducable.rb +0 -15
- data/lib/functional-light-service/organizer/with_callback.rb +0 -28
- data/lib/functional-light-service/organizer/with_reducer.rb +0 -81
- data/lib/functional-light-service/organizer/with_reducer_factory.rb +0 -20
- data/lib/functional-light-service/organizer/with_reducer_log_decorator.rb +0 -111
- data/lib/functional-light-service/organizer.rb +0 -129
- data/lib/functional-light-service/testing/context_factory.rb +0 -48
- data/lib/functional-light-service/testing.rb +0 -3
- data/lib/functional-light-service/version.rb +0 -5
- data/resources/fail_actions.png +0 -0
- data/resources/light-service.png +0 -0
- data/resources/organizer_and_actions.png +0 -0
- data/resources/skip_actions.png +0 -0
- data/spec/acceptance/add_numbers_spec.rb +0 -11
- data/spec/acceptance/after_actions_spec.rb +0 -87
- data/spec/acceptance/around_each_spec.rb +0 -19
- data/spec/acceptance/before_actions_spec.rb +0 -115
- data/spec/acceptance/custom_log_from_organizer_spec.rb +0 -61
- data/spec/acceptance/deprecation_warnings_spec.rb +0 -82
- data/spec/acceptance/fail_spec.rb +0 -52
- data/spec/acceptance/log_from_organizer_spec.rb +0 -154
- data/spec/acceptance/message_localization_spec.rb +0 -119
- data/spec/acceptance/organizer/add_aliases_spec.rb +0 -28
- data/spec/acceptance/organizer/add_to_context_spec.rb +0 -54
- data/spec/acceptance/organizer/around_each_with_reduce_if_spec.rb +0 -42
- data/spec/acceptance/organizer/context_failure_and_skipping_spec.rb +0 -90
- data/spec/acceptance/organizer/execute_spec.rb +0 -67
- data/spec/acceptance/organizer/iterate_spec.rb +0 -44
- data/spec/acceptance/organizer/reduce_case_spec.rb +0 -65
- data/spec/acceptance/organizer/reduce_if_else_spec.rb +0 -60
- data/spec/acceptance/organizer/reduce_if_spec.rb +0 -89
- data/spec/acceptance/organizer/reduce_until_spec.rb +0 -49
- data/spec/acceptance/organizer/reduce_while_spec.rb +0 -96
- data/spec/acceptance/organizer/with_callback_spec.rb +0 -113
- data/spec/acceptance/organizer_entry_point_spec.rb +0 -35
- data/spec/acceptance/rollback_spec.rb +0 -183
- data/spec/acceptance/skip_all_remaining_spec.rb +0 -139
- data/spec/acceptance/testing/context_factory_spec.rb +0 -54
- data/spec/action_expected_keys_spec.rb +0 -63
- data/spec/action_expects_and_promises_spec.rb +0 -97
- data/spec/action_optional_expected_keys_spec.rb +0 -107
- data/spec/action_promised_keys_spec.rb +0 -126
- data/spec/action_spec.rb +0 -97
- data/spec/context/inspect_spec.rb +0 -52
- data/spec/context_spec.rb +0 -301
- data/spec/examples/amount_spec.rb +0 -77
- data/spec/examples/controller_spec.rb +0 -63
- data/spec/examples/validate_address_spec.rb +0 -38
- data/spec/i18n_localization_adapter_spec.rb +0 -83
- data/spec/lib/deterministic/class_mixin_spec.rb +0 -24
- data/spec/lib/deterministic/currify_spec.rb +0 -90
- data/spec/lib/deterministic/monad_axioms.rb +0 -46
- data/spec/lib/deterministic/monad_spec.rb +0 -47
- data/spec/lib/deterministic/null_spec.rb +0 -65
- data/spec/lib/deterministic/option_spec.rb +0 -140
- data/spec/lib/deterministic/result/failure_spec.rb +0 -65
- data/spec/lib/deterministic/result/result_map_spec.rb +0 -155
- data/spec/lib/deterministic/result/result_shared.rb +0 -25
- data/spec/lib/deterministic/result/success_spec.rb +0 -41
- data/spec/lib/deterministic/result_spec.rb +0 -63
- data/spec/lib/deterministic/sequencer_spec.rb +0 -506
- data/spec/lib/edge_cases_spec.rb +0 -156
- data/spec/lib/enum_spec.rb +0 -114
- data/spec/lib/native_pattern_matching_spec.rb +0 -74
- data/spec/localization_adapter_spec.rb +0 -66
- data/spec/organizer/with_reducer_spec.rb +0 -56
- data/spec/organizer_key_aliases_spec.rb +0 -29
- data/spec/organizer_spec.rb +0 -115
- data/spec/readme_spec.rb +0 -45
- data/spec/sample/calculates_order_tax_action_spec.rb +0 -16
- data/spec/sample/calculates_tax_spec.rb +0 -30
- data/spec/sample/looks_up_tax_percentage_action_spec.rb +0 -55
- data/spec/sample/provides_free_shipping_action_spec.rb +0 -25
- data/spec/sample/tax/calculates_order_tax_action.rb +0 -10
- data/spec/sample/tax/calculates_tax.rb +0 -11
- data/spec/sample/tax/looks_up_tax_percentage_action.rb +0 -28
- data/spec/sample/tax/provides_free_shipping_action.rb +0 -11
- data/spec/spec_helper.rb +0 -32
- data/spec/support.rb +0 -1
- data/spec/test_doubles.rb +0 -656
- data/spec/testing/context_factory/iterate_spec.rb +0 -39
- data/spec/testing/context_factory/reduce_if_spec.rb +0 -40
- data/spec/testing/context_factory/reduce_until_spec.rb +0 -40
- data/spec/testing/context_factory/with_callback_spec.rb +0 -38
- data/spec/testing/context_factory_spec.rb +0 -76
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe FunctionalLightService::Result do
|
|
4
|
-
include FunctionalLightService::Prelude::Result
|
|
5
|
-
|
|
6
|
-
context ">> (map)" do
|
|
7
|
-
specify { expect(Success(0).map { |n| Success(n + 1) }).to eq Success(1) }
|
|
8
|
-
specify { expect(Failure(0).map { |n| Success(n + 1) }).to eq Failure(0) }
|
|
9
|
-
|
|
10
|
-
it "Failure stops execution" do
|
|
11
|
-
class ChainUnderTest
|
|
12
|
-
include FunctionalLightService::Prelude::Result
|
|
13
|
-
|
|
14
|
-
alias :m :method
|
|
15
|
-
|
|
16
|
-
def call
|
|
17
|
-
init >>
|
|
18
|
-
m(:validate) >>
|
|
19
|
-
m(:send) >>
|
|
20
|
-
m(:parse)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def init
|
|
24
|
-
Success(:step => 1)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def validate(i)
|
|
28
|
-
i[:step] = i[:step] + 1
|
|
29
|
-
Success(i)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def send(i)
|
|
33
|
-
i[:step] = i[:step] + 1
|
|
34
|
-
Failure("Error @ #{i.fetch(:step)}")
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def parse(i)
|
|
38
|
-
i[:step] = i[:step] + 1
|
|
39
|
-
Success(i)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
test = ChainUnderTest.new
|
|
44
|
-
|
|
45
|
-
expect(test.call).to eq Failure("Error @ 3")
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it "expects an Result" do
|
|
49
|
-
def returns_non_result(_i)
|
|
50
|
-
2
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
expect { Success(1) >> method(:returns_non_result) }.to \
|
|
54
|
-
raise_error(FunctionalLightService::Monad::NotMonadError)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "works with a block" do
|
|
58
|
-
expect(
|
|
59
|
-
Success(1).map { |i| Success(i + 1) }
|
|
60
|
-
).to eq Success(2)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it "works with a lambda" do
|
|
64
|
-
expect(
|
|
65
|
-
Success(1) >> ->(i) { Success(i + 1) }
|
|
66
|
-
).to eq Success(2)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "does not catch exceptions" do
|
|
70
|
-
expect do
|
|
71
|
-
Success(1) >> ->(_i) { raise "error" }
|
|
72
|
-
end.to raise_error(RuntimeError)
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
context "using self as the context for success" do
|
|
77
|
-
class SelfContextUnderTest
|
|
78
|
-
include FunctionalLightService::Prelude::Result
|
|
79
|
-
|
|
80
|
-
def call
|
|
81
|
-
@step = 0
|
|
82
|
-
Success(self)
|
|
83
|
-
.map(&:validate)
|
|
84
|
-
.map(&:build)
|
|
85
|
-
.map(&:send)
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def validate
|
|
89
|
-
@step = 1
|
|
90
|
-
Success(self)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def build
|
|
94
|
-
@step = 2
|
|
95
|
-
Success(self)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def send
|
|
99
|
-
@step = 3
|
|
100
|
-
Success(self)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def inspect
|
|
104
|
-
"Step #{@step}"
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# # def self.procify(*meths)
|
|
108
|
-
# # meths.each do |m|
|
|
109
|
-
# # new_m = "__#{m}__procified".to_sym
|
|
110
|
-
# # alias new_m m
|
|
111
|
-
# # define_method new_m do |ctx|
|
|
112
|
-
# # method(m)
|
|
113
|
-
# # end
|
|
114
|
-
# # end
|
|
115
|
-
# # end
|
|
116
|
-
|
|
117
|
-
# procify :send
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
it "works" do
|
|
121
|
-
test = SelfContextUnderTest.new.call
|
|
122
|
-
expect(test).to be_a described_class::Success
|
|
123
|
-
expect(test.inspect).to eq "Success(Step 3)"
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
context "<< (pipe)" do
|
|
128
|
-
it "ignores the output of pipe" do
|
|
129
|
-
acc = "ctx: "
|
|
130
|
-
log = ->(ctx) { acc += ctx.inspect }
|
|
131
|
-
|
|
132
|
-
actual = Success(1).pipe(log).map { Success(2) }
|
|
133
|
-
expect(actual).to eq Success(2)
|
|
134
|
-
expect(acc).to eq "ctx: Success(1)"
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
it "works with <<" do
|
|
138
|
-
log = ->(n) { n.value + 1 }
|
|
139
|
-
foo = ->(n) { Success(n + 1) }
|
|
140
|
-
|
|
141
|
-
Success(1) << log >> foo
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
context ">= (try)" do
|
|
146
|
-
it "try (>=) catches errors and wraps them as Failure" do
|
|
147
|
-
def error(ctx)
|
|
148
|
-
raise "error #{ctx}"
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
actual = Success(1) >= method(:error)
|
|
152
|
-
expect(actual.inspect).to eq "Failure(#<RuntimeError: error 1>)"
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
|
-
end
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
shared_examples 'Result' do
|
|
2
|
-
let(:result_name) { described_class.name.split("::")[-1] }
|
|
3
|
-
specify { expect(subject.value).to eq 1 }
|
|
4
|
-
specify { expect(result.new(subject)).to eq result.new(1) }
|
|
5
|
-
|
|
6
|
-
it "#fmap" do
|
|
7
|
-
expect(result.new(1).fmap { |e| e + 1 }).to eq result.new(2)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
it "#bind" do
|
|
11
|
-
expect(result.new(1).bind { |v| result.new(v + 1) }).to eq result.new(2)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
it "#to_s" do
|
|
15
|
-
expect(result.new(1).to_s).to eq "1"
|
|
16
|
-
# il formato di Hash#to_s/inspect cambia tra Ruby 3.3 e 3.4: costruiamo l'atteso dinamicamente
|
|
17
|
-
expect(result.new(:a => 1).to_s).to eq({ :a => 1 }.to_s)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it "#inspect" do
|
|
21
|
-
expect(result.new(1).inspect).to eq "#{result_name}(1)"
|
|
22
|
-
expect(result.new(:a => 1).inspect).to eq "#{result_name}(#{{ :a => 1 }.inspect})"
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require_relative '../monad_axioms'
|
|
3
|
-
require_relative 'result_shared'
|
|
4
|
-
|
|
5
|
-
describe FunctionalLightService::Result::Success do
|
|
6
|
-
include FunctionalLightService::Prelude::Result
|
|
7
|
-
|
|
8
|
-
it_behaves_like 'a Monad' do
|
|
9
|
-
let(:monad) { described_class }
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
subject { described_class.new(1) }
|
|
13
|
-
|
|
14
|
-
specify { expect(subject).to be_an_instance_of described_class }
|
|
15
|
-
specify { expect(subject).to be_success }
|
|
16
|
-
specify { expect(subject).not_to be_failure }
|
|
17
|
-
specify { expect(subject.success?).to be_truthy }
|
|
18
|
-
specify { expect(subject.failure?).to be_falsey }
|
|
19
|
-
|
|
20
|
-
specify { expect(subject).to be_an_instance_of described_class }
|
|
21
|
-
specify { expect(subject).to eq(described_class.new(1)) }
|
|
22
|
-
specify { expect(subject.fmap { |v| v + 1 }).to eq Success(2) }
|
|
23
|
-
specify { expect(subject.map { |v| Failure(v + 1) }).to eq Failure(2) }
|
|
24
|
-
specify { expect(subject.map_err { |v| Failure(v + 1) }).to eq Success(1) }
|
|
25
|
-
|
|
26
|
-
specify do
|
|
27
|
-
expect(subject.pipe { |r| raise RuntimeError unless r == Success(1) }).to eq Success(1)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
specify { expect(subject.or(Success(2))).to eq Success(1) }
|
|
31
|
-
specify { expect(subject.or_else { Success(2) }).to eq Success(1) }
|
|
32
|
-
|
|
33
|
-
specify { expect(subject.and(Success(2))).to eq Success(2) }
|
|
34
|
-
specify { expect(subject.and(Failure(2))).to eq Failure(2) }
|
|
35
|
-
specify { expect(subject.and_then { Success(2) }).to eq Success(2) }
|
|
36
|
-
specify { expect(subject.and_then { Failure(2) }).to eq Failure(2) }
|
|
37
|
-
|
|
38
|
-
it_behaves_like 'Result' do
|
|
39
|
-
let(:result) { described_class }
|
|
40
|
-
end
|
|
41
|
-
end
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe FunctionalLightService::Result do
|
|
4
|
-
include FunctionalLightService::Prelude::Result
|
|
5
|
-
|
|
6
|
-
it "can't call Result#new directly" do
|
|
7
|
-
# il formato del messaggio NoMethodError cambia tra le versioni di Ruby
|
|
8
|
-
expect { described_class.new(1) }.to raise_error(NoMethodError, /private method [`']new'/)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it "fmap" do
|
|
12
|
-
expect(Success(1).fmap { |n| n + 1 }).to eq Success(2)
|
|
13
|
-
expect(Failure(0).fmap { |n| n + 1 }).to eq Failure(1)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
it "map" do
|
|
17
|
-
expect(Success(1).map { |n| Success(n + 1) }).to eq Success(2)
|
|
18
|
-
expect(Failure(0).map { |n| Success(n + 1) }).to eq Failure(0)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it "+" do
|
|
22
|
-
expect(Success([1]) + Failure([2])).to eq Failure([2])
|
|
23
|
-
expect(Success(1) + Success(1)).to eq Success(2)
|
|
24
|
-
expect(Failure(2) + Success(1)).to eq Failure(2)
|
|
25
|
-
expect(Failure([2]) + Failure([3]) + Success(1)).to eq Failure([2, 3])
|
|
26
|
-
expect(Success([1]) + Success([1])).to eq Success([1, 1])
|
|
27
|
-
expect { Success([1]) + Success(1) }.to raise_error TypeError
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
subject { Success(1) }
|
|
31
|
-
# specify { expect(subject).to be_an_instance_of described_class }
|
|
32
|
-
specify { expect(subject).to be_success }
|
|
33
|
-
specify { expect(subject).not_to be_failure }
|
|
34
|
-
specify { expect(subject.success?).to be_truthy }
|
|
35
|
-
specify { expect(subject.failure?).to be_falsey }
|
|
36
|
-
|
|
37
|
-
specify { expect(subject).to be_a described_class }
|
|
38
|
-
# specify { expect(subject).to eq(described_class.new(1)) }
|
|
39
|
-
specify { expect(subject.fmap { |v| v + 1 }).to eq Success(2) }
|
|
40
|
-
specify { expect(subject.map { |v| Failure(v + 1) }).to eq Failure(2) }
|
|
41
|
-
specify { expect(subject.map_err { |v| Failure(v + 1) }).to eq Success(1) }
|
|
42
|
-
|
|
43
|
-
specify do
|
|
44
|
-
expect(subject.pipe do |r|
|
|
45
|
-
raise RuntimeError unless r == Success(1)
|
|
46
|
-
end).to eq Success(1)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
specify { expect(subject.or(Success(2))).to eq Success(1) }
|
|
50
|
-
specify { expect(subject.or_else { Success(2) }).to eq Success(1) }
|
|
51
|
-
|
|
52
|
-
specify { expect(subject.and(Success(2))).to eq Success(2) }
|
|
53
|
-
specify { expect(subject.and(Failure(2))).to eq Failure(2) }
|
|
54
|
-
specify { expect(subject.and_then { Success(2) }).to eq Success(2) }
|
|
55
|
-
specify { expect(subject.and_then { Failure(2) }).to eq Failure(2) }
|
|
56
|
-
|
|
57
|
-
it "try!" do
|
|
58
|
-
expect(described_class.try! { 1 }).to eq Success(1)
|
|
59
|
-
expect(described_class.try! { raise "error" }.inspect).to \
|
|
60
|
-
eq Failure(RuntimeError.new("error")).inspect
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|