active_interaction-extras 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c3637e9bc034e39019c7a5273730c9c66e39257fcb7006f8cb153318c2345acf
4
- data.tar.gz: 51d7d883e0cfab7d0eae0f15b764f2b9e3f0868372cc4329fe47785014669e98
3
+ metadata.gz: 355913c4e3805b1373112d39fe9e686d6f1ae8b1cd7f2bca289443fd0cd37f63
4
+ data.tar.gz: f0e1a1611ca60b7199db6e18dc8152aa36fa76dde81cacfba1a6290a143ae544
5
5
  SHA512:
6
- metadata.gz: 798047a1473aec22f030540ee4af4f7d074c7372cde93b9ceedcec996cc368d88c2e48743f7a0868da2029549f1e155c70037be36e252e7b5877caf64268bbbb
7
- data.tar.gz: 38890669f04e15239b5ace15841dbb39e2a048eb9881ce127d80ad5b33126396417b5be918d8bef7a8b5a67bb1973fde82e2378baa0ce8b8dc00973d44546558
6
+ metadata.gz: 256a1e71cd64571c76418ab9a4688d827ca2f98d589610af9445ea084ef018646a28ad095b32df776163530a6c544c85d9a22e9732aaa8de85829d47c841306f
7
+ data.tar.gz: 38cea9d7580d1c9966b9f4b70168e10cd8f7f8548605d040f4ded80ee70040032f6e9bbca9c6ed1b22f2896ed9056192a7df003eac1e6dd299a5cfcbeafbfffe
@@ -19,7 +19,7 @@ jobs:
19
19
  runs-on: ubuntu-latest
20
20
  strategy:
21
21
  matrix:
22
- ruby-version: ['2.6', '2.7', '3.0']
22
+ ruby-version: ['2.7', '3.0', '3.1', '3.2']
23
23
 
24
24
  steps:
25
25
  - uses: actions/checkout@v2
@@ -27,7 +27,7 @@ jobs:
27
27
  # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
28
  # change this to (see https://github.com/ruby/setup-ruby#versioning):
29
29
  # uses: ruby/setup-ruby@v1
30
- uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
30
+ uses: ruby/setup-ruby@v1
31
31
  with:
32
32
  ruby-version: ${{ matrix.ruby-version }}
33
33
  bundler-cache: true # runs 'bundle install' and caches installed gems automatically
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  Gemfile.lock
10
+ .ruby-version
data/CHANGELOG.md CHANGED
@@ -4,6 +4,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.0.4] - 2022-06-08
8
+
9
+ - Improve halt's robustness (https://github.com/antulik/active_interaction-extras/pull/13)
10
+
7
11
  ## [1.0.3] - 2021-07-11
8
12
 
9
13
  - Loosen the gem requirements
@@ -17,6 +17,8 @@ Gem::Specification.new do |spec|
17
17
  "changelog_uri" => "https://github.com/antulik/active_interaction-extras/blob/master/CHANGELOG.md",
18
18
  }
19
19
 
20
+ spec.required_ruby_version = '>= 2.7'
21
+
20
22
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
21
23
  f.match(%r{^(test|spec|features)/})
22
24
  end
@@ -24,7 +26,7 @@ Gem::Specification.new do |spec|
24
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
27
  spec.require_paths = ["lib"]
26
28
 
27
- spec.add_dependency "active_interaction", ">= 4.0.2"
29
+ spec.add_dependency "active_interaction", ">= 5.0", "< 6.0"
28
30
  spec.add_dependency "activemodel", ">= 6.0"
29
31
  spec.add_dependency "activesupport", ">= 6.0"
30
32
 
@@ -34,4 +36,6 @@ Gem::Specification.new do |spec|
34
36
  spec.add_development_dependency "pry"
35
37
  spec.add_development_dependency "sqlite3"
36
38
  spec.add_development_dependency "activerecord"
39
+ spec.add_development_dependency "activejob"
40
+ spec.add_development_dependency "actionpack"
37
41
  end
@@ -29,6 +29,8 @@ module ActiveInteraction::Extras::FilterExtensions::ObjectClasses
29
29
 
30
30
  def matches?(value)
31
31
  if polymorphic?
32
+ return false if value == nil
33
+
32
34
  class_list.any? { |klass| value.class <= klass }
33
35
  else
34
36
  super
@@ -3,7 +3,14 @@
3
3
  class ActiveInteraction::Extras::Filters::AnythingFilter < ActiveInteraction::Filter
4
4
  register :anything
5
5
 
6
- def matches?(_object)
7
- true
6
+ def matches?(value)
7
+ if value == nil && default?
8
+ # as per v5 there is no way to know if value of `nil` is given by caller or
9
+ # is a default value when it's missing. We want to maintain standard default
10
+ # behaviour when value is `nil`. Returning `false` will trigger default value
11
+ false
12
+ else
13
+ true
14
+ end
8
15
  end
9
16
  end
@@ -10,6 +10,11 @@ class ActiveInteraction::Extras::Filters::UUIDFilter < ActiveInteraction::String
10
10
  end
11
11
 
12
12
  def convert(value)
13
- super&.presence
13
+ value, error = super
14
+ if error
15
+ [value, error]
16
+ else
17
+ [value&.presence, nil]
18
+ end
14
19
  end
15
20
  end
@@ -1,16 +1,19 @@
1
1
  module ActiveInteraction::Extras::Halt
2
2
  extend ActiveSupport::Concern
3
3
 
4
+ THROW_OBJECT = Object.new.freeze
5
+ private_constant :THROW_OBJECT
6
+
4
7
  included do
5
8
  set_callback :execute, :around, lambda { |_interaction, block|
6
- catch :strict_error do
9
+ catch THROW_OBJECT do
7
10
  block.call
8
11
  end
9
12
  }
10
13
  end
11
14
 
12
15
  def halt!
13
- throw :strict_error, errors
16
+ throw THROW_OBJECT, errors
14
17
  end
15
18
 
16
19
  def halt_if_errors!
@@ -1,10 +1,14 @@
1
+ require "active_support/core_ext/object/with_options"
2
+
1
3
  module ActiveInteraction::Extras::ModelFields
2
4
  extend ActiveSupport::Concern
3
5
 
4
6
  # returns hash of all model fields and their values
5
7
  def model_fields(model_name)
6
8
  fields = self.class.model_field_cache[model_name]
7
- inputs.slice(*fields)
9
+ fields.to_h do |field|
10
+ [field, public_send(field)]
11
+ end
8
12
  end
9
13
 
10
14
  # returns hash of only changed model fields and their values
@@ -17,7 +21,7 @@ module ActiveInteraction::Extras::ModelFields
17
21
  # returns hash of only given model fields and their values
18
22
  def given_model_fields(model_name)
19
23
  model_fields(model_name).select do |field, _value|
20
- given?(field)
24
+ inputs.given?(field)
21
25
  end
22
26
  end
23
27
 
@@ -63,22 +67,23 @@ module ActiveInteraction::Extras::ModelFields
63
67
  value_changed = send(model_field).send(field) != send(field)
64
68
  end
65
69
 
66
- given?(field) && value_changed
70
+ inputs.given?(field) && value_changed
67
71
  end
68
72
  end
69
73
 
70
74
  # overwritten to pre-populate model fields
71
- def populate_filters_and_inputs(_inputs)
72
- super.tap do
73
- self.class.filters.each do |name, filter|
74
- next if given?(name)
75
+ def initialize(...)
76
+ super
75
77
 
76
- model_field = self.class.model_field_cache_inverse[name]
77
- next if model_field.nil?
78
+ self.class.filters.each do |name, filter|
79
+ next if inputs.given?(name)
78
80
 
79
- value = public_send(model_field)&.public_send(name)
80
- public_send("#{name}=", filter.clean(value, self))
81
- end
81
+ model_field = self.class.model_field_cache_inverse[name]
82
+ next if model_field.nil?
83
+
84
+ value = public_send(model_field)&.public_send(name)
85
+ input = filter.process(value, self)
86
+ public_send("#{name}=", input.value)
82
87
  end
83
88
  end
84
89
 
@@ -5,6 +5,8 @@ module ActiveInteraction::Extras::StrongParams
5
5
  # TODO: whitelist :params and :form_params, so they could not be used as filters
6
6
  return super if self.class.filters.key?(:params) || self.class.filters.key?(:form_params)
7
7
 
8
+ return super if %i[fetch key? merge].any? { |m| !inputs.respond_to?(m) }
9
+
8
10
  if inputs.key?(:params) && inputs.key?(:form_params)
9
11
  raise ArgumentError, 'Both options :params and :form_params are given. ' \
10
12
  'One or none are accepted.'
@@ -1,5 +1,5 @@
1
1
  module ActiveInteraction
2
2
  module Extras
3
- VERSION = "1.0.3"
3
+ VERSION = "1.1.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_interaction-extras
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Katunin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-11 00:00:00.000000000 Z
11
+ date: 2023-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_interaction
@@ -16,14 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.2
19
+ version: '5.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: 4.0.2
29
+ version: '5.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: activemodel
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +142,34 @@ dependencies:
136
142
  - - ">="
137
143
  - !ruby/object:Gem::Version
138
144
  version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: activejob
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: actionpack
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
139
173
  description: Extensions for active_interaction gem
140
174
  email:
141
175
  - antulik@gmail.com
@@ -188,14 +222,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
188
222
  requirements:
189
223
  - - ">="
190
224
  - !ruby/object:Gem::Version
191
- version: '0'
225
+ version: '2.7'
192
226
  required_rubygems_version: !ruby/object:Gem::Requirement
193
227
  requirements:
194
228
  - - ">="
195
229
  - !ruby/object:Gem::Version
196
230
  version: '0'
197
231
  requirements: []
198
- rubygems_version: 3.1.4
232
+ rubygems_version: 3.3.26
199
233
  signing_key:
200
234
  specification_version: 4
201
235
  summary: Extensions for active_interaction gem