carrierwave-google-storage 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/carrierwave-google-storage.gemspec +22 -21
- data/lib/carrierwave-google-storage.rb +15 -12
- data/lib/carrierwave/google/storage/version.rb +3 -1
- data/lib/carrierwave/storage/gcloud.rb +35 -8
- data/lib/carrierwave/storage/gcloud_file.rb +27 -37
- data/lib/carrierwave/utilities/uri.rb +23 -0
- metadata +19 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5dfca5548a4c471cf6e394371707876c087c8ca
|
4
|
+
data.tar.gz: 499ef7b488e98cbc81cbb79a3267ffac4e4fd360
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5696f16b95a947270b694f626f7eebd2664b1c9148ec3646eb64705127ae089d9d6815fecda973abd7498b13bde0e4e958d45d356547dd2618e809eb12bba3f
|
7
|
+
data.tar.gz: 4bbfb4067e0e012b6ad017ae76906990b8f71bccf4d7402bcae25f24f05432122cc9a752a2b5dbb599d9a2e0b3edd7ac3bff232447a2790148d84b66f09e3465
|
data/.travis.yml
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
sudo: false
|
2
2
|
language: ruby
|
3
3
|
rvm:
|
4
|
-
- 2.0.0
|
5
4
|
- 2.1.0
|
6
5
|
- 2.2.0
|
7
6
|
- 2.3.0
|
7
|
+
- 2.4.1
|
8
8
|
before_install:
|
9
9
|
- openssl aes-256-cbc -K $encrypted_121e786cd5aa_key -iv $encrypted_121e786cd5aa_iv -in .gcp-keyfile.json.enc -out .gcp-keyfile.json -d
|
10
10
|
- gem install bundler -v 1.12.1
|
@@ -1,35 +1,36 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
lib = File.expand_path('../lib', __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'carrierwave/google/storage/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'carrierwave-google-storage'
|
8
9
|
spec.version = Carrierwave::Google::Storage::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
10
|
+
spec.authors = ['Jasdeep Singh']
|
11
|
+
spec.email = ['narang.jasdeep@gmail.com']
|
11
12
|
|
12
|
-
spec.summary = %q
|
13
|
-
spec.description = %q
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
13
|
+
spec.summary = %q(Use gcloud for Google Cloud Storage support in CarrierWave.)
|
14
|
+
spec.description = %q(A slimmer alternative to using Fog for Google Cloud Storage support in CarrierWave. Heavily inspired from carrierwave-aws)
|
15
|
+
spec.homepage = 'https://github.com/metaware/carrierwave-google-storage'
|
16
|
+
spec.license = 'MIT'
|
16
17
|
|
17
18
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir =
|
19
|
+
spec.bindir = 'exe'
|
19
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
21
|
-
|
22
|
-
spec.add_dependency '
|
23
|
-
spec.add_dependency '
|
24
|
-
if RUBY_VERSION >=
|
25
|
-
spec.add_dependency 'activemodel',
|
21
|
+
spec.require_paths = ['lib']
|
22
|
+
|
23
|
+
spec.add_dependency 'carrierwave', '~> 1.2.0'
|
24
|
+
spec.add_dependency 'google-cloud-storage', '~> 1.9.0'
|
25
|
+
if RUBY_VERSION >= '2.2.2'
|
26
|
+
spec.add_dependency 'activemodel', '>= 3.2.0'
|
26
27
|
else
|
27
|
-
spec.add_dependency 'activemodel',
|
28
|
+
spec.add_dependency 'activemodel', '~> 4.2.7'
|
28
29
|
end
|
29
30
|
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
31
|
+
spec.add_development_dependency 'bundler', '~> 1.12'
|
32
|
+
spec.add_development_dependency 'pry', '~> 0.10.3'
|
33
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
34
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
35
|
+
spec.add_development_dependency 'uri-query_params', '~> 0.7.1'
|
35
36
|
end
|
@@ -6,18 +6,21 @@ require 'carrierwave/storage/gcloud_file'
|
|
6
6
|
require 'carrierwave/storage/gcloud_options'
|
7
7
|
require 'carrierwave/support/uri_filename'
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
module CarrierWave
|
10
|
+
module Uploader
|
11
|
+
class Base
|
12
12
|
|
13
|
-
|
14
|
-
add_config :gcloud_bucket
|
15
|
-
add_config :gcloud_bucket_is_public
|
16
|
-
add_config :gcloud_credentials
|
17
|
-
add_config :gcloud_authenticated_url_expiration
|
13
|
+
ConfigurationError = Class.new(StandardError)
|
18
14
|
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
add_config :gcloud_attributes
|
16
|
+
add_config :gcloud_bucket
|
17
|
+
add_config :gcloud_bucket_is_public
|
18
|
+
add_config :gcloud_credentials
|
19
|
+
add_config :gcloud_authenticated_url_expiration
|
22
20
|
|
23
|
-
|
21
|
+
configure do |config|
|
22
|
+
config.storage_engines[:gcloud] = 'CarrierWave::Storage::Gcloud'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module CarrierWave
|
2
4
|
module Storage
|
3
5
|
class Gcloud < Abstract
|
4
|
-
|
5
6
|
def self.connection_cache
|
6
7
|
@connection_cache ||= {}
|
7
8
|
end
|
@@ -9,28 +10,54 @@ module CarrierWave
|
|
9
10
|
def self.clear_connection_cache!
|
10
11
|
@connection_cache = {}
|
11
12
|
end
|
12
|
-
|
13
|
+
|
13
14
|
def store!(file)
|
14
|
-
|
15
|
+
GcloudFile.new(uploader, connection, uploader.store_path).tap do |gcloud_file|
|
15
16
|
gcloud_file.store(file)
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
19
20
|
def retrieve!(identifier)
|
20
|
-
|
21
|
+
GcloudFile.new(uploader, connection, uploader.store_path(identifier))
|
22
|
+
end
|
23
|
+
|
24
|
+
def cache!(file)
|
25
|
+
GcloudFile.new(uploader, connection, uploader.cache_path).tap do |gcloud_file|
|
26
|
+
gcloud_file.store(file)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def retrieve_from_cache!(identifier)
|
31
|
+
GcloudFile.new(uploader, connection, uploader.cache_path(identifier))
|
32
|
+
end
|
33
|
+
|
34
|
+
def clean_cache!(_seconds)
|
35
|
+
raise 'use Object Lifecycle Management to clean the cache'
|
21
36
|
end
|
22
37
|
|
23
38
|
def connection
|
24
39
|
@connection ||= begin
|
25
|
-
|
40
|
+
conn_cache = self.class.connection_cache
|
26
41
|
ENV['SSL_CERT_FILE'] = cert_path
|
27
|
-
|
42
|
+
conn_cache[credentials] ||= ::Google::Cloud.new(
|
43
|
+
credentials[:gcloud_project] || ENV['GCLOUD_PROJECT'],
|
44
|
+
credentials[:gcloud_keyfile] || ENV['GCLOUD_KEYFILE']
|
45
|
+
).storage.bucket(uploader.gcloud_bucket)
|
28
46
|
end
|
29
47
|
end
|
30
48
|
|
31
49
|
def credentials
|
32
|
-
uploader.gcloud_credentials
|
50
|
+
uploader.gcloud_credentials || {}
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def cert_path
|
56
|
+
@cert_path ||= begin
|
57
|
+
gem_path = Gem.loaded_specs['google-api-client'].full_gem_path
|
58
|
+
gem_path + '/lib/cacerts.pem'
|
59
|
+
end
|
33
60
|
end
|
34
61
|
end
|
35
62
|
end
|
36
|
-
end
|
63
|
+
end
|
@@ -1,39 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module CarrierWave
|
2
4
|
module Storage
|
3
5
|
class GcloudFile
|
4
|
-
|
6
|
+
GCLOUD_STORAGE_URL = 'https://storage.googleapis.com'
|
7
|
+
|
5
8
|
attr_writer :file
|
6
|
-
attr_accessor :uploader, :connection, :path,
|
7
|
-
:gcloud_options, :file_exists
|
9
|
+
attr_accessor :uploader, :connection, :path, :gcloud_options, :file_exists
|
8
10
|
|
9
11
|
delegate :content_type, :size, to: :file
|
10
12
|
|
11
13
|
def initialize(uploader, connection, path)
|
12
|
-
@uploader
|
14
|
+
@uploader = uploader
|
15
|
+
@connection = connection
|
16
|
+
@path = path
|
13
17
|
end
|
14
18
|
|
15
19
|
def file
|
16
|
-
|
17
|
-
@file
|
18
|
-
end
|
19
|
-
alias_method :to_file, :file
|
20
|
-
|
21
|
-
def retrieve
|
22
|
-
by_verifying_existence { @file ||= bucket.file(path) }
|
23
|
-
self
|
24
|
-
end
|
25
|
-
|
26
|
-
def by_verifying_existence(&block)
|
27
|
-
begin
|
28
|
-
self.file_exists = true
|
29
|
-
yield
|
30
|
-
rescue Exception => exception
|
31
|
-
self.file_exists = false if (exception.class == ::Google::Cloud::Error::NotFoundError) && (exception.message == "Not Found")
|
32
|
-
end
|
20
|
+
@file ||= bucket.file(path)
|
33
21
|
end
|
22
|
+
alias to_file file
|
34
23
|
|
35
24
|
def attributes
|
36
|
-
return unless
|
25
|
+
return unless exists?
|
37
26
|
{
|
38
27
|
content_type: file.content_type,
|
39
28
|
size: file.size,
|
@@ -41,15 +30,15 @@ module CarrierWave
|
|
41
30
|
etag: file.etag
|
42
31
|
}
|
43
32
|
end
|
44
|
-
|
33
|
+
|
45
34
|
def delete
|
46
35
|
deleted = file.delete
|
47
|
-
|
36
|
+
@file = nil if deleted
|
48
37
|
deleted
|
49
38
|
end
|
50
|
-
|
39
|
+
|
51
40
|
def exists?
|
52
|
-
|
41
|
+
!file.nil?
|
53
42
|
end
|
54
43
|
|
55
44
|
def extension
|
@@ -62,14 +51,17 @@ module CarrierWave
|
|
62
51
|
end
|
63
52
|
|
64
53
|
def read
|
65
|
-
tmp_file = Tempfile.new(
|
54
|
+
tmp_file = Tempfile.new(
|
55
|
+
CarrierWave::Support::UriFilename.filename(file.name)
|
56
|
+
)
|
66
57
|
(file.download tmp_file.path, verify: :all).read
|
67
58
|
end
|
68
59
|
|
69
60
|
def store(new_file)
|
70
|
-
new_file_path = uploader.filename ?
|
71
|
-
|
72
|
-
|
61
|
+
new_file_path = uploader.filename ? uploader.filename : new_file.filename
|
62
|
+
bucket.create_file(
|
63
|
+
new_file.path, path, content_type: new_file.content_type
|
64
|
+
)
|
73
65
|
self
|
74
66
|
end
|
75
67
|
|
@@ -78,28 +70,26 @@ module CarrierWave
|
|
78
70
|
end
|
79
71
|
|
80
72
|
def url(options = {})
|
81
|
-
return unless file_exists
|
82
73
|
uploader.gcloud_bucket_is_public ? public_url : authenticated_url
|
83
74
|
end
|
84
|
-
|
75
|
+
|
85
76
|
def authenticated_url(options = {})
|
86
|
-
|
77
|
+
bucket.signed_url(path, options)
|
87
78
|
end
|
88
79
|
|
89
80
|
def public_url
|
90
81
|
if uploader.asset_host
|
91
82
|
"#{uploader.asset_host}/#{path}"
|
92
83
|
else
|
93
|
-
|
84
|
+
"#{GCLOUD_STORAGE_URL}/#{uploader.gcloud_bucket}/#{@path}"
|
94
85
|
end
|
95
86
|
end
|
96
87
|
|
97
88
|
private
|
98
89
|
|
99
90
|
def bucket
|
100
|
-
|
91
|
+
connection
|
101
92
|
end
|
102
|
-
|
103
93
|
end
|
104
94
|
end
|
105
|
-
end
|
95
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module CarrierWave
|
4
|
+
module Utilities
|
5
|
+
module Uri
|
6
|
+
# based on Ruby < 2.0's URI.encode
|
7
|
+
SAFE_STRING = URI::REGEXP::PATTERN::UNRESERVED + '\/'
|
8
|
+
UNSAFE = Regexp.new("[^#{SAFE_STRING}]", false)
|
9
|
+
|
10
|
+
private
|
11
|
+
def encode_path(path)
|
12
|
+
path.to_s.gsub(UNSAFE) do
|
13
|
+
us = $&
|
14
|
+
tmp = ''
|
15
|
+
us.each_byte do |uc|
|
16
|
+
tmp << sprintf('%%%02X', uc)
|
17
|
+
end
|
18
|
+
tmp
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end # Uri
|
22
|
+
end # Utilities
|
23
|
+
end # CarrierWave
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: carrierwave-google-storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jasdeep Singh
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: carrierwave
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.2.0
|
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:
|
26
|
+
version: 1.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: google-cloud-storage
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.9.0
|
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:
|
40
|
+
version: 1.9.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activemodel
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,47 +67,47 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.12'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: pry
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 0.10.3
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 0.10.3
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: rake
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '10.0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '10.0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: rspec
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0
|
103
|
+
version: '3.0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0
|
110
|
+
version: '3.0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: uri-query_params
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -149,6 +149,7 @@ files:
|
|
149
149
|
- lib/carrierwave/storage/gcloud_file.rb
|
150
150
|
- lib/carrierwave/storage/gcloud_options.rb
|
151
151
|
- lib/carrierwave/support/uri_filename.rb
|
152
|
+
- lib/carrierwave/utilities/uri.rb
|
152
153
|
homepage: https://github.com/metaware/carrierwave-google-storage
|
153
154
|
licenses:
|
154
155
|
- MIT
|
@@ -169,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
170
|
version: '0'
|
170
171
|
requirements: []
|
171
172
|
rubyforge_project:
|
172
|
-
rubygems_version: 2.
|
173
|
+
rubygems_version: 2.6.14
|
173
174
|
signing_key:
|
174
175
|
specification_version: 4
|
175
176
|
summary: Use gcloud for Google Cloud Storage support in CarrierWave.
|