active_interaction 1.2.5 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -1
- data/README.md +1 -1
- data/lib/active_interaction.rb +2 -1
- data/lib/active_interaction/base.rb +15 -7
- data/lib/active_interaction/filters/interface_filter.rb +44 -0
- data/lib/active_interaction/locale/en.yml +1 -0
- data/lib/active_interaction/version.rb +1 -1
- data/spec/active_interaction/base_spec.rb +72 -0
- data/spec/active_interaction/filters/interface_filter_spec.rb +46 -0
- data/spec/active_interaction/integration/interface_interaction_spec.rb +12 -0
- metadata +6 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20cc4b1b768b7f7dddca393b9554a664bb23010a
|
4
|
+
data.tar.gz: c746e003137672689025a54a9245330527088366
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 678d8066fa76930180a241ab069617a46d083ac2ca558a4cfee8cb4e6a76131e907ed486ddbd898be89d4f513c74a5799169ba556d24240deb9ad005748c7bcd
|
7
|
+
data.tar.gz: ac3d346048c4744d9b2ca25f91b2f719d0b3fcec609671feaf94353e00d4717c147c6e9b47a669cf37d39d327b8c9352e4ac6f9f78cd8d3106235c44e5ede6d2
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# [Master][]
|
2
2
|
|
3
|
+
# [1.3.0][] (2014-08-15)
|
4
|
+
|
5
|
+
## Added
|
6
|
+
|
7
|
+
- [#178][]: Add an interface filter.
|
8
|
+
- [#196][]: Add a `type_check` callback that happens before the `validation`
|
9
|
+
callback.
|
10
|
+
|
3
11
|
# [1.2.5][] (2014-08-15)
|
4
12
|
|
5
13
|
## Fixed
|
@@ -338,7 +346,8 @@
|
|
338
346
|
|
339
347
|
- Initial release.
|
340
348
|
|
341
|
-
[master]: https://github.com/orgsync/active_interaction/compare/v1.
|
349
|
+
[master]: https://github.com/orgsync/active_interaction/compare/v1.3.0...master
|
350
|
+
[1.3.0]: https://github.com/orgsync/active_interaction/compare/v1.2.5...v1.3.0
|
342
351
|
[1.2.5]: https://github.com/orgsync/active_interaction/compare/v1.2.4...v1.2.5
|
343
352
|
[1.2.4]: https://github.com/orgsync/active_interaction/compare/v1.2.3...v1.2.4
|
344
353
|
[1.2.3]: https://github.com/orgsync/active_interaction/compare/v1.2.2...v1.2.3
|
@@ -438,8 +447,10 @@
|
|
438
447
|
[#173]: https://github.com/orgsync/active_interaction/issues/173
|
439
448
|
[#174]: https://github.com/orgsync/active_interaction/issues/174
|
440
449
|
[#175]: https://github.com/orgsync/active_interaction/issues/175
|
450
|
+
[#178]: https://github.com/orgsync/active_interaction/issues/178
|
441
451
|
[#179]: https://github.com/orgsync/active_interaction/issues/179
|
442
452
|
[#192]: https://github.com/orgsync/active_interaction/issues/192
|
453
|
+
[#196]: https://github.com/orgsync/active_interaction/issues/196
|
443
454
|
[#201]: https://github.com/orgsync/active_interaction/issues/201
|
444
455
|
[#203]: https://github.com/orgsync/active_interaction/issues/203
|
445
456
|
[#206]: https://github.com/orgsync/active_interaction/issues/206
|
data/README.md
CHANGED
data/lib/active_interaction.rb
CHANGED
@@ -30,6 +30,7 @@ require 'active_interaction/filters/file_filter'
|
|
30
30
|
require 'active_interaction/filters/float_filter'
|
31
31
|
require 'active_interaction/filters/hash_filter'
|
32
32
|
require 'active_interaction/filters/integer_filter'
|
33
|
+
require 'active_interaction/filters/interface_filter'
|
33
34
|
require 'active_interaction/filters/model_filter'
|
34
35
|
require 'active_interaction/filters/string_filter'
|
35
36
|
require 'active_interaction/filters/symbol_filter'
|
@@ -49,5 +50,5 @@ I18n.load_path += Dir[File.expand_path(
|
|
49
50
|
#
|
50
51
|
# @since 1.0.0
|
51
52
|
#
|
52
|
-
# @version 1.
|
53
|
+
# @version 1.3.0
|
53
54
|
module ActiveInteraction end
|
@@ -31,7 +31,7 @@ module ActiveInteraction
|
|
31
31
|
include ActiveModelable
|
32
32
|
include Runnable
|
33
33
|
|
34
|
-
|
34
|
+
define_callbacks :type_check
|
35
35
|
|
36
36
|
class << self
|
37
37
|
include Hashable
|
@@ -235,6 +235,14 @@ module ActiveInteraction
|
|
235
235
|
end
|
236
236
|
end
|
237
237
|
|
238
|
+
protected
|
239
|
+
|
240
|
+
def run_validations!
|
241
|
+
type_check
|
242
|
+
|
243
|
+
super if errors.empty?
|
244
|
+
end
|
245
|
+
|
238
246
|
private
|
239
247
|
|
240
248
|
# @param inputs [Hash{Symbol => Object}]
|
@@ -257,16 +265,16 @@ module ActiveInteraction
|
|
257
265
|
begin
|
258
266
|
public_send("#{name}=", filter.clean(inputs[name]))
|
259
267
|
rescue InvalidValueError, MissingValueError, InvalidNestedValueError
|
260
|
-
#
|
268
|
+
# #type_check will add errors if appropriate.
|
261
269
|
end
|
262
270
|
end
|
263
271
|
end
|
264
272
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
273
|
+
def type_check
|
274
|
+
run_callbacks(:type_check) do
|
275
|
+
Validation.validate(self.class.filters, inputs).each do |error|
|
276
|
+
errors.add_sym(*error)
|
277
|
+
end
|
270
278
|
end
|
271
279
|
end
|
272
280
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ActiveInteraction
|
4
|
+
class Base
|
5
|
+
# @!method self.interface(*attributes, options = {})
|
6
|
+
# Creates accessors for the attributes and ensures that values passed to
|
7
|
+
# the attributes implement an interface.
|
8
|
+
#
|
9
|
+
# @!macro filter_method_params
|
10
|
+
# @option options [Array<Symbol>] :methods ([]) the methods that objects
|
11
|
+
# conforming to this interface should respond to
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# interface :anything
|
15
|
+
# @example
|
16
|
+
# interface :serializer,
|
17
|
+
# methods: [:dump, :load]
|
18
|
+
end
|
19
|
+
|
20
|
+
# @private
|
21
|
+
class InterfaceFilter < Filter
|
22
|
+
register :interface
|
23
|
+
|
24
|
+
def cast(value)
|
25
|
+
matches?(value) ? value : super
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# @param object [Object]
|
31
|
+
#
|
32
|
+
# @return [Boolean]
|
33
|
+
def matches?(object)
|
34
|
+
methods.all? { |method| object.respond_to?(method) }
|
35
|
+
rescue NoMethodError
|
36
|
+
false
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [Array<Symbol>]
|
40
|
+
def methods
|
41
|
+
options.fetch(:methods, [])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -531,4 +531,76 @@ describe ActiveInteraction::Base do
|
|
531
531
|
include_examples 'import_filters examples', [:x], [:x]
|
532
532
|
end
|
533
533
|
end
|
534
|
+
|
535
|
+
context 'callbacks' do
|
536
|
+
let(:described_class) { Class.new(TestInteraction) }
|
537
|
+
|
538
|
+
%w[type_check validate execute].each do |name|
|
539
|
+
%w[before after around].map(&:to_sym).each do |type|
|
540
|
+
it "runs the #{type} #{name} callback" do
|
541
|
+
called = false
|
542
|
+
described_class.set_callback(name, type) { called = true }
|
543
|
+
outcome
|
544
|
+
expect(called).to be_truthy
|
545
|
+
end
|
546
|
+
end
|
547
|
+
end
|
548
|
+
|
549
|
+
context 'with errors during type_check' do
|
550
|
+
before do
|
551
|
+
described_class.set_callback(:type_check, :before) do
|
552
|
+
errors.add(:base)
|
553
|
+
end
|
554
|
+
end
|
555
|
+
|
556
|
+
it 'is invalid' do
|
557
|
+
expect(outcome).to be_invalid
|
558
|
+
end
|
559
|
+
|
560
|
+
it 'does not run validate callbacks' do
|
561
|
+
called = false
|
562
|
+
described_class.set_callback(:validate, :before) { called = true }
|
563
|
+
outcome
|
564
|
+
expect(called).to be_falsey
|
565
|
+
end
|
566
|
+
|
567
|
+
it 'does not run execute callbacks' do
|
568
|
+
called = false
|
569
|
+
described_class.set_callback(:execute, :before) { called = true }
|
570
|
+
outcome
|
571
|
+
expect(called).to be_falsey
|
572
|
+
end
|
573
|
+
end
|
574
|
+
|
575
|
+
context 'with errors during validate' do
|
576
|
+
before do
|
577
|
+
described_class.set_callback(:validate, :before) do
|
578
|
+
errors.add(:base)
|
579
|
+
end
|
580
|
+
end
|
581
|
+
|
582
|
+
it 'is invalid' do
|
583
|
+
expect(outcome).to be_invalid
|
584
|
+
end
|
585
|
+
|
586
|
+
it 'does not run execute callbacks' do
|
587
|
+
called = false
|
588
|
+
described_class.set_callback(:execute, :before) { called = true }
|
589
|
+
outcome
|
590
|
+
expect(called).to be_falsey
|
591
|
+
end
|
592
|
+
end
|
593
|
+
|
594
|
+
context 'with errors during execute' do
|
595
|
+
before do
|
596
|
+
described_class.set_callback(:execute, :before) do
|
597
|
+
errors.add(:base)
|
598
|
+
end
|
599
|
+
end
|
600
|
+
|
601
|
+
it 'is invalid' do
|
602
|
+
expect(outcome).to be_invalid
|
603
|
+
end
|
604
|
+
end
|
605
|
+
end
|
534
606
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'json'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
describe ActiveInteraction::InterfaceFilter, :filter do
|
8
|
+
include_context 'filters'
|
9
|
+
it_behaves_like 'a filter'
|
10
|
+
|
11
|
+
before { options[:methods] = [:dump, :load] }
|
12
|
+
|
13
|
+
describe '#cast' do
|
14
|
+
let(:result) { filter.cast(value) }
|
15
|
+
|
16
|
+
context 'with an Object' do
|
17
|
+
let(:value) { Object.new }
|
18
|
+
|
19
|
+
it 'raises an error' do
|
20
|
+
expect { result }.to raise_error ActiveInteraction::InvalidValueError
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with JSON' do
|
25
|
+
let(:value) { JSON }
|
26
|
+
|
27
|
+
it 'returns an Array' do
|
28
|
+
expect(result).to eql value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'with YAML' do
|
33
|
+
let(:value) { YAML }
|
34
|
+
|
35
|
+
it 'returns an Hash' do
|
36
|
+
expect(result).to eql value
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#database_column_type' do
|
42
|
+
it 'returns :string' do
|
43
|
+
expect(filter.database_column_type).to eql :string
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
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.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Lasseigne
|
@@ -187,6 +187,7 @@ files:
|
|
187
187
|
- lib/active_interaction/filters/float_filter.rb
|
188
188
|
- lib/active_interaction/filters/hash_filter.rb
|
189
189
|
- lib/active_interaction/filters/integer_filter.rb
|
190
|
+
- lib/active_interaction/filters/interface_filter.rb
|
190
191
|
- lib/active_interaction/filters/model_filter.rb
|
191
192
|
- lib/active_interaction/filters/string_filter.rb
|
192
193
|
- lib/active_interaction/filters/symbol_filter.rb
|
@@ -217,6 +218,7 @@ files:
|
|
217
218
|
- spec/active_interaction/filters/float_filter_spec.rb
|
218
219
|
- spec/active_interaction/filters/hash_filter_spec.rb
|
219
220
|
- spec/active_interaction/filters/integer_filter_spec.rb
|
221
|
+
- spec/active_interaction/filters/interface_filter_spec.rb
|
220
222
|
- spec/active_interaction/filters/model_filter_spec.rb
|
221
223
|
- spec/active_interaction/filters/string_filter_spec.rb
|
222
224
|
- spec/active_interaction/filters/symbol_filter_spec.rb
|
@@ -231,6 +233,7 @@ files:
|
|
231
233
|
- spec/active_interaction/integration/float_interaction_spec.rb
|
232
234
|
- spec/active_interaction/integration/hash_interaction_spec.rb
|
233
235
|
- spec/active_interaction/integration/integer_interaction_spec.rb
|
236
|
+
- spec/active_interaction/integration/interface_interaction_spec.rb
|
234
237
|
- spec/active_interaction/integration/model_interaction_spec.rb
|
235
238
|
- spec/active_interaction/integration/string_interaction_spec.rb
|
236
239
|
- spec/active_interaction/integration/symbol_interaction_spec.rb
|
@@ -291,6 +294,7 @@ test_files:
|
|
291
294
|
- spec/active_interaction/filters/float_filter_spec.rb
|
292
295
|
- spec/active_interaction/filters/hash_filter_spec.rb
|
293
296
|
- spec/active_interaction/filters/integer_filter_spec.rb
|
297
|
+
- spec/active_interaction/filters/interface_filter_spec.rb
|
294
298
|
- spec/active_interaction/filters/model_filter_spec.rb
|
295
299
|
- spec/active_interaction/filters/string_filter_spec.rb
|
296
300
|
- spec/active_interaction/filters/symbol_filter_spec.rb
|
@@ -305,6 +309,7 @@ test_files:
|
|
305
309
|
- spec/active_interaction/integration/float_interaction_spec.rb
|
306
310
|
- spec/active_interaction/integration/hash_interaction_spec.rb
|
307
311
|
- spec/active_interaction/integration/integer_interaction_spec.rb
|
312
|
+
- spec/active_interaction/integration/interface_interaction_spec.rb
|
308
313
|
- spec/active_interaction/integration/model_interaction_spec.rb
|
309
314
|
- spec/active_interaction/integration/string_interaction_spec.rb
|
310
315
|
- spec/active_interaction/integration/symbol_interaction_spec.rb
|