simply_stored 0.1.5 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -69,7 +69,7 @@ module SimplyStored
69
69
  raise SimplyStored::Error, "Can't load record without an id" if what.nil?
70
70
  document = CouchPotato.database.load_document(what)
71
71
  if document.nil? or !document.is_a?(self) or (document.deleted? && !with_deleted)
72
- raise(SimplyStored::RecordNotFound)
72
+ raise(SimplyStored::RecordNotFound, "#{self.name} could not be found with #{what.inspect}")
73
73
  end
74
74
  document
75
75
  end
@@ -6,13 +6,14 @@ module SimplyStored
6
6
  end
7
7
 
8
8
  def s3_connection(name)
9
- @_s3_connection ||= RightAws::S3.new(_s3_options[name][:access_key], _s3_options[name][:secret_access_key], :multi_thread => true)
9
+ @_s3_connection ||= RightAws::S3.new(_s3_options[name][:access_key], _s3_options[name][:secret_access_key], :multi_thread => true, :ca_file => _s3_options[name][:ca_file])
10
10
  end
11
11
 
12
12
  def s3_bucket(name)
13
13
  if !@_s3_bucket
14
14
  @_s3_bucket = s3_connection(name).bucket(_s3_options[name][:bucket])
15
- @_s3_bucket = s3_connection(name).bucket(_s3_options[name][:bucket], true, 'private') if @_s3_bucket.nil?
15
+ location = (_s3_options[name][:location] == :eu) ? :eu : nil
16
+ @_s3_bucket = s3_connection(name).bucket(_s3_options[name][:bucket], true, _s3_options[name][:permissions], :location => location) if @_s3_bucket.nil?
16
17
  end
17
18
  @_s3_bucket
18
19
  rescue Exception => e
@@ -55,7 +56,12 @@ module SimplyStored
55
56
 
56
57
  name = name.to_sym
57
58
  raise ArgumentError, "No bucket name specified for attachment #{name}" if options[:bucket].blank?
58
- options.update(:permissions => 'private', :ssl => true)
59
+ options = {
60
+ :permissions => 'private',
61
+ :ssl => true,
62
+ :location => :us, # use :eu for European buckets
63
+ :ca_file => nil # point to CA file for SSL certificate verification
64
+ }.update(options)
59
65
  self._s3_options ||= {}
60
66
  self._s3_options[name] = options
61
67
 
@@ -82,7 +88,7 @@ module SimplyStored
82
88
 
83
89
  define_method("#{name}_url") do
84
90
  if _s3_options[name][:permissions] == 'private'
85
- RightAws::S3Generator.new(_s3_options[name][:access_key], _s3_options[name][:secret_access_key], :multi_thread => true).bucket(_s3_options[name][:bucket]).get(s3_attachment_key(name), 5.minutes)
91
+ RightAws::S3Generator.new(_s3_options[name][:access_key], _s3_options[name][:secret_access_key], :multi_thread => true, :ca_file => _s3_options[name][:ca_file]).bucket(_s3_options[name][:bucket]).get(s3_attachment_key(name), 5.minutes)
86
92
  else
87
93
  "http://#{_s3_options[name][:bucket].to_s}.s3.amazonaws.com/#{s3_attachment_key(name)}"
88
94
  end
@@ -165,6 +165,16 @@ class CouchTest < Test::Unit::TestCase
165
165
  end
166
166
  end
167
167
 
168
+ should 'tell you which class failed to load something' do
169
+ exception = nil
170
+ begin
171
+ User.find('abc')
172
+ rescue SimplyStored::RecordNotFound => e
173
+ exception = e
174
+ end
175
+ assert_equal "User could not be found with \"abc\"", exception.message
176
+ end
177
+
168
178
  should 'raise an error when nil was specified' do
169
179
  assert_raises(SimplyStored::Error) do
170
180
  User.find(nil)
@@ -1070,6 +1080,7 @@ class CouchTest < Test::Unit::TestCase
1070
1080
  context "with s3 interaction" do
1071
1081
  setup do
1072
1082
  CouchLogItem.instance_variable_set(:@_s3_connection, nil)
1083
+ CouchLogItem._s3_options[:log_data][:ca_file] = nil
1073
1084
 
1074
1085
  bucket = stub(:bckt) do
1075
1086
  stubs(:put).returns(true)
@@ -1089,7 +1100,7 @@ class CouchTest < Test::Unit::TestCase
1089
1100
  context "when saving the attachment" do
1090
1101
  should "fetch the collection" do
1091
1102
  @log_item.log_data = "Yay! It logged!"
1092
- RightAws::S3.expects(:new).with('abcdef', 'secret!', :multi_thread => true).returns(@s3)
1103
+ RightAws::S3.expects(:new).with('abcdef', 'secret!', :multi_thread => true, :ca_file => nil).returns(@s3)
1093
1104
  @log_item.save
1094
1105
  end
1095
1106
 
@@ -1111,16 +1122,27 @@ class CouchTest < Test::Unit::TestCase
1111
1122
  CouchLogItem._s3_options[:log_data][:bucket] = 'mybucket'
1112
1123
 
1113
1124
  @s3.expects(:bucket).with('mybucket').returns(nil)
1114
- @s3.expects(:bucket).with('mybucket', true, 'private').returns(@bucket)
1125
+ @s3.expects(:bucket).with('mybucket', true, 'private', :location => nil).returns(@bucket)
1126
+ @log_item.save
1127
+ end
1128
+
1129
+ should "accept :us location option but not set it in RightAWS::S3" do
1130
+ @log_item.log_data = "Yay! log me"
1131
+ CouchLogItem._s3_options[:log_data][:bucket] = 'mybucket'
1132
+ CouchLogItem._s3_options[:log_data][:location] = :us
1133
+
1134
+ @s3.expects(:bucket).with('mybucket').returns(nil)
1135
+ @s3.expects(:bucket).with('mybucket', true, 'private', :location => nil).returns(@bucket)
1115
1136
  @log_item.save
1116
1137
  end
1117
1138
 
1118
1139
  should "raise an error if the bucket is not ours" do
1119
1140
  @log_item.log_data = "Yay! log me too"
1120
1141
  CouchLogItem._s3_options[:log_data][:bucket] = 'mybucket'
1142
+ CouchLogItem._s3_options[:log_data][:location] = :eu
1121
1143
 
1122
1144
  @s3.expects(:bucket).with('mybucket').returns(nil)
1123
- @s3.expects(:bucket).with('mybucket', true, 'private').raises(RightAws::AwsError, 'BucketAlreadyExists: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again')
1145
+ @s3.expects(:bucket).with('mybucket', true, 'private', :location => :eu).raises(RightAws::AwsError, 'BucketAlreadyExists: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again')
1124
1146
 
1125
1147
  assert_raise(ArgumentError) do
1126
1148
  @log_item.save
@@ -1193,9 +1215,11 @@ class CouchTest < Test::Unit::TestCase
1193
1215
  end
1194
1216
 
1195
1217
  should "add a short-lived access key for private attachments" do
1218
+ @log_item._s3_options[:log_data][:bucket] = 'bucket-for-monsieur'
1219
+ @log_item._s3_options[:log_data][:location] = :us
1196
1220
  @log_item._s3_options[:log_data][:permissions] = 'private'
1197
1221
  @log_item.save
1198
- assert @log_item.log_data_url.include?("https://bucket-for-monsieur.s3.amazonaws.com:443/#{@log_item.s3_attachment_key(:log_data)}")
1222
+ assert @log_item.log_data_url.include?("https://bucket-for-monsieur.s3.amazonaws.com:443/#{@log_item.s3_attachment_key(:log_data)}"), @log_item.log_data_url
1199
1223
  assert @log_item.log_data_url.include?("Signature=")
1200
1224
  assert @log_item.log_data_url.include?("Expires=")
1201
1225
  end
@@ -1208,6 +1232,16 @@ class CouchTest < Test::Unit::TestCase
1208
1232
  end
1209
1233
 
1210
1234
  context "when fetching the data" do
1235
+ should "create a configured S3 connection" do
1236
+ CouchLogItem._s3_options[:log_data][:bucket] = 'mybucket'
1237
+ CouchLogItem._s3_options[:log_data][:location] = :eu
1238
+ CouchLogItem._s3_options[:log_data][:ca_file] = '/etc/ssl/ca.crt'
1239
+
1240
+ RightAws::S3.expects(:new).with('abcdef', 'secret!', :multi_thread => true, :ca_file => '/etc/ssl/ca.crt').returns(@s3)
1241
+
1242
+ @log_item.log_data
1243
+ end
1244
+
1211
1245
  should "fetch the data from s3 and set the attachment attribute" do
1212
1246
  @log_item.instance_variable_set(:@_s3_attachments, {})
1213
1247
  @bucket.expects(:get).with("couch_log_items/log_data/#{@log_item.id}").returns("Yay!")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simply_stored
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mathias Meyer, Jonathan Weiss
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-28 00:00:00 +01:00
12
+ date: 2010-01-06 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency