activestorage 7.2.1.1 → 8.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eef2d4d453faaefdeac26b72a8b275c5d11d717fd8157252ccd81e8ce9e3a032
4
- data.tar.gz: df59f7a070ae24df4c3e9103e61e4e906604df0d38154b0d70410703967b171f
3
+ metadata.gz: f616a42006688352c67e955c0d1804442c21bfb56a0f28143d27d3c50d647183
4
+ data.tar.gz: 48c9ce1d0ef4cf681e0598a94320aaef0d921f33bd1c33fa792bd0748d76379d
5
5
  SHA512:
6
- metadata.gz: 5fd80d8902d7a745037a6dc1f28081a8c74b775ed8496b60c925ac61f8f2caeafbd0af18fac61f35f5141c62041e1f8a6fb9d08cb3751cc0550baddfc4fecfb7
7
- data.tar.gz: '081d3a9d2211229c0f045c0fddfada19a78bf5024a8e3bf259bd8bb62195239cd26db80050a529d78b993e62cefa77bd3280f9f9be12968a5917e66f6fc11bc1'
6
+ metadata.gz: 48ff570e84bb9c792b87bc4cd1960147c34060e80f8d7c73025961dc5d6c31abf47eea9c51cecf21733a97bf480c6af04cbafec5717fe3bea5630be3a5877cfc
7
+ data.tar.gz: 478215e56318eeab97be1f06afc6139b23bba44a70e04c309dbbed62eeb10933f5222fb128429d5c47a593b961f8b0015bed9caa2538176efdb4b26feaeea75e
data/CHANGELOG.md CHANGED
@@ -1,88 +1,28 @@
1
- ## Rails 7.2.1.1 (October 15, 2024) ##
1
+ ## Rails 8.0.0.rc1 (October 19, 2024) ##
2
2
 
3
3
  * No changes.
4
4
 
5
5
 
6
- ## Rails 7.2.1 (August 22, 2024) ##
6
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
7
7
 
8
- * No changes.
9
-
10
-
11
- ## Rails 7.2.0 (August 09, 2024) ##
12
-
13
- * Remove deprecated `config.active_storage.silence_invalid_content_types_warning`.
14
-
15
- *Rafael Mendonça França*
16
-
17
- * Remove deprecated `config.active_storage.replace_on_assign_to_many`.
18
-
19
- *Rafael Mendonça França*
20
-
21
- * Add support for custom `key` in `ActiveStorage::Blob#compose`.
22
-
23
- *Elvin Efendiev*
24
-
25
- * Add `image/webp` to `config.active_storage.web_image_content_types` when `load_defaults "7.2"`
26
- is set.
27
-
28
- *Lewis Buckley*
29
-
30
- * Fix JSON-encoding of `ActiveStorage::Filename` instances.
31
-
32
- *Jonathan del Strother*
33
-
34
- * Fix N+1 query when fetching preview images for non-image assets.
35
-
36
- *Aaron Patterson & Justin Searls*
37
-
38
- * Fix all Active Storage database related models to respect
39
- `ActiveRecord::Base.table_name_prefix` configuration.
40
-
41
- *Chedli Bourguiba*
42
-
43
- * Fix `ActiveStorage::Representations::ProxyController` not returning the proper
44
- preview image variant for previewable files.
45
-
46
- *Chedli Bourguiba*
47
-
48
- * Fix `ActiveStorage::Representations::ProxyController` to proxy untracked
49
- variants.
50
-
51
- *Chedli Bourguiba*
52
-
53
- * When using the `preprocessed: true` option, avoid enqueuing transform jobs
54
- for blobs that are not representable.
55
-
56
- *Chedli Bourguiba*
57
-
58
- * Prevent `ActiveStorage::Blob#preview` to generate a variant if an empty variation is passed.
59
-
60
- Calls to `#url`, `#key` or `#download` will now use the original preview
61
- image instead of generating a variant with the exact same dimensions.
62
-
63
- *Chedli Bourguiba*
8
+ * Deprecate `ActiveStorage::Service::AzureStorageService`.
64
9
 
65
- * Process preview image variant when calling `ActiveStorage::Preview#processed`.
10
+ *zzak*
66
11
 
67
- For example, `attached_pdf.preview(:thumb).processed` will now immediately
68
- generate the full-sized preview image and the `:thumb` variant of it.
69
- Previously, the `:thumb` variant would not be generated until a further call
70
- to e.g. `processed.url`.
12
+ * Improve `ActiveStorage::Filename#sanitized` method to handle special characters more effectively.
13
+ Replace the characters `"*?<>` with `-` if they exist in the Filename to match the Filename convention of Win OS.
71
14
 
72
- *Chedli Bourguiba* and *Jonathan Hefner*
15
+ *Luong Viet Dung(Martin)*
73
16
 
74
- * Prevent `ActiveRecord::StrictLoadingViolationError` when strict loading is
75
- enabled and the variant of an Active Storage preview has already been
76
- processed (for example, by calling `ActiveStorage::Preview#url`).
17
+ * Improve InvariableError, UnpreviewableError and UnrepresentableError message.
77
18
 
78
- *Jonathan Hefner*
19
+ Include Blob ID and content_type in the messages.
79
20
 
80
- * Fix `preprocessed: true` option for named variants of previewable files.
21
+ *Petrik de Heus*
81
22
 
82
- *Nico Wenterodt*
23
+ * Mark proxied files as `immutable` in their Cache-Control header
83
24
 
84
- * Allow accepting `service` as a proc as well in `has_one_attached` and `has_many_attached`.
25
+ *Nate Matykiewicz*
85
26
 
86
- *Yogesh Khater*
87
27
 
88
- Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activestorage/CHANGELOG.md) for previous changes.
28
+ Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activestorage/CHANGELOG.md) for previous changes.
data/README.md CHANGED
@@ -73,7 +73,7 @@ end
73
73
  ```erb
74
74
  <%= form_with model: @message, local: true do |form| %>
75
75
  <%= form.text_field :title, placeholder: "Title" %><br>
76
- <%= form.text_area :content %><br><br>
76
+ <%= form.textarea :content %><br><br>
77
77
 
78
78
  <%= form.file_field :images, multiple: true %><br>
79
79
  <%= form.submit %>
@@ -88,7 +88,7 @@ class MessagesController < ApplicationController
88
88
  end
89
89
 
90
90
  def create
91
- message = Message.create! params.require(:message).permit(:title, :content, images: [])
91
+ message = Message.create! params.expect(message: [ :title, :content, images: [] ])
92
92
  redirect_to message
93
93
  end
94
94
 
@@ -845,4 +845,4 @@ function autostart() {
845
845
 
846
846
  setTimeout(autostart, 1);
847
847
 
848
- export { DirectUpload, DirectUploadController, DirectUploadsController, start };
848
+ export { DirectUpload, DirectUploadController, DirectUploadsController, dispatchEvent, start };
@@ -822,6 +822,7 @@
822
822
  exports.DirectUpload = DirectUpload;
823
823
  exports.DirectUploadController = DirectUploadController;
824
824
  exports.DirectUploadsController = DirectUploadsController;
825
+ exports.dispatchEvent = dispatchEvent;
825
826
  exports.start = start;
826
827
  Object.defineProperty(exports, "__esModule", {
827
828
  value: true
@@ -11,7 +11,7 @@ class ActiveStorage::DirectUploadsController < ActiveStorage::BaseController
11
11
 
12
12
  private
13
13
  def blob_args
14
- params.require(:blob).permit(:filename, :byte_size, :checksum, :content_type, metadata: {}).to_h.symbolize_keys
14
+ params.expect(blob: [:filename, :byte_size, :checksum, :content_type, metadata: {}]).to_h.symbolize_keys
15
15
  end
16
16
 
17
17
  def direct_upload_json(blob)
@@ -61,6 +61,15 @@ module ActiveStorage::Streaming
61
61
  blob.download do |chunk|
62
62
  stream.write chunk
63
63
  end
64
+ rescue ActiveStorage::FileNotFoundError
65
+ expires_now
66
+ head :not_found
67
+ rescue
68
+ # Status and caching headers are already set, but not commited.
69
+ # Change the status to 500 manually.
70
+ expires_now
71
+ head :internal_server_error
72
+ raise
64
73
  end
65
74
  end
66
75
  end
@@ -2,7 +2,8 @@ import { start } from "./ujs"
2
2
  import { DirectUpload } from "./direct_upload"
3
3
  import { DirectUploadController } from "./direct_upload_controller"
4
4
  import { DirectUploadsController } from "./direct_uploads_controller"
5
- export { start, DirectUpload, DirectUploadController, DirectUploadsController }
5
+ import { dispatchEvent } from "./helpers"
6
+ export { start, DirectUpload, DirectUploadController, DirectUploadsController, dispatchEvent }
6
7
 
7
8
  function autostart() {
8
9
  if (window.ActiveStorage) {
@@ -35,7 +35,7 @@ module ActiveStorage::Blob::Representable
35
35
  if variable?
36
36
  variant_class.new(self, ActiveStorage::Variation.wrap(transformations).default_to(default_variant_transformations))
37
37
  else
38
- raise ActiveStorage::InvariableError
38
+ raise ActiveStorage::InvariableError, "Can't transform blob with ID=#{id} and content_type=#{content_type}"
39
39
  end
40
40
  end
41
41
 
@@ -64,7 +64,7 @@ module ActiveStorage::Blob::Representable
64
64
  if previewable?
65
65
  ActiveStorage::Preview.new(self, transformations)
66
66
  else
67
- raise ActiveStorage::UnpreviewableError
67
+ raise ActiveStorage::UnpreviewableError, "No previewer found for blob with ID=#{id} and content_type=#{content_type}"
68
68
  end
69
69
  end
70
70
 
@@ -89,7 +89,7 @@ module ActiveStorage::Blob::Representable
89
89
  when variable?
90
90
  variant transformations
91
91
  else
92
- raise ActiveStorage::UnrepresentableError
92
+ raise ActiveStorage::UnrepresentableError, "No previewer found and can't transform blob with ID=#{id} and content_type=#{content_type}"
93
93
  end
94
94
  end
95
95
 
@@ -71,9 +71,8 @@ class ActiveStorage::Blob < ActiveStorage::Record
71
71
  end
72
72
 
73
73
  # Works like +find_signed+, but will raise an +ActiveSupport::MessageVerifier::InvalidSignature+
74
- # exception if the +signed_id+ has either expired, has a purpose mismatch, is for another record,
75
- # or has been tampered with. It will also raise an +ActiveRecord::RecordNotFound+ exception if
76
- # the valid signed id can't find a record.
74
+ # exception if the +signed_id+ has either expired, has a purpose mismatch, or has been tampered with.
75
+ # It will also raise an +ActiveRecord::RecordNotFound+ exception if the valid signed id can't find a record.
77
76
  def find_signed!(id, record: nil, purpose: :blob_id)
78
77
  super(id, purpose: purpose)
79
78
  end
@@ -57,7 +57,7 @@ class ActiveStorage::Filename
57
57
  #
58
58
  # Characters considered unsafe for storage (e.g. \, $, and the RTL override character) are replaced with a dash.
59
59
  def sanitized
60
- @filename.encode(Encoding::UTF_8, invalid: :replace, undef: :replace, replace: "�").strip.tr("\u{202E}%$|:;/\t\r\n\\", "-")
60
+ @filename.encode(Encoding::UTF_8, invalid: :replace, undef: :replace, replace: "�").strip.tr("\u{202E}%$|:;/<>?*\"\t\r\n\\", "-")
61
61
  end
62
62
 
63
63
  # Returns the sanitized version of the filename.
@@ -61,18 +61,16 @@ module ActiveStorage
61
61
  # There is no column defined on the model side, Active Storage takes
62
62
  # care of the mapping between your records and the attachment.
63
63
  #
64
- # To avoid N+1 queries, you can include the attached blobs in your query like so:
65
- #
66
- # User.with_attached_avatar
67
- #
68
64
  # Under the covers, this relationship is implemented as a +has_one+ association to a
69
65
  # ActiveStorage::Attachment record and a +has_one-through+ association to a
70
66
  # ActiveStorage::Blob record. These associations are available as +avatar_attachment+
71
67
  # and +avatar_blob+. But you shouldn't need to work with these associations directly in
72
68
  # most circumstances.
73
69
  #
74
- # The system has been designed to having you go through the ActiveStorage::Attached::One
75
- # proxy that provides the dynamic proxy to the associations and factory methods, like +attach+.
70
+ # Instead, +has_one_attached+ generates an ActiveStorage::Attached::One proxy to
71
+ # provide access to the associations and factory methods, like +attach+:
72
+ #
73
+ # user.avatar.attach(uploaded_file)
76
74
  #
77
75
  # The +:dependent+ option defaults to +:purge_later+. This means the attachment will be
78
76
  # purged (i.e. destroyed) in the background whenever the record is destroyed.
@@ -92,6 +90,10 @@ module ActiveStorage
92
90
  # has_one_attached :avatar, service: ->(user) { user.in_europe_region? ? :s3_europe : :s3_usa }
93
91
  # end
94
92
  #
93
+ # To avoid N+1 queries, you can include the attached blobs in your query like so:
94
+ #
95
+ # User.with_attached_avatar
96
+ #
95
97
  # If you need to enable +strict_loading+ to prevent lazy loading of attachment,
96
98
  # pass the +:strict_loading+ option. You can do:
97
99
  #
@@ -161,18 +163,16 @@ module ActiveStorage
161
163
  # There are no columns defined on the model side, Active Storage takes
162
164
  # care of the mapping between your records and the attachments.
163
165
  #
164
- # To avoid N+1 queries, you can include the attached blobs in your query like so:
165
- #
166
- # Gallery.where(user: Current.user).with_attached_photos
167
- #
168
166
  # Under the covers, this relationship is implemented as a +has_many+ association to a
169
167
  # ActiveStorage::Attachment record and a +has_many-through+ association to a
170
168
  # ActiveStorage::Blob record. These associations are available as +photos_attachments+
171
169
  # and +photos_blobs+. But you shouldn't need to work with these associations directly in
172
170
  # most circumstances.
173
171
  #
174
- # The system has been designed to having you go through the ActiveStorage::Attached::Many
175
- # proxy that provides the dynamic proxy to the associations and factory methods, like +#attach+.
172
+ # Instead, +has_many_attached+ generates an ActiveStorage::Attached::Many proxy to
173
+ # provide access to the associations and factory methods, like +attach+:
174
+ #
175
+ # user.photos.attach(uploaded_file)
176
176
  #
177
177
  # The +:dependent+ option defaults to +:purge_later+. This means the attachments will be
178
178
  # purged (i.e. destroyed) in the background whenever the record is destroyed.
@@ -192,6 +192,10 @@ module ActiveStorage
192
192
  # has_many_attached :photos, service: ->(gallery) { gallery.personal? ? :personal_s3 : :s3 }
193
193
  # end
194
194
  #
195
+ # To avoid N+1 queries, you can include the attached blobs in your query like so:
196
+ #
197
+ # Gallery.where(user: Current.user).with_attached_photos
198
+ #
195
199
  # If you need to enable +strict_loading+ to prevent lazy loading of attachments,
196
200
  # pass the +:strict_loading+ option. You can do:
197
201
  #
@@ -7,10 +7,10 @@ module ActiveStorage
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 7
11
- MINOR = 2
12
- TINY = 1
13
- PRE = "1"
10
+ MAJOR = 8
11
+ MINOR = 0
12
+ TINY = 0
13
+ PRE = "rc1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -15,6 +15,13 @@ module ActiveStorage
15
15
  attr_reader :client, :container, :signer
16
16
 
17
17
  def initialize(storage_account_name:, storage_access_key:, container:, public: false, **options)
18
+ ActiveStorage.deprecator.warn <<~MSG.squish
19
+ `ActiveStorage::Service::AzureStorageService` is deprecated and will be
20
+ removed in Rails 8.1.
21
+ Please try the `azure-blob` gem instead.
22
+ This gem is not maintained by the Rails team, so please test your applications before deploying to production.
23
+ MSG
24
+
18
25
  @client = Azure::Storage::Blob::BlobService.create(storage_account_name: storage_account_name, storage_access_key: storage_access_key, **options)
19
26
  @signer = Azure::Storage::Common::Core::Auth::SharedAccessSignature.new(storage_account_name, storage_access_key)
20
27
  @container = container
@@ -30,6 +30,13 @@ module ActiveStorage
30
30
 
31
31
  def initialize(primary:, mirrors:)
32
32
  @primary, @mirrors = primary, mirrors
33
+ @executor = Concurrent::ThreadPoolExecutor.new(
34
+ min_threads: 1,
35
+ max_threads: mirrors.size,
36
+ max_queue: 0,
37
+ fallback_policy: :caller_runs,
38
+ idle_time: 60
39
+ )
33
40
  end
34
41
 
35
42
  # Upload the +io+ to the +key+ specified to all services. The upload to the primary service is done synchronously
@@ -75,10 +82,12 @@ module ActiveStorage
75
82
  end
76
83
 
77
84
  def perform_across_services(method, *args)
78
- # FIXME: Convert to be threaded
79
- each_service.collect do |service|
80
- service.public_send method, *args
85
+ tasks = each_service.collect do |service|
86
+ Concurrent::Promise.execute(executor: @executor) do
87
+ service.public_send method, *args
88
+ end
81
89
  end
90
+ tasks.each(&:value!)
82
91
  end
83
92
  end
84
93
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activestorage
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.1.1
4
+ version: 8.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-15 00:00:00.000000000 Z
11
+ date: 2024-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,56 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 7.2.1.1
19
+ version: 8.0.0.rc1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 7.2.1.1
26
+ version: 8.0.0.rc1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: actionpack
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 7.2.1.1
33
+ version: 8.0.0.rc1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 7.2.1.1
40
+ version: 8.0.0.rc1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: activejob
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 7.2.1.1
47
+ version: 8.0.0.rc1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 7.2.1.1
54
+ version: 8.0.0.rc1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: activerecord
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 7.2.1.1
61
+ version: 8.0.0.rc1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 7.2.1.1
68
+ version: 8.0.0.rc1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: marcel
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -190,10 +190,10 @@ licenses:
190
190
  - MIT
191
191
  metadata:
192
192
  bug_tracker_uri: https://github.com/rails/rails/issues
193
- changelog_uri: https://github.com/rails/rails/blob/v7.2.1.1/activestorage/CHANGELOG.md
194
- documentation_uri: https://api.rubyonrails.org/v7.2.1.1/
193
+ changelog_uri: https://github.com/rails/rails/blob/v8.0.0.rc1/activestorage/CHANGELOG.md
194
+ documentation_uri: https://api.rubyonrails.org/v8.0.0.rc1/
195
195
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
196
- source_code_uri: https://github.com/rails/rails/tree/v7.2.1.1/activestorage
196
+ source_code_uri: https://github.com/rails/rails/tree/v8.0.0.rc1/activestorage
197
197
  rubygems_mfa_required: 'true'
198
198
  post_install_message:
199
199
  rdoc_options: []
@@ -203,7 +203,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
203
203
  requirements:
204
204
  - - ">="
205
205
  - !ruby/object:Gem::Version
206
- version: 3.1.0
206
+ version: 3.2.0
207
207
  required_rubygems_version: !ruby/object:Gem::Requirement
208
208
  requirements:
209
209
  - - ">="