shrine 2.19.4 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +485 -43
  3. data/LICENSE.txt +1 -1
  4. data/README.md +81 -977
  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 +102 -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 +1115 -0
  20. data/doc/metadata.md +190 -109
  21. data/doc/multiple_files.md +62 -34
  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 +162 -101
  34. data/doc/plugins/derivatives.md +829 -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 +14 -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 +185 -167
  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 +4 -0
  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/retrieving_uploads.md +4 -1
  116. data/doc/securing_uploads.md +60 -37
  117. data/doc/storage/file_system.md +20 -3
  118. data/doc/storage/memory.md +19 -0
  119. data/doc/storage/s3.md +117 -83
  120. data/doc/testing.md +124 -144
  121. data/doc/upgrading_to_3.md +710 -0
  122. data/doc/validation.md +54 -90
  123. data/lib/shrine/attacher.rb +287 -171
  124. data/lib/shrine/attachment.rb +13 -46
  125. data/lib/shrine/plugins/_persistence.rb +93 -0
  126. data/lib/shrine/plugins/activerecord.rb +77 -34
  127. data/lib/shrine/plugins/add_metadata.rb +25 -17
  128. data/lib/shrine/plugins/atomic_helpers.rb +119 -0
  129. data/lib/shrine/plugins/backgrounding.rb +77 -113
  130. data/lib/shrine/plugins/cached_attachment_data.rb +6 -15
  131. data/lib/shrine/plugins/column.rb +102 -0
  132. data/lib/shrine/plugins/data_uri.rb +38 -36
  133. data/lib/shrine/plugins/default_storage.rb +45 -15
  134. data/lib/shrine/plugins/default_url.rb +12 -24
  135. data/lib/shrine/plugins/default_url_options.rb +3 -30
  136. data/lib/shrine/plugins/delete_raw.rb +10 -16
  137. data/lib/shrine/plugins/derivation_endpoint.rb +89 -134
  138. data/lib/shrine/plugins/derivatives.rb +637 -0
  139. data/lib/shrine/plugins/determine_mime_type.rb +9 -21
  140. data/lib/shrine/plugins/download_endpoint.rb +109 -133
  141. data/lib/shrine/plugins/dynamic_storage.rb +5 -11
  142. data/lib/shrine/plugins/entity.rb +152 -0
  143. data/lib/shrine/plugins/form_assign.rb +108 -0
  144. data/lib/shrine/plugins/included.rb +6 -6
  145. data/lib/shrine/plugins/infer_extension.rb +13 -20
  146. data/lib/shrine/plugins/instrumentation.rb +54 -42
  147. data/lib/shrine/plugins/keep_files.rb +3 -15
  148. data/lib/shrine/plugins/metadata_attributes.rb +28 -19
  149. data/lib/shrine/plugins/mirroring.rb +142 -0
  150. data/lib/shrine/plugins/model.rb +158 -0
  151. data/lib/shrine/plugins/module_include.rb +3 -3
  152. data/lib/shrine/plugins/multi_cache.rb +27 -0
  153. data/lib/shrine/plugins/presign_endpoint.rb +18 -22
  154. data/lib/shrine/plugins/pretty_location.rb +15 -9
  155. data/lib/shrine/plugins/processing.rb +22 -9
  156. data/lib/shrine/plugins/rack_file.rb +2 -42
  157. data/lib/shrine/plugins/rack_response.rb +15 -10
  158. data/lib/shrine/plugins/recache.rb +6 -5
  159. data/lib/shrine/plugins/refresh_metadata.rb +13 -11
  160. data/lib/shrine/plugins/remote_url.rb +49 -49
  161. data/lib/shrine/plugins/remove_attachment.rb +10 -6
  162. data/lib/shrine/plugins/remove_invalid.rb +19 -8
  163. data/lib/shrine/plugins/restore_cached_data.rb +13 -7
  164. data/lib/shrine/plugins/sequel.rb +86 -36
  165. data/lib/shrine/plugins/signature.rb +10 -16
  166. data/lib/shrine/plugins/store_dimensions.rb +35 -40
  167. data/lib/shrine/plugins/tempfile.rb +1 -3
  168. data/lib/shrine/plugins/type_predicates.rb +113 -0
  169. data/lib/shrine/plugins/upload_endpoint.rb +25 -23
  170. data/lib/shrine/plugins/upload_options.rb +14 -15
  171. data/lib/shrine/plugins/url_options.rb +31 -0
  172. data/lib/shrine/plugins/validation.rb +80 -0
  173. data/lib/shrine/plugins/validation_helpers.rb +34 -57
  174. data/lib/shrine/plugins/versions.rb +107 -87
  175. data/lib/shrine/plugins.rb +22 -0
  176. data/lib/shrine/storage/file_system.rb +46 -64
  177. data/lib/shrine/storage/linter.rb +42 -7
  178. data/lib/shrine/storage/memory.rb +49 -0
  179. data/lib/shrine/storage/s3.rb +154 -158
  180. data/lib/shrine/uploaded_file.rb +28 -30
  181. data/lib/shrine/version.rb +3 -3
  182. data/lib/shrine.rb +86 -149
  183. data/shrine.gemspec +9 -10
  184. metadata +79 -83
  185. data/doc/migrating_storage.md +0 -76
  186. data/doc/plugins/backup.md +0 -31
  187. data/doc/plugins/copy.md +0 -24
  188. data/doc/plugins/delete_promoted.md +0 -12
  189. data/doc/plugins/direct_upload.md +0 -172
  190. data/doc/plugins/hooks.md +0 -58
  191. data/doc/plugins/logging.md +0 -42
  192. data/doc/plugins/migration_helpers.md +0 -60
  193. data/doc/plugins/moving.md +0 -19
  194. data/doc/plugins/multi_delete.md +0 -20
  195. data/doc/plugins/parallelize.md +0 -16
  196. data/doc/plugins/parsed_json.md +0 -23
  197. data/doc/regenerating_versions.md +0 -143
  198. data/lib/shrine/plugins/background_helpers.rb +0 -5
  199. data/lib/shrine/plugins/backup.rb +0 -90
  200. data/lib/shrine/plugins/copy.rb +0 -50
  201. data/lib/shrine/plugins/delete_promoted.rb +0 -20
  202. data/lib/shrine/plugins/direct_upload.rb +0 -217
  203. data/lib/shrine/plugins/hooks.rb +0 -90
  204. data/lib/shrine/plugins/logging.rb +0 -142
  205. data/lib/shrine/plugins/migration_helpers.rb +0 -70
  206. data/lib/shrine/plugins/moving.rb +0 -57
  207. data/lib/shrine/plugins/multi_delete.rb +0 -32
  208. data/lib/shrine/plugins/parallelize.rb +0 -78
  209. data/lib/shrine/plugins/parsed_json.rb +0 -29
data/CHANGELOG.md CHANGED
@@ -1,26 +1,468 @@
1
- ## 2.19.4 (2020-01-16)
1
+ ## 3.4.0 (2021-06-14)
2
2
 
3
- * Relax Down version to allow 5.x (@janko)
3
+ * `base` Fix passing options to `Shrine.Attachment` on Ruby 3.0 (@lucianghinda)
4
4
 
5
- ## 2.19.3 (2019-08-09)
5
+ * `determine_mime_type` – Return correct `image/svg+xml` MIME type for SVGs with `:fastimage` analyzer (@Bandes)
6
6
 
7
- * `store_dimensions` – Ignore dimensions extraction errors by default (@janko)
7
+ * `activerecord` – Fix keyword argument warning when adding errors with options (@janko)
8
8
 
9
- * `file_system` – Un-deprecate `FileSystem#upload` receiving unrecognized options (@janko)
9
+ * `entity` – Make `Attacher#read` method public (@janko)
10
10
 
11
- ## 2.19.2 (2019-07-25)
11
+ * `entity` – Reset attachment dirty tracking in `Attacher#reload` (@janko)
12
12
 
13
- * `default_url_options` – Allow deleting passed options when using a block (@janko)
13
+ * `activerecord` – Don't load the attacher on `ActiveRecord::Base#reload` if it hasn't yet been initialized (@janko)
14
14
 
15
- * `activerecord` – Make it work with ActiveRecord 3 (@texpert)
15
+ * `sequel` – Don't load the attacher on `Sequel::Model#reload` if it hasn't yet been initialized (@janko)
16
16
 
17
- * `infer_extension` – Fix compatibility with `pretty_location` plugin (@janko)
17
+ ## 3.3.0 (2020-10-04)
18
18
 
19
- ## 2.19.1 (2019-07-20)
19
+ * `s3` - Support new `Aws::S3::EncryptionV2::Client` for client-side encryption (@janko)
20
20
 
21
- * Bring back support for Ruby 2.3 (@janko)
21
+ * `derivation_endpoint` Reduce possibility of timing attacks when comparing signatures (@esparta)
22
22
 
23
- ## 2.19.0 (2019-07-18)
23
+ * `derivatives` – Avoid downloading the attached file when calling default no-op processor (@janko)
24
+
25
+ * `derivatives` – Add `:download` processor setting for skipping downloading source file (@jrochkind, @janko)
26
+
27
+ * `derivatives` – Copy non-file source IO objects into local file before passing them to the processor (@jrochkind)
28
+
29
+ * `sequel` – Call `Attacher#reload` in `Sequel::Model#reload`, which keeps rest of attacher state (@janko, @jrochkind)
30
+
31
+ * `activerecord` – Call `Attacher#reload` in `ActiveRecord::Base#reload`, which keeps rest of attacher state (@janko, @jrochkind)
32
+
33
+ * `add_metadata` – Add `:skip_nil` option for excluding metadata keys whose values are nil (@renchap)
34
+
35
+ * `store_dimensions` – Add `:auto_extraction` option for disabling automatically extracting dimensions on upload (@renchap)
36
+
37
+ * `mirroring` – Forward original upload options when mirroring upload (@corneverbruggen)
38
+
39
+ * `derivation_endpoint` – Apply `version` URL option in derivation endpoint (@janko)
40
+
41
+ * `remove_attachment` – Delete removed file if a new file was attached right after removal (@janko)
42
+
43
+ * `upload_endpoint` – Fix `Shrine.upload_response` not working in a Rails controller (@pldavid2)
44
+
45
+ * `presign_endpoint` – Add `OPTIONS` route that newer versions of Uppy check (@janko)
46
+
47
+ * `derivatives` – Add `:create_on_promote` option for auto-creating derivatives on promotion (@janko)
48
+
49
+ * `s3` – Add back support for client-side encryption (@janko)
50
+
51
+ * `memory` – Ensure `Memory#open` returns content in original encoding (@jrochkind)
52
+
53
+ ## 3.2.2 (2020-08-05)
54
+
55
+ * `s3` – Fix `S3#open` not working on aws-sdk-core 3.104 and above (@janko)
56
+
57
+ ## 3.2.1 (2020-01-12)
58
+
59
+ * `derivation_endpoint` – Use `Rack::Files` constant on Rack >= 2.1 (@janko)
60
+
61
+ * Fix Ruby 2.7 warnings regarding separation of positional and keyword arguments (@janko)
62
+
63
+ * `s3` – Make `S3#open` handle empty S3 objects (@janko)
64
+
65
+ ## 3.2.0 (2019-12-17) [[release notes]](https://shrinerb.com/docs/release_notes/3.2.0)
66
+
67
+ * `validation` – Run validation on `Attacher#attach` & `Attacher#attach_cached` instead of `Attacher#change` (@janko)
68
+
69
+ * `remove_invalid` – Activate also when `Attacher#validate` is run manually (@janko)
70
+
71
+ * `remove_invalid` – Fix incompatibility with `derivatives` plugin (@janko)
72
+
73
+ * `type_predicates` – Add new plugin with convenient `UploadedFile` predicate methods based on MIME type (@janko)
74
+
75
+ * `core` – Allow assigning back current attached file data (@janko)
76
+
77
+ * `derivatives` – Fix `:derivative` value inconsistency when derivatives are being promoted (@janko)
78
+
79
+ * `add_metadata` – Add `#add_metadata` method for adding metadata to uploaded files (@janko)
80
+
81
+ * `derivatives` – Add `:io` and `:attacher` values to instrumentation event payload (@janko)
82
+
83
+ ## 3.1.0 (2019-11-15) [[release notes]](https://shrinerb.com/docs/release_notes/3.1.0)
84
+
85
+ * `default_storage` – Coerce storage key to symbol in `Attacher#cache_key` & `Attacher#store_key` (@janko)
86
+
87
+ * `core` – Coerce storage key to symbol in `Attacher#cache_key` & `Attacher#store_key` (@janko)
88
+
89
+ * `add_metadata` – Define metadata methods only for the target uploader class (@janko)
90
+
91
+ * `derivatives` – Add `:storage` option to `Attacher#create_derivatives` (@janko)
92
+
93
+ * `store_dimensions` – Propagate exceptions on loading `ruby-vips` in `:vips` analyzer (@janko)
94
+
95
+ * `signature` – Allow skipping rewinding by passing `rewind: false` to `Shrine.signature` (@janko)
96
+
97
+ * `derivatives` – Add `Attacher.derivatives` alias for `Attacher.derivatives_processor` (@janko)
98
+
99
+ ## 3.0.1 (2019-10-17) [[release notes]](https://shrinerb.com/docs/release_notes/3.0.1)
100
+
101
+ * `metadata_attributes` – Fix exception being raised when there is no attached file (@janko)
102
+
103
+ * `core` – Simplify `UploadedFile#inspect` output (@janko)
104
+
105
+ ## 3.0.0 (2019-10-14) [[release notes]](https://shrinerb.com/docs/release_notes/3.0.0)
106
+
107
+ * `derivation_endpoint` – Pass `action: :derivation` when uploading derivation results (@janko)
108
+
109
+ * `core` – Add `Shrine::Attachment[]` shorthand for `Shrine::Attachment.new` (@janko)
110
+
111
+ * `core` – Add `Storage#delete_prefixed` method for deleting all files in specified directory (@jrochkind)
112
+
113
+ * `linter` – Return `true` in `Storage::Linter#call` so that it can be used with `assert` (@jrochkind)
114
+
115
+ * `linter` – Allow `Storage::Linter` to accept a key that will be used for testing nonexistent file (@janko)
116
+
117
+ * `core` – Infer file extension from `filename` metadata (@janko)
118
+
119
+ * `pretty_location` – Add `:class_underscore` option for underscoring class name (@Uysim)
120
+
121
+ * Update `down` dependency to `~> 5.0` (@janko)
122
+
123
+ * `multi_cache` – Add new plugin for whitelisting additional temporary storages (@janko, @jrochkind)
124
+
125
+ * `sequel` – Extract callback code into attacher methods that can be overridden (@janko)
126
+
127
+ * `activerecord` – Extract callback code into attacher methods that can be overridden (@janko)
128
+
129
+ * `derivation_endpoint` – Stop re-opening `File` objects returned in derivation result (@janko)
130
+
131
+ * `derivation_endpoint` – Allow only `File` or `Tempfile` object as derivation result (@janko)
132
+
133
+ * `download_endpoint` – Add `Shrine.download_response` for calling in controller (@janko)
134
+
135
+ * `core` – Fetch storage object lazily in `Shrine` instance (@janko)
136
+
137
+ * `mirroring` – Add new plugin for replicating uploads and deletes to other storages (@janko)
138
+
139
+ * `sequel` – Rename `:callbacks` option to `:hooks` (@janko)
140
+
141
+ * `model` – Add `Attacher#set_model` for setting model without loading attachment (@janko)
142
+
143
+ * `entity` – Add `Attacher#set_entity` for setting entity without loading attachment (@janko)
144
+
145
+ * `entity` – Define `#<name>_attacher` class method when including `Shrine::Attachment` (@janko)
146
+
147
+ * `derivation_endpoint` – Send only `:derivation` in the instrumentation event payload (@janko)
148
+
149
+ * `default_storage` – Add `Attacher.default_cache` and `Attacher.default_store` for settings (@janko)
150
+
151
+ * `default_storage` – Deprecate `record` & `name` arguments to storage block (@janko)
152
+
153
+ * `default_storage` – Evaluate storage block in context of `Attacher` instance (@janko)
154
+
155
+ * Unify persistence plugin interface (@janko)
156
+
157
+ * `upload_options` – Keep `Shrine#_upload` private (@janko)
158
+
159
+ * `infer_extension` – Keep `Shrine#basic_location` private (@janko)
160
+
161
+ * `model` – Add `#<name>_changed?` method to attachment module (@janko)
162
+
163
+ * Make it easier for plugins to define entity and model attachment methods (@janko)
164
+
165
+ * `form_assign` – Add new plugin for assigning attachment from form params without a form object (@janko)
166
+
167
+ * `derivation_endpoint` – Allow passing generic IO objects to `Derivation#upload` (@janko)
168
+
169
+ * `derivation_endpoint` – Accept additional uploader options in `Derivation#upload` (@janko)
170
+
171
+ * `derivation_endpoint` – Close the uploaded file in `Derivation#upload` (@janko)
172
+
173
+ * `core` – Stop rescuing `IO#close` exceptions in `Shrine#upload` (@janko)
174
+
175
+ * `core` – Add `:delete` option to `Shrine#upload` for deleting uploaded file (@janko)
176
+
177
+ * `s3` – Stop returning `:object` in `Down::ChunkedIO#data` in `S3#open` (@janko)
178
+
179
+ * `s3` – Eliminate `#head_object` request in `S3#open` (@janko)
180
+
181
+ * `download_endpoint` – Remove extra `Storage#exists?` check (@janko)
182
+
183
+ * `derivation_endpoint` – Add `Derivation#opened` for retrieving an opened derivation result (@janko)
184
+
185
+ * `derivation_endpoint` – Remove extra `Storage#exists?` check when `:upload` is enabled but not `:upload_redirect` (@janko)
186
+
187
+ * `derivation_endpoint` - Don't pass source `UploadedFile` object when `:download` is `false` (@janko)
188
+
189
+ * `derivation_endpoint` – Remove `:include_uploaded_file` option (@janko)
190
+
191
+ * `derivation_endpoint` – Evaluate derivation block in context of `Shrine::Derivation` (@janko)
192
+
193
+ * `derivation_endpoint` – Remove `:download_errors` option (@janko)
194
+
195
+ * `memory` – Raise `Shrine::FileNotFound` on nonexistent file in `Memory#open` (@janko)
196
+
197
+ * `file_system` – Raise `Shrine::FileNotFound` on nonexistent file in `FileSystem#open` (@janko)
198
+
199
+ * `s3` – Raise `Shrine::FileNotFound` on nonexistent object in `S3#open` (@janko)
200
+
201
+ * `core` – Add `Shrine::FileNotFound` exception and require storages to raise it on `Storage#open` (janko)
202
+
203
+ * `instrumentation` – Remove `:metadata` from `:options` in `metadata.shrine` event (@janko)
204
+
205
+ * `instrumentation` – Remove `:location`, `:upload_options` and `:metadata` from `:options` in `upload.shrine` event (@janko)
206
+
207
+ * `instrumentation` – Add `:metadata` to the `upload.shrine` event (@janko)
208
+
209
+ * `download_endpoint` – Drop support for legacy `/:storage/:id` URLs (@janko)
210
+
211
+ * `core` – In `UploadedFile#==` require files to be of the same class (@janko)
212
+
213
+ * `core` – Add `:close` option to `Shrine#upload` for preventing closing file after upload (@janko)
214
+
215
+ * `memory` – Add `Shrine::Storage::Memory` from `shrine-memory` gem (@janko)
216
+
217
+ * `default_url_options` – Rename to just `url_options` (@janko)
218
+
219
+ * `delete_raw` – Deprecate plugin in favour of `derivatives` (@janko)
220
+
221
+ * `recache` – Deprecate plugin in favour of `derivatives` (@janko)
222
+
223
+ * `processing` – Deprecate plugin in favour of `derivatives` (@janko)
224
+
225
+ * `versions` – Deprecate plugin in favour of `derivatives` (@janko)
226
+
227
+ * `derivatives` – Add new plugin for storing processed files (@janko)
228
+
229
+ * `derivation_endpoint` – Allow using symbol and string derivation names interchangeably (@janko)
230
+
231
+ * `dynamic_storage` – Remove `Shrine.dynamic_storages` method (@janko)
232
+
233
+ * `core` – Deep duplicate `Shrine.opts` on subclassing (@janko)
234
+
235
+ * `core` – Add `Attacher#file!` which asserts that a file is attached (@janko)
236
+
237
+ * `core` – Change `Shrine.uploaded_file` to raise `ArgumentError` on invalid input (@janko)
238
+
239
+ * `module_include` – Deprecate plugin over overriding core classes directly (@janko)
240
+
241
+ * `core` – Add `Attacher#cache_key` and `Attacher#store_key` which return storage identifiers (@janko)
242
+
243
+ * `linter` – Call `Storage#open` with options as second argument (@janko)
244
+
245
+ * `core` – Allow data hash passed to `UploadedFile.new` to have symbol keys (@janko)
246
+
247
+ * `core` – Change how `Shrine::UploadedFile` sets its state from the given data hash (@janko)
248
+
249
+ * `core` – Deprecate `Storage#open` not accepting additional options (@janko)
250
+
251
+ * `refresh_metadata` – Add `Attacher#refresh_metadata!` method which integrates with `model` plugin (@janko)
252
+
253
+ * `instrumentation` – Instrument any `Storage#open` calls in a new `open.shrine` event (@janko)
254
+
255
+ * `restore_cached_data` – Forward options passed to `Attacher#attach_cached` to metadata extraction (@janko)
256
+
257
+ * `validation` – Allow skipping validations on attaching by passing `validate: false` (@janko)
258
+
259
+ * `validation` – Add `:validate` option to `Attacher#assign` or `Attacher#attach` for passing options to validation block (@janko)
260
+
261
+ * `validation` – Extract validation functionality into the new plugin (@janko)
262
+
263
+ * `upload_options` – Upload options from the block are now merged with passed options instead of replaced (@janko)
264
+
265
+ * `upload_endpoint` – Stop passing `Rack::Request` object to the uploader (@janko)
266
+
267
+ * `remote_url` – Require custom downloaders to raise `Shrine::Plugins::RemoteUrl::DownloadError` for conversion into a validation error (@janko)
268
+
269
+ * `infer_extension` – Fix compatibility with the `pretty_location` plugin (@janko)
270
+
271
+ * `presign_endpoint` – Remove deprecated `Shrine::Plugins::PresignEndpoint::App` constant (@janko)
272
+
273
+ * `keep_files` – Remove the ability to choose whether to keep only destroyed or only replaced files (@janko)
274
+
275
+ * `infer_extension` – Remove `Shrine#infer_extension` method (@janko)
276
+
277
+ * `default_url_options` – Allow overriding passed URL options by deleting them inside the block (@janko)
278
+
279
+ * `cached_attachment_data` – Rename `Attacher#read_cached` to `Attacher#cached_data` (@janko)
280
+
281
+ * `sequel` – Add `Attacher#atomic_promote` and `Attacher#atomic_persist` (@janko)
282
+
283
+ * `sequel` – Remove persistence from `Attacher#promote` (@janko)
284
+
285
+ * `activerecord` – Remove persistence from `Attacher#promote` (@janko)
286
+
287
+ * `atomic_helpers` – Add new plugin with helper methods for atomic promotion and persistence (@janko)
288
+
289
+ * `backgrounding` – Add `Attacher#promote_block` & `Attacher#destroy_block` for overriding class level blocks (@janko)
290
+
291
+ * `backgrounding` – Add `Attacher.promote_block` & `Attacher.destroy_block` on class level (@janko)
292
+
293
+ * `backgrounding` – Remove overriding `Attacher#swap` with atomic promotion (@janko)
294
+
295
+ * `backgrounding` – Remove `Attacher.promote`, `Attacher.delete`, `Attacher.dump`, `Attacher#dump`, `Attacher.load`, `Attacher.load_record` (@janko)
296
+
297
+ * `model` – Allow disabling caching to temporary storage on assignment (@janko)
298
+
299
+ * `model` – Add `Attacher.from_model`, `Attacher#write` (@janko)
300
+
301
+ * `model` – Add new plugin for integrating with mutable structs (@janko)
302
+
303
+ * `entity` – Add `Attacher.from_entity`, `Attacher#reload`, `Attacher#column_values`, `Attacher#attribute` (@janko)
304
+
305
+ * `entity` – Add new plugin for integrating with immutable structs (@janko)
306
+
307
+ * `column` – Allow changing column serializer from default `JSON` library (@janko)
308
+
309
+ * `column` – Add `Attacher#column_data` and `Attacher.from_column` methods (@janko)
310
+
311
+ * `column` – Add new plugin for (de)serializing attacher data (@janko)
312
+
313
+ * `attachment` – Removed any default attachment methods (@janko)
314
+
315
+ * `core` – Require context hash passed as second argument to `Shrine#upload` to have symbol keys (@janko)
316
+
317
+ * `core` – Change `Shrine.uploaded_file` not to yield files anymore (@janko)
318
+
319
+ * `core` – Allow `Shrine.uploaded_file` to accept file data hashes with symbol keys (@janko)
320
+
321
+ * `core` – Remove `Shrine#uploaded?`
322
+
323
+ * `core` – Remove `Shrine#delete`, `Shrine#_delete`, `Shrine#remove` (@janko)
324
+
325
+ * `core` – Remove `Shrine#store`, `Shrine#_store`, `Shrine#put`, `Shrine#copy` (@janko)
326
+
327
+ * `core` – Remove `Shrine#processed`, `Shrine#process` (@janko)
328
+
329
+ * `core` – Don't pass `:phase` anymore on uploads (@janko)
330
+
331
+ * `core` – Read attachment from the record attribute only on initialization (@janko)
332
+
333
+ * `core` – Don't require a temporary storage (@janko)
334
+
335
+ * `core` – Add `Attacher#data` and `Attacher.from_data` for dumping to and loading from a Hash (@janko)
336
+
337
+ * `core` – Change `Attacher#assign` to raise exception when non-cached file is assigned (@janko)
338
+
339
+ * `core` – Enable `Attacher#assign` to accept cached file data as a Hash (@janko)
340
+
341
+ * `core` – Add `Attacher#file` alias for `Attacher#get` (@janko)
342
+
343
+ * `core` – Change `Attacher#attached?` to return whether a file is attached (@janko)
344
+
345
+ * `core` – Change `Attacher#promote` to always only save promoted file in memory (@janko)
346
+
347
+ * `core` – Rename `Attacher#replace` to `Attacher#destroy_previous` (@janko)
348
+
349
+ * `core` – Remove `Attacher#_promote` and `Attacher#_delete`, add `Attacher#promote_cached` and `Attacher#destroy_attached` (@janko)
350
+
351
+ * `core` – Rename `Attacher#set` and `Attacher#_set` to `Attacher#change` and `Attacher#set` (@janko)
352
+
353
+ * `core` – Remove `Attacher#cache!` and `Attacher#store!`, add `Attacher#upload` (@janko)
354
+
355
+ * `core` – Rename `Attacher#validate_block` to `Attacher#_validate` (@janko)
356
+
357
+ * `core` – Add `Attacher#attach`, `Attacher#attach_cached`, extracted from `Attacher#assign` (@janko)
358
+
359
+ * `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)
360
+
361
+ * `core` – Change `Attacher.new` to not accept a model anymore (@janko)
362
+
363
+ * `delete_promoted` – Remove plugin (@janko)
364
+
365
+ * `parsed_json` – Remove plugin (@janko)
366
+
367
+ * `parallelize` – Remove plugin (@janko)
368
+
369
+ * `hooks` – Remove plugin (@janko)
370
+
371
+ * `core` – Remove deprecated `Shrine::IO_METHODS` constant (@janko)
372
+
373
+ * `s3` – Replace source object metadata when copying a file from S3 (@janko)
374
+
375
+ * `core` – Change `UploadedFile#storage_key` to return a Symbol instead of a String (@janko)
376
+
377
+ * `infer_extension` – Make `:mini_mime` the default analyzer (@janko)
378
+
379
+ * Bring back Ruby 2.3 support (@janko)
380
+
381
+ * `versions` – Remove deprecated `:version_names`, `Shrine.version_names` and `Shrine.version?` (@janko)
382
+
383
+ * `validation_helpers` – Remove support for regexes in MIME type or extension validations (@janko)
384
+
385
+ * `validation_helpers` – Don't require `#width` and `#height` methods to be defined on `UploadedFile` (@janko)
386
+
387
+ * `validation_helpers` – Fail dimensions validations when `width` or `height` metadata is missing (@janko)
388
+
389
+ * `upload_endpoint` – Remove deprecated `Shrine::Plugins::UploadEndpoint::App` constant (@janko)
390
+
391
+ * `determine_mime_type` – Remove `Shrine#mime_type_analyzers` method (@janko)
392
+
393
+ * `store_dimensions` – Remove `Shrine#extract_dimensions` and `Shrine#dimensions_analyzers` methods (@janko)
394
+
395
+ * `rack_file` – Remove deprecated `Shrine::Plugins::RackFile::UploadedFile` constant (@janko)
396
+
397
+ * `rack_file` – Drop support for passing file hash to `Shrine#upload` and `Shrine#store` (@janko)
398
+
399
+ * `download_endpoint` – Move `Shrine::Plugins::DownloadEndpoint::App` into `Shrine::DownloadEndpoint` (@janko)
400
+
401
+ * `download_endpoint` – Remove deprecated `Shrine::DownloadEndpoint` constant (@janko)
402
+
403
+ * `download_endpoint` – Remove deprecated `:storages` option (@janko)
404
+
405
+ * `determine_mime_type` – Remove deprecated `:default` analyzer alias (@janko)
406
+
407
+ * `default_url` – Remove deprecated block argument when loading the plugin (@janko)
408
+
409
+ * `data_uri` – Remove deprecated `Shrine::Plugins::DataUri::DataFile` constant (@janko)
410
+
411
+ * `data_uri` – Remove deprecated `:filename` plugin option (@janko)
412
+
413
+ * `cached_attachment_data` – Remove deprecated model setter (@janko)
414
+
415
+ * `file_system` – Remove deprecated `:older_than` option in `FileSystem#clear!` (@janko)
416
+
417
+ * `file_system` – Don't accept a block anymore in `FileSystem#open` (@janko)
418
+
419
+ * `file_system` – Remove deprecated `FileSystem#download` method (@janko)
420
+
421
+ * `file_system` – Make `FileSystem#movable?` and `FileSystem#move` methods private (@janko)
422
+
423
+ * `file_system` – Remove deprecation warning on unrecognized options in `FileSystem#upload` (@janko)
424
+
425
+ * `file_system` – Remove deprecated `:host` option for `FileSystem#initialize` (@janko)
426
+
427
+ * `moving` – Remove deprecated plugin (@janko)
428
+
429
+ * `multi_delete` – Remove deprecated plugin (@janko)
430
+
431
+ * `direct_upload` – Remove deprecated plugin (@janko)
432
+
433
+ * `backup` – Remove deprecated plugin (@janko)
434
+
435
+ * `background_helpers` – Remove deprecated plugin (@janko)
436
+
437
+ * `migration_helpers` – Remove deprecated plugin (@janko)
438
+
439
+ * `copy` – Remove deprecated plugin (@janko)
440
+
441
+ * `logging` – Remove deprecated plugin (@janko)
442
+
443
+ * `s3` – Remove deprecated `S3#download` method (@janko)
444
+
445
+ * `s3` – Remove deprecated `S3#stream` method (@janko)
446
+
447
+ * `presign_endpoint` – Drop support for presign objects that don't respond to `#to_h` (@janko)
448
+
449
+ * `s3` – Return a Hash in `S3#presign` when method is POST (@janko)
450
+
451
+ * `s3` – Remove `:download` option in `S3#url` (@janko)
452
+
453
+ * `s3` – Remove support for non URI-escaped content disposition values (@janko)
454
+
455
+ * `s3` – Remove `S3#s3` method (@janko)
456
+
457
+ * `s3` – Remove support for specifying `:multipart_threshold` as an integer (@janko)
458
+
459
+ * `s3` – Remove `:host` option on `S3#initialize` (@janko)
460
+
461
+ * `s3` – Drop support for `aws-sdk-s3` versions lower than 1.14 (@janko)
462
+
463
+ * `s3` – Drop support for `aws-sdk` 2.x (@janko)
464
+
465
+ ## 2.19.0 (2019-07-18) [[release notes]](https://shrinerb.com/docs/release_notes/2.19.0)
24
466
 
25
467
  * `pretty_location` – Allow specifying a different identifier from `id` (@00dav00)
26
468
 
@@ -76,7 +518,7 @@
76
518
 
77
519
  * `core` – Allow registering storage objects under string keys (@janko)
78
520
 
79
- ## 2.18.0 (2019-06-24)
521
+ ## 2.18.0 (2019-06-24) [[release notes]](https://shrinerb.com/docs/release_notes/2.18.0)
80
522
 
81
523
  * `core` – Add `Shrine.upload` method as a shorthand for `Shrine.new(...).upload(...)` (@janko)
82
524
 
@@ -100,7 +542,7 @@
100
542
 
101
543
  * `parsed_json` – Fix overriden `Attacher#assign` not accepting second argument (@janko)
102
544
 
103
- ## 2.17.0 (2019-05-06)
545
+ ## 2.17.0 (2019-05-06) [[release notes]](https://shrinerb.com/docs/release_notes/2.17.0)
104
546
 
105
547
  * `data_uri` – Add `Attacher#assign_data_uri` which accepts additional `Shrine#upload` options (@janko)
106
548
 
@@ -150,7 +592,7 @@
150
592
 
151
593
  * `parsed_json` – Accepts hashes with symbols keys (@aglushkov)
152
594
 
153
- ## 2.16.0 (2019-02-18)
595
+ ## 2.16.0 (2019-02-18) [[release notes]](https://shrinerb.com/docs/release_notes/2.16.0)
154
596
 
155
597
  * `derivation_endpoint` – Add `:upload_open_options` for download option for derivation result (@janko)
156
598
 
@@ -176,7 +618,7 @@
176
618
 
177
619
  * Fix `store_dimensions` plugin making second argument in `Shrine#extract_metadata` mandatory (@jrochkind)
178
620
 
179
- ## 2.15.0 (2019-02-08)
621
+ ## 2.15.0 (2019-02-08) [[release notes]](https://shrinerb.com/docs/release_notes/2.15.0)
180
622
 
181
623
  * Add `derivation_endpoint` plugin for processing uploaded files on-the-fly (@janko)
182
624
 
@@ -186,7 +628,7 @@
186
628
 
187
629
  * Yield a new File object on `Shrine.with_file` when `tempfile` plugin is loaded (@janko)
188
630
 
189
- ## 2.14.0 (2018-12-27)
631
+ ## 2.14.0 (2018-12-27) [[release notes]](https://shrinerb.com/docs/release_notes/2.14.0)
190
632
 
191
633
  * Add `tempfile` plugin for easier reusing of the same uploaded file copy on disk (@janko)
192
634
 
@@ -256,7 +698,7 @@
256
698
 
257
699
  * Use a guard raise cause for `bucket` argument in S3 for an appropriate error message (@ardecvz)
258
700
 
259
- ## 2.13.0 (2018-11-04)
701
+ ## 2.13.0 (2018-11-04) [[release notes]](https://shrinerb.com/docs/release_notes/2.13.0)
260
702
 
261
703
  * Specify UTF-8 charset in `Content-Type` response header in `presign_endpoint` plugin (@janko)
262
704
 
@@ -288,7 +730,7 @@
288
730
 
289
731
  * In `S3#upload` deprecate using aws-sdk-s3 lower than 1.14 when uploading IO objects of unknown size (@janko)
290
732
 
291
- ## 2.12.0 (2018-08-22)
733
+ ## 2.12.0 (2018-08-22) [[release notes]](https://shrinerb.com/docs/release_notes/2.12.0)
292
734
 
293
735
  * Ignore nil values when assigning files from a remote URL (@janko)
294
736
 
@@ -316,7 +758,7 @@
316
758
 
317
759
  * Make `UploadedFile#open` always open a new IO object and close the previous one (@janko)
318
760
 
319
- ## 2.11.0 (2018-04-28)
761
+ ## 2.11.0 (2018-04-28) [[release notes]](https://shrinerb.com/docs/release_notes/2.11.0)
320
762
 
321
763
  * Add `Shrine.with_file` for temporarily converting an IO-like object into a file (@janko)
322
764
 
@@ -344,7 +786,7 @@
344
786
 
345
787
  * Deprecate `direct_upload` plugin in favor of `upload_endpoint` and `presign_endpoint` plugins (@janko)
346
788
 
347
- ## 2.10.0 (2018-03-28)
789
+ ## 2.10.0 (2018-03-28) [[release notes]](https://shrinerb.com/docs/release_notes/2.10.0)
348
790
 
349
791
  * Add `:fastimage` analyzer to `determine_mime_type` plugin (@mokolabs)
350
792
 
@@ -366,7 +808,7 @@
366
808
 
367
809
  * Inherit the logger on subclassing `Shrine` and make it shared across subclasses (@hmistry)
368
810
 
369
- ## 2.9.0 (2018-01-27)
811
+ ## 2.9.0 (2018-01-27) [[release notes]](https://shrinerb.com/docs/release_notes/2.9.0)
370
812
 
371
813
  * Support arrays of files in `versions` plugin (@janko)
372
814
 
@@ -390,7 +832,7 @@
390
832
 
391
833
  * Allow passing options to `Model#<attachment>_attacher` for overriding `Attacher` options (@janko)
392
834
 
393
- ## 2.8.0 (2017-10-11)
835
+ ## 2.8.0 (2017-10-11) [[release notes]](https://shrinerb.com/docs/release_notes/2.8.0)
394
836
 
395
837
  * Expand relative directory paths when initializing `Storage::FileSystem` (@janko)
396
838
 
@@ -420,7 +862,7 @@
420
862
 
421
863
  * Update `direct_upload` plugin to support Roda 3 (@janko)
422
864
 
423
- ## 2.7.0 (2017-09-11)
865
+ ## 2.7.0 (2017-09-11) [[release notes]](https://shrinerb.com/docs/release_notes/2.7.0)
424
866
 
425
867
  * Deprecate the `Shrine::DownloadEndpoint` constant over `Shrine.download_endpoint` (@janko)
426
868
 
@@ -488,11 +930,11 @@
488
930
 
489
931
  * Don't add a newline at the end of the base64-formatted signature (@janko)
490
932
 
491
- ## 2.6.1 (2017-04-12)
933
+ ## 2.6.1 (2017-04-12) [[release notes]](https://shrinerb.com/docs/release_notes/2.6.1)
492
934
 
493
935
  * Fix `download_endpoint` returning incorrect reponse body in some cases (@janko)
494
936
 
495
- ## 2.6.0 (2017-04-04)
937
+ ## 2.6.0 (2017-04-04) [[release notes]](https://shrinerb.com/docs/release_notes/2.6.0)
496
938
 
497
939
  * Make `Shrine::Storage::FileSystem#path` public which returns path to the file as a `Pathname` object (@janko)
498
940
 
@@ -564,7 +1006,7 @@
564
1006
 
565
1007
  * Raise `Shrine::Error` when `Shrine#generate_location` returns nil (@janko)
566
1008
 
567
- ## 2.5.0 (2016-11-11)
1009
+ ## 2.5.0 (2016-11-11) [[release notes]](https://shrinerb.com/docs/release_notes/2.5.0)
568
1010
 
569
1011
  * Add `Attacher.default_url` as the idiomatic way of declaring default URLs (@janko)
570
1012
 
@@ -590,7 +1032,7 @@
590
1032
 
591
1033
  * Make it possible to extract multiple metadata values at once with the `add_metadata` plugin (@janko)
592
1034
 
593
- ## 2.4.1 (2016-10-17)
1035
+ ## 2.4.1 (2016-10-17) [[release notes]](https://shrinerb.com/docs/release_notes/2.4.1)
594
1036
 
595
1037
  * Move back JSON serialization from `Attacher#write` to `Attacher#_set` (@janko)
596
1038
 
@@ -600,7 +1042,7 @@
600
1042
 
601
1043
  * In `UploadedFile#download` use extension from `#original_filename` if `#id` doesn't have it (@janko)
602
1044
 
603
- ## 2.4.0 (2016-10-11)
1045
+ ## 2.4.0 (2016-10-11) [[release notes]](https://shrinerb.com/docs/release_notes/2.4.0)
604
1046
 
605
1047
  * Add `#convert_before_write` and `#convert_after_read` on the Attacher for data attribute conversion (@janko)
606
1048
 
@@ -636,11 +1078,11 @@
636
1078
 
637
1079
  * Override `#to_s` in `Shrine::Attachment` for better introspection with `puts` (@janko)
638
1080
 
639
- ## 2.3.1 (2016-09-01)
1081
+ ## 2.3.1 (2016-09-01) [[release notes]](https://shrinerb.com/docs/release_notes/2.3.1)
640
1082
 
641
1083
  * Don't change permissions of existing directories in FileSystem storage (@janko)
642
1084
 
643
- ## 2.3.0 (2016-08-27)
1085
+ ## 2.3.0 (2016-08-27) [[release notes]](https://shrinerb.com/docs/release_notes/2.3.0)
644
1086
 
645
1087
  * Prevent client from caching the presign response in direct_upload plugin (@janko)
646
1088
 
@@ -666,7 +1108,7 @@
666
1108
 
667
1109
  * Add `:directory_permissions` to `Storage::FileSystem` (@janko)
668
1110
 
669
- ## 2.2.0 (2016-07-29)
1111
+ ## 2.2.0 (2016-07-29) [[release notes]](https://shrinerb.com/docs/release_notes/2.2.0)
670
1112
 
671
1113
  * Soft deprecate `:phase` over `:action` in `context` (@janko)
672
1114
 
@@ -698,11 +1140,11 @@
698
1140
 
699
1141
  * Avoid an additional HEAD request to determine content length in multipart S3 copy (@janko)
700
1142
 
701
- ## 2.1.1 (2016-07-14)
1143
+ ## 2.1.1 (2016-07-14) [[release notes]](https://shrinerb.com/docs/release_notes/2.1.1)
702
1144
 
703
1145
  * Fix `S3#open` throwing a NameError if `net/http` isn't required (@janko)
704
1146
 
705
- ## 2.1.0 (2016-06-27)
1147
+ ## 2.1.0 (2016-06-27) [[release notes]](https://shrinerb.com/docs/release_notes/2.1.0)
706
1148
 
707
1149
  * Remove `:names` from versions plugin, and deprecate generating versions in :cache phase (@janko)
708
1150
 
@@ -718,11 +1160,11 @@
718
1160
 
719
1161
  * Deprecate `#cached_<attachment>_data=` over using `<attachment>` for the hidden field (@janko)
720
1162
 
721
- ## 2.0.1 (2016-05-30)
1163
+ ## 2.0.1 (2016-05-30) [[release notes]](https://shrinerb.com/docs/release_notes/2.0.1)
722
1164
 
723
1165
  * Don't override previously set default_url in versions plugin (@janko)
724
1166
 
725
- ## 2.0.0 (2016-05-19)
1167
+ ## 2.0.0 (2016-05-19) [[release notes]](https://shrinerb.com/docs/release_notes/2.0.0)
726
1168
 
727
1169
  * Include query parameters in CDN-ed S3 URLs, making them work for private objects (@janko)
728
1170
 
@@ -802,17 +1244,17 @@
802
1244
 
803
1245
  * Deprecate loading the backgrounding plugin through the old "background_helpers" alias (@janko)
804
1246
 
805
- ## 1.4.2 (2016-04-19)
1247
+ ## 1.4.2 (2016-04-19) [[release notes]](https://shrinerb.com/docs/release_notes/1.4.2)
806
1248
 
807
1249
  * Removed ActiveRecord's automatic support for optimistic locking as it wasn't stable (@janko)
808
1250
 
809
1251
  * Fixed record's dataset being modified after promoting preventing further updates with the same instance (@janko)
810
1252
 
811
- ## 1.4.1 (2016-04-18)
1253
+ ## 1.4.1 (2016-04-18) [[release notes]](https://shrinerb.com/docs/release_notes/1.4.1)
812
1254
 
813
1255
  * Bring back triggering callbacks on promote in ORM plugins, and add support for optimistic locking (@janko)
814
1256
 
815
- ## 1.4.0 (2016-04-15)
1257
+ ## 1.4.0 (2016-04-15) [[release notes]](https://shrinerb.com/docs/release_notes/1.4.0)
816
1258
 
817
1259
  * Return "Content-Length" response header in download_endpoint plugin (@janko)
818
1260
 
@@ -868,7 +1310,7 @@
868
1310
 
869
1311
  * Fix keep_files not to spawn a background job when file will not be deleted (@janko)
870
1312
 
871
- ## 1.3.0 (2016-03-12)
1313
+ ## 1.3.0 (2016-03-12) [[release notes]](https://shrinerb.com/docs/release_notes/1.3.0)
872
1314
 
873
1315
  * Add `<attachment>_cached?` and `<attachment>_stored?` to migration_helpers plugin (@janko)
874
1316
 
@@ -910,7 +1352,7 @@
910
1352
 
911
1353
  * Fix `NameError` when silencing "missing record" errors in backgrounding (@janko)
912
1354
 
913
- ## 1.2.0 (2016-01-26)
1355
+ ## 1.2.0 (2016-01-26) [[release notes]](https://shrinerb.com/docs/release_notes/1.2.0)
914
1356
 
915
1357
  * Make `Shrine::Attacher.promote` and `Shrine::Attacher.delete` return the record in backgrounding plugin (@janko)
916
1358
 
@@ -926,7 +1368,7 @@
926
1368
 
927
1369
  * Make custom metadata inherited from uploaded files and make `#extract_metadata` called only on caching (@janko)
928
1370
 
929
- ## 1.1.0 (2015-12-26)
1371
+ ## 1.1.0 (2015-12-26) [[release notes]](https://shrinerb.com/docs/release_notes/1.1.0)
930
1372
 
931
1373
  * Rename the "background_helpers" plugin to "backgrounding" (@janko)
932
1374
 
@@ -996,7 +1438,7 @@
996
1438
 
997
1439
  * Reduce length of URLs generated with pretty_location plugin (@gshaw)
998
1440
 
999
- ## 1.0.0 (2015-11-27)
1441
+ ## 1.0.0 (2015-11-27) [[release notes]](https://shrinerb.com/docs/release_notes/1.0.0)
1000
1442
 
1001
1443
  * Improve Windows compatibility in the FileSystem storage (@janko)
1002
1444