storage 0.1.5 → 0.2.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fd2bec2d0dd25eba612ea984b394c8fc4322a019
4
+ data.tar.gz: 4387f67ab04388059956ec41a410d3793ddc2581
5
+ SHA512:
6
+ metadata.gz: 4f248beff7dbb3229a2fbc1f3c7f46f3884c19e5dc7b05696e81c55ec20af960ba506f98d57751f2126bf6e5a19cf092f8499a26c02a460129422edd4d74b506
7
+ data.tar.gz: b621accb8cd68e00218d2b33430e5146d4f9f3d4c486fee9dc2d341f3fd84da4a47a39d33141f489b0e22cd620c13675d043a8a14dc9e93e6f08dad6786524e6
data/Gemfile CHANGED
@@ -1,2 +1,2 @@
1
- source "http://gems.simplesideias.com.br"
1
+ source "https://rubygems.org"
2
2
  gemspec
@@ -1,133 +1,251 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- storage (0.1.5)
5
- aws-s3 (~> 0.6.2)
4
+ storage (0.2.0)
5
+ fog
6
6
 
7
7
  GEM
8
- remote: http://gems.simplesideias.com.br/
8
+ remote: https://rubygems.org/
9
9
  specs:
10
- actionmailer (3.1.1)
11
- actionpack (= 3.1.1)
12
- mail (~> 2.3.0)
13
- actionpack (3.1.1)
14
- activemodel (= 3.1.1)
15
- activesupport (= 3.1.1)
10
+ CFPropertyList (2.3.1)
11
+ actionmailer (3.2.22)
12
+ actionpack (= 3.2.22)
13
+ mail (~> 2.5.4)
14
+ actionpack (3.2.22)
15
+ activemodel (= 3.2.22)
16
+ activesupport (= 3.2.22)
16
17
  builder (~> 3.0.0)
17
18
  erubis (~> 2.7.0)
18
- i18n (~> 0.6)
19
- rack (~> 1.3.2)
20
- rack-cache (~> 1.1)
21
- rack-mount (~> 0.8.2)
19
+ journey (~> 1.0.4)
20
+ rack (~> 1.4.5)
21
+ rack-cache (~> 1.2)
22
22
  rack-test (~> 0.6.1)
23
- sprockets (~> 2.0.2)
24
- activemodel (3.1.1)
25
- activesupport (= 3.1.1)
23
+ sprockets (~> 2.2.1)
24
+ activemodel (3.2.22)
25
+ activesupport (= 3.2.22)
26
26
  builder (~> 3.0.0)
27
- i18n (~> 0.6)
28
- activerecord (3.1.1)
29
- activemodel (= 3.1.1)
30
- activesupport (= 3.1.1)
31
- arel (~> 2.2.1)
27
+ activerecord (3.2.22)
28
+ activemodel (= 3.2.22)
29
+ activesupport (= 3.2.22)
30
+ arel (~> 3.0.2)
32
31
  tzinfo (~> 0.3.29)
33
- activeresource (3.1.1)
34
- activemodel (= 3.1.1)
35
- activesupport (= 3.1.1)
36
- activesupport (3.1.1)
32
+ activeresource (3.2.22)
33
+ activemodel (= 3.2.22)
34
+ activesupport (= 3.2.22)
35
+ activesupport (3.2.22)
36
+ i18n (~> 0.6, >= 0.6.4)
37
37
  multi_json (~> 1.0)
38
- arel (2.2.1)
39
- aws-s3 (0.6.2)
38
+ arel (3.0.3)
39
+ ast (2.0.0)
40
+ astrolabe (1.3.0)
41
+ parser (>= 2.2.0.pre.3, < 3.0)
42
+ awesome_print (1.6.1)
43
+ builder (3.0.4)
44
+ byebug (4.0.5)
45
+ columnize (= 0.9.0)
46
+ coderay (1.1.0)
47
+ columnize (0.9.0)
48
+ diff-lcs (1.2.5)
49
+ erubis (2.7.0)
50
+ excon (0.45.3)
51
+ fission (0.5.0)
52
+ CFPropertyList (~> 2.2)
53
+ fog (1.31.0)
54
+ fog-atmos
55
+ fog-aws (~> 0.0)
56
+ fog-brightbox (~> 0.4)
57
+ fog-core (~> 1.30)
58
+ fog-ecloud
59
+ fog-google (>= 0.0.2)
60
+ fog-json
61
+ fog-local
62
+ fog-powerdns (>= 0.1.1)
63
+ fog-profitbricks
64
+ fog-radosgw (>= 0.0.2)
65
+ fog-riakcs
66
+ fog-sakuracloud (>= 0.0.4)
67
+ fog-serverlove
68
+ fog-softlayer
69
+ fog-storm_on_demand
70
+ fog-terremark
71
+ fog-vmfusion
72
+ fog-voxel
73
+ fog-xml (~> 0.1.1)
74
+ ipaddress (~> 0.5)
75
+ nokogiri (~> 1.5, >= 1.5.11)
76
+ fog-atmos (0.1.0)
77
+ fog-core
78
+ fog-xml
79
+ fog-aws (0.6.0)
80
+ fog-core (~> 1.27)
81
+ fog-json (~> 1.0)
82
+ fog-xml (~> 0.1)
83
+ ipaddress (~> 0.8)
84
+ fog-brightbox (0.7.2)
85
+ fog-core (~> 1.22)
86
+ fog-json
87
+ inflecto (~> 0.0.2)
88
+ fog-core (1.31.1)
40
89
  builder
90
+ excon (~> 0.45)
91
+ formatador (~> 0.2)
41
92
  mime-types
42
- xml-simple
43
- builder (3.0.0)
44
- coderay (0.9.8)
45
- diff-lcs (1.1.3)
46
- erubis (2.7.0)
47
- fakeweb (1.3.0)
48
- hike (1.2.1)
49
- i18n (0.6.0)
50
- json (1.6.1)
51
- mail (2.3.0)
52
- i18n (>= 0.4.0)
93
+ net-scp (~> 1.1)
94
+ net-ssh (>= 2.1.3)
95
+ fog-ecloud (0.2.0)
96
+ fog-core
97
+ fog-xml
98
+ fog-google (0.0.6)
99
+ fog-core
100
+ fog-json
101
+ fog-xml
102
+ fog-json (1.0.2)
103
+ fog-core (~> 1.0)
104
+ multi_json (~> 1.10)
105
+ fog-local (0.2.1)
106
+ fog-core (~> 1.27)
107
+ fog-powerdns (0.1.1)
108
+ fog-core (~> 1.27)
109
+ fog-json (~> 1.0)
110
+ fog-xml (~> 0.1)
111
+ fog-profitbricks (0.0.3)
112
+ fog-core
113
+ fog-xml
114
+ nokogiri
115
+ fog-radosgw (0.0.4)
116
+ fog-core (>= 1.21.0)
117
+ fog-json
118
+ fog-xml (>= 0.0.1)
119
+ fog-riakcs (0.1.0)
120
+ fog-core
121
+ fog-json
122
+ fog-xml
123
+ fog-sakuracloud (1.0.1)
124
+ fog-core
125
+ fog-json
126
+ fog-serverlove (0.1.2)
127
+ fog-core
128
+ fog-json
129
+ fog-softlayer (0.4.7)
130
+ fog-core
131
+ fog-json
132
+ fog-storm_on_demand (0.1.1)
133
+ fog-core
134
+ fog-json
135
+ fog-terremark (0.1.0)
136
+ fog-core
137
+ fog-xml
138
+ fog-vmfusion (0.1.0)
139
+ fission
140
+ fog-core
141
+ fog-voxel (0.1.0)
142
+ fog-core
143
+ fog-xml
144
+ fog-xml (0.1.2)
145
+ fog-core
146
+ nokogiri (~> 1.5, >= 1.5.11)
147
+ formatador (0.2.5)
148
+ hike (1.2.3)
149
+ i18n (0.7.0)
150
+ inflecto (0.0.2)
151
+ ipaddress (0.8.0)
152
+ journey (1.0.4)
153
+ json (1.8.3)
154
+ mail (2.5.4)
53
155
  mime-types (~> 1.16)
54
156
  treetop (~> 1.4.8)
55
- method_source (0.6.6)
56
- ruby_parser (~> 2.0.5)
57
- mime-types (1.16)
58
- multi_json (1.0.3)
59
- nokogiri (1.4.7)
60
- polyglot (0.3.2)
61
- pry (0.9.6.2)
62
- coderay (~> 0.9.8)
63
- method_source (~> 0.6.5)
64
- ruby_parser (~> 2.0.5)
65
- slop (~> 2.1.0)
66
- rack (1.3.4)
67
- rack-cache (1.1)
157
+ method_source (0.8.2)
158
+ mime-types (1.25.1)
159
+ mini_portile (0.6.2)
160
+ multi_json (1.11.1)
161
+ net-scp (1.2.1)
162
+ net-ssh (>= 2.6.5)
163
+ net-ssh (2.9.2)
164
+ nokogiri (1.6.6.2)
165
+ mini_portile (~> 0.6.0)
166
+ parser (2.3.0.pre.2)
167
+ ast (>= 1.1, < 3.0)
168
+ polyglot (0.3.5)
169
+ pry (0.10.1)
170
+ coderay (~> 1.1.0)
171
+ method_source (~> 0.8.1)
172
+ slop (~> 3.4)
173
+ pry-byebug (3.1.0)
174
+ byebug (~> 4.0)
175
+ pry (~> 0.10)
176
+ pry-meta (0.0.10)
177
+ awesome_print
178
+ pry
179
+ pry-byebug
180
+ pry-remote
181
+ pry-remote (0.1.8)
182
+ pry (~> 0.9)
183
+ slop (~> 3.0)
184
+ rack (1.4.7)
185
+ rack-cache (1.2)
68
186
  rack (>= 0.4)
69
- rack-mount (0.8.3)
70
- rack (>= 1.0.0)
71
- rack-ssl (1.3.2)
187
+ rack-ssl (1.3.4)
72
188
  rack
73
- rack-test (0.6.1)
189
+ rack-test (0.6.3)
74
190
  rack (>= 1.0)
75
- rails (3.1.1)
76
- actionmailer (= 3.1.1)
77
- actionpack (= 3.1.1)
78
- activerecord (= 3.1.1)
79
- activeresource (= 3.1.1)
80
- activesupport (= 3.1.1)
191
+ rails (3.2.22)
192
+ actionmailer (= 3.2.22)
193
+ actionpack (= 3.2.22)
194
+ activerecord (= 3.2.22)
195
+ activeresource (= 3.2.22)
196
+ activesupport (= 3.2.22)
81
197
  bundler (~> 1.0)
82
- railties (= 3.1.1)
83
- railties (3.1.1)
84
- actionpack (= 3.1.1)
85
- activesupport (= 3.1.1)
198
+ railties (= 3.2.22)
199
+ railties (3.2.22)
200
+ actionpack (= 3.2.22)
201
+ activesupport (= 3.2.22)
86
202
  rack-ssl (~> 1.3.2)
87
203
  rake (>= 0.8.7)
88
204
  rdoc (~> 3.4)
89
- thor (~> 0.14.6)
90
- rake (0.9.2)
91
- rdoc (3.10)
205
+ thor (>= 0.14.6, < 2.0)
206
+ rainbow (2.0.0)
207
+ rake (10.4.2)
208
+ rdoc (3.12.2)
92
209
  json (~> 1.4)
93
- rspec (2.7.0)
94
- rspec-core (~> 2.7.0)
95
- rspec-expectations (~> 2.7.0)
96
- rspec-mocks (~> 2.7.0)
97
- rspec-core (2.7.0)
98
- rspec-expectations (2.7.0)
99
- diff-lcs (~> 1.1.2)
100
- rspec-mocks (2.7.0)
101
- rspec-rails (2.7.0)
102
- actionpack (~> 3.0)
103
- activesupport (~> 3.0)
104
- railties (~> 3.0)
105
- rspec (~> 2.7.0)
106
- ruby_parser (2.0.6)
107
- sexp_processor (~> 3.0)
108
- sexp_processor (3.0.7)
109
- slop (2.1.0)
110
- sprockets (2.0.2)
210
+ rspec (3.3.0)
211
+ rspec-core (~> 3.3.0)
212
+ rspec-expectations (~> 3.3.0)
213
+ rspec-mocks (~> 3.3.0)
214
+ rspec-core (3.3.1)
215
+ rspec-support (~> 3.3.0)
216
+ rspec-expectations (3.3.0)
217
+ diff-lcs (>= 1.2.0, < 2.0)
218
+ rspec-support (~> 3.3.0)
219
+ rspec-mocks (3.3.1)
220
+ diff-lcs (>= 1.2.0, < 2.0)
221
+ rspec-support (~> 3.3.0)
222
+ rspec-support (3.3.0)
223
+ slop (3.6.0)
224
+ sprockets (2.2.3)
111
225
  hike (~> 1.2)
226
+ multi_json (~> 1.0)
112
227
  rack (~> 1.0)
113
228
  tilt (~> 1.1, != 1.3.0)
114
- sqlite3 (1.3.4)
115
- thor (0.14.6)
116
- tilt (1.3.3)
117
- treetop (1.4.10)
229
+ thor (0.19.1)
230
+ tilt (1.4.1)
231
+ transpec (3.1.0)
232
+ activesupport (>= 3.0, < 5.0)
233
+ astrolabe (~> 1.2)
234
+ bundler (~> 1.3)
235
+ json (~> 1.8)
236
+ parser (~> 2.2)
237
+ rainbow (>= 1.99.1, < 3.0)
238
+ treetop (1.4.15)
118
239
  polyglot
119
240
  polyglot (>= 0.3.1)
120
- tzinfo (0.3.30)
121
- xml-simple (1.1.1)
241
+ tzinfo (0.3.44)
122
242
 
123
243
  PLATFORMS
124
244
  ruby
125
245
 
126
246
  DEPENDENCIES
127
- fakeweb (~> 1.3.0)
128
- nokogiri (~> 1.4.4)
129
- pry
247
+ pry-meta
130
248
  rails (~> 3.1)
131
- rspec-rails (~> 2.7.0)
132
- sqlite3 (~> 1.3.3)
249
+ rspec
133
250
  storage!
251
+ transpec
@@ -1,12 +1,12 @@
1
1
  require "ostruct"
2
- require "fileutils" unless defined?(FileUtils)
3
- require "storage/errors"
4
- require "aws/s3"
2
+ require "fileutils"
3
+ require "fog"
5
4
 
6
5
  module Storage
7
- autoload :Config, "storage/config"
8
- autoload :Strategies, "storage/strategies"
9
- autoload :Version, "storage/version"
6
+ require "storage/errors"
7
+ require "storage/config"
8
+ require "storage/strategies"
9
+ require "storage/version"
10
10
 
11
11
  # Set up the storage options.
12
12
  #
@@ -16,8 +16,9 @@ module Storage
16
16
  #
17
17
  # Check Storage::Config for available options.
18
18
  #
19
- def self.setup(&block)
19
+ def self.setup
20
20
  yield Config
21
+ strategy.prepare!
21
22
  end
22
23
 
23
24
  # A shortcut to the current strategy.
@@ -29,8 +29,13 @@ module Storage
29
29
  # Override setter so we can automatically define the strategy class
30
30
  # based on its registered name.
31
31
  def self.strategy=(strategy)
32
- @strategy_class = eval(Storage::Strategies::STRATEGIES[strategy])
32
+ @strategy_class = get_class_for_strategy(strategy)
33
33
  @strategy = strategy
34
34
  end
35
+
36
+ def self.get_class_for_strategy(strategy)
37
+ Storage::Strategies::STRATEGIES[strategy].split('::')
38
+ .reduce(Object) {|ns, class_name| ns.const_get(class_name) }
39
+ end
35
40
  end
36
41
  end
@@ -1,7 +1,7 @@
1
1
  module Storage
2
2
  module Strategies
3
- autoload :S3, "storage/strategies/s3"
4
- autoload :FileSystem, "storage/strategies/file_system"
3
+ require "storage/strategies/s3"
4
+ require "storage/strategies/file_system"
5
5
 
6
6
  STRATEGIES = {}
7
7
 
@@ -3,6 +3,12 @@ module Storage
3
3
  module FileSystem
4
4
  extend self
5
5
 
6
+ def connect!
7
+ end
8
+
9
+ def disconnect!
10
+ end
11
+
6
12
  def prepare!
7
13
  FileUtils.mkdir_p File.expand_path(Storage::Config.path)
8
14
  end
@@ -3,57 +3,81 @@ module Storage
3
3
  module S3
4
4
  extend self
5
5
 
6
+ MissingBucket = Class.new(StandardError)
7
+
8
+ def connection
9
+ @connection ||= Fog::Storage.new({
10
+ :provider => 'AWS',
11
+ :aws_access_key_id => Storage::Config.access_key,
12
+ :aws_secret_access_key => Storage::Config.secret_key
13
+ })
14
+ end
15
+
16
+ def prepare!
17
+ disconnect!
18
+ end
19
+
6
20
  def connect!
7
- AWS::S3::Base.establish_connection!({
8
- :access_key_id => Storage::Config.access_key,
9
- :secret_access_key => Storage::Config.secret_key
10
- }) unless AWS::S3::Base.connected?
11
21
  end
12
22
 
13
23
  def disconnect!
14
- AWS::S3::Base.disconnect! if AWS::S3::Base.connected?
24
+ @connection = nil
15
25
  end
16
26
 
17
27
  def get(file, options = {})
18
- connect!
28
+ expires = options.fetch(:expires, Time.now.to_i + 3600)
19
29
  object = find_object(file, options)
20
- AWS::S3::S3Object.url_for(file, options[:bucket], :authenticated => false)
21
- rescue AWS::S3::NoSuchKey, AWS::S3::NoSuchBucket
22
- raise Storage::MissingFileError
30
+ object.public_url || object.url(expires)
23
31
  end
24
32
 
25
33
  def store(file, options = {})
26
- connect!
27
34
  object = find_object(file, options) rescue nil
35
+ raise FileAlreadyExistsError if object
28
36
 
29
- raise Storage::FileAlreadyExistsError if object
30
-
31
- bucket = find_bucket_or_create(options[:bucket])
37
+ bucket = find_bucket_or_create(options.fetch(:bucket))
32
38
  file = File.open(file, "rb") unless file.respond_to?(:read) && !file.kind_of?(Pathname)
33
- AWS::S3::S3Object.store(options[:name], file, bucket.name, :access => options.fetch(:access, :public_read))
39
+
40
+ create_object(bucket, file, options)
34
41
  end
35
42
 
36
43
  def remove(file, options = {})
37
- connect!
38
44
  object = find_object(file, options)
39
- object.delete
40
- rescue AWS::S3::NoSuchKey, AWS::S3::NoSuchBucket
41
- raise Storage::MissingFileError
45
+ object.destroy
42
46
  end
43
47
 
44
48
  def find_bucket(name)
45
- AWS::S3::Bucket.find(name)
49
+ connection.directories.get(name)
50
+ end
51
+
52
+ def find_bucket!(name)
53
+ find_bucket(name) || raise(MissingBucket)
54
+ end
55
+
56
+ def create_bucket(name)
57
+ connection.directories.create(
58
+ :key => name,
59
+ :public => false
60
+ )
61
+ end
62
+
63
+ def create_object(bucket, file, options)
64
+ bucket.files.create({
65
+ :key => options.fetch(:name),
66
+ :body => file,
67
+ :public => (options[:public] || options[:access] != :public_read)
68
+ })
46
69
  end
47
70
 
48
71
  def find_object(file, options = {})
49
72
  path = options.fetch(:name, file)
50
- AWS::S3::S3Object.find(path, options[:bucket])
73
+ bucket = find_bucket!(options.fetch(:bucket))
74
+ bucket.files.get(path) || raise(MissingFileError)
75
+ rescue MissingBucket
76
+ raise MissingFileError
51
77
  end
52
78
 
53
79
  def find_bucket_or_create(name)
54
- bucket = find_bucket(name)
55
- bucket ||= AWS::S3::Bucket.create(name)
56
- bucket
80
+ find_bucket(name) || create_bucket(name)
57
81
  end
58
82
  end
59
83
  end
@@ -1,8 +1,8 @@
1
1
  module Storage
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 1
5
- PATCH = 5
4
+ MINOR = 2
5
+ PATCH = 0
6
6
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  end
8
8
  end
@@ -1,5 +1,4 @@
1
- require "bundler"
2
- Bundler.setup
1
+ require "bundler/setup"
3
2
  Bundler.require(:default, :development)
4
3
 
5
4
  require "storage"
@@ -9,8 +8,10 @@ TMP = Pathname.new(File.expand_path(File.dirname(__FILE__) + "/tmp"))
9
8
  RESOURCES = Pathname.new(File.expand_path(File.dirname(__FILE__) + "/resources"))
10
9
 
11
10
  RSpec.configure do |config|
12
- config.around :each do
11
+ cleaner = proc do
13
12
  FileUtils.rm_rf(TMP) rescue nil
14
13
  FileUtils.mkdir_p(TMP) rescue nil
15
14
  end
15
+
16
+ config.before(:each, &cleaner)
16
17
  end
@@ -15,21 +15,21 @@ describe Storage::Strategies::FileSystem do
15
15
  handler = File.open(@source)
16
16
  Storage.store(handler, :name => "lorem.txt")
17
17
 
18
- File.should be_file(@destiny)
19
- File.read(@destiny).should == File.read(@source)
18
+ expect(File).to be_file(@destiny)
19
+ expect(File.read(@destiny)).to eq(File.read(@source))
20
20
  end
21
21
 
22
22
  it "should save a file using a path" do
23
23
  Storage.store(@source, :name => "lorem.txt")
24
24
 
25
- File.should be_file(@destiny)
26
- File.read(@destiny).should == File.read(@source)
25
+ expect(File).to be_file(@destiny)
26
+ expect(File.read(@destiny)).to eq(File.read(@source))
27
27
  end
28
28
 
29
29
  it "should remove an existing file" do
30
30
  Storage.store(@source, :name => "lorem.txt")
31
- Storage.remove("lorem.txt").should be_true
32
- File.should_not be_file(@destiny)
31
+ expect(Storage.remove("lorem.txt")).to be_truthy
32
+ expect(File).not_to be_file(@destiny)
33
33
  end
34
34
 
35
35
  it "should raise when trying to removing an unexesting file" do
@@ -40,7 +40,7 @@ describe Storage::Strategies::FileSystem do
40
40
 
41
41
  it "should retrieve an existing file" do
42
42
  Storage.store(@source, :name => "lorem.txt")
43
- Storage.get("lorem.txt").should == File.expand_path(TMP.join("lorem.txt"))
43
+ expect(Storage.get("lorem.txt")).to eq(File.expand_path(TMP.join("lorem.txt")))
44
44
  end
45
45
 
46
46
  it "should raise when trying to retrieve an unexesting file" do
@@ -2,13 +2,13 @@ require "spec_helper"
2
2
 
3
3
  describe Storage::Strategies::S3 do
4
4
  before do
5
+ @adapter = Storage::Strategies::S3
5
6
  @source = RESOURCES.join("file.txt")
6
7
  @destiny = TMP.join("lorem.txt")
7
- @bucket = mock("bucket", :name => "files")
8
+ @connection = double("connection")
9
+ @bucket = double("bucket")
8
10
 
9
- AWS::S3::Base.stub :establish_connection!
10
- AWS::S3::Bucket.stub :find => @bucket
11
- AWS::S3::S3Object.stub :store
11
+ allow(@adapter).to receive(:connection).and_return(@connection)
12
12
 
13
13
  Storage.setup do |c|
14
14
  c.strategy = :s3
@@ -17,84 +17,95 @@ describe Storage::Strategies::S3 do
17
17
  end
18
18
  end
19
19
 
20
- it "should establish connection" do
21
- options = {:access_key_id => "abc", :secret_access_key => "123"}
22
- AWS::S3::Base.should_receive(:establish_connection!).with(options)
23
-
24
- Storage::Strategies::S3.connect!
25
- end
26
-
27
- it "should not reconnect when a connection is already established" do
28
- AWS::S3::Base.should_receive(:connected?).and_return(true)
29
- AWS::S3::Base.should_not_receive(:establish_connection!)
30
-
31
- Storage::Strategies::S3.connect!
32
- end
33
-
34
- it "should disconnect when connection is established" do
35
- AWS::S3::Base.should_receive(:connected?).and_return(true)
36
- AWS::S3::Base.should_receive(:disconnect!)
37
- Storage::Strategies::S3.disconnect!
38
- end
39
-
40
- it "should ignore disconnection when connection is not established" do
41
- AWS::S3::Base.should_receive(:connected?).and_return(false)
42
- AWS::S3::Base.should_not_receive(:disconnect!)
43
- Storage::Strategies::S3.disconnect!
44
- end
45
-
46
20
  it "should save a file using file handler" do
47
21
  handler = File.open(@source)
48
- AWS::S3::S3Object.should_receive(:store).with("lorem.txt", handler, "files", :access => :public_read)
22
+
23
+ expect(@connection).to receive_message_chain('directories.get').with('files').and_return(@bucket)
24
+ expect(@adapter).to receive_message_chain('find_object').and_return(nil)
25
+ expect(@bucket).to receive_message_chain('files.create').with(:key => 'lorem.txt', :body => handler, :public => true)
26
+
49
27
  Storage.store(handler, :name => "lorem.txt", :bucket => "files")
50
28
  end
51
29
 
52
30
  it "should save a file using a path" do
53
- AWS::S3::S3Object.should_receive(:store).with("lorem.txt", kind_of(File), "files", :access => :public_read)
31
+ expect(@connection).to receive_message_chain('directories.get').with('files').and_return(@bucket)
32
+ expect(@adapter).to receive_message_chain('find_object').and_return(nil)
33
+ expect(@bucket).to receive_message_chain('files.create').with(:key => 'lorem.txt', :body => kind_of(File), :public => true)
34
+
54
35
  Storage.store(@source, :name => "lorem.txt", :bucket => "files")
55
36
  end
56
37
 
57
38
  it "should remove an existing file" do
58
- object = mock("object")
59
- object.should_receive(:delete).and_return(true)
60
- Storage::Strategies::S3.should_receive(:find_object).with(:name => "lorem.txt", :bucket => "files").and_return(object)
39
+ object = double("object")
40
+ expect(@connection).to receive_message_chain('directories.get').with('files').and_return(@bucket)
41
+ expect(@bucket).to receive_message_chain('files.get').with('lorem.txt').and_return(object)
42
+ expect(object).to receive(:destroy).and_return(true)
61
43
 
62
- Storage.remove("lorem.txt", :bucket => "files").should be_true
44
+ expect(Storage.remove("lorem.txt", :bucket => "files")).to be_truthy
63
45
  end
64
46
 
65
47
  it "should raise when trying to removing an unexesting file" do
66
- Storage::Strategies::S3.should_receive(:find_object).and_raise(AWS::S3::NoSuchKey)
48
+ expect(@connection).to receive_message_chain('directories.get').with('files').and_return(@bucket)
49
+ expect(@bucket).to receive_message_chain('files.get').with('lorem.txt').and_return(nil)
67
50
 
68
51
  expect {
69
52
  Storage.remove("lorem.txt", :bucket => "files")
70
53
  }.to raise_error(Storage::MissingFileError)
71
54
  end
72
55
 
73
- it "should retrieve an existing file" do
74
- object = mock("object")
56
+ it "should retrieve an existing file (public url)" do
57
+ object = double("object", public_url: 'PUBLIC_URL')
58
+ expect(@connection).to receive_message_chain('directories.get').with('files').and_return(@bucket)
59
+ expect(@bucket).to receive_message_chain('files.get').with('lorem.txt').and_return(object)
75
60
 
76
- AWS::S3::S3Object.should_receive(:find).with("lorem.txt", "files").and_return(object)
77
- AWS::S3::S3Object.should_receive(:url_for).with("lorem.txt", "files", :authenticated => false)
61
+ expect(Storage.get("lorem.txt", :bucket => "files")).to eq('PUBLIC_URL')
62
+ end
78
63
 
79
- Storage.get("lorem.txt", :bucket => "files")
64
+ it "should retrieve an existing file (private url)" do
65
+ object = double("object", public_url: nil)
66
+
67
+ expect(object).to receive_message_chain('url').with(Time.now.to_i + 3600).and_return('PRIVATE_URL')
68
+ expect(@connection).to receive_message_chain('directories.get').with('files').and_return(@bucket)
69
+ expect(@bucket).to receive_message_chain('files.get').with('lorem.txt').and_return(object)
70
+
71
+ expect(Storage.get("lorem.txt", :bucket => "files")).to eq('PRIVATE_URL')
80
72
  end
81
73
 
82
- it "should raise when trying to retrieve an unexesting file" do
83
- AWS::S3::S3Object.should_receive(:find).with("lorem.txt", "files").and_raise(AWS::S3::NoSuchKey)
84
- AWS::S3::S3Object.should_not_receive(:url_for)
74
+ it "should raise when trying to retrieve an missing file" do
75
+ expect(@connection).to receive_message_chain('directories.get').with('files').and_return(@bucket)
76
+ expect(@bucket).to receive_message_chain('files.get').with('lorem.txt').and_return(nil)
85
77
 
86
78
  expect {
87
79
  Storage.get("lorem.txt", :bucket => "files")
88
80
  }.to raise_error(Storage::MissingFileError)
89
81
  end
90
82
 
83
+ it "should raise when trying to retrieve an missing bucket" do
84
+ expect(@connection).to receive_message_chain('directories.get').with('files').and_return(nil)
85
+
86
+ expect {
87
+ Storage.get("lorem.txt", :bucket => "files")
88
+ }.to raise_error(Storage::MissingFileError)
89
+ end
90
+
91
+ it "should create a bucket and trying to store a file on a missing bucket" do
92
+ expect(@adapter).to receive_message_chain('find_object').and_return(nil)
93
+ allow(@connection).to receive_message_chain('directories.get').and_return(nil)
94
+ expect(@connection).to receive_message_chain('directories.create').with(key: 'files', public: false).and_return(@bucket)
95
+
96
+ @bucket.as_null_object
97
+
98
+ Storage.store(@source, :name => 'lorem.txt', :bucket => "files")
99
+ end
100
+
91
101
  it "should raise when saving a file that already exists" do
92
- object = mock("object")
93
- options = {:name => "lorem.txt", :bucket => "files"}
94
- Storage::Strategies::S3.should_receive(:find_object).with(options).and_return(object)
102
+ object = double("object")
103
+
104
+ expect(@connection).to receive_message_chain('directories.get').with('files').and_return(@bucket)
105
+ expect(@bucket).to receive_message_chain('files.get').with('lorem.txt').and_return(object)
95
106
 
96
107
  expect {
97
- Storage.store(@source, options)
108
+ Storage.store(@source, :name => 'lorem.txt', :bucket => 'files')
98
109
  }.to raise_error(Storage::FileAlreadyExistsError)
99
110
  end
100
111
  end
@@ -2,44 +2,51 @@ require "spec_helper"
2
2
 
3
3
  describe Storage do
4
4
  it "should return the strategy" do
5
- @strategy = mock("strategy")
5
+ @strategy = double("strategy")
6
6
  Storage::Config.strategy_class = @strategy
7
7
 
8
- Storage.strategy.should be(@strategy)
8
+ expect(Storage.strategy).to be(@strategy)
9
9
  end
10
10
 
11
11
  it "should return the config" do
12
- Storage::Strategies::S3.stub :prepare!
12
+ allow(Storage::Strategies::S3).to receive :prepare!
13
13
 
14
14
  Storage.setup do |config|
15
15
  config.strategy = :s3
16
- config.should be(Storage::Config)
16
+ expect(config).to be(Storage::Config)
17
17
  end
18
18
  end
19
19
 
20
+ it "should set strategy class based on its name" do
21
+ Storage::Config.strategy_class = nil
22
+ Storage::Config.strategy = :s3
23
+
24
+ expect(Storage::Config.strategy_class).to eq(Storage::Strategies::S3)
25
+ end
26
+
20
27
  it "prepare strategy after setting its configuration" do
21
- Storage::Strategies::S3.should_receive(:prepare!).once
28
+ expect(Storage::Strategies::S3).to receive(:prepare!).once
22
29
  Storage.setup {|config| config.strategy = :s3}
23
30
  end
24
31
 
25
32
  context "delegation" do
26
33
  before do
27
- @strategy = mock("strategy")
28
- Storage.should_receive(:strategy).and_return(@strategy)
34
+ @strategy = double("strategy")
35
+ expect(Storage).to receive(:strategy).and_return(@strategy)
29
36
  end
30
37
 
31
38
  it "should delegate save method" do
32
- @strategy.should_receive(:store).with("some/file")
39
+ expect(@strategy).to receive(:store).with("some/file")
33
40
  Storage.store "some/file"
34
41
  end
35
42
 
36
43
  it "should delegate destroy method" do
37
- @strategy.should_receive(:remove).with("some/file")
44
+ expect(@strategy).to receive(:remove).with("some/file")
38
45
  Storage.remove "some/file"
39
46
  end
40
47
 
41
48
  it "should delegate get method" do
42
- @strategy.should_receive(:get).with("some/file")
49
+ expect(@strategy).to receive(:get).with("some/file")
43
50
  Storage.get "some/file"
44
51
  end
45
52
  end
@@ -1,6 +1,4 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "storage/version"
1
+ require "./lib/storage/version"
4
2
 
5
3
  Gem::Specification.new do |s|
6
4
  s.name = "storage"
@@ -17,12 +15,10 @@ Gem::Specification.new do |s|
17
15
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
16
  s.require_paths = ["lib"]
19
17
 
20
- s.add_dependency "aws-s3", "~> 0.6.2"
18
+ s.add_dependency "fog"
21
19
 
22
20
  s.add_development_dependency "rails" , "~> 3.1"
23
- s.add_development_dependency "fakeweb" , "~> 1.3.0"
24
- s.add_development_dependency "rspec-rails" , "~> 2.7.0"
25
- s.add_development_dependency "nokogiri" , "~> 1.4.4"
26
- s.add_development_dependency "sqlite3" , "~> 1.3.3"
27
- s.add_development_dependency "pry"
21
+ s.add_development_dependency "rspec"
22
+ s.add_development_dependency "transpec"
23
+ s.add_development_dependency "pry-meta"
28
24
  end
metadata CHANGED
@@ -1,94 +1,86 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: storage
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Nando Vieira
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2011-10-18 00:00:00.000000000 Z
11
+ date: 2015-06-26 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: aws-s3
16
- requirement: &70300994093180 !ruby/object:Gem::Requirement
17
- none: false
14
+ name: fog
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ~>
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
- version: 0.6.2
19
+ version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70300994093180
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: rails
27
- requirement: &70300994120940 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ~>
31
+ - - "~>"
31
32
  - !ruby/object:Gem::Version
32
33
  version: '3.1'
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *70300994120940
36
- - !ruby/object:Gem::Dependency
37
- name: fakeweb
38
- requirement: &70300994120320 !ruby/object:Gem::Requirement
39
- none: false
36
+ version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
- - - ~>
38
+ - - "~>"
42
39
  - !ruby/object:Gem::Version
43
- version: 1.3.0
44
- type: :development
45
- prerelease: false
46
- version_requirements: *70300994120320
40
+ version: '3.1'
47
41
  - !ruby/object:Gem::Dependency
48
- name: rspec-rails
49
- requirement: &70300994119240 !ruby/object:Gem::Requirement
50
- none: false
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
51
44
  requirements:
52
- - - ~>
45
+ - - ">="
53
46
  - !ruby/object:Gem::Version
54
- version: 2.7.0
47
+ version: '0'
55
48
  type: :development
56
49
  prerelease: false
57
- version_requirements: *70300994119240
58
- - !ruby/object:Gem::Dependency
59
- name: nokogiri
60
- requirement: &70300994117700 !ruby/object:Gem::Requirement
61
- none: false
50
+ version_requirements: !ruby/object:Gem::Requirement
62
51
  requirements:
63
- - - ~>
52
+ - - ">="
64
53
  - !ruby/object:Gem::Version
65
- version: 1.4.4
66
- type: :development
67
- prerelease: false
68
- version_requirements: *70300994117700
54
+ version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: sqlite3
71
- requirement: &70300994150300 !ruby/object:Gem::Requirement
72
- none: false
56
+ name: transpec
57
+ requirement: !ruby/object:Gem::Requirement
73
58
  requirements:
74
- - - ~>
59
+ - - ">="
75
60
  - !ruby/object:Gem::Version
76
- version: 1.3.3
61
+ version: '0'
77
62
  type: :development
78
63
  prerelease: false
79
- version_requirements: *70300994150300
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
80
69
  - !ruby/object:Gem::Dependency
81
- name: pry
82
- requirement: &70300994147180 !ruby/object:Gem::Requirement
83
- none: false
70
+ name: pry-meta
71
+ requirement: !ruby/object:Gem::Requirement
84
72
  requirements:
85
- - - ! '>='
73
+ - - ">="
86
74
  - !ruby/object:Gem::Version
87
75
  version: '0'
88
76
  type: :development
89
77
  prerelease: false
90
- version_requirements: *70300994147180
91
- description: ! 'This gem provides a simple API for multiple storage backends. Supported
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: 'This gem provides a simple API for multiple storage backends. Supported
92
84
  storages: Amazon S3 and FileSystem.'
93
85
  email:
94
86
  - fnando.vieira@gmail.com
@@ -96,8 +88,8 @@ executables: []
96
88
  extensions: []
97
89
  extra_rdoc_files: []
98
90
  files:
99
- - .gitignore
100
- - .rspec
91
+ - ".gitignore"
92
+ - ".rspec"
101
93
  - Gemfile
102
94
  - Gemfile.lock
103
95
  - README.rdoc
@@ -111,46 +103,37 @@ files:
111
103
  - lib/storage/version.rb
112
104
  - spec/resources/file.txt
113
105
  - spec/spec_helper.rb
114
- - spec/storage/config_spec.rb
115
106
  - spec/storage/strategies/file_system_spec.rb
116
107
  - spec/storage/strategies/s3_spec.rb
117
108
  - spec/storage_spec.rb
118
109
  - storage.gemspec
119
110
  homepage: http://github.com/fnando/storage
120
111
  licenses: []
112
+ metadata: {}
121
113
  post_install_message:
122
114
  rdoc_options: []
123
115
  require_paths:
124
116
  - lib
125
117
  required_ruby_version: !ruby/object:Gem::Requirement
126
- none: false
127
118
  requirements:
128
- - - ! '>='
119
+ - - ">="
129
120
  - !ruby/object:Gem::Version
130
121
  version: '0'
131
- segments:
132
- - 0
133
- hash: -2661529604855007369
134
122
  required_rubygems_version: !ruby/object:Gem::Requirement
135
- none: false
136
123
  requirements:
137
- - - ! '>='
124
+ - - ">="
138
125
  - !ruby/object:Gem::Version
139
126
  version: '0'
140
- segments:
141
- - 0
142
- hash: -2661529604855007369
143
127
  requirements: []
144
128
  rubyforge_project:
145
- rubygems_version: 1.8.10
129
+ rubygems_version: 2.4.6
146
130
  signing_key:
147
- specification_version: 3
148
- summary: ! 'This gem provides a simple API for multiple storage backends. Supported
131
+ specification_version: 4
132
+ summary: 'This gem provides a simple API for multiple storage backends. Supported
149
133
  storages: Amazon S3 and FileSystem.'
150
134
  test_files:
151
135
  - spec/resources/file.txt
152
136
  - spec/spec_helper.rb
153
- - spec/storage/config_spec.rb
154
137
  - spec/storage/strategies/file_system_spec.rb
155
138
  - spec/storage/strategies/s3_spec.rb
156
139
  - spec/storage_spec.rb
@@ -1,10 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Storage::Config do
4
- it "should set strategy class based on its name" do
5
- Storage::Config.strategy_class = nil
6
- Storage::Config.strategy = :s3
7
-
8
- Storage::Config.strategy_class.should == Storage::Strategies::S3
9
- end
10
- end