shrine 2.19.3 → 3.6.0
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/CHANGELOG.md +523 -41
- data/LICENSE.txt +1 -1
- data/README.md +83 -979
- 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 +103 -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 +1156 -0
- data/doc/metadata.md +190 -109
- data/doc/multiple_files.md +93 -30
- 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 +186 -101
- data/doc/plugins/derivatives.md +839 -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 +16 -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 +188 -170
- 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 +5 -1
- 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/release_notes/3.5.0.md +63 -0
- data/doc/release_notes/3.6.0.md +23 -0
- data/doc/retrieving_uploads.md +5 -2
- 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 +122 -78
- data/doc/testing.md +141 -133
- data/doc/upgrading_to_3.md +708 -0
- data/doc/validation.md +54 -90
- data/lib/shrine/attacher.rb +292 -169
- 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 +130 -171
- data/lib/shrine/plugins/derivatives.rb +645 -0
- data/lib/shrine/plugins/determine_mime_type.rb +9 -21
- data/lib/shrine/plugins/download_endpoint.rb +118 -133
- data/lib/shrine/plugins/dynamic_storage.rb +5 -11
- data/lib/shrine/plugins/entity.rb +158 -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 +17 -20
- data/lib/shrine/plugins/instrumentation.rb +59 -43
- 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 +160 -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 +27 -28
- 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 +21 -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 +12 -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 +28 -24
- 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 +35 -58
- 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 +173 -160
- data/lib/shrine/uploaded_file.rb +32 -32
- data/lib/shrine/version.rb +3 -3
- data/lib/shrine.rb +87 -150
- data/shrine.gemspec +11 -12
- metadata +92 -82
- 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
|