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 +4 -4
- data/CHANGELOG.md +32 -47
- data/README.md +2 -2
- data/app/assets/javascripts/activestorage.esm.js +1 -1
- data/app/assets/javascripts/activestorage.js +1 -0
- data/app/controllers/active_storage/direct_uploads_controller.rb +1 -1
- data/app/controllers/concerns/active_storage/streaming.rb +9 -0
- data/app/javascript/activestorage/index.js +2 -1
- data/app/models/active_storage/blob/representable.rb +3 -3
- data/app/models/active_storage/blob.rb +3 -20
- data/app/models/active_storage/filename.rb +1 -1
- data/lib/active_storage/analyzer/image_analyzer/vips.rb +1 -1
- data/lib/active_storage/attached/changes/create_one.rb +1 -1
- data/lib/active_storage/attached/model.rb +37 -14
- data/lib/active_storage/gem_version.rb +3 -3
- data/lib/active_storage/service/azure_storage_service.rb +7 -0
- data/lib/active_storage/service/mirror_service.rb +12 -3
- metadata +15 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4bbf84572249cd095f129f72e311fa2006f6a638bd0fcbecb30a821c67181169
|
4
|
+
data.tar.gz: d1cbd96bb36d8030b4a77342f22db20de364964d981936246b4d29111554bbcb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 606c383b9ff07f33678176a77bee416666079c0f55ffa5abad030dd3fb1f80deb7bc37ab3f3ece431ec6501161bc310a3cf53e2f352be94ae2d627166d02e4fd
|
7
|
+
data.tar.gz: 19ea5d15b1226baea7984b9229bb0a24c82bbe89f24194c6193abcaf7dbb4544801e2ffc60f0c00240b7bd6e19293357263c6a40f9d3baa126ea7cb0ac318c37
|
data/CHANGELOG.md
CHANGED
@@ -1,83 +1,68 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 8.0.2 (March 12, 2025) ##
|
2
2
|
|
3
3
|
* No changes.
|
4
4
|
|
5
5
|
|
6
|
-
## Rails
|
6
|
+
## Rails 8.0.2 (March 12, 2025) ##
|
7
7
|
|
8
|
-
*
|
8
|
+
* A Blob will no longer autosave associated Attachment.
|
9
9
|
|
10
|
-
|
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
|
-
|
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
|
-
*
|
18
|
+
*Edouard-chin*
|
15
19
|
|
16
|
-
* Add support for custom `key` in `ActiveStorage::Blob#compose`.
|
17
20
|
|
18
|
-
|
21
|
+
## Rails 8.0.1 (December 13, 2024) ##
|
19
22
|
|
20
|
-
*
|
21
|
-
is set.
|
22
|
-
|
23
|
-
*Lewis Buckley*
|
23
|
+
* No changes.
|
24
24
|
|
25
|
-
* Fix JSON-encoding of `ActiveStorage::Filename` instances.
|
26
25
|
|
27
|
-
|
26
|
+
## Rails 8.0.0.1 (December 10, 2024) ##
|
28
27
|
|
29
|
-
*
|
28
|
+
* No changes.
|
30
29
|
|
31
|
-
*Aaron Patterson & Justin Searls*
|
32
30
|
|
33
|
-
|
34
|
-
`ActiveRecord::Base.table_name_prefix` configuration.
|
31
|
+
## Rails 8.0.0 (November 07, 2024) ##
|
35
32
|
|
36
|
-
|
33
|
+
* No changes.
|
37
34
|
|
38
|
-
* Fix `ActiveStorage::Representations::ProxyController` not returning the proper
|
39
|
-
preview image variant for previewable files.
|
40
35
|
|
41
|
-
|
36
|
+
## Rails 8.0.0.rc2 (October 30, 2024) ##
|
42
37
|
|
43
|
-
*
|
44
|
-
variants.
|
38
|
+
* No changes.
|
45
39
|
|
46
|
-
*Chedli Bourguiba*
|
47
40
|
|
48
|
-
|
49
|
-
for blobs that are not representable.
|
41
|
+
## Rails 8.0.0.rc1 (October 19, 2024) ##
|
50
42
|
|
51
|
-
|
43
|
+
* No changes.
|
52
44
|
|
53
|
-
* Prevent `ActiveStorage::Blob#preview` to generate a variant if an empty variation is passed.
|
54
45
|
|
55
|
-
|
56
|
-
image instead of generating a variant with the exact same dimensions.
|
46
|
+
## Rails 8.0.0.beta1 (September 26, 2024) ##
|
57
47
|
|
58
|
-
|
48
|
+
* Deprecate `ActiveStorage::Service::AzureStorageService`.
|
59
49
|
|
60
|
-
*
|
50
|
+
*zzak*
|
61
51
|
|
62
|
-
|
63
|
-
|
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
|
-
*
|
55
|
+
*Luong Viet Dung(Martin)*
|
68
56
|
|
69
|
-
*
|
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
|
-
|
59
|
+
Include Blob ID and content_type in the messages.
|
74
60
|
|
75
|
-
*
|
61
|
+
*Petrik de Heus*
|
76
62
|
|
77
|
-
|
63
|
+
* Mark proxied files as `immutable` in their Cache-Control header
|
78
64
|
|
79
|
-
*
|
65
|
+
*Nate Matykiewicz*
|
80
66
|
|
81
|
-
*Yogesh Khater*
|
82
67
|
|
83
|
-
Please check [7-
|
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.
|
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.
|
91
|
+
message = Message.create! params.expect(message: [ :title, :content, images: [] ])
|
92
92
|
redirect_to message
|
93
93
|
end
|
94
94
|
|
@@ -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.
|
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
|
-
|
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,
|
75
|
-
#
|
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}
|
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.
|
@@ -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
|
-
|
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
|
-
#
|
75
|
-
#
|
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
|
-
|
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
|
-
#
|
175
|
-
#
|
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
|
-
|
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
|
@@ -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
|
-
|
79
|
-
|
80
|
-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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/
|
194
|
-
documentation_uri: https://api.rubyonrails.org/
|
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/
|
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.
|
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.
|
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: []
|