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.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +523 -41
  3. data/LICENSE.txt +1 -1
  4. data/README.md +83 -979
  5. data/doc/advantages.md +231 -204
  6. data/doc/attacher.md +304 -153
  7. data/doc/carrierwave.md +297 -226
  8. data/doc/changing_derivatives.md +308 -0
  9. data/doc/changing_location.md +103 -21
  10. data/doc/changing_storage.md +110 -0
  11. data/doc/creating_persistence_plugins.md +132 -0
  12. data/doc/creating_plugins.md +43 -23
  13. data/doc/creating_storages.md +19 -5
  14. data/doc/design.md +147 -97
  15. data/doc/direct_s3.md +38 -28
  16. data/doc/external/articles.md +63 -0
  17. data/doc/external/extensions.md +53 -0
  18. data/doc/external/misc.md +32 -0
  19. data/doc/getting_started.md +1156 -0
  20. data/doc/metadata.md +190 -109
  21. data/doc/multiple_files.md +93 -30
  22. data/doc/paperclip.md +384 -262
  23. data/doc/plugins/activerecord.md +177 -46
  24. data/doc/plugins/add_metadata.md +139 -38
  25. data/doc/plugins/atomic_helpers.md +217 -0
  26. data/doc/plugins/backgrounding.md +156 -98
  27. data/doc/plugins/cached_attachment_data.md +7 -5
  28. data/doc/plugins/column.md +121 -0
  29. data/doc/plugins/data_uri.md +23 -22
  30. data/doc/plugins/default_storage.md +36 -10
  31. data/doc/plugins/default_url.md +30 -13
  32. data/doc/plugins/delete_raw.md +4 -2
  33. data/doc/plugins/derivation_endpoint.md +186 -101
  34. data/doc/plugins/derivatives.md +839 -0
  35. data/doc/plugins/determine_mime_type.md +4 -2
  36. data/doc/plugins/download_endpoint.md +64 -8
  37. data/doc/plugins/dynamic_storage.md +5 -3
  38. data/doc/plugins/entity.md +263 -0
  39. data/doc/plugins/form_assign.md +55 -0
  40. data/doc/plugins/included.md +31 -8
  41. data/doc/plugins/infer_extension.md +21 -10
  42. data/doc/plugins/instrumentation.md +38 -16
  43. data/doc/plugins/keep_files.md +16 -17
  44. data/doc/plugins/metadata_attributes.md +42 -13
  45. data/doc/plugins/mirroring.md +118 -0
  46. data/doc/plugins/model.md +210 -0
  47. data/doc/plugins/module_include.md +4 -2
  48. data/doc/plugins/multi_cache.md +24 -0
  49. data/doc/plugins/persistence.md +101 -0
  50. data/doc/plugins/presign_endpoint.md +9 -4
  51. data/doc/plugins/pretty_location.md +16 -3
  52. data/doc/plugins/processing.md +4 -2
  53. data/doc/plugins/rack_file.md +8 -2
  54. data/doc/plugins/rack_response.md +6 -2
  55. data/doc/plugins/recache.md +4 -2
  56. data/doc/plugins/refresh_metadata.md +49 -9
  57. data/doc/plugins/remote_url.md +84 -47
  58. data/doc/plugins/remove_attachment.md +27 -6
  59. data/doc/plugins/remove_invalid.md +21 -6
  60. data/doc/plugins/restore_cached_data.md +11 -3
  61. data/doc/plugins/sequel.md +159 -35
  62. data/doc/plugins/signature.md +16 -5
  63. data/doc/plugins/store_dimensions.md +14 -2
  64. data/doc/plugins/tempfile.md +4 -2
  65. data/doc/plugins/type_predicates.md +96 -0
  66. data/doc/plugins/upload_endpoint.md +13 -13
  67. data/doc/plugins/upload_options.md +6 -4
  68. data/doc/plugins/{default_url_options.md → url_options.md} +9 -7
  69. data/doc/plugins/validation.md +97 -0
  70. data/doc/plugins/validation_helpers.md +16 -13
  71. data/doc/plugins/versions.md +15 -19
  72. data/doc/processing.md +438 -221
  73. data/doc/refile.md +188 -170
  74. data/doc/release_notes/1.0.0.md +4 -0
  75. data/doc/release_notes/1.1.0.md +6 -2
  76. data/doc/release_notes/1.2.0.md +4 -0
  77. data/doc/release_notes/1.3.0.md +4 -0
  78. data/doc/release_notes/1.4.0.md +4 -0
  79. data/doc/release_notes/1.4.1.md +4 -0
  80. data/doc/release_notes/1.4.2.md +4 -0
  81. data/doc/release_notes/2.0.0.md +4 -0
  82. data/doc/release_notes/2.0.1.md +4 -0
  83. data/doc/release_notes/2.1.0.md +5 -1
  84. data/doc/release_notes/2.1.1.md +4 -0
  85. data/doc/release_notes/2.10.0.md +4 -0
  86. data/doc/release_notes/2.10.1.md +4 -0
  87. data/doc/release_notes/2.11.0.md +4 -0
  88. data/doc/release_notes/2.12.0.md +4 -0
  89. data/doc/release_notes/2.13.0.md +4 -0
  90. data/doc/release_notes/2.14.0.md +5 -1
  91. data/doc/release_notes/2.15.0.md +11 -7
  92. data/doc/release_notes/2.16.0.md +4 -0
  93. data/doc/release_notes/2.17.0.md +4 -0
  94. data/doc/release_notes/2.18.0.md +4 -0
  95. data/doc/release_notes/2.19.0.md +6 -3
  96. data/doc/release_notes/2.2.0.md +4 -0
  97. data/doc/release_notes/2.3.0.md +4 -0
  98. data/doc/release_notes/2.3.1.md +4 -0
  99. data/doc/release_notes/2.4.0.md +4 -0
  100. data/doc/release_notes/2.4.1.md +4 -0
  101. data/doc/release_notes/2.5.0.md +4 -0
  102. data/doc/release_notes/2.6.0.md +4 -0
  103. data/doc/release_notes/2.6.1.md +4 -0
  104. data/doc/release_notes/2.7.0.md +4 -0
  105. data/doc/release_notes/2.8.0.md +4 -0
  106. data/doc/release_notes/2.9.0.md +4 -0
  107. data/doc/release_notes/3.0.0.md +981 -0
  108. data/doc/release_notes/3.0.1.md +22 -0
  109. data/doc/release_notes/3.1.0.md +73 -0
  110. data/doc/release_notes/3.2.0.md +96 -0
  111. data/doc/release_notes/3.2.1.md +31 -0
  112. data/doc/release_notes/3.2.2.md +14 -0
  113. data/doc/release_notes/3.3.0.md +105 -0
  114. data/doc/release_notes/3.4.0.md +35 -0
  115. data/doc/release_notes/3.5.0.md +63 -0
  116. data/doc/release_notes/3.6.0.md +23 -0
  117. data/doc/retrieving_uploads.md +5 -2
  118. data/doc/securing_uploads.md +60 -37
  119. data/doc/storage/file_system.md +20 -3
  120. data/doc/storage/memory.md +19 -0
  121. data/doc/storage/s3.md +122 -78
  122. data/doc/testing.md +141 -133
  123. data/doc/upgrading_to_3.md +708 -0
  124. data/doc/validation.md +54 -90
  125. data/lib/shrine/attacher.rb +292 -169
  126. data/lib/shrine/attachment.rb +13 -46
  127. data/lib/shrine/plugins/_persistence.rb +93 -0
  128. data/lib/shrine/plugins/activerecord.rb +77 -34
  129. data/lib/shrine/plugins/add_metadata.rb +25 -17
  130. data/lib/shrine/plugins/atomic_helpers.rb +119 -0
  131. data/lib/shrine/plugins/backgrounding.rb +77 -113
  132. data/lib/shrine/plugins/cached_attachment_data.rb +6 -15
  133. data/lib/shrine/plugins/column.rb +102 -0
  134. data/lib/shrine/plugins/data_uri.rb +38 -36
  135. data/lib/shrine/plugins/default_storage.rb +45 -15
  136. data/lib/shrine/plugins/default_url.rb +12 -24
  137. data/lib/shrine/plugins/default_url_options.rb +3 -30
  138. data/lib/shrine/plugins/delete_raw.rb +10 -16
  139. data/lib/shrine/plugins/derivation_endpoint.rb +130 -171
  140. data/lib/shrine/plugins/derivatives.rb +645 -0
  141. data/lib/shrine/plugins/determine_mime_type.rb +9 -21
  142. data/lib/shrine/plugins/download_endpoint.rb +118 -133
  143. data/lib/shrine/plugins/dynamic_storage.rb +5 -11
  144. data/lib/shrine/plugins/entity.rb +158 -0
  145. data/lib/shrine/plugins/form_assign.rb +108 -0
  146. data/lib/shrine/plugins/included.rb +6 -6
  147. data/lib/shrine/plugins/infer_extension.rb +17 -20
  148. data/lib/shrine/plugins/instrumentation.rb +59 -43
  149. data/lib/shrine/plugins/keep_files.rb +3 -15
  150. data/lib/shrine/plugins/metadata_attributes.rb +28 -19
  151. data/lib/shrine/plugins/mirroring.rb +142 -0
  152. data/lib/shrine/plugins/model.rb +160 -0
  153. data/lib/shrine/plugins/module_include.rb +3 -3
  154. data/lib/shrine/plugins/multi_cache.rb +27 -0
  155. data/lib/shrine/plugins/presign_endpoint.rb +27 -28
  156. data/lib/shrine/plugins/pretty_location.rb +15 -9
  157. data/lib/shrine/plugins/processing.rb +22 -9
  158. data/lib/shrine/plugins/rack_file.rb +2 -42
  159. data/lib/shrine/plugins/rack_response.rb +21 -10
  160. data/lib/shrine/plugins/recache.rb +6 -5
  161. data/lib/shrine/plugins/refresh_metadata.rb +13 -11
  162. data/lib/shrine/plugins/remote_url.rb +49 -49
  163. data/lib/shrine/plugins/remove_attachment.rb +12 -6
  164. data/lib/shrine/plugins/remove_invalid.rb +19 -8
  165. data/lib/shrine/plugins/restore_cached_data.rb +13 -7
  166. data/lib/shrine/plugins/sequel.rb +86 -36
  167. data/lib/shrine/plugins/signature.rb +10 -16
  168. data/lib/shrine/plugins/store_dimensions.rb +35 -40
  169. data/lib/shrine/plugins/tempfile.rb +1 -3
  170. data/lib/shrine/plugins/type_predicates.rb +113 -0
  171. data/lib/shrine/plugins/upload_endpoint.rb +28 -24
  172. data/lib/shrine/plugins/upload_options.rb +14 -15
  173. data/lib/shrine/plugins/url_options.rb +31 -0
  174. data/lib/shrine/plugins/validation.rb +80 -0
  175. data/lib/shrine/plugins/validation_helpers.rb +35 -58
  176. data/lib/shrine/plugins/versions.rb +107 -87
  177. data/lib/shrine/plugins.rb +22 -0
  178. data/lib/shrine/storage/file_system.rb +46 -64
  179. data/lib/shrine/storage/linter.rb +42 -7
  180. data/lib/shrine/storage/memory.rb +49 -0
  181. data/lib/shrine/storage/s3.rb +173 -160
  182. data/lib/shrine/uploaded_file.rb +32 -32
  183. data/lib/shrine/version.rb +3 -3
  184. data/lib/shrine.rb +87 -150
  185. data/shrine.gemspec +11 -12
  186. metadata +92 -82
  187. data/doc/migrating_storage.md +0 -76
  188. data/doc/plugins/backup.md +0 -31
  189. data/doc/plugins/copy.md +0 -24
  190. data/doc/plugins/delete_promoted.md +0 -12
  191. data/doc/plugins/direct_upload.md +0 -172
  192. data/doc/plugins/hooks.md +0 -58
  193. data/doc/plugins/logging.md +0 -42
  194. data/doc/plugins/migration_helpers.md +0 -60
  195. data/doc/plugins/moving.md +0 -19
  196. data/doc/plugins/multi_delete.md +0 -20
  197. data/doc/plugins/parallelize.md +0 -16
  198. data/doc/plugins/parsed_json.md +0 -23
  199. data/doc/regenerating_versions.md +0 -143
  200. data/lib/shrine/plugins/background_helpers.rb +0 -5
  201. data/lib/shrine/plugins/backup.rb +0 -90
  202. data/lib/shrine/plugins/copy.rb +0 -50
  203. data/lib/shrine/plugins/delete_promoted.rb +0 -20
  204. data/lib/shrine/plugins/direct_upload.rb +0 -217
  205. data/lib/shrine/plugins/hooks.rb +0 -90
  206. data/lib/shrine/plugins/logging.rb +0 -142
  207. data/lib/shrine/plugins/migration_helpers.rb +0 -70
  208. data/lib/shrine/plugins/moving.rb +0 -57
  209. data/lib/shrine/plugins/multi_delete.rb +0 -32
  210. data/lib/shrine/plugins/parallelize.rb +0 -78
  211. data/lib/shrine/plugins/parsed_json.rb +0 -29
data/CHANGELOG.md CHANGED
@@ -1,22 +1,504 @@
1
- ## 2.19.3 (2019-08-09)
1
+ ## 3.6.0 (2024-04-29)
2
2
 
3
- * `store_dimensions` Ignore dimensions extraction errors by default (@janko)
3
+ * Add Rack 3 support (@tomasc, @janko)
4
4
 
5
- * `file_system` Un-deprecate `FileSystem#upload` receiving unrecognized options (@janko)
5
+ * Make a copy of attacher context hash when duplicating the attacher (@reidab)
6
6
 
7
- ## 2.19.2 (2019-07-25)
7
+ * An uploaded file can be implicitly re-opened after it has been closed (@jrochkind)
8
8
 
9
- * `default_url_options` Allow deleting passed options when using a block (@janko)
9
+ * Add new `:copy_options` for initializing the S3 storage (@hkdahal)
10
10
 
11
- * `activerecord` – Make it work with ActiveRecord 3 (@texpert)
11
+ ## 3.5.0 (2023-07-06)
12
12
 
13
- * `infer_extension` Fix compatibility with `pretty_location` plugin (@janko)
13
+ * Migrate website to Docusaurus v2 (@janko)
14
14
 
15
- ## 2.19.1 (2019-07-20)
15
+ * `download_endpoint` – Return `400 Bad Request` response when serialized file component is invalid (@janko)
16
16
 
17
- * Bring back support for Ruby 2.3 (@janko)
17
+ * `base` Stop using obsolete `URI.regexp` in `UploadedFile#extension` (@y-yagi)
18
18
 
19
- ## 2.19.0 (2019-07-18)
19
+ * `s3` – Add `:encoding` option to `S3#open` to be passed to `Down::ChunkedIO#initialize` (@pond)
20
+
21
+ * `s3` – Add `:max_multipart_parts` option for changing default limit of 10,000 parts (@jpl)
22
+
23
+ * `s3` – Don't inherit S3 object tags when copying from temporary to permanent storage (@jrochkind)
24
+
25
+ * `infer_extension` – Add `infer_extension` instance method to the uploader for convenience (@aried3r)
26
+
27
+ * `derivation_endpoint` – Add `:signer` plugin option for providing a custom URL signer (@thibaudgg)
28
+
29
+ * `derivatives` – Don't leak `versions_compatibility: true` setting into other uploaders (@janko)
30
+
31
+ * `derivatives` – Add `:mutex` plugin option for skipping mutex and making attacher marshallable (@janko)
32
+
33
+ * `remove_attachment` – Fix passing boolean values being broken in Ruby 3.2 (@janko)
34
+
35
+ * `model` – When duplicating a record, make the duplicated attacher reference the duplicated record (@janko)
36
+
37
+ ## 3.4.0 (2021-06-14)
38
+
39
+ * `base` – Fix passing options to `Shrine.Attachment` on Ruby 3.0 (@lucianghinda)
40
+
41
+ * `determine_mime_type` – Return correct `image/svg+xml` MIME type for SVGs with `:fastimage` analyzer (@Bandes)
42
+
43
+ * `activerecord` – Fix keyword argument warning when adding errors with options (@janko)
44
+
45
+ * `entity` – Make `Attacher#read` method public (@janko)
46
+
47
+ * `entity` – Reset attachment dirty tracking in `Attacher#reload` (@janko)
48
+
49
+ * `activerecord` – Don't load the attacher on `ActiveRecord::Base#reload` if it hasn't yet been initialized (@janko)
50
+
51
+ * `sequel` – Don't load the attacher on `Sequel::Model#reload` if it hasn't yet been initialized (@janko)
52
+
53
+ ## 3.3.0 (2020-10-04)
54
+
55
+ * `s3` - Support new `Aws::S3::EncryptionV2::Client` for client-side encryption (@janko)
56
+
57
+ * `derivation_endpoint` – Reduce possibility of timing attacks when comparing signatures (@esparta)
58
+
59
+ * `derivatives` – Avoid downloading the attached file when calling default no-op processor (@janko)
60
+
61
+ * `derivatives` – Add `:download` processor setting for skipping downloading source file (@jrochkind, @janko)
62
+
63
+ * `derivatives` – Copy non-file source IO objects into local file before passing them to the processor (@jrochkind)
64
+
65
+ * `sequel` – Call `Attacher#reload` in `Sequel::Model#reload`, which keeps rest of attacher state (@janko, @jrochkind)
66
+
67
+ * `activerecord` – Call `Attacher#reload` in `ActiveRecord::Base#reload`, which keeps rest of attacher state (@janko, @jrochkind)
68
+
69
+ * `add_metadata` – Add `:skip_nil` option for excluding metadata keys whose values are nil (@renchap)
70
+
71
+ * `store_dimensions` – Add `:auto_extraction` option for disabling automatically extracting dimensions on upload (@renchap)
72
+
73
+ * `mirroring` – Forward original upload options when mirroring upload (@corneverbruggen)
74
+
75
+ * `derivation_endpoint` – Apply `version` URL option in derivation endpoint (@janko)
76
+
77
+ * `remove_attachment` – Delete removed file if a new file was attached right after removal (@janko)
78
+
79
+ * `upload_endpoint` – Fix `Shrine.upload_response` not working in a Rails controller (@pldavid2)
80
+
81
+ * `presign_endpoint` – Add `OPTIONS` route that newer versions of Uppy check (@janko)
82
+
83
+ * `derivatives` – Add `:create_on_promote` option for auto-creating derivatives on promotion (@janko)
84
+
85
+ * `s3` – Add back support for client-side encryption (@janko)
86
+
87
+ * `memory` – Ensure `Memory#open` returns content in original encoding (@jrochkind)
88
+
89
+ ## 3.2.2 (2020-08-05)
90
+
91
+ * `s3` – Fix `S3#open` not working on aws-sdk-core 3.104 and above (@janko)
92
+
93
+ ## 3.2.1 (2020-01-12)
94
+
95
+ * `derivation_endpoint` – Use `Rack::Files` constant on Rack >= 2.1 (@janko)
96
+
97
+ * Fix Ruby 2.7 warnings regarding separation of positional and keyword arguments (@janko)
98
+
99
+ * `s3` – Make `S3#open` handle empty S3 objects (@janko)
100
+
101
+ ## 3.2.0 (2019-12-17) [[release notes]](https://shrinerb.com/docs/release_notes/3.2.0)
102
+
103
+ * `validation` – Run validation on `Attacher#attach` & `Attacher#attach_cached` instead of `Attacher#change` (@janko)
104
+
105
+ * `remove_invalid` – Activate also when `Attacher#validate` is run manually (@janko)
106
+
107
+ * `remove_invalid` – Fix incompatibility with `derivatives` plugin (@janko)
108
+
109
+ * `type_predicates` – Add new plugin with convenient `UploadedFile` predicate methods based on MIME type (@janko)
110
+
111
+ * `core` – Allow assigning back current attached file data (@janko)
112
+
113
+ * `derivatives` – Fix `:derivative` value inconsistency when derivatives are being promoted (@janko)
114
+
115
+ * `add_metadata` – Add `#add_metadata` method for adding metadata to uploaded files (@janko)
116
+
117
+ * `derivatives` – Add `:io` and `:attacher` values to instrumentation event payload (@janko)
118
+
119
+ ## 3.1.0 (2019-11-15) [[release notes]](https://shrinerb.com/docs/release_notes/3.1.0)
120
+
121
+ * `default_storage` – Coerce storage key to symbol in `Attacher#cache_key` & `Attacher#store_key` (@janko)
122
+
123
+ * `core` – Coerce storage key to symbol in `Attacher#cache_key` & `Attacher#store_key` (@janko)
124
+
125
+ * `add_metadata` – Define metadata methods only for the target uploader class (@janko)
126
+
127
+ * `derivatives` – Add `:storage` option to `Attacher#create_derivatives` (@janko)
128
+
129
+ * `store_dimensions` – Propagate exceptions on loading `ruby-vips` in `:vips` analyzer (@janko)
130
+
131
+ * `signature` – Allow skipping rewinding by passing `rewind: false` to `Shrine.signature` (@janko)
132
+
133
+ * `derivatives` – Add `Attacher.derivatives` alias for `Attacher.derivatives_processor` (@janko)
134
+
135
+ ## 3.0.1 (2019-10-17) [[release notes]](https://shrinerb.com/docs/release_notes/3.0.1)
136
+
137
+ * `metadata_attributes` – Fix exception being raised when there is no attached file (@janko)
138
+
139
+ * `core` – Simplify `UploadedFile#inspect` output (@janko)
140
+
141
+ ## 3.0.0 (2019-10-14) [[release notes]](https://shrinerb.com/docs/release_notes/3.0.0)
142
+
143
+ * `derivation_endpoint` – Pass `action: :derivation` when uploading derivation results (@janko)
144
+
145
+ * `core` – Add `Shrine::Attachment[]` shorthand for `Shrine::Attachment.new` (@janko)
146
+
147
+ * `core` – Add `Storage#delete_prefixed` method for deleting all files in specified directory (@jrochkind)
148
+
149
+ * `linter` – Return `true` in `Storage::Linter#call` so that it can be used with `assert` (@jrochkind)
150
+
151
+ * `linter` – Allow `Storage::Linter` to accept a key that will be used for testing nonexistent file (@janko)
152
+
153
+ * `core` – Infer file extension from `filename` metadata (@janko)
154
+
155
+ * `pretty_location` – Add `:class_underscore` option for underscoring class name (@Uysim)
156
+
157
+ * Update `down` dependency to `~> 5.0` (@janko)
158
+
159
+ * `multi_cache` – Add new plugin for whitelisting additional temporary storages (@janko, @jrochkind)
160
+
161
+ * `sequel` – Extract callback code into attacher methods that can be overridden (@janko)
162
+
163
+ * `activerecord` – Extract callback code into attacher methods that can be overridden (@janko)
164
+
165
+ * `derivation_endpoint` – Stop re-opening `File` objects returned in derivation result (@janko)
166
+
167
+ * `derivation_endpoint` – Allow only `File` or `Tempfile` object as derivation result (@janko)
168
+
169
+ * `download_endpoint` – Add `Shrine.download_response` for calling in controller (@janko)
170
+
171
+ * `core` – Fetch storage object lazily in `Shrine` instance (@janko)
172
+
173
+ * `mirroring` – Add new plugin for replicating uploads and deletes to other storages (@janko)
174
+
175
+ * `sequel` – Rename `:callbacks` option to `:hooks` (@janko)
176
+
177
+ * `model` – Add `Attacher#set_model` for setting model without loading attachment (@janko)
178
+
179
+ * `entity` – Add `Attacher#set_entity` for setting entity without loading attachment (@janko)
180
+
181
+ * `entity` – Define `#<name>_attacher` class method when including `Shrine::Attachment` (@janko)
182
+
183
+ * `derivation_endpoint` – Send only `:derivation` in the instrumentation event payload (@janko)
184
+
185
+ * `default_storage` – Add `Attacher.default_cache` and `Attacher.default_store` for settings (@janko)
186
+
187
+ * `default_storage` – Deprecate `record` & `name` arguments to storage block (@janko)
188
+
189
+ * `default_storage` – Evaluate storage block in context of `Attacher` instance (@janko)
190
+
191
+ * Unify persistence plugin interface (@janko)
192
+
193
+ * `upload_options` – Keep `Shrine#_upload` private (@janko)
194
+
195
+ * `infer_extension` – Keep `Shrine#basic_location` private (@janko)
196
+
197
+ * `model` – Add `#<name>_changed?` method to attachment module (@janko)
198
+
199
+ * Make it easier for plugins to define entity and model attachment methods (@janko)
200
+
201
+ * `form_assign` – Add new plugin for assigning attachment from form params without a form object (@janko)
202
+
203
+ * `derivation_endpoint` – Allow passing generic IO objects to `Derivation#upload` (@janko)
204
+
205
+ * `derivation_endpoint` – Accept additional uploader options in `Derivation#upload` (@janko)
206
+
207
+ * `derivation_endpoint` – Close the uploaded file in `Derivation#upload` (@janko)
208
+
209
+ * `core` – Stop rescuing `IO#close` exceptions in `Shrine#upload` (@janko)
210
+
211
+ * `core` – Add `:delete` option to `Shrine#upload` for deleting uploaded file (@janko)
212
+
213
+ * `s3` – Stop returning `:object` in `Down::ChunkedIO#data` in `S3#open` (@janko)
214
+
215
+ * `s3` – Eliminate `#head_object` request in `S3#open` (@janko)
216
+
217
+ * `download_endpoint` – Remove extra `Storage#exists?` check (@janko)
218
+
219
+ * `derivation_endpoint` – Add `Derivation#opened` for retrieving an opened derivation result (@janko)
220
+
221
+ * `derivation_endpoint` – Remove extra `Storage#exists?` check when `:upload` is enabled but not `:upload_redirect` (@janko)
222
+
223
+ * `derivation_endpoint` - Don't pass source `UploadedFile` object when `:download` is `false` (@janko)
224
+
225
+ * `derivation_endpoint` – Remove `:include_uploaded_file` option (@janko)
226
+
227
+ * `derivation_endpoint` – Evaluate derivation block in context of `Shrine::Derivation` (@janko)
228
+
229
+ * `derivation_endpoint` – Remove `:download_errors` option (@janko)
230
+
231
+ * `memory` – Raise `Shrine::FileNotFound` on nonexistent file in `Memory#open` (@janko)
232
+
233
+ * `file_system` – Raise `Shrine::FileNotFound` on nonexistent file in `FileSystem#open` (@janko)
234
+
235
+ * `s3` – Raise `Shrine::FileNotFound` on nonexistent object in `S3#open` (@janko)
236
+
237
+ * `core` – Add `Shrine::FileNotFound` exception and require storages to raise it on `Storage#open` (janko)
238
+
239
+ * `instrumentation` – Remove `:metadata` from `:options` in `metadata.shrine` event (@janko)
240
+
241
+ * `instrumentation` – Remove `:location`, `:upload_options` and `:metadata` from `:options` in `upload.shrine` event (@janko)
242
+
243
+ * `instrumentation` – Add `:metadata` to the `upload.shrine` event (@janko)
244
+
245
+ * `download_endpoint` – Drop support for legacy `/:storage/:id` URLs (@janko)
246
+
247
+ * `core` – In `UploadedFile#==` require files to be of the same class (@janko)
248
+
249
+ * `core` – Add `:close` option to `Shrine#upload` for preventing closing file after upload (@janko)
250
+
251
+ * `memory` – Add `Shrine::Storage::Memory` from `shrine-memory` gem (@janko)
252
+
253
+ * `default_url_options` – Rename to just `url_options` (@janko)
254
+
255
+ * `delete_raw` – Deprecate plugin in favour of `derivatives` (@janko)
256
+
257
+ * `recache` – Deprecate plugin in favour of `derivatives` (@janko)
258
+
259
+ * `processing` – Deprecate plugin in favour of `derivatives` (@janko)
260
+
261
+ * `versions` – Deprecate plugin in favour of `derivatives` (@janko)
262
+
263
+ * `derivatives` – Add new plugin for storing processed files (@janko)
264
+
265
+ * `derivation_endpoint` – Allow using symbol and string derivation names interchangeably (@janko)
266
+
267
+ * `dynamic_storage` – Remove `Shrine.dynamic_storages` method (@janko)
268
+
269
+ * `core` – Deep duplicate `Shrine.opts` on subclassing (@janko)
270
+
271
+ * `core` – Add `Attacher#file!` which asserts that a file is attached (@janko)
272
+
273
+ * `core` – Change `Shrine.uploaded_file` to raise `ArgumentError` on invalid input (@janko)
274
+
275
+ * `module_include` – Deprecate plugin over overriding core classes directly (@janko)
276
+
277
+ * `core` – Add `Attacher#cache_key` and `Attacher#store_key` which return storage identifiers (@janko)
278
+
279
+ * `linter` – Call `Storage#open` with options as second argument (@janko)
280
+
281
+ * `core` – Allow data hash passed to `UploadedFile.new` to have symbol keys (@janko)
282
+
283
+ * `core` – Change how `Shrine::UploadedFile` sets its state from the given data hash (@janko)
284
+
285
+ * `core` – Deprecate `Storage#open` not accepting additional options (@janko)
286
+
287
+ * `refresh_metadata` – Add `Attacher#refresh_metadata!` method which integrates with `model` plugin (@janko)
288
+
289
+ * `instrumentation` – Instrument any `Storage#open` calls in a new `open.shrine` event (@janko)
290
+
291
+ * `restore_cached_data` – Forward options passed to `Attacher#attach_cached` to metadata extraction (@janko)
292
+
293
+ * `validation` – Allow skipping validations on attaching by passing `validate: false` (@janko)
294
+
295
+ * `validation` – Add `:validate` option to `Attacher#assign` or `Attacher#attach` for passing options to validation block (@janko)
296
+
297
+ * `validation` – Extract validation functionality into the new plugin (@janko)
298
+
299
+ * `upload_options` – Upload options from the block are now merged with passed options instead of replaced (@janko)
300
+
301
+ * `upload_endpoint` – Stop passing `Rack::Request` object to the uploader (@janko)
302
+
303
+ * `remote_url` – Require custom downloaders to raise `Shrine::Plugins::RemoteUrl::DownloadError` for conversion into a validation error (@janko)
304
+
305
+ * `infer_extension` – Fix compatibility with the `pretty_location` plugin (@janko)
306
+
307
+ * `presign_endpoint` – Remove deprecated `Shrine::Plugins::PresignEndpoint::App` constant (@janko)
308
+
309
+ * `keep_files` – Remove the ability to choose whether to keep only destroyed or only replaced files (@janko)
310
+
311
+ * `infer_extension` – Remove `Shrine#infer_extension` method (@janko)
312
+
313
+ * `default_url_options` – Allow overriding passed URL options by deleting them inside the block (@janko)
314
+
315
+ * `cached_attachment_data` – Rename `Attacher#read_cached` to `Attacher#cached_data` (@janko)
316
+
317
+ * `sequel` – Add `Attacher#atomic_promote` and `Attacher#atomic_persist` (@janko)
318
+
319
+ * `sequel` – Remove persistence from `Attacher#promote` (@janko)
320
+
321
+ * `activerecord` – Remove persistence from `Attacher#promote` (@janko)
322
+
323
+ * `atomic_helpers` – Add new plugin with helper methods for atomic promotion and persistence (@janko)
324
+
325
+ * `backgrounding` – Add `Attacher#promote_block` & `Attacher#destroy_block` for overriding class level blocks (@janko)
326
+
327
+ * `backgrounding` – Add `Attacher.promote_block` & `Attacher.destroy_block` on class level (@janko)
328
+
329
+ * `backgrounding` – Remove overriding `Attacher#swap` with atomic promotion (@janko)
330
+
331
+ * `backgrounding` – Remove `Attacher.promote`, `Attacher.delete`, `Attacher.dump`, `Attacher#dump`, `Attacher.load`, `Attacher.load_record` (@janko)
332
+
333
+ * `model` – Allow disabling caching to temporary storage on assignment (@janko)
334
+
335
+ * `model` – Add `Attacher.from_model`, `Attacher#write` (@janko)
336
+
337
+ * `model` – Add new plugin for integrating with mutable structs (@janko)
338
+
339
+ * `entity` – Add `Attacher.from_entity`, `Attacher#reload`, `Attacher#column_values`, `Attacher#attribute` (@janko)
340
+
341
+ * `entity` – Add new plugin for integrating with immutable structs (@janko)
342
+
343
+ * `column` – Allow changing column serializer from default `JSON` library (@janko)
344
+
345
+ * `column` – Add `Attacher#column_data` and `Attacher.from_column` methods (@janko)
346
+
347
+ * `column` – Add new plugin for (de)serializing attacher data (@janko)
348
+
349
+ * `attachment` – Removed any default attachment methods (@janko)
350
+
351
+ * `core` – Require context hash passed as second argument to `Shrine#upload` to have symbol keys (@janko)
352
+
353
+ * `core` – Change `Shrine.uploaded_file` not to yield files anymore (@janko)
354
+
355
+ * `core` – Allow `Shrine.uploaded_file` to accept file data hashes with symbol keys (@janko)
356
+
357
+ * `core` – Remove `Shrine#uploaded?`
358
+
359
+ * `core` – Remove `Shrine#delete`, `Shrine#_delete`, `Shrine#remove` (@janko)
360
+
361
+ * `core` – Remove `Shrine#store`, `Shrine#_store`, `Shrine#put`, `Shrine#copy` (@janko)
362
+
363
+ * `core` – Remove `Shrine#processed`, `Shrine#process` (@janko)
364
+
365
+ * `core` – Don't pass `:phase` anymore on uploads (@janko)
366
+
367
+ * `core` – Read attachment from the record attribute only on initialization (@janko)
368
+
369
+ * `core` – Don't require a temporary storage (@janko)
370
+
371
+ * `core` – Add `Attacher#data` and `Attacher.from_data` for dumping to and loading from a Hash (@janko)
372
+
373
+ * `core` – Change `Attacher#assign` to raise exception when non-cached file is assigned (@janko)
374
+
375
+ * `core` – Enable `Attacher#assign` to accept cached file data as a Hash (@janko)
376
+
377
+ * `core` – Add `Attacher#file` alias for `Attacher#get` (@janko)
378
+
379
+ * `core` – Change `Attacher#attached?` to return whether a file is attached (@janko)
380
+
381
+ * `core` – Change `Attacher#promote` to always only save promoted file in memory (@janko)
382
+
383
+ * `core` – Rename `Attacher#replace` to `Attacher#destroy_previous` (@janko)
384
+
385
+ * `core` – Remove `Attacher#_promote` and `Attacher#_delete`, add `Attacher#promote_cached` and `Attacher#destroy_attached` (@janko)
386
+
387
+ * `core` – Rename `Attacher#set` and `Attacher#_set` to `Attacher#change` and `Attacher#set` (@janko)
388
+
389
+ * `core` – Remove `Attacher#cache!` and `Attacher#store!`, add `Attacher#upload` (@janko)
390
+
391
+ * `core` – Rename `Attacher#validate_block` to `Attacher#_validate` (@janko)
392
+
393
+ * `core` – Add `Attacher#attach`, `Attacher#attach_cached`, extracted from `Attacher#assign` (@janko)
394
+
395
+ * `core` – Remove `Attacher#swap`, `Attacher#update`, `Attacher#read`, `Attacher#write`, `Attacher#data_attribute`, `Attacher#convert_to_data`, `Attacher#convert_before_write`, and `Attacher#convert_after_read` (@janko)
396
+
397
+ * `core` – Change `Attacher.new` to not accept a model anymore (@janko)
398
+
399
+ * `delete_promoted` – Remove plugin (@janko)
400
+
401
+ * `parsed_json` – Remove plugin (@janko)
402
+
403
+ * `parallelize` – Remove plugin (@janko)
404
+
405
+ * `hooks` – Remove plugin (@janko)
406
+
407
+ * `core` – Remove deprecated `Shrine::IO_METHODS` constant (@janko)
408
+
409
+ * `s3` – Replace source object metadata when copying a file from S3 (@janko)
410
+
411
+ * `core` – Change `UploadedFile#storage_key` to return a Symbol instead of a String (@janko)
412
+
413
+ * `infer_extension` – Make `:mini_mime` the default analyzer (@janko)
414
+
415
+ * Bring back Ruby 2.3 support (@janko)
416
+
417
+ * `versions` – Remove deprecated `:version_names`, `Shrine.version_names` and `Shrine.version?` (@janko)
418
+
419
+ * `validation_helpers` – Remove support for regexes in MIME type or extension validations (@janko)
420
+
421
+ * `validation_helpers` – Don't require `#width` and `#height` methods to be defined on `UploadedFile` (@janko)
422
+
423
+ * `validation_helpers` – Fail dimensions validations when `width` or `height` metadata is missing (@janko)
424
+
425
+ * `upload_endpoint` – Remove deprecated `Shrine::Plugins::UploadEndpoint::App` constant (@janko)
426
+
427
+ * `determine_mime_type` – Remove `Shrine#mime_type_analyzers` method (@janko)
428
+
429
+ * `store_dimensions` – Remove `Shrine#extract_dimensions` and `Shrine#dimensions_analyzers` methods (@janko)
430
+
431
+ * `rack_file` – Remove deprecated `Shrine::Plugins::RackFile::UploadedFile` constant (@janko)
432
+
433
+ * `rack_file` – Drop support for passing file hash to `Shrine#upload` and `Shrine#store` (@janko)
434
+
435
+ * `download_endpoint` – Move `Shrine::Plugins::DownloadEndpoint::App` into `Shrine::DownloadEndpoint` (@janko)
436
+
437
+ * `download_endpoint` – Remove deprecated `Shrine::DownloadEndpoint` constant (@janko)
438
+
439
+ * `download_endpoint` – Remove deprecated `:storages` option (@janko)
440
+
441
+ * `determine_mime_type` – Remove deprecated `:default` analyzer alias (@janko)
442
+
443
+ * `default_url` – Remove deprecated block argument when loading the plugin (@janko)
444
+
445
+ * `data_uri` – Remove deprecated `Shrine::Plugins::DataUri::DataFile` constant (@janko)
446
+
447
+ * `data_uri` – Remove deprecated `:filename` plugin option (@janko)
448
+
449
+ * `cached_attachment_data` – Remove deprecated model setter (@janko)
450
+
451
+ * `file_system` – Remove deprecated `:older_than` option in `FileSystem#clear!` (@janko)
452
+
453
+ * `file_system` – Don't accept a block anymore in `FileSystem#open` (@janko)
454
+
455
+ * `file_system` – Remove deprecated `FileSystem#download` method (@janko)
456
+
457
+ * `file_system` – Make `FileSystem#movable?` and `FileSystem#move` methods private (@janko)
458
+
459
+ * `file_system` – Remove deprecation warning on unrecognized options in `FileSystem#upload` (@janko)
460
+
461
+ * `file_system` – Remove deprecated `:host` option for `FileSystem#initialize` (@janko)
462
+
463
+ * `moving` – Remove deprecated plugin (@janko)
464
+
465
+ * `multi_delete` – Remove deprecated plugin (@janko)
466
+
467
+ * `direct_upload` – Remove deprecated plugin (@janko)
468
+
469
+ * `backup` – Remove deprecated plugin (@janko)
470
+
471
+ * `background_helpers` – Remove deprecated plugin (@janko)
472
+
473
+ * `migration_helpers` – Remove deprecated plugin (@janko)
474
+
475
+ * `copy` – Remove deprecated plugin (@janko)
476
+
477
+ * `logging` – Remove deprecated plugin (@janko)
478
+
479
+ * `s3` – Remove deprecated `S3#download` method (@janko)
480
+
481
+ * `s3` – Remove deprecated `S3#stream` method (@janko)
482
+
483
+ * `presign_endpoint` – Drop support for presign objects that don't respond to `#to_h` (@janko)
484
+
485
+ * `s3` – Return a Hash in `S3#presign` when method is POST (@janko)
486
+
487
+ * `s3` – Remove `:download` option in `S3#url` (@janko)
488
+
489
+ * `s3` – Remove support for non URI-escaped content disposition values (@janko)
490
+
491
+ * `s3` – Remove `S3#s3` method (@janko)
492
+
493
+ * `s3` – Remove support for specifying `:multipart_threshold` as an integer (@janko)
494
+
495
+ * `s3` – Remove `:host` option on `S3#initialize` (@janko)
496
+
497
+ * `s3` – Drop support for `aws-sdk-s3` versions lower than 1.14 (@janko)
498
+
499
+ * `s3` – Drop support for `aws-sdk` 2.x (@janko)
500
+
501
+ ## 2.19.0 (2019-07-18) [[release notes]](https://shrinerb.com/docs/release_notes/2.19.0)
20
502
 
21
503
  * `pretty_location` – Allow specifying a different identifier from `id` (@00dav00)
22
504
 
@@ -72,7 +554,7 @@
72
554
 
73
555
  * `core` – Allow registering storage objects under string keys (@janko)
74
556
 
75
- ## 2.18.0 (2019-06-24)
557
+ ## 2.18.0 (2019-06-24) [[release notes]](https://shrinerb.com/docs/release_notes/2.18.0)
76
558
 
77
559
  * `core` – Add `Shrine.upload` method as a shorthand for `Shrine.new(...).upload(...)` (@janko)
78
560
 
@@ -96,7 +578,7 @@
96
578
 
97
579
  * `parsed_json` – Fix overriden `Attacher#assign` not accepting second argument (@janko)
98
580
 
99
- ## 2.17.0 (2019-05-06)
581
+ ## 2.17.0 (2019-05-06) [[release notes]](https://shrinerb.com/docs/release_notes/2.17.0)
100
582
 
101
583
  * `data_uri` – Add `Attacher#assign_data_uri` which accepts additional `Shrine#upload` options (@janko)
102
584
 
@@ -146,7 +628,7 @@
146
628
 
147
629
  * `parsed_json` – Accepts hashes with symbols keys (@aglushkov)
148
630
 
149
- ## 2.16.0 (2019-02-18)
631
+ ## 2.16.0 (2019-02-18) [[release notes]](https://shrinerb.com/docs/release_notes/2.16.0)
150
632
 
151
633
  * `derivation_endpoint` – Add `:upload_open_options` for download option for derivation result (@janko)
152
634
 
@@ -172,7 +654,7 @@
172
654
 
173
655
  * Fix `store_dimensions` plugin making second argument in `Shrine#extract_metadata` mandatory (@jrochkind)
174
656
 
175
- ## 2.15.0 (2019-02-08)
657
+ ## 2.15.0 (2019-02-08) [[release notes]](https://shrinerb.com/docs/release_notes/2.15.0)
176
658
 
177
659
  * Add `derivation_endpoint` plugin for processing uploaded files on-the-fly (@janko)
178
660
 
@@ -182,7 +664,7 @@
182
664
 
183
665
  * Yield a new File object on `Shrine.with_file` when `tempfile` plugin is loaded (@janko)
184
666
 
185
- ## 2.14.0 (2018-12-27)
667
+ ## 2.14.0 (2018-12-27) [[release notes]](https://shrinerb.com/docs/release_notes/2.14.0)
186
668
 
187
669
  * Add `tempfile` plugin for easier reusing of the same uploaded file copy on disk (@janko)
188
670
 
@@ -252,7 +734,7 @@
252
734
 
253
735
  * Use a guard raise cause for `bucket` argument in S3 for an appropriate error message (@ardecvz)
254
736
 
255
- ## 2.13.0 (2018-11-04)
737
+ ## 2.13.0 (2018-11-04) [[release notes]](https://shrinerb.com/docs/release_notes/2.13.0)
256
738
 
257
739
  * Specify UTF-8 charset in `Content-Type` response header in `presign_endpoint` plugin (@janko)
258
740
 
@@ -284,7 +766,7 @@
284
766
 
285
767
  * In `S3#upload` deprecate using aws-sdk-s3 lower than 1.14 when uploading IO objects of unknown size (@janko)
286
768
 
287
- ## 2.12.0 (2018-08-22)
769
+ ## 2.12.0 (2018-08-22) [[release notes]](https://shrinerb.com/docs/release_notes/2.12.0)
288
770
 
289
771
  * Ignore nil values when assigning files from a remote URL (@janko)
290
772
 
@@ -312,7 +794,7 @@
312
794
 
313
795
  * Make `UploadedFile#open` always open a new IO object and close the previous one (@janko)
314
796
 
315
- ## 2.11.0 (2018-04-28)
797
+ ## 2.11.0 (2018-04-28) [[release notes]](https://shrinerb.com/docs/release_notes/2.11.0)
316
798
 
317
799
  * Add `Shrine.with_file` for temporarily converting an IO-like object into a file (@janko)
318
800
 
@@ -340,7 +822,7 @@
340
822
 
341
823
  * Deprecate `direct_upload` plugin in favor of `upload_endpoint` and `presign_endpoint` plugins (@janko)
342
824
 
343
- ## 2.10.0 (2018-03-28)
825
+ ## 2.10.0 (2018-03-28) [[release notes]](https://shrinerb.com/docs/release_notes/2.10.0)
344
826
 
345
827
  * Add `:fastimage` analyzer to `determine_mime_type` plugin (@mokolabs)
346
828
 
@@ -362,7 +844,7 @@
362
844
 
363
845
  * Inherit the logger on subclassing `Shrine` and make it shared across subclasses (@hmistry)
364
846
 
365
- ## 2.9.0 (2018-01-27)
847
+ ## 2.9.0 (2018-01-27) [[release notes]](https://shrinerb.com/docs/release_notes/2.9.0)
366
848
 
367
849
  * Support arrays of files in `versions` plugin (@janko)
368
850
 
@@ -386,7 +868,7 @@
386
868
 
387
869
  * Allow passing options to `Model#<attachment>_attacher` for overriding `Attacher` options (@janko)
388
870
 
389
- ## 2.8.0 (2017-10-11)
871
+ ## 2.8.0 (2017-10-11) [[release notes]](https://shrinerb.com/docs/release_notes/2.8.0)
390
872
 
391
873
  * Expand relative directory paths when initializing `Storage::FileSystem` (@janko)
392
874
 
@@ -416,7 +898,7 @@
416
898
 
417
899
  * Update `direct_upload` plugin to support Roda 3 (@janko)
418
900
 
419
- ## 2.7.0 (2017-09-11)
901
+ ## 2.7.0 (2017-09-11) [[release notes]](https://shrinerb.com/docs/release_notes/2.7.0)
420
902
 
421
903
  * Deprecate the `Shrine::DownloadEndpoint` constant over `Shrine.download_endpoint` (@janko)
422
904
 
@@ -484,11 +966,11 @@
484
966
 
485
967
  * Don't add a newline at the end of the base64-formatted signature (@janko)
486
968
 
487
- ## 2.6.1 (2017-04-12)
969
+ ## 2.6.1 (2017-04-12) [[release notes]](https://shrinerb.com/docs/release_notes/2.6.1)
488
970
 
489
971
  * Fix `download_endpoint` returning incorrect reponse body in some cases (@janko)
490
972
 
491
- ## 2.6.0 (2017-04-04)
973
+ ## 2.6.0 (2017-04-04) [[release notes]](https://shrinerb.com/docs/release_notes/2.6.0)
492
974
 
493
975
  * Make `Shrine::Storage::FileSystem#path` public which returns path to the file as a `Pathname` object (@janko)
494
976
 
@@ -560,7 +1042,7 @@
560
1042
 
561
1043
  * Raise `Shrine::Error` when `Shrine#generate_location` returns nil (@janko)
562
1044
 
563
- ## 2.5.0 (2016-11-11)
1045
+ ## 2.5.0 (2016-11-11) [[release notes]](https://shrinerb.com/docs/release_notes/2.5.0)
564
1046
 
565
1047
  * Add `Attacher.default_url` as the idiomatic way of declaring default URLs (@janko)
566
1048
 
@@ -586,7 +1068,7 @@
586
1068
 
587
1069
  * Make it possible to extract multiple metadata values at once with the `add_metadata` plugin (@janko)
588
1070
 
589
- ## 2.4.1 (2016-10-17)
1071
+ ## 2.4.1 (2016-10-17) [[release notes]](https://shrinerb.com/docs/release_notes/2.4.1)
590
1072
 
591
1073
  * Move back JSON serialization from `Attacher#write` to `Attacher#_set` (@janko)
592
1074
 
@@ -596,7 +1078,7 @@
596
1078
 
597
1079
  * In `UploadedFile#download` use extension from `#original_filename` if `#id` doesn't have it (@janko)
598
1080
 
599
- ## 2.4.0 (2016-10-11)
1081
+ ## 2.4.0 (2016-10-11) [[release notes]](https://shrinerb.com/docs/release_notes/2.4.0)
600
1082
 
601
1083
  * Add `#convert_before_write` and `#convert_after_read` on the Attacher for data attribute conversion (@janko)
602
1084
 
@@ -632,11 +1114,11 @@
632
1114
 
633
1115
  * Override `#to_s` in `Shrine::Attachment` for better introspection with `puts` (@janko)
634
1116
 
635
- ## 2.3.1 (2016-09-01)
1117
+ ## 2.3.1 (2016-09-01) [[release notes]](https://shrinerb.com/docs/release_notes/2.3.1)
636
1118
 
637
1119
  * Don't change permissions of existing directories in FileSystem storage (@janko)
638
1120
 
639
- ## 2.3.0 (2016-08-27)
1121
+ ## 2.3.0 (2016-08-27) [[release notes]](https://shrinerb.com/docs/release_notes/2.3.0)
640
1122
 
641
1123
  * Prevent client from caching the presign response in direct_upload plugin (@janko)
642
1124
 
@@ -662,7 +1144,7 @@
662
1144
 
663
1145
  * Add `:directory_permissions` to `Storage::FileSystem` (@janko)
664
1146
 
665
- ## 2.2.0 (2016-07-29)
1147
+ ## 2.2.0 (2016-07-29) [[release notes]](https://shrinerb.com/docs/release_notes/2.2.0)
666
1148
 
667
1149
  * Soft deprecate `:phase` over `:action` in `context` (@janko)
668
1150
 
@@ -694,11 +1176,11 @@
694
1176
 
695
1177
  * Avoid an additional HEAD request to determine content length in multipart S3 copy (@janko)
696
1178
 
697
- ## 2.1.1 (2016-07-14)
1179
+ ## 2.1.1 (2016-07-14) [[release notes]](https://shrinerb.com/docs/release_notes/2.1.1)
698
1180
 
699
1181
  * Fix `S3#open` throwing a NameError if `net/http` isn't required (@janko)
700
1182
 
701
- ## 2.1.0 (2016-06-27)
1183
+ ## 2.1.0 (2016-06-27) [[release notes]](https://shrinerb.com/docs/release_notes/2.1.0)
702
1184
 
703
1185
  * Remove `:names` from versions plugin, and deprecate generating versions in :cache phase (@janko)
704
1186
 
@@ -714,11 +1196,11 @@
714
1196
 
715
1197
  * Deprecate `#cached_<attachment>_data=` over using `<attachment>` for the hidden field (@janko)
716
1198
 
717
- ## 2.0.1 (2016-05-30)
1199
+ ## 2.0.1 (2016-05-30) [[release notes]](https://shrinerb.com/docs/release_notes/2.0.1)
718
1200
 
719
1201
  * Don't override previously set default_url in versions plugin (@janko)
720
1202
 
721
- ## 2.0.0 (2016-05-19)
1203
+ ## 2.0.0 (2016-05-19) [[release notes]](https://shrinerb.com/docs/release_notes/2.0.0)
722
1204
 
723
1205
  * Include query parameters in CDN-ed S3 URLs, making them work for private objects (@janko)
724
1206
 
@@ -798,17 +1280,17 @@
798
1280
 
799
1281
  * Deprecate loading the backgrounding plugin through the old "background_helpers" alias (@janko)
800
1282
 
801
- ## 1.4.2 (2016-04-19)
1283
+ ## 1.4.2 (2016-04-19) [[release notes]](https://shrinerb.com/docs/release_notes/1.4.2)
802
1284
 
803
1285
  * Removed ActiveRecord's automatic support for optimistic locking as it wasn't stable (@janko)
804
1286
 
805
1287
  * Fixed record's dataset being modified after promoting preventing further updates with the same instance (@janko)
806
1288
 
807
- ## 1.4.1 (2016-04-18)
1289
+ ## 1.4.1 (2016-04-18) [[release notes]](https://shrinerb.com/docs/release_notes/1.4.1)
808
1290
 
809
1291
  * Bring back triggering callbacks on promote in ORM plugins, and add support for optimistic locking (@janko)
810
1292
 
811
- ## 1.4.0 (2016-04-15)
1293
+ ## 1.4.0 (2016-04-15) [[release notes]](https://shrinerb.com/docs/release_notes/1.4.0)
812
1294
 
813
1295
  * Return "Content-Length" response header in download_endpoint plugin (@janko)
814
1296
 
@@ -864,7 +1346,7 @@
864
1346
 
865
1347
  * Fix keep_files not to spawn a background job when file will not be deleted (@janko)
866
1348
 
867
- ## 1.3.0 (2016-03-12)
1349
+ ## 1.3.0 (2016-03-12) [[release notes]](https://shrinerb.com/docs/release_notes/1.3.0)
868
1350
 
869
1351
  * Add `<attachment>_cached?` and `<attachment>_stored?` to migration_helpers plugin (@janko)
870
1352
 
@@ -906,7 +1388,7 @@
906
1388
 
907
1389
  * Fix `NameError` when silencing "missing record" errors in backgrounding (@janko)
908
1390
 
909
- ## 1.2.0 (2016-01-26)
1391
+ ## 1.2.0 (2016-01-26) [[release notes]](https://shrinerb.com/docs/release_notes/1.2.0)
910
1392
 
911
1393
  * Make `Shrine::Attacher.promote` and `Shrine::Attacher.delete` return the record in backgrounding plugin (@janko)
912
1394
 
@@ -922,7 +1404,7 @@
922
1404
 
923
1405
  * Make custom metadata inherited from uploaded files and make `#extract_metadata` called only on caching (@janko)
924
1406
 
925
- ## 1.1.0 (2015-12-26)
1407
+ ## 1.1.0 (2015-12-26) [[release notes]](https://shrinerb.com/docs/release_notes/1.1.0)
926
1408
 
927
1409
  * Rename the "background_helpers" plugin to "backgrounding" (@janko)
928
1410
 
@@ -992,7 +1474,7 @@
992
1474
 
993
1475
  * Reduce length of URLs generated with pretty_location plugin (@gshaw)
994
1476
 
995
- ## 1.0.0 (2015-11-27)
1477
+ ## 1.0.0 (2015-11-27) [[release notes]](https://shrinerb.com/docs/release_notes/1.0.0)
996
1478
 
997
1479
  * Improve Windows compatibility in the FileSystem storage (@janko)
998
1480