active_storage_validations 0.9.4 → 0.9.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 58ef7bbaa01aafa835921f0ad446b86e5b5c49a73a6f08e42feb97ff9bd3c7fd
4
- data.tar.gz: e4f18d0de97ffa2adfe59e2d5d841706a8de3e6e575390aafb5b75dbf82a37a2
3
+ metadata.gz: 0f77bdb678731cdb6bb3aca1bddf3a3b1d1d4f34355a778c504931d067f6d0e2
4
+ data.tar.gz: cb723cb17a4cbfcfec2e7a9b8432ac0d2641afbef327a92e38baa376d15ba2fd
5
5
  SHA512:
6
- metadata.gz: 5b29620eb2a65e73c9f7c1c9d2bf143ba20aed0e460fdd763d415651b80463821f5dea26d2b28834dae7dc90ad035d6bbaa47bc7e89161365bfb154485a12c8b
7
- data.tar.gz: ee7ef332175aca338df8d46de13ac0487f1aa4b5a3d7aa220bd14826b0f73f55377a6475c2b2eb9133d06aae456a2d18bdc4fbec07b7caaf9cd9fa3b8f1dcf5b
6
+ metadata.gz: d44aed46b1f790d3df1913009fc1c84ea5831be3c8809063c94a0c50de3d8b9f40613eab920c49fb8f81dd0808d9c489aebb1705e022defe1e745d1205a48203
7
+ data.tar.gz: 3d770860efb253f13ea1f18086c5b8a51253caf69875ba1d9d7921c17b9c5ce43f8001f4d8eeb1e095f8f37d1f0924dbddcdb35ca24b721d6fd5cf2a002d9a90
data/README.md CHANGED
@@ -26,16 +26,17 @@ For example you have a model like this and you want to add validation.
26
26
  class User < ApplicationRecord
27
27
  has_one_attached :avatar
28
28
  has_many_attached :photos
29
+ has_one_attached :image
29
30
 
30
31
  validates :name, presence: true
31
32
 
32
33
  validates :avatar, attached: true, content_type: 'image/png',
33
34
  dimension: { width: 200, height: 200 }
34
- validates :photos, attached: true, content_type: ['image/png', 'image/jpg', 'image/jpeg'],
35
+ validates :photos, attached: true, content_type: ['image/png', 'image/jpeg'],
35
36
  dimension: { width: { min: 800, max: 2400 },
36
37
  height: { min: 600, max: 1800 }, message: 'is not given between dimension' }
37
38
  validates :image, attached: true,
38
- content_type: ['image/png', 'image/jpg'],
39
+ content_type: ['image/png', 'image/jpeg'],
39
40
  aspect_ratio: :landscape
40
41
  end
41
42
  ```
@@ -44,13 +45,15 @@ or
44
45
 
45
46
  ```ruby
46
47
  class Project < ApplicationRecord
48
+ has_one_attached :logo
47
49
  has_one_attached :preview
48
50
  has_one_attached :attachment
49
51
  has_many_attached :documents
50
52
 
51
53
  validates :title, presence: true
52
54
 
53
- validates :preview, attached: true, size: { less_than: 100.megabytes , message: 'is not given between size' }
55
+ validates :logo, attached: true, size: { less_than: 100.megabytes , message: 'is too large' }
56
+ validates :preview, attached: true, size: { between: 1.kilobyte..100.megabytes , message: 'is not given between size' }
54
57
  validates :attachment, attached: true, content_type: { in: 'application/pdf', message: 'is not a PDF' }
55
58
  validates :documents, limit: { min: 1, max: 3 }
56
59
  end
@@ -58,14 +61,15 @@ end
58
61
 
59
62
  ### More examples
60
63
 
61
- - Content type validation using symbols. In order to infer the correct mime type from the symbol, the types must be registered with `Mime::Type`.
64
+ - 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).
62
65
 
63
66
  ```ruby
64
67
  class User < ApplicationRecord
65
68
  has_one_attached :avatar
66
69
  has_many_attached :photos
67
70
 
68
- validates :avatar, attached: true, content_type: :png # Mime[:png].to_s => 'image/png'
71
+ validates :avatar, attached: true, content_type: :png # Marcel::Magic.by_extension(:png).to_s => 'image/png'
72
+ # Rails <= 6.1.3; MimeMagic.by_extension(:png).to_s => 'image/png'
69
73
  # or
70
74
  validates :photos, attached: true, content_type: [:png, :jpg, :jpeg]
71
75
  # or
@@ -176,6 +180,8 @@ gem 'active_storage_validations'
176
180
 
177
181
  # Optional, to use :dimension validator or :aspect_ratio validator
178
182
  gem 'mini_magick', '>= 4.9.5'
183
+ # Or
184
+ gem 'ruby-vips', '>= 2.1.0'
179
185
  ```
180
186
 
181
187
  And then execute:
@@ -292,6 +298,22 @@ To run tests in root folder of gem:
292
298
  * `BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle exec rake test` to run for Rails 5.2
293
299
  * `BUNDLE_GEMFILE=gemfiles/rails_6_0.gemfile bundle exec rake test` to run for Rails 6.0
294
300
  * `BUNDLE_GEMFILE=gemfiles/rails_6_1.gemfile bundle exec rake test` to run for Rails 6.1
301
+ * `BUNDLE_GEMFILE=gemfiles/rails_next.gemfile bundle exec rake test` to run for Rails main branch
302
+
303
+ Snippet to run in console:
304
+
305
+ ```
306
+ BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle
307
+ BUNDLE_GEMFILE=gemfiles/rails_6_0.gemfile bundle
308
+ BUNDLE_GEMFILE=gemfiles/rails_6_1.gemfile bundle
309
+ BUNDLE_GEMFILE=gemfiles/rails_7_0.gemfile bundle
310
+ BUNDLE_GEMFILE=gemfiles/rails_next.gemfile bundle
311
+ BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle exec rake test
312
+ BUNDLE_GEMFILE=gemfiles/rails_6_0.gemfile bundle exec rake test
313
+ BUNDLE_GEMFILE=gemfiles/rails_6_1.gemfile bundle exec rake test
314
+ BUNDLE_GEMFILE=gemfiles/rails_7_0.gemfile bundle exec rake test
315
+ BUNDLE_GEMFILE=gemfiles/rails_next.gemfile bundle exec rake test
316
+ ```
295
317
 
296
318
  ## Known issues
297
319
 
@@ -343,7 +365,16 @@ You are welcome to contribute.
343
365
  - https://github.com/dolarsrg
344
366
  - https://github.com/jayshepherd
345
367
  - https://github.com/ohbarye
346
- - https://github.com/...
368
+ - https://github.com/randsina
369
+ - https://github.com/vietqhoang
370
+ - https://github.com/kemenaran
371
+ - https://github.com/jrmhaig
372
+ - https://github.com/tagliala
373
+ - https://github.com/evedovelli
374
+ - https://github.com/JuanVqz
375
+ - https://github.com/luiseugenio
376
+ - https://github.com/equivalent
377
+ - https://github.com/NARKOZ
347
378
 
348
379
  ## License
349
380
 
File without changes
File without changes
File without changes
@@ -2,21 +2,21 @@ pt-BR:
2
2
  errors:
3
3
  messages:
4
4
  content_type_invalid: "tem um tipo de arquivo inválido"
5
- file_size_out_of_range: "tamanho %{file_size} está fora da faixa de tamanho válida"
6
- limit_out_of_range: "número total está fora do limite"
5
+ file_size_out_of_range: "tem tamanho %{file_size} e está fora da faixa de tamanho válida"
6
+ limit_out_of_range: "o número total está fora do limite"
7
7
  image_metadata_missing: "não é uma imagem válida"
8
- dimension_min_inclusion: "deve ser maior ou igual a %{width} x %{height} pixel"
9
- dimension_max_inclusion: "deve ser menor ou igual a %{width} x %{height} pixel"
10
- dimension_width_inclusion: "largura não está entre %{min} e %{max} pixel"
11
- dimension_height_inclusion: "altura não está entre %{min} e %{max} pixel"
12
- dimension_width_greater_than_or_equal_to: "largura deve ser maior ou igual a %{length} pixel"
13
- dimension_height_greater_than_or_equal_to: "altura deve ser maior ou igual a %{length} pixel"
14
- dimension_width_less_than_or_equal_to: "largura deve ser menor ou igual a %{length} pixel"
15
- dimension_height_less_than_or_equal_to: "altura deve ser menor ou igual a %{length} pixel"
16
- dimension_width_equal_to: "largura deve ser igual a %{length} pixel"
17
- dimension_height_equal_to: "altura deve ser igual a %{length} pixel"
8
+ dimension_min_inclusion: "deve ser maior ou igual a %{width} x %{height} pixels"
9
+ dimension_max_inclusion: "deve ser menor ou igual a %{width} x %{height} pixels"
10
+ dimension_width_inclusion: "deve ter largura entre %{min} e %{max} pixels"
11
+ dimension_height_inclusion: "deve ter altura entre %{min} e %{max} pixels"
12
+ dimension_width_greater_than_or_equal_to: "deve ter largura maior ou igual a %{length} pixels"
13
+ dimension_height_greater_than_or_equal_to: "deve ter altura maior ou igual a %{length} pixels"
14
+ dimension_width_less_than_or_equal_to: "deve ter largura menor ou igual a %{length} pixels"
15
+ dimension_height_less_than_or_equal_to: "deve ter altura menor ou igual a %{length} pixels"
16
+ dimension_width_equal_to: "deve ter largura igual a %{length} pixels"
17
+ dimension_height_equal_to: "deve ter altura igual a %{length} pixels"
18
18
  aspect_ratio_not_square: "não é uma imagem quadrada"
19
- aspect_ratio_not_portrait: "não contém uma imagem no formato retrato"
20
- aspect_ratio_not_landscape: "não contém uma imagem no formato paisagem"
19
+ aspect_ratio_not_portrait: "não está no formato retrato"
20
+ aspect_ratio_not_landscape: "não está no formato paisagem"
21
21
  aspect_ratio_is_not: "não contém uma proporção de %{aspect_ratio}"
22
22
  aspect_ratio_unknown: "não tem uma proporção definida"
File without changes
File without changes
@@ -8,7 +8,6 @@ module ActiveStorageValidations
8
8
  PRECISION = 3
9
9
 
10
10
  def initialize(options)
11
- require 'mini_magick' unless defined?(MiniMagick)
12
11
  super(options)
13
12
  end
14
13
 
@@ -18,7 +17,7 @@ module ActiveStorageValidations
18
17
  raise ArgumentError, 'You must pass "aspect_ratio: :OPTION" option to the validator'
19
18
  end
20
19
 
21
- if Rails::VERSION::MAJOR >= 6
20
+ if Rails.gem_version >= Gem::Version.new('6.0.0')
22
21
  def validate_each(record, attribute, _value)
23
22
  return true unless record.send(attribute).attached?
24
23
 
@@ -37,14 +36,14 @@ module ActiveStorageValidations
37
36
  # Rails 5
38
37
  def validate_each(record, attribute, _value)
39
38
  return true unless record.send(attribute).attached?
40
-
39
+
41
40
  files = Array.wrap(record.send(attribute))
42
-
41
+
43
42
  files.each do |file|
44
43
  # Analyze file first if not analyzed to get all required metadata.
45
44
  file.analyze; file.reload unless file.analyzed?
46
45
  metadata = file.metadata
47
-
46
+
48
47
  next if is_valid?(record, attribute, metadata)
49
48
  break
50
49
  end
@@ -20,14 +20,13 @@ module ActiveStorageValidations
20
20
  end
21
21
 
22
22
  def types
23
- (Array.wrap(options[:with]) + Array.wrap(options[:in])).compact.map do |type|
23
+ return @types if defined? @types
24
+
25
+ @types = (Array.wrap(options[:with]) + Array.wrap(options[:in])).compact.map do |type|
24
26
  if type.is_a?(Regexp)
25
27
  type
26
- elsif type.is_a?(String) && type =~ %r{\A\w+/[-+.\w]+\z} # mime-type-ish string
27
- type
28
28
  else
29
- Mime[type] || raise(ArgumentError, "content_type must be one of Regxep,"\
30
- " supported mime types (e.g. :png, 'jpg'), or mime type String ('image/jpeg')")
29
+ Marcel::MimeType.for(declared_type: type.to_s, extension: type.to_s)
31
30
  end
32
31
  end
33
32
  end
@@ -7,8 +7,6 @@ module ActiveStorageValidations
7
7
  AVAILABLE_CHECKS = %i[width height min max].freeze
8
8
 
9
9
  def initialize(options)
10
- require 'mini_magick' unless defined?(MiniMagick)
11
-
12
10
  [:width, :height].each do |length|
13
11
  if options[length] and options[length].is_a?(Hash)
14
12
  if range = options[length][:in]
@@ -34,7 +32,7 @@ module ActiveStorageValidations
34
32
  end
35
33
 
36
34
 
37
- if Rails::VERSION::MAJOR >= 6
35
+ if Rails.gem_version >= Gem::Version.new('6.0.0')
38
36
  def validate_each(record, attribute, _value)
39
37
  return true unless record.send(attribute).attached?
40
38
 
File without changes
@@ -35,7 +35,7 @@ module ActiveStorageValidations
35
35
  def failure_message
36
36
  <<~MESSAGE
37
37
  Expected #{@attribute_name}
38
-
38
+
39
39
  Accept content types: #{allowed_types.join(", ")}
40
40
  #{accepted_types_and_failures}
41
41
 
@@ -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 || (content_type_keys - allowed_types)
61
61
  end
62
62
 
63
63
  def allowed_types_allowed?
@@ -96,6 +96,16 @@ module ActiveStorageValidations
96
96
  suffix = type.to_s.split('/').last
97
97
  { io: Tempfile.new('.'), filename: "test.#{suffix}", content_type: type }
98
98
  end
99
+
100
+ private
101
+
102
+ def content_type_keys
103
+ if Rails.gem_version < Gem::Version.new('6.1.0')
104
+ Mime::LOOKUP.keys
105
+ else
106
+ Marcel::TYPES.keys
107
+ end
108
+ end
99
109
  end
100
110
  end
101
111
  end
@@ -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
@@ -3,9 +3,22 @@ module ActiveStorageValidations
3
3
  attr_reader :file
4
4
 
5
5
  def initialize(file)
6
+ require_image_processor
6
7
  @file = file
7
8
  end
8
9
 
10
+ def image_processor
11
+ Rails.application.config.active_storage.variant_processor
12
+ end
13
+
14
+ def require_image_processor
15
+ if image_processor == :vips
16
+ require 'vips' unless defined?(Vips)
17
+ else
18
+ require 'mini_magick' unless defined?(MiniMagick)
19
+ end
20
+ end
21
+
9
22
  def metadata
10
23
  read_image do |image|
11
24
  if rotated_image?(image)
@@ -21,17 +34,16 @@ module ActiveStorageValidations
21
34
  def read_image
22
35
  is_string = file.is_a?(String)
23
36
  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)
37
+ blob =
38
+ if is_string
39
+ if Rails.gem_version < Gem::Version.new('6.1.0')
40
+ ActiveStorage::Blob.find_signed(file)
41
+ else
42
+ ActiveStorage::Blob.find_signed!(file)
43
+ end
44
+ else
45
+ file
31
46
  end
32
- else
33
- blob = file
34
- end
35
47
 
36
48
  tempfile = Tempfile.new(["ActiveStorage-#{blob.id}-", blob.filename.extension_with_delimiter])
37
49
  tempfile.binmode
@@ -43,29 +55,53 @@ module ActiveStorageValidations
43
55
  tempfile.flush
44
56
  tempfile.rewind
45
57
 
46
- image = MiniMagick::Image.new(tempfile.path)
58
+ image = if image_processor == :vips && Vips::get_suffixes.include?(File.extname(tempfile.path))
59
+ Vips::Image.new_from_file(tempfile.path)
60
+ else
61
+ MiniMagick::Image.new(tempfile.path)
62
+ end
47
63
  else
48
- image = MiniMagick::Image.new(read_file_path)
64
+ image = if image_processor == :vips && Vips::get_suffixes.include?(File.extname(read_file_path))
65
+ Vips::Image.new_from_file(read_file_path)
66
+ else
67
+ MiniMagick::Image.new(read_file_path)
68
+ end
49
69
  end
50
70
 
51
- if image.valid?
71
+ if image && valid_image?(image)
52
72
  yield image
53
73
  else
54
- logger.info "Skipping image analysis because ImageMagick doesn't support the file"
74
+ logger.info "Skipping image analysis because ImageMagick or Vips doesn't support the file"
55
75
  {}
56
76
  end
57
- rescue LoadError
58
- logger.info "Skipping image analysis because the mini_magick gem isn't installed"
77
+ rescue LoadError, NameError
78
+ logger.info "Skipping image analysis because the mini_magick or ruby-vips gem isn't installed"
59
79
  {}
60
80
  rescue MiniMagick::Error => error
61
81
  logger.error "Skipping image analysis due to an ImageMagick error: #{error.message}"
62
82
  {}
83
+ rescue Vips::Error => error
84
+ logger.error "Skipping image analysis due to a Vips error: #{error.message}"
85
+ {}
63
86
  ensure
64
87
  image = nil
65
88
  end
66
89
 
90
+ def valid_image?(image)
91
+ image_processor == :vips ? image.avg : image.valid?
92
+ rescue Vips::Error
93
+ false
94
+ end
95
+
67
96
  def rotated_image?(image)
68
- %w[ RightTop LeftBottom ].include?(image["%[orientation]"])
97
+ if image_processor == :vips
98
+ image.get('exif-ifd0-Orientation').include?('Right-top') ||
99
+ image.get('exif-ifd0-Orientation').include?('Left-bottom')
100
+ else
101
+ %w[ RightTop LeftBottom ].include?(image["%[orientation]"])
102
+ end
103
+ rescue Vips::Error # field "exif-ifd0-Orientation" not found
104
+ false
69
105
  end
70
106
 
71
107
  def read_file_path
@@ -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.4'
4
+ VERSION = '0.9.7'
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.4
4
+ version: 0.9.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Kasyanchuk
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-08 00:00:00.000000000 Z
11
+ date: 2022-03-05 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
  - - ">="
@@ -52,6 +94,20 @@ dependencies:
52
94
  - - ">="
53
95
  - !ruby/object:Gem::Version
54
96
  version: 4.9.5
97
+ - !ruby/object:Gem::Dependency
98
+ name: ruby-vips
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 2.1.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 2.1.0
55
111
  - !ruby/object:Gem::Dependency
56
112
  name: pry
57
113
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +150,20 @@ dependencies:
94
150
  - - ">="
95
151
  - !ruby/object:Gem::Version
96
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: marcel
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
97
167
  description: Validations for Active Storage (presence)
98
168
  email:
99
169
  - igorkasyanchuk@gmail.com
@@ -138,7 +208,7 @@ homepage: https://github.com/igorkasyanchuk/active_storage_validations
138
208
  licenses:
139
209
  - MIT
140
210
  metadata: {}
141
- post_install_message:
211
+ post_install_message:
142
212
  rdoc_options: []
143
213
  require_paths:
144
214
  - lib
@@ -153,8 +223,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
223
  - !ruby/object:Gem::Version
154
224
  version: '0'
155
225
  requirements: []
156
- rubygems_version: 3.0.3
157
- signing_key:
226
+ rubygems_version: 3.2.3
227
+ signing_key:
158
228
  specification_version: 4
159
229
  summary: Validations for Active Storage
160
230
  test_files: []