active_storage_validations 0.9.2 → 0.9.6

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: 6e8b30d036f53b6e00b209c9fe9a34339ff23aa35b789da9585df7fee6c8dfad
4
- data.tar.gz: 0655072452aa29e24bcea5abb01e6b72bf6ddee6f2646d92eb8b13dbaeff128f
3
+ metadata.gz: 52bbd6249bbadd7549ccd7daf17673e98ccfd757b15ec954b67c5d7ce3395c84
4
+ data.tar.gz: cf3664efb821cd7fe60b0536e0d394f900af6fb128161ab13d62d373b2018013
5
5
  SHA512:
6
- metadata.gz: 8df0893d2048e22d55660f590a747d55b2fff2595bae0f7da8b9151079d2c87e7d09a5e3059529a9fd9ef1231e44b4e9c610d3d22c9da5bfc8e49eb3aa0d25ca
7
- data.tar.gz: a55c3ba3ff97b5478061fc8a8307127231dbbbb64f49fdcaccea85e6c896e48e777b30e09c97d44b9d84d61b8b5c4ef6abdb843171120b1ae739b38ebf916fb2
6
+ metadata.gz: bece2608d56156a83e468ffaf4ed31dead1769882457c1ff8480586ce0335122b475084f24f914d4d8083c5b4f2b891bda7465b25b2d34272ba76631c313167f
7
+ data.tar.gz: 56a1cbb1bd5bddc4cce887405eecd6d5e27cc9bfcdca97e636ccf43cf98ce29d9077e1b3e7a602dcb229cd24d25125024c4d83beba6f82050edc773b32d21ca4
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Active Storage Validations
2
2
 
3
+ [![MiniTest](https://github.com/igorkasyanchuk/active_storage_validations/workflows/MiniTest/badge.svg)](https://github.com/igorkasyanchuk/active_storage_validations/actions)
4
+ [![RailsJazz](https://github.com/igorkasyanchuk/rails_time_travel/blob/main/docs/my_other.svg?raw=true)](https://www.railsjazz.com)
5
+ [![https://www.patreon.com/igorkasyanchuk](https://github.com/igorkasyanchuk/rails_time_travel/blob/main/docs/patron.svg?raw=true)](https://www.patreon.com/igorkasyanchuk)
6
+
3
7
  If you are using `active_storage` gem and you want to add simple validations for it, like presence or content_type you need to write a custom validation method.
4
8
 
5
9
  This gems doing it for you. Just use `attached: true` or `content_type: 'image/png'` validation.
@@ -54,14 +58,15 @@ end
54
58
 
55
59
  ### More examples
56
60
 
57
- - Content type validation using symbols. In order to infer the correct mime type from the symbol, the types must be registered with `Mime::Type`.
61
+ - Content type validation using symbols. In order to infer the correct mime type from the symbol, the types must be registered with `Marcel::EXTENSIONS` (`MimeMagic::EXTENSIONS` for Rails <= 6.1.3).
58
62
 
59
63
  ```ruby
60
64
  class User < ApplicationRecord
61
65
  has_one_attached :avatar
62
66
  has_many_attached :photos
63
67
 
64
- validates :avatar, attached: true, content_type: :png # Mime[:png].to_s => 'image/png'
68
+ validates :avatar, attached: true, content_type: :png # Marcel::Magic.by_extension(:png).to_s => 'image/png'
69
+ # Rails <= 6.1.3; MimeMagic.by_extension(:png).to_s => 'image/png'
65
70
  # or
66
71
  validates :photos, attached: true, content_type: [:png, :jpg, :jpeg]
67
72
  # or
@@ -216,6 +221,7 @@ describe User do
216
221
 
217
222
  it { is_expected.to validate_dimensions_of(:avatar).width(250) }
218
223
  it { is_expected.to validate_dimensions_of(:avatar).height(200) }
224
+ it { is_expected.to validate_dimensions_of(:avatar).width(250).height(200).with_message('Invalid dimensions.') }
219
225
  it { is_expected.to validate_dimensions_of(:avatar).width_min(200) }
220
226
  it { is_expected.to validate_dimensions_of(:avatar).width_max(500) }
221
227
  it { is_expected.to validate_dimensions_of(:avatar).height_min(100) }
@@ -257,6 +263,7 @@ class UserTest < ActiveSupport::TestCase
257
263
 
258
264
  should validate_dimensions_of(:avatar).width(250)
259
265
  should validate_dimensions_of(:avatar).height(200)
266
+ should validate_dimensions_of(:avatar).width(250).height(200).with_message('Invalid dimensions.')
260
267
  should validate_dimensions_of(:avatar).width_min(200)
261
268
  should validate_dimensions_of(:avatar).width_max(500)
262
269
  should validate_dimensions_of(:avatar).height_min(100)
@@ -286,6 +293,20 @@ To run tests in root folder of gem:
286
293
  * `BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle exec rake test` to run for Rails 5.2
287
294
  * `BUNDLE_GEMFILE=gemfiles/rails_6_0.gemfile bundle exec rake test` to run for Rails 6.0
288
295
  * `BUNDLE_GEMFILE=gemfiles/rails_6_1.gemfile bundle exec rake test` to run for Rails 6.1
296
+ * `BUNDLE_GEMFILE=gemfiles/rails_next.gemfile bundle exec rake test` to run for Rails main branch
297
+
298
+ Snippet to run in console:
299
+
300
+ ```
301
+ BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle
302
+ BUNDLE_GEMFILE=gemfiles/rails_6_0.gemfile bundle
303
+ BUNDLE_GEMFILE=gemfiles/rails_6_1.gemfile bundle
304
+ BUNDLE_GEMFILE=gemfiles/rails_next.gemfile bundle
305
+ BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle exec rake test
306
+ BUNDLE_GEMFILE=gemfiles/rails_6_0.gemfile bundle exec rake test
307
+ BUNDLE_GEMFILE=gemfiles/rails_6_1.gemfile bundle exec rake test
308
+ BUNDLE_GEMFILE=gemfiles/rails_next.gemfile bundle exec rake test
309
+ ```
289
310
 
290
311
  ## Known issues
291
312
 
@@ -332,7 +353,19 @@ You are welcome to contribute.
332
353
  - https://github.com/molfar
333
354
  - https://github.com/connorshea
334
355
  - https://github.com/yshmarov
356
+ - https://github.com/fongfan999
357
+ - https://github.com/cooperka
358
+ - https://github.com/dolarsrg
359
+ - https://github.com/jayshepherd
360
+ - https://github.com/ohbarye
361
+ - https://github.com/randsina
362
+ - https://github.com/vietqhoang
363
+ - https://github.com/kemenaran
364
+ - https://github.com/jrmhaig
335
365
 
336
366
  ## License
337
367
 
338
368
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
369
+
370
+ [<img src="https://github.com/igorkasyanchuk/rails_time_travel/blob/main/docs/more_gems.png?raw=true"
371
+ />](https://www.railsjazz.com/)
@@ -15,3 +15,8 @@ de:
15
15
  dimension_height_less_than_or_equal_to: "Höhe muss kleiner oder gleich %{length} Pixel sein"
16
16
  dimension_width_equal_to: "Bildbreite muss genau %{length} Pixel sein"
17
17
  dimension_height_equal_to: "Bildhöhe muss genau %{length} Pixel sein"
18
+ aspect_ratio_not_square: "muss quadratisch sein"
19
+ aspect_ratio_not_portrait: "muss Hochformat sein"
20
+ aspect_ratio_not_landscape: "muss Querformat sein"
21
+ aspect_ratio_is_not: "muss ein Bildseitenverhältnis von %{aspect_ratio} haben"
22
+ aspect_ratio_unknown: "hat ein unbekanntes Bildseitenverhältnis"
File without changes
@@ -16,7 +16,7 @@ es:
16
16
  dimension_width_equal_to: "el ancho debe ser igual a %{length} pixel"
17
17
  dimension_height_equal_to: "la altura debe ser igual a %{length} pixel"
18
18
  aspect_ratio_not_square: "debe ser una imagen cuadrada"
19
- aspect_ratio_not_portrait: "debe ser una imagen de retrato"
20
- aspect_ratio_not_landscape: "debe ser una imagen de paisaje"
19
+ aspect_ratio_not_portrait: "debe ser una imagen vertical"
20
+ aspect_ratio_not_landscape: "debe ser una imagen apaisada"
21
21
  aspect_ratio_is_not: "debe tener una relación de aspecto de %{aspect_ratio}"
22
22
  aspect_ratio_unknown: "tiene una relación de aspecto desconocida"
@@ -0,0 +1,22 @@
1
+ it:
2
+ errors:
3
+ messages:
4
+ content_type_invalid: "ha un tipo di contenuto non valido"
5
+ file_size_out_of_range: "la dimensione del file %{file_size} non è compresa nell’intervallo consentito"
6
+ limit_out_of_range: "il valore è al di fuori dell’intervallo consentito"
7
+ image_metadata_missing: "non è un'immagine valida"
8
+ dimension_min_inclusion: "deve essere maggiore o uguale a %{width} x %{height} pixel"
9
+ dimension_max_inclusion: "deve essere minore o uguale a %{width} x %{height} pixel"
10
+ dimension_width_inclusion: "la larghezza deve essere compresa tra %{min} e %{max} pixel"
11
+ dimension_height_inclusion: "l’altezza deve essere compresa tra %{min} e %{max} pixel"
12
+ dimension_width_greater_than_or_equal_to: "la larghezza deve essere maggiore o uguale a %{length} pixel"
13
+ dimension_height_greater_than_or_equal_to: "l’altezza deve essere maggiore o uguale a %{length} pixel"
14
+ dimension_width_less_than_or_equal_to: "la larghezza deve essere minore o uguale a %{length} pixel"
15
+ dimension_height_less_than_or_equal_to: "l’altezza deve essere minore o uguale a %{length} pixel"
16
+ dimension_width_equal_to: "la larghezza deve essere pari a %{length} pixel"
17
+ dimension_height_equal_to: "l’altezza deve essere pari a %{length} pixel"
18
+ aspect_ratio_not_square: "deve essere un’immagine quadrata"
19
+ aspect_ratio_not_portrait: "l’orientamento dell’immagine deve essere verticale"
20
+ aspect_ratio_not_landscape: "l’orientamento dell’immagine deve essere orizzontale"
21
+ aspect_ratio_is_not: "deve avere un rapporto altezza / larghezza di %{aspect_ratio}"
22
+ aspect_ratio_unknown: "ha un rapporto altezza / larghezza sconosciuto"
File without changes
@@ -0,0 +1,22 @@
1
+ pl:
2
+ errors:
3
+ messages:
4
+ content_type_invalid: "jest nieprawidłowego typu"
5
+ file_size_out_of_range: "rozmiar %{file_size} nie zawiera się w dopuszczalnym zakresie"
6
+ limit_out_of_range: "ilość przekracza dopuszczalny zakres"
7
+ image_metadata_missing: "nie jest prawidłowym obrazem"
8
+ dimension_min_inclusion: "musi być równe lub większe od %{width} x %{height} pixeli"
9
+ dimension_max_inclusion: "musi być równe lub mniejsze od %{width} x %{height} pixeli"
10
+ dimension_width_inclusion: "szerokość musi wynosić od %{min} do %{max} pixeli"
11
+ dimension_height_inclusion: "wysokość musi wynosić od %{min} do %{max} pixeli"
12
+ dimension_width_greater_than_or_equal_to: "szerokość musi mieć co najmniej %{length} pixeli"
13
+ dimension_height_greater_than_or_equal_to: "wysokość musi mieć co najmniej %{length} pixeli"
14
+ dimension_width_less_than_or_equal_to: "szerokość musi mieć co najwyżej %{length} pixeli"
15
+ dimension_height_less_than_or_equal_to: "wysokość musi mieć co najwyżej %{length} pixeli"
16
+ dimension_width_equal_to: "szerokość musi wynosić %{length} pixeli"
17
+ dimension_height_equal_to: "wysokość musi wynosić %{length} pixeli"
18
+ aspect_ratio_not_square: "musi mieć proporcje kwadratu"
19
+ aspect_ratio_not_portrait: "musi mieć proporcje portretu"
20
+ aspect_ratio_not_landscape: "musi mieć proporcje pejzażu"
21
+ aspect_ratio_is_not: "musi mieć proporcje %{aspect_ratio}"
22
+ aspect_ratio_unknown: "ma nieokreślone proporcje"
File without changes
File without changes
@@ -0,0 +1,22 @@
1
+ vi:
2
+ errors:
3
+ messages:
4
+ content_type_invalid: "tệp không hợp lệ"
5
+ file_size_out_of_range: "kích thước %{file_size} vượt giới hạn"
6
+ limit_out_of_range: "tổng số tệp vượt giới hạn"
7
+ image_metadata_missing: "không phải là ảnh"
8
+ dimension_min_inclusion: "phải lớn hơn hoặc bằng %{width} x %{height} pixel"
9
+ dimension_max_inclusion: "phải nhỏ hơn hoặc bằng %{width} x %{height} pixel"
10
+ dimension_width_inclusion: "chiều rộng không nằm trong %{min} và %{max} pixel"
11
+ dimension_height_inclusion: "chiều cao không nằm trong %{min} và %{max} pixel"
12
+ dimension_width_greater_than_or_equal_to: "chiều rộng phải lớn hơn hoặc bằng %{length} pixel"
13
+ dimension_height_greater_than_or_equal_to: "chiều cao phải lớn hơn hoặc bằng %{length} pixel"
14
+ dimension_width_less_than_or_equal_to: "chiều rộng phải nhỏ hơn hoặc bằng %{length} pixel"
15
+ dimension_height_less_than_or_equal_to: "chiều cao phải nhỏ hơn hoặc bằng %{length} pixel"
16
+ dimension_width_equal_to: "chiều rộng phải bằng %{length} pixel"
17
+ dimension_height_equal_to: "chiều cao phải bằng %{length} pixel"
18
+ aspect_ratio_not_square: "phải là ảnh hình vuông"
19
+ aspect_ratio_not_portrait: "phải là ảnh đứng"
20
+ aspect_ratio_not_landscape: "phải là ảnh ngang"
21
+ aspect_ratio_is_not: "phải có tỉ lệ ảnh %{aspect_ratio}"
22
+ aspect_ratio_unknown: "tỉ lệ ảnh không xác định"
@@ -18,7 +18,7 @@ module ActiveStorageValidations
18
18
  raise ArgumentError, 'You must pass "aspect_ratio: :OPTION" option to the validator'
19
19
  end
20
20
 
21
- if Rails::VERSION::MAJOR >= 6
21
+ if Rails.gem_version >= Gem::Version.new('6.0.0')
22
22
  def validate_each(record, attribute, _value)
23
23
  return true unless record.send(attribute).attached?
24
24
 
@@ -5,7 +5,10 @@ module ActiveStorageValidations
5
5
  def validate_each(record, attribute, _value)
6
6
  return if record.send(attribute).attached?
7
7
 
8
- record.errors.add(attribute, :blank)
8
+ errors_options = {}
9
+ errors_options[:message] = options[:message] if options[:message].present?
10
+
11
+ record.errors.add(attribute, :blank, **errors_options)
9
12
  end
10
13
  end
11
14
  end
@@ -20,8 +20,14 @@ module ActiveStorageValidations
20
20
  end
21
21
 
22
22
  def types
23
- (Array.wrap(options[:with]) + Array.wrap(options[:in])).compact.map do |type|
24
- Mime[type] || type
23
+ return @types if defined? @types
24
+
25
+ @types = (Array.wrap(options[:with]) + Array.wrap(options[:in])).compact.map do |type|
26
+ if type.is_a?(Regexp)
27
+ type
28
+ else
29
+ Marcel::MimeType.for(declared_type: type.to_s, extension: type.to_s)
30
+ end
25
31
  end
26
32
  end
27
33
 
@@ -36,10 +42,9 @@ module ActiveStorageValidations
36
42
  end
37
43
 
38
44
  def is_valid?(file)
39
- if options[:with].is_a?(Regexp)
40
- options[:with].match?(content_type(file).to_s)
41
- else
42
- content_type(file).in?(types)
45
+ file_type = content_type(file)
46
+ types.any? do |type|
47
+ type == file_type || (type.is_a?(Regexp) && type.match?(file_type.to_s))
43
48
  end
44
49
  end
45
50
  end
@@ -34,7 +34,7 @@ module ActiveStorageValidations
34
34
  end
35
35
 
36
36
 
37
- if Rails::VERSION::MAJOR >= 6
37
+ if Rails.gem_version >= Gem::Version.new('6.0.0')
38
38
  def validate_each(record, attribute, _value)
39
39
  return true unless record.send(attribute).attached?
40
40
 
File without changes
@@ -57,7 +57,7 @@ module ActiveStorageValidations
57
57
  end
58
58
 
59
59
  def rejected_types
60
- @rejected_types || (Mime::LOOKUP.keys - allowed_types)
60
+ @rejected_types || (Marcel::TYPES.keys - allowed_types)
61
61
  end
62
62
 
63
63
  def allowed_types_allowed?
@@ -10,6 +10,7 @@ module ActiveStorageValidations
10
10
  def initialize(attribute_name)
11
11
  @attribute_name = attribute_name
12
12
  @width_min = @width_max = @height_min = @height_max = nil
13
+ @custom_message = nil
13
14
  end
14
15
 
15
16
  def description
@@ -26,6 +27,11 @@ module ActiveStorageValidations
26
27
  self
27
28
  end
28
29
 
30
+ def with_message(message)
31
+ @custom_message = message
32
+ self
33
+ end
34
+
29
35
  def width(width)
30
36
  @width_min = @width_max = width
31
37
  self
@@ -133,7 +139,8 @@ module ActiveStorageValidations
133
139
  attachment = @subject.public_send(@attribute_name)
134
140
  Matchers.mock_metadata(attachment, width, height) do
135
141
  @subject.validate
136
- @subject.errors.details[@attribute_name].all? { |error| error[:error].to_s.exclude?("dimension_#{check}") }
142
+ exclude_error_message = @custom_message || "dimension_#{check}"
143
+ @subject.errors.details[@attribute_name].all? { |error| error[:error].to_s.exclude?(exclude_error_message) }
137
144
  end
138
145
  end
139
146
 
@@ -22,7 +22,7 @@ module ActiveStorageValidations
22
22
  end
23
23
 
24
24
  def self.mock_metadata(attachment, width, height)
25
- if Rails::VERSION::MAJOR >= 6
25
+ if Rails.gem_version >= Gem::Version.new('6.0.0')
26
26
  # Mock the Metadata class for rails 6
27
27
  mock = OpenStruct.new(metadata: { width: width, height: height })
28
28
  stub_method(ActiveStorageValidations::Metadata, :new, mock) do
@@ -21,17 +21,16 @@ module ActiveStorageValidations
21
21
  def read_image
22
22
  is_string = file.is_a?(String)
23
23
  if is_string || file.is_a?(ActiveStorage::Blob)
24
- if is_string
25
- # If Rails 5.2 or 6.0, use `find_signed`
26
- if Rails::VERSION::MAJOR < 6 || (Rails::VERSION::MAJOR == 6 && Rails::VERSION::MINOR == 0)
27
- blob = ActiveStorage::Blob.find_signed(file)
28
- # If Rails 6.1 or higher, use `find_signed!`
29
- elsif Rails::VERSION::MAJOR > 6 || (Rails::VERSION::MAJOR == 6 && Rails::VERSION::MINOR >= 1)
30
- blob = ActiveStorage::Blob.find_signed!(file)
24
+ blob =
25
+ if is_string
26
+ if Rails.gem_version < Gem::Version.new('6.1.0')
27
+ ActiveStorage::Blob.find_signed(file)
28
+ else
29
+ ActiveStorage::Blob.find_signed!(file)
30
+ end
31
+ else
32
+ file
31
33
  end
32
- else
33
- blob = file
34
- end
35
34
 
36
35
  tempfile = Tempfile.new(["ActiveStorage-#{blob.id}-", blob.filename.extension_with_delimiter])
37
36
  tempfile.binmode
@@ -25,6 +25,9 @@ module ActiveStorageValidations
25
25
  next if content_size_valid?(file.blob.byte_size)
26
26
 
27
27
  errors_options[:file_size] = number_to_human_size(file.blob.byte_size)
28
+ errors_options[:min_size] = number_to_human_size(min_size)
29
+ errors_options[:max_size] = number_to_human_size(max_size)
30
+
28
31
  record.errors.add(attribute, :file_size_out_of_range, **errors_options)
29
32
  break
30
33
  end
@@ -43,5 +46,13 @@ module ActiveStorageValidations
43
46
  file_size >= options[:greater_than_or_equal_to]
44
47
  end
45
48
  end
49
+
50
+ def min_size
51
+ options[:between]&.min || options[:greater_than] || options[:greater_than_or_equal_to]
52
+ end
53
+
54
+ def max_size
55
+ options[:between]&.max || options[:less_than] || options[:less_than_or_equal_to]
56
+ end
46
57
  end
47
58
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveStorageValidations
4
- VERSION = '0.9.2'
4
+ VERSION = '0.9.6'
5
5
  end
File without changes
metadata CHANGED
@@ -1,17 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_storage_validations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.9.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Kasyanchuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-12 00:00:00.000000000 Z
11
+ date: 2021-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: activejob
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 5.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activemodel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 5.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 5.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: activestorage
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 5.2.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 5.2.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
15
57
  requirement: !ruby/object:Gem::Requirement
16
58
  requirements:
17
59
  - - ">="
@@ -108,12 +150,15 @@ files:
108
150
  - config/locales/en.yml
109
151
  - config/locales/es.yml
110
152
  - config/locales/fr.yml
153
+ - config/locales/it.yml
111
154
  - config/locales/ja.yml
112
155
  - config/locales/nl.yml
156
+ - config/locales/pl.yml
113
157
  - config/locales/pt-BR.yml
114
158
  - config/locales/ru.yml
115
159
  - config/locales/tr.yml
116
160
  - config/locales/uk.yml
161
+ - config/locales/vi.yml
117
162
  - lib/active_storage_validations.rb
118
163
  - lib/active_storage_validations/aspect_ratio_validator.rb
119
164
  - lib/active_storage_validations/attached_validator.rb
@@ -150,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
195
  - !ruby/object:Gem::Version
151
196
  version: '0'
152
197
  requirements: []
153
- rubygems_version: 3.0.3
198
+ rubygems_version: 3.1.4
154
199
  signing_key:
155
200
  specification_version: 4
156
201
  summary: Validations for Active Storage