s3_direct_multipart_upload 0.1.0

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.
Files changed (30) hide show
  1. checksums.yaml +7 -0
  2. data/AGENTS.md +45 -0
  3. data/CODE_OF_CONDUCT.md +22 -0
  4. data/CONTRIBUTING.md +26 -0
  5. data/MIT-LICENSE +21 -0
  6. data/OPERATIONS.md +55 -0
  7. data/README.md +93 -0
  8. data/SPEC.md +62 -0
  9. data/app/controllers/s3_direct_multipart_upload/application_controller.rb +4 -0
  10. data/app/controllers/s3_direct_multipart_upload/dev/storage_controller.rb +62 -0
  11. data/app/controllers/s3_direct_multipart_upload/dev/storage_downloads_controller.rb +44 -0
  12. data/app/controllers/s3_direct_multipart_upload/upload_completions_controller.rb +32 -0
  13. data/app/controllers/s3_direct_multipart_upload/upload_parts_controller.rb +29 -0
  14. data/app/controllers/s3_direct_multipart_upload/upload_sessions_controller.rb +46 -0
  15. data/app/models/s3_direct_multipart_upload/upload_session.rb +394 -0
  16. data/app/models/s3_direct_multipart_upload/upload_session_part.rb +34 -0
  17. data/app/services/s3_direct_multipart_upload/dev/storage.rb +85 -0
  18. data/config/initializers/s3_direct_dev.rb +13 -0
  19. data/config/routes.rb +15 -0
  20. data/config/storage/development.yml +3 -0
  21. data/config/storage/test.yml +3 -0
  22. data/db/migrate/20251113090000_create_s3_direct_multipart_upload_tables.rb +32 -0
  23. data/doc/api.yml +256 -0
  24. data/doc/api_dev.yml +111 -0
  25. data/lib/generators/s3_direct_multipart_upload/install/install_generator.rb +14 -0
  26. data/lib/s3_direct_multipart_upload/engine.rb +16 -0
  27. data/lib/s3_direct_multipart_upload/version.rb +3 -0
  28. data/lib/s3_direct_multipart_upload.rb +9 -0
  29. data/lib/tasks/s3_direct_multipart_upload_tasks.rake +15 -0
  30. metadata +247 -0
data/doc/api.yml ADDED
@@ -0,0 +1,256 @@
1
+ openapi: 3.0.0
2
+ info:
3
+ title: S3 ダイレクトマルチパートアップロード API
4
+ version: 0.1.0
5
+ description: |
6
+ このエンジンが提供するアップロードセッション API の OpenAPI 定義。
7
+ 既存ログインセッション(Cookie 認証)を前提とし、JSON ベースでやり取りする。
8
+ セキュリティ上の注意:
9
+ - `upload_session_id` は推測困難なトークンとし、ユーザー単位でアクセス制御する。
10
+ - presigned URL は短寿命とし、レスポンスがログ等に残らないよう配慮する。
11
+ - S3 キー(`key_prefix`)は Active Storage と同様にランダムな名前空間を使い、ユーザー入力を直接含めない。
12
+ - ファイルサイズ・MIME のバリデーションをサーバーで必須化し、許可された添付種類のみに限定する。
13
+ paths:
14
+ /s3_direct_multipart_uploads:
15
+ post:
16
+ summary: アップロードセッションの開始
17
+ description: |
18
+ マルチパートアップロードセッションを開始し、S3 presigned URL を払い出す。ファイルそのものの情報だけを受け取り、
19
+ attachable との紐付けは後続のフォーム POST で行う。認証済みエンタープライズユーザーのみ利用可能。
20
+ requestBody:
21
+ required: true
22
+ content:
23
+ application/json:
24
+ schema:
25
+ $ref: '#/components/schemas/UploadSessionRequest'
26
+ responses:
27
+ '201':
28
+ description: 作成成功
29
+ content:
30
+ application/json:
31
+ schema:
32
+ $ref: '#/components/schemas/UploadSessionResponse'
33
+ '400':
34
+ description: パラメータ不正(サイズ超過や未対応 attachment など)
35
+ content:
36
+ application/json:
37
+ schema:
38
+ $ref: '#/components/schemas/ErrorResponse'
39
+ '404':
40
+ description: 参照できないリソース、または権限不足
41
+ content:
42
+ application/json:
43
+ schema:
44
+ $ref: '#/components/schemas/ErrorResponse'
45
+ /s3_direct_multipart_uploads/{upload_session_id}/parts:
46
+ post:
47
+ summary: パートアップロード完了の報告
48
+ description: |
49
+ クライアントが S3 へ PUT 完了したパート番号と `ETag` をサーバーへ通知する。
50
+ サーバーはアップロードセッションにパート情報を保存する。
51
+ parameters:
52
+ - name: upload_session_id
53
+ in: path
54
+ required: true
55
+ schema:
56
+ type: string
57
+ description: "POST <mount_path>/s3_direct_multipart_uploads で払い出したセッション ID"
58
+ requestBody:
59
+ required: true
60
+ content:
61
+ application/json:
62
+ schema:
63
+ $ref: '#/components/schemas/ReportPartRequest'
64
+ responses:
65
+ '202':
66
+ description: 受領成功
67
+ '404':
68
+ description: セッションが見つからない、もしくは期限切れ
69
+ content:
70
+ application/json:
71
+ schema:
72
+ $ref: '#/components/schemas/ErrorResponse'
73
+ '422':
74
+ description: パート番号や ETag が不正
75
+ content:
76
+ application/json:
77
+ schema:
78
+ $ref: '#/components/schemas/ErrorResponse'
79
+ /s3_direct_multipart_uploads/{upload_session_id}/complete:
80
+ post:
81
+ summary: アップロード完了の確定
82
+ description: |
83
+ 全パートのアップロードが完了した後に呼び出し、S3 の `CompleteMultipartUpload` を実行する。
84
+ 成功すると UploadSession に結合済みファイルのメタ情報が保存され、後続のフォーム POST で任意のレコードに紐付けできる。
85
+ parameters:
86
+ - name: upload_session_id
87
+ in: path
88
+ required: true
89
+ schema:
90
+ type: string
91
+ requestBody:
92
+ required: false
93
+ content:
94
+ application/json:
95
+ schema:
96
+ type: object
97
+ properties:
98
+ checksum:
99
+ type: string
100
+ description: クライアント側で計算した全体ファイルのチェックサム(任意)
101
+ responses:
102
+ '200':
103
+ description: 完了し、Blob が作成された
104
+ content:
105
+ application/json:
106
+ schema:
107
+ $ref: '#/components/schemas/CompleteResponse'
108
+ '409':
109
+ description: まだ全パートが揃っていない、またはすでに完了済み
110
+ content:
111
+ application/json:
112
+ schema:
113
+ $ref: '#/components/schemas/ErrorResponse'
114
+ '404':
115
+ description: セッションが見つからない
116
+ content:
117
+ application/json:
118
+ schema:
119
+ $ref: '#/components/schemas/ErrorResponse'
120
+ '422':
121
+ description: パラメータ不正
122
+ content:
123
+ application/json:
124
+ schema:
125
+ $ref: '#/components/schemas/ErrorResponse'
126
+ components:
127
+ schemas:
128
+ UploadSessionRequest:
129
+ type: object
130
+ required:
131
+ - upload
132
+ properties:
133
+ upload:
134
+ type: object
135
+ required:
136
+ - filename
137
+ - byte_size
138
+ - content_type
139
+ properties:
140
+ filename:
141
+ type: string
142
+ example: session.mp4
143
+ byte_size:
144
+ type: integer
145
+ description: バイト単位の想定ファイルサイズ
146
+ example: 2147483648
147
+ content_type:
148
+ type: string
149
+ example: video/mp4
150
+ chunk_size:
151
+ type: integer
152
+ description: 希望するチャンクサイズ(バイト)。省略時はサーバーが推奨値を返す。5MB 未満のファイルは単一パートとして扱われ、`chunk_size` は `byte_size` に揃えられる。
153
+ example: 10485760
154
+ checksum:
155
+ type: string
156
+ description: オプションの全体ファイルチェックサム(Base64 など)
157
+ UploadSessionResponse:
158
+ type: object
159
+ properties:
160
+ upload_session:
161
+ type: object
162
+ required:
163
+ - id
164
+ - upload_id
165
+ - bucket
166
+ - key_prefix
167
+ - chunk_size
168
+ - part_limit
169
+ - parts
170
+ properties:
171
+ id:
172
+ type: string
173
+ example: usn_1234567890
174
+ upload_id:
175
+ type: string
176
+ description: AWS S3 の UploadId
177
+ example: v1lUZWY4akp...==
178
+ bucket:
179
+ type: string
180
+ example: ir-live-tmp
181
+ key_prefix:
182
+ type: string
183
+ description: S3 オブジェクトキーの共通プレフィックス
184
+ example: uploads/log_order_items/123/20250301_abcd
185
+ chunk_size:
186
+ type: integer
187
+ description: サーバーが推奨するチャンクサイズ(バイト)
188
+ example: 10485760
189
+ part_limit:
190
+ type: integer
191
+ description: S3 制約上の最大パート数(通常 10000)
192
+ example: 10000
193
+ parts:
194
+ type: array
195
+ description: 各パートごとの presigned URL
196
+ items:
197
+ type: object
198
+ required:
199
+ - part_number
200
+ - url
201
+ - expires_in
202
+ properties:
203
+ part_number:
204
+ type: integer
205
+ minimum: 1
206
+ url:
207
+ type: string
208
+ format: uri
209
+ expires_in:
210
+ type: integer
211
+ description: URL 有効期限(秒)
212
+ example: 900
213
+ headers:
214
+ type: object
215
+ additionalProperties:
216
+ type: string
217
+ description: 署名付き URL に対して設定すべきヘッダー(必要な場合のみ)
218
+ ReportPartRequest:
219
+ type: object
220
+ required:
221
+ - part
222
+ properties:
223
+ part:
224
+ type: object
225
+ required:
226
+ - part_number
227
+ - etag
228
+ properties:
229
+ part_number:
230
+ type: integer
231
+ minimum: 1
232
+ etag:
233
+ type: string
234
+ description: S3 が返却した `ETag`
235
+ CompleteResponse:
236
+ type: object
237
+ properties:
238
+ upload_session:
239
+ type: object
240
+ properties:
241
+ id:
242
+ type: string
243
+ status:
244
+ type: string
245
+ description: セッション状態
246
+ example: completed
247
+ upload_id:
248
+ type: string
249
+ description: S3 UploadId(クライアント再利用用)
250
+ ErrorResponse:
251
+ type: object
252
+ required:
253
+ - error
254
+ properties:
255
+ error:
256
+ type: string
data/doc/api_dev.yml ADDED
@@ -0,0 +1,111 @@
1
+ openapi: 3.0.0
2
+ info:
3
+ title: S3DirectMultipartUpload 開発用 API
4
+ version: 0.1.0
5
+ description: |
6
+ development/test 環境限定の開発ユーティリティ API。
7
+ - Disk + stub 環境で presigned PUT を受け、パートをローカルに保存
8
+ - completed セッションを結合し単一ファイルをダウンロード
9
+ components:
10
+ schemas:
11
+ ErrorResponse:
12
+ type: object
13
+ properties:
14
+ error:
15
+ type: string
16
+ required:
17
+ - error
18
+ paths:
19
+ /s3_direct_multipart_upload/dev/storage/uploads/s3_direct/{date}/{session_uuid}/{filename}:
20
+ put:
21
+ summary: 開発用ストレージへのパート PUT(Disk + stub 用)
22
+ description: |
23
+ presigned URL で署名された PUT を受け取り、`tmp/s3_direct_multipart_upload/<object_key>.parts/<partNumber>` に保存する。
24
+ development/test 以外では 404。
25
+ parameters:
26
+ - name: date
27
+ in: path
28
+ required: true
29
+ schema:
30
+ type: string
31
+ pattern: '^\d{8}$'
32
+ description: YYYYMMDD のディレクトリ部分
33
+ - name: session_uuid
34
+ in: path
35
+ required: true
36
+ schema:
37
+ type: string
38
+ description: アップロードセッション UUID
39
+ - name: filename
40
+ in: path
41
+ required: true
42
+ schema:
43
+ type: string
44
+ description: 保存するファイル名
45
+ - name: uploadId
46
+ in: query
47
+ required: true
48
+ schema:
49
+ type: string
50
+ - name: partNumber
51
+ in: query
52
+ required: false
53
+ schema:
54
+ type: integer
55
+ - name: expires_at
56
+ in: query
57
+ required: true
58
+ schema:
59
+ type: integer
60
+ description: Unix 時刻(秒)
61
+ - name: signature
62
+ in: query
63
+ required: true
64
+ schema:
65
+ type: string
66
+ requestBody:
67
+ required: true
68
+ content:
69
+ application/octet-stream:
70
+ schema:
71
+ type: string
72
+ format: binary
73
+ responses:
74
+ '200':
75
+ description: 保存成功。ETag をヘッダで返却。
76
+ '403':
77
+ description: 署名不正または期限切れ
78
+ '404':
79
+ description: 非 dev/test 環境
80
+ /s3_direct_multipart_upload/dev/storage/{upload_session_id}/download:
81
+ get:
82
+ summary: 結合済みファイルのダウンロード(開発限定)
83
+ description: |
84
+ completed セッションのみ許可。Disk 環境ではパートを結合して `tmp/s3_direct_multipart_upload/<object_key>` を返却。
85
+ S3 環境では `get_object` で取得。非 dev/test は 404。
86
+ parameters:
87
+ - name: upload_session_id
88
+ in: path
89
+ required: true
90
+ schema:
91
+ type: string
92
+ responses:
93
+ '200':
94
+ description: 結合済みファイルを返却
95
+ content:
96
+ application/octet-stream:
97
+ schema:
98
+ type: string
99
+ format: binary
100
+ '404':
101
+ description: セッションなし、または非 dev/test
102
+ content:
103
+ application/json:
104
+ schema:
105
+ $ref: '#/components/schemas/ErrorResponse'
106
+ '422':
107
+ description: 未完了、欠損、結合失敗
108
+ content:
109
+ application/json:
110
+ schema:
111
+ $ref: '#/components/schemas/ErrorResponse'
@@ -0,0 +1,14 @@
1
+ require "rails/generators"
2
+
3
+ module S3DirectMultipartUpload
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+ desc "Engine のマイグレーションをホストへコピーする"
8
+
9
+ def copy_migrations
10
+ rake("s3_direct_multipart_upload:install:migrations")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module S3DirectMultipartUpload
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace S3DirectMultipartUpload
4
+
5
+ config.parent_controller = "::ApplicationController"
6
+
7
+ config.generators do |g|
8
+ g.test_framework :rspec
9
+ g.orm :active_record
10
+ end
11
+
12
+ rake_tasks do
13
+ load root.join("lib/tasks/s3_direct_multipart_upload_tasks.rake")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module S3DirectMultipartUpload
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,9 @@
1
+ require "s3_direct_multipart_upload/version"
2
+ require "s3_direct_multipart_upload/engine"
3
+ require "aws-sdk-s3"
4
+
5
+ module S3DirectMultipartUpload
6
+ def self.table_name_prefix
7
+ "s3_direct_multipart_"
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ namespace :s3_direct_multipart_upload do
2
+ namespace :install do
3
+ desc "Engine のマイグレーションをホストアプリへコピーする"
4
+ task migrations: :environment do
5
+ from = ENV["FROM"]
6
+ ENV["FROM"] = "s3_direct_multipart_upload"
7
+ begin
8
+ Rake::Task["railties:install:migrations"].invoke
9
+ ensure
10
+ Rake::Task["railties:install:migrations"].reenable
11
+ ENV["FROM"] = from
12
+ end
13
+ end
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,247 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: s3_direct_multipart_upload
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Logmi, Inc.
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2025-12-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-s3
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.143'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.143'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '7.1'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '7.2'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '7.1'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '7.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: combustion
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.5'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.5'
61
+ - !ruby/object:Gem::Dependency
62
+ name: committee-rails
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.9'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.9'
75
+ - !ruby/object:Gem::Dependency
76
+ name: json_schemer
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.4'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.4'
89
+ - !ruby/object:Gem::Dependency
90
+ name: openapi_parser
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.3'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '2.3'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rspec-rails
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '6.1'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '6.1'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop-rails-omakase
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.1'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.1'
131
+ - !ruby/object:Gem::Dependency
132
+ name: simplecov
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.22'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.22'
145
+ - !ruby/object:Gem::Dependency
146
+ name: simplecov-console
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.9'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.9'
159
+ - !ruby/object:Gem::Dependency
160
+ name: sqlite3
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '1.4'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '1.4'
173
+ - !ruby/object:Gem::Dependency
174
+ name: webmock
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '3.26'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '3.26'
187
+ description: Rails アプリに組み込み、認証・セッションをホストに委譲したまま presigned URL を返すエンジン。
188
+ email:
189
+ - develop@logmi.co.jp
190
+ executables: []
191
+ extensions: []
192
+ extra_rdoc_files: []
193
+ files:
194
+ - AGENTS.md
195
+ - CODE_OF_CONDUCT.md
196
+ - CONTRIBUTING.md
197
+ - MIT-LICENSE
198
+ - OPERATIONS.md
199
+ - README.md
200
+ - SPEC.md
201
+ - app/controllers/s3_direct_multipart_upload/application_controller.rb
202
+ - app/controllers/s3_direct_multipart_upload/dev/storage_controller.rb
203
+ - app/controllers/s3_direct_multipart_upload/dev/storage_downloads_controller.rb
204
+ - app/controllers/s3_direct_multipart_upload/upload_completions_controller.rb
205
+ - app/controllers/s3_direct_multipart_upload/upload_parts_controller.rb
206
+ - app/controllers/s3_direct_multipart_upload/upload_sessions_controller.rb
207
+ - app/models/s3_direct_multipart_upload/upload_session.rb
208
+ - app/models/s3_direct_multipart_upload/upload_session_part.rb
209
+ - app/services/s3_direct_multipart_upload/dev/storage.rb
210
+ - config/initializers/s3_direct_dev.rb
211
+ - config/routes.rb
212
+ - config/storage/development.yml
213
+ - config/storage/test.yml
214
+ - db/migrate/20251113090000_create_s3_direct_multipart_upload_tables.rb
215
+ - doc/api.yml
216
+ - doc/api_dev.yml
217
+ - lib/generators/s3_direct_multipart_upload/install/install_generator.rb
218
+ - lib/s3_direct_multipart_upload.rb
219
+ - lib/s3_direct_multipart_upload/engine.rb
220
+ - lib/s3_direct_multipart_upload/version.rb
221
+ - lib/tasks/s3_direct_multipart_upload_tasks.rake
222
+ homepage: https://github.com/logmi/s3_direct_multipart_upload
223
+ licenses:
224
+ - MIT
225
+ metadata:
226
+ rubygems_mfa_required: 'true'
227
+ source_code_uri: https://github.com/logmi/s3_direct_multipart_upload
228
+ post_install_message:
229
+ rdoc_options: []
230
+ require_paths:
231
+ - lib
232
+ required_ruby_version: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: 3.2.0
237
+ required_rubygems_version: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ version: '0'
242
+ requirements: []
243
+ rubygems_version: 3.4.19
244
+ signing_key:
245
+ specification_version: 4
246
+ summary: S3 へのダイレクトマルチパートアップロード API を提供する mountable engine
247
+ test_files: []