verbalize 2.0.1 → 2.1.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/README.md +42 -16
- data/lib/verbalize/action.rb +16 -0
- data/lib/verbalize/build.rb +10 -5
- data/lib/verbalize/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 906d5dc6f28ab649fe2d08a666726e7b6718957f
|
4
|
+
data.tar.gz: 5689edea2dbfa8a0789eb07622420ff3753fe506
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e80ec6ed639bf4e17cd88ac5c03074d79a2f38250193ccb7586c711c4fde1a84851228a93e8550f3af53cb8d7eeec966fff4a04ace5b41af7f4265dc8b16035
|
7
|
+
data.tar.gz: f25395a64d6255547806f218cec5c6c2615b82245865394c1fd1cf4af19f5f9c40c74fb75451e2cbff667aa8fa8387f8ddc76d49b8bc5c99767a16fe4b1655b0
|
data/README.md
CHANGED
@@ -69,6 +69,33 @@ result = Divide.call(a: 1, b: 0) # => [:error, 'You can’t divide by 0']
|
|
69
69
|
result.failed? # => true
|
70
70
|
```
|
71
71
|
|
72
|
+
### Reflection
|
73
|
+
```ruby
|
74
|
+
class Add
|
75
|
+
include Verbalize::Action
|
76
|
+
|
77
|
+
input :a, :b, optional: [:c, :d]
|
78
|
+
|
79
|
+
def call
|
80
|
+
a + b + c + d
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def c
|
86
|
+
@c ||= 0
|
87
|
+
end
|
88
|
+
|
89
|
+
def d
|
90
|
+
@d ||= 0
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
Add.required_inputs # [:a, :b]
|
95
|
+
Add.optional_inputs # [:c, :d]
|
96
|
+
Add.inputs # [:a, :b, :c, :d]
|
97
|
+
```
|
98
|
+
|
72
99
|
## Comparison/Benchmark
|
73
100
|
```ruby
|
74
101
|
require 'verbalize'
|
@@ -155,15 +182,15 @@ Comparison:
|
|
155
182
|
### Happy Path
|
156
183
|
|
157
184
|
When testing positive cases of a `Verbalize::Action`, it is recommended to test using the `call!` class method and
|
158
|
-
assert on the result. This implicitly ensures a successful result, and your tests will fail with a bang! if
|
185
|
+
assert on the result. This implicitly ensures a successful result, and your tests will fail with a bang! if
|
159
186
|
something goes wrong:
|
160
187
|
|
161
188
|
```ruby
|
162
189
|
class MyAction
|
163
190
|
include Verbalize::Action
|
164
|
-
|
191
|
+
|
165
192
|
input :a
|
166
|
-
|
193
|
+
|
167
194
|
def call
|
168
195
|
fail!('#{a} is greater than than 100!') if a >= 100
|
169
196
|
a + 1
|
@@ -178,28 +205,28 @@ end
|
|
178
205
|
|
179
206
|
### Sad Path
|
180
207
|
|
181
|
-
When testing negative cases of a `Verbalize::Action`, it is recommended to test using the `call` non-bang
|
208
|
+
When testing negative cases of a `Verbalize::Action`, it is recommended to test using the `call` non-bang
|
182
209
|
class method which will return a `Verbalize::Failure` on failure.
|
183
210
|
|
184
|
-
Use of `call!` here is not advised as it will result in an exception being thrown. Set assertions on both
|
211
|
+
Use of `call!` here is not advised as it will result in an exception being thrown. Set assertions on both
|
185
212
|
the failure outcome and value:
|
186
213
|
|
187
214
|
```ruby
|
188
215
|
class MyAction
|
189
216
|
include Verbalize::Action
|
190
|
-
|
217
|
+
|
191
218
|
input :a
|
192
|
-
|
219
|
+
|
193
220
|
def call
|
194
221
|
fail!('#{a} is greater than 100!') if a >= 100
|
195
222
|
a + 1
|
196
223
|
end
|
197
224
|
end
|
198
|
-
|
225
|
+
|
199
226
|
# rspec:
|
200
227
|
it 'fails when the input is out of bounds' do
|
201
228
|
result = MyAction.call(a: 1000)
|
202
|
-
|
229
|
+
|
203
230
|
expect(result).to be_failed
|
204
231
|
expect(result.failure).to eq '1000 is greater than 100!'
|
205
232
|
end
|
@@ -208,11 +235,11 @@ end
|
|
208
235
|
### Stubbing Responses
|
209
236
|
|
210
237
|
When unit testing, it may be necessary to stub the responses of Verbalize actions. To correctly stub responses,
|
211
|
-
you should __always__ stub the `MyAction.perform` class method on the action class being stubbed per the
|
238
|
+
you should __always__ stub the `MyAction.perform` class method on the action class being stubbed per the
|
212
239
|
instructions below. __Never__ stub the `call` or `call!` methods directly.
|
213
240
|
|
214
241
|
Stubbing `.perform` will enable `Verbalize` to wrap results correctly for references to either `call` or `call!`.
|
215
|
-
|
242
|
+
|
216
243
|
#### Stubbing Successful Responses
|
217
244
|
|
218
245
|
To simulate a successful response of the `Verbalize::Action` being stubbed, you should stub the `MyAction.perform`
|
@@ -225,7 +252,7 @@ class Foo
|
|
225
252
|
def self.multiply_by(multiple)
|
226
253
|
result = MyAction.call(a: 1)
|
227
254
|
raise "I couldn't do the thing!" if result.failure?
|
228
|
-
|
255
|
+
|
229
256
|
result.value * multiple
|
230
257
|
end
|
231
258
|
end
|
@@ -238,9 +265,9 @@ describe Foo do
|
|
238
265
|
allow(MyAction).to receive(:perform)
|
239
266
|
.with(a: 1)
|
240
267
|
.and_return(123)
|
241
|
-
|
268
|
+
|
242
269
|
result = described_class.multiply_by(100)
|
243
|
-
|
270
|
+
|
244
271
|
expect(result).to eq 12300
|
245
272
|
end
|
246
273
|
end
|
@@ -266,7 +293,7 @@ describe Foo do
|
|
266
293
|
allow(MyAction).to receive(:perform)
|
267
294
|
.with(a: 1)
|
268
295
|
.and_throw(::Verbalize::THROWN_SYMBOL, 'Y U NO!')
|
269
|
-
|
296
|
+
|
270
297
|
expect {
|
271
298
|
described_class.multiply_by(100)
|
272
299
|
}.to raise_error "I couldn't do the thing!"
|
@@ -305,4 +332,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/taylor
|
|
305
332
|
## License
|
306
333
|
|
307
334
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
308
|
-
|
data/lib/verbalize/action.rb
CHANGED
@@ -17,9 +17,24 @@ module Verbalize
|
|
17
17
|
|
18
18
|
module ClassMethods
|
19
19
|
def input(*required_keywords, optional: [])
|
20
|
+
@required_inputs = required_keywords
|
21
|
+
@optional_inputs = optional
|
22
|
+
|
20
23
|
class_eval Build.call(required_keywords, Array(optional))
|
21
24
|
end
|
22
25
|
|
26
|
+
def required_inputs
|
27
|
+
@required_inputs || []
|
28
|
+
end
|
29
|
+
|
30
|
+
def optional_inputs
|
31
|
+
@optional_inputs || []
|
32
|
+
end
|
33
|
+
|
34
|
+
def inputs
|
35
|
+
required_inputs + optional_inputs
|
36
|
+
end
|
37
|
+
|
23
38
|
# Because call/call! are defined when Action.input is called, they would
|
24
39
|
# not be defined when there is no input. So we pre-define them here, and
|
25
40
|
# if there is any input, they are overwritten
|
@@ -30,6 +45,7 @@ module Verbalize
|
|
30
45
|
def call!
|
31
46
|
__proxied_call!
|
32
47
|
end
|
48
|
+
alias_method :!, :call!
|
33
49
|
|
34
50
|
private
|
35
51
|
|
data/lib/verbalize/build.rb
CHANGED
@@ -10,13 +10,18 @@ module Verbalize
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def call
|
13
|
+
# We have to re-alias `!` to `call!` here, otherwise it will be pointing
|
14
|
+
# to the original `call!` method
|
13
15
|
<<-CODE
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
class << self
|
17
|
+
def call(#{declaration_arguments_string})
|
18
|
+
__proxied_call(#{forwarding_arguments_string})
|
19
|
+
end
|
17
20
|
|
18
|
-
def
|
19
|
-
|
21
|
+
def call!(#{declaration_arguments_string})
|
22
|
+
__proxied_call!(#{forwarding_arguments_string})
|
23
|
+
end
|
24
|
+
alias_method :!, :call!
|
20
25
|
end
|
21
26
|
|
22
27
|
def initialize(#{declaration_arguments_string})
|
data/lib/verbalize/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: verbalize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zach Taylor
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|