activestorage 7.0.8 → 7.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +140 -323
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +4 -4
  5. data/app/assets/javascripts/activestorage.esm.js +8 -4
  6. data/app/assets/javascripts/activestorage.js +9 -3
  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 +1 -0
  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/jobs/active_storage/transform_job.rb +12 -0
  16. data/app/models/active_storage/attachment.rb +87 -13
  17. data/app/models/active_storage/blob/analyzable.rb +4 -3
  18. data/app/models/active_storage/blob/identifiable.rb +1 -0
  19. data/app/models/active_storage/blob/representable.rb +7 -3
  20. data/app/models/active_storage/blob.rb +25 -45
  21. data/app/models/active_storage/current.rb +0 -10
  22. data/app/models/active_storage/filename.rb +2 -0
  23. data/app/models/active_storage/named_variant.rb +21 -0
  24. data/app/models/active_storage/preview.rb +5 -3
  25. data/app/models/active_storage/variant.rb +8 -7
  26. data/app/models/active_storage/variant_with_record.rb +19 -7
  27. data/app/models/active_storage/variation.rb +5 -3
  28. data/db/migrate/20170806125915_create_active_storage_tables.rb +1 -1
  29. data/lib/active_storage/analyzer/audio_analyzer.rb +16 -4
  30. data/lib/active_storage/analyzer/image_analyzer.rb +2 -0
  31. data/lib/active_storage/analyzer/video_analyzer.rb +3 -1
  32. data/lib/active_storage/analyzer.rb +2 -0
  33. data/lib/active_storage/attached/changes/create_many.rb +8 -3
  34. data/lib/active_storage/attached/changes/create_one.rb +14 -2
  35. data/lib/active_storage/attached/many.rb +5 -4
  36. data/lib/active_storage/attached/model.rb +66 -43
  37. data/lib/active_storage/attached/one.rb +5 -4
  38. data/lib/active_storage/attached.rb +2 -0
  39. data/lib/active_storage/deprecator.rb +7 -0
  40. data/lib/active_storage/engine.rb +11 -7
  41. data/lib/active_storage/fixture_set.rb +2 -0
  42. data/lib/active_storage/gem_version.rb +4 -4
  43. data/lib/active_storage/log_subscriber.rb +12 -0
  44. data/lib/active_storage/previewer.rb +8 -1
  45. data/lib/active_storage/reflection.rb +3 -3
  46. data/lib/active_storage/service/azure_storage_service.rb +2 -0
  47. data/lib/active_storage/service/disk_service.rb +2 -0
  48. data/lib/active_storage/service/gcs_service.rb +11 -20
  49. data/lib/active_storage/service/mirror_service.rb +10 -5
  50. data/lib/active_storage/service/s3_service.rb +2 -0
  51. data/lib/active_storage/service.rb +4 -2
  52. data/lib/active_storage/transformers/transformer.rb +2 -0
  53. data/lib/active_storage/version.rb +1 -1
  54. data/lib/active_storage.rb +19 -3
  55. metadata +19 -29
@@ -5,6 +5,8 @@ require "google/apis/iamcredentials_v1"
5
5
  require "google/cloud/storage"
6
6
 
7
7
  module ActiveStorage
8
+ # = Active Storage \GCS \Service
9
+ #
8
10
  # Wraps the Google Cloud Storage as an Active Storage service. See ActiveStorage::Service for the generic API
9
11
  # documentation that applies to all services.
10
12
  class Service::GCSService < Service
@@ -195,26 +197,15 @@ module ActiveStorage
195
197
  end
196
198
 
197
199
  def issuer
198
- @issuer ||= if @config[:gsa_email]
199
- @config[:gsa_email]
200
- else
201
- uri = URI.parse("http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email")
202
- http = Net::HTTP.new(uri.host, uri.port)
203
- request = Net::HTTP::Get.new(uri.request_uri)
204
- request["Metadata-Flavor"] = "Google"
205
-
206
- begin
207
- response = http.request(request)
208
- rescue SocketError
209
- raise MetadataServerNotFoundError
210
- end
211
-
212
- if response.is_a?(Net::HTTPSuccess)
213
- response.body
214
- else
215
- raise MetadataServerError
216
- end
217
- end
200
+ @issuer ||= @config[:gsa_email].presence || email_from_metadata_server
201
+ end
202
+
203
+ def email_from_metadata_server
204
+ env = Google::Cloud.env
205
+ raise MetadataServerNotFoundError if !env.metadata?
206
+
207
+ email = env.lookup_metadata("instance", "service-accounts/default/email")
208
+ email.presence or raise MetadataServerError
218
209
  end
219
210
 
220
211
  def signer
@@ -3,6 +3,8 @@
3
3
  require "active_support/core_ext/module/delegation"
4
4
 
5
5
  module ActiveStorage
6
+ # = Active Storage Mirror \Service
7
+ #
6
8
  # Wraps a set of mirror services and provides a single ActiveStorage::Service object that will all
7
9
  # have the files uploaded to them. A +primary+ service is designated to answer calls to:
8
10
  # * +download+
@@ -30,13 +32,13 @@ module ActiveStorage
30
32
  @primary, @mirrors = primary, mirrors
31
33
  end
32
34
 
33
- # Upload the +io+ to the +key+ specified to all services. If a +checksum+ is provided, all services will
35
+ # Upload the +io+ to the +key+ specified to all services. The upload to the primary service is done synchronously
36
+ # whereas the upload to the mirrors is done asynchronously. If a +checksum+ is provided, all services will
34
37
  # ensure a match when the upload has completed or raise an ActiveStorage::IntegrityError.
35
38
  def upload(key, io, checksum: nil, **options)
36
- each_service.collect do |service|
37
- io.rewind
38
- service.upload key, io, checksum: checksum, **options
39
- end
39
+ io.rewind
40
+ primary.upload key, io, checksum: checksum, **options
41
+ mirror_later key, checksum: checksum
40
42
  end
41
43
 
42
44
  # Delete the file at the +key+ on all services.
@@ -49,6 +51,9 @@ module ActiveStorage
49
51
  perform_across_services :delete_prefixed, prefix
50
52
  end
51
53
 
54
+ def mirror_later(key, checksum:) # :nodoc:
55
+ ActiveStorage::MirrorJob.perform_later key, checksum: checksum
56
+ end
52
57
 
53
58
  # Copy the file at the +key+ from the primary service to each of the mirrors where it doesn't already exist.
54
59
  def mirror(key, checksum:)
@@ -6,6 +6,8 @@ require "aws-sdk-s3"
6
6
  require "active_support/core_ext/numeric/bytes"
7
7
 
8
8
  module ActiveStorage
9
+ # = Active Storage \S3 \Service
10
+ #
9
11
  # Wraps the Amazon Simple Storage Service (S3) as an Active Storage service.
10
12
  # See ActiveStorage::Service for the generic API documentation that applies to all services.
11
13
  class Service::S3Service < Service
@@ -6,6 +6,8 @@ require "action_dispatch"
6
6
  require "action_dispatch/http/content_disposition"
7
7
 
8
8
  module ActiveStorage
9
+ # = Active Storage \Service
10
+ #
9
11
  # Abstract class serving as an interface for concrete services.
10
12
  #
11
13
  # The available services are:
@@ -16,7 +18,7 @@ module ActiveStorage
16
18
  # * +AzureStorage+, to manage attachments through Microsoft Azure Storage.
17
19
  # * +Mirror+, to be able to use several services to manage attachments.
18
20
  #
19
- # Inside a Rails application, you can set-up your services through the
21
+ # Inside a \Rails application, you can set-up your services through the
20
22
  # generated <tt>config/storage.yml</tt> file and reference one
21
23
  # of the aforementioned constant under the +service+ key. For example:
22
24
  #
@@ -31,7 +33,7 @@ module ActiveStorage
31
33
  #
32
34
  # config.active_storage.service = :local
33
35
  #
34
- # If you are using Active Storage outside of a Ruby on Rails application, you
36
+ # If you are using Active Storage outside of a Ruby on \Rails application, you
35
37
  # can configure the service to use like this:
36
38
  #
37
39
  # ActiveStorage::Blob.service = ActiveStorage::Service.configure(
@@ -2,6 +2,8 @@
2
2
 
3
3
  module ActiveStorage
4
4
  module Transformers
5
+ # = Active Storage \Transformers \Transformer
6
+ #
5
7
  # A Transformer applies a set of transformations to an image.
6
8
  #
7
9
  # The following concrete subclasses are included in Active Storage:
@@ -3,7 +3,7 @@
3
3
  require_relative "gem_version"
4
4
 
5
5
  module ActiveStorage
6
- # Returns the currently loaded version of Active Storage as a <tt>Gem::Version</tt>.
6
+ # Returns the currently loaded version of Active Storage as a +Gem::Version+.
7
7
  def self.version
8
8
  gem_version
9
9
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2017-2022 David Heinemeier Hansson, Basecamp
4
+ # Copyright (c) David Heinemeier Hansson, 37signals LLC
5
5
  #
6
6
  # Permission is hereby granted, free of charge, to any person obtaining
7
7
  # a copy of this software and associated documentation files (the
@@ -29,10 +29,13 @@ require "active_support/rails"
29
29
  require "active_support/core_ext/numeric/time"
30
30
 
31
31
  require "active_storage/version"
32
+ require "active_storage/deprecator"
32
33
  require "active_storage/errors"
33
34
 
34
35
  require "marcel"
35
36
 
37
+ # :markup: markdown
38
+ # :include: activestorage/README.md
36
39
  module ActiveStorage
37
40
  extend ActiveSupport::Autoload
38
41
 
@@ -357,12 +360,25 @@ module ActiveStorage
357
360
  mattr_accessor :draw_routes, default: true
358
361
  mattr_accessor :resolve_model_to_route, default: :rails_storage_redirect
359
362
 
360
- mattr_accessor :replace_on_assign_to_many, default: false
361
363
  mattr_accessor :track_variants, default: false
362
364
 
363
365
  mattr_accessor :video_preview_arguments, default: "-y -vframes 1 -f image2"
364
366
 
365
- mattr_accessor :silence_invalid_content_types_warning, default: false
367
+ def self.replace_on_assign_to_many
368
+ ActiveStorage.deprecator.warn("config.active_storage.replace_on_assign_to_many is deprecated and has no effect.")
369
+ end
370
+
371
+ def self.replace_on_assign_to_many=(value)
372
+ ActiveStorage.deprecator.warn("config.active_storage.replace_on_assign_to_many is deprecated and has no effect.")
373
+ end
374
+
375
+ def self.silence_invalid_content_types_warning
376
+ ActiveStorage.deprecator.warn("config.active_storage.silence_invalid_content_types_warning is deprecated and has no effect.")
377
+ end
378
+
379
+ def self.silence_invalid_content_types_warning=(value)
380
+ ActiveStorage.deprecator.warn("config.active_storage.silence_invalid_content_types_warning is deprecated and has no effect.")
381
+ end
366
382
 
367
383
  module Transformers
368
384
  extend ActiveSupport::Autoload
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.0.8
4
+ version: 7.1.0.beta1
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: 2023-09-09 00:00:00.000000000 Z
11
+ date: 2023-09-13 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.0.8
19
+ version: 7.1.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.0.8
26
+ version: 7.1.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.0.8
33
+ version: 7.1.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.0.8
40
+ version: 7.1.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.0.8
47
+ version: 7.1.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.0.8
54
+ version: 7.1.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.0.8
61
+ version: 7.1.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.0.8
68
+ version: 7.1.0.beta1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: marcel
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.0'
83
- - !ruby/object:Gem::Dependency
84
- name: mini_mime
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: 1.1.0
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: 1.1.0
97
83
  description: Attach cloud and local files in Rails applications.
98
84
  email: david@loudthinking.com
99
85
  executables: []
@@ -113,6 +99,7 @@ files:
113
99
  - app/controllers/active_storage/representations/base_controller.rb
114
100
  - app/controllers/active_storage/representations/proxy_controller.rb
115
101
  - app/controllers/active_storage/representations/redirect_controller.rb
102
+ - app/controllers/concerns/active_storage/disable_session.rb
116
103
  - app/controllers/concerns/active_storage/file_server.rb
117
104
  - app/controllers/concerns/active_storage/set_blob.rb
118
105
  - app/controllers/concerns/active_storage/set_current.rb
@@ -130,6 +117,7 @@ files:
130
117
  - app/jobs/active_storage/base_job.rb
131
118
  - app/jobs/active_storage/mirror_job.rb
132
119
  - app/jobs/active_storage/purge_job.rb
120
+ - app/jobs/active_storage/transform_job.rb
133
121
  - app/models/active_storage/attachment.rb
134
122
  - app/models/active_storage/blob.rb
135
123
  - app/models/active_storage/blob/analyzable.rb
@@ -137,6 +125,7 @@ files:
137
125
  - app/models/active_storage/blob/representable.rb
138
126
  - app/models/active_storage/current.rb
139
127
  - app/models/active_storage/filename.rb
128
+ - app/models/active_storage/named_variant.rb
140
129
  - app/models/active_storage/preview.rb
141
130
  - app/models/active_storage/record.rb
142
131
  - app/models/active_storage/variant.rb
@@ -170,6 +159,7 @@ files:
170
159
  - lib/active_storage/attached/many.rb
171
160
  - lib/active_storage/attached/model.rb
172
161
  - lib/active_storage/attached/one.rb
162
+ - lib/active_storage/deprecator.rb
173
163
  - lib/active_storage/downloader.rb
174
164
  - lib/active_storage/engine.rb
175
165
  - lib/active_storage/errors.rb
@@ -198,10 +188,10 @@ licenses:
198
188
  - MIT
199
189
  metadata:
200
190
  bug_tracker_uri: https://github.com/rails/rails/issues
201
- changelog_uri: https://github.com/rails/rails/blob/v7.0.8/activestorage/CHANGELOG.md
202
- documentation_uri: https://api.rubyonrails.org/v7.0.8/
191
+ changelog_uri: https://github.com/rails/rails/blob/v7.1.0.beta1/activestorage/CHANGELOG.md
192
+ documentation_uri: https://api.rubyonrails.org/v7.1.0.beta1/
203
193
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
204
- source_code_uri: https://github.com/rails/rails/tree/v7.0.8/activestorage
194
+ source_code_uri: https://github.com/rails/rails/tree/v7.1.0.beta1/activestorage
205
195
  rubygems_mfa_required: 'true'
206
196
  post_install_message:
207
197
  rdoc_options: []
@@ -214,9 +204,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
214
204
  version: 2.7.0
215
205
  required_rubygems_version: !ruby/object:Gem::Requirement
216
206
  requirements:
217
- - - ">="
207
+ - - ">"
218
208
  - !ruby/object:Gem::Version
219
- version: '0'
209
+ version: 1.3.1
220
210
  requirements: []
221
211
  rubygems_version: 3.4.18
222
212
  signing_key: