active_interaction 1.2.3 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +252 -72
- data/README.md +3 -3
- data/lib/active_interaction.rb +1 -1
- data/lib/active_interaction/backports.rb +6 -1
- data/lib/active_interaction/concerns/transactable.rb +7 -0
- data/lib/active_interaction/errors.rb +3 -3
- data/lib/active_interaction/filters/abstract_filter.rb +1 -1
- data/lib/active_interaction/filters/array_filter.rb +2 -0
- data/lib/active_interaction/filters/decimal_filter.rb +3 -1
- data/lib/active_interaction/filters/model_filter.rb +1 -1
- data/lib/active_interaction/version.rb +1 -1
- data/spec/active_interaction/base_spec.rb +12 -25
- data/spec/active_interaction/concerns/missable_spec.rb +2 -2
- data/spec/active_interaction/concerns/runnable_spec.rb +5 -2
- data/spec/active_interaction/concerns/transactable_spec.rb +24 -3
- data/spec/active_interaction/errors_spec.rb +1 -1
- data/spec/active_interaction/filter_column_spec.rb +5 -5
- data/spec/active_interaction/filters/boolean_filter_spec.rb +2 -2
- data/spec/active_interaction/integration/model_interaction_spec.rb +1 -1
- data/spec/active_interaction/modules/input_processor_spec.rb +2 -2
- data/spec/active_interaction/modules/validation_spec.rb +2 -2
- data/spec/spec_helper.rb +6 -3
- metadata +21 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8eae8e946fb9ec93d0abfa2e2264a7a35b9e8d56
|
4
|
+
data.tar.gz: 7c976feedfef904516036479d67a789f147d8e4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79162f4100cf2618ec44bddee98714af4d0b5b01d13cc8188f57a847031ece8c1657223d098912bdaa4b3ba89996cc233955d57cbd9ed44f5910cf44afb03164
|
7
|
+
data.tar.gz: 30f668bd7172e2f5d45df36b38d4ecda7b00d0d5aa1ca1667c4b7fa13eb21c810d8260cd269763debc738614828a0314a941cbb6ad69b86950ac53e3ec3f008c
|
data/CHANGELOG.md
CHANGED
@@ -1,216 +1,335 @@
|
|
1
1
|
# [Master][]
|
2
2
|
|
3
|
+
# [1.2.4][] (2014-08-07)
|
4
|
+
|
5
|
+
## Fixed
|
6
|
+
|
7
|
+
- [#203][]: Fix a bug that prevented transaction options from being passed to
|
8
|
+
subclasses.
|
9
|
+
|
3
10
|
# [1.2.3][] (2014-05-12)
|
4
11
|
|
5
|
-
|
6
|
-
|
12
|
+
## Fixed
|
13
|
+
|
14
|
+
- [#192][]: Fix a bug that raised `ActiveRecord::Rollback` when composing even
|
15
|
+
when not in a transaction.
|
7
16
|
|
8
17
|
# [1.2.2][] (2014-05-07)
|
9
18
|
|
19
|
+
## Fixed
|
20
|
+
|
10
21
|
- Fix a bug that raised `NameError`s when there were invalid nested hash
|
11
22
|
errors.
|
12
23
|
- Add missing translation for symbol filters.
|
13
24
|
|
14
25
|
# [1.2.1][] (2014-05-02)
|
15
26
|
|
16
|
-
|
17
|
-
|
27
|
+
## Fixed
|
28
|
+
|
29
|
+
- [#179][]: Fix a bug that marked model inputs as invalid even if they returned true
|
30
|
+
for `object.is_a?(klass)`.
|
18
31
|
|
19
32
|
# [1.2.0][] (2014-04-30)
|
20
33
|
|
21
|
-
|
22
|
-
|
23
|
-
- Add support for
|
34
|
+
## Added
|
35
|
+
|
36
|
+
- [#175][]: Add support for Rails-style date and time parameters like `date(1i)`.
|
37
|
+
- [#173][]: Add a decimal filter.
|
38
|
+
- [#155][]: Add support for disabling and modifying transactions through the
|
24
39
|
`transaction` helper method.
|
25
|
-
- Add support for `column_for_attribute` which provides better
|
40
|
+
- [#140][]: Add support for `column_for_attribute` which provides better
|
41
|
+
interoperability with gems like Formtastic and Simple Form.
|
26
42
|
|
27
43
|
# [1.1.7][] (2014-04-30)
|
28
44
|
|
29
|
-
|
45
|
+
## Fixed
|
46
|
+
|
47
|
+
- [#174][]: Fix a bug that leaked validators among all child classes.
|
30
48
|
|
31
49
|
# [1.1.6][] (2014-04-29)
|
32
50
|
|
33
|
-
|
51
|
+
## Fixed
|
52
|
+
|
53
|
+
- [#36][]: Fix a bug that caused nested hash error messages to be misleading.
|
34
54
|
|
35
55
|
# [1.1.5][] (2014-03-31)
|
36
56
|
|
37
|
-
|
57
|
+
## Fixed
|
58
|
+
|
59
|
+
- The `transform_keys` method broke backwards compatibility because it's not
|
60
|
+
available until Rails 4.0.2.
|
38
61
|
|
39
62
|
# [1.1.4][] (2014-03-31)
|
40
63
|
|
64
|
+
## Fixed
|
65
|
+
|
41
66
|
- Fix an issue where non-stripped hash keys would be incorrectly converted to strings.
|
42
67
|
|
43
68
|
# [1.1.3][] (2014-03-31)
|
44
69
|
|
45
|
-
|
70
|
+
## Fixed
|
71
|
+
|
72
|
+
- [#165][]: Fix Rubocop errors and pin the version to avoid future issues with new cops
|
46
73
|
breaking the build.
|
47
|
-
|
74
|
+
|
75
|
+
## Security
|
76
|
+
|
77
|
+
- [#163][]: Fix some denial of service attacks via hash symbolization.
|
48
78
|
|
49
79
|
# [1.1.2][] (2014-03-05)
|
50
80
|
|
51
|
-
|
81
|
+
## Fixed
|
82
|
+
|
83
|
+
- [#156][]: Don't constantize classes for model filters on initialization. This fixes a
|
52
84
|
bug that made those filters dependent on load order.
|
53
85
|
|
54
86
|
# [1.1.1][] (2014-03-04)
|
55
87
|
|
56
|
-
|
88
|
+
## Fixed
|
89
|
+
|
90
|
+
- [#153][]: Allow merging ActiveModel errors into ActiveInteraction errors with
|
57
91
|
`ActiveInteraction::Errors#merge!`.
|
58
92
|
|
59
93
|
# [1.1.0][] (2014-02-28)
|
60
94
|
|
61
|
-
|
62
|
-
|
95
|
+
## Added
|
96
|
+
|
97
|
+
- [#116][], [#119][], [#122][]: Speed up many filters by caching class constants.
|
98
|
+
- [#115][]: Add support for callbacks around `execute`.
|
99
|
+
- [#136][]: Allow callable defaults.
|
100
|
+
|
101
|
+
## Changed
|
102
|
+
|
103
|
+
- [#114][]: Support `:only` and `:except` options simultaneously with `import_filters`.
|
63
104
|
Previously this raised an `ArgumentError`.
|
64
|
-
- Support passing a single symbol to `:only` and `:except`. Previously an Array
|
105
|
+
- [#114][]: Support passing a single symbol to `:only` and `:except`. Previously an Array
|
65
106
|
was required.
|
66
|
-
|
67
|
-
|
68
|
-
|
107
|
+
|
108
|
+
## Security
|
109
|
+
|
110
|
+
- [#138][]: Only set instance variables for attributes with readers defined.
|
111
|
+
|
69
112
|
|
70
113
|
# [1.0.5][] (2014-02-25)
|
71
114
|
|
72
|
-
|
115
|
+
## Fixed
|
116
|
+
|
117
|
+
- [#143][]: Rollback database changes when `compose` fails.
|
73
118
|
|
74
119
|
# [1.0.4][] (2014-02-11)
|
75
120
|
|
121
|
+
## Fixed
|
122
|
+
|
76
123
|
- Add translations to the gem specification.
|
77
124
|
|
78
125
|
# ~~[1.0.3][] (2014-02-11)~~
|
79
126
|
|
80
|
-
|
127
|
+
## Fixed
|
128
|
+
|
129
|
+
- [#135][]: Fix a bug that caused invalid strings to be parsed as `nil` instead of
|
81
130
|
raising an error when `Time.zone` was set.
|
82
|
-
- Fix bug that prevented loading I18n translations.
|
131
|
+
- [#134][]: Fix bug that prevented loading I18n translations.
|
83
132
|
|
84
133
|
# [1.0.2][] (2014-02-07)
|
85
134
|
|
86
|
-
|
135
|
+
## Fixed
|
136
|
+
|
137
|
+
- [#130][]: Stop creating duplicate errors on subsequent calls to `valid?`.
|
87
138
|
|
88
139
|
# [1.0.1][] (2014-02-04)
|
89
140
|
|
90
|
-
|
91
|
-
|
92
|
-
-
|
93
|
-
- Fix a bug that
|
141
|
+
## Fixed
|
142
|
+
|
143
|
+
- [#125][]: Short circuit `valid?` after successfully running an interaction.
|
144
|
+
- [#129][]: Fix a bug that prevented merging interpolated symbolic errors.
|
145
|
+
- [#128][]: Use `:invalid_type` instead of `:invalid` as I18n key for type errors.
|
146
|
+
- [#127][]: Fix a bug that skipped setting up accessors for imported filters.
|
94
147
|
|
95
148
|
# [1.0.0][] (2014-01-21)
|
96
149
|
|
97
|
-
|
150
|
+
## Added
|
151
|
+
|
152
|
+
- [#102][]: Add predicate methods for checking if an input was passed.
|
153
|
+
- [#103][]: Allow fetching filters by name.
|
154
|
+
- [#104][]: Allow import filters from another interaction with `import_filters`.
|
155
|
+
|
156
|
+
## Changed
|
157
|
+
|
158
|
+
- [#111][]: Replace `Filters` with a hash. To iterate over `Filter` objects, use
|
98
159
|
`Interaction.filters.values`.
|
99
160
|
- Rename `Filter#has_default?` to `Filter#default?`.
|
100
|
-
|
101
|
-
|
102
|
-
|
161
|
+
|
162
|
+
## Fixed
|
163
|
+
|
164
|
+
- [#98][]: Add `respond_to_missing?` to complement `method_missing` calls.
|
165
|
+
- [#106][]: When adding a filter that shares a name with an existing filter, it will now
|
103
166
|
replace the existing one instead of adding a duplicate.
|
104
|
-
- Allow fetching filters by name.
|
105
|
-
- Allow import filters from another interaction with `import_filters`.
|
106
167
|
|
107
168
|
# [0.10.2][] (2014-01-02)
|
108
169
|
|
109
|
-
|
170
|
+
## Fixed
|
171
|
+
|
172
|
+
- [#94][]: Fix a bug that marked Time instances as invalid if Time.zone was set.
|
110
173
|
|
111
174
|
# [0.10.1][] (2013-12-20)
|
112
175
|
|
113
|
-
|
176
|
+
## Fixed
|
177
|
+
|
178
|
+
- [#90][]: Fix bug that prevented parsing strings as times when ActiveSupport was
|
114
179
|
available.
|
115
180
|
|
116
181
|
# [0.10.0][] (2013-12-19)
|
117
182
|
|
183
|
+
## Added
|
184
|
+
|
118
185
|
- Support casting "true" and "false" as booleans.
|
119
|
-
|
186
|
+
|
187
|
+
## Fixed
|
188
|
+
|
189
|
+
- [#89][]: Fix bug that allowed subclasses to mutate the filters on their superclasses.
|
120
190
|
|
121
191
|
# [0.9.1][] (2013-12-17)
|
122
192
|
|
123
|
-
|
124
|
-
|
125
|
-
-
|
193
|
+
## Fixed
|
194
|
+
|
195
|
+
- [#84][]: Fix I18n deprecation warning.
|
196
|
+
- [#82][]: Raise `ArgumentError` when running an interaction with non-hash inputs.
|
197
|
+
- [#77][]: For compatibility with `ActiveRecord::Errors`, support indifferent access of
|
126
198
|
`ActiveInteraction::Errors`.
|
127
|
-
- Fix losing filters when using inheritance.
|
199
|
+
- [#88][]: Fix losing filters when using inheritance.
|
128
200
|
|
129
201
|
# [0.9.0][] (2013-12-02)
|
130
202
|
|
131
|
-
|
132
|
-
|
203
|
+
## Added
|
204
|
+
|
205
|
+
- Add experimental composition implementation (`ActiveInteraction::Base#compose`).
|
206
|
+
|
207
|
+
## Removed
|
208
|
+
|
133
209
|
- Remove `ActiveInteraction::Pipeline`.
|
134
210
|
|
135
211
|
# [0.8.0][] (2013-11-14)
|
136
212
|
|
137
|
-
|
213
|
+
## Added
|
214
|
+
|
215
|
+
- [#44][], [#45][]: Add ability to document interactions and filters.
|
138
216
|
|
139
217
|
# [0.7.0][] (2013-11-14)
|
140
218
|
|
141
|
-
|
219
|
+
## Added
|
220
|
+
|
221
|
+
- [#41][]: Add ability to chain a series of interactions together with
|
142
222
|
`ActiveInteraction::Pipeline`.
|
143
223
|
|
144
224
|
# [0.6.1][] (2013-11-14)
|
145
225
|
|
226
|
+
## Fixed
|
227
|
+
|
146
228
|
- Re-release. Forgot to merge into master.
|
147
229
|
|
148
230
|
# ~~[0.6.0][] (2013-11-14)~~
|
149
231
|
|
150
|
-
|
151
|
-
|
152
|
-
set `strip: false` on a hash filter.**
|
153
|
-
- **Prevent specifying defaults (other than `nil` or `{}`) on hash filters. Set
|
154
|
-
defaults on the nested filters instead.**
|
232
|
+
## Added
|
233
|
+
|
155
234
|
- Add ability to introspect interactions with `filters`.
|
156
|
-
-
|
157
|
-
- Allow getting all of the user-supplied inputs in an interaction with
|
235
|
+
- [#57][]: Allow getting all of the user-supplied inputs in an interaction with
|
158
236
|
`inputs`.
|
159
|
-
-
|
160
|
-
-
|
161
|
-
- Add a symbol filter.
|
162
|
-
- Allow adding symbolic errors with `errors.add_sym` and retrieving them with
|
237
|
+
- [#61][]: Add a symbol filter.
|
238
|
+
- [#58][]: Allow adding symbolic errors with `errors.add_sym` and retrieving them with
|
163
239
|
`errors.symbolic`.
|
164
240
|
|
241
|
+
## Changed
|
242
|
+
|
243
|
+
- Error class now end with `Error`.
|
244
|
+
- By default, strip unlisted keys from hashes. To retain the old behavior,
|
245
|
+
set `strip: false` on a hash filter.
|
246
|
+
- [#49][]: Prevent specifying defaults (other than `nil` or `{}`) on hash filters. Set
|
247
|
+
defaults on the nested filters instead.
|
248
|
+
- [#66][]: Replace `allow_nil: true` with `default: nil`.
|
249
|
+
|
250
|
+
## Fixed
|
251
|
+
|
252
|
+
- Fix bug that prevented listing multiple attributes in a hash filter.
|
253
|
+
- Fix bug that prevented hash filters from being nested in array filters.
|
254
|
+
|
165
255
|
# [0.5.0][] (2013-10-16)
|
166
256
|
|
167
|
-
|
168
|
-
|
257
|
+
## Added
|
258
|
+
|
259
|
+
- [#34][]: Allow adding errors in `execute` method with `errors.add`.
|
260
|
+
|
261
|
+
## Fixed
|
262
|
+
|
263
|
+
- [#56][]: Prevent manually setting the outcome's result.
|
169
264
|
|
170
265
|
# [0.4.0][] (2013-08-15)
|
171
266
|
|
267
|
+
## Added
|
268
|
+
|
172
269
|
- Support i18n translations.
|
173
270
|
|
174
271
|
# [0.3.0][] (2013-08-07)
|
175
272
|
|
176
|
-
|
177
|
-
|
178
|
-
- Allow nested default values.
|
273
|
+
## Added
|
274
|
+
|
275
|
+
- [#30][]: Allow nested default values.
|
276
|
+
|
277
|
+
## Changed
|
278
|
+
|
279
|
+
- [#36][]: Give better error messages for nested attributes.
|
280
|
+
- [#39][]: Add a more useful invalid interaction error message.
|
281
|
+
- [#38][]: Use default value when given an explicit `nil`.
|
179
282
|
|
180
283
|
# [0.2.2][] (2013-08-07)
|
181
284
|
|
182
|
-
|
285
|
+
## Fixed
|
286
|
+
|
287
|
+
- [#40][]: Fix support for `ActiveSupport::TimeWithZone`.
|
183
288
|
|
184
289
|
# [0.2.1][] (2013-08-06)
|
185
290
|
|
186
|
-
|
291
|
+
## Fixed
|
292
|
+
|
293
|
+
- [#37][]: Fix setting a default value on more than one attribute at a time.
|
187
294
|
|
188
295
|
# [0.2.0][] (2013-07-16)
|
189
296
|
|
190
|
-
|
191
|
-
|
192
|
-
- Add support for strptime format strings on Date, DateTime, and Time filters.
|
297
|
+
## Added
|
298
|
+
|
299
|
+
- [#23][]: Add support for strptime format strings on Date, DateTime, and Time filters.
|
300
|
+
|
301
|
+
## Changed
|
302
|
+
|
303
|
+
- [#20][]: Wrap interactions in ActiveRecord transactions if they're available.
|
304
|
+
- [#24][]: Add option to strip string values, which is enabled by default.
|
193
305
|
|
194
306
|
# [0.1.3][] (2013-07-16)
|
195
307
|
|
308
|
+
## Fixed
|
309
|
+
|
196
310
|
- Fix bug that prevented `attr_accessor`s from working.
|
197
311
|
- Handle unconfigured timezones.
|
198
|
-
- Use RDoc as YARD's Markdown provider instead of kramdown.
|
312
|
+
- [#27][]: Use RDoc as YARD's Markdown provider instead of kramdown.
|
199
313
|
|
200
314
|
# [0.1.2][] (2013-07-14)
|
201
315
|
|
202
|
-
|
316
|
+
## Fixed
|
317
|
+
|
318
|
+
- [#29][]: `execute` will now have the filtered version of the values passed
|
203
319
|
to `run` or `run!` as was intended.
|
204
320
|
|
205
321
|
# [0.1.1][] (2013-07-13)
|
206
322
|
|
207
|
-
|
323
|
+
## Fixed
|
324
|
+
|
325
|
+
- [#28][]: Correct gemspec dependencies on activemodel.
|
208
326
|
|
209
327
|
# ~~[0.1.0][] (2013-07-12)~~
|
210
328
|
|
211
329
|
- Initial release.
|
212
330
|
|
213
|
-
[master]: https://github.com/orgsync/active_interaction/compare/v1.2.
|
331
|
+
[master]: https://github.com/orgsync/active_interaction/compare/v1.2.4...master
|
332
|
+
[1.2.4]: https://github.com/orgsync/active_interaction/compare/v1.2.3...v1.2.4
|
214
333
|
[1.2.3]: https://github.com/orgsync/active_interaction/compare/v1.2.2...v1.2.3
|
215
334
|
[1.2.2]: https://github.com/orgsync/active_interaction/compare/v1.2.1...v1.2.2
|
216
335
|
[1.2.1]: https://github.com/orgsync/active_interaction/compare/v1.2.0...v1.2.1
|
@@ -249,4 +368,65 @@
|
|
249
368
|
[0.1.1]: https://github.com/orgsync/active_interaction/compare/v0.1.0...v0.1.1
|
250
369
|
[0.1.0]: https://github.com/orgsync/active_interaction/compare/62f999b...v0.1.0
|
251
370
|
|
252
|
-
[#
|
371
|
+
[#20]: https://github.com/orgsync/active_interaction/issues/20
|
372
|
+
[#23]: https://github.com/orgsync/active_interaction/issues/23
|
373
|
+
[#24]: https://github.com/orgsync/active_interaction/issues/24
|
374
|
+
[#27]: https://github.com/orgsync/active_interaction/issues/27
|
375
|
+
[#28]: https://github.com/orgsync/active_interaction/issues/28
|
376
|
+
[#29]: https://github.com/orgsync/active_interaction/issues/29
|
377
|
+
[#30]: https://github.com/orgsync/active_interaction/issues/30
|
378
|
+
[#34]: https://github.com/orgsync/active_interaction/issues/34
|
379
|
+
[#36]: https://github.com/orgsync/active_interaction/issues/36
|
380
|
+
[#37]: https://github.com/orgsync/active_interaction/issues/37
|
381
|
+
[#38]: https://github.com/orgsync/active_interaction/issues/38
|
382
|
+
[#39]: https://github.com/orgsync/active_interaction/issues/39
|
383
|
+
[#40]: https://github.com/orgsync/active_interaction/issues/40
|
384
|
+
[#41]: https://github.com/orgsync/active_interaction/issues/41
|
385
|
+
[#44]: https://github.com/orgsync/active_interaction/issues/44
|
386
|
+
[#45]: https://github.com/orgsync/active_interaction/issues/45
|
387
|
+
[#49]: https://github.com/orgsync/active_interaction/issues/49
|
388
|
+
[#56]: https://github.com/orgsync/active_interaction/issues/56
|
389
|
+
[#57]: https://github.com/orgsync/active_interaction/issues/57
|
390
|
+
[#58]: https://github.com/orgsync/active_interaction/issues/58
|
391
|
+
[#61]: https://github.com/orgsync/active_interaction/issues/61
|
392
|
+
[#66]: https://github.com/orgsync/active_interaction/issues/66
|
393
|
+
[#77]: https://github.com/orgsync/active_interaction/issues/77
|
394
|
+
[#82]: https://github.com/orgsync/active_interaction/issues/82
|
395
|
+
[#84]: https://github.com/orgsync/active_interaction/issues/84
|
396
|
+
[#88]: https://github.com/orgsync/active_interaction/issues/88
|
397
|
+
[#89]: https://github.com/orgsync/active_interaction/issues/89
|
398
|
+
[#90]: https://github.com/orgsync/active_interaction/issues/90
|
399
|
+
[#94]: https://github.com/orgsync/active_interaction/issues/94
|
400
|
+
[#98]: https://github.com/orgsync/active_interaction/issues/98
|
401
|
+
[#102]: https://github.com/orgsync/active_interaction/issues/102
|
402
|
+
[#103]: https://github.com/orgsync/active_interaction/issues/103
|
403
|
+
[#104]: https://github.com/orgsync/active_interaction/issues/104
|
404
|
+
[#106]: https://github.com/orgsync/active_interaction/issues/106
|
405
|
+
[#111]: https://github.com/orgsync/active_interaction/issues/111
|
406
|
+
[#114]: https://github.com/orgsync/active_interaction/issues/114
|
407
|
+
[#115]: https://github.com/orgsync/active_interaction/issues/115
|
408
|
+
[#116]: https://github.com/orgsync/active_interaction/issues/116
|
409
|
+
[#119]: https://github.com/orgsync/active_interaction/issues/119
|
410
|
+
[#122]: https://github.com/orgsync/active_interaction/issues/122
|
411
|
+
[#125]: https://github.com/orgsync/active_interaction/issues/125
|
412
|
+
[#127]: https://github.com/orgsync/active_interaction/issues/127
|
413
|
+
[#128]: https://github.com/orgsync/active_interaction/issues/128
|
414
|
+
[#129]: https://github.com/orgsync/active_interaction/issues/129
|
415
|
+
[#130]: https://github.com/orgsync/active_interaction/issues/130
|
416
|
+
[#134]: https://github.com/orgsync/active_interaction/issues/134
|
417
|
+
[#135]: https://github.com/orgsync/active_interaction/issues/135
|
418
|
+
[#136]: https://github.com/orgsync/active_interaction/issues/136
|
419
|
+
[#138]: https://github.com/orgsync/active_interaction/issues/138
|
420
|
+
[#140]: https://github.com/orgsync/active_interaction/issues/140
|
421
|
+
[#143]: https://github.com/orgsync/active_interaction/issues/143
|
422
|
+
[#153]: https://github.com/orgsync/active_interaction/issues/153
|
423
|
+
[#155]: https://github.com/orgsync/active_interaction/issues/155
|
424
|
+
[#156]: https://github.com/orgsync/active_interaction/issues/156
|
425
|
+
[#163]: https://github.com/orgsync/active_interaction/issues/163
|
426
|
+
[#165]: https://github.com/orgsync/active_interaction/issues/165
|
427
|
+
[#173]: https://github.com/orgsync/active_interaction/issues/173
|
428
|
+
[#174]: https://github.com/orgsync/active_interaction/issues/174
|
429
|
+
[#175]: https://github.com/orgsync/active_interaction/issues/175
|
430
|
+
[#179]: https://github.com/orgsync/active_interaction/issues/179
|
431
|
+
[#192]: https://github.com/orgsync/active_interaction/issues/192
|
432
|
+
[#203]: https://github.com/orgsync/active_interaction/issues/203
|
data/README.md
CHANGED
@@ -282,12 +282,12 @@ work done in [Mutations][17].
|
|
282
282
|
|
283
283
|
[0]: https://github.com/orgsync/active_interaction
|
284
284
|
[1]: https://badge.fury.io/rb/active_interaction.svg
|
285
|
-
[2]:
|
285
|
+
[2]: http://rubygems.org/gems/active_interaction "Gem Version"
|
286
286
|
[3]: https://travis-ci.org/orgsync/active_interaction.svg?branch=master
|
287
287
|
[4]: https://travis-ci.org/orgsync/active_interaction "Build Status"
|
288
|
-
[5]: https://
|
288
|
+
[5]: https://img.shields.io/coveralls/orgsync/active_interaction/master.svg
|
289
289
|
[6]: https://coveralls.io/r/orgsync/active_interaction?branch=master "Coverage Status"
|
290
|
-
[7]: https://codeclimate.com/github/orgsync/active_interaction.
|
290
|
+
[7]: https://codeclimate.com/github/orgsync/active_interaction/badges/gpa.svg
|
291
291
|
[8]: https://codeclimate.com/github/orgsync/active_interaction "Code Climate"
|
292
292
|
[9]: https://gemnasium.com/orgsync/active_interaction.svg
|
293
293
|
[10]: https://gemnasium.com/orgsync/active_interaction "Dependency Status"
|
data/lib/active_interaction.rb
CHANGED
@@ -13,11 +13,16 @@ module ActiveInteraction
|
|
13
13
|
send("#{name}=", value)
|
14
14
|
end unless method_defined?(:[]=)
|
15
15
|
end
|
16
|
+
|
17
|
+
class Errors
|
18
|
+
# Required for Rails < 3.2.13.
|
19
|
+
protected :initialize_dup
|
20
|
+
end
|
16
21
|
end
|
17
22
|
|
18
23
|
# @private
|
19
24
|
class Hash
|
20
|
-
# Required for Rails
|
25
|
+
# Required for Rails < 4.0.0.
|
21
26
|
def transform_keys
|
22
27
|
result = {}
|
23
28
|
each_key do |key|
|
@@ -39,6 +39,13 @@ module ActiveInteraction
|
|
39
39
|
end
|
40
40
|
|
41
41
|
module ClassMethods # rubocop:disable Documentation
|
42
|
+
# @param klass [Class]
|
43
|
+
def inherited(klass)
|
44
|
+
klass.transaction(transaction?, transaction_options.dup)
|
45
|
+
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
42
49
|
# @param enable [Boolean]
|
43
50
|
# @param options [Hash]
|
44
51
|
#
|
@@ -171,9 +171,9 @@ module ActiveInteraction
|
|
171
171
|
def merge_symbolic!(other)
|
172
172
|
other.symbolic.each do |attribute, symbols|
|
173
173
|
symbols.each do |symbol|
|
174
|
-
|
175
|
-
|
176
|
-
|
174
|
+
next if symbolic[attribute].include?(symbol)
|
175
|
+
|
176
|
+
symbolic[attribute] += [symbol]
|
177
177
|
end
|
178
178
|
end
|
179
179
|
end
|
@@ -64,9 +64,11 @@ module ActiveInteraction
|
|
64
64
|
fail InvalidFilterError, 'attribute names in array block'
|
65
65
|
end
|
66
66
|
|
67
|
+
# rubocop:disable GuardClause
|
67
68
|
if filter.default?
|
68
69
|
fail InvalidDefaultError, 'default values in array block'
|
69
70
|
end
|
71
|
+
# rubocop:enable GuardClause
|
70
72
|
end
|
71
73
|
end
|
72
74
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
+
require 'bigdecimal'
|
4
|
+
|
3
5
|
module ActiveInteraction
|
4
6
|
class Base
|
5
7
|
# @!method self.decimal(*attributes, options = {})
|
@@ -46,7 +48,7 @@ module ActiveInteraction
|
|
46
48
|
Float(value)
|
47
49
|
BigDecimal.new(value, digits)
|
48
50
|
rescue ArgumentError
|
49
|
-
|
51
|
+
raise InvalidValueError, "Given value: #{value.inspect}"
|
50
52
|
end
|
51
53
|
|
52
54
|
def klass
|
@@ -439,12 +439,12 @@ describe ActiveInteraction::Base do
|
|
439
439
|
let(:described_class) { InteractionWithFilter }
|
440
440
|
|
441
441
|
it 'responds to the predicate' do
|
442
|
-
expect(interaction.respond_to?(:thing?)).to
|
442
|
+
expect(interaction.respond_to?(:thing?)).to be_truthy
|
443
443
|
end
|
444
444
|
|
445
445
|
context 'without a value' do
|
446
446
|
it 'returns false' do
|
447
|
-
expect(interaction.thing?).to
|
447
|
+
expect(interaction.thing?).to be_falsey
|
448
448
|
end
|
449
449
|
end
|
450
450
|
|
@@ -456,16 +456,14 @@ describe ActiveInteraction::Base do
|
|
456
456
|
end
|
457
457
|
|
458
458
|
it 'returns true' do
|
459
|
-
expect(interaction.thing?).to
|
459
|
+
expect(interaction.thing?).to be_truthy
|
460
460
|
end
|
461
461
|
end
|
462
462
|
end
|
463
463
|
|
464
464
|
describe '.import_filters' do
|
465
|
-
shared_context 'import_filters context' do
|
465
|
+
shared_context 'import_filters context' do |only, except|
|
466
466
|
let(:klass) { AddInteraction }
|
467
|
-
let(:only) { nil }
|
468
|
-
let(:except) { nil }
|
469
467
|
|
470
468
|
let(:described_class) do
|
471
469
|
interaction = klass
|
@@ -477,8 +475,8 @@ describe ActiveInteraction::Base do
|
|
477
475
|
end
|
478
476
|
end
|
479
477
|
|
480
|
-
shared_examples 'import_filters examples' do
|
481
|
-
include_context 'import_filters context'
|
478
|
+
shared_examples 'import_filters examples' do |only, except|
|
479
|
+
include_context 'import_filters context', only, except
|
482
480
|
|
483
481
|
it 'imports the filters' do
|
484
482
|
expect(described_class.filters).to eql klass.filters
|
@@ -504,42 +502,31 @@ describe ActiveInteraction::Base do
|
|
504
502
|
end
|
505
503
|
|
506
504
|
context 'with neither :only nor :except' do
|
507
|
-
include_examples 'import_filters examples'
|
505
|
+
include_examples 'import_filters examples', nil, nil
|
508
506
|
end
|
509
507
|
|
510
508
|
context 'with :only' do
|
511
509
|
context 'as an Array' do
|
512
|
-
include_examples 'import_filters examples'
|
513
|
-
|
514
|
-
let(:only) { [:x] }
|
510
|
+
include_examples 'import_filters examples', [:x], nil
|
515
511
|
end
|
516
512
|
|
517
513
|
context 'as an Symbol' do
|
518
|
-
include_examples 'import_filters examples'
|
519
|
-
|
520
|
-
let(:only) { :x }
|
514
|
+
include_examples 'import_filters examples', :x, nil
|
521
515
|
end
|
522
516
|
end
|
523
517
|
|
524
518
|
context 'with :except' do
|
525
519
|
context 'as an Array' do
|
526
|
-
include_examples 'import_filters examples'
|
527
|
-
|
528
|
-
let(:except) { [:x] }
|
520
|
+
include_examples 'import_filters examples', nil, [:x]
|
529
521
|
end
|
530
522
|
|
531
523
|
context 'as an Symbol' do
|
532
|
-
include_examples 'import_filters examples'
|
533
|
-
|
534
|
-
let(:except) { :x }
|
524
|
+
include_examples 'import_filters examples', nil, :x
|
535
525
|
end
|
536
526
|
end
|
537
527
|
|
538
528
|
context 'with :only & :except' do
|
539
|
-
include_examples 'import_filters examples'
|
540
|
-
|
541
|
-
let(:only) { [:x] }
|
542
|
-
let(:except) { [:x] }
|
529
|
+
include_examples 'import_filters examples', [:x], [:x]
|
543
530
|
end
|
544
531
|
end
|
545
532
|
end
|
@@ -10,7 +10,7 @@ describe ActiveInteraction::Missable do
|
|
10
10
|
let(:slug) { :slug }
|
11
11
|
|
12
12
|
it 'returns false' do
|
13
|
-
expect(instance.respond_to?(slug)).to
|
13
|
+
expect(instance.respond_to?(slug)).to be_falsey
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -18,7 +18,7 @@ describe ActiveInteraction::Missable do
|
|
18
18
|
let(:slug) { :boolean }
|
19
19
|
|
20
20
|
it 'returns true' do
|
21
|
-
expect(instance.respond_to?(slug)).to
|
21
|
+
expect(instance.respond_to?(slug)).to be_truthy
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -57,7 +57,7 @@ describe ActiveInteraction::Runnable do
|
|
57
57
|
}
|
58
58
|
|
59
59
|
klass.run
|
60
|
-
expect(has_run).to
|
60
|
+
expect(has_run).to be_truthy
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
@@ -141,7 +141,10 @@ describe ActiveInteraction::Runnable do
|
|
141
141
|
|
142
142
|
it 'does not duplicate errors on subsequent calls' do
|
143
143
|
instance.valid?
|
144
|
-
|
144
|
+
count = instance.errors.count
|
145
|
+
instance.valid?
|
146
|
+
|
147
|
+
expect(instance.errors.count).to eql count
|
145
148
|
end
|
146
149
|
end
|
147
150
|
end
|
@@ -47,25 +47,46 @@ describe ActiveInteraction::Transactable do
|
|
47
47
|
|
48
48
|
describe '.transaction?' do
|
49
49
|
it 'defaults to true' do
|
50
|
-
expect(klass.transaction?).to
|
50
|
+
expect(klass.transaction?).to be_truthy
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'returns the stored value' do
|
54
54
|
klass.transaction(false)
|
55
|
-
expect(klass.transaction?).to
|
55
|
+
expect(klass.transaction?).to be_falsey
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'with a subclass' do
|
59
|
+
before { klass.transaction(false) }
|
60
|
+
|
61
|
+
let(:subclass) { Class.new(klass) }
|
62
|
+
|
63
|
+
it 'inherits from the superclass' do
|
64
|
+
expect(subclass.transaction?).to be_falsey
|
65
|
+
end
|
56
66
|
end
|
57
67
|
end
|
58
68
|
|
59
69
|
describe '.transaction_options' do
|
70
|
+
let(:h) { { rand => rand } }
|
71
|
+
|
60
72
|
it 'defaults to an empty hash' do
|
61
73
|
expect(klass.transaction_options).to eql({})
|
62
74
|
end
|
63
75
|
|
64
76
|
it 'returns the stored value' do
|
65
|
-
h = { rand => rand }
|
66
77
|
klass.transaction(klass.transaction?, h)
|
67
78
|
expect(klass.transaction_options).to eql h
|
68
79
|
end
|
80
|
+
|
81
|
+
context 'with a subclass' do
|
82
|
+
before { klass.transaction(klass.transaction?, h) }
|
83
|
+
|
84
|
+
let(:subclass) { Class.new(klass) }
|
85
|
+
|
86
|
+
it 'inherits from the superclass' do
|
87
|
+
expect(subclass.transaction_options).to eql h
|
88
|
+
end
|
89
|
+
end
|
69
90
|
end
|
70
91
|
|
71
92
|
describe '#transaction' do
|
@@ -42,7 +42,7 @@ describe ActiveInteraction::FilterColumn do
|
|
42
42
|
let(:type) { :integer }
|
43
43
|
|
44
44
|
it 'returns true' do
|
45
|
-
expect(number?).to
|
45
|
+
expect(number?).to be_truthy
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -50,7 +50,7 @@ describe ActiveInteraction::FilterColumn do
|
|
50
50
|
let(:type) { :float }
|
51
51
|
|
52
52
|
it 'returns true' do
|
53
|
-
expect(number?).to
|
53
|
+
expect(number?).to be_truthy
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -58,7 +58,7 @@ describe ActiveInteraction::FilterColumn do
|
|
58
58
|
let(:type) { :string }
|
59
59
|
|
60
60
|
it 'returns false' do
|
61
|
-
expect(number?).to
|
61
|
+
expect(number?).to be_falsey
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
@@ -72,7 +72,7 @@ describe ActiveInteraction::FilterColumn do
|
|
72
72
|
let(:type) { :string }
|
73
73
|
|
74
74
|
it 'returns true' do
|
75
|
-
expect(text?).to
|
75
|
+
expect(text?).to be_truthy
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -80,7 +80,7 @@ describe ActiveInteraction::FilterColumn do
|
|
80
80
|
let(:type) { :float }
|
81
81
|
|
82
82
|
it 'returns false' do
|
83
|
-
expect(text?).to
|
83
|
+
expect(text?).to be_falsey
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
@@ -10,7 +10,7 @@ describe ActiveInteraction::BooleanFilter, :filter do
|
|
10
10
|
context 'falsey' do
|
11
11
|
[false, '0', 'false', 'FALSE'].each do |value|
|
12
12
|
it "returns false for #{value.inspect}" do
|
13
|
-
expect(filter.cast(value)).to
|
13
|
+
expect(filter.cast(value)).to be_falsey
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -18,7 +18,7 @@ describe ActiveInteraction::BooleanFilter, :filter do
|
|
18
18
|
context 'truthy' do
|
19
19
|
[true, '1', 'true', 'TRUE'].each do |value|
|
20
20
|
it "returns true for #{value.inspect}" do
|
21
|
-
expect(filter.cast(value)).to
|
21
|
+
expect(filter.cast(value)).to be_truthy
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -5,11 +5,11 @@ require 'spec_helper'
|
|
5
5
|
describe ActiveInteraction::InputProcessor do
|
6
6
|
describe '.reserved?(name)' do
|
7
7
|
it 'returns true for anything starting with "_interaction_"' do
|
8
|
-
expect(described_class.reserved?('_interaction_')).to
|
8
|
+
expect(described_class.reserved?('_interaction_')).to be_truthy
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'returns false for anything else' do
|
12
|
-
expect(described_class.reserved?(SecureRandom.hex)).to
|
12
|
+
expect(described_class.reserved?(SecureRandom.hex)).to be_falsey
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -21,7 +21,7 @@ describe ActiveInteraction::Validation do
|
|
21
21
|
let(:inputs) { { name: 1 } }
|
22
22
|
|
23
23
|
before do
|
24
|
-
filter.
|
24
|
+
allow(filter).to receive(:cast).and_return(1)
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'returns no errors' do
|
@@ -31,7 +31,7 @@ describe ActiveInteraction::Validation do
|
|
31
31
|
|
32
32
|
context 'filter throws' do
|
33
33
|
before do
|
34
|
-
filter.
|
34
|
+
allow(filter).to receive(:cast).and_raise(exception)
|
35
35
|
end
|
36
36
|
|
37
37
|
context 'InvalidValueError' do
|
data/spec/spec_helper.rb
CHANGED
@@ -3,14 +3,17 @@
|
|
3
3
|
require 'coveralls'
|
4
4
|
Coveralls.wear!
|
5
5
|
|
6
|
+
require 'i18n'
|
7
|
+
if I18n.config.respond_to?(:enforce_available_locales)
|
8
|
+
I18n.config.enforce_available_locales = true
|
9
|
+
I18n.config.available_locales = %w[en hsilgne]
|
10
|
+
end
|
11
|
+
|
6
12
|
require 'active_interaction'
|
7
13
|
|
8
14
|
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
9
15
|
|
10
16
|
RSpec.configure do |config|
|
11
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
12
17
|
config.run_all_when_everything_filtered = true
|
13
18
|
config.filter_run_including :focus
|
14
19
|
end
|
15
|
-
|
16
|
-
I18n.config.enforce_available_locales = true
|
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: 1.2.
|
4
|
+
version: 1.2.4
|
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: 2014-
|
12
|
+
date: 2014-08-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -17,7 +17,7 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '3'
|
20
|
+
version: '3.2'
|
21
21
|
- - "<"
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: '5'
|
@@ -27,7 +27,7 @@ dependencies:
|
|
27
27
|
requirements:
|
28
28
|
- - ">="
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version: '3'
|
30
|
+
version: '3.2'
|
31
31
|
- - "<"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '5'
|
@@ -121,14 +121,14 @@ dependencies:
|
|
121
121
|
requirements:
|
122
122
|
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
124
|
+
version: 0.24.1
|
125
125
|
type: :development
|
126
126
|
prerelease: false
|
127
127
|
version_requirements: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - '='
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.
|
131
|
+
version: 0.24.1
|
132
132
|
- !ruby/object:Gem::Dependency
|
133
133
|
name: yard
|
134
134
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,6 +143,20 @@ dependencies:
|
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
145
|
version: '0.8'
|
146
|
+
- !ruby/object:Gem::Dependency
|
147
|
+
name: rspec
|
148
|
+
requirement: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 3.0.0
|
153
|
+
type: :development
|
154
|
+
prerelease: false
|
155
|
+
version_requirements: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - '='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 3.0.0
|
146
160
|
description: Manage application specific business logic.
|
147
161
|
email:
|
148
162
|
- aaron.lasseigne@gmail.com
|
@@ -251,7 +265,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
251
265
|
version: '0'
|
252
266
|
requirements: []
|
253
267
|
rubyforge_project:
|
254
|
-
rubygems_version: 2.
|
268
|
+
rubygems_version: 2.4.1
|
255
269
|
signing_key:
|
256
270
|
specification_version: 4
|
257
271
|
summary: Manage application specific business logic.
|