shrine 2.19.4 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +485 -43
- data/LICENSE.txt +1 -1
- data/README.md +81 -977
- data/doc/advantages.md +231 -204
- data/doc/attacher.md +304 -153
- data/doc/carrierwave.md +297 -226
- data/doc/changing_derivatives.md +308 -0
- data/doc/changing_location.md +102 -21
- data/doc/changing_storage.md +110 -0
- data/doc/creating_persistence_plugins.md +132 -0
- data/doc/creating_plugins.md +43 -23
- data/doc/creating_storages.md +19 -5
- data/doc/design.md +147 -97
- data/doc/direct_s3.md +38 -28
- data/doc/external/articles.md +63 -0
- data/doc/external/extensions.md +53 -0
- data/doc/external/misc.md +32 -0
- data/doc/getting_started.md +1115 -0
- data/doc/metadata.md +190 -109
- data/doc/multiple_files.md +62 -34
- data/doc/paperclip.md +384 -262
- data/doc/plugins/activerecord.md +177 -46
- data/doc/plugins/add_metadata.md +139 -38
- data/doc/plugins/atomic_helpers.md +217 -0
- data/doc/plugins/backgrounding.md +156 -98
- data/doc/plugins/cached_attachment_data.md +7 -5
- data/doc/plugins/column.md +121 -0
- data/doc/plugins/data_uri.md +23 -22
- data/doc/plugins/default_storage.md +36 -10
- data/doc/plugins/default_url.md +30 -13
- data/doc/plugins/delete_raw.md +4 -2
- data/doc/plugins/derivation_endpoint.md +162 -101
- data/doc/plugins/derivatives.md +829 -0
- data/doc/plugins/determine_mime_type.md +4 -2
- data/doc/plugins/download_endpoint.md +64 -8
- data/doc/plugins/dynamic_storage.md +5 -3
- data/doc/plugins/entity.md +263 -0
- data/doc/plugins/form_assign.md +55 -0
- data/doc/plugins/included.md +31 -8
- data/doc/plugins/infer_extension.md +21 -10
- data/doc/plugins/instrumentation.md +38 -16
- data/doc/plugins/keep_files.md +14 -17
- data/doc/plugins/metadata_attributes.md +42 -13
- data/doc/plugins/mirroring.md +118 -0
- data/doc/plugins/model.md +210 -0
- data/doc/plugins/module_include.md +4 -2
- data/doc/plugins/multi_cache.md +24 -0
- data/doc/plugins/persistence.md +101 -0
- data/doc/plugins/presign_endpoint.md +9 -4
- data/doc/plugins/pretty_location.md +16 -3
- data/doc/plugins/processing.md +4 -2
- data/doc/plugins/rack_file.md +8 -2
- data/doc/plugins/rack_response.md +6 -2
- data/doc/plugins/recache.md +4 -2
- data/doc/plugins/refresh_metadata.md +49 -9
- data/doc/plugins/remote_url.md +84 -47
- data/doc/plugins/remove_attachment.md +27 -6
- data/doc/plugins/remove_invalid.md +21 -6
- data/doc/plugins/restore_cached_data.md +11 -3
- data/doc/plugins/sequel.md +159 -35
- data/doc/plugins/signature.md +16 -5
- data/doc/plugins/store_dimensions.md +14 -2
- data/doc/plugins/tempfile.md +4 -2
- data/doc/plugins/type_predicates.md +96 -0
- data/doc/plugins/upload_endpoint.md +13 -13
- data/doc/plugins/upload_options.md +6 -4
- data/doc/plugins/{default_url_options.md → url_options.md} +9 -7
- data/doc/plugins/validation.md +97 -0
- data/doc/plugins/validation_helpers.md +16 -13
- data/doc/plugins/versions.md +15 -19
- data/doc/processing.md +438 -221
- data/doc/refile.md +185 -167
- data/doc/release_notes/1.0.0.md +4 -0
- data/doc/release_notes/1.1.0.md +6 -2
- data/doc/release_notes/1.2.0.md +4 -0
- data/doc/release_notes/1.3.0.md +4 -0
- data/doc/release_notes/1.4.0.md +4 -0
- data/doc/release_notes/1.4.1.md +4 -0
- data/doc/release_notes/1.4.2.md +4 -0
- data/doc/release_notes/2.0.0.md +4 -0
- data/doc/release_notes/2.0.1.md +4 -0
- data/doc/release_notes/2.1.0.md +4 -0
- data/doc/release_notes/2.1.1.md +4 -0
- data/doc/release_notes/2.10.0.md +4 -0
- data/doc/release_notes/2.10.1.md +4 -0
- data/doc/release_notes/2.11.0.md +4 -0
- data/doc/release_notes/2.12.0.md +4 -0
- data/doc/release_notes/2.13.0.md +4 -0
- data/doc/release_notes/2.14.0.md +5 -1
- data/doc/release_notes/2.15.0.md +11 -7
- data/doc/release_notes/2.16.0.md +4 -0
- data/doc/release_notes/2.17.0.md +4 -0
- data/doc/release_notes/2.18.0.md +4 -0
- data/doc/release_notes/2.19.0.md +6 -3
- data/doc/release_notes/2.2.0.md +4 -0
- data/doc/release_notes/2.3.0.md +4 -0
- data/doc/release_notes/2.3.1.md +4 -0
- data/doc/release_notes/2.4.0.md +4 -0
- data/doc/release_notes/2.4.1.md +4 -0
- data/doc/release_notes/2.5.0.md +4 -0
- data/doc/release_notes/2.6.0.md +4 -0
- data/doc/release_notes/2.6.1.md +4 -0
- data/doc/release_notes/2.7.0.md +4 -0
- data/doc/release_notes/2.8.0.md +4 -0
- data/doc/release_notes/2.9.0.md +4 -0
- data/doc/release_notes/3.0.0.md +981 -0
- data/doc/release_notes/3.0.1.md +22 -0
- data/doc/release_notes/3.1.0.md +73 -0
- data/doc/release_notes/3.2.0.md +96 -0
- data/doc/release_notes/3.2.1.md +31 -0
- data/doc/release_notes/3.2.2.md +14 -0
- data/doc/release_notes/3.3.0.md +105 -0
- data/doc/release_notes/3.4.0.md +35 -0
- data/doc/retrieving_uploads.md +4 -1
- data/doc/securing_uploads.md +60 -37
- data/doc/storage/file_system.md +20 -3
- data/doc/storage/memory.md +19 -0
- data/doc/storage/s3.md +117 -83
- data/doc/testing.md +124 -144
- data/doc/upgrading_to_3.md +710 -0
- data/doc/validation.md +54 -90
- data/lib/shrine/attacher.rb +287 -171
- data/lib/shrine/attachment.rb +13 -46
- data/lib/shrine/plugins/_persistence.rb +93 -0
- data/lib/shrine/plugins/activerecord.rb +77 -34
- data/lib/shrine/plugins/add_metadata.rb +25 -17
- data/lib/shrine/plugins/atomic_helpers.rb +119 -0
- data/lib/shrine/plugins/backgrounding.rb +77 -113
- data/lib/shrine/plugins/cached_attachment_data.rb +6 -15
- data/lib/shrine/plugins/column.rb +102 -0
- data/lib/shrine/plugins/data_uri.rb +38 -36
- data/lib/shrine/plugins/default_storage.rb +45 -15
- data/lib/shrine/plugins/default_url.rb +12 -24
- data/lib/shrine/plugins/default_url_options.rb +3 -30
- data/lib/shrine/plugins/delete_raw.rb +10 -16
- data/lib/shrine/plugins/derivation_endpoint.rb +89 -134
- data/lib/shrine/plugins/derivatives.rb +637 -0
- data/lib/shrine/plugins/determine_mime_type.rb +9 -21
- data/lib/shrine/plugins/download_endpoint.rb +109 -133
- data/lib/shrine/plugins/dynamic_storage.rb +5 -11
- data/lib/shrine/plugins/entity.rb +152 -0
- data/lib/shrine/plugins/form_assign.rb +108 -0
- data/lib/shrine/plugins/included.rb +6 -6
- data/lib/shrine/plugins/infer_extension.rb +13 -20
- data/lib/shrine/plugins/instrumentation.rb +54 -42
- data/lib/shrine/plugins/keep_files.rb +3 -15
- data/lib/shrine/plugins/metadata_attributes.rb +28 -19
- data/lib/shrine/plugins/mirroring.rb +142 -0
- data/lib/shrine/plugins/model.rb +158 -0
- data/lib/shrine/plugins/module_include.rb +3 -3
- data/lib/shrine/plugins/multi_cache.rb +27 -0
- data/lib/shrine/plugins/presign_endpoint.rb +18 -22
- data/lib/shrine/plugins/pretty_location.rb +15 -9
- data/lib/shrine/plugins/processing.rb +22 -9
- data/lib/shrine/plugins/rack_file.rb +2 -42
- data/lib/shrine/plugins/rack_response.rb +15 -10
- data/lib/shrine/plugins/recache.rb +6 -5
- data/lib/shrine/plugins/refresh_metadata.rb +13 -11
- data/lib/shrine/plugins/remote_url.rb +49 -49
- data/lib/shrine/plugins/remove_attachment.rb +10 -6
- data/lib/shrine/plugins/remove_invalid.rb +19 -8
- data/lib/shrine/plugins/restore_cached_data.rb +13 -7
- data/lib/shrine/plugins/sequel.rb +86 -36
- data/lib/shrine/plugins/signature.rb +10 -16
- data/lib/shrine/plugins/store_dimensions.rb +35 -40
- data/lib/shrine/plugins/tempfile.rb +1 -3
- data/lib/shrine/plugins/type_predicates.rb +113 -0
- data/lib/shrine/plugins/upload_endpoint.rb +25 -23
- data/lib/shrine/plugins/upload_options.rb +14 -15
- data/lib/shrine/plugins/url_options.rb +31 -0
- data/lib/shrine/plugins/validation.rb +80 -0
- data/lib/shrine/plugins/validation_helpers.rb +34 -57
- data/lib/shrine/plugins/versions.rb +107 -87
- data/lib/shrine/plugins.rb +22 -0
- data/lib/shrine/storage/file_system.rb +46 -64
- data/lib/shrine/storage/linter.rb +42 -7
- data/lib/shrine/storage/memory.rb +49 -0
- data/lib/shrine/storage/s3.rb +154 -158
- data/lib/shrine/uploaded_file.rb +28 -30
- data/lib/shrine/version.rb +3 -3
- data/lib/shrine.rb +86 -149
- data/shrine.gemspec +9 -10
- metadata +79 -83
- data/doc/migrating_storage.md +0 -76
- data/doc/plugins/backup.md +0 -31
- data/doc/plugins/copy.md +0 -24
- data/doc/plugins/delete_promoted.md +0 -12
- data/doc/plugins/direct_upload.md +0 -172
- data/doc/plugins/hooks.md +0 -58
- data/doc/plugins/logging.md +0 -42
- data/doc/plugins/migration_helpers.md +0 -60
- data/doc/plugins/moving.md +0 -19
- data/doc/plugins/multi_delete.md +0 -20
- data/doc/plugins/parallelize.md +0 -16
- data/doc/plugins/parsed_json.md +0 -23
- data/doc/regenerating_versions.md +0 -143
- data/lib/shrine/plugins/background_helpers.rb +0 -5
- data/lib/shrine/plugins/backup.rb +0 -90
- data/lib/shrine/plugins/copy.rb +0 -50
- data/lib/shrine/plugins/delete_promoted.rb +0 -20
- data/lib/shrine/plugins/direct_upload.rb +0 -217
- data/lib/shrine/plugins/hooks.rb +0 -90
- data/lib/shrine/plugins/logging.rb +0 -142
- data/lib/shrine/plugins/migration_helpers.rb +0 -70
- data/lib/shrine/plugins/moving.rb +0 -57
- data/lib/shrine/plugins/multi_delete.rb +0 -32
- data/lib/shrine/plugins/parallelize.rb +0 -78
- data/lib/shrine/plugins/parsed_json.rb +0 -29
data/doc/validation.md
CHANGED
@@ -1,20 +1,25 @@
|
|
1
|
-
|
1
|
+
---
|
2
|
+
title: File Validation
|
3
|
+
---
|
2
4
|
|
3
|
-
Shrine allows validating assigned files
|
4
|
-
code is defined inside
|
5
|
+
Shrine allows validating assigned files using the [`validation`][validation]
|
6
|
+
plugin. Validation code is defined inside an `Attacher.validate` block:
|
5
7
|
|
8
|
+
```rb
|
9
|
+
Shrine.plugin :validation
|
10
|
+
```
|
6
11
|
```rb
|
7
12
|
class ImageUploader < Shrine
|
8
13
|
Attacher.validate do
|
9
|
-
#
|
14
|
+
# ... perform validation ...
|
10
15
|
end
|
11
16
|
end
|
12
17
|
```
|
13
18
|
|
14
|
-
The validation block is run when a file is assigned
|
15
|
-
|
16
|
-
|
17
|
-
|
19
|
+
The validation block is run when a new file is assigned, and any validation
|
20
|
+
errors are stored in `Shrine::Attacher#errors`. Persistence plugins like
|
21
|
+
`sequel` and `activerecord` will automatically merge these validation errors
|
22
|
+
into the `#errors` hash on the model instance.
|
18
23
|
|
19
24
|
```rb
|
20
25
|
photo = Photo.new
|
@@ -23,57 +28,20 @@ photo.valid? #=> false
|
|
23
28
|
photo.errors[:image] #=> [...]
|
24
29
|
```
|
25
30
|
|
26
|
-
|
27
|
-
but you can have it automatically removed and deleted by loading the
|
28
|
-
`remove_invalid` plugin.
|
29
|
-
|
30
|
-
```rb
|
31
|
-
Shrine.plugin :remove_invalid # remove and delete files that failed validation
|
32
|
-
```
|
33
|
-
|
34
|
-
The validation block is evaluated in the context of a `Shrine::Attacher`
|
35
|
-
instance, so you have access to the original file and the record:
|
36
|
-
|
37
|
-
```rb
|
38
|
-
class ImageUploader < Shrine
|
39
|
-
Attacher.validate do
|
40
|
-
self #=> #<Shrine::Attacher>
|
41
|
-
|
42
|
-
get #=> #<Shrine::UploadedFile>
|
43
|
-
record #=> #<Photo>
|
44
|
-
name #=> :image
|
45
|
-
end
|
46
|
-
end
|
47
|
-
```
|
31
|
+
## Validation helpers
|
48
32
|
|
49
|
-
|
50
|
-
for
|
33
|
+
The [`validation_helpers`][validation_helpers] plugin provides convenient
|
34
|
+
validators for built-in metadata:
|
51
35
|
|
52
36
|
```rb
|
53
|
-
|
37
|
+
Shrine.plugin :validation_helpers
|
54
38
|
```
|
55
39
|
```rb
|
56
40
|
class ImageUploader < Shrine
|
57
41
|
Attacher.validate do
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
```
|
62
|
-
|
63
|
-
## Validation helpers
|
64
|
-
|
65
|
-
The `validation_helpers` plugin provides helper methods for validating common
|
66
|
-
metadata values:
|
67
|
-
|
68
|
-
```rb
|
69
|
-
class ImageUploader < Shrine
|
70
|
-
plugin :validation_helpers
|
71
|
-
|
72
|
-
Attacher.validate do
|
73
|
-
validate_min_size 1, message: "must not be empty"
|
74
|
-
validate_max_size 5*1024*1024, message: "is too large (max is 5 MB)"
|
75
|
-
validate_mime_type_inclusion %w[image/jpeg image/png image/tiff]
|
76
|
-
validate_extension_inclusion %w[jpg jpeg png tiff tif]
|
42
|
+
validate_size 1..5*1024*1024
|
43
|
+
validate_mime_type %w[image/jpeg image/png image/webp image/tiff]
|
44
|
+
validate_extension %w[jpg jpeg png webp tiff tif]
|
77
45
|
end
|
78
46
|
end
|
79
47
|
```
|
@@ -81,47 +49,31 @@ end
|
|
81
49
|
Note that for secure MIME type validation it's recommended to also load
|
82
50
|
`determine_mime_type` and `restore_cached_data` plugins.
|
83
51
|
|
84
|
-
|
85
|
-
|
86
|
-
```rb
|
87
|
-
class ImageUploader < Shrine
|
88
|
-
plugin :validation_helpers
|
89
|
-
|
90
|
-
Attacher.validate do
|
91
|
-
# validate dimensions only of the attached file is an image
|
92
|
-
if validate_extension_inclusion %w[jpg jpeg png tiff tif]
|
93
|
-
validate_max_width 5000
|
94
|
-
validate_max_height 5000
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
```
|
99
|
-
|
100
|
-
See the `validation_helpers` plugin documentation for more details.
|
52
|
+
See the [`validation_helpers`][validation_helpers] plugin documentation for
|
53
|
+
more details.
|
101
54
|
|
102
55
|
## Custom validations
|
103
56
|
|
104
|
-
You
|
105
|
-
validation that the `validation_helpers` plugin does not provide. The
|
106
|
-
`Shrine::Attacher.validate` block is evaluated at instance level, so you're
|
107
|
-
free to write there any code you like and add validation errors onto the
|
108
|
-
`Shrine::Attacher#errors` array.
|
109
|
-
|
110
|
-
For example, if you're uploading images, you might want to validate that the
|
111
|
-
image is processable using the [ImageProcessing] gem:
|
57
|
+
You can also do your own custom validations:
|
112
58
|
|
113
59
|
```rb
|
114
|
-
|
60
|
+
# Gemfile
|
61
|
+
gem "streamio-ffmpeg"
|
62
|
+
```
|
63
|
+
```rb
|
64
|
+
require "streamio-ffmpeg"
|
115
65
|
|
116
|
-
class
|
117
|
-
plugin :
|
66
|
+
class VideoUploader < Shrine
|
67
|
+
plugin :add_metadata
|
68
|
+
|
69
|
+
add_metadata :duration do |io|
|
70
|
+
movie = Shrine.with_file(io) { |file| FFMPEG::Movie.new(file.path) }
|
71
|
+
movie.duration
|
72
|
+
end
|
118
73
|
|
119
74
|
Attacher.validate do
|
120
|
-
|
121
|
-
|
122
|
-
get.download do |tempfile|
|
123
|
-
errors << "is corrupted or invalid" unless ImageProcessing::MiniMagick.valid_image?(tempfile)
|
124
|
-
end
|
75
|
+
if file.duration > 5*60*60
|
76
|
+
errors << "duration must not be longer than 5 hours"
|
125
77
|
end
|
126
78
|
end
|
127
79
|
end
|
@@ -134,15 +86,27 @@ when defining more validations:
|
|
134
86
|
|
135
87
|
```rb
|
136
88
|
class ApplicationUploader < Shrine
|
137
|
-
Attacher.validate { validate_max_size 5
|
89
|
+
Attacher.validate { validate_max_size 5*1024*1024 }
|
138
90
|
end
|
139
|
-
|
91
|
+
```
|
92
|
+
```rb
|
140
93
|
class ImageUploader < ApplicationUploader
|
141
94
|
Attacher.validate do
|
142
|
-
super() # empty
|
143
|
-
|
95
|
+
super() # empty parentheses are required
|
96
|
+
validate_mime_type %w[image/jpeg image/png image/webp]
|
144
97
|
end
|
145
98
|
end
|
146
99
|
```
|
147
100
|
|
148
|
-
|
101
|
+
## Removing invalid files
|
102
|
+
|
103
|
+
By default, an invalid file will remain assigned after validation failed, but
|
104
|
+
you can have it automatically removed and deleted by loading the
|
105
|
+
`remove_invalid` plugin.
|
106
|
+
|
107
|
+
```rb
|
108
|
+
Shrine.plugin :remove_invalid # remove and delete files that failed validation
|
109
|
+
```
|
110
|
+
|
111
|
+
[validation]: https://shrinerb.com/docs/plugins/validation
|
112
|
+
[validation_helpers]: https://shrinerb.com/docs/plugins/validation_helpers
|