much-result 0.1.2 → 0.1.3
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/Gemfile +3 -1
- data/grep +1 -0
- data/lib/much-result.rb +45 -40
- data/lib/much-result/aggregate.rb +15 -12
- data/lib/much-result/transaction.rb +4 -1
- data/lib/much-result/version.rb +3 -1
- data/much-result.gemspec +6 -2
- data/test/helper.rb +2 -0
- data/test/support/factory.rb +5 -3
- data/test/unit/aggregate_tests.rb +26 -24
- data/test/unit/much-result_tests.rb +81 -92
- data/test/unit/transaction_tests.rb +27 -25
- metadata +20 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c705874728744c7bd72550b17439b2ad5c1105f193eb7e8447c61bce5e9a295a
|
4
|
+
data.tar.gz: 1dcbb19d213567c8aa6b4bcbf31c48f8d271043a73006d5b9a663baa405f88ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1fd908940151548d51ec9dd9270cba7bd09c959e2c84c04d2d317527f7bd1d495ce53424176ee46e7619f28d87dd1fb27ba227fd97d4b2fcf6154a2e63020df
|
7
|
+
data.tar.gz: fc35640da16fbcdd467aa7d764693f5341fb246e9f07d79d0d3e3cafc1a0a38964023e35f3b38fe4853ec42f412a3203b08fa0aab4d4a3acefc41d3346082f89
|
data/Gemfile
CHANGED
data/lib/much-result.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "much-result/version"
|
2
4
|
require "much-result/aggregate"
|
3
5
|
require "much-result/transaction"
|
4
6
|
|
5
7
|
class MuchResult
|
6
|
-
SUCCESS = "success"
|
7
|
-
FAILURE = "failure"
|
8
|
+
SUCCESS = "success"
|
9
|
+
FAILURE = "failure"
|
8
10
|
|
9
11
|
Error = Class.new(StandardError)
|
10
12
|
Rollback = Class.new(RuntimeError)
|
@@ -25,38 +27,38 @@ class MuchResult
|
|
25
27
|
new(
|
26
28
|
!!value ? MuchResult::SUCCESS : MuchResult::FAILURE,
|
27
29
|
**kargs,
|
28
|
-
backtrace: backtrace
|
30
|
+
backtrace: backtrace,
|
29
31
|
)
|
30
32
|
end
|
31
33
|
|
32
34
|
def self.tap(backtrace: caller, **kargs)
|
33
|
-
success(backtrace: backtrace, **kargs).tap
|
35
|
+
success(backtrace: backtrace, **kargs).tap do |result|
|
34
36
|
yield result if block_given?
|
35
|
-
|
37
|
+
end
|
36
38
|
end
|
37
39
|
|
38
40
|
def self.transaction(receiver = nil, backtrace: caller, **kargs, &block)
|
39
41
|
if (transaction_receiver = receiver || default_transaction_receiver).nil?
|
40
42
|
raise(
|
41
43
|
ArgumentError,
|
42
|
-
"no receiver given and no default_transaction_receiver configured."
|
44
|
+
"no receiver given and no default_transaction_receiver configured.",
|
43
45
|
)
|
44
46
|
end
|
45
47
|
|
46
|
-
MuchResult::Transaction.(
|
47
|
-
|
48
|
+
MuchResult::Transaction.call(
|
49
|
+
transaction_receiver,
|
48
50
|
backtrace: backtrace,
|
49
51
|
**kargs,
|
50
52
|
&block
|
51
53
|
)
|
52
54
|
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
+
class << self
|
57
|
+
attr_reader :default_transaction_receiver
|
56
58
|
end
|
57
59
|
|
58
|
-
|
59
|
-
|
60
|
+
class << self
|
61
|
+
attr_writer :default_transaction_receiver
|
60
62
|
end
|
61
63
|
|
62
64
|
attr_reader :sub_results, :description, :backtrace
|
@@ -78,7 +80,7 @@ class MuchResult
|
|
78
80
|
end
|
79
81
|
|
80
82
|
def attributes
|
81
|
-
@data.to_h.reject
|
83
|
+
@data.to_h.reject{ |key, _| key.to_s.start_with?("much_result_") }
|
82
84
|
end
|
83
85
|
|
84
86
|
def attribute_names
|
@@ -88,9 +90,10 @@ class MuchResult
|
|
88
90
|
def success?
|
89
91
|
if @success_predicate.nil?
|
90
92
|
@success_predicate =
|
91
|
-
@sub_results
|
92
|
-
acc
|
93
|
-
|
93
|
+
@sub_results
|
94
|
+
.reduce(@result_value == MuchResult::SUCCESS) do |acc, result|
|
95
|
+
acc && result.success?
|
96
|
+
end
|
94
97
|
end
|
95
98
|
|
96
99
|
@success_predicate
|
@@ -101,35 +104,35 @@ class MuchResult
|
|
101
104
|
end
|
102
105
|
|
103
106
|
def capture_for(value, backtrace: caller, **kargs)
|
104
|
-
self.class.for(value, backtrace: backtrace, **kargs).tap
|
107
|
+
self.class.for(value, backtrace: backtrace, **kargs).tap do |result|
|
105
108
|
@sub_results.push(result)
|
106
109
|
reset_sub_results_cache
|
107
|
-
|
110
|
+
end
|
108
111
|
end
|
109
112
|
|
110
|
-
def capture_for!(value, backtrace:caller, **kargs)
|
111
|
-
capture_for(value, **kargs, backtrace: backtrace).tap
|
113
|
+
def capture_for!(value, backtrace: caller, **kargs)
|
114
|
+
capture_for(value, **kargs, backtrace: backtrace).tap do |result|
|
112
115
|
raise(result.capture_exception) if result.failure?
|
113
|
-
|
116
|
+
end
|
114
117
|
end
|
115
118
|
|
116
119
|
def capture_for_all(values, backtrace: caller, **kargs)
|
117
|
-
[*values].map
|
120
|
+
[*values].map{ |value| capture_for(value, **kargs, backtrace: backtrace) }
|
118
121
|
end
|
119
122
|
|
120
|
-
def capture_for_all!(values, backtrace: caller, **kargs
|
121
|
-
capture_for_all(values, **kargs, backtrace: backtrace).tap
|
123
|
+
def capture_for_all!(values, backtrace: caller, **kargs)
|
124
|
+
capture_for_all(values, **kargs, backtrace: backtrace).tap do |results|
|
122
125
|
if (first_failure_result = results.detect(&:failure?))
|
123
126
|
raise(first_failure_result.capture_exception)
|
124
127
|
end
|
125
|
-
|
128
|
+
end
|
126
129
|
end
|
127
130
|
|
128
131
|
def capture(backtrace: caller, **kargs)
|
129
132
|
capture_for((yield if block_given?), **kargs, backtrace: backtrace)
|
130
133
|
end
|
131
134
|
|
132
|
-
def capture!(backtrace: caller, **kargs
|
135
|
+
def capture!(backtrace: caller, **kargs)
|
133
136
|
capture_for!((yield if block_given?), **kargs, backtrace: backtrace)
|
134
137
|
end
|
135
138
|
|
@@ -137,7 +140,7 @@ class MuchResult
|
|
137
140
|
capture_for_all((yield if block_given?), **kargs, backtrace: backtrace)
|
138
141
|
end
|
139
142
|
|
140
|
-
def capture_all!(backtrace: caller, **kargs
|
143
|
+
def capture_all!(backtrace: caller, **kargs)
|
141
144
|
capture_for_all!((yield if block_given?), **kargs, backtrace: backtrace)
|
142
145
|
end
|
143
146
|
|
@@ -148,58 +151,60 @@ class MuchResult
|
|
148
151
|
end
|
149
152
|
|
150
153
|
def success_sub_results
|
151
|
-
@success_sub_results ||= @sub_results.select
|
154
|
+
@success_sub_results ||= @sub_results.select(&:success?)
|
152
155
|
end
|
153
156
|
|
154
157
|
def failure_sub_results
|
155
|
-
@failure_sub_results ||= @sub_results.select
|
158
|
+
@failure_sub_results ||= @sub_results.select(&:failure?)
|
156
159
|
end
|
157
160
|
|
158
161
|
def all_results
|
159
162
|
@all_results ||=
|
160
163
|
[self] +
|
161
|
-
@sub_results.flat_map
|
164
|
+
@sub_results.flat_map(&:all_results)
|
162
165
|
end
|
163
166
|
|
164
167
|
def all_success_results
|
165
168
|
@all_success_results ||=
|
166
169
|
[*(self if success?)] +
|
167
|
-
@sub_results.flat_map
|
170
|
+
@sub_results.flat_map(&:all_success_results)
|
168
171
|
end
|
169
172
|
|
170
173
|
def all_failure_results
|
171
174
|
@all_failure_results ||=
|
172
175
|
[*(self if failure?)] +
|
173
|
-
@sub_results.flat_map
|
176
|
+
@sub_results.flat_map(&:all_failure_results)
|
174
177
|
end
|
175
178
|
|
176
179
|
def get_for_sub_results(attribute_name)
|
177
|
-
MuchResult::Aggregate.(sub_results.map(&attribute_name.to_sym))
|
180
|
+
MuchResult::Aggregate.call(sub_results.map(&attribute_name.to_sym))
|
178
181
|
end
|
179
182
|
|
180
183
|
def get_for_success_sub_results(attribute_name)
|
181
|
-
MuchResult::Aggregate.(success_sub_results.map(&attribute_name.to_sym))
|
184
|
+
MuchResult::Aggregate.call(success_sub_results.map(&attribute_name.to_sym))
|
182
185
|
end
|
183
186
|
|
184
187
|
def get_for_failure_sub_results(attribute_name)
|
185
|
-
MuchResult::Aggregate.(failure_sub_results.map(&attribute_name.to_sym))
|
188
|
+
MuchResult::Aggregate.call(failure_sub_results.map(&attribute_name.to_sym))
|
186
189
|
end
|
187
190
|
|
188
191
|
def get_for_all_results(attribute_name)
|
189
|
-
MuchResult::Aggregate.(all_results.map(&attribute_name.to_sym))
|
192
|
+
MuchResult::Aggregate.call(all_results.map(&attribute_name.to_sym))
|
190
193
|
end
|
191
194
|
|
192
195
|
def get_for_all_success_results(attribute_name)
|
193
|
-
MuchResult::Aggregate.(all_success_results.map(&attribute_name.to_sym))
|
196
|
+
MuchResult::Aggregate.call(all_success_results.map(&attribute_name.to_sym))
|
194
197
|
end
|
195
198
|
|
196
199
|
def get_for_all_failure_results(attribute_name)
|
197
|
-
MuchResult::Aggregate.(all_failure_results.map(&attribute_name.to_sym))
|
200
|
+
MuchResult::Aggregate.call(all_failure_results.map(&attribute_name.to_sym))
|
198
201
|
end
|
199
202
|
|
203
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
200
204
|
def to_much_result(backtrace: caller, **kargs)
|
201
|
-
|
205
|
+
set(**kargs)
|
202
206
|
end
|
207
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
203
208
|
|
204
209
|
def inspect
|
205
210
|
"#<#{self.class}:#{"0x0%x" % (object_id << 1)} "\
|
@@ -212,7 +217,7 @@ class MuchResult
|
|
212
217
|
private
|
213
218
|
|
214
219
|
def build_default_capture_exception
|
215
|
-
Error.new(description).tap
|
220
|
+
Error.new(description).tap{ |exception| exception.set_backtrace(backtrace) }
|
216
221
|
end
|
217
222
|
|
218
223
|
def reset_sub_results_cache
|
@@ -1,6 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "much-result"
|
2
4
|
|
3
5
|
class MuchResult; end
|
6
|
+
|
4
7
|
class MuchResult::Aggregate
|
5
8
|
def self.call(values)
|
6
9
|
new(values).call
|
@@ -22,23 +25,23 @@ class MuchResult::Aggregate
|
|
22
25
|
|
23
26
|
def combine_in_a_collection(values)
|
24
27
|
if all_hash_values?(values)
|
25
|
-
values
|
26
|
-
reduce
|
27
|
-
transform_values
|
28
|
+
values
|
29
|
+
.reduce{ |acc, value| combine_in_a_hash(acc, value) }
|
30
|
+
.transform_values{ |nested_values| combine_values(nested_values) }
|
28
31
|
else
|
29
32
|
array_wrap(
|
30
|
-
values.reduce([])
|
33
|
+
values.reduce([]){ |acc, value| combine_in_an_array(acc, value) },
|
31
34
|
)
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
35
38
|
def combine_in_a_hash(hash1, hash2)
|
36
|
-
((h1 = hash1 || {}).keys + (h2 = hash2 || {}).keys)
|
37
|
-
uniq
|
38
|
-
reduce({})
|
39
|
+
((h1 = hash1 || {}).keys + (h2 = hash2 || {}).keys)
|
40
|
+
.uniq
|
41
|
+
.reduce({}) do |hash, key|
|
39
42
|
hash[key] = combine_in_an_array(h1[key], h2[key])
|
40
43
|
hash
|
41
|
-
|
44
|
+
end
|
42
45
|
end
|
43
46
|
|
44
47
|
def combine_in_an_array(acc, other)
|
@@ -46,12 +49,12 @@ class MuchResult::Aggregate
|
|
46
49
|
end
|
47
50
|
|
48
51
|
def array_wrap(value)
|
49
|
-
value.
|
52
|
+
value.is_a?(Array) ? value : [value]
|
50
53
|
end
|
51
54
|
|
52
55
|
def all_hash_values?(values)
|
53
|
-
(compacted = values.compact).reduce(compacted.any?)
|
54
|
-
acc && value.
|
55
|
-
|
56
|
+
(compacted = values.compact).reduce(compacted.any?) do |acc, value|
|
57
|
+
acc && value.is_a?(::Hash)
|
58
|
+
end
|
56
59
|
end
|
57
60
|
end
|
@@ -1,6 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "much-result"
|
2
4
|
|
3
5
|
class MuchResult; end
|
6
|
+
|
4
7
|
class MuchResult::Transaction
|
5
8
|
def self.halt_throw_value
|
6
9
|
:muchresult_transaction_halt
|
@@ -27,7 +30,7 @@ class MuchResult::Transaction
|
|
27
30
|
def call(&block)
|
28
31
|
begin
|
29
32
|
@receiver.transaction do
|
30
|
-
catch(self.class.halt_throw_value)
|
33
|
+
catch(self.class.halt_throw_value){ block.call(self) }
|
31
34
|
end
|
32
35
|
rescue MuchResult::Rollback
|
33
36
|
# do nothing
|
data/lib/much-result/version.rb
CHANGED
data/much-result.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
lib = File.expand_path("../lib", __FILE__)
|
3
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
6
|
require "much-result/version"
|
@@ -13,12 +15,14 @@ Gem::Specification.new do |gem|
|
|
13
15
|
gem.homepage = "https://github.com/redding/much-result"
|
14
16
|
gem.license = "MIT"
|
15
17
|
|
16
|
-
gem.files
|
18
|
+
gem.files = `git ls-files | grep "^[^.]"`.split($INPUT_RECORD_SEPARATOR)
|
19
|
+
|
17
20
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
21
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
22
|
gem.require_paths = ["lib"]
|
20
23
|
|
21
24
|
gem.required_ruby_version = "~> 2.5"
|
22
25
|
|
23
|
-
gem.add_development_dependency("
|
26
|
+
gem.add_development_dependency("much-style-guide", ["~> 0.6.0"])
|
27
|
+
gem.add_development_dependency("assert", ["~> 2.19.3"])
|
24
28
|
end
|
data/test/helper.rb
CHANGED
data/test/support/factory.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "assert/factory"
|
2
4
|
require "much-stub/call"
|
3
5
|
|
@@ -11,7 +13,7 @@ module Factory
|
|
11
13
|
def self.hash_value(with_nested_hash = true)
|
12
14
|
{
|
13
15
|
value1: Factory.value,
|
14
|
-
value2: with_nested_hash ? Factory.hash_value(false) : Factory.value
|
16
|
+
value2: with_nested_hash ? Factory.hash_value(false) : Factory.value,
|
15
17
|
}
|
16
18
|
end
|
17
19
|
|
@@ -30,9 +32,9 @@ module Factory
|
|
30
32
|
@rolled_back = false
|
31
33
|
@last_transaction_call = MuchStub::Call.new(&block)
|
32
34
|
block.call
|
33
|
-
rescue =>
|
35
|
+
rescue => ex
|
34
36
|
@rolled_back = true
|
35
|
-
raise
|
37
|
+
raise ex
|
36
38
|
end
|
37
39
|
|
38
40
|
def rolled_back?
|
@@ -1,27 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "assert"
|
2
4
|
require "much-result/aggregate"
|
3
5
|
|
4
6
|
class MuchResult::Aggregate
|
5
7
|
class UnitTests < Assert::Context
|
6
8
|
desc "MuchResult::Aggregate"
|
7
|
-
subject
|
9
|
+
subject{ unit_class }
|
8
10
|
|
9
|
-
let(:unit_class)
|
11
|
+
let(:unit_class){ MuchResult::Aggregate }
|
10
12
|
|
11
|
-
let(:values1)
|
12
|
-
[Factory.value, Factory.value, Factory.value,
|
13
|
-
|
14
|
-
let(:hash_values1)
|
13
|
+
let(:values1) do
|
14
|
+
[Factory.value, Factory.value, Factory.value, {}]
|
15
|
+
end
|
16
|
+
let(:hash_values1) do
|
15
17
|
[Factory.hash_value, Factory.hash_value, Factory.hash_value]
|
16
|
-
|
18
|
+
end
|
17
19
|
|
18
20
|
should have_imeths :call
|
19
21
|
|
20
22
|
should "build instances and call them" do
|
21
|
-
Assert.stub_tap_on_call(subject, :new)
|
23
|
+
Assert.stub_tap_on_call(subject, :new) do |instance, call|
|
22
24
|
@instance_new_call = call
|
23
|
-
Assert.stub(instance, :call)
|
24
|
-
|
25
|
+
Assert.stub(instance, :call){ @instance_called = true }
|
26
|
+
end
|
25
27
|
|
26
28
|
subject.call(values1)
|
27
29
|
|
@@ -32,9 +34,9 @@ class MuchResult::Aggregate
|
|
32
34
|
|
33
35
|
class InitTests < UnitTests
|
34
36
|
desc "when init"
|
35
|
-
subject
|
37
|
+
subject{ unit_class.new(init_values) }
|
36
38
|
|
37
|
-
let(:init_values)
|
39
|
+
let(:init_values){ [values1, hash_values1, [], nil].sample }
|
38
40
|
|
39
41
|
should have_imeths :call
|
40
42
|
end
|
@@ -42,7 +44,7 @@ class MuchResult::Aggregate
|
|
42
44
|
class CalledWithAnEmptyArrayTests < InitTests
|
43
45
|
desc "and called with an empty Array"
|
44
46
|
|
45
|
-
let(:init_values)
|
47
|
+
let(:init_values){ [] }
|
46
48
|
# let(:init_values) { [[], nil, [nil, nil]].sample }
|
47
49
|
|
48
50
|
should "return an empty Array" do
|
@@ -53,7 +55,7 @@ class MuchResult::Aggregate
|
|
53
55
|
class CalledWithASingleNonHashValueTests < InitTests
|
54
56
|
desc "and called with single non-Hash value"
|
55
57
|
|
56
|
-
let(:init_values)
|
58
|
+
let(:init_values){ [Factory.value, nil].sample }
|
57
59
|
|
58
60
|
should "return the value wrapped in an Array" do
|
59
61
|
assert_that(subject.call).equals([init_values])
|
@@ -63,8 +65,8 @@ class MuchResult::Aggregate
|
|
63
65
|
class CalledWithASingleHashValueTests < InitTests
|
64
66
|
desc "and called with single Hash value"
|
65
67
|
|
66
|
-
let(:value1)
|
67
|
-
let(:init_values)
|
68
|
+
let(:value1){ [Factory.value, nil].sample }
|
69
|
+
let(:init_values){ { value: value1 } }
|
68
70
|
|
69
71
|
should "return the Hash with its values wrapped in an Array" do
|
70
72
|
assert_that(subject.call).equals(value: [value1])
|
@@ -74,7 +76,7 @@ class MuchResult::Aggregate
|
|
74
76
|
class CalledWithAMixedValueArrayTests < InitTests
|
75
77
|
desc "and called with a mixed-value Array"
|
76
78
|
|
77
|
-
let(:init_values)
|
79
|
+
let(:init_values){ [nil, values1, [], { value: 1 }, nil] }
|
78
80
|
|
79
81
|
should "combines the values into an Array, flattening any sub-Arrays" do
|
80
82
|
assert_that(subject.call).equals([nil, *values1, { value: 1 }, nil])
|
@@ -84,17 +86,17 @@ class MuchResult::Aggregate
|
|
84
86
|
class CalledWithAnAllHashValueArrayTests < InitTests
|
85
87
|
desc "and called with an all-Hash-value Array"
|
86
88
|
|
87
|
-
let(:init_values)
|
89
|
+
let(:init_values){ [nil] + hash_values1 + [nil] }
|
88
90
|
|
89
|
-
let(:expected_aggregate_value)
|
91
|
+
let(:expected_aggregate_value) do
|
90
92
|
{
|
91
|
-
value1: init_values.map
|
93
|
+
value1: init_values.map{ |hash| (hash || {})[:value1] },
|
92
94
|
value2: {
|
93
|
-
value1: init_values.map
|
94
|
-
value2: init_values.map
|
95
|
-
}
|
95
|
+
value1: init_values.map{ |hash| (hash || {}).dig(:value2, :value1) },
|
96
|
+
value2: init_values.map{ |hash| (hash || {}).dig(:value2, :value2) },
|
97
|
+
},
|
96
98
|
}
|
97
|
-
|
99
|
+
end
|
98
100
|
|
99
101
|
should "recursively combine the hash values, removing any nils" do
|
100
102
|
assert_that(subject.call).equals(expected_aggregate_value)
|
@@ -1,17 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "assert"
|
2
4
|
require "much-result"
|
3
5
|
|
4
6
|
class MuchResult
|
5
7
|
class UnitTests < Assert::Context
|
6
8
|
desc "MuchResult"
|
7
|
-
subject
|
9
|
+
subject{ unit_class }
|
8
10
|
|
9
|
-
let(:unit_class)
|
11
|
+
let(:unit_class){ MuchResult }
|
10
12
|
|
11
|
-
let(:identifier1)
|
12
|
-
let(:description1)
|
13
|
-
let(:backtrace1)
|
14
|
-
let(:value1)
|
13
|
+
let(:identifier1){ Factory.string }
|
14
|
+
let(:description1){ Factory.string }
|
15
|
+
let(:backtrace1){ Factory.backtrace }
|
16
|
+
let(:value1){ Factory.value }
|
15
17
|
|
16
18
|
should have_imeths :success, :failure, :for, :tap, :transaction
|
17
19
|
should have_accessors :default_transaction_receiver
|
@@ -75,27 +77,27 @@ class MuchResult
|
|
75
77
|
should "build instances yielded to a given block" do
|
76
78
|
yielded_result = nil
|
77
79
|
tap_result =
|
78
|
-
subject.tap
|
80
|
+
subject.tap do |result|
|
79
81
|
yielded_result = result
|
80
82
|
|
81
83
|
assert_that(result.success?).is_true
|
82
84
|
assert_that(result.sub_results.size).equals(0)
|
83
85
|
assert_that(result.all_results.size).equals(1)
|
84
|
-
|
86
|
+
end
|
85
87
|
assert_that(tap_result).is_the_same_as(yielded_result)
|
86
88
|
end
|
87
89
|
|
88
90
|
should "call transactions on a transaction receiver" do
|
89
|
-
MuchStub.on_call(MuchResult::Transaction, :call)
|
91
|
+
MuchStub.on_call(MuchResult::Transaction, :call) do |call|
|
90
92
|
@transaction_call = call
|
91
|
-
|
93
|
+
end
|
92
94
|
|
93
95
|
receiver1 = Factory.transaction_receiver
|
94
96
|
kargs1 = {
|
95
97
|
backtrace: Factory.backtrace,
|
96
|
-
value: value1
|
98
|
+
value: value1,
|
97
99
|
}
|
98
|
-
block1 = ->
|
100
|
+
block1 = ->{}
|
99
101
|
subject.transaction(receiver1, **kargs1, &block1)
|
100
102
|
|
101
103
|
assert_that(@transaction_call.pargs).equals([receiver1])
|
@@ -107,28 +109,28 @@ class MuchResult
|
|
107
109
|
receiver1 = Factory.transaction_receiver
|
108
110
|
result =
|
109
111
|
subject.transaction(receiver1) do |transaction|
|
110
|
-
transaction.capture
|
112
|
+
transaction.capture{ "something1" }
|
111
113
|
transaction.halt
|
112
|
-
transaction.capture
|
114
|
+
transaction.capture{ "something2" }
|
113
115
|
end
|
114
116
|
|
115
117
|
assert_that(result.sub_results.size).equals(1)
|
116
118
|
end
|
117
119
|
|
118
120
|
should "configure default transaction receivers" do
|
119
|
-
MuchStub.on_call(MuchResult::Transaction, :call)
|
121
|
+
MuchStub.on_call(MuchResult::Transaction, :call) do |call|
|
120
122
|
@transaction_call = call
|
121
|
-
|
123
|
+
end
|
122
124
|
|
123
125
|
receiver1 = Factory.transaction_receiver
|
124
126
|
kargs1 = {
|
125
127
|
backtrace: Factory.backtrace,
|
126
|
-
value: value1
|
128
|
+
value: value1,
|
127
129
|
}
|
128
|
-
block1 = ->
|
130
|
+
block1 = ->{}
|
129
131
|
|
130
132
|
assert_that(subject.default_transaction_receiver).is_nil
|
131
|
-
assert_that(->
|
133
|
+
assert_that(->{
|
132
134
|
subject.transaction(**kargs1, &block1)
|
133
135
|
}).raises(ArgumentError)
|
134
136
|
|
@@ -147,14 +149,14 @@ class MuchResult
|
|
147
149
|
|
148
150
|
class InitTests < UnitTests
|
149
151
|
desc "when init"
|
150
|
-
subject
|
152
|
+
subject{ unit_class.success }
|
151
153
|
|
152
|
-
let(:failure1)
|
154
|
+
let(:failure1) do
|
153
155
|
unit_class.failure(description: Factory.string)
|
154
|
-
|
155
|
-
let(:failure2)
|
156
|
+
end
|
157
|
+
let(:failure2) do
|
156
158
|
unit_class.failure(exception: StandardError.new(Factory.string))
|
157
|
-
|
159
|
+
end
|
158
160
|
|
159
161
|
should have_imeths :description, :backtrace, :set
|
160
162
|
should have_imeths :attributes, :attribute_names
|
@@ -167,9 +169,11 @@ class MuchResult
|
|
167
169
|
should have_imeths :sub_results, :success_sub_results, :failure_sub_results
|
168
170
|
should have_imeths :all_results, :all_success_results, :all_failure_results
|
169
171
|
should have_imeths :get_for_sub_results
|
170
|
-
should have_imeths :get_for_success_sub_results
|
172
|
+
should have_imeths :get_for_success_sub_results
|
173
|
+
should have_imeths :get_for_failure_sub_results
|
171
174
|
should have_imeths :get_for_all_results
|
172
|
-
should have_imeths :get_for_all_success_results
|
175
|
+
should have_imeths :get_for_all_success_results
|
176
|
+
should have_imeths :get_for_all_failure_results
|
173
177
|
should have_imeths :to_much_result
|
174
178
|
|
175
179
|
should "know its attributes" do
|
@@ -182,7 +186,7 @@ class MuchResult
|
|
182
186
|
identifier: identifier1,
|
183
187
|
description: description1,
|
184
188
|
backtrace: backtrace1,
|
185
|
-
value: value1
|
189
|
+
value: value1,
|
186
190
|
)
|
187
191
|
assert_that(result.identifier).equals(identifier1)
|
188
192
|
assert_that(result.description).equals(description1)
|
@@ -234,68 +238,53 @@ class MuchResult
|
|
234
238
|
assert_that(subject.sub_results.size).equals(1)
|
235
239
|
assert_that(subject.success_sub_results.size).equals(1)
|
236
240
|
assert_that(subject.failure_sub_results.size).equals(0)
|
237
|
-
assert_that(subject.get_for_sub_results("values")[:value1])
|
238
|
-
[
|
239
|
-
|
240
|
-
])
|
241
|
-
assert_that(subject.
|
242
|
-
[
|
243
|
-
subject.success_sub_results.first.values[:value1]
|
244
|
-
])
|
245
|
-
assert_that(subject.get_for_failure_sub_results("values")).equals(
|
246
|
-
[])
|
241
|
+
assert_that(subject.get_for_sub_results("values")[:value1])
|
242
|
+
.equals([subject.success_sub_results.first.values[:value1]])
|
243
|
+
assert_that(subject.get_for_success_sub_results("values")[:value1])
|
244
|
+
.equals([subject.success_sub_results.first.values[:value1]])
|
245
|
+
assert_that(subject.get_for_failure_sub_results("values"))
|
246
|
+
.equals([])
|
247
247
|
assert_that(subject.all_results.size).equals(2)
|
248
248
|
assert_that(subject.all_success_results.size).equals(2)
|
249
249
|
assert_that(subject.all_failure_results.size).equals(0)
|
250
|
-
assert_that(subject.get_for_all_results("values")[:value1])
|
251
|
-
[
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
[
|
257
|
-
nil,
|
258
|
-
subject.success_sub_results.first.values[:value1]
|
259
|
-
])
|
260
|
-
assert_that(subject.get_for_all_failure_results("values")).equals(
|
261
|
-
[])
|
250
|
+
assert_that(subject.get_for_all_results("values")[:value1])
|
251
|
+
.equals([nil, subject.success_sub_results.first.values[:value1]])
|
252
|
+
assert_that(subject.get_for_all_success_results("values")[:value1])
|
253
|
+
.equals([nil, subject.success_sub_results.first.values[:value1]])
|
254
|
+
assert_that(subject.get_for_all_failure_results("values"))
|
255
|
+
.equals([])
|
262
256
|
|
263
257
|
subject.capture_for(unit_class.failure(values: { value1: Factory.value }))
|
264
258
|
assert_that(subject.success?).is_false
|
265
259
|
assert_that(subject.sub_results.size).equals(2)
|
266
260
|
assert_that(subject.success_sub_results.size).equals(1)
|
267
261
|
assert_that(subject.failure_sub_results.size).equals(1)
|
268
|
-
assert_that(subject.get_for_sub_results("values")[:value1])
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
])
|
277
|
-
assert_that(subject.get_for_failure_sub_results("values")[:value1])
|
278
|
-
[
|
279
|
-
subject.failure_sub_results.first.values[:value1]
|
280
|
-
])
|
262
|
+
assert_that(subject.get_for_sub_results("values")[:value1])
|
263
|
+
.equals(
|
264
|
+
[
|
265
|
+
subject.success_sub_results.first.values[:value1],
|
266
|
+
subject.failure_sub_results.first.values[:value1],
|
267
|
+
],
|
268
|
+
)
|
269
|
+
assert_that(subject.get_for_success_sub_results("values")[:value1])
|
270
|
+
.equals([subject.success_sub_results.first.values[:value1]])
|
271
|
+
assert_that(subject.get_for_failure_sub_results("values")[:value1])
|
272
|
+
.equals([subject.failure_sub_results.first.values[:value1]])
|
281
273
|
assert_that(subject.all_results.size).equals(3)
|
282
274
|
assert_that(subject.all_success_results.size).equals(1)
|
283
275
|
assert_that(subject.all_failure_results.size).equals(2)
|
284
|
-
assert_that(subject.get_for_all_results("values")[:value1])
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
])
|
294
|
-
assert_that(subject.get_for_all_failure_results("values")[:value1])
|
295
|
-
[
|
296
|
-
nil,
|
297
|
-
subject.failure_sub_results.first.values[:value1]
|
298
|
-
])
|
276
|
+
assert_that(subject.get_for_all_results("values")[:value1])
|
277
|
+
.equals(
|
278
|
+
[
|
279
|
+
nil,
|
280
|
+
subject.success_sub_results.first.values[:value1],
|
281
|
+
subject.failure_sub_results.first.values[:value1],
|
282
|
+
],
|
283
|
+
)
|
284
|
+
assert_that(subject.get_for_all_success_results("values")[:value1])
|
285
|
+
.equals([subject.success_sub_results.first.values[:value1]])
|
286
|
+
assert_that(subject.get_for_all_failure_results("values")[:value1])
|
287
|
+
.equals([nil, subject.failure_sub_results.first.values[:value1]])
|
299
288
|
|
300
289
|
result = unit_class.success
|
301
290
|
|
@@ -321,7 +310,7 @@ class MuchResult
|
|
321
310
|
|
322
311
|
# Test the default built capture exception.
|
323
312
|
exception =
|
324
|
-
assert_that(->
|
313
|
+
assert_that(->{
|
325
314
|
result.capture_for!(failure1)
|
326
315
|
}).raises(MuchResult::Error)
|
327
316
|
assert_that(exception.message).equals(failure1.description)
|
@@ -337,7 +326,7 @@ class MuchResult
|
|
337
326
|
# Test that we prefer any set `result.exception` over the default built
|
338
327
|
# capture exception.
|
339
328
|
exception =
|
340
|
-
assert_that(->
|
329
|
+
assert_that(->{
|
341
330
|
result.capture_for!(failure2)
|
342
331
|
}).raises(failure2.exception.class)
|
343
332
|
assert_that(exception.message).equals(failure2.exception.message)
|
@@ -366,8 +355,8 @@ class MuchResult
|
|
366
355
|
result.capture_for_all(
|
367
356
|
[
|
368
357
|
[true, Factory.integer, Factory.string].sample,
|
369
|
-
[false, nil].sample
|
370
|
-
]
|
358
|
+
[false, nil].sample,
|
359
|
+
],
|
371
360
|
)
|
372
361
|
assert_that(result.success?).is_false
|
373
362
|
assert_that(result.sub_results.size).equals(2)
|
@@ -380,7 +369,7 @@ class MuchResult
|
|
380
369
|
result = unit_class.success
|
381
370
|
|
382
371
|
exception =
|
383
|
-
assert_that(->
|
372
|
+
assert_that(->{
|
384
373
|
result.capture_for_all!([failure1, failure2])
|
385
374
|
}).raises(MuchResult::Error)
|
386
375
|
assert_that(exception.message).equals(failure1.description)
|
@@ -395,7 +384,7 @@ class MuchResult
|
|
395
384
|
end
|
396
385
|
|
397
386
|
should "capture MuchResults from a block as sub-results" do
|
398
|
-
subject.capture
|
387
|
+
subject.capture{ unit_class.success }
|
399
388
|
assert_that(subject.success?).is_true
|
400
389
|
assert_that(subject.sub_results.size).equals(1)
|
401
390
|
assert_that(subject.success_sub_results.size).equals(1)
|
@@ -404,7 +393,7 @@ class MuchResult
|
|
404
393
|
assert_that(subject.all_success_results.size).equals(2)
|
405
394
|
assert_that(subject.all_failure_results.size).equals(0)
|
406
395
|
|
407
|
-
subject.capture
|
396
|
+
subject.capture{ unit_class.failure }
|
408
397
|
assert_that(subject.success?).is_false
|
409
398
|
assert_that(subject.sub_results.size).equals(2)
|
410
399
|
assert_that(subject.success_sub_results.size).equals(1)
|
@@ -415,7 +404,7 @@ class MuchResult
|
|
415
404
|
|
416
405
|
result = unit_class.success
|
417
406
|
|
418
|
-
result.capture
|
407
|
+
result.capture{ [true, Factory.integer, Factory.string].sample }
|
419
408
|
assert_that(result.success?).is_true
|
420
409
|
assert_that(result.sub_results.size).equals(1)
|
421
410
|
assert_that(result.success_sub_results.size).equals(1)
|
@@ -424,7 +413,7 @@ class MuchResult
|
|
424
413
|
assert_that(result.all_success_results.size).equals(2)
|
425
414
|
assert_that(result.all_failure_results.size).equals(0)
|
426
415
|
|
427
|
-
result.capture
|
416
|
+
result.capture{ [false, nil].sample }
|
428
417
|
assert_that(result.success?).is_false
|
429
418
|
assert_that(result.sub_results.size).equals(2)
|
430
419
|
assert_that(result.success_sub_results.size).equals(1)
|
@@ -436,8 +425,8 @@ class MuchResult
|
|
436
425
|
result = unit_class.success
|
437
426
|
|
438
427
|
exception =
|
439
|
-
assert_that(->
|
440
|
-
result.capture!
|
428
|
+
assert_that(->{
|
429
|
+
result.capture!{ failure1 }
|
441
430
|
}).raises(MuchResult::Error)
|
442
431
|
assert_that(exception.message).equals(failure1.description)
|
443
432
|
assert_that(exception.backtrace).equals(failure1.backtrace)
|
@@ -451,7 +440,7 @@ class MuchResult
|
|
451
440
|
end
|
452
441
|
|
453
442
|
should "capture MuchResults from a block from an Array as sub-results" do
|
454
|
-
subject.capture_all
|
443
|
+
subject.capture_all{ [unit_class.success, unit_class.failure] }
|
455
444
|
assert_that(subject.success?).is_false
|
456
445
|
assert_that(subject.sub_results.size).equals(2)
|
457
446
|
assert_that(subject.success_sub_results.size).equals(1)
|
@@ -465,7 +454,7 @@ class MuchResult
|
|
465
454
|
result.capture_all do
|
466
455
|
[
|
467
456
|
[true, Factory.integer, Factory.string].sample,
|
468
|
-
[false, nil].sample
|
457
|
+
[false, nil].sample,
|
469
458
|
]
|
470
459
|
end
|
471
460
|
assert_that(result.success?).is_false
|
@@ -479,8 +468,8 @@ class MuchResult
|
|
479
468
|
result = unit_class.success
|
480
469
|
|
481
470
|
exception =
|
482
|
-
assert_that(->
|
483
|
-
result.capture_all!
|
471
|
+
assert_that(->{
|
472
|
+
result.capture_all!{ [failure1, failure2] }
|
484
473
|
}).raises(MuchResult::Error)
|
485
474
|
assert_that(exception.message).equals(failure1.description)
|
486
475
|
assert_that(exception.backtrace).equals(failure1.backtrace)
|
@@ -1,21 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "assert"
|
2
4
|
require "much-result/transaction"
|
3
5
|
|
4
6
|
class MuchResult::Transaction
|
5
7
|
class UnitTests < Assert::Context
|
6
8
|
desc "MuchResult::Transaction"
|
7
|
-
subject
|
9
|
+
subject{ unit_class }
|
8
10
|
|
9
|
-
let(:unit_class)
|
11
|
+
let(:unit_class){ MuchResult::Transaction }
|
10
12
|
|
11
|
-
let(:receiver1)
|
12
|
-
let(:value1)
|
13
|
-
let(:kargs1)
|
14
|
-
{ value:
|
15
|
-
|
16
|
-
let(:block1)
|
17
|
-
->(transaction)
|
18
|
-
|
13
|
+
let(:receiver1){ Factory.transaction_receiver }
|
14
|
+
let(:value1){ Factory.value }
|
15
|
+
let(:kargs1) do
|
16
|
+
{ value: value1 }
|
17
|
+
end
|
18
|
+
let(:block1) do
|
19
|
+
->(transaction){ transaction.set(block_called: true) }
|
20
|
+
end
|
19
21
|
|
20
22
|
should have_imeths :halt_throw_value, :call
|
21
23
|
|
@@ -24,12 +26,12 @@ class MuchResult::Transaction
|
|
24
26
|
end
|
25
27
|
|
26
28
|
should "call transactions on a transaction receiver" do
|
27
|
-
MuchStub.tap_on_call(unit_class, :new)
|
29
|
+
MuchStub.tap_on_call(unit_class, :new) do |transaction, new_call|
|
28
30
|
@new_call = new_call
|
29
|
-
MuchStub.on_call(transaction, :call)
|
31
|
+
MuchStub.on_call(transaction, :call) do |transaction_call|
|
30
32
|
@transaction_call = transaction_call
|
31
|
-
|
32
|
-
|
33
|
+
end
|
34
|
+
end
|
33
35
|
|
34
36
|
subject.call(receiver1, **kargs1, &block1)
|
35
37
|
|
@@ -41,12 +43,12 @@ class MuchResult::Transaction
|
|
41
43
|
|
42
44
|
class InitTests < UnitTests
|
43
45
|
desc "when init"
|
44
|
-
subject
|
46
|
+
subject{ unit_class.new(receiver1, **kargs1) }
|
45
47
|
|
46
48
|
should have_imeths :result, :call, :rollback, :halt
|
47
49
|
|
48
50
|
should "complain if given a nil receiver" do
|
49
|
-
assert_that(->
|
51
|
+
assert_that(->{
|
50
52
|
unit_class.new(nil, **kargs1)
|
51
53
|
}).raises(ArgumentError)
|
52
54
|
end
|
@@ -65,9 +67,9 @@ class MuchResult::Transaction
|
|
65
67
|
end
|
66
68
|
|
67
69
|
should "call transactions on the transaction receiver" do
|
68
|
-
MuchStub.tap_on_call(block1, :call)
|
70
|
+
MuchStub.tap_on_call(block1, :call) do |_, call|
|
69
71
|
@block_call = call
|
70
|
-
|
72
|
+
end
|
71
73
|
|
72
74
|
result = subject.call(&block1)
|
73
75
|
|
@@ -78,14 +80,14 @@ class MuchResult::Transaction
|
|
78
80
|
end
|
79
81
|
|
80
82
|
should "rollback transactions on the transaction receiver" do
|
81
|
-
assert_that(->
|
83
|
+
assert_that(->{ subject.rollback }).raises(MuchResult::Rollback)
|
82
84
|
|
83
|
-
block1 = ->(transaction)
|
84
|
-
assert_that(->
|
85
|
+
block1 = ->(transaction){ transaction.rollback }
|
86
|
+
assert_that(->{ subject.call(&block1) }).does_not_raise
|
85
87
|
assert_that(receiver1.rolled_back?).is_true
|
86
88
|
|
87
|
-
block1 = ->(
|
88
|
-
assert_that(->
|
89
|
+
block1 = ->(_transaction){ raise StandardError }
|
90
|
+
assert_that(->{ subject.call(&block1) }).raises(StandardError)
|
89
91
|
assert_that(receiver1.rolled_back?).is_true
|
90
92
|
|
91
93
|
assert_that(subject.result.much_result_transaction_rolled_back).is_true
|
@@ -94,9 +96,9 @@ class MuchResult::Transaction
|
|
94
96
|
|
95
97
|
should "halt transactions" do
|
96
98
|
catch(unit_class.halt_throw_value) do
|
97
|
-
subject.capture
|
99
|
+
subject.capture{ "something1" }
|
98
100
|
subject.halt
|
99
|
-
subject.capture
|
101
|
+
subject.capture{ "something2" }
|
100
102
|
end
|
101
103
|
|
102
104
|
assert_that(subject.sub_results.size).equals(1)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: much-result
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kelly Redding
|
@@ -9,22 +9,36 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-01-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: much-style-guide
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.6.0
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.6.0
|
14
28
|
- !ruby/object:Gem::Dependency
|
15
29
|
name: assert
|
16
30
|
requirement: !ruby/object:Gem::Requirement
|
17
31
|
requirements:
|
18
32
|
- - "~>"
|
19
33
|
- !ruby/object:Gem::Version
|
20
|
-
version: 2.
|
34
|
+
version: 2.19.3
|
21
35
|
type: :development
|
22
36
|
prerelease: false
|
23
37
|
version_requirements: !ruby/object:Gem::Requirement
|
24
38
|
requirements:
|
25
39
|
- - "~>"
|
26
40
|
- !ruby/object:Gem::Version
|
27
|
-
version: 2.
|
41
|
+
version: 2.19.3
|
28
42
|
description: API for managing the results of operations.
|
29
43
|
email:
|
30
44
|
- kelly@kellyredding.com
|
@@ -36,6 +50,7 @@ files:
|
|
36
50
|
- Gemfile
|
37
51
|
- LICENSE
|
38
52
|
- README.md
|
53
|
+
- grep
|
39
54
|
- lib/much-result.rb
|
40
55
|
- lib/much-result/aggregate.rb
|
41
56
|
- lib/much-result/transaction.rb
|
@@ -68,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
68
83
|
- !ruby/object:Gem::Version
|
69
84
|
version: '0'
|
70
85
|
requirements: []
|
71
|
-
rubygems_version: 3.
|
86
|
+
rubygems_version: 3.2.4
|
72
87
|
signing_key:
|
73
88
|
specification_version: 4
|
74
89
|
summary: API for managing the results of operations.
|