active_storage_validations 1.3.1 → 1.3.3
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 +5 -1
- data/lib/active_storage_validations/aspect_ratio_validator.rb +10 -10
- data/lib/active_storage_validations/attached_validator.rb +6 -6
- data/lib/active_storage_validations/base_size_validator.rb +8 -8
- data/lib/active_storage_validations/content_type_spoof_detector.rb +4 -4
- data/lib/active_storage_validations/content_type_validator.rb +27 -18
- data/lib/active_storage_validations/dimension_validator.rb +10 -10
- data/lib/active_storage_validations/limit_validator.rb +8 -8
- data/lib/active_storage_validations/marcel_extensor.rb +2 -0
- data/lib/active_storage_validations/matchers/aspect_ratio_validator_matcher.rb +14 -14
- data/lib/active_storage_validations/matchers/attached_validator_matcher.rb +12 -12
- data/lib/active_storage_validations/matchers/base_size_validator_matcher.rb +14 -14
- data/lib/active_storage_validations/matchers/content_type_validator_matcher.rb +40 -40
- data/lib/active_storage_validations/matchers/dimension_validator_matcher.rb +14 -14
- data/lib/active_storage_validations/matchers/limit_validator_matcher.rb +14 -14
- data/lib/active_storage_validations/matchers/processable_image_validator_matcher.rb +14 -14
- data/lib/active_storage_validations/matchers/{concerns/active_storageable.rb → shared/asv_active_storageable.rb} +4 -2
- data/lib/active_storage_validations/matchers/{concerns/allow_blankable.rb → shared/asv_allow_blankable.rb} +4 -2
- data/lib/active_storage_validations/matchers/{concerns/attachable.rb → shared/asv_attachable.rb} +7 -1
- data/lib/active_storage_validations/matchers/{concerns/contextable.rb → shared/asv_contextable.rb} +4 -2
- data/lib/active_storage_validations/matchers/{concerns/messageable.rb → shared/asv_messageable.rb} +4 -2
- data/lib/active_storage_validations/matchers/{concerns/rspecable.rb → shared/asv_rspecable.rb} +4 -2
- data/lib/active_storage_validations/matchers/{concerns/validatable.rb → shared/asv_validatable.rb} +4 -2
- data/lib/active_storage_validations/metadata.rb +2 -2
- data/lib/active_storage_validations/processable_image_validator.rb +8 -8
- data/lib/active_storage_validations/{concerns/active_storageable.rb → shared/asv_active_storageable.rb} +4 -2
- data/lib/active_storage_validations/{concerns/attachable.rb → shared/asv_attachable.rb} +4 -2
- data/lib/active_storage_validations/{concerns/errorable.rb → shared/asv_errorable.rb} +3 -1
- data/lib/active_storage_validations/{concerns/loggable.rb → shared/asv_loggable.rb} +3 -1
- data/lib/active_storage_validations/{concerns/optionable.rb → shared/asv_optionable.rb} +4 -2
- data/lib/active_storage_validations/{concerns/symbolizable.rb → shared/asv_symbolizable.rb} +3 -1
- data/lib/active_storage_validations/size_validator.rb +1 -1
- data/lib/active_storage_validations/total_size_validator.rb +1 -1
- data/lib/active_storage_validations/version.rb +1 -1
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5908eeb81003dac14877a0427050b3db222977413379a2c55382676272115e4
|
4
|
+
data.tar.gz: 5a49abac59e29c7ba055284fd437a8c1872f9e200c0b7491c613dae8f5152438
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b46c3457c3042e514e9401eb011d2c9bfd880ff3c42d38595b3e33010b95f57e5310bffbbc6af350aacbb55accf3f60cd33b3f7333ee33fceed105aac4e49d64
|
7
|
+
data.tar.gz: bebee3a79850fa031e4f8cbdd8d16aec5212e3214d17da6f38f72feb4713320f1ba2b351ba331ac155e0aa637632a50781d36749983aa643fa5f9591ba4a86ea
|
data/README.md
CHANGED
@@ -221,7 +221,8 @@ aspect_ratio_is_not: "must be a %{aspect_ratio} image"
|
|
221
221
|
|
222
222
|
### Content type
|
223
223
|
The `content_type_invalid` key has three variables that you can use:
|
224
|
-
- `content_type` containing the content type of the sent file
|
224
|
+
- `content_type` containing the exact content type of the sent file
|
225
|
+
- `human_content_type` containing a more user-friendly version of the sent file content type (e.g. 'TXT' for 'text/plain')
|
225
226
|
- `authorized_types` containing the list of authorized content types
|
226
227
|
- `filename` containing the current file name
|
227
228
|
|
@@ -436,6 +437,7 @@ Then you can use the matchers with the syntax specified in the RSpec section, ju
|
|
436
437
|
|
437
438
|
To run tests in root folder of gem:
|
438
439
|
|
440
|
+
* `BUNDLE_GEMFILE=gemfiles/rails_6_1_4.gemfile bundle exec rake test` to run for Rails 7.0
|
439
441
|
* `BUNDLE_GEMFILE=gemfiles/rails_7_0.gemfile bundle exec rake test` to run for Rails 7.0
|
440
442
|
* `BUNDLE_GEMFILE=gemfiles/rails_7_1.gemfile bundle exec rake test` to run for Rails 7.1
|
441
443
|
* `BUNDLE_GEMFILE=gemfiles/rails_7_2.gemfile bundle exec rake test` to run for Rails 7.2
|
@@ -444,10 +446,12 @@ To run tests in root folder of gem:
|
|
444
446
|
Snippet to run in console:
|
445
447
|
|
446
448
|
```bash
|
449
|
+
BUNDLE_GEMFILE=gemfiles/rails_6_1_4.gemfile bundle
|
447
450
|
BUNDLE_GEMFILE=gemfiles/rails_7_0.gemfile bundle
|
448
451
|
BUNDLE_GEMFILE=gemfiles/rails_7_1.gemfile bundle
|
449
452
|
BUNDLE_GEMFILE=gemfiles/rails_7_2.gemfile bundle
|
450
453
|
BUNDLE_GEMFILE=gemfiles/rails_8_0.gemfile bundle
|
454
|
+
BUNDLE_GEMFILE=gemfiles/rails_6_1_4.gemfile bundle exec rake test
|
451
455
|
BUNDLE_GEMFILE=gemfiles/rails_7_0.gemfile bundle exec rake test
|
452
456
|
BUNDLE_GEMFILE=gemfiles/rails_7_1.gemfile bundle exec rake test
|
453
457
|
BUNDLE_GEMFILE=gemfiles/rails_7_2.gemfile bundle exec rake test
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_attachable'
|
5
|
+
require_relative 'shared/asv_errorable'
|
6
|
+
require_relative 'shared/asv_optionable'
|
7
|
+
require_relative 'shared/asv_symbolizable'
|
8
8
|
|
9
9
|
module ActiveStorageValidations
|
10
10
|
class AspectRatioValidator < ActiveModel::EachValidator # :nodoc
|
11
|
-
include
|
12
|
-
include
|
13
|
-
include
|
14
|
-
include
|
15
|
-
include
|
11
|
+
include ASVActiveStorageable
|
12
|
+
include ASVAttachable
|
13
|
+
include ASVErrorable
|
14
|
+
include ASVOptionable
|
15
|
+
include ASVSymbolizable
|
16
16
|
|
17
17
|
AVAILABLE_CHECKS = %i[with].freeze
|
18
18
|
NAMED_ASPECT_RATIOS = %i[square portrait landscape].freeze
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_errorable'
|
5
|
+
require_relative 'shared/asv_symbolizable'
|
6
6
|
|
7
7
|
module ActiveStorageValidations
|
8
8
|
class AttachedValidator < ActiveModel::EachValidator # :nodoc:
|
9
|
-
include
|
10
|
-
include
|
11
|
-
include
|
9
|
+
include ASVActiveStorageable
|
10
|
+
include ASVErrorable
|
11
|
+
include ASVSymbolizable
|
12
12
|
|
13
13
|
ERROR_TYPES = %i[blank].freeze
|
14
14
|
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_errorable'
|
5
|
+
require_relative 'shared/asv_optionable'
|
6
|
+
require_relative 'shared/asv_symbolizable'
|
7
7
|
|
8
8
|
module ActiveStorageValidations
|
9
9
|
class BaseSizeValidator < ActiveModel::EachValidator # :nodoc:
|
10
|
-
include
|
11
|
-
include
|
12
|
-
include
|
13
|
-
include
|
10
|
+
include ASVActiveStorageable
|
11
|
+
include ASVErrorable
|
12
|
+
include ASVOptionable
|
13
|
+
include ASVSymbolizable
|
14
14
|
|
15
15
|
delegate :number_to_human_size, to: ActiveSupport::NumberHelper
|
16
16
|
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_attachable'
|
4
|
+
require_relative 'shared/asv_loggable'
|
5
5
|
require 'open3'
|
6
6
|
|
7
7
|
module ActiveStorageValidations
|
8
8
|
class ContentTypeSpoofDetector
|
9
9
|
class FileCommandLineToolNotInstalledError < StandardError; end
|
10
10
|
|
11
|
-
include
|
12
|
-
include
|
11
|
+
include ASVAttachable
|
12
|
+
include ASVLoggable
|
13
13
|
|
14
14
|
def initialize(record, attribute, attachable)
|
15
15
|
@record = record
|
@@ -1,19 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative 'content_type_spoof_detector
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_attachable'
|
5
|
+
require_relative 'shared/asv_errorable'
|
6
|
+
require_relative 'shared/asv_optionable'
|
7
|
+
require_relative 'shared/asv_symbolizable'
|
8
|
+
require_relative 'content_type_spoof_detector'
|
9
9
|
|
10
10
|
module ActiveStorageValidations
|
11
11
|
class ContentTypeValidator < ActiveModel::EachValidator # :nodoc:
|
12
|
-
include
|
13
|
-
include
|
14
|
-
include
|
15
|
-
include
|
16
|
-
include
|
12
|
+
include ASVActiveStorageable
|
13
|
+
include ASVAttachable
|
14
|
+
include ASVErrorable
|
15
|
+
include ASVOptionable
|
16
|
+
include ASVSymbolizable
|
17
17
|
|
18
18
|
AVAILABLE_CHECKS = %i[with in].freeze
|
19
19
|
ERROR_TYPES = %i[
|
@@ -63,10 +63,11 @@ module ActiveStorageValidations
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def extension_matches_content_type?(record, attribute, attachable)
|
66
|
-
|
66
|
+
return true if !@attachable_filename || !@attachable_content_type
|
67
67
|
|
68
|
+
extension = @attachable_filename.split('.').last
|
68
69
|
possible_extensions = Marcel::TYPE_EXTS[@attachable_content_type]
|
69
|
-
return true if possible_extensions && extension.in?(possible_extensions)
|
70
|
+
return true if possible_extensions && extension.downcase.in?(possible_extensions)
|
70
71
|
|
71
72
|
errors_options = initialize_and_populate_error_options(options, attachable)
|
72
73
|
add_error(record, attribute, ERROR_TYPES.first, **errors_options)
|
@@ -111,15 +112,23 @@ module ActiveStorageValidations
|
|
111
112
|
def initialize_and_populate_error_options(options, attachable)
|
112
113
|
errors_options = initialize_error_options(options, attachable)
|
113
114
|
errors_options[:content_type] = @attachable_content_type
|
114
|
-
errors_options[:
|
115
|
+
errors_options[:human_content_type] = content_type_to_human_format(@attachable_content_type)
|
116
|
+
errors_options[:authorized_types] = content_type_to_human_format(@authorized_content_types)
|
115
117
|
errors_options
|
116
118
|
end
|
117
119
|
|
118
|
-
def
|
119
|
-
|
120
|
-
.map do |
|
121
|
-
|
120
|
+
def content_type_to_human_format(content_type)
|
121
|
+
Array(content_type)
|
122
|
+
.map do |content_type|
|
123
|
+
case content_type
|
124
|
+
when String, Symbol
|
125
|
+
content_type.to_s.match?(/\//) ? Marcel::TYPE_EXTS[content_type.to_s]&.first&.upcase : content_type.upcase
|
126
|
+
when Regexp
|
127
|
+
content_type.source
|
128
|
+
end
|
122
129
|
end
|
130
|
+
.flatten
|
131
|
+
.compact
|
123
132
|
.join(', ')
|
124
133
|
end
|
125
134
|
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_attachable'
|
5
|
+
require_relative 'shared/asv_errorable'
|
6
|
+
require_relative 'shared/asv_optionable'
|
7
|
+
require_relative 'shared/asv_symbolizable'
|
8
8
|
|
9
9
|
module ActiveStorageValidations
|
10
10
|
class DimensionValidator < ActiveModel::EachValidator # :nodoc
|
11
|
-
include
|
12
|
-
include
|
13
|
-
include
|
14
|
-
include
|
15
|
-
include
|
11
|
+
include ASVActiveStorageable
|
12
|
+
include ASVAttachable
|
13
|
+
include ASVErrorable
|
14
|
+
include ASVOptionable
|
15
|
+
include ASVSymbolizable
|
16
16
|
|
17
17
|
AVAILABLE_CHECKS = %i[width height min max].freeze
|
18
18
|
ERROR_TYPES = %i[
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_errorable'
|
5
|
+
require_relative 'shared/asv_optionable'
|
6
|
+
require_relative 'shared/asv_symbolizable'
|
7
7
|
|
8
8
|
module ActiveStorageValidations
|
9
9
|
class LimitValidator < ActiveModel::EachValidator # :nodoc:
|
10
|
-
include
|
11
|
-
include
|
12
|
-
include
|
13
|
-
include
|
10
|
+
include ASVActiveStorageable
|
11
|
+
include ASVErrorable
|
12
|
+
include ASVOptionable
|
13
|
+
include ASVSymbolizable
|
14
14
|
|
15
15
|
AVAILABLE_CHECKS = %i[max min].freeze
|
16
16
|
ERROR_TYPES = %i[
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
9
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_allow_blankable'
|
5
|
+
require_relative 'shared/asv_attachable'
|
6
|
+
require_relative 'shared/asv_contextable'
|
7
|
+
require_relative 'shared/asv_messageable'
|
8
|
+
require_relative 'shared/asv_rspecable'
|
9
|
+
require_relative 'shared/asv_validatable'
|
10
10
|
|
11
11
|
module ActiveStorageValidations
|
12
12
|
module Matchers
|
@@ -15,13 +15,13 @@ module ActiveStorageValidations
|
|
15
15
|
end
|
16
16
|
|
17
17
|
class AspectRatioValidatorMatcher
|
18
|
-
include
|
19
|
-
include
|
20
|
-
include
|
21
|
-
include
|
22
|
-
include
|
23
|
-
include
|
24
|
-
include
|
18
|
+
include ASVActiveStorageable
|
19
|
+
include ASVAllowBlankable
|
20
|
+
include ASVAttachable
|
21
|
+
include ASVContextable
|
22
|
+
include ASVMessageable
|
23
|
+
include ASVRspecable
|
24
|
+
include ASVValidatable
|
25
25
|
|
26
26
|
def initialize(attribute_name)
|
27
27
|
initialize_allow_blankable
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_attachable'
|
5
|
+
require_relative 'shared/asv_contextable'
|
6
|
+
require_relative 'shared/asv_messageable'
|
7
|
+
require_relative 'shared/asv_rspecable'
|
8
|
+
require_relative 'shared/asv_validatable'
|
9
9
|
|
10
10
|
module ActiveStorageValidations
|
11
11
|
module Matchers
|
@@ -14,12 +14,12 @@ module ActiveStorageValidations
|
|
14
14
|
end
|
15
15
|
|
16
16
|
class AttachedValidatorMatcher
|
17
|
-
include
|
18
|
-
include
|
19
|
-
include
|
20
|
-
include
|
21
|
-
include
|
22
|
-
include
|
17
|
+
include ASVActiveStorageable
|
18
|
+
include ASVAttachable
|
19
|
+
include ASVContextable
|
20
|
+
include ASVMessageable
|
21
|
+
include ASVRspecable
|
22
|
+
include ASVValidatable
|
23
23
|
|
24
24
|
def initialize(attribute_name)
|
25
25
|
initialize_contextable
|
@@ -3,26 +3,26 @@
|
|
3
3
|
# Big thank you to the paperclip validation matchers:
|
4
4
|
# https://github.com/thoughtbot/paperclip/blob/v6.1.0/lib/paperclip/matchers/validate_attachment_size_matcher.rb
|
5
5
|
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
9
|
-
require_relative '
|
10
|
-
require_relative '
|
11
|
-
require_relative '
|
12
|
-
require_relative '
|
6
|
+
require_relative 'shared/asv_active_storageable'
|
7
|
+
require_relative 'shared/asv_allow_blankable'
|
8
|
+
require_relative 'shared/asv_attachable'
|
9
|
+
require_relative 'shared/asv_contextable'
|
10
|
+
require_relative 'shared/asv_messageable'
|
11
|
+
require_relative 'shared/asv_rspecable'
|
12
|
+
require_relative 'shared/asv_validatable'
|
13
13
|
|
14
14
|
module ActiveStorageValidations
|
15
15
|
module Matchers
|
16
16
|
class BaseSizeValidatorMatcher
|
17
17
|
# BaseSizeValidatorMatcher is an abstract class and shouldn't be instantiated directly.
|
18
18
|
|
19
|
-
include
|
20
|
-
include
|
21
|
-
include
|
22
|
-
include
|
23
|
-
include
|
24
|
-
include
|
25
|
-
include
|
19
|
+
include ASVActiveStorageable
|
20
|
+
include ASVAllowBlankable
|
21
|
+
include ASVAttachable
|
22
|
+
include ASVContextable
|
23
|
+
include ASVMessageable
|
24
|
+
include ASVRspecable
|
25
|
+
include ASVValidatable
|
26
26
|
|
27
27
|
def initialize(attribute_name)
|
28
28
|
initialize_allow_blankable
|
@@ -3,13 +3,13 @@
|
|
3
3
|
# Big thank you to the paperclip validation matchers:
|
4
4
|
# https://github.com/thoughtbot/paperclip/blob/v6.1.0/lib/paperclip/matchers/validate_attachment_content_type_matcher.rb
|
5
5
|
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
9
|
-
require_relative '
|
10
|
-
require_relative '
|
11
|
-
require_relative '
|
12
|
-
require_relative '
|
6
|
+
require_relative 'shared/asv_active_storageable'
|
7
|
+
require_relative 'shared/asv_allow_blankable'
|
8
|
+
require_relative 'shared/asv_attachable'
|
9
|
+
require_relative 'shared/asv_contextable'
|
10
|
+
require_relative 'shared/asv_messageable'
|
11
|
+
require_relative 'shared/asv_rspecable'
|
12
|
+
require_relative 'shared/asv_validatable'
|
13
13
|
|
14
14
|
module ActiveStorageValidations
|
15
15
|
module Matchers
|
@@ -18,13 +18,13 @@ module ActiveStorageValidations
|
|
18
18
|
end
|
19
19
|
|
20
20
|
class ContentTypeValidatorMatcher
|
21
|
-
include
|
22
|
-
include
|
23
|
-
include
|
24
|
-
include
|
25
|
-
include
|
26
|
-
include
|
27
|
-
include
|
21
|
+
include ASVActiveStorageable
|
22
|
+
include ASVAllowBlankable
|
23
|
+
include ASVAttachable
|
24
|
+
include ASVContextable
|
25
|
+
include ASVMessageable
|
26
|
+
include ASVRspecable
|
27
|
+
include ASVValidatable
|
28
28
|
|
29
29
|
def initialize(attribute_name)
|
30
30
|
initialize_allow_blankable
|
@@ -32,7 +32,7 @@ module ActiveStorageValidations
|
|
32
32
|
initialize_messageable
|
33
33
|
initialize_rspecable
|
34
34
|
@attribute_name = attribute_name
|
35
|
-
@
|
35
|
+
@allowed_content_types = @rejected_content_types = []
|
36
36
|
end
|
37
37
|
|
38
38
|
def description
|
@@ -45,13 +45,13 @@ module ActiveStorageValidations
|
|
45
45
|
message.join("\n")
|
46
46
|
end
|
47
47
|
|
48
|
-
def allowing(*
|
49
|
-
@
|
48
|
+
def allowing(*content_types)
|
49
|
+
@allowed_content_types = content_types.flatten
|
50
50
|
self
|
51
51
|
end
|
52
52
|
|
53
|
-
def rejecting(*
|
54
|
-
@
|
53
|
+
def rejecting(*content_types)
|
54
|
+
@rejected_content_types = content_types.flatten
|
55
55
|
self
|
56
56
|
end
|
57
57
|
|
@@ -62,21 +62,21 @@ module ActiveStorageValidations
|
|
62
62
|
is_context_valid? &&
|
63
63
|
is_allowing_blank? &&
|
64
64
|
is_custom_message_valid? &&
|
65
|
-
|
66
|
-
|
65
|
+
all_allowed_content_types_allowed? &&
|
66
|
+
all_rejected_content_types_rejected?
|
67
67
|
end
|
68
68
|
|
69
69
|
protected
|
70
70
|
|
71
71
|
def build_failure_message(message)
|
72
|
-
if @
|
73
|
-
message << " the following content type#{'s' if @
|
74
|
-
message << " but #{pluralize(@
|
72
|
+
if @allowed_content_types_not_allowed.present?
|
73
|
+
message << " the following content type#{'s' if @allowed_content_types.count > 1} should be allowed: :#{@allowed_content_types.join(", :")}"
|
74
|
+
message << " but #{pluralize(@allowed_content_types_not_allowed)} rejected"
|
75
75
|
end
|
76
76
|
|
77
|
-
if @
|
78
|
-
message << " the following content type#{'s' if @
|
79
|
-
message << " but #{pluralize(@
|
77
|
+
if @rejected_content_types_not_rejected.present?
|
78
|
+
message << " the following content type#{'s' if @rejected_content_types.count > 1} should be rejected: :#{@rejected_content_types.join(", :")}"
|
79
|
+
message << " but #{pluralize(@rejected_content_types_not_rejected)} accepted"
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -88,25 +88,25 @@ module ActiveStorageValidations
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
-
def
|
92
|
-
@
|
93
|
-
@
|
91
|
+
def all_allowed_content_types_allowed?
|
92
|
+
@allowed_content_types_not_allowed ||= @allowed_content_types.reject { |type| type_allowed?(type) }
|
93
|
+
@allowed_content_types_not_allowed.empty?
|
94
94
|
end
|
95
95
|
|
96
|
-
def
|
97
|
-
@
|
98
|
-
@
|
96
|
+
def all_rejected_content_types_rejected?
|
97
|
+
@rejected_content_types_not_rejected ||= @rejected_content_types.select { |type| type_allowed?(type) }
|
98
|
+
@rejected_content_types_not_rejected.empty?
|
99
99
|
end
|
100
100
|
|
101
|
-
def type_allowed?(
|
102
|
-
|
101
|
+
def type_allowed?(content_type)
|
102
|
+
attach_file_with_content_type(content_type)
|
103
103
|
validate
|
104
104
|
detach_file
|
105
105
|
is_valid?
|
106
106
|
end
|
107
107
|
|
108
|
-
def
|
109
|
-
@subject.public_send(@attribute_name).attach(attachment_for(
|
108
|
+
def attach_file_with_content_type(content_type)
|
109
|
+
@subject.public_send(@attribute_name).attach(attachment_for(content_type))
|
110
110
|
end
|
111
111
|
|
112
112
|
def is_custom_message_valid?
|
@@ -121,13 +121,13 @@ module ActiveStorageValidations
|
|
121
121
|
@subject.public_send(@attribute_name).attach(attachment_for('fake/fake'))
|
122
122
|
end
|
123
123
|
|
124
|
-
def attachment_for(
|
125
|
-
suffix =
|
124
|
+
def attachment_for(content_type)
|
125
|
+
suffix = Marcel::TYPE_EXTS[content_type.to_s]&.first || 'fake'
|
126
126
|
|
127
127
|
{
|
128
128
|
io: Tempfile.new('.'),
|
129
129
|
filename: "test.#{suffix}",
|
130
|
-
content_type:
|
130
|
+
content_type: content_type
|
131
131
|
}
|
132
132
|
end
|
133
133
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
9
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_allow_blankable'
|
5
|
+
require_relative 'shared/asv_attachable'
|
6
|
+
require_relative 'shared/asv_contextable'
|
7
|
+
require_relative 'shared/asv_messageable'
|
8
|
+
require_relative 'shared/asv_rspecable'
|
9
|
+
require_relative 'shared/asv_validatable'
|
10
10
|
|
11
11
|
module ActiveStorageValidations
|
12
12
|
module Matchers
|
@@ -15,13 +15,13 @@ module ActiveStorageValidations
|
|
15
15
|
end
|
16
16
|
|
17
17
|
class DimensionValidatorMatcher
|
18
|
-
include
|
19
|
-
include
|
20
|
-
include
|
21
|
-
include
|
22
|
-
include
|
23
|
-
include
|
24
|
-
include
|
18
|
+
include ASVActiveStorageable
|
19
|
+
include ASVAllowBlankable
|
20
|
+
include ASVAttachable
|
21
|
+
include ASVContextable
|
22
|
+
include ASVMessageable
|
23
|
+
include ASVRspecable
|
24
|
+
include ASVValidatable
|
25
25
|
|
26
26
|
def initialize(attribute_name)
|
27
27
|
initialize_allow_blankable
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
9
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_allow_blankable'
|
5
|
+
require_relative 'shared/asv_attachable'
|
6
|
+
require_relative 'shared/asv_contextable'
|
7
|
+
require_relative 'shared/asv_messageable'
|
8
|
+
require_relative 'shared/asv_rspecable'
|
9
|
+
require_relative 'shared/asv_validatable'
|
10
10
|
|
11
11
|
module ActiveStorageValidations
|
12
12
|
module Matchers
|
@@ -15,13 +15,13 @@ module ActiveStorageValidations
|
|
15
15
|
end
|
16
16
|
|
17
17
|
class LimitValidatorMatcher
|
18
|
-
include
|
19
|
-
include
|
20
|
-
include
|
21
|
-
include
|
22
|
-
include
|
23
|
-
include
|
24
|
-
include
|
18
|
+
include ASVActiveStorageable
|
19
|
+
include ASVAllowBlankable
|
20
|
+
include ASVAttachable
|
21
|
+
include ASVContextable
|
22
|
+
include ASVMessageable
|
23
|
+
include ASVRspecable
|
24
|
+
include ASVValidatable
|
25
25
|
|
26
26
|
def initialize(attribute_name)
|
27
27
|
initialize_allow_blankable
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
9
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_allow_blankable'
|
5
|
+
require_relative 'shared/asv_attachable'
|
6
|
+
require_relative 'shared/asv_contextable'
|
7
|
+
require_relative 'shared/asv_messageable'
|
8
|
+
require_relative 'shared/asv_rspecable'
|
9
|
+
require_relative 'shared/asv_validatable'
|
10
10
|
|
11
11
|
module ActiveStorageValidations
|
12
12
|
module Matchers
|
@@ -15,13 +15,13 @@ module ActiveStorageValidations
|
|
15
15
|
end
|
16
16
|
|
17
17
|
class ProcessableImageValidatorMatcher
|
18
|
-
include
|
19
|
-
include
|
20
|
-
include
|
21
|
-
include
|
22
|
-
include
|
23
|
-
include
|
24
|
-
include
|
18
|
+
include ASVActiveStorageable
|
19
|
+
include ASVAllowBlankable
|
20
|
+
include ASVAttachable
|
21
|
+
include ASVContextable
|
22
|
+
include ASVMessageable
|
23
|
+
include ASVRspecable
|
24
|
+
include ASVValidatable
|
25
25
|
|
26
26
|
def initialize(attribute_name)
|
27
27
|
initialize_allow_blankable
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/concern'
|
2
4
|
|
3
5
|
module ActiveStorageValidations
|
4
6
|
module Matchers
|
5
|
-
module
|
7
|
+
module ASVActiveStorageable
|
6
8
|
extend ActiveSupport::Concern
|
7
9
|
|
8
10
|
private
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/concern'
|
2
4
|
|
3
5
|
module ActiveStorageValidations
|
4
6
|
module Matchers
|
5
|
-
module
|
7
|
+
module ASVAllowBlankable
|
6
8
|
extend ActiveSupport::Concern
|
7
9
|
|
8
10
|
def initialize_allow_blankable
|
data/lib/active_storage_validations/matchers/{concerns/contextable.rb → shared/asv_contextable.rb}
RENAMED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/concern'
|
2
4
|
|
3
5
|
module ActiveStorageValidations
|
4
6
|
module Matchers
|
5
|
-
module
|
7
|
+
module ASVContextable
|
6
8
|
extend ActiveSupport::Concern
|
7
9
|
|
8
10
|
def initialize_contextable
|
data/lib/active_storage_validations/matchers/{concerns/messageable.rb → shared/asv_messageable.rb}
RENAMED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/concern'
|
2
4
|
|
3
5
|
module ActiveStorageValidations
|
4
6
|
module Matchers
|
5
|
-
module
|
7
|
+
module ASVMessageable
|
6
8
|
extend ActiveSupport::Concern
|
7
9
|
|
8
10
|
def initialize_messageable
|
data/lib/active_storage_validations/matchers/{concerns/rspecable.rb → shared/asv_rspecable.rb}
RENAMED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/concern'
|
2
4
|
|
3
5
|
module ActiveStorageValidations
|
4
6
|
module Matchers
|
5
|
-
module
|
7
|
+
module ASVRspecable
|
6
8
|
extend ActiveSupport::Concern
|
7
9
|
|
8
10
|
def initialize_rspecable
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_loggable'
|
4
4
|
|
5
5
|
module ActiveStorageValidations
|
6
6
|
class Metadata
|
7
|
-
include
|
7
|
+
include ASVLoggable
|
8
8
|
|
9
9
|
class InvalidImageError < StandardError; end
|
10
10
|
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
3
|
+
require_relative 'shared/asv_active_storageable'
|
4
|
+
require_relative 'shared/asv_attachable'
|
5
|
+
require_relative 'shared/asv_errorable'
|
6
|
+
require_relative 'shared/asv_symbolizable'
|
7
7
|
|
8
8
|
module ActiveStorageValidations
|
9
9
|
class ProcessableImageValidator < ActiveModel::EachValidator # :nodoc
|
10
|
-
include
|
11
|
-
include
|
12
|
-
include
|
13
|
-
include
|
10
|
+
include ASVActiveStorageable
|
11
|
+
include ASVAttachable
|
12
|
+
include ASVErrorable
|
13
|
+
include ASVSymbolizable
|
14
14
|
|
15
15
|
ERROR_TYPES = %i[
|
16
16
|
image_not_processable
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveStorageValidations
|
2
|
-
# ActiveStorageValidations::
|
4
|
+
# ActiveStorageValidations::ASVActiveStorageable
|
3
5
|
#
|
4
6
|
# Validator helper methods to make our code more explicit.
|
5
|
-
module
|
7
|
+
module ASVActiveStorageable
|
6
8
|
extend ActiveSupport::Concern
|
7
9
|
|
8
10
|
private
|
@@ -1,14 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative "../metadata"
|
2
4
|
|
3
5
|
module ActiveStorageValidations
|
4
|
-
# ActiveStorageValidations::
|
6
|
+
# ActiveStorageValidations::ASVAttachable
|
5
7
|
#
|
6
8
|
# Validator methods for analyzing attachable.
|
7
9
|
#
|
8
10
|
# An attachable is a file representation such as ActiveStorage::Blob,
|
9
11
|
# ActionDispatch::Http::UploadedFile, Rack::Test::UploadedFile, Hash, String,
|
10
12
|
# File or Pathname
|
11
|
-
module
|
13
|
+
module ASVAttachable
|
12
14
|
extend ActiveSupport::Concern
|
13
15
|
|
14
16
|
private
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveStorageValidations
|
2
|
-
# ActiveStorageValidations::
|
4
|
+
# ActiveStorageValidations::ASVOptionable
|
3
5
|
#
|
4
6
|
# Helper method to flatten the validator options.
|
5
|
-
module
|
7
|
+
module ASVOptionable
|
6
8
|
extend ActiveSupport::Concern
|
7
9
|
|
8
10
|
private
|
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.3.
|
4
|
+
version: 1.3.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: 2024-11-
|
11
|
+
date: 2024-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activejob
|
@@ -262,12 +262,6 @@ files:
|
|
262
262
|
- lib/active_storage_validations/aspect_ratio_validator.rb
|
263
263
|
- lib/active_storage_validations/attached_validator.rb
|
264
264
|
- lib/active_storage_validations/base_size_validator.rb
|
265
|
-
- lib/active_storage_validations/concerns/active_storageable.rb
|
266
|
-
- lib/active_storage_validations/concerns/attachable.rb
|
267
|
-
- lib/active_storage_validations/concerns/errorable.rb
|
268
|
-
- lib/active_storage_validations/concerns/loggable.rb
|
269
|
-
- lib/active_storage_validations/concerns/optionable.rb
|
270
|
-
- lib/active_storage_validations/concerns/symbolizable.rb
|
271
265
|
- lib/active_storage_validations/content_type_spoof_detector.rb
|
272
266
|
- lib/active_storage_validations/content_type_validator.rb
|
273
267
|
- lib/active_storage_validations/dimension_validator.rb
|
@@ -278,22 +272,28 @@ files:
|
|
278
272
|
- lib/active_storage_validations/matchers/aspect_ratio_validator_matcher.rb
|
279
273
|
- lib/active_storage_validations/matchers/attached_validator_matcher.rb
|
280
274
|
- lib/active_storage_validations/matchers/base_size_validator_matcher.rb
|
281
|
-
- lib/active_storage_validations/matchers/concerns/active_storageable.rb
|
282
|
-
- lib/active_storage_validations/matchers/concerns/allow_blankable.rb
|
283
|
-
- lib/active_storage_validations/matchers/concerns/attachable.rb
|
284
|
-
- lib/active_storage_validations/matchers/concerns/contextable.rb
|
285
|
-
- lib/active_storage_validations/matchers/concerns/messageable.rb
|
286
|
-
- lib/active_storage_validations/matchers/concerns/rspecable.rb
|
287
|
-
- lib/active_storage_validations/matchers/concerns/validatable.rb
|
288
275
|
- lib/active_storage_validations/matchers/content_type_validator_matcher.rb
|
289
276
|
- lib/active_storage_validations/matchers/dimension_validator_matcher.rb
|
290
277
|
- lib/active_storage_validations/matchers/limit_validator_matcher.rb
|
291
278
|
- lib/active_storage_validations/matchers/processable_image_validator_matcher.rb
|
279
|
+
- lib/active_storage_validations/matchers/shared/asv_active_storageable.rb
|
280
|
+
- lib/active_storage_validations/matchers/shared/asv_allow_blankable.rb
|
281
|
+
- lib/active_storage_validations/matchers/shared/asv_attachable.rb
|
282
|
+
- lib/active_storage_validations/matchers/shared/asv_contextable.rb
|
283
|
+
- lib/active_storage_validations/matchers/shared/asv_messageable.rb
|
284
|
+
- lib/active_storage_validations/matchers/shared/asv_rspecable.rb
|
285
|
+
- lib/active_storage_validations/matchers/shared/asv_validatable.rb
|
292
286
|
- lib/active_storage_validations/matchers/size_validator_matcher.rb
|
293
287
|
- lib/active_storage_validations/matchers/total_size_validator_matcher.rb
|
294
288
|
- lib/active_storage_validations/metadata.rb
|
295
289
|
- lib/active_storage_validations/processable_image_validator.rb
|
296
290
|
- lib/active_storage_validations/railtie.rb
|
291
|
+
- lib/active_storage_validations/shared/asv_active_storageable.rb
|
292
|
+
- lib/active_storage_validations/shared/asv_attachable.rb
|
293
|
+
- lib/active_storage_validations/shared/asv_errorable.rb
|
294
|
+
- lib/active_storage_validations/shared/asv_loggable.rb
|
295
|
+
- lib/active_storage_validations/shared/asv_optionable.rb
|
296
|
+
- lib/active_storage_validations/shared/asv_symbolizable.rb
|
297
297
|
- lib/active_storage_validations/size_validator.rb
|
298
298
|
- lib/active_storage_validations/total_size_validator.rb
|
299
299
|
- lib/active_storage_validations/version.rb
|