2010-10-04 17:02:08 -04:00
require 'fog/core/model'
2011-08-24 14:50:42 -04:00
require 'fog/aws/models/storage/files'
2012-01-26 10:06:40 -05:00
require 'fog/aws/models/storage/versions'
2010-03-13 16:37:24 -05:00
2009-08-02 19:37:54 -04:00
module Fog
2011-06-15 17:26:43 -04:00
module Storage
class AWS
2009-08-02 19:37:54 -04:00
2010-01-14 23:44:39 -05:00
class Directory < Fog :: Model
2012-05-02 11:19:46 -04:00
VALID_ACLS = [ 'private' , 'public-read' , 'public-read-write' , 'authenticated-read' ]
# See http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUT.html
INVALID_LOCATIONS = [ 'us-east-1' ]
attr_reader :acl
2009-08-02 19:37:54 -04:00
2010-09-07 14:30:02 -04:00
identity :key , :aliases = > [ 'Name' , 'name' ]
2009-10-23 13:27:23 -04:00
2010-09-07 14:30:02 -04:00
attribute :creation_date , :aliases = > 'CreationDate'
2009-08-04 13:51:54 -04:00
2010-10-29 19:38:17 -04:00
def acl = ( new_acl )
2012-05-03 18:42:52 -04:00
unless VALID_ACLS . include? ( new_acl )
2012-05-02 11:19:46 -04:00
raise ArgumentError . new ( " acl must be one of [ #{ VALID_ACLS . join ( ', ' ) } ] " )
else
@acl = new_acl
2010-10-29 19:38:17 -04:00
end
end
2009-08-30 17:14:11 -04:00
def destroy
2010-05-02 22:59:15 -04:00
requires :key
connection . delete_bucket ( key )
2009-08-27 23:47:01 -04:00
true
2009-11-08 15:16:52 -05:00
rescue Excon :: Errors :: NotFound
2009-09-01 01:40:07 -04:00
false
2009-08-04 01:50:52 -04:00
end
def location
2010-05-02 22:59:15 -04:00
requires :key
2012-05-28 16:36:54 -04:00
attributes [ :location ] || bucket_location || self . connection . region
2009-08-04 01:50:52 -04:00
end
2009-10-23 12:42:51 -04:00
def location = ( new_location )
2012-05-02 11:19:46 -04:00
if INVALID_LOCATIONS . include? ( new_location )
raise ArgumentError , " location must not include any of #{ INVALID_LOCATIONS . join ( ', ' ) } . See http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUT.html "
else
2012-05-28 16:36:54 -04:00
merge_attributes ( :location = > new_location )
2012-05-02 11:19:46 -04:00
end
2009-10-23 12:42:51 -04:00
end
2010-01-14 23:44:39 -05:00
def files
2012-05-02 11:19:46 -04:00
@files || = Fog :: Storage :: AWS :: Files . new ( :directory = > self , :connection = > connection )
2009-08-13 01:48:17 -04:00
end
2009-08-04 01:50:52 -04:00
def payer
2010-05-02 22:59:15 -04:00
requires :key
data = connection . get_request_payment ( key )
2009-09-02 23:17:53 -04:00
data . body [ 'Payer' ]
2009-08-04 01:50:52 -04:00
end
def payer = ( new_payer )
2010-05-02 22:59:15 -04:00
requires :key
connection . put_request_payment ( key , new_payer )
2009-08-04 01:54:34 -04:00
@payer = new_payer
2009-08-04 01:50:52 -04:00
end
2011-12-29 14:47:50 -05:00
def versioning?
requires :key
data = connection . get_bucket_versioning ( key )
data . body [ 'VersioningConfiguration' ] [ 'Status' ] == 'Enabled'
end
def versioning = ( new_versioning )
requires :key
connection . put_bucket_versioning ( key , new_versioning ? 'Enabled' : 'Suspended' )
end
2012-01-26 10:06:40 -05:00
def versions
2012-05-02 11:19:46 -04:00
@versions || = Fog :: Storage :: AWS :: Versions . new ( :directory = > self , :connection = > connection )
2012-01-26 10:06:40 -05:00
end
2010-11-05 14:37:12 -04:00
def public = ( new_public )
2012-05-02 11:19:46 -04:00
self . acl = new_public ? 'public-read' : 'private'
2010-11-05 14:37:12 -04:00
new_public
end
def public_url
requires :key
if connection . get_bucket_acl ( key ) . body [ 'AccessControlList' ] . detect { | grant | grant [ 'Grantee' ] [ 'URI' ] == 'http://acs.amazonaws.com/groups/global/AllUsers' && grant [ 'Permission' ] == 'READ' }
2012-02-17 18:07:18 -05:00
if key . to_s =~ / ^(?:[a-z]| \ d(?! \ d{0,2}(?: \ . \ d{1,3}){3}$))(?:[a-z0-9]| \ -(?![ \ .])){1,61}[a-z0-9]$ /
2010-11-05 14:37:12 -04:00
" https:// #{ key } .s3.amazonaws.com "
else
" https://s3.amazonaws.com/ #{ key } "
end
else
nil
end
end
2009-08-04 01:50:52 -04:00
def save
2010-05-02 22:59:15 -04:00
requires :key
2012-05-02 11:19:46 -04:00
2009-08-04 01:50:52 -04:00
options = { }
2012-05-02 11:19:46 -04:00
options [ 'x-amz-acl' ] = acl if acl
2012-05-28 16:36:54 -04:00
if location = attributes [ :location ] || ( self . connection . region != 'us-east-1' && self . connection . region )
options [ 'LocationConstraint' ] = location
end
2012-05-02 11:19:46 -04:00
2010-05-02 22:59:15 -04:00
connection . put_bucket ( key , options )
2012-05-02 11:19:46 -04:00
2009-08-27 23:47:01 -04:00
true
2009-08-04 01:50:52 -04:00
end
2009-08-02 19:37:54 -04:00
2012-05-02 11:19:46 -04:00
private
def bucket_location
data = connection . get_bucket_location ( key )
data . body [ 'LocationConstraint' ]
end
2009-08-02 19:37:54 -04:00
end
end
end
end