activestorage 7.2.1 → 8.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 229192a0c37c4cb60d7bbedda9fd6d9f1bfe3ff3f5744916f4370b36da3f8079
4
- data.tar.gz: 38e0dbd7419b51dd75362882eaefe4ed8178bb3071fd06d7236cd97d139a5527
3
+ metadata.gz: 4bbf84572249cd095f129f72e311fa2006f6a638bd0fcbecb30a821c67181169
4
+ data.tar.gz: d1cbd96bb36d8030b4a77342f22db20de364964d981936246b4d29111554bbcb
5
5
  SHA512:
6
- metadata.gz: 1883fafd8a3651475cd9af1f399d2a6ca868fcbd2d87d5a0767a23ad6c5f9ce8e3f4b36dea7ef6acaeb8e44c1dd86287d78dc9d87556b49ae80cfdbb3283afcf
7
- data.tar.gz: a76386a2fcfd9851e6ad034c1826c66d9dd522f7e266afd799c4ddf1c219ff56ff461539da6bd8c680cc459a786b0eeb1e99946b8a226e8d96abf3fc3714ce3d
6
+ metadata.gz: 606c383b9ff07f33678176a77bee416666079c0f55ffa5abad030dd3fb1f80deb7bc37ab3f3ece431ec6501161bc310a3cf53e2f352be94ae2d627166d02e4fd
7
+ data.tar.gz: 19ea5d15b1226baea7984b9229bb0a24c82bbe89f24194c6193abcaf7dbb4544801e2ffc60f0c00240b7bd6e19293357263c6a40f9d3baa126ea7cb0ac318c37
data/CHANGELOG.md CHANGED
@@ -1,83 +1,68 @@
1
- ## Rails 7.2.1 (August 22, 2024) ##
1
+ ## Rails 8.0.2 (March 12, 2025) ##
2
2
 
3
3
  * No changes.
4
4
 
5
5
 
6
- ## Rails 7.2.0 (August 09, 2024) ##
6
+ ## Rails 8.0.2 (March 12, 2025) ##
7
7
 
8
- * Remove deprecated `config.active_storage.silence_invalid_content_types_warning`.
8
+ * A Blob will no longer autosave associated Attachment.
9
9
 
10
- *Rafael Mendonça França*
10
+ This fixes an issue where a record with an attachment would have
11
+ its dirty attributes reset, preventing your `after commit` callbacks
12
+ on that record to behave as expected.
11
13
 
12
- * Remove deprecated `config.active_storage.replace_on_assign_to_many`.
14
+ Note that this change doesn't require any changes on your application
15
+ and is supposed to be internal. Active Storage Attachment will continue
16
+ to be autosaved (through a different relation).
13
17
 
14
- *Rafael Mendonça França*
18
+ *Edouard-chin*
15
19
 
16
- * Add support for custom `key` in `ActiveStorage::Blob#compose`.
17
20
 
18
- *Elvin Efendiev*
21
+ ## Rails 8.0.1 (December 13, 2024) ##
19
22
 
20
- * Add `image/webp` to `config.active_storage.web_image_content_types` when `load_defaults "7.2"`
21
- is set.
22
-
23
- *Lewis Buckley*
23
+ * No changes.
24
24
 
25
- * Fix JSON-encoding of `ActiveStorage::Filename` instances.
26
25
 
27
- *Jonathan del Strother*
26
+ ## Rails 8.0.0.1 (December 10, 2024) ##
28
27
 
29
- * Fix N+1 query when fetching preview images for non-image assets.
28
+ * No changes.
30
29
 
31
- *Aaron Patterson & Justin Searls*
32
30
 
33
- * Fix all Active Storage database related models to respect
34
- `ActiveRecord::Base.table_name_prefix` configuration.
31
+ ## Rails 8.0.0 (November 07, 2024) ##
35
32
 
36
- *Chedli Bourguiba*
33
+ * No changes.
37
34
 
38
- * Fix `ActiveStorage::Representations::ProxyController` not returning the proper
39
- preview image variant for previewable files.
40
35
 
41
- *Chedli Bourguiba*
36
+ ## Rails 8.0.0.rc2 (October 30, 2024) ##
42
37
 
43
- * Fix `ActiveStorage::Representations::ProxyController` to proxy untracked
44
- variants.
38
+ * No changes.
45
39
 
46
- *Chedli Bourguiba*
47
40
 
48
- * When using the `preprocessed: true` option, avoid enqueuing transform jobs
49
- for blobs that are not representable.
41
+ ## Rails 8.0.0.rc1 (October 19, 2024) ##
50
42
 
51
- *Chedli Bourguiba*
43
+ * No changes.
52
44
 
53
- * Prevent `ActiveStorage::Blob#preview` to generate a variant if an empty variation is passed.
54
45
 
55
- Calls to `#url`, `#key` or `#download` will now use the original preview
56
- image instead of generating a variant with the exact same dimensions.
46
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
57
47
 
58
- *Chedli Bourguiba*
48
+ * Deprecate `ActiveStorage::Service::AzureStorageService`.
59
49
 
60
- * Process preview image variant when calling `ActiveStorage::Preview#processed`.
50
+ *zzak*
61
51
 
62
- For example, `attached_pdf.preview(:thumb).processed` will now immediately
63
- generate the full-sized preview image and the `:thumb` variant of it.
64
- Previously, the `:thumb` variant would not be generated until a further call
65
- to e.g. `processed.url`.
52
+ * Improve `ActiveStorage::Filename#sanitized` method to handle special characters more effectively.
53
+ Replace the characters `"*?<>` with `-` if they exist in the Filename to match the Filename convention of Win OS.
66
54
 
67
- *Chedli Bourguiba* and *Jonathan Hefner*
55
+ *Luong Viet Dung(Martin)*
68
56
 
69
- * Prevent `ActiveRecord::StrictLoadingViolationError` when strict loading is
70
- enabled and the variant of an Active Storage preview has already been
71
- processed (for example, by calling `ActiveStorage::Preview#url`).
57
+ * Improve InvariableError, UnpreviewableError and UnrepresentableError message.
72
58
 
73
- *Jonathan Hefner*
59
+ Include Blob ID and content_type in the messages.
74
60
 
75
- * Fix `preprocessed: true` option for named variants of previewable files.
61
+ *Petrik de Heus*
76
62
 
77
- *Nico Wenterodt*
63
+ * Mark proxied files as `immutable` in their Cache-Control header
78
64
 
79
- * Allow accepting `service` as a proc as well in `has_one_attached` and `has_many_attached`.
65
+ *Nate Matykiewicz*
80
66
 
81
- *Yogesh Khater*
82
67
 
83
- Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activestorage/CHANGELOG.md) for previous changes.
68
+ 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 committed.
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
 
@@ -29,7 +29,7 @@ class ActiveStorage::Blob < ActiveStorage::Record
29
29
  # :method:
30
30
  #
31
31
  # Returns the associated ActiveStorage::Attachment instances.
32
- has_many :attachments
32
+ has_many :attachments, autosave: false
33
33
 
34
34
  ##
35
35
  # :singleton-method:
@@ -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
@@ -152,22 +151,6 @@ class ActiveStorage::Blob < ActiveStorage::Record
152
151
  combined_blob.save!
153
152
  end
154
153
  end
155
-
156
- def validate_service_configuration(service_name, model_class, association_name) # :nodoc:
157
- if service_name
158
- services.fetch(service_name) do
159
- raise ArgumentError, "Cannot configure service #{service_name.inspect} for #{model_class}##{association_name}"
160
- end
161
- else
162
- validate_global_service_configuration
163
- end
164
- end
165
-
166
- def validate_global_service_configuration # :nodoc:
167
- if connected? && table_exists? && Rails.configuration.active_storage.service.nil?
168
- raise RuntimeError, "Missing Active Storage service name. Specify Active Storage service name for config.active_storage.service in config/environments/#{Rails.env}.rb"
169
- end
170
- end
171
154
  end
172
155
 
173
156
  include Analyzable
@@ -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.
@@ -32,7 +32,7 @@ module ActiveStorage
32
32
  {}
33
33
  end
34
34
  rescue ::Vips::Error => error
35
- logger.error "Skipping image analysis due to an Vips error: #{error.message}"
35
+ logger.error "Skipping image analysis due to a Vips error: #{error.message}"
36
36
  {}
37
37
  end
38
38
  end
@@ -121,7 +121,7 @@ module ActiveStorage
121
121
  service_name = record.attachment_reflections[name].options[:service_name]
122
122
  if service_name.is_a?(Proc)
123
123
  service_name = service_name.call(record)
124
- ActiveStorage::Blob.validate_service_configuration(service_name, record.class, name)
124
+ Attached::Model.validate_service_configuration(service_name, record.class, name)
125
125
  end
126
126
  service_name
127
127
  end
@@ -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
  #
@@ -104,7 +106,7 @@ module ActiveStorage
104
106
  # <tt>active_storage_attachments.record_type</tt> polymorphic type column of
105
107
  # the corresponding rows.
106
108
  def has_one_attached(name, dependent: :purge_later, service: nil, strict_loading: false)
107
- ActiveStorage::Blob.validate_service_configuration(service, self, name) unless service.is_a?(Proc)
109
+ Attached::Model.validate_service_configuration(service, self, name) unless service.is_a?(Proc)
108
110
 
109
111
  generated_association_methods.class_eval <<-CODE, __FILE__, __LINE__ + 1
110
112
  # frozen_string_literal: true
@@ -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
  #
@@ -204,7 +208,7 @@ module ActiveStorage
204
208
  # <tt>active_storage_attachments.record_type</tt> polymorphic type column of
205
209
  # the corresponding rows.
206
210
  def has_many_attached(name, dependent: :purge_later, service: nil, strict_loading: false)
207
- ActiveStorage::Blob.validate_service_configuration(service, self, name) unless service.is_a?(Proc)
211
+ Attached::Model.validate_service_configuration(service, self, name) unless service.is_a?(Proc)
208
212
 
209
213
  generated_association_methods.class_eval <<-CODE, __FILE__, __LINE__ + 1
210
214
  # frozen_string_literal: true
@@ -255,6 +259,25 @@ module ActiveStorage
255
259
  end
256
260
  end
257
261
 
262
+ class << self
263
+ def validate_service_configuration(service_name, model_class, association_name) # :nodoc:
264
+ if service_name
265
+ ActiveStorage::Blob.services.fetch(service_name) do
266
+ raise ArgumentError, "Cannot configure service #{service_name.inspect} for #{model_class}##{association_name}"
267
+ end
268
+ else
269
+ validate_global_service_configuration(model_class)
270
+ end
271
+ end
272
+
273
+ private
274
+ def validate_global_service_configuration(model_class)
275
+ if model_class.connected? && ActiveStorage::Blob.table_exists? && Rails.configuration.active_storage.service.nil?
276
+ raise RuntimeError, "Missing Active Storage service name. Specify Active Storage service name for config.active_storage.service in config/environments/#{Rails.env}.rb"
277
+ end
278
+ end
279
+ end
280
+
258
281
  def attachment_changes # :nodoc:
259
282
  @attachment_changes ||= {}
260
283
  end
@@ -7,9 +7,9 @@ module ActiveStorage
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 7
11
- MINOR = 2
12
- TINY = 1
10
+ MAJOR = 8
11
+ MINOR = 0
12
+ TINY = 2
13
13
  PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
@@ -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,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activestorage
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.1
4
+ version: 8.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-08-22 00:00:00.000000000 Z
10
+ date: 2025-03-12 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activesupport
@@ -16,56 +15,56 @@ dependencies:
16
15
  requirements:
17
16
  - - '='
18
17
  - !ruby/object:Gem::Version
19
- version: 7.2.1
18
+ version: 8.0.2
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - '='
25
24
  - !ruby/object:Gem::Version
26
- version: 7.2.1
25
+ version: 8.0.2
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: actionpack
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - '='
32
31
  - !ruby/object:Gem::Version
33
- version: 7.2.1
32
+ version: 8.0.2
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
37
  - - '='
39
38
  - !ruby/object:Gem::Version
40
- version: 7.2.1
39
+ version: 8.0.2
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: activejob
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - '='
46
45
  - !ruby/object:Gem::Version
47
- version: 7.2.1
46
+ version: 8.0.2
48
47
  type: :runtime
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - '='
53
52
  - !ruby/object:Gem::Version
54
- version: 7.2.1
53
+ version: 8.0.2
55
54
  - !ruby/object:Gem::Dependency
56
55
  name: activerecord
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - '='
60
59
  - !ruby/object:Gem::Version
61
- version: 7.2.1
60
+ version: 8.0.2
62
61
  type: :runtime
63
62
  prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
65
64
  requirements:
66
65
  - - '='
67
66
  - !ruby/object:Gem::Version
68
- version: 7.2.1
67
+ version: 8.0.2
69
68
  - !ruby/object:Gem::Dependency
70
69
  name: marcel
71
70
  requirement: !ruby/object:Gem::Requirement
@@ -190,12 +189,11 @@ licenses:
190
189
  - MIT
191
190
  metadata:
192
191
  bug_tracker_uri: https://github.com/rails/rails/issues
193
- changelog_uri: https://github.com/rails/rails/blob/v7.2.1/activestorage/CHANGELOG.md
194
- documentation_uri: https://api.rubyonrails.org/v7.2.1/
192
+ changelog_uri: https://github.com/rails/rails/blob/v8.0.2/activestorage/CHANGELOG.md
193
+ documentation_uri: https://api.rubyonrails.org/v8.0.2/
195
194
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
196
- source_code_uri: https://github.com/rails/rails/tree/v7.2.1/activestorage
195
+ source_code_uri: https://github.com/rails/rails/tree/v8.0.2/activestorage
197
196
  rubygems_mfa_required: 'true'
198
- post_install_message:
199
197
  rdoc_options: []
200
198
  require_paths:
201
199
  - lib
@@ -203,15 +201,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
203
201
  requirements:
204
202
  - - ">="
205
203
  - !ruby/object:Gem::Version
206
- version: 3.1.0
204
+ version: 3.2.0
207
205
  required_rubygems_version: !ruby/object:Gem::Requirement
208
206
  requirements:
209
207
  - - ">="
210
208
  - !ruby/object:Gem::Version
211
209
  version: '0'
212
210
  requirements: []
213
- rubygems_version: 3.5.11
214
- signing_key:
211
+ rubygems_version: 3.6.2
215
212
  specification_version: 4
216
213
  summary: Local and cloud file storage framework.
217
214
  test_files: []