active_interaction 4.1.0 → 5.0.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 +128 -1
- data/README.md +63 -28
- data/lib/active_interaction/array_input.rb +77 -0
- data/lib/active_interaction/base.rb +14 -98
- data/lib/active_interaction/concerns/active_recordable.rb +3 -3
- data/lib/active_interaction/concerns/missable.rb +2 -2
- data/lib/active_interaction/errors.rb +6 -88
- data/lib/active_interaction/exceptions.rb +47 -0
- data/lib/active_interaction/filter/column.rb +59 -0
- data/lib/active_interaction/filter/error.rb +40 -0
- data/lib/active_interaction/filter.rb +44 -53
- data/lib/active_interaction/filters/abstract_date_time_filter.rb +9 -6
- data/lib/active_interaction/filters/abstract_numeric_filter.rb +7 -3
- data/lib/active_interaction/filters/array_filter.rb +34 -6
- data/lib/active_interaction/filters/boolean_filter.rb +4 -3
- data/lib/active_interaction/filters/date_filter.rb +1 -1
- data/lib/active_interaction/filters/date_time_filter.rb +1 -1
- data/lib/active_interaction/filters/decimal_filter.rb +1 -1
- data/lib/active_interaction/filters/float_filter.rb +1 -1
- data/lib/active_interaction/filters/hash_filter.rb +23 -15
- data/lib/active_interaction/filters/integer_filter.rb +1 -1
- data/lib/active_interaction/filters/interface_filter.rb +12 -12
- data/lib/active_interaction/filters/object_filter.rb +9 -3
- data/lib/active_interaction/filters/record_filter.rb +21 -11
- data/lib/active_interaction/filters/string_filter.rb +1 -1
- data/lib/active_interaction/filters/symbol_filter.rb +1 -1
- data/lib/active_interaction/filters/time_filter.rb +4 -4
- data/lib/active_interaction/hash_input.rb +43 -0
- data/lib/active_interaction/input.rb +23 -0
- data/lib/active_interaction/inputs.rb +157 -46
- data/lib/active_interaction/locale/en.yml +0 -1
- data/lib/active_interaction/locale/fr.yml +0 -1
- data/lib/active_interaction/locale/it.yml +0 -1
- data/lib/active_interaction/locale/ja.yml +0 -1
- data/lib/active_interaction/locale/pt-BR.yml +0 -1
- data/lib/active_interaction/modules/validation.rb +6 -17
- data/lib/active_interaction/version.rb +1 -1
- data/lib/active_interaction.rb +43 -36
- data/spec/active_interaction/array_input_spec.rb +166 -0
- data/spec/active_interaction/base_spec.rb +15 -240
- data/spec/active_interaction/concerns/active_modelable_spec.rb +3 -3
- data/spec/active_interaction/concerns/active_recordable_spec.rb +7 -7
- data/spec/active_interaction/concerns/hashable_spec.rb +8 -8
- data/spec/active_interaction/concerns/missable_spec.rb +9 -9
- data/spec/active_interaction/concerns/runnable_spec.rb +34 -32
- data/spec/active_interaction/errors_spec.rb +60 -43
- data/spec/active_interaction/{filter_column_spec.rb → filter/column_spec.rb} +3 -10
- data/spec/active_interaction/filter_spec.rb +6 -6
- data/spec/active_interaction/filters/abstract_date_time_filter_spec.rb +2 -2
- data/spec/active_interaction/filters/abstract_numeric_filter_spec.rb +2 -2
- data/spec/active_interaction/filters/array_filter_spec.rb +99 -16
- data/spec/active_interaction/filters/boolean_filter_spec.rb +12 -11
- data/spec/active_interaction/filters/date_filter_spec.rb +32 -27
- data/spec/active_interaction/filters/date_time_filter_spec.rb +34 -29
- data/spec/active_interaction/filters/decimal_filter_spec.rb +20 -18
- data/spec/active_interaction/filters/file_filter_spec.rb +7 -7
- data/spec/active_interaction/filters/float_filter_spec.rb +19 -17
- data/spec/active_interaction/filters/hash_filter_spec.rb +16 -18
- data/spec/active_interaction/filters/integer_filter_spec.rb +24 -22
- data/spec/active_interaction/filters/interface_filter_spec.rb +105 -82
- data/spec/active_interaction/filters/object_filter_spec.rb +52 -36
- data/spec/active_interaction/filters/record_filter_spec.rb +61 -39
- data/spec/active_interaction/filters/string_filter_spec.rb +7 -7
- data/spec/active_interaction/filters/symbol_filter_spec.rb +6 -6
- data/spec/active_interaction/filters/time_filter_spec.rb +57 -34
- data/spec/active_interaction/hash_input_spec.rb +58 -0
- data/spec/active_interaction/i18n_spec.rb +22 -17
- data/spec/active_interaction/inputs_spec.rb +167 -23
- data/spec/active_interaction/integration/array_interaction_spec.rb +3 -7
- data/spec/active_interaction/modules/validation_spec.rb +8 -31
- data/spec/spec_helper.rb +8 -0
- data/spec/support/concerns.rb +2 -2
- data/spec/support/filters.rb +27 -51
- data/spec/support/interactions.rb +4 -4
- metadata +40 -91
- data/lib/active_interaction/filter_column.rb +0 -57
| @@ -15,19 +15,19 @@ BackupObjectThing = ObjectThing | |
| 15 15 |  | 
| 16 16 | 
             
            describe ActiveInteraction::ObjectFilter, :filter do
         | 
| 17 17 | 
             
              include_context 'filters'
         | 
| 18 | 
            -
              it_behaves_like 'a filter'
         | 
| 19 | 
            -
             | 
| 20 18 | 
             
              before do
         | 
| 21 19 | 
             
                options[:class] = ObjectThing
         | 
| 22 20 | 
             
              end
         | 
| 23 21 |  | 
| 24 | 
            -
               | 
| 22 | 
            +
              it_behaves_like 'a filter'
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              describe '#process' do
         | 
| 25 25 | 
             
                let(:value) { ObjectThing.new }
         | 
| 26 | 
            -
                let(:result) { filter. | 
| 26 | 
            +
                let(:result) { filter.process(value, nil) }
         | 
| 27 27 |  | 
| 28 28 | 
             
                context 'with an instance of the class' do
         | 
| 29 29 | 
             
                  it 'returns the instance' do
         | 
| 30 | 
            -
                    expect(result).to eql value
         | 
| 30 | 
            +
                    expect(result.value).to eql value
         | 
| 31 31 | 
             
                  end
         | 
| 32 32 |  | 
| 33 33 | 
             
                  context 'with an instance that is a subclass' do
         | 
| @@ -35,18 +35,18 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 35 35 | 
             
                    let(:value) { subclass.new }
         | 
| 36 36 |  | 
| 37 37 | 
             
                    it 'returns the instance' do
         | 
| 38 | 
            -
                      expect(result).to eql value
         | 
| 38 | 
            +
                      expect(result.value).to eql value
         | 
| 39 39 | 
             
                    end
         | 
| 40 40 | 
             
                  end
         | 
| 41 41 |  | 
| 42 42 | 
             
                  it 'handles reconstantizing' do
         | 
| 43 | 
            -
                    expect(result).to eql value
         | 
| 43 | 
            +
                    expect(result.value).to eql value
         | 
| 44 44 |  | 
| 45 45 | 
             
                    Object.send(:remove_const, :ObjectThing)
         | 
| 46 46 | 
             
                    ObjectThing = BackupObjectThing # rubocop:disable Lint/ConstantDefinitionInBlock
         | 
| 47 47 | 
             
                    value = ObjectThing.new
         | 
| 48 48 |  | 
| 49 | 
            -
                    expect(filter. | 
| 49 | 
            +
                    expect(filter.process(value, nil).value).to eql value
         | 
| 50 50 | 
             
                  end
         | 
| 51 51 |  | 
| 52 52 | 
             
                  it 'handles reconstantizing subclasses' do
         | 
| @@ -57,11 +57,12 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 57 57 | 
             
                    class SubObjectThing < ObjectThing; end # rubocop:disable Lint/ConstantDefinitionInBlock
         | 
| 58 58 | 
             
                    value = SubObjectThing.new
         | 
| 59 59 |  | 
| 60 | 
            -
                    expect(filter. | 
| 60 | 
            +
                    expect(filter.process(value, nil).value).to eql value
         | 
| 61 61 | 
             
                  end
         | 
| 62 62 |  | 
| 63 63 | 
             
                  context 'without the class available' do
         | 
| 64 64 | 
             
                    before { Object.send(:remove_const, :ObjectThing) }
         | 
| 65 | 
            +
             | 
| 65 66 | 
             
                    after { ObjectThing = BackupObjectThing } # rubocop:disable Lint/ConstantDefinitionInBlock
         | 
| 66 67 |  | 
| 67 68 | 
             
                    it 'does not raise an error on initialization' do
         | 
| @@ -76,7 +77,7 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 76 77 | 
             
                  end
         | 
| 77 78 |  | 
| 78 79 | 
             
                  it 'returns the instance' do
         | 
| 79 | 
            -
                    expect(result).to eql value
         | 
| 80 | 
            +
                    expect(result.value).to eql value
         | 
| 80 81 | 
             
                  end
         | 
| 81 82 | 
             
                end
         | 
| 82 83 |  | 
| @@ -86,7 +87,7 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 86 87 | 
             
                  before { options[:class] = ObjectThings }
         | 
| 87 88 |  | 
| 88 89 | 
             
                  it 'returns the instance' do
         | 
| 89 | 
            -
                    expect(result).to eql value
         | 
| 90 | 
            +
                    expect(result.value).to eql value
         | 
| 90 91 | 
             
                  end
         | 
| 91 92 | 
             
                end
         | 
| 92 93 |  | 
| @@ -111,7 +112,7 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 111 112 | 
             
                    end
         | 
| 112 113 |  | 
| 113 114 | 
             
                    it 'calls the class method' do
         | 
| 114 | 
            -
                      expect(result).to eql ObjectThing.converter(value)
         | 
| 115 | 
            +
                      expect(result.value).to eql ObjectThing.converter(value)
         | 
| 115 116 | 
             
                    end
         | 
| 116 117 | 
             
                  end
         | 
| 117 118 |  | 
| @@ -121,7 +122,7 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 121 122 | 
             
                    end
         | 
| 122 123 |  | 
| 123 124 | 
             
                    it 'gets called' do
         | 
| 124 | 
            -
                      expect(result).to eql ObjectThing.converter(value)
         | 
| 125 | 
            +
                      expect(result.value).to eql ObjectThing.converter(value)
         | 
| 125 126 | 
             
                    end
         | 
| 126 127 | 
             
                  end
         | 
| 127 128 |  | 
| @@ -129,8 +130,13 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 129 130 | 
             
                    let(:value) { ObjectThing.new }
         | 
| 130 131 |  | 
| 131 132 | 
             
                    it 'does not call the converter' do
         | 
| 132 | 
            -
                       | 
| 133 | 
            -
                       | 
| 133 | 
            +
                      allow(ObjectThing).to receive(:converter)
         | 
| 134 | 
            +
                      result.value
         | 
| 135 | 
            +
                      expect(ObjectThing).to_not have_received(:converter)
         | 
| 136 | 
            +
                    end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    it 'returns the correct value' do
         | 
| 139 | 
            +
                      expect(result.value).to eql value
         | 
| 134 140 | 
             
                    end
         | 
| 135 141 | 
             
                  end
         | 
| 136 142 |  | 
| @@ -139,18 +145,29 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 139 145 | 
             
                    let(:value) { subclass.new }
         | 
| 140 146 |  | 
| 141 147 | 
             
                    it 'does not call the converter' do
         | 
| 142 | 
            -
                       | 
| 143 | 
            -
                       | 
| 148 | 
            +
                      allow(subclass).to receive(:converter)
         | 
| 149 | 
            +
                      result.value
         | 
| 150 | 
            +
                      expect(subclass).to_not have_received(:converter)
         | 
| 151 | 
            +
                    end
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                    it 'returns the correct value' do
         | 
| 154 | 
            +
                      expect(result.value).to eql value
         | 
| 144 155 | 
             
                    end
         | 
| 145 156 | 
             
                  end
         | 
| 146 157 |  | 
| 147 158 | 
             
                  context 'with a nil value' do
         | 
| 148 159 | 
             
                    let(:value) { nil }
         | 
| 160 | 
            +
             | 
| 149 161 | 
             
                    include_context 'optional'
         | 
| 150 162 |  | 
| 151 163 | 
             
                    it 'returns nil' do
         | 
| 152 | 
            -
                       | 
| 153 | 
            -
                       | 
| 164 | 
            +
                      allow(ObjectThing).to receive(:converter)
         | 
| 165 | 
            +
                      result.value
         | 
| 166 | 
            +
                      expect(ObjectThing).to_not have_received(:converter)
         | 
| 167 | 
            +
                    end
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                    it 'returns the correct value' do
         | 
| 170 | 
            +
                      expect(result.value).to eql value
         | 
| 154 171 | 
             
                    end
         | 
| 155 172 | 
             
                  end
         | 
| 156 173 |  | 
| @@ -171,17 +188,14 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 171 188 | 
             
                      options[:converter] = :converter_with_error
         | 
| 172 189 | 
             
                    end
         | 
| 173 190 |  | 
| 174 | 
            -
                    it ' | 
| 175 | 
            -
                       | 
| 176 | 
            -
             | 
| 177 | 
            -
                       | 
| 191 | 
            +
                    it 'indicates an error' do
         | 
| 192 | 
            +
                      error = result.errors.first
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                      expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
         | 
| 195 | 
            +
                      expect(error.type).to be :invalid_type
         | 
| 178 196 | 
             
                    end
         | 
| 179 197 | 
             
                  end
         | 
| 180 | 
            -
                end
         | 
| 181 | 
            -
              end
         | 
| 182 198 |  | 
| 183 | 
            -
              describe '#clean' do
         | 
| 184 | 
            -
                context 'with a converter' do
         | 
| 185 199 | 
             
                  context 'that returns a nil' do
         | 
| 186 200 | 
             
                    let(:value) { '' }
         | 
| 187 201 |  | 
| @@ -190,10 +204,11 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 190 204 | 
             
                      options[:converter] = ->(_) {}
         | 
| 191 205 | 
             
                    end
         | 
| 192 206 |  | 
| 193 | 
            -
                    it ' | 
| 194 | 
            -
                       | 
| 195 | 
            -
             | 
| 196 | 
            -
                       | 
| 207 | 
            +
                    it 'indicates an error' do
         | 
| 208 | 
            +
                      error = filter.process(value, nil).errors.first
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                      expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
         | 
| 211 | 
            +
                      expect(error.type).to be :invalid_type
         | 
| 197 212 | 
             
                    end
         | 
| 198 213 | 
             
                  end
         | 
| 199 214 |  | 
| @@ -204,10 +219,11 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 204 219 | 
             
                      options[:converter] = ->(_) { 'invalid' }
         | 
| 205 220 | 
             
                    end
         | 
| 206 221 |  | 
| 207 | 
            -
                    it ' | 
| 208 | 
            -
                       | 
| 209 | 
            -
             | 
| 210 | 
            -
                       | 
| 222 | 
            +
                    it 'indicates an error' do
         | 
| 223 | 
            +
                      error = filter.process(value, nil).errors.first
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                      expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
         | 
| 226 | 
            +
                      expect(error.type).to be :invalid_type
         | 
| 211 227 | 
             
                    end
         | 
| 212 228 | 
             
                  end
         | 
| 213 229 | 
             
                end
         | 
| @@ -215,7 +231,7 @@ describe ActiveInteraction::ObjectFilter, :filter do | |
| 215 231 |  | 
| 216 232 | 
             
              describe '#database_column_type' do
         | 
| 217 233 | 
             
                it 'returns :string' do
         | 
| 218 | 
            -
                  expect(filter.database_column_type).to  | 
| 234 | 
            +
                  expect(filter.database_column_type).to be :string
         | 
| 219 235 | 
             
                end
         | 
| 220 236 | 
             
              end
         | 
| 221 237 | 
             
            end
         | 
| @@ -14,11 +14,7 @@ class RecordThing | |
| 14 14 | 
             
              end
         | 
| 15 15 |  | 
| 16 16 | 
             
              def self.finds_bad_value(_)
         | 
| 17 | 
            -
                 | 
| 18 | 
            -
              end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
              def self.passthrough(obj)
         | 
| 21 | 
            -
                obj
         | 
| 17 | 
            +
                Object.new
         | 
| 22 18 | 
             
              end
         | 
| 23 19 | 
             
            end
         | 
| 24 20 |  | 
| @@ -27,23 +23,19 @@ BackupRecordThing = RecordThing | |
| 27 23 |  | 
| 28 24 | 
             
            describe ActiveInteraction::RecordFilter, :filter do
         | 
| 29 25 | 
             
              include_context 'filters'
         | 
| 30 | 
            -
              it_behaves_like 'a filter'
         | 
| 31 | 
            -
             | 
| 32 26 | 
             
              before do
         | 
| 33 27 | 
             
                options[:class] = RecordThing
         | 
| 34 28 | 
             
              end
         | 
| 35 29 |  | 
| 36 | 
            -
               | 
| 37 | 
            -
                before do
         | 
| 38 | 
            -
                  options[:finder] = :finder
         | 
| 39 | 
            -
                end
         | 
| 30 | 
            +
              it_behaves_like 'a filter'
         | 
| 40 31 |  | 
| 32 | 
            +
              describe '#process' do
         | 
| 41 33 | 
             
                let(:value) { RecordThing.new }
         | 
| 42 | 
            -
                let(:result) { filter. | 
| 34 | 
            +
                let(:result) { filter.process(value, nil) }
         | 
| 43 35 |  | 
| 44 36 | 
             
                context 'with an instance of the class' do
         | 
| 45 37 | 
             
                  it 'returns the instance' do
         | 
| 46 | 
            -
                    expect(result).to eql value
         | 
| 38 | 
            +
                    expect(result.value).to eql value
         | 
| 47 39 | 
             
                  end
         | 
| 48 40 |  | 
| 49 41 | 
             
                  context 'with an instance that is a subclass' do
         | 
| @@ -51,18 +43,18 @@ describe ActiveInteraction::RecordFilter, :filter do | |
| 51 43 | 
             
                    let(:value) { subclass.new }
         | 
| 52 44 |  | 
| 53 45 | 
             
                    it 'returns the instance' do
         | 
| 54 | 
            -
                      expect(result).to eql value
         | 
| 46 | 
            +
                      expect(result.value).to eql value
         | 
| 55 47 | 
             
                    end
         | 
| 56 48 | 
             
                  end
         | 
| 57 49 |  | 
| 58 50 | 
             
                  it 'handles reconstantizing' do
         | 
| 59 | 
            -
                    expect(result).to eql value
         | 
| 51 | 
            +
                    expect(result.value).to eql value
         | 
| 60 52 |  | 
| 61 53 | 
             
                    Object.send(:remove_const, :RecordThing)
         | 
| 62 54 | 
             
                    RecordThing = BackupRecordThing # rubocop:disable Lint/ConstantDefinitionInBlock
         | 
| 63 55 | 
             
                    value = RecordThing.new
         | 
| 64 56 |  | 
| 65 | 
            -
                    expect(filter. | 
| 57 | 
            +
                    expect(filter.process(value, nil).value).to eql value
         | 
| 66 58 | 
             
                  end
         | 
| 67 59 |  | 
| 68 60 | 
             
                  it 'handles reconstantizing subclasses' do
         | 
| @@ -73,11 +65,12 @@ describe ActiveInteraction::RecordFilter, :filter do | |
| 73 65 | 
             
                    class SubRecordThing < RecordThing; end # rubocop:disable Lint/ConstantDefinitionInBlock
         | 
| 74 66 | 
             
                    value = SubRecordThing.new
         | 
| 75 67 |  | 
| 76 | 
            -
                    expect(filter. | 
| 68 | 
            +
                    expect(filter.process(value, nil).value).to eql value
         | 
| 77 69 | 
             
                  end
         | 
| 78 70 |  | 
| 79 71 | 
             
                  context 'without the class available' do
         | 
| 80 72 | 
             
                    before { Object.send(:remove_const, :RecordThing) }
         | 
| 73 | 
            +
             | 
| 81 74 | 
             
                    after { RecordThing = BackupRecordThing } # rubocop:disable Lint/ConstantDefinitionInBlock
         | 
| 82 75 |  | 
| 83 76 | 
             
                    it 'does not raise an error on initialization' do
         | 
| @@ -92,7 +85,7 @@ describe ActiveInteraction::RecordFilter, :filter do | |
| 92 85 | 
             
                  end
         | 
| 93 86 |  | 
| 94 87 | 
             
                  it 'returns the instance' do
         | 
| 95 | 
            -
                    expect(result).to eql value
         | 
| 88 | 
            +
                    expect(result.value).to eql value
         | 
| 96 89 | 
             
                  end
         | 
| 97 90 | 
             
                end
         | 
| 98 91 |  | 
| @@ -102,7 +95,7 @@ describe ActiveInteraction::RecordFilter, :filter do | |
| 102 95 | 
             
                  end
         | 
| 103 96 |  | 
| 104 97 | 
             
                  it 'returns the instance' do
         | 
| 105 | 
            -
                    expect(result).to eql value
         | 
| 98 | 
            +
                    expect(result.value).to eql value
         | 
| 106 99 | 
             
                  end
         | 
| 107 100 | 
             
                end
         | 
| 108 101 |  | 
| @@ -112,7 +105,7 @@ describe ActiveInteraction::RecordFilter, :filter do | |
| 112 105 | 
             
                  before { options[:class] = RecordThings }
         | 
| 113 106 |  | 
| 114 107 | 
             
                  it 'returns the instance' do
         | 
| 115 | 
            -
                    expect(result).to eql value
         | 
| 108 | 
            +
                    expect(result.value).to eql value
         | 
| 116 109 | 
             
                  end
         | 
| 117 110 | 
             
                end
         | 
| 118 111 |  | 
| @@ -129,48 +122,77 @@ describe ActiveInteraction::RecordFilter, :filter do | |
| 129 122 | 
             
                end
         | 
| 130 123 |  | 
| 131 124 | 
             
                context 'with a value that does not match the class' do
         | 
| 132 | 
            -
                  let(:value) {  | 
| 125 | 
            +
                  let(:value) { 1 }
         | 
| 133 126 |  | 
| 134 | 
            -
                  it 'calls the finder' do
         | 
| 135 | 
            -
                     | 
| 127 | 
            +
                  it 'calls the default finder' do
         | 
| 128 | 
            +
                    allow(RecordThing).to receive(:find)
         | 
| 129 | 
            +
                    result
         | 
| 130 | 
            +
                    expect(RecordThing).to have_received(:find).with(value)
         | 
| 136 131 | 
             
                  end
         | 
| 137 132 |  | 
| 138 133 | 
             
                  context 'with a custom finder' do
         | 
| 134 | 
            +
                    before do
         | 
| 135 | 
            +
                      options[:finder] = :finder
         | 
| 136 | 
            +
                    end
         | 
| 137 | 
            +
             | 
| 139 138 | 
             
                    it 'calls the custom finder' do
         | 
| 140 | 
            -
                       | 
| 139 | 
            +
                      allow(RecordThing).to receive(:finder)
         | 
| 140 | 
            +
                      result
         | 
| 141 | 
            +
                      expect(RecordThing).to have_received(:finder).with(value)
         | 
| 141 142 | 
             
                    end
         | 
| 142 143 | 
             
                  end
         | 
| 143 | 
            -
                end
         | 
| 144 | 
            -
              end
         | 
| 145 144 |  | 
| 146 | 
            -
              describe '#clean' do
         | 
| 147 | 
            -
                context 'with a value that does not match the class' do
         | 
| 148 145 | 
             
                  context 'that returns a nil' do
         | 
| 149 | 
            -
                    let(:value) {  | 
| 146 | 
            +
                    let(:value) { 1 }
         | 
| 150 147 |  | 
| 151 148 | 
             
                    before do
         | 
| 152 149 | 
             
                      options[:default] = RecordThing.new
         | 
| 153 150 | 
             
                      options[:finder] = :finds_nil
         | 
| 154 151 | 
             
                    end
         | 
| 155 152 |  | 
| 156 | 
            -
                    it ' | 
| 157 | 
            -
                       | 
| 158 | 
            -
             | 
| 159 | 
            -
                       | 
| 153 | 
            +
                    it 'indicates an error' do
         | 
| 154 | 
            +
                      error = filter.process(value, nil).errors.first
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                      expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
         | 
| 157 | 
            +
                      expect(error.type).to be :invalid_type
         | 
| 160 158 | 
             
                    end
         | 
| 161 159 | 
             
                  end
         | 
| 162 160 |  | 
| 163 161 | 
             
                  context 'that returns an invalid value' do
         | 
| 164 | 
            -
                    let(:value) {  | 
| 162 | 
            +
                    let(:value) { 1 }
         | 
| 165 163 |  | 
| 166 164 | 
             
                    before do
         | 
| 167 165 | 
             
                      options[:finder] = :finds_bad_value
         | 
| 168 166 | 
             
                    end
         | 
| 169 167 |  | 
| 170 | 
            -
                    it ' | 
| 171 | 
            -
                       | 
| 172 | 
            -
             | 
| 173 | 
            -
                       | 
| 168 | 
            +
                    it 'indicates an error' do
         | 
| 169 | 
            +
                      error = filter.process(value, nil).errors.first
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                      expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
         | 
| 172 | 
            +
                      expect(error.type).to be :invalid_type
         | 
| 173 | 
            +
                    end
         | 
| 174 | 
            +
                  end
         | 
| 175 | 
            +
                end
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                context 'with a blank String' do
         | 
| 178 | 
            +
                  let(:value) { ' ' }
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                  context 'optional' do
         | 
| 181 | 
            +
                    include_context 'optional'
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                    it 'returns the default' do
         | 
| 184 | 
            +
                      expect(filter.process(value, nil).value).to eql options[:default]
         | 
| 185 | 
            +
                    end
         | 
| 186 | 
            +
                  end
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                  context 'required' do
         | 
| 189 | 
            +
                    include_context 'required'
         | 
| 190 | 
            +
             | 
| 191 | 
            +
                    it 'indicates an error' do
         | 
| 192 | 
            +
                      error = filter.process(value, nil).errors.first
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                      expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
         | 
| 195 | 
            +
                      expect(error.type).to be :missing
         | 
| 174 196 | 
             
                    end
         | 
| 175 197 | 
             
                  end
         | 
| 176 198 | 
             
                end
         | 
| @@ -178,7 +200,7 @@ describe ActiveInteraction::RecordFilter, :filter do | |
| 178 200 |  | 
| 179 201 | 
             
              describe '#database_column_type' do
         | 
| 180 202 | 
             
                it 'returns :string' do
         | 
| 181 | 
            -
                  expect(filter.database_column_type).to  | 
| 203 | 
            +
                  expect(filter.database_column_type).to be :string
         | 
| 182 204 | 
             
                end
         | 
| 183 205 | 
             
              end
         | 
| 184 206 | 
             
            end
         | 
| @@ -10,14 +10,14 @@ describe ActiveInteraction::StringFilter, :filter do | |
| 10 10 | 
             
                end
         | 
| 11 11 | 
             
              end
         | 
| 12 12 |  | 
| 13 | 
            -
              describe '# | 
| 14 | 
            -
                let(:result) { filter. | 
| 13 | 
            +
              describe '#process' do
         | 
| 14 | 
            +
                let(:result) { filter.process(value, nil) }
         | 
| 15 15 |  | 
| 16 16 | 
             
                context 'with a String' do
         | 
| 17 17 | 
             
                  let(:value) { SecureRandom.hex }
         | 
| 18 18 |  | 
| 19 19 | 
             
                  it 'returns the String' do
         | 
| 20 | 
            -
                    expect(result).to eql value
         | 
| 20 | 
            +
                    expect(result.value).to eql value
         | 
| 21 21 | 
             
                  end
         | 
| 22 22 | 
             
                end
         | 
| 23 23 |  | 
| @@ -31,7 +31,7 @@ describe ActiveInteraction::StringFilter, :filter do | |
| 31 31 | 
             
                  end
         | 
| 32 32 |  | 
| 33 33 | 
             
                  it 'returns the String' do
         | 
| 34 | 
            -
                    expect(result).to eql value.to_str
         | 
| 34 | 
            +
                    expect(result.value).to eql value.to_str
         | 
| 35 35 | 
             
                  end
         | 
| 36 36 | 
             
                end
         | 
| 37 37 |  | 
| @@ -39,14 +39,14 @@ describe ActiveInteraction::StringFilter, :filter do | |
| 39 39 | 
             
                  let(:value) { " #{SecureRandom.hex} " }
         | 
| 40 40 |  | 
| 41 41 | 
             
                  it 'returns the stripped string' do
         | 
| 42 | 
            -
                    expect(result).to eql value.strip
         | 
| 42 | 
            +
                    expect(result.value).to eql value.strip
         | 
| 43 43 | 
             
                  end
         | 
| 44 44 |  | 
| 45 45 | 
             
                  context 'without strip' do
         | 
| 46 46 | 
             
                    include_context 'without strip'
         | 
| 47 47 |  | 
| 48 48 | 
             
                    it 'returns the String' do
         | 
| 49 | 
            -
                      expect(result).to eql value
         | 
| 49 | 
            +
                      expect(result.value).to eql value
         | 
| 50 50 | 
             
                    end
         | 
| 51 51 | 
             
                  end
         | 
| 52 52 | 
             
                end
         | 
| @@ -54,7 +54,7 @@ describe ActiveInteraction::StringFilter, :filter do | |
| 54 54 |  | 
| 55 55 | 
             
              describe '#database_column_type' do
         | 
| 56 56 | 
             
                it 'returns :string' do
         | 
| 57 | 
            -
                  expect(filter.database_column_type).to  | 
| 57 | 
            +
                  expect(filter.database_column_type).to be :string
         | 
| 58 58 | 
             
                end
         | 
| 59 59 | 
             
              end
         | 
| 60 60 | 
             
            end
         | 
| @@ -4,14 +4,14 @@ describe ActiveInteraction::SymbolFilter, :filter do | |
| 4 4 | 
             
              include_context 'filters'
         | 
| 5 5 | 
             
              it_behaves_like 'a filter'
         | 
| 6 6 |  | 
| 7 | 
            -
              describe '# | 
| 8 | 
            -
                let(:result) { filter. | 
| 7 | 
            +
              describe '#process' do
         | 
| 8 | 
            +
                let(:result) { filter.process(value, nil) }
         | 
| 9 9 |  | 
| 10 10 | 
             
                context 'with a Symbol' do
         | 
| 11 11 | 
             
                  let(:value) { SecureRandom.hex.to_sym }
         | 
| 12 12 |  | 
| 13 13 | 
             
                  it 'returns the Symbol' do
         | 
| 14 | 
            -
                    expect(result).to eql value
         | 
| 14 | 
            +
                    expect(result.value).to eql value
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 | 
             
                end
         | 
| 17 17 |  | 
| @@ -25,7 +25,7 @@ describe ActiveInteraction::SymbolFilter, :filter do | |
| 25 25 | 
             
                  end
         | 
| 26 26 |  | 
| 27 27 | 
             
                  it 'returns a symbol' do
         | 
| 28 | 
            -
                    expect(result).to eql value.to_sym
         | 
| 28 | 
            +
                    expect(result.value).to eql value.to_sym
         | 
| 29 29 | 
             
                  end
         | 
| 30 30 | 
             
                end
         | 
| 31 31 |  | 
| @@ -33,14 +33,14 @@ describe ActiveInteraction::SymbolFilter, :filter do | |
| 33 33 | 
             
                  let(:value) { SecureRandom.hex }
         | 
| 34 34 |  | 
| 35 35 | 
             
                  it 'returns a Symbol' do
         | 
| 36 | 
            -
                    expect(result).to eql value.to_sym
         | 
| 36 | 
            +
                    expect(result.value).to eql value.to_sym
         | 
| 37 37 | 
             
                  end
         | 
| 38 38 | 
             
                end
         | 
| 39 39 | 
             
              end
         | 
| 40 40 |  | 
| 41 41 | 
             
              describe '#database_column_type' do
         | 
| 42 42 | 
             
                it 'returns :string' do
         | 
| 43 | 
            -
                  expect(filter.database_column_type).to  | 
| 43 | 
            +
                  expect(filter.database_column_type).to be :string
         | 
| 44 44 | 
             
                end
         | 
| 45 45 | 
             
              end
         | 
| 46 46 | 
             
            end
         |