activestorage 7.0.4 → 7.1.5.1

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