activestorage 7.0.8.6 → 7.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +135 -353
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +4 -4
  5. data/app/assets/javascripts/activestorage.esm.js +8 -4
  6. data/app/assets/javascripts/activestorage.js +9 -3
  7. data/app/controllers/active_storage/disk_controller.rb +4 -2
  8. data/app/controllers/concerns/active_storage/file_server.rb +4 -1
  9. data/app/javascript/activestorage/blob_record.js +4 -1
  10. data/app/javascript/activestorage/direct_upload.js +3 -2
  11. data/app/javascript/activestorage/index.js +3 -1
  12. data/app/jobs/active_storage/transform_job.rb +12 -0
  13. data/app/models/active_storage/attachment.rb +87 -13
  14. data/app/models/active_storage/blob/analyzable.rb +4 -3
  15. data/app/models/active_storage/blob/identifiable.rb +1 -0
  16. data/app/models/active_storage/blob/representable.rb +7 -3
  17. data/app/models/active_storage/blob.rb +25 -45
  18. data/app/models/active_storage/current.rb +0 -10
  19. data/app/models/active_storage/filename.rb +2 -0
  20. data/app/models/active_storage/named_variant.rb +21 -0
  21. data/app/models/active_storage/preview.rb +5 -3
  22. data/app/models/active_storage/variant.rb +8 -7
  23. data/app/models/active_storage/variant_with_record.rb +19 -7
  24. data/app/models/active_storage/variation.rb +5 -3
  25. data/db/migrate/20170806125915_create_active_storage_tables.rb +1 -1
  26. data/lib/active_storage/analyzer/audio_analyzer.rb +16 -4
  27. data/lib/active_storage/analyzer/image_analyzer.rb +2 -0
  28. data/lib/active_storage/analyzer/video_analyzer.rb +3 -1
  29. data/lib/active_storage/analyzer.rb +2 -0
  30. data/lib/active_storage/attached/changes/create_many.rb +8 -3
  31. data/lib/active_storage/attached/changes/create_one.rb +14 -2
  32. data/lib/active_storage/attached/many.rb +5 -4
  33. data/lib/active_storage/attached/model.rb +66 -43
  34. data/lib/active_storage/attached/one.rb +5 -4
  35. data/lib/active_storage/attached.rb +2 -0
  36. data/lib/active_storage/deprecator.rb +7 -0
  37. data/lib/active_storage/engine.rb +11 -7
  38. data/lib/active_storage/fixture_set.rb +2 -0
  39. data/lib/active_storage/gem_version.rb +4 -4
  40. data/lib/active_storage/log_subscriber.rb +12 -0
  41. data/lib/active_storage/previewer.rb +8 -1
  42. data/lib/active_storage/reflection.rb +3 -3
  43. data/lib/active_storage/service/azure_storage_service.rb +2 -0
  44. data/lib/active_storage/service/disk_service.rb +2 -0
  45. data/lib/active_storage/service/gcs_service.rb +11 -20
  46. data/lib/active_storage/service/mirror_service.rb +10 -5
  47. data/lib/active_storage/service/s3_service.rb +2 -0
  48. data/lib/active_storage/service.rb +4 -2
  49. data/lib/active_storage/transformers/transformer.rb +2 -0
  50. data/lib/active_storage/version.rb +1 -1
  51. data/lib/active_storage.rb +19 -3
  52. metadata +22 -33
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '081e67136972e6a3b205bac0beff965c632d3d2f956adaaa10c94ce473224bd2'
4
- data.tar.gz: cc4ce99ff4f7437e98d9cbbed2a48d7007cd4553e8c7558cbbf3ce79aaf15481
3
+ metadata.gz: 5dfb6f1b9694161b8a664871f19104256c481525dbcd52a738137c2fdb0e7c55
4
+ data.tar.gz: f72483c9153ef5bae19222f6ccb659d7d6ee0444d8785a00f9fa54c12f0a861b
5
5
  SHA512:
6
- metadata.gz: e733f1df52d9b02de9c50f26265b62578e4b55832244ccddfd738c6f79b2593dfa66358de87d588f9dd79e394b758945ffa2aa4bfb3f6643edf61d5de9d7f5bc
7
- data.tar.gz: d0542ba9bf7bbc078686a60ada01b6818b70dd5b6e897f4c9aab3c35450c4a653aa299bf8795d18c578c7bece8b039fcf06e97fb423af33f644fa8f228e757cb
6
+ metadata.gz: c7fb7bd0ff896ca2f063a71cbc2187659b14b819d6899c23c48ad43ce54f4a48a4039c027e7802a551986b9f0cbde296e4acf9f633aacaf886a3608a3902a07d
7
+ data.tar.gz: 438c8ad07e00b2bdcee84b781bf764fb4c209999e3ccb757b41c5c7c4b9d32f26ea5c36b8f820bd7f1c3b1901ae088448e92b09ff340528636eef841a62df7f4
data/CHANGELOG.md CHANGED
@@ -1,29 +1,4 @@
1
- ## Rails 7.0.8.6 (October 23, 2024) ##
2
-
3
- * No changes.
4
-
5
-
6
- ## Rails 7.0.8.5 (October 15, 2024) ##
7
-
8
- * No changes.
9
-
10
-
11
- ## Rails 7.0.8.4 (June 04, 2024) ##
12
-
13
- * No changes.
14
-
15
-
16
- ## Rails 7.0.8.3 (May 17, 2024) ##
17
-
18
- * No changes.
19
-
20
-
21
- ## Rails 7.0.8.2 (May 16, 2024) ##
22
-
23
- * No changes.
24
-
25
-
26
- ## Rails 7.0.8.1 (February 21, 2024) ##
1
+ ## Rails 7.1.0.beta1 (September 13, 2023) ##
27
2
 
28
3
  * Disables the session in `ActiveStorage::Blobs::ProxyController`
29
4
  and `ActiveStorage::Representations::ProxyController`
@@ -33,407 +8,214 @@
33
8
 
34
9
  *Bruno Prieto*
35
10
 
36
- ## Rails 7.0.8 (September 09, 2023) ##
37
-
38
- * No changes.
39
-
40
-
41
- ## Rails 7.0.7.2 (August 22, 2023) ##
42
-
43
- * No changes.
44
-
45
-
46
- ## Rails 7.0.7.1 (August 22, 2023) ##
47
-
48
- * No changes.
49
-
50
-
51
- ## Rails 7.0.7 (August 09, 2023) ##
52
-
53
- * No changes.
54
-
55
-
56
- ## Rails 7.0.6 (June 29, 2023) ##
57
-
58
- * Fix retrieving rotation value from FFmpeg on version 5.0+.
59
-
60
- In FFmpeg version 5.0+ the rotation value has been removed from tags.
61
- Instead the value can be found in side_data_list. Along with
62
- this update it's possible to have values of -90, -270 to denote the video
63
- has been rotated.
64
-
65
- *Haroon Ahmed*
66
-
67
-
68
- ## Rails 7.0.5.1 (June 26, 2023) ##
69
-
70
- * No changes.
71
-
72
-
73
- ## Rails 7.0.5 (May 24, 2023) ##
74
-
75
- * No changes.
76
-
77
-
78
- ## Rails 7.0.4.3 (March 13, 2023) ##
79
-
80
- * No changes.
81
-
82
-
83
- ## Rails 7.0.4.2 (January 24, 2023) ##
84
-
85
- * No changes.
86
-
11
+ * Add `tags` to `ActiveStorage::Analyzer::AudioAnalyzer` output
87
12
 
88
- ## Rails 7.0.4.1 (January 17, 2023) ##
13
+ *Keaton Roux*
89
14
 
90
- * No changes.
15
+ * Add an option to preprocess variants
91
16
 
17
+ ActiveStorage variants are processed on the fly when they are needed but
18
+ sometimes we're sure that they are accessed and want to processed them
19
+ upfront.
92
20
 
93
- ## Rails 7.0.4 (September 09, 2022) ##
94
-
95
- * Fixes proxy downloads of files over 5MiB
96
-
97
- Previously, trying to view and/or download files larger than 5mb stored in
98
- services like S3 via proxy mode could return corrupted files at around
99
- 5.2mb or cause random halts in the download. Now,
100
- `ActiveStorage::Blobs::ProxyController` correctly handles streaming these
101
- larger files from the service to the client without any issues.
102
-
103
- Fixes #44679
104
-
105
- *Felipe Raul*
106
-
107
- ## Rails 7.0.3.1 (July 12, 2022) ##
108
-
109
- * No changes.
110
-
111
-
112
- ## Rails 7.0.3 (May 09, 2022) ##
113
-
114
- * Don't stream responses in redirect mode
115
-
116
- Previously, both redirect mode and proxy mode streamed their
117
- responses which caused a new thread to be created, and could end
118
- up leaking connections in the connection pool. But since redirect
119
- mode doesn't actually send any data, it doesn't need to be
120
- streamed.
121
-
122
- *Luke Lau*
123
-
124
- ## Rails 7.0.2.4 (April 26, 2022) ##
125
-
126
- * No changes.
127
-
128
-
129
- ## Rails 7.0.2.3 (March 08, 2022) ##
130
-
131
- * Added image transformation validation via configurable allow-list.
132
-
133
- Variant now offers a configurable allow-list for
134
- transformation methods in addition to a configurable deny-list for arguments.
135
-
136
- [CVE-2022-21831]
137
-
138
-
139
- ## Rails 7.0.2.2 (February 11, 2022) ##
140
-
141
- * No changes.
142
-
143
- ## Rails 7.0.2.1 (February 11, 2022) ##
144
-
145
- * No changes.
146
-
147
-
148
- ## Rails 7.0.2 (February 08, 2022) ##
149
-
150
- * Revert the ability to pass `service_name` param to `DirectUploadsController` which was introduced
151
- in 7.0.0.
152
-
153
- That change caused a lot of problems to upgrade Rails applications so we decided to remove it
154
- while in work in a more backwards compatible implementation.
155
-
156
- *Gannon McGibbon*
157
-
158
- * Allow applications to opt out of precompiling Active Storage JavaScript assets.
159
-
160
- *jlestavel*
21
+ `preprocessed` option is added when declaring variants.
161
22
 
23
+ ```
24
+ class User < ApplicationRecord
25
+ has_one_attached :avatar do |attachable|
26
+ attachable.variant :thumb, resize_to_limit: [100, 100], preprocessed: true
27
+ end
28
+ end
29
+ ```
162
30
 
163
- ## Rails 7.0.1 (January 06, 2022) ##
31
+ *Shouichi Kamiya*
164
32
 
165
- * No changes.
33
+ * Fix variants not included when eager loading multiple records containing a single attachment
166
34
 
35
+ When using the `with_attached_#{name}` scope for a `has_one_attached` relation,
36
+ attachment variants were not eagerly loaded.
167
37
 
168
- ## Rails 7.0.0 (December 15, 2021) ##
38
+ *Russell Porter*
169
39
 
170
- * Support transforming empty-ish `has_many_attached` value into `[]` (e.g. `[""]`).
40
+ * Allow an ActiveStorage attachment to be removed via a form post
171
41
 
42
+ Attachments can already be removed by updating the attachment to be nil such as:
172
43
  ```ruby
173
- @user.highlights = [""]
174
- @user.highlights # => []
44
+ User.find(params[:id]).update!(avatar: nil)
175
45
  ```
176
46
 
177
- *Sean Doyle*
178
-
179
-
180
- ## Rails 7.0.0.rc3 (December 14, 2021) ##
181
-
182
- * No changes.
183
-
184
-
185
- ## Rails 7.0.0.rc2 (December 14, 2021) ##
186
-
187
- * No changes.
188
-
189
- ## Rails 7.0.0.rc1 (December 06, 2021) ##
190
-
191
- * `Add ActiveStorage::Blob.compose` to concatenate multiple blobs.
192
-
193
- *Gannon McGibbon*
194
-
195
- * Setting custom metadata on blobs are now persisted to remote storage.
196
-
197
- *joshuamsager*
198
-
199
- * Support direct uploads to multiple services.
200
-
201
- *Dmitry Tsepelev*
202
-
203
- * Invalid default content types are deprecated
204
-
205
- Blobs created with content_type `image/jpg`, `image/pjpeg`, `image/bmp`, `text/javascript` will now produce
206
- a deprecation warning, since these are not valid content types.
207
-
208
- These content types will be removed from the defaults in Rails 7.1.
209
-
210
- You can set `config.active_storage.silence_invalid_content_types_warning = true` to dismiss the warning.
211
-
212
- *Alex Ghiculescu*
213
-
214
- ## Rails 7.0.0.alpha2 (September 15, 2021) ##
215
-
216
- * No changes.
217
-
218
-
219
- ## Rails 7.0.0.alpha1 (September 15, 2021) ##
47
+ However, a form cannot post a nil param, it can only post an empty string. But, posting an
48
+ empty string would result in an `ActiveSupport::MessageVerifier::InvalidSignature: mismatched digest`
49
+ error being raised, because it's being treated as a signed blob id.
220
50
 
221
- * Emit Active Support instrumentation events from Active Storage analyzers.
222
-
223
- Fixes #42930
224
-
225
- *Shouichi Kamiya*
226
-
227
- * Add support for byte range requests
228
-
229
- *Tom Prats*
230
-
231
- * Attachments can be deleted after their association is no longer defined.
232
-
233
- Fixes #42514
234
-
235
- *Don Sisco*
51
+ Now, nil and an empty string are treated as a delete, which allows attachments to be removed via:
52
+ ```ruby
53
+ User.find(params[:id]).update!(params.require(:user).permit(:avatar))
236
54
 
237
- * Make `vips` the default variant processor for new apps.
55
+ ```
238
56
 
239
- See the upgrade guide for instructions on converting from `mini_magick` to `vips`. `mini_magick` is
240
- not deprecated, existing apps can keep using it.
57
+ *Nate Matykiewicz*
241
58
 
242
- *Breno Gazzola*
59
+ * Remove mini_mime usage in favour of marcel.
243
60
 
244
- * Deprecate `ActiveStorage::Current.host` in favor of `ActiveStorage::Current.url_options` which accepts
245
- a host, protocol and port.
61
+ We have two libraries that are have similar usage. This change removes
62
+ dependency on mini_mime and makes use of similar methods from marcel.
246
63
 
247
- *Santiago Bartesaghi*
64
+ *Vipul A M*
248
65
 
249
- * Allow using [IAM](https://cloud.google.com/storage/docs/access-control/signed-urls) when signing URLs with GCS.
66
+ * Allow destroying active storage variants
250
67
 
251
- ```yaml
252
- gcs:
253
- service: GCS
254
- ...
255
- iam: true
68
+ ```ruby
69
+ User.first.avatar.variant(resize_to_limit: [100, 100]).destroy
256
70
  ```
257
71
 
258
- *RRethy*
72
+ *Shouichi Kamiya*, *Yuichiro NAKAGAWA*, *Ryohei UEDA*
259
73
 
260
- * OpenSSL constants are now used for Digest computations.
74
+ * Add `sample_rate` to `ActiveStorage::Analyzer::AudioAnalyzer` output
261
75
 
262
- *Dirkjan Bussink*
76
+ *Matija Čupić*
263
77
 
264
- * Deprecate `config.active_storage.replace_on_assign_to_many`. Future versions of Rails
265
- will behave the same way as when the config is set to `true`.
78
+ * Remove deprecated `purge` and `purge_later` methods from the attachments association.
266
79
 
267
- *Santiago Bartesaghi*
80
+ *Rafael Mendonça França*
268
81
 
269
- * Remove deprecated methods: `build_after_upload`, `create_after_upload!` in favor of `create_and_upload!`,
270
- and `service_url` in favor of `url`.
82
+ * Remove deprecated behavior when assigning to a collection of attachments.
271
83
 
272
- *Santiago Bartesaghi*
84
+ Instead of appending to the collection, the collection is now replaced.
273
85
 
274
- * Add support of `strict_loading_by_default` to `ActiveStorage::Representations` controllers.
86
+ *Rafael Mendonça França*
275
87
 
276
- *Anton Topchii*, *Andrew White*
88
+ * Remove deprecated `ActiveStorage::Current#host` and `ActiveStorage::Current#host=` methods.
277
89
 
278
- * Allow to detach an attachment when record is not persisted.
90
+ *Rafael Mendonça França*
279
91
 
280
- *Jacopo Beschi*
92
+ * Remove deprecated invalid default content types in Active Storage configurations.
281
93
 
282
- * Use libvips instead of ImageMagick to analyze images when `active_storage.variant_processor = vips`.
94
+ *Rafael Mendonça França*
283
95
 
284
- *Breno Gazzola*
96
+ * Add missing preview event to `ActiveStorage::LogSubscriber`
285
97
 
286
- * Add metadata value for presence of video channel in video blobs.
98
+ A `preview` event is being instrumented in `ActiveStorage::Previewer`.
99
+ However it was not added inside ActiveStorage's LogSubscriber class.
287
100
 
288
- The `metadata` attribute of video blobs has a new boolean key named `video` that is set to
289
- `true` if the file has an video channel and `false` if it doesn't.
101
+ This will allow to have logs for when a preview happens
102
+ in the same fashion as all other ActiveStorage events such as
103
+ `upload` and `download` inside `Rails.logger`.
290
104
 
291
- *Breno Gazzola*
105
+ *Chedli Bourguiba*
292
106
 
293
- * Deprecate usage of `purge` and `purge_later` from the association extension.
107
+ * Fix retrieving rotation value from FFmpeg on version 5.0+.
294
108
 
295
- *Jacopo Beschi*
109
+ In FFmpeg version 5.0+ the rotation value has been removed from tags.
110
+ Instead the value can be found in side_data_list. Along with
111
+ this update it's possible to have values of -90, -270 to denote the video
112
+ has been rotated.
296
113
 
297
- * Passing extra parameters in `ActiveStorage::Blob#url` to S3 Client.
114
+ *Haroon Ahmed*
298
115
 
299
- This allows calls of `ActiveStorage::Blob#url` to have more interaction with
300
- the S3 Presigner, enabling, amongst other options, custom S3 domain URL
301
- Generation.
116
+ * Touch all corresponding model records after ActiveStorage::Blob is analyzed
302
117
 
303
- ```ruby
304
- blob = ActiveStorage::Blob.last
118
+ This fixes a race condition where a record can be requested and have a cache entry built, before
119
+ the initial `analyze_later` completes, which will not be invalidated until something else
120
+ updates the record. This also invalidates cache entries when a blob is re-analyzed, which
121
+ is helpful if a bug is fixed in an analyzer or a new analyzer is added.
305
122
 
306
- blob.url # => https://<bucket-name>.s3.<region>.amazonaws.com/<key>
307
- blob.url(virtual_host: true) # => # => https://<bucket-name>/<key>
308
- ```
123
+ *Nate Matykiewicz*
309
124
 
310
- *josegomezr*
125
+ * Add ability to use pre-defined variants when calling `preview` or
126
+ `representation` on an attachment.
311
127
 
312
- * Allow setting a `Cache-Control` on files uploaded to GCS.
128
+ ```ruby
129
+ class User < ActiveRecord::Base
130
+ has_one_attached :file do |attachable|
131
+ attachable.variant :thumb, resize_to_limit: [100, 100]
132
+ end
133
+ end
313
134
 
314
- ```yaml
315
- gcs:
316
- service: GCS
317
- ...
318
- cache_control: "public, max-age=3600"
135
+ <%= image_tag user.file.representation(:thumb) %>
319
136
  ```
320
137
 
321
- *maleblond*
322
-
323
- * The parameters sent to `ffmpeg` for generating a video preview image are now
324
- configurable under `config.active_storage.video_preview_arguments`.
138
+ *Richard Böhme*
325
139
 
326
- *Brendon Muir*
140
+ * Method `attach` always returns the attachments except when the record
141
+ is persisted, unchanged, and saving it fails, in which case it returns `nil`.
327
142
 
328
- * The ActiveStorage video previewer will now use scene change detection to generate
329
- better preview images (rather than the previous default of using the first frame
330
- of the video). This change requires FFmpeg v3.4+.
331
-
332
- *Jonathan Hefner*
143
+ *Santiago Bartesaghi*
333
144
 
334
- * Add support for ActiveStorage expiring URLs.
145
+ * Fixes multiple `attach` calls within transaction not uploading files correctly.
335
146
 
147
+ In the following example, the code failed to upload all but the last file to the configured service.
336
148
  ```ruby
337
- rails_blob_path(user.avatar, disposition: "attachment", expires_in: 30.minutes)
149
+ ActiveRecord::Base.transaction do
150
+ user.attachments.attach({
151
+ content_type: "text/plain",
152
+ filename: "dummy.txt",
153
+ io: ::StringIO.new("dummy"),
154
+ })
155
+ user.attachments.attach({
156
+ content_type: "text/plain",
157
+ filename: "dummy2.txt",
158
+ io: ::StringIO.new("dummy2"),
159
+ })
160
+ end
338
161
 
339
- <%= image_tag rails_blob_path(user.avatar.variant(resize: "100x100"), expires_in: 30.minutes) %>
162
+ assert_equal 2, user.attachments.count
163
+ assert user.attachments.first.service.exist?(user.attachments.first.key) # Fails
340
164
  ```
341
165
 
342
- If you want to set default expiration time for ActiveStorage URLs throughout your application, set `config.active_storage.urls_expire_in`.
343
-
344
- *aki77*
345
-
346
- * Allow to purge an attachment when record is not persisted for `has_many_attached`.
347
-
348
- *Jacopo Beschi*
349
-
350
- * Add `with_all_variant_records` method to eager load all variant records on an attachment at once.
351
- `with_attached_image` scope now eager loads variant records if using variant tracking.
352
-
353
- *Alex Ghiculescu*
354
-
355
- * Add metadata value for presence of audio channel in video blobs.
166
+ This was addressed by keeping track of the subchanges pending upload, and uploading them
167
+ once the transaction is committed.
356
168
 
357
- The `metadata` attribute of video blobs has a new boolean key named `audio` that is set to
358
- `true` if the file has an audio channel and `false` if it doesn't.
169
+ Fixes #41661
359
170
 
360
- *Breno Gazzola*
171
+ *Santiago Bartesaghi*, *Bruno Vezoli*, *Juan Roig*, *Abhay Nikam*
361
172
 
362
- * Adds analyzer for audio files.
173
+ * Raise an exception if `config.active_storage.service` is not set.
363
174
 
364
- *Breno Gazzola*
175
+ If Active Storage is configured and `config.active_storage.service` is not
176
+ set in the respective environment's configuration file, then an exception
177
+ is raised with a meaningful message when attempting to use Active Storage.
365
178
 
366
- * Respect Active Record's primary_key_type in Active Storage migrations.
179
+ *Ghouse Mohamed*
367
180
 
368
- *fatkodima*
181
+ * Fixes proxy downloads of files over 5mb
369
182
 
370
- * Allow `expires_in` for ActiveStorage signed ids.
371
-
372
- *aki77*
373
-
374
- * Allow to purge an attachment when record is not persisted for `has_one_attached`.
375
-
376
- *Jacopo Beschi*
377
-
378
- * Add a load hook called `active_storage_variant_record` (providing `ActiveStorage::VariantRecord`)
379
- to allow for overriding aspects of the `ActiveStorage::VariantRecord` class. This makes
380
- `ActiveStorage::VariantRecord` consistent with `ActiveStorage::Blob` and `ActiveStorage::Attachment`
381
- that already have load hooks.
382
-
383
- *Brendon Muir*
384
-
385
- * `ActiveStorage::PreviewError` is raised when a previewer is unable to generate a preview image.
386
-
387
- *Alex Robbin*
388
-
389
- * Add `ActiveStorage::Streaming` module that can be included in a controller to get access to `#send_blob_stream`,
390
- which wraps the new `ActionController::Base#send_stream` method to stream a blob from cloud storage:
391
-
392
- ```ruby
393
- class MyPublicBlobsController < ApplicationController
394
- include ActiveStorage::SetBlob, ActiveStorage::Streaming
395
-
396
- def show
397
- http_cache_forever(public: true) do
398
- send_blob_stream @blob, disposition: params[:disposition]
399
- end
400
- end
401
- end
402
- ```
183
+ Previously, trying to view and/or download files larger than 5mb stored in
184
+ services like S3 via proxy mode could return corrupted files at around
185
+ 5.2mb or cause random halts in the download. Now,
186
+ `ActiveStorage::Blobs::ProxyController` correctly handles streaming these
187
+ larger files from the service to the client without any issues.
403
188
 
404
- *DHH*
189
+ Fixes #44679
405
190
 
406
- * Add ability to use pre-defined variants.
191
+ *Felipe Raul*
407
192
 
408
- ```ruby
409
- class User < ActiveRecord::Base
410
- has_one_attached :avatar do |attachable|
411
- attachable.variant :thumb, resize: "100x100"
412
- attachable.variant :medium, resize: "300x300", monochrome: true
413
- end
414
- end
193
+ * Saving attachment(s) to a record returns the blob/blobs object
415
194
 
416
- class Gallery < ActiveRecord::Base
417
- has_many_attached :photos do |attachable|
418
- attachable.variant :thumb, resize: "100x100"
419
- attachable.variant :medium, resize: "300x300", monochrome: true
420
- end
421
- end
195
+ Previously, saving attachments did not return the blob/blobs that
196
+ were attached. Now, saving attachments to a record with `#attach`
197
+ method returns the blob or array of blobs that were attached to
198
+ the record. If it fails to save the attachment(s), then it returns
199
+ `false`.
422
200
 
423
- <%= image_tag user.avatar.variant(:thumb) %>
424
- ```
201
+ *Ghouse Mohamed*
425
202
 
426
- *fatkodima*
203
+ * Don't stream responses in redirect mode
427
204
 
428
- * After setting `config.active_storage.resolve_model_to_route = :rails_storage_proxy`
429
- `rails_blob_path` and `rails_representation_path` will generate proxy URLs by default.
205
+ Previously, both redirect mode and proxy mode streamed their
206
+ responses which caused a new thread to be created, and could end
207
+ up leaking connections in the connection pool. But since redirect
208
+ mode doesn't actually send any data, it doesn't need to be
209
+ streamed.
430
210
 
431
- *Ali Ismayilov*
211
+ *Luke Lau*
432
212
 
433
- * Declare `ActiveStorage::FixtureSet` and `ActiveStorage::FixtureSet.blob` to
434
- improve fixture integration.
213
+ * Safe for direct upload on Libraries or Frameworks
435
214
 
436
- *Sean Doyle*
215
+ Enable the use of custom headers during direct uploads, which allows for
216
+ the inclusion of Authorization bearer tokens or other forms of authorization
217
+ tokens through headers.
437
218
 
219
+ *Radamés Roriz*
438
220
 
439
- Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/activestorage/CHANGELOG.md) for previous changes.
221
+ 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:
147
+ Requiring directly without bundling through the asset pipeline in the application HTML with autostart:
148
148
  ```html
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"
@@ -508,7 +508,7 @@ function toArray(value) {
508
508
  }
509
509
 
510
510
  class BlobRecord {
511
- constructor(file, checksum, url) {
511
+ constructor(file, checksum, url, customHeaders = {}) {
512
512
  this.file = file;
513
513
  this.attributes = {
514
514
  filename: file.name,
@@ -522,6 +522,9 @@ class BlobRecord {
522
522
  this.xhr.setRequestHeader("Content-Type", "application/json");
523
523
  this.xhr.setRequestHeader("Accept", "application/json");
524
524
  this.xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
525
+ Object.keys(customHeaders).forEach((headerKey => {
526
+ this.xhr.setRequestHeader(headerKey, customHeaders[headerKey]);
527
+ }));
525
528
  const csrfToken = getMetaValue("csrf-token");
526
529
  if (csrfToken != undefined) {
527
530
  this.xhr.setRequestHeader("X-CSRF-Token", csrfToken);
@@ -604,11 +607,12 @@ class BlobUpload {
604
607
  let id = 0;
605
608
 
606
609
  class DirectUpload {
607
- constructor(file, url, delegate) {
610
+ constructor(file, url, delegate, customHeaders = {}) {
608
611
  this.id = ++id;
609
612
  this.file = file;
610
613
  this.url = url;
611
614
  this.delegate = delegate;
615
+ this.customHeaders = customHeaders;
612
616
  }
613
617
  create(callback) {
614
618
  FileChecksum.create(this.file, ((error, checksum) => {
@@ -616,7 +620,7 @@ class DirectUpload {
616
620
  callback(error);
617
621
  return;
618
622
  }
619
- const blob = new BlobRecord(this.file, checksum, this.url);
623
+ const blob = new BlobRecord(this.file, checksum, this.url, this.customHeaders);
620
624
  notify(this.delegate, "directUploadWillCreateBlobWithXHR", blob.xhr);
621
625
  blob.create((error => {
622
626
  if (error) {
@@ -841,4 +845,4 @@ function autostart() {
841
845
 
842
846
  setTimeout(autostart, 1);
843
847
 
844
- export { DirectUpload, start };
848
+ export { DirectUpload, DirectUploadController, DirectUploadsController, start };