activestorage 7.0.8 → 7.1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +188 -271
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +6 -6
  5. data/app/assets/javascripts/activestorage.esm.js +11 -7
  6. data/app/assets/javascripts/activestorage.js +12 -6
  7. data/app/controllers/active_storage/blobs/proxy_controller.rb +1 -0
  8. data/app/controllers/active_storage/disk_controller.rb +4 -2
  9. data/app/controllers/active_storage/representations/proxy_controller.rb +2 -1
  10. data/app/controllers/concerns/active_storage/disable_session.rb +12 -0
  11. data/app/controllers/concerns/active_storage/file_server.rb +4 -1
  12. data/app/javascript/activestorage/blob_record.js +4 -1
  13. data/app/javascript/activestorage/direct_upload.js +3 -2
  14. data/app/javascript/activestorage/index.js +3 -1
  15. data/app/javascript/activestorage/ujs.js +3 -3
  16. data/app/jobs/active_storage/analyze_job.rb +1 -1
  17. data/app/jobs/active_storage/mirror_job.rb +1 -1
  18. data/app/jobs/active_storage/purge_job.rb +1 -1
  19. data/app/jobs/active_storage/transform_job.rb +12 -0
  20. data/app/models/active_storage/attachment.rb +90 -15
  21. data/app/models/active_storage/blob/analyzable.rb +4 -3
  22. data/app/models/active_storage/blob/identifiable.rb +1 -0
  23. data/app/models/active_storage/blob/representable.rb +7 -3
  24. data/app/models/active_storage/blob/servable.rb +22 -0
  25. data/app/models/active_storage/blob.rb +31 -67
  26. data/app/models/active_storage/current.rb +0 -10
  27. data/app/models/active_storage/filename.rb +2 -0
  28. data/app/models/active_storage/named_variant.rb +21 -0
  29. data/app/models/active_storage/preview.rb +11 -4
  30. data/app/models/active_storage/variant.rb +10 -7
  31. data/app/models/active_storage/variant_record.rb +0 -2
  32. data/app/models/active_storage/variant_with_record.rb +21 -7
  33. data/app/models/active_storage/variation.rb +5 -3
  34. data/config/routes.rb +6 -4
  35. data/db/migrate/20170806125915_create_active_storage_tables.rb +1 -1
  36. data/lib/active_storage/analyzer/audio_analyzer.rb +16 -4
  37. data/lib/active_storage/analyzer/image_analyzer.rb +2 -0
  38. data/lib/active_storage/analyzer/video_analyzer.rb +3 -1
  39. data/lib/active_storage/analyzer.rb +2 -0
  40. data/lib/active_storage/attached/changes/create_many.rb +8 -3
  41. data/lib/active_storage/attached/changes/create_one.rb +45 -3
  42. data/lib/active_storage/attached/many.rb +5 -4
  43. data/lib/active_storage/attached/model.rb +72 -43
  44. data/lib/active_storage/attached/one.rb +5 -4
  45. data/lib/active_storage/attached.rb +2 -0
  46. data/lib/active_storage/deprecator.rb +7 -0
  47. data/lib/active_storage/engine.rb +11 -7
  48. data/lib/active_storage/fixture_set.rb +7 -1
  49. data/lib/active_storage/gem_version.rb +4 -4
  50. data/lib/active_storage/log_subscriber.rb +12 -0
  51. data/lib/active_storage/previewer.rb +8 -1
  52. data/lib/active_storage/reflection.rb +3 -3
  53. data/lib/active_storage/service/azure_storage_service.rb +2 -0
  54. data/lib/active_storage/service/disk_service.rb +2 -0
  55. data/lib/active_storage/service/gcs_service.rb +11 -20
  56. data/lib/active_storage/service/mirror_service.rb +10 -5
  57. data/lib/active_storage/service/s3_service.rb +2 -0
  58. data/lib/active_storage/service.rb +4 -2
  59. data/lib/active_storage/transformers/transformer.rb +2 -0
  60. data/lib/active_storage/version.rb +1 -1
  61. data/lib/active_storage.rb +19 -3
  62. metadata +19 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e342b04e0f0e10c35e4f32e52d6a0e0097e74a77982df1a6a39e9424dae4120
4
- data.tar.gz: 86b32ee44b192ec4f376096939712d43c10006e6e2272d8a0de547a69fc1e297
3
+ metadata.gz: c89b7d956e16b4ca848737433bae254a2984dc68ca27524074002faedf85075b
4
+ data.tar.gz: f91ba06642aad7480bf12848d90ba6d777231bbb7ce62e80e432e5d6e2471b35
5
5
  SHA512:
6
- metadata.gz: 0aff23ae574910fb16b69232b28446dd72fead8385a298083dd29a1d237e2f277e6dc98b392dc2364ef20b4181c75d0652f9b5bd9af95b8dbf44a1ebf891d05f
7
- data.tar.gz: 1186e01c13dc861941a1a350dab1bbf1983b71fafeca7f359fcdf84d27ed2fd7a4edf020918be5363550fb67e24628d45e631c3e743b95e8c9b87f9551c388d3
6
+ metadata.gz: aa2a037df3fd0e4a73f5a2482b7baccb91a4c960f742b463ffe6b1c711db61f465668ed4d6ffd817035e8731973b2a95aa4ddbc786850521f262cb9ce8d30b6c
7
+ data.tar.gz: e4a0004214d00be2aadd62cdc79d538ae94982978a1356f8e7ddaf109e502bc52a25571120524663071c02f200a6537bd74c48dfe5447deccfa47c61360be0bf
data/CHANGELOG.md CHANGED
@@ -1,404 +1,321 @@
1
- ## Rails 7.0.8 (September 09, 2023) ##
1
+ ## Rails 7.1.3.2 (February 21, 2024) ##
2
2
 
3
3
  * No changes.
4
4
 
5
5
 
6
- ## Rails 7.0.7.2 (August 22, 2023) ##
6
+ ## Rails 7.1.3.1 (February 21, 2024) ##
7
7
 
8
8
  * No changes.
9
9
 
10
10
 
11
- ## Rails 7.0.7.1 (August 22, 2023) ##
11
+ ## Rails 7.1.3 (January 16, 2024) ##
12
12
 
13
- * No changes.
13
+ * Fix N+1 query when fetching preview images for non-image assets.
14
14
 
15
+ *Aaron Patterson & Justin Searls*
15
16
 
16
- ## Rails 7.0.7 (August 09, 2023) ##
17
+ * Fix all Active Storage database related models to respect
18
+ `ActiveRecord::Base.table_name_prefix` configuration.
17
19
 
18
- * No changes.
20
+ *Chedli Bourguiba*
19
21
 
22
+ * Fix `ActiveStorage::Representations::ProxyController` not returning the proper
23
+ preview image variant for previewable files.
20
24
 
21
- ## Rails 7.0.6 (June 29, 2023) ##
25
+ *Chedli Bourguiba*
22
26
 
23
- * Fix retrieving rotation value from FFmpeg on version 5.0+.
27
+ * Fix `ActiveStorage::Representations::ProxyController` to proxy untracked
28
+ variants.
24
29
 
25
- In FFmpeg version 5.0+ the rotation value has been removed from tags.
26
- Instead the value can be found in side_data_list. Along with
27
- this update it's possible to have values of -90, -270 to denote the video
28
- has been rotated.
30
+ *Chedli Bourguiba*
29
31
 
30
- *Haroon Ahmed*
32
+ * Fix direct upload forms when submit button contains nested elements.
31
33
 
34
+ *Marc Köhlbrugge*
32
35
 
33
- ## Rails 7.0.5.1 (June 26, 2023) ##
36
+ * When using the `preprocessed: true` option, avoid enqueuing transform jobs
37
+ for blobs that are not representable.
34
38
 
35
- * No changes.
39
+ *Chedli Bourguiba*
36
40
 
41
+ * Process preview image variant when calling `ActiveStorage::Preview#processed`.
42
+ For example, `attached_pdf.preview(:thumb).processed` will now immediately
43
+ generate the full-sized preview image and the `:thumb` variant of it.
44
+ Previously, the `:thumb` variant would not be generated until a further call
45
+ to e.g. `processed.url`.
37
46
 
38
- ## Rails 7.0.5 (May 24, 2023) ##
47
+ *Chedli Bourguiba* and *Jonathan Hefner*
39
48
 
40
- * No changes.
49
+ * Prevent `ActiveRecord::StrictLoadingViolationError` when strict loading is
50
+ enabled and the variant of an Active Storage preview has already been
51
+ processed (for example, by calling `ActiveStorage::Preview#url`).
41
52
 
53
+ *Jonathan Hefner*
42
54
 
43
- ## Rails 7.0.4.3 (March 13, 2023) ##
55
+ * Fix `preprocessed: true` option for named variants of previewable files.
44
56
 
45
- * No changes.
57
+ *Nico Wenterodt*
46
58
 
47
59
 
48
- ## Rails 7.0.4.2 (January 24, 2023) ##
60
+ ## Rails 7.1.2 (November 10, 2023) ##
49
61
 
50
62
  * No changes.
51
63
 
52
64
 
53
- ## Rails 7.0.4.1 (January 17, 2023) ##
65
+ ## Rails 7.1.1 (October 11, 2023) ##
54
66
 
55
67
  * No changes.
56
68
 
57
69
 
58
- ## Rails 7.0.4 (September 09, 2022) ##
59
-
60
- * Fixes proxy downloads of files over 5MiB
61
-
62
- Previously, trying to view and/or download files larger than 5mb stored in
63
- services like S3 via proxy mode could return corrupted files at around
64
- 5.2mb or cause random halts in the download. Now,
65
- `ActiveStorage::Blobs::ProxyController` correctly handles streaming these
66
- larger files from the service to the client without any issues.
67
-
68
- Fixes #44679
69
-
70
- *Felipe Raul*
71
-
72
- ## Rails 7.0.3.1 (July 12, 2022) ##
70
+ ## Rails 7.1.0 (October 05, 2023) ##
73
71
 
74
72
  * No changes.
75
73
 
76
74
 
77
- ## Rails 7.0.3 (May 09, 2022) ##
78
-
79
- * Don't stream responses in redirect mode
80
-
81
- Previously, both redirect mode and proxy mode streamed their
82
- responses which caused a new thread to be created, and could end
83
- up leaking connections in the connection pool. But since redirect
84
- mode doesn't actually send any data, it doesn't need to be
85
- streamed.
86
-
87
- *Luke Lau*
88
-
89
- ## Rails 7.0.2.4 (April 26, 2022) ##
75
+ ## Rails 7.1.0.rc2 (October 01, 2023) ##
90
76
 
91
77
  * No changes.
92
78
 
93
79
 
94
- ## Rails 7.0.2.3 (March 08, 2022) ##
95
-
96
- * Added image transformation validation via configurable allow-list.
97
-
98
- Variant now offers a configurable allow-list for
99
- transformation methods in addition to a configurable deny-list for arguments.
80
+ ## Rails 7.1.0.rc1 (September 27, 2023) ##
100
81
 
101
- [CVE-2022-21831]
102
-
103
-
104
- ## Rails 7.0.2.2 (February 11, 2022) ##
105
-
106
- * No changes.
107
-
108
- ## Rails 7.0.2.1 (February 11, 2022) ##
109
-
110
- * No changes.
111
-
112
-
113
- ## Rails 7.0.2 (February 08, 2022) ##
114
-
115
- * Revert the ability to pass `service_name` param to `DirectUploadsController` which was introduced
116
- in 7.0.0.
117
-
118
- That change caused a lot of problems to upgrade Rails applications so we decided to remove it
119
- while in work in a more backwards compatible implementation.
120
-
121
- *Gannon McGibbon*
122
-
123
- * Allow applications to opt out of precompiling Active Storage JavaScript assets.
124
-
125
- *jlestavel*
126
-
127
-
128
- ## Rails 7.0.1 (January 06, 2022) ##
129
-
130
- * No changes.
131
-
132
-
133
- ## Rails 7.0.0 (December 15, 2021) ##
134
-
135
- * Support transforming empty-ish `has_many_attached` value into `[]` (e.g. `[""]`).
82
+ * Add `expires_at` option to `ActiveStorage::Blob#signed_id`.
136
83
 
137
84
  ```ruby
138
- @user.highlights = [""]
139
- @user.highlights # => []
85
+ rails_blob_path(user.avatar, disposition: "attachment", expires_at: 30.minutes.from_now)
86
+ <%= image_tag rails_blob_path(user.avatar.variant(resize: "100x100"), expires_at: 30.minutes.from_now) %>
140
87
  ```
141
88
 
142
- *Sean Doyle*
143
-
144
-
145
- ## Rails 7.0.0.rc3 (December 14, 2021) ##
146
-
147
- * No changes.
148
-
149
-
150
- ## Rails 7.0.0.rc2 (December 14, 2021) ##
89
+ *Aki*
151
90
 
152
- * No changes.
153
-
154
- ## Rails 7.0.0.rc1 (December 06, 2021) ##
155
-
156
- * `Add ActiveStorage::Blob.compose` to concatenate multiple blobs.
157
-
158
- *Gannon McGibbon*
159
-
160
- * Setting custom metadata on blobs are now persisted to remote storage.
91
+ * Allow attaching File and Pathname when assigning attributes, e.g.
161
92
 
162
- *joshuamsager*
163
-
164
- * Support direct uploads to multiple services.
93
+ ```ruby
94
+ User.create!(avatar: File.open("image.jpg"))
95
+ User.create!(avatar: file_fixture("image.jpg"))
96
+ ```
165
97
 
166
- *Dmitry Tsepelev*
98
+ *Dorian Marié*
167
99
 
168
- * Invalid default content types are deprecated
169
100
 
170
- Blobs created with content_type `image/jpg`, `image/pjpeg`, `image/bmp`, `text/javascript` will now produce
171
- a deprecation warning, since these are not valid content types.
101
+ ## Rails 7.1.0.beta1 (September 13, 2023) ##
172
102
 
173
- These content types will be removed from the defaults in Rails 7.1.
103
+ * Disables the session in `ActiveStorage::Blobs::ProxyController`
104
+ and `ActiveStorage::Representations::ProxyController`
105
+ in order to allow caching by default in some CDNs as CloudFlare
174
106
 
175
- You can set `config.active_storage.silence_invalid_content_types_warning = true` to dismiss the warning.
107
+ Fixes #44136
176
108
 
177
- *Alex Ghiculescu*
109
+ *Bruno Prieto*
178
110
 
179
- ## Rails 7.0.0.alpha2 (September 15, 2021) ##
111
+ * Add `tags` to `ActiveStorage::Analyzer::AudioAnalyzer` output
180
112
 
181
- * No changes.
113
+ *Keaton Roux*
182
114
 
115
+ * Add an option to preprocess variants
183
116
 
184
- ## Rails 7.0.0.alpha1 (September 15, 2021) ##
117
+ ActiveStorage variants are processed on the fly when they are needed but
118
+ sometimes we're sure that they are accessed and want to processed them
119
+ upfront.
185
120
 
186
- * Emit Active Support instrumentation events from Active Storage analyzers.
121
+ `preprocessed` option is added when declaring variants.
187
122
 
188
- Fixes #42930
123
+ ```
124
+ class User < ApplicationRecord
125
+ has_one_attached :avatar do |attachable|
126
+ attachable.variant :thumb, resize_to_limit: [100, 100], preprocessed: true
127
+ end
128
+ end
129
+ ```
189
130
 
190
131
  *Shouichi Kamiya*
191
132
 
192
- * Add support for byte range requests
193
-
194
- *Tom Prats*
195
-
196
- * Attachments can be deleted after their association is no longer defined.
197
-
198
- Fixes #42514
199
-
200
- *Don Sisco*
133
+ * Fix variants not included when eager loading multiple records containing a single attachment
201
134
 
202
- * Make `vips` the default variant processor for new apps.
135
+ When using the `with_attached_#{name}` scope for a `has_one_attached` relation,
136
+ attachment variants were not eagerly loaded.
203
137
 
204
- See the upgrade guide for instructions on converting from `mini_magick` to `vips`. `mini_magick` is
205
- not deprecated, existing apps can keep using it.
138
+ *Russell Porter*
206
139
 
207
- *Breno Gazzola*
140
+ * Allow an ActiveStorage attachment to be removed via a form post
208
141
 
209
- * Deprecate `ActiveStorage::Current.host` in favor of `ActiveStorage::Current.url_options` which accepts
210
- a host, protocol and port.
142
+ Attachments can already be removed by updating the attachment to be nil such as:
143
+ ```ruby
144
+ User.find(params[:id]).update!(avatar: nil)
145
+ ```
211
146
 
212
- *Santiago Bartesaghi*
147
+ However, a form cannot post a nil param, it can only post an empty string. But, posting an
148
+ empty string would result in an `ActiveSupport::MessageVerifier::InvalidSignature: mismatched digest`
149
+ error being raised, because it's being treated as a signed blob id.
213
150
 
214
- * Allow using [IAM](https://cloud.google.com/storage/docs/access-control/signed-urls) when signing URLs with GCS.
151
+ Now, nil and an empty string are treated as a delete, which allows attachments to be removed via:
152
+ ```ruby
153
+ User.find(params[:id]).update!(params.require(:user).permit(:avatar))
215
154
 
216
- ```yaml
217
- gcs:
218
- service: GCS
219
- ...
220
- iam: true
221
155
  ```
222
156
 
223
- *RRethy*
157
+ *Nate Matykiewicz*
224
158
 
225
- * OpenSSL constants are now used for Digest computations.
159
+ * Remove mini_mime usage in favour of marcel.
226
160
 
227
- *Dirkjan Bussink*
161
+ We have two libraries that are have similar usage. This change removes
162
+ dependency on mini_mime and makes use of similar methods from marcel.
228
163
 
229
- * Deprecate `config.active_storage.replace_on_assign_to_many`. Future versions of Rails
230
- will behave the same way as when the config is set to `true`.
164
+ *Vipul A M*
231
165
 
232
- *Santiago Bartesaghi*
166
+ * Allow destroying active storage variants
233
167
 
234
- * Remove deprecated methods: `build_after_upload`, `create_after_upload!` in favor of `create_and_upload!`,
235
- and `service_url` in favor of `url`.
236
-
237
- *Santiago Bartesaghi*
238
-
239
- * Add support of `strict_loading_by_default` to `ActiveStorage::Representations` controllers.
168
+ ```ruby
169
+ User.first.avatar.variant(resize_to_limit: [100, 100]).destroy
170
+ ```
240
171
 
241
- *Anton Topchii*, *Andrew White*
172
+ *Shouichi Kamiya*, *Yuichiro NAKAGAWA*, *Ryohei UEDA*
242
173
 
243
- * Allow to detach an attachment when record is not persisted.
174
+ * Add `sample_rate` to `ActiveStorage::Analyzer::AudioAnalyzer` output
244
175
 
245
- *Jacopo Beschi*
176
+ *Matija Čupić*
246
177
 
247
- * Use libvips instead of ImageMagick to analyze images when `active_storage.variant_processor = vips`.
178
+ * Remove deprecated `purge` and `purge_later` methods from the attachments association.
248
179
 
249
- *Breno Gazzola*
180
+ *Rafael Mendonça França*
250
181
 
251
- * Add metadata value for presence of video channel in video blobs.
182
+ * Remove deprecated behavior when assigning to a collection of attachments.
252
183
 
253
- The `metadata` attribute of video blobs has a new boolean key named `video` that is set to
254
- `true` if the file has an video channel and `false` if it doesn't.
184
+ Instead of appending to the collection, the collection is now replaced.
255
185
 
256
- *Breno Gazzola*
186
+ *Rafael Mendonça França*
257
187
 
258
- * Deprecate usage of `purge` and `purge_later` from the association extension.
188
+ * Remove deprecated `ActiveStorage::Current#host` and `ActiveStorage::Current#host=` methods.
259
189
 
260
- *Jacopo Beschi*
190
+ *Rafael Mendonça França*
261
191
 
262
- * Passing extra parameters in `ActiveStorage::Blob#url` to S3 Client.
192
+ * Remove deprecated invalid default content types in Active Storage configurations.
263
193
 
264
- This allows calls of `ActiveStorage::Blob#url` to have more interaction with
265
- the S3 Presigner, enabling, amongst other options, custom S3 domain URL
266
- Generation.
194
+ *Rafael Mendonça França*
267
195
 
268
- ```ruby
269
- blob = ActiveStorage::Blob.last
196
+ * Add missing preview event to `ActiveStorage::LogSubscriber`
270
197
 
271
- blob.url # => https://<bucket-name>.s3.<region>.amazonaws.com/<key>
272
- blob.url(virtual_host: true) # => # => https://<bucket-name>/<key>
273
- ```
198
+ A `preview` event is being instrumented in `ActiveStorage::Previewer`.
199
+ However it was not added inside ActiveStorage's LogSubscriber class.
274
200
 
275
- *josegomezr*
201
+ This will allow to have logs for when a preview happens
202
+ in the same fashion as all other ActiveStorage events such as
203
+ `upload` and `download` inside `Rails.logger`.
276
204
 
277
- * Allow setting a `Cache-Control` on files uploaded to GCS.
205
+ *Chedli Bourguiba*
278
206
 
279
- ```yaml
280
- gcs:
281
- service: GCS
282
- ...
283
- cache_control: "public, max-age=3600"
284
- ```
207
+ * Fix retrieving rotation value from FFmpeg on version 5.0+.
285
208
 
286
- *maleblond*
209
+ In FFmpeg version 5.0+ the rotation value has been removed from tags.
210
+ Instead the value can be found in side_data_list. Along with
211
+ this update it's possible to have values of -90, -270 to denote the video
212
+ has been rotated.
287
213
 
288
- * The parameters sent to `ffmpeg` for generating a video preview image are now
289
- configurable under `config.active_storage.video_preview_arguments`.
214
+ *Haroon Ahmed*
290
215
 
291
- *Brendon Muir*
216
+ * Touch all corresponding model records after ActiveStorage::Blob is analyzed
292
217
 
293
- * The ActiveStorage video previewer will now use scene change detection to generate
294
- better preview images (rather than the previous default of using the first frame
295
- of the video). This change requires FFmpeg v3.4+.
218
+ This fixes a race condition where a record can be requested and have a cache entry built, before
219
+ the initial `analyze_later` completes, which will not be invalidated until something else
220
+ updates the record. This also invalidates cache entries when a blob is re-analyzed, which
221
+ is helpful if a bug is fixed in an analyzer or a new analyzer is added.
296
222
 
297
- *Jonathan Hefner*
223
+ *Nate Matykiewicz*
298
224
 
299
- * Add support for ActiveStorage expiring URLs.
225
+ * Add ability to use pre-defined variants when calling `preview` or
226
+ `representation` on an attachment.
300
227
 
301
228
  ```ruby
302
- rails_blob_path(user.avatar, disposition: "attachment", expires_in: 30.minutes)
229
+ class User < ActiveRecord::Base
230
+ has_one_attached :file do |attachable|
231
+ attachable.variant :thumb, resize_to_limit: [100, 100]
232
+ end
233
+ end
303
234
 
304
- <%= image_tag rails_blob_path(user.avatar.variant(resize: "100x100"), expires_in: 30.minutes) %>
235
+ <%= image_tag user.file.representation(:thumb) %>
305
236
  ```
306
237
 
307
- If you want to set default expiration time for ActiveStorage URLs throughout your application, set `config.active_storage.urls_expire_in`.
308
-
309
- *aki77*
310
-
311
- * Allow to purge an attachment when record is not persisted for `has_many_attached`.
312
-
313
- *Jacopo Beschi*
314
-
315
- * Add `with_all_variant_records` method to eager load all variant records on an attachment at once.
316
- `with_attached_image` scope now eager loads variant records if using variant tracking.
238
+ *Richard Böhme*
317
239
 
318
- *Alex Ghiculescu*
240
+ * Method `attach` always returns the attachments except when the record
241
+ is persisted, unchanged, and saving it fails, in which case it returns `nil`.
319
242
 
320
- * Add metadata value for presence of audio channel in video blobs.
321
-
322
- The `metadata` attribute of video blobs has a new boolean key named `audio` that is set to
323
- `true` if the file has an audio channel and `false` if it doesn't.
324
-
325
- *Breno Gazzola*
326
-
327
- * Adds analyzer for audio files.
328
-
329
- *Breno Gazzola*
330
-
331
- * Respect Active Record's primary_key_type in Active Storage migrations.
332
-
333
- *fatkodima*
243
+ *Santiago Bartesaghi*
334
244
 
335
- * Allow `expires_in` for ActiveStorage signed ids.
245
+ * Fixes multiple `attach` calls within transaction not uploading files correctly.
336
246
 
337
- *aki77*
247
+ In the following example, the code failed to upload all but the last file to the configured service.
248
+ ```ruby
249
+ ActiveRecord::Base.transaction do
250
+ user.attachments.attach({
251
+ content_type: "text/plain",
252
+ filename: "dummy.txt",
253
+ io: ::StringIO.new("dummy"),
254
+ })
255
+ user.attachments.attach({
256
+ content_type: "text/plain",
257
+ filename: "dummy2.txt",
258
+ io: ::StringIO.new("dummy2"),
259
+ })
260
+ end
338
261
 
339
- * Allow to purge an attachment when record is not persisted for `has_one_attached`.
262
+ assert_equal 2, user.attachments.count
263
+ assert user.attachments.first.service.exist?(user.attachments.first.key) # Fails
264
+ ```
340
265
 
341
- *Jacopo Beschi*
266
+ This was addressed by keeping track of the subchanges pending upload, and uploading them
267
+ once the transaction is committed.
342
268
 
343
- * Add a load hook called `active_storage_variant_record` (providing `ActiveStorage::VariantRecord`)
344
- to allow for overriding aspects of the `ActiveStorage::VariantRecord` class. This makes
345
- `ActiveStorage::VariantRecord` consistent with `ActiveStorage::Blob` and `ActiveStorage::Attachment`
346
- that already have load hooks.
269
+ Fixes #41661
347
270
 
348
- *Brendon Muir*
271
+ *Santiago Bartesaghi*, *Bruno Vezoli*, *Juan Roig*, *Abhay Nikam*
349
272
 
350
- * `ActiveStorage::PreviewError` is raised when a previewer is unable to generate a preview image.
273
+ * Raise an exception if `config.active_storage.service` is not set.
351
274
 
352
- *Alex Robbin*
275
+ If Active Storage is configured and `config.active_storage.service` is not
276
+ set in the respective environment's configuration file, then an exception
277
+ is raised with a meaningful message when attempting to use Active Storage.
353
278
 
354
- * Add `ActiveStorage::Streaming` module that can be included in a controller to get access to `#send_blob_stream`,
355
- which wraps the new `ActionController::Base#send_stream` method to stream a blob from cloud storage:
279
+ *Ghouse Mohamed*
356
280
 
357
- ```ruby
358
- class MyPublicBlobsController < ApplicationController
359
- include ActiveStorage::SetBlob, ActiveStorage::Streaming
281
+ * Fixes proxy downloads of files over 5mb
360
282
 
361
- def show
362
- http_cache_forever(public: true) do
363
- send_blob_stream @blob, disposition: params[:disposition]
364
- end
365
- end
366
- end
367
- ```
283
+ Previously, trying to view and/or download files larger than 5mb stored in
284
+ services like S3 via proxy mode could return corrupted files at around
285
+ 5.2mb or cause random halts in the download. Now,
286
+ `ActiveStorage::Blobs::ProxyController` correctly handles streaming these
287
+ larger files from the service to the client without any issues.
368
288
 
369
- *DHH*
289
+ Fixes #44679
370
290
 
371
- * Add ability to use pre-defined variants.
291
+ *Felipe Raul*
372
292
 
373
- ```ruby
374
- class User < ActiveRecord::Base
375
- has_one_attached :avatar do |attachable|
376
- attachable.variant :thumb, resize: "100x100"
377
- attachable.variant :medium, resize: "300x300", monochrome: true
378
- end
379
- end
293
+ * Saving attachment(s) to a record returns the blob/blobs object
380
294
 
381
- class Gallery < ActiveRecord::Base
382
- has_many_attached :photos do |attachable|
383
- attachable.variant :thumb, resize: "100x100"
384
- attachable.variant :medium, resize: "300x300", monochrome: true
385
- end
386
- end
295
+ Previously, saving attachments did not return the blob/blobs that
296
+ were attached. Now, saving attachments to a record with `#attach`
297
+ method returns the blob or array of blobs that were attached to
298
+ the record. If it fails to save the attachment(s), then it returns
299
+ `false`.
387
300
 
388
- <%= image_tag user.avatar.variant(:thumb) %>
389
- ```
301
+ *Ghouse Mohamed*
390
302
 
391
- *fatkodima*
303
+ * Don't stream responses in redirect mode
392
304
 
393
- * After setting `config.active_storage.resolve_model_to_route = :rails_storage_proxy`
394
- `rails_blob_path` and `rails_representation_path` will generate proxy URLs by default.
305
+ Previously, both redirect mode and proxy mode streamed their
306
+ responses which caused a new thread to be created, and could end
307
+ up leaking connections in the connection pool. But since redirect
308
+ mode doesn't actually send any data, it doesn't need to be
309
+ streamed.
395
310
 
396
- *Ali Ismayilov*
311
+ *Luke Lau*
397
312
 
398
- * Declare `ActiveStorage::FixtureSet` and `ActiveStorage::FixtureSet.blob` to
399
- improve fixture integration.
313
+ * Safe for direct upload on Libraries or Frameworks
400
314
 
401
- *Sean Doyle*
315
+ Enable the use of custom headers during direct uploads, which allows for
316
+ the inclusion of Authorization bearer tokens or other forms of authorization
317
+ tokens through headers.
402
318
 
319
+ *Radamés Roriz*
403
320
 
404
- Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activestorage/CHANGELOG.md) for previous changes.
321
+ Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/activestorage/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2017-2022 David Heinemeier Hansson, Basecamp
1
+ Copyright (c) David Heinemeier Hansson, 37signals LLC
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -6,11 +6,11 @@ Files can be uploaded from the server to the cloud or directly from the client t
6
6
 
7
7
  Image files can furthermore be transformed using on-demand variants for quality, aspect ratio, size, or any other [MiniMagick](https://github.com/minimagick/minimagick) or [Vips](https://www.rubydoc.info/gems/ruby-vips/Vips/Image) supported transformation.
8
8
 
9
- You can read more about Active Storage in the [Active Storage Overview](https://edgeguides.rubyonrails.org/active_storage_overview.html) guide.
9
+ You can read more about Active Storage in the [Active Storage Overview](https://guides.rubyonrails.org/active_storage_overview.html) guide.
10
10
 
11
11
  ## Compared to other storage solutions
12
12
 
13
- A key difference to how Active Storage works compared to other attachment solutions in Rails is through the use of built-in [Blob](https://github.com/rails/rails/blob/main/activestorage/app/models/active_storage/blob.rb) and [Attachment](https://github.com/rails/rails/blob/main/activestorage/app/models/active_storage/attachment.rb) models (backed by Active Record). This means existing application models do not need to be modified with additional columns to associate with files. Active Storage uses polymorphic associations via the `Attachment` join model, which then connects to the actual `Blob`.
13
+ A key difference to how Active Storage works compared to other attachment solutions in \Rails is through the use of built-in [Blob](https://github.com/rails/rails/blob/main/activestorage/app/models/active_storage/blob.rb) and [Attachment](https://github.com/rails/rails/blob/main/activestorage/app/models/active_storage/attachment.rb) models (backed by Active Record). This means existing application models do not need to be modified with additional columns to associate with files. Active Storage uses polymorphic associations via the `Attachment` join model, which then connects to the actual `Blob`.
14
14
 
15
15
  `Blob` models store attachment metadata (filename, content-type, etc.), and their identifier key in the storage service. Blob models do not store the actual binary data. They are intended to be immutable in spirit. One file, one blob. You can associate the same blob with multiple application models as well. And if you want to do transformations of a given `Blob`, the idea is that you'll simply create a new one, rather than attempt to mutate the existing one (though of course you can delete the previous version later if you don't need it).
16
16
 
@@ -144,11 +144,11 @@ Active Storage, with its included JavaScript library, supports uploading directl
144
144
 
145
145
  1. Include the Active Storage JavaScript in your application's JavaScript bundle or reference it directly.
146
146
 
147
- Requiring directly without bundling through the asset pipeline in the application html with autostart:
148
- ```html
147
+ Requiring directly without bundling through the asset pipeline in the application HTML with autostart:
148
+ ```erb
149
149
  <%= javascript_include_tag "activestorage" %>
150
150
  ```
151
- Requiring via importmap-rails without bundling through the asset pipeline in the application html without autostart as ESM:
151
+ Requiring via importmap-rails without bundling through the asset pipeline in the application HTML without autostart as ESM:
152
152
  ```ruby
153
153
  # config/importmap.rb
154
154
  pin "@rails/activestorage", to: "activestorage.esm.js"
@@ -170,7 +170,7 @@ Active Storage, with its included JavaScript library, supports uploading directl
170
170
  ```
171
171
  2. Annotate file inputs with the direct upload URL.
172
172
 
173
- ```ruby
173
+ ```erb
174
174
  <%= form.file_field :attachments, multiple: true, direct_upload: true %>
175
175
  ```
176
176
  3. That's it! Uploads begin upon form submission.