active_storage_validations 0.8.8 → 0.9.3

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: a82f321d71985caf479d40c9546bc6b0c216ba97670d200e775be3274cf9a35c
4
- data.tar.gz: 3a80b0ad6db919d7968a2162214004240d152648ee2ac8c4c4eafe1119834c1c
3
+ metadata.gz: d75309ae07f32e9107683721c2a700dea9a435cdc5801c8488a0bf2df18e6162
4
+ data.tar.gz: 3f14dc96d9d8fff1fb309460c896d631db5777d663b6d7b00f47d08b5e8dc034
5
5
  SHA512:
6
- metadata.gz: c3d19095f455bb32b649c4ab0bfc7ae50d2d29eae69d5b3a593d6dd556de9ba7c527eb4afe9ec8032638adec23f664d200bcfab75cd726f51be97492266fc1b0
7
- data.tar.gz: 6ab99b207ef0399354c56d499d004cd287c22a56fd1648a5c2f948eace0050e00d13d12e3bb2ca38ba730edf2539b3843637383a8d3c8dc6424daa91f764164c
6
+ metadata.gz: a04233bd7b37c89c45fa9d7fe3ef32be5b50ed40181a2b29fa8711049958d8b2bcacceb7f8e4aa7fd7c9714fb506387c7f26050eeecb623f0ceb3d361b501cf7
7
+ data.tar.gz: 0e43d6b501c8c8d45f1c99110d7504a8ca124353dbe26819f6c9febe34f1c4710c842f5c42945584a7e64bac10ad1efcc18a97afa5ea4987e04024b2f6cdf8d4
data/README.md CHANGED
@@ -1,10 +1,12 @@
1
1
  # Active Storage Validations
2
2
 
3
- 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 valiation method.
3
+ ![MiniTest](https://github.com/igorkasyanchuk/active_storage_validations/workflows/MiniTest/badge.svg)
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)
4
6
 
5
- This gems doing it for you. Just use `attached: true` or `content_type: 'image/png'` validation.
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.
6
8
 
7
- [![Build Status](https://travis-ci.org/igorkasyanchuk/active_storage_validations.svg?branch=master)](https://travis-ci.org/igorkasyanchuk/active_storage_validations)
9
+ This gems doing it for you. Just use `attached: true` or `content_type: 'image/png'` validation.
8
10
 
9
11
  ## What it can do
10
12
 
@@ -287,8 +289,7 @@ To run tests in root folder of gem:
287
289
 
288
290
  * `BUNDLE_GEMFILE=gemfiles/rails_5_2.gemfile bundle exec rake test` to run for Rails 5.2
289
291
  * `BUNDLE_GEMFILE=gemfiles/rails_6_0.gemfile bundle exec rake test` to run for Rails 6.0
290
-
291
- To play with app `cd test/dummy` and `rails s -b 0.0.0.0` (before `rails db:migrate`).
292
+ * `BUNDLE_GEMFILE=gemfiles/rails_6_1.gemfile bundle exec rake test` to run for Rails 6.1
292
293
 
293
294
  ## Known issues
294
295
 
@@ -329,7 +330,19 @@ You are welcome to contribute.
329
330
  - https://github.com/willnet
330
331
  - https://github.com/mohanklein
331
332
  - https://github.com/High5Apps
333
+ - https://github.com/mschnitzer
334
+ - https://github.com/sinankeskin
335
+ - https://github.com/alejandrodevs
336
+ - https://github.com/molfar
337
+ - https://github.com/connorshea
338
+ - https://github.com/yshmarov
339
+ - https://github.com/fongfan999
340
+ - https://github.com/cooperka
341
+ - https://github.com/dolarsrg
332
342
 
333
343
  ## License
334
344
 
335
345
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
346
+
347
+ [<img src="https://github.com/igorkasyanchuk/rails_time_travel/blob/main/docs/more_gems.png?raw=true"
348
+ />](https://www.railsjazz.com/)
@@ -2,16 +2,21 @@ de:
2
2
  errors:
3
3
  messages:
4
4
  content_type_invalid: "hat einen ungültigen Dateityp"
5
- file_size_out_of_range: "Dateigröße von %{file_size} ist außerhalb des erlaubten Bereichs"
5
+ file_size_out_of_range: "Dateigröße %{file_size} liegt nicht im erlaubten Bereich"
6
6
  limit_out_of_range: "Anzahl ist außerhalb des gültigen Bereichs"
7
- image_metadata_missing: "ist nicht ein gültigen Bild"
7
+ image_metadata_missing: "ist kein gültiges Bild"
8
8
  dimension_min_inclusion: "muss größer oder gleich %{width} x %{height} Pixel sein"
9
9
  dimension_max_inclusion: "muss kleiner oder gleich %{width} x %{height} Pixel sein"
10
- dimension_width_inclusion: "Breite ist nicht zwischen %{min} und %{max} Pixel enthalten"
11
- dimension_height_inclusion: "Höhe ist nicht zwischen %{min} und %{max} Pixel enthalten"
12
- dimension_width_greater_than_or_equal_to: "Breite muss größer oder gleich %{length} Pixel sein"
13
- dimension_height_greater_than_or_equal_to: "Höhe muss größer oder gleich %{length} Pixel sein"
10
+ dimension_width_inclusion: "Bildbreite muss zwischen %{min} und %{max} Pixel liegen"
11
+ dimension_height_inclusion: "Bildhöhe muss zwischen %{min} und %{max} Pixel liegen"
12
+ dimension_width_greater_than_or_equal_to: "Bildbreite muss größer oder gleich %{length} Pixel sein"
13
+ dimension_height_greater_than_or_equal_to: "Bildhöhe muss größer oder gleich %{length} Pixel sein"
14
14
  dimension_width_less_than_or_equal_to: "Breite muss kleiner oder gleich %{length} Pixel sein"
15
15
  dimension_height_less_than_or_equal_to: "Höhe muss kleiner oder gleich %{length} Pixel sein"
16
- dimension_width_equal_to: "Breite muss genau %{length} Pixel sein"
17
- dimension_height_equal_to: "Höhe muss genau %{length} Pixel sein"
16
+ dimension_width_equal_to: "Bildbreite muss genau %{length} Pixel sein"
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"
@@ -0,0 +1,22 @@
1
+ es:
2
+ errors:
3
+ messages:
4
+ content_type_invalid: "tiene un tipo de contenido inválido"
5
+ file_size_out_of_range: "tamaño %{file_size} no está entre el rango requerido"
6
+ limit_out_of_range: "el número total está fuera de rango"
7
+ image_metadata_missing: "no es una imagen válida"
8
+ dimension_min_inclusion: "debe ser mayor o igual a %{width} x %{height} pixel"
9
+ dimension_max_inclusion: "debe ser menor o igual a %{width} x %{height} pixel"
10
+ dimension_width_inclusion: "el ancho no se incluye entre %{min} y %{max} pixel"
11
+ dimension_height_inclusion: "la altura no se incluye entre %{min} y %{max} pixel"
12
+ dimension_width_greater_than_or_equal_to: "el ancho debe ser mayor o igual a %{length} pixel"
13
+ dimension_height_greater_than_or_equal_to: "la altura debe ser mayor o igual a %{length} pixel"
14
+ dimension_width_less_than_or_equal_to: "el ancho debe ser menor o igual a %{length} pixel"
15
+ dimension_height_less_than_or_equal_to: "la altura debe ser menor o igual a %{length} pixel"
16
+ dimension_width_equal_to: "el ancho debe ser igual a %{length} pixel"
17
+ dimension_height_equal_to: "la altura debe ser igual a %{length} pixel"
18
+ aspect_ratio_not_square: "debe ser una imagen cuadrada"
19
+ aspect_ratio_not_portrait: "debe ser una imagen vertical"
20
+ aspect_ratio_not_landscape: "debe ser una imagen apaisada"
21
+ aspect_ratio_is_not: "debe tener una relación de aspecto de %{aspect_ratio}"
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"
@@ -0,0 +1,22 @@
1
+ nl:
2
+ errors:
3
+ messages:
4
+ content_type_invalid: "heeft een ongeldig inhoudstype"
5
+ file_size_out_of_range: "bestandsgrootte %{file_size} valt niet tussen het vereiste bereik"
6
+ limit_out_of_range: "totaal aantal valt buiten het vereiste bereik"
7
+ image_metadata_missing: "is geen geldige afbeelding"
8
+ dimension_min_inclusion: "moet groter of gelijk zijn aan %{width} x %{height} pixels"
9
+ dimension_max_inclusion: "moet kleiner of gelijk zijn aan %{width} x %{height} pixels"
10
+ dimension_width_inclusion: "breedte niet tussen de %{min} en %{max} pixels"
11
+ dimension_height_inclusion: "hoogte niet tussen de %{min} en %{max} pixels"
12
+ dimension_width_greater_than_or_equal_to: "breedte moet groter of gelijk zijn aan %{length} pixels"
13
+ dimension_height_greater_than_or_equal_to: "hoogte moet groter of gelijk zijn aan %{length} pixels"
14
+ dimension_width_less_than_or_equal_to: "breedte moet kleiner of gelijk zijn aan %{length} pixels"
15
+ dimension_height_less_than_or_equal_to: "hoogte moet kleiner of gelijk zijn aan %{length} pixels"
16
+ dimension_width_equal_to: "breedte moet gelijk zijn aan %{length} pixels"
17
+ dimension_height_equal_to: "hoogte moet gelijk zijn aan %{length} pixels"
18
+ aspect_ratio_not_square: "moet een vierkante afbeelding zijn"
19
+ aspect_ratio_not_portrait: "moet een staande afbeelding zijn"
20
+ aspect_ratio_not_landscape: "moet een liggende afbeelding zijn"
21
+ aspect_ratio_is_not: "moet een beeldverhouding hebben van %{aspect_ratio}"
22
+ aspect_ratio_unknown: "heeft een onbekende beeldverhouding"
@@ -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"
@@ -0,0 +1,22 @@
1
+ tr:
2
+ errors:
3
+ messages:
4
+ content_type_invalid: "geçersiz dosya tipine sahip"
5
+ file_size_out_of_range: "dosya boyutu %{file_size} gerekli aralık dışında"
6
+ limit_out_of_range: "toplam miktar aralık dışında"
7
+ image_metadata_missing: "geçerli bir imaj değil"
8
+ dimension_min_inclusion: "%{width} x %{height} piksele eşit ya da büyük olmalı"
9
+ dimension_max_inclusion: "%{width} x %{height} piksele eşit ya da küçük olmalı"
10
+ dimension_width_inclusion: "en %{min} ve %{max} piksel aralığı dışında"
11
+ dimension_height_inclusion: "boy %{min} ve %{max} piksel aralığı dışında"
12
+ dimension_width_greater_than_or_equal_to: "en %{length} piksele eşit ya da büyük olmalı"
13
+ dimension_height_greater_than_or_equal_to: "boy %{length} piksele eşit ya da büyük olmalı"
14
+ dimension_width_less_than_or_equal_to: "en %{length} piksele eşit ya da küçük olmalı"
15
+ dimension_height_less_than_or_equal_to: "boy %{length} piksele eşit ya da küçük olmalı"
16
+ dimension_width_equal_to: "en %{length} piksele eşit olmalı"
17
+ dimension_height_equal_to: "boy %{length} piksele eşit olmalı"
18
+ aspect_ratio_not_square: "kare bir imaj olmalı"
19
+ aspect_ratio_not_portrait: "dikey bir imaj olmalı"
20
+ aspect_ratio_not_landscape: "yatay bir imaj olmalı"
21
+ aspect_ratio_is_not: "%{aspect_ratio} en boy oranına sahip olmalı"
22
+ aspect_ratio_unknown: "bilinmeyen en boy oranı"
@@ -1,22 +1,22 @@
1
1
  uk:
2
2
  errors:
3
3
  messages:
4
- content_type_invalid: "має неприпустимий тип вмісту"
5
- file_size_out_of_range: "розмір %{file_size} більше необхідного"
6
- limit_out_of_range: "кількість файлів більше необхідного"
7
- image_metadata_missing: "не є допустимим зображенням"
8
- dimension_min_inclusion: "мусить бути більше або дорівнювати %{width} x %{height} пікселям"
9
- dimension_max_inclusion: "мусить бути менше або дорівнювати %{width} x %{height} пікселям"
10
- dimension_width_inclusion: "ширина не включена між %{min} і %{max} пікселям"
11
- dimension_height_inclusion: "висота не включена між %{min} і %{max} пікселям"
12
- dimension_width_greater_than_or_equal_to: "ширина мусить бути більше або дорівнювати %{length} пікселям"
13
- dimension_height_greater_than_or_equal_to: "висота мусить бути більше або дорівнювати %{length} пікселям"
14
- dimension_width_less_than_or_equal_to: "ширина мусить бути менше або дорівнювати %{length} пікселям"
15
- dimension_height_less_than_or_equal_to: "висота мусить бути менше або дорівнювати %{length} пікселям"
16
- dimension_width_equal_to: "ширина мусить дорівнювати %{length} пікселям"
17
- dimension_height_equal_to: "висота мусить дорівнювати %{length} пікселям"
18
- aspect_ratio_not_square: "мусить бути квадратне зображення"
19
- aspect_ratio_not_portrait: "мусить бути портретне зображення"
20
- aspect_ratio_not_landscape: "мусить бути пейзажне зображення"
21
- aspect_ratio_is_not: "мусить мати співвідношення сторін %{aspect_ratio}"
22
- aspect_ratio_unknown: "має невідоме співвідношення сторін"
4
+ content_type_invalid: "має неприпустимий тип вмісту"
5
+ file_size_out_of_range: "розмір %{file_size} більше необхідного"
6
+ limit_out_of_range: "кількість файлів більше необхідного"
7
+ image_metadata_missing: "не є допустимим зображенням"
8
+ dimension_min_inclusion: "мусить бути більше або дорівнювати %{width} x %{height} пікселям"
9
+ dimension_max_inclusion: "мусить бути менше або дорівнювати %{width} x %{height} пікселям"
10
+ dimension_width_inclusion: "ширина не включена між %{min} і %{max} пікселям"
11
+ dimension_height_inclusion: "висота не включена між %{min} і %{max} пікселям"
12
+ dimension_width_greater_than_or_equal_to: "ширина мусить бути більше або дорівнювати %{length} пікселям"
13
+ dimension_height_greater_than_or_equal_to: "висота мусить бути більше або дорівнювати %{length} пікселям"
14
+ dimension_width_less_than_or_equal_to: "ширина мусить бути менше або дорівнювати %{length} пікселям"
15
+ dimension_height_less_than_or_equal_to: "висота мусить бути менше або дорівнювати %{length} пікселям"
16
+ dimension_width_equal_to: "ширина мусить дорівнювати %{length} пікселям"
17
+ dimension_height_equal_to: "висота мусить дорівнювати %{length} пікселям"
18
+ aspect_ratio_not_square: "мусить бути квадратне зображення"
19
+ aspect_ratio_not_portrait: "мусить бути портретне зображення"
20
+ aspect_ratio_not_landscape: "мусить бути пейзажне зображення"
21
+ aspect_ratio_is_not: "мусить мати співвідношення сторін %{aspect_ratio}"
22
+ aspect_ratio_unknown: "має невідоме співвідношення сторін"
@@ -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"
@@ -14,7 +14,7 @@ module ActiveStorageValidations
14
14
  next if is_valid?(file)
15
15
 
16
16
  errors_options[:content_type] = content_type(file)
17
- record.errors.add(attribute, :content_type_invalid, errors_options)
17
+ record.errors.add(attribute, :content_type_invalid, **errors_options)
18
18
  break
19
19
  end
20
20
  end
@@ -36,10 +36,9 @@ module ActiveStorageValidations
36
36
  end
37
37
 
38
38
  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)
39
+ file_type = content_type(file)
40
+ types.any? do |type|
41
+ type == file_type || (type.is_a?(Regexp) && type.match?(file_type.to_s))
43
42
  end
44
43
  end
45
44
  end
@@ -52,7 +52,7 @@ module ActiveStorageValidations
52
52
  # Rails 5
53
53
  def validate_each(record, attribute, _value)
54
54
  return true unless record.send(attribute).attached?
55
-
55
+
56
56
  files = Array.wrap(record.send(attribute))
57
57
  files.each do |file|
58
58
  # Analyze file first if not analyzed to get all required metadata.
@@ -110,7 +110,7 @@ module ActiveStorageValidations
110
110
  else
111
111
  if file_metadata[length] != options[length]
112
112
  add_error(record, attribute, options[:message].presence || :"dimension_#{length}_equal_to", length: options[length])
113
- return false
113
+ return false
114
114
  end
115
115
  end
116
116
  end
@@ -119,11 +119,11 @@ module ActiveStorageValidations
119
119
  true # valid file
120
120
  end
121
121
 
122
- def add_error(record, attribute, type, *attrs)
122
+ def add_error(record, attribute, type, **attrs)
123
123
  key = options[:message].presence || type
124
124
  return if record.errors.added?(attribute, key)
125
- record.errors.add(attribute, key, *attrs)
126
- end
125
+ record.errors.add(attribute, key, **attrs)
126
+ end
127
127
 
128
128
  end
129
129
  end
@@ -17,7 +17,7 @@ module ActiveStorageValidations
17
17
  errors_options = { min: options[:min], max: options[:max] }
18
18
 
19
19
  return true if files_count_valid?(files.count)
20
- record.errors.add(attribute, options[:message].presence || :limit_out_of_range, errors_options)
20
+ record.errors.add(attribute, options[:message].presence || :limit_out_of_range, **errors_options)
21
21
  end
22
22
 
23
23
  def files_count_valid?(count)
@@ -16,9 +16,8 @@ module ActiveStorageValidations
16
16
  end
17
17
 
18
18
  def matches?(subject)
19
- @subject = subject.is_a?(Class) ? subject : subject.class
20
-
21
- invalid_when_not_attached && valid_when_attached
19
+ @subject = subject.is_a?(Class) ? subject.new : subject
20
+ responds_to_methods && valid_when_attached && invalid_when_not_attached
22
21
  end
23
22
 
24
23
  def failure_message
@@ -31,17 +30,25 @@ module ActiveStorageValidations
31
30
 
32
31
  private
33
32
 
33
+ def responds_to_methods
34
+ @subject.respond_to?(@attribute_name) &&
35
+ @subject.public_send(@attribute_name).respond_to?(:attach) &&
36
+ @subject.public_send(@attribute_name).respond_to?(:detach)
37
+ end
38
+
34
39
  def valid_when_attached
35
- instance = @subject.new
36
- instance.public_send(@attribute_name).attach(attachable)
37
- instance.validate
38
- instance.errors.details[@attribute_name].exclude?(error: :blank)
40
+ @subject.public_send(@attribute_name).attach(attachable) unless @subject.public_send(@attribute_name).attached?
41
+ @subject.validate
42
+ @subject.errors.details[@attribute_name].exclude?(error: :blank)
39
43
  end
40
44
 
41
45
  def invalid_when_not_attached
42
- instance = @subject.new
43
- instance.validate
44
- instance.errors.details[@attribute_name].include?(error: :blank)
46
+ @subject.public_send(@attribute_name).detach
47
+ # Unset the direct relation since `detach` on an unpersisted record does not set `attached?` to false.
48
+ @subject.public_send("#{@attribute_name}=", nil)
49
+
50
+ @subject.validate
51
+ @subject.errors.details[@attribute_name].include?(error: :blank)
45
52
  end
46
53
 
47
54
  def attachable
@@ -29,7 +29,7 @@ module ActiveStorageValidations
29
29
 
30
30
  def matches?(subject)
31
31
  @subject = subject.is_a?(Class) ? subject.new : subject
32
- allowed_types_allowed? && rejected_types_rejected?
32
+ responds_to_methods && allowed_types_allowed? && rejected_types_rejected?
33
33
  end
34
34
 
35
35
  def failure_message
@@ -46,6 +46,12 @@ module ActiveStorageValidations
46
46
 
47
47
  protected
48
48
 
49
+ def responds_to_methods
50
+ @subject.respond_to?(@attribute_name) &&
51
+ @subject.public_send(@attribute_name).respond_to?(:attach) &&
52
+ @subject.public_send(@attribute_name).respond_to?(:detach)
53
+ end
54
+
49
55
  def allowed_types
50
56
  @allowed_types || []
51
57
  end
@@ -58,7 +58,8 @@ module ActiveStorageValidations
58
58
 
59
59
  def matches?(subject)
60
60
  @subject = subject.is_a?(Class) ? subject.new : subject
61
- width_smaller_than_min? && width_larger_than_min? && width_smaller_than_max? && width_larger_than_max? && width_equals? &&
61
+ responds_to_methods &&
62
+ width_smaller_than_min? && width_larger_than_min? && width_smaller_than_max? && width_larger_than_max? && width_equals? &&
62
63
  height_smaller_than_min? && height_larger_than_min? && height_smaller_than_max? && height_larger_than_max? && height_equals?
63
64
  end
64
65
 
@@ -72,6 +73,12 @@ module ActiveStorageValidations
72
73
 
73
74
  protected
74
75
 
76
+ def responds_to_methods
77
+ @subject.respond_to?(@attribute_name) &&
78
+ @subject.public_send(@attribute_name).respond_to?(:attach) &&
79
+ @subject.public_send(@attribute_name).respond_to?(:detach)
80
+ end
81
+
75
82
  def valid_width
76
83
  ((@width_min || 0) + (@width_max || 2000)) / 2
77
84
  end
@@ -45,7 +45,7 @@ module ActiveStorageValidations
45
45
 
46
46
  def matches?(subject)
47
47
  @subject = subject.is_a?(Class) ? subject.new : subject
48
- lower_than_low? && higher_than_low? && lower_than_high? && higher_than_high?
48
+ responds_to_methods && lower_than_low? && higher_than_low? && lower_than_high? && higher_than_high?
49
49
  end
50
50
 
51
51
  def failure_message
@@ -58,6 +58,12 @@ module ActiveStorageValidations
58
58
 
59
59
  protected
60
60
 
61
+ def responds_to_methods
62
+ @subject.respond_to?(@attribute_name) &&
63
+ @subject.public_send(@attribute_name).respond_to?(:attach) &&
64
+ @subject.public_send(@attribute_name).respond_to?(:detach)
65
+ end
66
+
61
67
  def lower_than_low?
62
68
  @low.nil? || !passes_validation_with_size(@low - 1)
63
69
  end
@@ -21,7 +21,17 @@ 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
- blob = is_string ? ActiveStorage::Blob.find_signed(file) : file
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)
31
+ end
32
+ else
33
+ blob = file
34
+ end
25
35
 
26
36
  tempfile = Tempfile.new(["ActiveStorage-#{blob.id}-", blob.filename.extension_with_delimiter])
27
37
  tempfile.binmode
@@ -25,7 +25,7 @@ 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
- record.errors.add(attribute, :file_size_out_of_range, errors_options)
28
+ record.errors.add(attribute, :file_size_out_of_range, **errors_options)
29
29
  break
30
30
  end
31
31
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveStorageValidations
4
- VERSION = '0.8.8'
4
+ VERSION = '0.9.3'
5
5
  end
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: 0.8.8
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Kasyanchuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-21 00:00:00.000000000 Z
11
+ date: 2021-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -25,35 +25,35 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 5.2.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: mini_magick
28
+ name: combustion
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 4.9.5
33
+ version: '1.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 4.9.5
40
+ version: '1.3'
41
41
  - !ruby/object:Gem::Dependency
42
- name: pry
42
+ name: mini_magick
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 4.9.5
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 4.9.5
55
55
  - !ruby/object:Gem::Dependency
56
- name: rubocop
56
+ name: pry
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: sqlite3
70
+ name: rubocop
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: coffee-rails
84
+ name: sqlite3
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -106,11 +106,17 @@ files:
106
106
  - Rakefile
107
107
  - config/locales/de.yml
108
108
  - config/locales/en.yml
109
+ - config/locales/es.yml
109
110
  - config/locales/fr.yml
111
+ - config/locales/it.yml
110
112
  - config/locales/ja.yml
113
+ - config/locales/nl.yml
114
+ - config/locales/pl.yml
111
115
  - config/locales/pt-BR.yml
112
116
  - config/locales/ru.yml
117
+ - config/locales/tr.yml
113
118
  - config/locales/uk.yml
119
+ - config/locales/vi.yml
114
120
  - lib/active_storage_validations.rb
115
121
  - lib/active_storage_validations/aspect_ratio_validator.rb
116
122
  - lib/active_storage_validations/attached_validator.rb
@@ -147,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
153
  - !ruby/object:Gem::Version
148
154
  version: '0'
149
155
  requirements: []
150
- rubygems_version: 3.0.6
156
+ rubygems_version: 3.1.4
151
157
  signing_key:
152
158
  specification_version: 4
153
159
  summary: Validations for Active Storage