active_storage_validations 1.1.3 → 1.2.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/README.md +133 -69
- data/config/locales/da.yml +33 -0
- data/config/locales/de.yml +5 -0
- data/config/locales/en.yml +5 -0
- data/config/locales/es.yml +5 -0
- data/config/locales/fr.yml +5 -0
- data/config/locales/it.yml +5 -0
- data/config/locales/ja.yml +5 -0
- data/config/locales/nl.yml +5 -0
- data/config/locales/pl.yml +5 -0
- data/config/locales/pt-BR.yml +5 -0
- data/config/locales/ru.yml +5 -0
- data/config/locales/sv.yml +10 -1
- data/config/locales/tr.yml +5 -0
- data/config/locales/uk.yml +5 -0
- data/config/locales/vi.yml +5 -0
- data/config/locales/zh-CN.yml +5 -0
- data/lib/active_storage_validations/aspect_ratio_validator.rb +47 -22
- data/lib/active_storage_validations/attached_validator.rb +12 -3
- data/lib/active_storage_validations/base_size_validator.rb +66 -0
- data/lib/active_storage_validations/concerns/errorable.rb +38 -0
- data/lib/active_storage_validations/concerns/symbolizable.rb +8 -6
- data/lib/active_storage_validations/content_type_validator.rb +41 -6
- data/lib/active_storage_validations/dimension_validator.rb +15 -15
- data/lib/active_storage_validations/limit_validator.rb +44 -7
- data/lib/active_storage_validations/matchers/aspect_ratio_validator_matcher.rb +119 -0
- data/lib/active_storage_validations/matchers/attached_validator_matcher.rb +25 -36
- data/lib/active_storage_validations/matchers/base_size_validator_matcher.rb +134 -0
- data/lib/active_storage_validations/matchers/concerns/active_storageable.rb +17 -0
- data/lib/active_storage_validations/matchers/concerns/allow_blankable.rb +26 -0
- data/lib/active_storage_validations/matchers/concerns/attachable.rb +48 -0
- data/lib/active_storage_validations/matchers/concerns/contextable.rb +47 -0
- data/lib/active_storage_validations/matchers/concerns/messageable.rb +26 -0
- data/lib/active_storage_validations/matchers/concerns/rspecable.rb +25 -0
- data/lib/active_storage_validations/matchers/concerns/validatable.rb +11 -10
- data/lib/active_storage_validations/matchers/content_type_validator_matcher.rb +44 -27
- data/lib/active_storage_validations/matchers/dimension_validator_matcher.rb +67 -59
- data/lib/active_storage_validations/matchers/processable_image_validator_matcher.rb +78 -0
- data/lib/active_storage_validations/matchers/size_validator_matcher.rb +8 -126
- data/lib/active_storage_validations/matchers/total_size_validator_matcher.rb +40 -0
- data/lib/active_storage_validations/matchers.rb +3 -0
- data/lib/active_storage_validations/metadata.rb +60 -28
- data/lib/active_storage_validations/processable_image_validator.rb +14 -5
- data/lib/active_storage_validations/size_validator.rb +7 -51
- data/lib/active_storage_validations/total_size_validator.rb +49 -0
- data/lib/active_storage_validations/version.rb +1 -1
- data/lib/active_storage_validations.rb +3 -2
- metadata +38 -39
- data/lib/active_storage_validations/error_handler.rb +0 -21
@@ -1,22 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'concerns/errorable.rb'
|
3
4
|
require_relative 'concerns/symbolizable.rb'
|
5
|
+
require_relative 'base_size_validator.rb'
|
4
6
|
|
5
7
|
module ActiveStorageValidations
|
6
|
-
class SizeValidator <
|
7
|
-
include OptionProcUnfolding
|
8
|
-
include ErrorHandler
|
9
|
-
include Symbolizable
|
10
|
-
|
11
|
-
delegate :number_to_human_size, to: ActiveSupport::NumberHelper
|
12
|
-
|
13
|
-
AVAILABLE_CHECKS = %i[
|
14
|
-
less_than
|
15
|
-
less_than_or_equal_to
|
16
|
-
greater_than
|
17
|
-
greater_than_or_equal_to
|
18
|
-
between
|
19
|
-
].freeze
|
8
|
+
class SizeValidator < BaseSizeValidator
|
20
9
|
ERROR_TYPES = %i[
|
21
10
|
file_size_not_less_than
|
22
11
|
file_size_not_less_than_or_equal_to
|
@@ -25,28 +14,19 @@ module ActiveStorageValidations
|
|
25
14
|
file_size_not_between
|
26
15
|
].freeze
|
27
16
|
|
28
|
-
def check_validity!
|
29
|
-
unless AVAILABLE_CHECKS.one? { |argument| options.key?(argument) }
|
30
|
-
raise ArgumentError, 'You must pass either :less_than(_or_equal_to), :greater_than(_or_equal_to), or :between to the validator'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
17
|
def validate_each(record, attribute, _value)
|
35
|
-
# only attached
|
36
18
|
return true unless record.send(attribute).attached?
|
37
19
|
|
38
20
|
files = Array.wrap(record.send(attribute))
|
39
|
-
|
40
|
-
errors_options = initialize_error_options(options)
|
41
|
-
|
42
21
|
flat_options = unfold_procs(record, self.options, AVAILABLE_CHECKS)
|
43
22
|
|
44
23
|
files.each do |file|
|
45
|
-
next if
|
24
|
+
next if is_valid?(file.blob.byte_size, flat_options)
|
46
25
|
|
26
|
+
errors_options = initialize_error_options(options, file)
|
27
|
+
populate_error_options(errors_options, flat_options)
|
47
28
|
errors_options[:file_size] = number_to_human_size(file.blob.byte_size)
|
48
|
-
|
49
|
-
errors_options[:max_size] = number_to_human_size(max_size(flat_options))
|
29
|
+
|
50
30
|
keys = AVAILABLE_CHECKS & flat_options.keys
|
51
31
|
error_type = "file_size_not_#{keys.first}".to_sym
|
52
32
|
|
@@ -54,29 +34,5 @@ module ActiveStorageValidations
|
|
54
34
|
break
|
55
35
|
end
|
56
36
|
end
|
57
|
-
|
58
|
-
def content_size_valid?(file_size, flat_options)
|
59
|
-
return false if file_size < 0
|
60
|
-
|
61
|
-
if flat_options[:between].present?
|
62
|
-
flat_options[:between].include?(file_size)
|
63
|
-
elsif flat_options[:less_than].present?
|
64
|
-
file_size < flat_options[:less_than]
|
65
|
-
elsif flat_options[:less_than_or_equal_to].present?
|
66
|
-
file_size <= flat_options[:less_than_or_equal_to]
|
67
|
-
elsif flat_options[:greater_than].present?
|
68
|
-
file_size > flat_options[:greater_than]
|
69
|
-
elsif flat_options[:greater_than_or_equal_to].present?
|
70
|
-
file_size >= flat_options[:greater_than_or_equal_to]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def min_size(flat_options)
|
75
|
-
flat_options[:between]&.min || flat_options[:greater_than] || flat_options[:greater_than_or_equal_to]
|
76
|
-
end
|
77
|
-
|
78
|
-
def max_size(flat_options)
|
79
|
-
flat_options[:between]&.max || flat_options[:less_than] || flat_options[:less_than_or_equal_to]
|
80
|
-
end
|
81
37
|
end
|
82
38
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'concerns/errorable.rb'
|
4
|
+
require_relative 'concerns/symbolizable.rb'
|
5
|
+
require_relative 'base_size_validator.rb'
|
6
|
+
|
7
|
+
module ActiveStorageValidations
|
8
|
+
class TotalSizeValidator < BaseSizeValidator
|
9
|
+
ERROR_TYPES = %i[
|
10
|
+
total_file_size_not_less_than
|
11
|
+
total_file_size_not_less_than_or_equal_to
|
12
|
+
total_file_size_not_greater_than
|
13
|
+
total_file_size_not_greater_than_or_equal_to
|
14
|
+
total_file_size_not_between
|
15
|
+
].freeze
|
16
|
+
|
17
|
+
def validate_each(record, attribute, _value)
|
18
|
+
custom_check_validity!(record, attribute)
|
19
|
+
|
20
|
+
return true unless record.send(attribute).attached?
|
21
|
+
|
22
|
+
files = Array.wrap(record.send(attribute))
|
23
|
+
flat_options = unfold_procs(record, self.options, AVAILABLE_CHECKS)
|
24
|
+
|
25
|
+
total_file_size = files.sum { |file| file.blob.byte_size }
|
26
|
+
|
27
|
+
return true if is_valid?(total_file_size, flat_options)
|
28
|
+
|
29
|
+
errors_options = initialize_error_options(options, nil)
|
30
|
+
populate_error_options(errors_options, flat_options)
|
31
|
+
errors_options[:total_file_size] = number_to_human_size(total_file_size)
|
32
|
+
|
33
|
+
keys = AVAILABLE_CHECKS & flat_options.keys
|
34
|
+
error_type = "total_file_size_not_#{keys.first}".to_sym
|
35
|
+
|
36
|
+
add_error(record, attribute, error_type, **errors_options)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def custom_check_validity!(record, attribute)
|
42
|
+
# We can't perform this check in the #check_validity! hook because we do not
|
43
|
+
# have enough data (only options & attributes are accessible)
|
44
|
+
unless record.send(attribute).is_a?(ActiveStorage::Attached::Many)
|
45
|
+
raise ArgumentError, 'This validator is only available for has_many_attached relations'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_model'
|
4
|
+
require 'active_support/concern'
|
4
5
|
|
5
6
|
require 'active_storage_validations/railtie'
|
6
7
|
require 'active_storage_validations/engine'
|
7
8
|
require 'active_storage_validations/option_proc_unfolding'
|
8
|
-
require 'active_storage_validations/error_handler'
|
9
9
|
require 'active_storage_validations/attached_validator'
|
10
10
|
require 'active_storage_validations/content_type_validator'
|
11
|
-
require 'active_storage_validations/size_validator'
|
12
11
|
require 'active_storage_validations/limit_validator'
|
13
12
|
require 'active_storage_validations/dimension_validator'
|
14
13
|
require 'active_storage_validations/aspect_ratio_validator'
|
15
14
|
require 'active_storage_validations/processable_image_validator'
|
15
|
+
require 'active_storage_validations/size_validator'
|
16
|
+
require 'active_storage_validations/total_size_validator'
|
16
17
|
|
17
18
|
ActiveSupport.on_load(:active_record) do
|
18
19
|
send :include, ActiveStorageValidations
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_storage_validations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Kasyanchuk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activejob
|
@@ -66,20 +66,6 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 5.2.0
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: minitest-focus
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.4'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.4'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: combustion
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,49 +81,49 @@ dependencies:
|
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: '1.3'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
84
|
+
name: marcel
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
87
|
- - ">="
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
89
|
+
version: '0'
|
104
90
|
type: :development
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
94
|
- - ">="
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
96
|
+
version: '0'
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
98
|
+
name: mini_magick
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
100
|
requirements:
|
115
101
|
- - ">="
|
116
102
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
103
|
+
version: 4.9.5
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
107
|
requirements:
|
122
108
|
- - ">="
|
123
109
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
110
|
+
version: 4.9.5
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
112
|
+
name: minitest-focus
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
128
114
|
requirements:
|
129
|
-
- - "
|
115
|
+
- - "~>"
|
130
116
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
117
|
+
version: '1.4'
|
132
118
|
type: :development
|
133
119
|
prerelease: false
|
134
120
|
version_requirements: !ruby/object:Gem::Requirement
|
135
121
|
requirements:
|
136
|
-
- - "
|
122
|
+
- - "~>"
|
137
123
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
124
|
+
version: '1.4'
|
139
125
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
126
|
+
name: pry
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
142
128
|
requirements:
|
143
129
|
- - ">="
|
@@ -151,21 +137,21 @@ dependencies:
|
|
151
137
|
- !ruby/object:Gem::Version
|
152
138
|
version: '0'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
140
|
+
name: ruby-vips
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
156
142
|
requirements:
|
157
143
|
- - ">="
|
158
144
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
145
|
+
version: 2.1.0
|
160
146
|
type: :development
|
161
147
|
prerelease: false
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
163
149
|
requirements:
|
164
150
|
- - ">="
|
165
151
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
152
|
+
version: 2.1.0
|
167
153
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
154
|
+
name: simplecov
|
169
155
|
requirement: !ruby/object:Gem::Requirement
|
170
156
|
requirements:
|
171
157
|
- - ">="
|
@@ -179,7 +165,7 @@ dependencies:
|
|
179
165
|
- !ruby/object:Gem::Version
|
180
166
|
version: '0'
|
181
167
|
- !ruby/object:Gem::Dependency
|
182
|
-
name:
|
168
|
+
name: sqlite3
|
183
169
|
requirement: !ruby/object:Gem::Requirement
|
184
170
|
requirements:
|
185
171
|
- - ">="
|
@@ -193,19 +179,19 @@ dependencies:
|
|
193
179
|
- !ruby/object:Gem::Version
|
194
180
|
version: '0'
|
195
181
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
182
|
+
name: webmock
|
197
183
|
requirement: !ruby/object:Gem::Requirement
|
198
184
|
requirements:
|
199
185
|
- - ">="
|
200
186
|
- !ruby/object:Gem::Version
|
201
|
-
version: '
|
187
|
+
version: '3'
|
202
188
|
type: :development
|
203
189
|
prerelease: false
|
204
190
|
version_requirements: !ruby/object:Gem::Requirement
|
205
191
|
requirements:
|
206
192
|
- - ">="
|
207
193
|
- !ruby/object:Gem::Version
|
208
|
-
version: '
|
194
|
+
version: '3'
|
209
195
|
description: Validations for Active Storage (presence)
|
210
196
|
email:
|
211
197
|
- igorkasyanchuk@gmail.com
|
@@ -216,6 +202,7 @@ files:
|
|
216
202
|
- MIT-LICENSE
|
217
203
|
- README.md
|
218
204
|
- Rakefile
|
205
|
+
- config/locales/da.yml
|
219
206
|
- config/locales/de.yml
|
220
207
|
- config/locales/en.yml
|
221
208
|
- config/locales/es.yml
|
@@ -234,23 +221,35 @@ files:
|
|
234
221
|
- lib/active_storage_validations.rb
|
235
222
|
- lib/active_storage_validations/aspect_ratio_validator.rb
|
236
223
|
- lib/active_storage_validations/attached_validator.rb
|
224
|
+
- lib/active_storage_validations/base_size_validator.rb
|
225
|
+
- lib/active_storage_validations/concerns/errorable.rb
|
237
226
|
- lib/active_storage_validations/concerns/symbolizable.rb
|
238
227
|
- lib/active_storage_validations/content_type_validator.rb
|
239
228
|
- lib/active_storage_validations/dimension_validator.rb
|
240
229
|
- lib/active_storage_validations/engine.rb
|
241
|
-
- lib/active_storage_validations/error_handler.rb
|
242
230
|
- lib/active_storage_validations/limit_validator.rb
|
243
231
|
- lib/active_storage_validations/matchers.rb
|
232
|
+
- lib/active_storage_validations/matchers/aspect_ratio_validator_matcher.rb
|
244
233
|
- lib/active_storage_validations/matchers/attached_validator_matcher.rb
|
234
|
+
- lib/active_storage_validations/matchers/base_size_validator_matcher.rb
|
235
|
+
- lib/active_storage_validations/matchers/concerns/active_storageable.rb
|
236
|
+
- lib/active_storage_validations/matchers/concerns/allow_blankable.rb
|
237
|
+
- lib/active_storage_validations/matchers/concerns/attachable.rb
|
238
|
+
- lib/active_storage_validations/matchers/concerns/contextable.rb
|
239
|
+
- lib/active_storage_validations/matchers/concerns/messageable.rb
|
240
|
+
- lib/active_storage_validations/matchers/concerns/rspecable.rb
|
245
241
|
- lib/active_storage_validations/matchers/concerns/validatable.rb
|
246
242
|
- lib/active_storage_validations/matchers/content_type_validator_matcher.rb
|
247
243
|
- lib/active_storage_validations/matchers/dimension_validator_matcher.rb
|
244
|
+
- lib/active_storage_validations/matchers/processable_image_validator_matcher.rb
|
248
245
|
- lib/active_storage_validations/matchers/size_validator_matcher.rb
|
246
|
+
- lib/active_storage_validations/matchers/total_size_validator_matcher.rb
|
249
247
|
- lib/active_storage_validations/metadata.rb
|
250
248
|
- lib/active_storage_validations/option_proc_unfolding.rb
|
251
249
|
- lib/active_storage_validations/processable_image_validator.rb
|
252
250
|
- lib/active_storage_validations/railtie.rb
|
253
251
|
- lib/active_storage_validations/size_validator.rb
|
252
|
+
- lib/active_storage_validations/total_size_validator.rb
|
254
253
|
- lib/active_storage_validations/version.rb
|
255
254
|
- lib/tasks/active_storage_validations_tasks.rake
|
256
255
|
homepage: https://github.com/igorkasyanchuk/active_storage_validations
|
@@ -266,14 +265,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
266
265
|
requirements:
|
267
266
|
- - ">="
|
268
267
|
- !ruby/object:Gem::Version
|
269
|
-
version:
|
268
|
+
version: 2.5.0
|
270
269
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
271
270
|
requirements:
|
272
271
|
- - ">="
|
273
272
|
- !ruby/object:Gem::Version
|
274
273
|
version: '0'
|
275
274
|
requirements: []
|
276
|
-
rubygems_version: 3.
|
275
|
+
rubygems_version: 3.5.11
|
277
276
|
signing_key:
|
278
277
|
specification_version: 4
|
279
278
|
summary: Validations for Active Storage
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module ActiveStorageValidations
|
2
|
-
module ErrorHandler
|
3
|
-
|
4
|
-
def initialize_error_options(options)
|
5
|
-
{
|
6
|
-
validator_type: self.class.to_sym,
|
7
|
-
custom_message: (options[:message] if options[:message].present?)
|
8
|
-
}.compact
|
9
|
-
end
|
10
|
-
|
11
|
-
def add_error(record, attribute, error_type, **errors_options)
|
12
|
-
type = errors_options[:custom_message].presence || error_type
|
13
|
-
return if record.errors.added?(attribute, type)
|
14
|
-
|
15
|
-
# You can read https://api.rubyonrails.org/classes/ActiveModel/Errors.html#method-i-add
|
16
|
-
# to better understand how Rails model errors work
|
17
|
-
record.errors.add(attribute, type, **errors_options)
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|