active_interaction 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/CHANGELOG.md +9 -0
- data/README.md +50 -8
- data/lib/active_interaction/base.rb +25 -0
- data/lib/active_interaction/version.rb +1 -1
- data/lib/active_interaction.rb +1 -1
- data/spec/active_interaction/base_spec.rb +49 -0
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eac224974be5bdaafca02a1266a62b5a7d18e835
|
4
|
+
data.tar.gz: f6224fbee6808c51696a42af86a4138d20d6bd56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b816a2a4b4c463e5cc208862950d5b789c4d20c70df9a2cb98c7a8013b78a734426709d5e08587d2daea14034860521fb6286893e45c05418fab08331e3076be
|
7
|
+
data.tar.gz: fa0ec07a406a4c4d8c0d22270abaf05e2eb17bb3bd64a1590112fcca26649817a08aa48ad25f6785fc7caefd1e835eed14e4b4a8d613587cc4bb9f841c173e95
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# [2.1.0][] (2015-07-30)
|
2
|
+
|
3
|
+
## Added
|
4
|
+
|
5
|
+
- [#295][]: Added `given?` predicate method to see if an input was passed to
|
6
|
+
`run`.
|
7
|
+
|
1
8
|
# [2.0.1][] (2015-05-27)
|
2
9
|
|
3
10
|
## Fixed
|
@@ -423,6 +430,7 @@ For help upgrading to version 2, please read [the announcement post][].
|
|
423
430
|
|
424
431
|
- Initial release.
|
425
432
|
|
433
|
+
[2.1.0]: https://github.com/orgsync/active_interaction/compare/v2.0.1...v2.1.0
|
426
434
|
[2.0.1]: https://github.com/orgsync/active_interaction/compare/v2.0.0...v2.0.1
|
427
435
|
[2.0.0]: https://github.com/orgsync/active_interaction/compare/v1.6.0...v2.0.0
|
428
436
|
[1.6.0]: https://github.com/orgsync/active_interaction/compare/v1.5.1...v1.6.0
|
@@ -556,5 +564,6 @@ For help upgrading to version 2, please read [the announcement post][].
|
|
556
564
|
[#269]: https://github.com/orgsync/active_interaction/issues/269
|
557
565
|
[#286]: https://github.com/orgsync/active_interaction/issues/286
|
558
566
|
[#289]: https://github.com/orgsync/active_interaction/issues/289
|
567
|
+
[#295]: https://github.com/orgsync/active_interaction/issues/295
|
559
568
|
|
560
569
|
[the announcement post]: http://devblog.orgsync.com/2015/05/06/announcing-active-interaction-2/
|
data/README.md
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
<p align="center">
|
2
|
-
<img alt="" src="https://a.pomf.se/auvctt.svg" width="250">
|
3
|
-
</p>
|
4
|
-
|
5
1
|
<h1 align="center">
|
6
2
|
<a href="https://github.com/orgsync/active_interaction">
|
7
3
|
ActiveInteraction
|
@@ -66,6 +62,7 @@ Read more on [the project page][] or check out [the full documentation][].
|
|
66
62
|
- [Descriptions](#descriptions)
|
67
63
|
- [Errors](#errors)
|
68
64
|
- [Forms](#forms)
|
65
|
+
- [Optional inputs](#optional-inputs)
|
69
66
|
- [Predicates](#predicates)
|
70
67
|
- [Translations](#translations)
|
71
68
|
- [Credits](#credits)
|
@@ -75,13 +72,13 @@ Read more on [the project page][] or check out [the full documentation][].
|
|
75
72
|
Add it to your Gemfile:
|
76
73
|
|
77
74
|
``` rb
|
78
|
-
gem 'active_interaction', '~> 2.
|
75
|
+
gem 'active_interaction', '~> 2.1'
|
79
76
|
```
|
80
77
|
|
81
78
|
Or install it manually:
|
82
79
|
|
83
80
|
``` sh
|
84
|
-
$ gem install active_interaction --version '~> 2.
|
81
|
+
$ gem install active_interaction --version '~> 2.1'
|
85
82
|
```
|
86
83
|
|
87
84
|
This project uses [Semantic Versioning][]. Check out [the change log][] for a
|
@@ -257,8 +254,14 @@ array :birthdays do
|
|
257
254
|
end
|
258
255
|
```
|
259
256
|
|
260
|
-
Note that
|
261
|
-
have
|
257
|
+
Note that you can only have one filter inside an array block, and it must not
|
258
|
+
have a name.
|
259
|
+
|
260
|
+
``` rb
|
261
|
+
array :cows do
|
262
|
+
object class: Cow
|
263
|
+
end
|
264
|
+
```
|
262
265
|
|
263
266
|
### Boolean
|
264
267
|
|
@@ -1161,6 +1164,44 @@ used to define the inputs on your interaction will relay type information to
|
|
1161
1164
|
these gems. As a result, form fields will automatically use the appropriate
|
1162
1165
|
input type.
|
1163
1166
|
|
1167
|
+
### Optional inputs
|
1168
|
+
|
1169
|
+
Optional inputs can be defined by using the `:default` option as described in
|
1170
|
+
[the Filters section][]. Within the interaction, provided and default values
|
1171
|
+
are merged to create `inputs`. There are times where it is useful to know
|
1172
|
+
whether a value was passed to `run` or the result of a filter default. In
|
1173
|
+
particular, it is useful when `nil` is an acceptable value. For example, you
|
1174
|
+
may optionally track your users' birthdays. You can use the `given?` predicate
|
1175
|
+
to see if an input was even passed to `run`.
|
1176
|
+
|
1177
|
+
``` rb
|
1178
|
+
class UpdateUser < ActiveInteraction::Base
|
1179
|
+
object :user
|
1180
|
+
date :birthday,
|
1181
|
+
default: nil
|
1182
|
+
|
1183
|
+
def execute
|
1184
|
+
user.birthday = birthday if given?(:birthday)
|
1185
|
+
errors.merge!(user) unless user.save
|
1186
|
+
user
|
1187
|
+
end
|
1188
|
+
end
|
1189
|
+
```
|
1190
|
+
|
1191
|
+
Now you have a few options. If you don't want to update their birthday, leave
|
1192
|
+
it out of the hash. If you want to remove their birthday, set `birthday: nil`.
|
1193
|
+
And if you want to update it, pass in the new value as usual.
|
1194
|
+
|
1195
|
+
``` rb
|
1196
|
+
user = User.find(...)
|
1197
|
+
# Don't update their birthday.
|
1198
|
+
UpdateUser.run!(user: user)
|
1199
|
+
# Remove their birthday.
|
1200
|
+
UpdateUser.run!(user: user, birthday: nil)
|
1201
|
+
# Update their birthday.
|
1202
|
+
UpdateUser.run!(user: user, birthday: Date.new(2000, 1, 2))
|
1203
|
+
```
|
1204
|
+
|
1164
1205
|
### Predicates
|
1165
1206
|
|
1166
1207
|
ActiveInteraction creates a predicate method for every input defined by a filter. So if you have an input called `foo`, there will be a predicate method called `#foo?`. That method will tell you if the input was given (that is, if it was not `nil`).
|
@@ -1265,4 +1306,5 @@ Logo design by [Tyler Lee][].
|
|
1265
1306
|
[the mit license]: LICENSE.md
|
1266
1307
|
[formtastic]: https://rubygems.org/gems/formtastic
|
1267
1308
|
[simple_form]: https://rubygems.org/gems/simple_form
|
1309
|
+
[the filters section]: #filters
|
1268
1310
|
[tyler lee]: https://github.com/tylerlee
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
3
|
require 'active_support/core_ext/hash/indifferent_access'
|
4
|
+
require 'set'
|
4
5
|
|
5
6
|
module ActiveInteraction
|
6
7
|
# @abstract Subclass and override {#execute} to implement a custom
|
@@ -194,6 +195,28 @@ module ActiveInteraction
|
|
194
195
|
end
|
195
196
|
end
|
196
197
|
|
198
|
+
# Returns `true` if the given key was in the hash passed to {.run}.
|
199
|
+
# Otherwise returns `false`. Use this to figure out if an input was given,
|
200
|
+
# even if it was `nil`.
|
201
|
+
#
|
202
|
+
# @example
|
203
|
+
# class Example < ActiveInteraction::Base
|
204
|
+
# integer :x, default: nil
|
205
|
+
# def execute; given?(:x) end
|
206
|
+
# end
|
207
|
+
# Example.run!() # => false
|
208
|
+
# Example.run!(x: nil) # => true
|
209
|
+
# Example.run!(x: rand) # => true
|
210
|
+
#
|
211
|
+
# @param input [#to_sym]
|
212
|
+
#
|
213
|
+
# @return [Boolean]
|
214
|
+
#
|
215
|
+
# @since 2.1.0
|
216
|
+
def given?(input)
|
217
|
+
@_interaction_keys.include?(input.to_sym)
|
218
|
+
end
|
219
|
+
|
197
220
|
protected
|
198
221
|
|
199
222
|
def run_validations!
|
@@ -206,6 +229,8 @@ module ActiveInteraction
|
|
206
229
|
|
207
230
|
# @param inputs [Hash{Symbol => Object}]
|
208
231
|
def process_inputs(inputs)
|
232
|
+
@_interaction_keys = inputs.keys.to_set & self.class.filters.keys
|
233
|
+
|
209
234
|
inputs.each do |key, value|
|
210
235
|
fail InvalidValueError, key.inspect if InputProcessor.reserved?(key)
|
211
236
|
|
data/lib/active_interaction.rb
CHANGED
@@ -365,6 +365,55 @@ describe ActiveInteraction::Base do
|
|
365
365
|
end
|
366
366
|
end
|
367
367
|
|
368
|
+
describe '#given?' do
|
369
|
+
let(:described_class) do
|
370
|
+
Class.new(TestInteraction) do
|
371
|
+
float :x,
|
372
|
+
default: nil
|
373
|
+
|
374
|
+
def execute
|
375
|
+
given?(:x)
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
it 'is false when the input is not given' do
|
381
|
+
expect(result).to be false
|
382
|
+
end
|
383
|
+
|
384
|
+
it 'is true when the input is nil' do
|
385
|
+
inputs[:x] = nil
|
386
|
+
expect(result).to be true
|
387
|
+
end
|
388
|
+
|
389
|
+
it 'is true when the input is given' do
|
390
|
+
inputs[:x] = rand
|
391
|
+
expect(result).to be true
|
392
|
+
end
|
393
|
+
|
394
|
+
it 'symbolizes its argument' do
|
395
|
+
described_class.class_exec do
|
396
|
+
def execute
|
397
|
+
given?('x')
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
inputs[:x] = rand
|
402
|
+
expect(result).to be true
|
403
|
+
end
|
404
|
+
|
405
|
+
it 'only tracks inputs with filters' do
|
406
|
+
described_class.class_exec do
|
407
|
+
def execute
|
408
|
+
given?(:y)
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
inputs[:y] = rand
|
413
|
+
expect(result).to be false
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
368
417
|
context 'inheritance' do
|
369
418
|
context 'filters' do
|
370
419
|
let(:described_class) { InteractionWithFilter }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_interaction
|
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
|
- Aaron Lasseigne
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-07-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -57,14 +57,14 @@ dependencies:
|
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '1.
|
60
|
+
version: '1.10'
|
61
61
|
type: :development
|
62
62
|
prerelease: false
|
63
63
|
version_requirements: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '1.
|
67
|
+
version: '1.10'
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
69
|
name: coveralls
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,14 +85,14 @@ dependencies:
|
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '4.
|
88
|
+
version: '4.6'
|
89
89
|
type: :development
|
90
90
|
prerelease: false
|
91
91
|
version_requirements: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: '4.
|
95
|
+
version: '4.6'
|
96
96
|
- !ruby/object:Gem::Dependency
|
97
97
|
name: guard-rubocop
|
98
98
|
requirement: !ruby/object:Gem::Requirement
|
@@ -113,14 +113,14 @@ dependencies:
|
|
113
113
|
requirements:
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version: '1.
|
116
|
+
version: '1.8'
|
117
117
|
type: :development
|
118
118
|
prerelease: false
|
119
119
|
version_requirements: !ruby/object:Gem::Requirement
|
120
120
|
requirements:
|
121
121
|
- - "~>"
|
122
122
|
- !ruby/object:Gem::Version
|
123
|
-
version: '1.
|
123
|
+
version: '1.8'
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: rake
|
126
126
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,28 +141,28 @@ dependencies:
|
|
141
141
|
requirements:
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: '3.
|
144
|
+
version: '3.3'
|
145
145
|
type: :development
|
146
146
|
prerelease: false
|
147
147
|
version_requirements: !ruby/object:Gem::Requirement
|
148
148
|
requirements:
|
149
149
|
- - "~>"
|
150
150
|
- !ruby/object:Gem::Version
|
151
|
-
version: '3.
|
151
|
+
version: '3.3'
|
152
152
|
- !ruby/object:Gem::Dependency
|
153
153
|
name: rubocop
|
154
154
|
requirement: !ruby/object:Gem::Requirement
|
155
155
|
requirements:
|
156
156
|
- - "~>"
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version: '0.
|
158
|
+
version: '0.32'
|
159
159
|
type: :development
|
160
160
|
prerelease: false
|
161
161
|
version_requirements: !ruby/object:Gem::Requirement
|
162
162
|
requirements:
|
163
163
|
- - "~>"
|
164
164
|
- !ruby/object:Gem::Version
|
165
|
-
version: '0.
|
165
|
+
version: '0.32'
|
166
166
|
- !ruby/object:Gem::Dependency
|
167
167
|
name: yard
|
168
168
|
requirement: !ruby/object:Gem::Requirement
|
@@ -291,7 +291,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
291
291
|
version: '0'
|
292
292
|
requirements: []
|
293
293
|
rubyforge_project:
|
294
|
-
rubygems_version: 2.4.
|
294
|
+
rubygems_version: 2.4.5
|
295
295
|
signing_key:
|
296
296
|
specification_version: 4
|
297
297
|
summary: Manage application specific business logic.
|