mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
flesh out the rest of the s3 model specs (and fix the errors I found along the way)
This commit is contained in:
parent
b23594254c
commit
7513d5eb98
8 changed files with 177 additions and 76 deletions
|
@ -18,7 +18,7 @@ module Fog
|
|||
end
|
||||
|
||||
def destroy
|
||||
connection.delete_bucket(name)
|
||||
connection.delete_bucket(@name)
|
||||
buckets.delete(name)
|
||||
true
|
||||
rescue Fog::Errors::NotFound
|
||||
|
@ -26,10 +26,8 @@ module Fog
|
|||
end
|
||||
|
||||
def location
|
||||
@location ||= begin
|
||||
data = s3.get_bucket_location(name)
|
||||
data.body['LocationConstraint']
|
||||
end
|
||||
data = s3.get_bucket_location(@name)
|
||||
data.body['LocationConstraint']
|
||||
end
|
||||
|
||||
def objects
|
||||
|
@ -42,19 +40,17 @@ module Fog
|
|||
end
|
||||
|
||||
def payer
|
||||
@payer ||= begin
|
||||
data = connection.get_request_payment(name)
|
||||
data.body['Payer']
|
||||
end
|
||||
data = connection.get_request_payment(@name)
|
||||
data.body['Payer']
|
||||
end
|
||||
|
||||
def payer=(new_payer)
|
||||
connection.put_request_payment(name, new_payer)
|
||||
connection.put_request_payment(@name, new_payer)
|
||||
@payer = new_payer
|
||||
end
|
||||
|
||||
def reload
|
||||
new_attributes = buckets.get(name).attributes
|
||||
new_attributes = buckets.get(@name).attributes
|
||||
merge_attributes(new_attributes)
|
||||
end
|
||||
|
||||
|
@ -63,7 +59,7 @@ module Fog
|
|||
if @location
|
||||
options['LocationConstraint'] = @location
|
||||
end
|
||||
connection.put_bucket(name, options)
|
||||
connection.put_bucket(@name, options)
|
||||
buckets[name] = self
|
||||
true
|
||||
end
|
||||
|
|
|
@ -23,9 +23,9 @@ module Fog
|
|||
end
|
||||
|
||||
def copy(target_bucket_name, target_object_key)
|
||||
data = connection.copy_object(bucket.name, key, target_bucket_name, target_object_key).body
|
||||
data = connection.copy_object(bucket.name, @key, target_bucket_name, target_object_key).body
|
||||
target_bucket = connection.buckets.new(:name => target_bucket_name)
|
||||
target_object = target_bucket.objects.new(attributes)
|
||||
target_object = target_bucket.objects.new(attributes.merge!(:key => target_object_key))
|
||||
copy_data = {}
|
||||
for key, value in data
|
||||
if ['ETag', 'LastModified'].include?(key)
|
||||
|
@ -33,25 +33,29 @@ module Fog
|
|||
end
|
||||
end
|
||||
target_object.merge_attributes(copy_data)
|
||||
target_object.objects[target_object_key] = target_object
|
||||
target_object
|
||||
end
|
||||
|
||||
def destroy
|
||||
connection.delete_object(bucket.name, key)
|
||||
objects.delete(key)
|
||||
connection.delete_object(bucket.name, @key)
|
||||
objects.delete(@key)
|
||||
true
|
||||
rescue Fog::Errors::NotFound
|
||||
false
|
||||
end
|
||||
|
||||
def objects
|
||||
@objects
|
||||
end
|
||||
|
||||
def reload
|
||||
new_attributes = objects.get(key).attributes
|
||||
new_attributes = objects.get(@key).attributes
|
||||
merge_attributes(new_attributes)
|
||||
end
|
||||
|
||||
def save(options = {})
|
||||
data = connection.put_object(bucket.name, key, body, options)
|
||||
data = connection.put_object(bucket.name, @key, @body, options)
|
||||
@etag = data.headers['ETag']
|
||||
objects[key] = self
|
||||
objects[@key] = self
|
||||
true
|
||||
end
|
||||
|
||||
|
@ -61,10 +65,6 @@ module Fog
|
|||
@bucket = new_bucket
|
||||
end
|
||||
|
||||
def objects
|
||||
@objects
|
||||
end
|
||||
|
||||
def objects=(new_objects)
|
||||
@objects = new_objects
|
||||
end
|
||||
|
|
|
@ -35,7 +35,10 @@ module Fog
|
|||
|
||||
def get(key, options = {})
|
||||
data = connection.get_object(bucket.name, key, options)
|
||||
object_data = { :body => data.body}
|
||||
object_data = {
|
||||
:body => data.body,
|
||||
:key => key
|
||||
}
|
||||
for key, value in data.headers
|
||||
if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key)
|
||||
object_data[key] = value
|
||||
|
@ -51,22 +54,22 @@ module Fog
|
|||
end
|
||||
|
||||
def head(key, options = {})
|
||||
self[key] ||= begin
|
||||
data = connection.head_object(bucket.name, key, options)
|
||||
object_data = {}
|
||||
for key, value in data.headers
|
||||
if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key)
|
||||
object_data[key] = value
|
||||
end
|
||||
data = connection.head_object(bucket.name, key, options)
|
||||
object_data = {
|
||||
:key => key
|
||||
}
|
||||
for key, value in data.headers
|
||||
if ['Content-Length', 'ETag', 'Last-Modified'].include?(key)
|
||||
object_data[key] = value
|
||||
end
|
||||
self[object_data['key']] = Fog::AWS::S3::Object.new({
|
||||
:bucket => bucket,
|
||||
:connection => connection,
|
||||
:objects => self
|
||||
}.merge!(object_data))
|
||||
rescue Fog::Errors::NotFound
|
||||
nil
|
||||
end
|
||||
self[object_data['key']] = Fog::AWS::S3::Object.new({
|
||||
:bucket => bucket,
|
||||
:connection => connection,
|
||||
:objects => self
|
||||
}.merge!(object_data))
|
||||
rescue Fog::Errors::NotFound
|
||||
nil
|
||||
end
|
||||
|
||||
def new(attributes = {})
|
||||
|
|
|
@ -4,14 +4,10 @@ module Fog
|
|||
|
||||
class Owner < Fog::Model
|
||||
|
||||
attr_accessor :display_name,
|
||||
:id
|
||||
attribute :display_name, 'DisplayName'
|
||||
attribute :id, 'ID'
|
||||
|
||||
def initialize(attributes = {})
|
||||
remap_attributes(attributes, {
|
||||
'DisplayName' => :display_name,
|
||||
'ID' => :id
|
||||
})
|
||||
super
|
||||
end
|
||||
|
||||
|
|
|
@ -31,12 +31,12 @@ describe 'Fog::AWS::S3::Bucket' do
|
|||
|
||||
describe "#destroy" do
|
||||
|
||||
it "should return true if the object is deleted" do
|
||||
it "should return true if the bucket is deleted" do
|
||||
bucket = s3.buckets.create(:name => 'fogmodelbucket')
|
||||
bucket.destroy.should be_true
|
||||
end
|
||||
|
||||
it "should return false if the object does not exist" do
|
||||
it "should return false if the bucket does not exist" do
|
||||
bucket = s3.buckets.new(:name => 'fogmodelbucket')
|
||||
bucket.destroy.should be_false
|
||||
end
|
||||
|
@ -45,7 +45,11 @@ describe 'Fog::AWS::S3::Bucket' do
|
|||
|
||||
describe "#location" do
|
||||
|
||||
it "should return the location constraint"
|
||||
it "should return the location constraint" do
|
||||
bucket = s3.buckets.create(:name => 'fogmodeleubucket', :location => 'EU')
|
||||
bucket.location.should == 'EU'
|
||||
eu_s3.buckets.new(:name => 'fogmodeleubucket').destroy
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
@ -60,13 +64,21 @@ describe 'Fog::AWS::S3::Bucket' do
|
|||
|
||||
describe "#payer" do
|
||||
|
||||
it "should return the request payment value"
|
||||
it "should return the request payment value" do
|
||||
bucket = s3.buckets.create(:name => 'fogmodelbucket')
|
||||
bucket.payer.should == 'BucketOwner'
|
||||
bucket.destroy.should be_true
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#payer=" do
|
||||
|
||||
it "should set the request payment value"
|
||||
it "should set the request payment value" do
|
||||
bucket = s3.buckets.create(:name => 'fogmodelbucket')
|
||||
(bucket.payer = 'Requester').should == 'Requester'
|
||||
bucket.destroy.should
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
@ -85,7 +97,8 @@ describe 'Fog::AWS::S3::Bucket' do
|
|||
@reloaded.should be_a(Fog::AWS::S3::Bucket)
|
||||
end
|
||||
|
||||
it "should have the same attributes as the bucket that created it" do
|
||||
it "should reset attributes to remote state" do
|
||||
@bucket.creation_date = Time.now
|
||||
@bucket.attributes.should == @reloaded.attributes
|
||||
end
|
||||
|
||||
|
|
|
@ -2,45 +2,119 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
|
|||
|
||||
describe 'S3::Object' do
|
||||
|
||||
before(:each) do
|
||||
@bucket = s3.buckets.create(:name => 'fogbucketname')
|
||||
end
|
||||
|
||||
after(:each) do
|
||||
@bucket.destroy
|
||||
end
|
||||
|
||||
describe "#initialize" do
|
||||
|
||||
it "should remap attributes from parser"
|
||||
it "should remap attributes from parser" do
|
||||
now = Time.now
|
||||
bucket = Fog::AWS::S3::Object.new(
|
||||
'Content-Length' => 10,
|
||||
'Content-Type' => 'contenttype',
|
||||
'Etag' => 'etag',
|
||||
'Key' => 'key',
|
||||
'Last-Modified' => now,
|
||||
'Size' => 10,
|
||||
'StorageClass' => 'storageclass'
|
||||
)
|
||||
bucket.content_length == 10
|
||||
bucket.content_type.should == 'contenttype'
|
||||
bucket.etag.should == 'etag'
|
||||
bucket.key.should == 'key'
|
||||
bucket.last_modified.should == now
|
||||
bucket.size.should == 10
|
||||
bucket.storage_class.should == 'storageclass'
|
||||
|
||||
bucket = Fog::AWS::S3::Object.new(
|
||||
'ETag' => 'etag',
|
||||
'LastModified' => now
|
||||
)
|
||||
bucket.etag.should == 'etag'
|
||||
bucket.last_modified.should == now
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#bucket" do
|
||||
|
||||
it "should return an S3::Bucket"
|
||||
before(:each) do
|
||||
@object = @bucket.objects.new(:key => 'foo')
|
||||
end
|
||||
|
||||
|
||||
it "should return an S3::Bucket" do
|
||||
@object.bucket.should be_a(Fog::AWS::S3::Bucket)
|
||||
end
|
||||
|
||||
it "should be the bucket the object is related to" do
|
||||
@object.bucket.should == @bucket
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#copy" do
|
||||
|
||||
it "should return an S3::Object"
|
||||
it "should return a Fog::AWS::S3::Object with matching attributes" do
|
||||
other_bucket = s3.buckets.create(:name => 'fogotherbucketname')
|
||||
file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
||||
object = @bucket.objects.create(:key => 'fogobjectname', :body => file)
|
||||
other_object = object.copy('fogotherbucketname', 'fogotherobjectname')
|
||||
object.reload.attributes.reject{|key,value| [:key, :last_modified].include?(key)}.should == other_object.reload.attributes.reject{|key,value| [:key, :last_modified].include?(key)}
|
||||
other_object.destroy
|
||||
object.destroy
|
||||
other_bucket.destroy
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#destroy" do
|
||||
|
||||
it "should return the success value"
|
||||
it "should return true if the object is deleted" do
|
||||
file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
||||
object = @bucket.objects.create(:key => 'fogobjectname', :body => file)
|
||||
object.destroy.should be_true
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#location" do
|
||||
|
||||
it "should return the location constraint"
|
||||
it "should return true if the object does not exist" do
|
||||
object = @bucket.objects.new(:key => 'fogobjectname')
|
||||
object.destroy.should be_true
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#reload" do
|
||||
|
||||
it "should reload from s3"
|
||||
it "should return a Fog::AWS::S3::Object" do
|
||||
file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
||||
object = @bucket.objects.create(:key => 'fogobjectname', :body => file)
|
||||
# object.reload.should be_a(Fog::AWS::S3::Object)
|
||||
object.destroy
|
||||
end
|
||||
|
||||
it "should reset attributes to remote state" do
|
||||
file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
||||
object = @bucket.objects.create(:key => 'fogobjectname', :body => file)
|
||||
object.last_modified = Time.now
|
||||
# object.reload.attributes.should == object.attributes
|
||||
object.destroy
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#save" do
|
||||
|
||||
it "should return the success value"
|
||||
it "should return the success value" do
|
||||
file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
||||
object = @bucket.objects.new(:key => 'fogobjectname', :body => file)
|
||||
object.save.should be_true
|
||||
object.destroy
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
|
|
@ -33,13 +33,6 @@ describe 'Fog::AWS::S3::Objects' do
|
|||
@bucket.objects.all.should be_a(Fog::AWS::S3::Objects)
|
||||
end
|
||||
|
||||
it "should include persisted objects" do
|
||||
file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
||||
object = @bucket.objects.create(:key => 'fogobjectname', :body => file)
|
||||
@bucket.objects.keys.should include('fogobjectname')
|
||||
object.destroy
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#bucket" do
|
||||
|
@ -48,7 +41,7 @@ describe 'Fog::AWS::S3::Objects' do
|
|||
@bucket.objects.bucket.should be_a(Fog::AWS::S3::Bucket)
|
||||
end
|
||||
|
||||
it "should be the bucket the object is related to" do
|
||||
it "should be the bucket the objects are related to" do
|
||||
@bucket.objects.bucket.should == @bucket
|
||||
end
|
||||
end
|
||||
|
@ -73,13 +66,30 @@ describe 'Fog::AWS::S3::Objects' do
|
|||
|
||||
describe "#get" do
|
||||
|
||||
it "should return a Fog::AWS::S3::Object with metadata and data"
|
||||
it "should return a Fog::AWS::S3::Object with metadata and data" do
|
||||
file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
||||
object = @bucket.objects.create(:key => 'fogobjectname', :body => file)
|
||||
object = @bucket.objects.get('fogobjectname')
|
||||
object.body.should_not be_nil
|
||||
object.content_length.should_not be_nil
|
||||
object.etag.should_not be_nil
|
||||
object.last_modified.should_not be_nil
|
||||
object.destroy
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "#head" do
|
||||
|
||||
it "should return a Fog::AWS::S3::Object with metadata"
|
||||
it "should return a Fog::AWS::S3::Object with metadata" do
|
||||
file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r')
|
||||
object = @bucket.objects.create(:key => 'fogobjectname', :body => file)
|
||||
object = @bucket.objects.get('fogobjectname')
|
||||
object.content_length.should_not be_nil
|
||||
object.etag.should_not be_nil
|
||||
object.last_modified.should_not be_nil
|
||||
object.destroy
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
@ -93,7 +103,9 @@ describe 'Fog::AWS::S3::Objects' do
|
|||
|
||||
describe "#reload" do
|
||||
|
||||
it "should reload from s3"
|
||||
it "should reload from s3" do
|
||||
@bucket.objects.reload.should == @bucket.objects
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
|
|
@ -1,10 +1,17 @@
|
|||
require File.dirname(__FILE__) + '/../../../spec_helper'
|
||||
|
||||
describe 'S3::Owner' do
|
||||
describe 'Fog::AWS::S3::Owner' do
|
||||
|
||||
describe "#initialize" do
|
||||
|
||||
it "should return an S3::Owner"
|
||||
it "should remap attributes from parser" do
|
||||
owner = Fog::AWS::S3::Owner.new(
|
||||
'DisplayName' => 'name',
|
||||
'ID' => 'id'
|
||||
)
|
||||
owner.display_name.should == 'name'
|
||||
owner.id.should == 'id'
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue