activestorage 7.2.0 → 8.0.0.beta1

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: da8d7f2cbc1f8d032c38af7720a92c07f024dc9ccbe0f67ff3daadd8dc2613e9
4
- data.tar.gz: ed3bd8cc7f51aa26e1247ce9182ec0f1a81871b5e0c854ef7c974065f6d71134
3
+ metadata.gz: 90eb90580cb0faea4b29eef5ddf0dbc99dd1087158980f968561fe45c2dcb4d4
4
+ data.tar.gz: bdd0ced8684956539dee4f32ea7eacd16744c72e318aebc0bd815adfa72ffe73
5
5
  SHA512:
6
- metadata.gz: 19f6c085a1a778c4021f0c66dc2b20ce3062e1f56f05eb38887bb4907dac8272819b5a29ac31aaef924f4ea70ede606da6d29de87a9ea2a4c09b718cfc3e34c6
7
- data.tar.gz: 1e0156a1428ed9d779ddfd0bf67222796b10ce969b5affad4432e543dcc37cad736c2d2c484457cf465ab257da700ca92a55679d716c88084f929f1387205d62
6
+ metadata.gz: 46465038ab95d65913a9f359af9b21fcb5b3ee9a37877b32eeabd7943de6373625d7ae51a9383099a89bd7d949ee6b5db37c5518656313121d8991b4e52e7667
7
+ data.tar.gz: 4f7590242bb707d2ed0c9b22871f2e00d28f683224341387c739b9771a85ab18e8655e1a913b2bdabb724bb694cb6b997f4b1c2771fa52a2b96ac1882593471a
data/CHANGELOG.md CHANGED
@@ -1,78 +1,23 @@
1
- ## Rails 7.2.0 (August 09, 2024) ##
1
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
2
2
 
3
- * Remove deprecated `config.active_storage.silence_invalid_content_types_warning`.
3
+ * Deprecate `ActiveStorage::Service::AzureStorageService`.
4
4
 
5
- *Rafael Mendonça França*
5
+ *zzak*
6
6
 
7
- * Remove deprecated `config.active_storage.replace_on_assign_to_many`.
7
+ * Improve `ActiveStorage::Filename#sanitized` method to handle special characters more effectively.
8
+ Replace the characters `"*?<>` with `-` if they exist in the Filename to match the Filename convention of Win OS.
8
9
 
9
- *Rafael Mendonça França*
10
+ *Luong Viet Dung(Martin)*
10
11
 
11
- * Add support for custom `key` in `ActiveStorage::Blob#compose`.
12
+ * Improve InvariableError, UnpreviewableError and UnrepresentableError message.
12
13
 
13
- *Elvin Efendiev*
14
+ Include Blob ID and content_type in the messages.
14
15
 
15
- * Add `image/webp` to `config.active_storage.web_image_content_types` when `load_defaults "7.2"`
16
- is set.
16
+ *Petrik de Heus*
17
17
 
18
- *Lewis Buckley*
18
+ * Mark proxied files as `immutable` in their Cache-Control header
19
19
 
20
- * Fix JSON-encoding of `ActiveStorage::Filename` instances.
20
+ *Nate Matykiewicz*
21
21
 
22
- *Jonathan del Strother*
23
22
 
24
- * Fix N+1 query when fetching preview images for non-image assets.
25
-
26
- *Aaron Patterson & Justin Searls*
27
-
28
- * Fix all Active Storage database related models to respect
29
- `ActiveRecord::Base.table_name_prefix` configuration.
30
-
31
- *Chedli Bourguiba*
32
-
33
- * Fix `ActiveStorage::Representations::ProxyController` not returning the proper
34
- preview image variant for previewable files.
35
-
36
- *Chedli Bourguiba*
37
-
38
- * Fix `ActiveStorage::Representations::ProxyController` to proxy untracked
39
- variants.
40
-
41
- *Chedli Bourguiba*
42
-
43
- * When using the `preprocessed: true` option, avoid enqueuing transform jobs
44
- for blobs that are not representable.
45
-
46
- *Chedli Bourguiba*
47
-
48
- * Prevent `ActiveStorage::Blob#preview` to generate a variant if an empty variation is passed.
49
-
50
- Calls to `#url`, `#key` or `#download` will now use the original preview
51
- image instead of generating a variant with the exact same dimensions.
52
-
53
- *Chedli Bourguiba*
54
-
55
- * Process preview image variant when calling `ActiveStorage::Preview#processed`.
56
-
57
- For example, `attached_pdf.preview(:thumb).processed` will now immediately
58
- generate the full-sized preview image and the `:thumb` variant of it.
59
- Previously, the `:thumb` variant would not be generated until a further call
60
- to e.g. `processed.url`.
61
-
62
- *Chedli Bourguiba* and *Jonathan Hefner*
63
-
64
- * Prevent `ActiveRecord::StrictLoadingViolationError` when strict loading is
65
- enabled and the variant of an Active Storage preview has already been
66
- processed (for example, by calling `ActiveStorage::Preview#url`).
67
-
68
- *Jonathan Hefner*
69
-
70
- * Fix `preprocessed: true` option for named variants of previewable files.
71
-
72
- *Nico Wenterodt*
73
-
74
- * Allow accepting `service` as a proc as well in `has_one_attached` and `has_many_attached`.
75
-
76
- *Yogesh Khater*
77
-
78
- Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activestorage/CHANGELOG.md) for previous changes.
23
+ 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
  #
@@ -118,15 +118,6 @@ module ActiveStorage
118
118
  ActiveStorage.content_types_allowed_inline = app.config.active_storage.content_types_allowed_inline || []
119
119
  ActiveStorage.binary_content_type = app.config.active_storage.binary_content_type || "application/octet-stream"
120
120
  ActiveStorage.video_preview_arguments = app.config.active_storage.video_preview_arguments || "-y -vframes 1 -f image2"
121
-
122
- unless app.config.active_storage.silence_invalid_content_types_warning.nil?
123
- ActiveStorage.silence_invalid_content_types_warning = app.config.active_storage.silence_invalid_content_types_warning
124
- end
125
-
126
- unless app.config.active_storage.replace_on_assign_to_many.nil?
127
- ActiveStorage.replace_on_assign_to_many = app.config.active_storage.replace_on_assign_to_many
128
- end
129
-
130
121
  ActiveStorage.track_variants = app.config.active_storage.track_variants || false
131
122
  end
132
123
  end
@@ -7,10 +7,10 @@ module ActiveStorage
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 7
11
- MINOR = 2
10
+ MAJOR = 8
11
+ MINOR = 0
12
12
  TINY = 0
13
- PRE = nil
13
+ PRE = "beta1"
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.0
4
+ version: 8.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-09 00:00:00.000000000 Z
11
+ date: 2024-09-26 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.0
19
+ version: 8.0.0.beta1
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.0
26
+ version: 8.0.0.beta1
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.0
33
+ version: 8.0.0.beta1
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.0
40
+ version: 8.0.0.beta1
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.0
47
+ version: 8.0.0.beta1
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.0
54
+ version: 8.0.0.beta1
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.0
61
+ version: 8.0.0.beta1
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.0
68
+ version: 8.0.0.beta1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: marcel
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -190,12 +190,12 @@ 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.0/activestorage/CHANGELOG.md
194
- documentation_uri: https://api.rubyonrails.org/v7.2.0/
193
+ changelog_uri: https://github.com/rails/rails/blob/v8.0.0.beta1/activestorage/CHANGELOG.md
194
+ documentation_uri: https://api.rubyonrails.org/v8.0.0.beta1/
195
195
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
196
- source_code_uri: https://github.com/rails/rails/tree/v7.2.0/activestorage
196
+ source_code_uri: https://github.com/rails/rails/tree/v8.0.0.beta1/activestorage
197
197
  rubygems_mfa_required: 'true'
198
- post_install_message:
198
+ post_install_message:
199
199
  rdoc_options: []
200
200
  require_paths:
201
201
  - lib
@@ -203,15 +203,15 @@ 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
  - - ">="
210
210
  - !ruby/object:Gem::Version
211
211
  version: '0'
212
212
  requirements: []
213
- rubygems_version: 3.5.11
214
- signing_key:
213
+ rubygems_version: 3.5.16
214
+ signing_key:
215
215
  specification_version: 4
216
216
  summary: Local and cloud file storage framework.
217
217
  test_files: []