Skip to content
This repository has been archived by the owner on Jul 13, 2023. It is now read-only.

Commit

Permalink
Allow Fog credentials to be set from an external YAML file.
Browse files Browse the repository at this point in the history
  • Loading branch information
H. Wade Minter committed Aug 24, 2011
1 parent d336c4a commit 77ce88a
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 5 deletions.
25 changes: 21 additions & 4 deletions lib/paperclip/storage/fog.rb
Expand Up @@ -42,7 +42,7 @@ def self.extended base

base.instance_eval do
@fog_directory = @options[:fog_directory]
@fog_credentials = @options[:fog_credentials]
@fog_credentials = parse_credentials(@options[:fog_credentials])
@fog_host = @options[:fog_host]
@fog_public = @options.key?(:fog_public) ? @options[:fog_public] : true
@fog_file = @options[:fog_file] || {}
Expand Down Expand Up @@ -119,18 +119,35 @@ def public_url(style = default_style)
directory.files.new(:key => path(style)).public_url
end
end

def parse_credentials creds
creds = find_credentials(creds).stringify_keys
env = Object.const_defined?(:Rails) ? Rails.env : nil
(creds[env] || creds).symbolize_keys
end

private


def find_credentials creds
case creds
when File
YAML::load(ERB.new(File.read(creds.path)).result)
when String, Pathname
YAML::load(ERB.new(File.read(creds)).result)
when Hash
creds
else
raise ArgumentError, "Credentials are not a path, file, or hash."
end
end

def connection
@connection ||= ::Fog::Storage.new(@fog_credentials)
end

def directory
@directory ||= connection.directories.new(:key => @fog_directory)
end

end

end
end
8 changes: 8 additions & 0 deletions test/fixtures/fog.yml
@@ -0,0 +1,8 @@
development:
provider: AWS
aws_access_key_id: AWS_ID
aws_secret_access_key: AWS_SECRET
test:
provider: AWS
aws_access_key_id: AWS_ID
aws_secret_access_key: AWS_SECRET
36 changes: 35 additions & 1 deletion test/fog_test.rb
Expand Up @@ -5,6 +5,40 @@

class FogTest < Test::Unit::TestCase
context "" do

context "with credentials provided in a path string" do
setup do
rebuild_model :styles => { :medium => "300x300>", :thumb => "100x100>" },
:storage => :fog,
:url => '/:attachment/:filename',
:fog_directory => "paperclip",
:fog_credentials => File.join(File.dirname(__FILE__), 'fixtures', 'fog.yml')
@dummy = Dummy.new
@dummy.avatar = File.new(File.join(File.dirname(__FILE__), 'fixtures', '5k.png'), 'rb')
end

should "have the proper information loading credentials from a file" do
assert_equal @dummy.avatar.instance_variable_get("@fog_credentials")[:provider], 'AWS'
end
end

context "with credentials provided in a File object" do
setup do
rebuild_model :styles => { :medium => "300x300>", :thumb => "100x100>" },
:storage => :fog,
:url => '/:attachment/:filename',
:fog_directory => "paperclip",
:fog_credentials => File.open(File.join(File.dirname(__FILE__), 'fixtures', 'fog.yml'))
@dummy = Dummy.new
@dummy.avatar = File.new(File.join(File.dirname(__FILE__), 'fixtures', '5k.png'), 'rb')
end

should "have the proper information loading credentials from a file" do
assert_equal @dummy.avatar.instance_variable_get("@fog_credentials")[:provider], 'AWS'
end
end


context "with default values for path and url" do
setup do
rebuild_model :styles => { :medium => "300x300>", :thumb => "100x100>" },
Expand All @@ -25,7 +59,7 @@ class FogTest < Test::Unit::TestCase
@dummy.avatar.path
end
end

setup do
@fog_directory = 'papercliptests'

Expand Down

0 comments on commit 77ce88a

Please sign in to comment.