active_storage_bunny 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 74d8ca0414380a8f138a9eb2f3f5d7cb4c4f9aac29c6e2aae5dace40532bd689
4
+ data.tar.gz: 45e0cb4b9be82b4bb3228792481dd5a8734bcde61e3941841d88bcadb6e808fb
5
+ SHA512:
6
+ metadata.gz: 1362ce11eb5dc5022c037547724b6f230fc5b9fab0857ba258ff1a5dbf52a6a11625d12df5dfe2956326b7d77340737bffd969cfb55f5902be5b981929fd1133
7
+ data.tar.gz: 007041caf3ab0f9b3e42787df1be4344acb2ee045631295fe8a9b3c8129e6d45b61d80d4f910528bf0befce53e16db4232ccc2056722febde6dd1992a553c800
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/numeric/bytes'
4
+ require 'bunny_storage_client'
5
+
6
+ module ActiveStorage
7
+ # Wraps the Amazon Simple Storage Service (S3) as an Active Storage service.
8
+ # See ActiveStorage::Service for the generic API documentation that applies to all services.
9
+ class Service::BunnyService < Service
10
+
11
+ CDN_BASE_URL = "https://#{ENV['BUNNY_STORAGE_ZONE']}.b-cdn.net"
12
+
13
+ attr_reader :client
14
+
15
+ def initialize(access_key:, api_key:, storage_zone:, **options)
16
+ @client = BunnyStorageClient.new(access_key, api_key, storage_zone)
17
+ super(**options)
18
+ end
19
+
20
+ def upload(key, io, checksum: nil, filename: nil, content_type: nil, disposition: nil, custom_metadata: {}, **)
21
+ instrument :upload, key: key, checksum: checksum do
22
+ content_disposition = content_disposition_with(filename: filename, type: disposition) if disposition && filename
23
+ upload_with_single_part key, io, checksum: checksum, content_type: content_type, content_disposition: content_disposition, custom_metadata: custom_metadata
24
+ end
25
+ end
26
+
27
+ def download(key, &block)
28
+ instrument :download, key: key do
29
+ object_for(key).get_file.to_s.force_encoding(Encoding::BINARY)
30
+ rescue StandardError
31
+ raise ActiveStorage::FileNotFoundError
32
+ end
33
+ end
34
+
35
+ def delete(key)
36
+ instrument :delete, key: key do
37
+ object_for(key).delete_file
38
+ end
39
+ end
40
+
41
+ def delete_prefixed(prefix)
42
+ instrument :delete_prefixed, prefix: prefix do
43
+ # BunnyStorageClient does not natively support this operation yet.
44
+ end
45
+ end
46
+
47
+
48
+ def exist?(key)
49
+ instrument :exist, key: key do |payload|
50
+ answer = object_for(key).exists?
51
+ payload[:exist] = answer
52
+ answer
53
+ end
54
+ end
55
+
56
+ def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:, custom_metadata: {})
57
+ instrument :url, key: key do |payload|
58
+ generated_url = object_for(key).presigned_url :put, expires_in: expires_in.to_i,
59
+ content_type: content_type, content_length: content_length, content_md5: checksum,
60
+ metadata: custom_metadata, whitelist_headers: ['content-length'], **upload_options
61
+
62
+ payload[:url] = generated_url
63
+
64
+ generated_url
65
+ end
66
+ end
67
+
68
+ def headers_for_direct_upload(key, content_type:, checksum:, filename: nil, disposition: nil, custom_metadata: {}, **)
69
+ content_disposition = content_disposition_with(type: disposition, filename: filename) if filename
70
+
71
+ { 'Content-Type' => content_type, 'Content-MD5' => checksum, 'Content-Disposition' => content_disposition, **custom_metadata_headers(custom_metadata) }
72
+ end
73
+
74
+ private
75
+
76
+ def private_url(key, expires_in:, filename:, disposition:, content_type:, **)
77
+ # BunnyStorageClient does not natively support this operation yet.
78
+ public_url(key)
79
+ end
80
+
81
+ def public_url(key)
82
+ File.join(CDN_BASE_URL, key)
83
+ end
84
+
85
+ def upload_with_single_part(key, io, checksum: nil, content_type: nil, content_disposition: nil, custom_metadata: {})
86
+ object_for(key).upload_file(body: io)
87
+ object_for(key).purge_cache
88
+ rescue StandardError
89
+ raise ActiveStorage::IntegrityError
90
+ end
91
+
92
+ def stream_file(key)
93
+ # BunnyStorageClient does not natively support this operation yet.
94
+ end
95
+
96
+ def object_for(key)
97
+ client.object(key)
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,3 @@
1
+ module ActiveStorageBunny
2
+ VERSION = '1.0.0'.freeze
3
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'active_storage/service/bunny_service'
4
+ require_relative 'active_storage_bunny/version'
5
+
6
+ module ActiveStorageBunny
7
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_storage_bunny
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ramit Koul
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-06-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bunny_storage_client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '6.0'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '8.0'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '6.0'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '8.0'
47
+ description: ActiveStorageBunny is a gem that integrates BunnyCDN storage services
48
+ with Active Storage.
49
+ email:
50
+ - ramitkaul@gmail.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - lib/active_storage/service/bunny_service.rb
56
+ - lib/active_storage_bunny.rb
57
+ - lib/active_storage_bunny/version.rb
58
+ homepage: https://github.com/rkwap/active_storage_bunny
59
+ licenses:
60
+ - MIT
61
+ metadata:
62
+ homepage_uri: https://github.com/rkwap/active_storage_bunny
63
+ source_code_uri: https://github.com/rkwap/active_storage_bunny
64
+ changelog_uri: https://github.com/rkwap/active_storage_bunny/CHANGELOG.md
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '2.5'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ requirements: []
80
+ rubygems_version: 3.2.33
81
+ signing_key:
82
+ specification_version: 4
83
+ summary: An Active Storage service for BunnyCDN storage services.
84
+ test_files: []