cloudfiles 1.4.8 → 1.4.9

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -10,6 +10,7 @@ begin
10
10
  gemspec.homepage = "http://www.rackspacecloud.com/cloud_hosting_products/files"
11
11
  gemspec.authors = ["H. Wade Minter", "Rackspace Hosting"]
12
12
  gemspec.add_dependency('mime-types', '>= 1.16')
13
+ gemspec.add_development_dependency "mocha", "~> 0.9.8"
13
14
  end
14
15
  Jeweler::GemcutterTasks.new
15
16
  rescue LoadError
@@ -31,4 +32,9 @@ namespace :test do
31
32
 
32
33
  end
33
34
 
34
-
35
+ require 'rake/testtask'
36
+ Rake::TestTask.new(:test) do |test|
37
+ test.libs << 'lib' << 'test'
38
+ test.pattern = 'test/**/*_test.rb'
39
+ test.verbose = true
40
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.4.8
1
+ 1.4.9
data/cloudfiles.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cloudfiles}
8
- s.version = "1.4.8"
8
+ s.version = "1.4.9"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["H. Wade Minter", "Rackspace Hosting"]
12
- s.date = %q{2010-08-02}
12
+ s.date = %q{2010-10-19}
13
13
  s.description = %q{A Ruby version of the Rackspace Cloud Files API.}
14
14
  s.email = %q{minter@lunenburg.org}
15
15
  s.extra_rdoc_files = [
@@ -57,11 +57,14 @@ Gem::Specification.new do |s|
57
57
 
58
58
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
59
  s.add_runtime_dependency(%q<mime-types>, [">= 1.16"])
60
+ s.add_development_dependency(%q<mocha>, ["~> 0.9.8"])
60
61
  else
61
62
  s.add_dependency(%q<mime-types>, [">= 1.16"])
63
+ s.add_dependency(%q<mocha>, ["~> 0.9.8"])
62
64
  end
63
65
  else
64
66
  s.add_dependency(%q<mime-types>, [">= 1.16"])
67
+ s.add_dependency(%q<mocha>, ["~> 0.9.8"])
65
68
  end
66
69
  end
67
70
 
@@ -10,11 +10,12 @@ module CloudFiles
10
10
  #
11
11
  # Should probably never be called directly.
12
12
  def initialize(connection)
13
- path = '/v1.0'
13
+ parsed_authurl = URI.parse(connection.authurl)
14
+ path = parsed_authurl.path
14
15
  hdrhash = { "X-Auth-User" => connection.authuser, "X-Auth-Key" => connection.authkey }
15
16
  begin
16
- server = Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new('auth.api.rackspacecloud.com',443)
17
- server.use_ssl = true
17
+ server = get_server(connection, parsed_authurl)
18
+ server.use_ssl = true
18
19
  server.verify_mode = OpenSSL::SSL::VERIFY_NONE
19
20
  server.start
20
21
  rescue
@@ -22,16 +23,16 @@ module CloudFiles
22
23
  end
23
24
  response = server.get(path,hdrhash)
24
25
  if (response.code == "204")
25
- connection.cdnmgmthost = URI.parse(response["x-cdn-management-url"]).host
26
- connection.cdnmgmtpath = URI.parse(response["x-cdn-management-url"]).path
27
- connection.cdnmgmtport = URI.parse(response["x-cdn-management-url"]).port
26
+ connection.cdnmgmthost = URI.parse(response["x-cdn-management-url"]).host
27
+ connection.cdnmgmtpath = URI.parse(response["x-cdn-management-url"]).path
28
+ connection.cdnmgmtport = URI.parse(response["x-cdn-management-url"]).port
28
29
  connection.cdnmgmtscheme = URI.parse(response["x-cdn-management-url"]).scheme
29
- connection.storagehost = set_snet(connection,URI.parse(response["x-storage-url"]).host)
30
- connection.storagepath = URI.parse(response["x-storage-url"]).path
31
- connection.storageport = URI.parse(response["x-storage-url"]).port
30
+ connection.storagehost = set_snet(connection,URI.parse(response["x-storage-url"]).host)
31
+ connection.storagepath = URI.parse(response["x-storage-url"]).path
32
+ connection.storageport = URI.parse(response["x-storage-url"]).port
32
33
  connection.storagescheme = URI.parse(response["x-storage-url"]).scheme
33
- connection.authtoken = response["x-auth-token"]
34
- connection.authok = true
34
+ connection.authtoken = response["x-auth-token"]
35
+ connection.authok = true
35
36
  else
36
37
  connection.authtoken = false
37
38
  raise AuthenticationException, "Authentication failed"
@@ -41,6 +42,10 @@ module CloudFiles
41
42
 
42
43
  private
43
44
 
45
+ def get_server(connection, parsed_authurl)
46
+ Net::HTTP::Proxy(connection.proxy_host, connection.proxy_port).new(parsed_authurl.host,parsed_authurl.port)
47
+ end
48
+
44
49
  def set_snet(connection,hostname)
45
50
  if connection.snet?
46
51
  "snet-#{hostname}"
@@ -11,6 +11,9 @@ module CloudFiles
11
11
 
12
12
  # Authentication username provided when the CloudFiles class was instantiated
13
13
  attr_reader :authuser
14
+
15
+ # API host to authenticate to
16
+ attr_reader :authurl
14
17
 
15
18
  # Hostname of the CDN management server
16
19
  attr_accessor :cdnmgmthost
@@ -61,12 +64,15 @@ module CloudFiles
61
64
  # This is useful if you are using the library on a Rackspace-hosted system, as it provides faster speeds, keeps traffic off of
62
65
  # the public network, and the bandwidth is not billed.
63
66
  #
67
+ # If you need to connect to a Cloud Files installation that is NOT the standard Rackspace one, set the :authurl option to the URL
68
+ # of your authentication endpoint. The default is https://auth.api.rackspacecloud.com/v1.0
69
+ #
64
70
  # This will likely be the base class for most operations.
65
71
  #
66
72
  # With gem 1.4.8, the connection style has changed. It is now a hash of arguments. Note that the proxy options are currently only
67
73
  # supported in the new style.
68
74
  #
69
- # cf = CloudFiles::Connection.new(:username => "MY_USERNAME", :api_key => "MY_API_KEY", :retry_auth => true, :snet => false, :proxy_host => "localhost", :proxy_port => "1234")
75
+ # cf = CloudFiles::Connection.new(:username => "MY_USERNAME", :api_key => "MY_API_KEY", :authurl => "https://auth.api.rackspacecloud.com/v1.0", :retry_auth => true, :snet => false, :proxy_host => "localhost", :proxy_port => "1234")
70
76
  #
71
77
  # The old style (positional arguments) is deprecated and will be removed at some point in the future.
72
78
  #
@@ -76,6 +82,7 @@ module CloudFiles
76
82
  options = args[0]
77
83
  @authuser = options[:username] ||( raise AuthenticationException, "Must supply a :username")
78
84
  @authkey = options[:api_key] || (raise AuthenticationException, "Must supply an :api_key")
85
+ @authurl = options[:authurl] || "https://auth.api.rackspacecloud.com/v1.0"
79
86
  @retry_auth = options[:retry_auth] || true
80
87
  @snet = ENV['RACKSPACE_SERVICENET'] || options[:snet]
81
88
  @proxy_host = options[:proxy_host]
@@ -145,7 +152,7 @@ module CloudFiles
145
152
  def containers(limit=0,marker="")
146
153
  paramarr = []
147
154
  paramarr << ["limit=#{URI.encode(limit.to_s).gsub(/&/,'%26')}"] if limit.to_i > 0
148
- paramarr << ["offset=#{URI.encode(marker.to_s).gsub(/&/,'%26')}"] unless marker.to_s.empty?
155
+ paramarr << ["marker=#{URI.encode(marker.to_s).gsub(/&/,'%26')}"] unless marker.to_s.empty?
149
156
  paramstr = (paramarr.size > 0)? paramarr.join("&") : "" ;
150
157
  response = cfreq("GET",@storagehost,"#{@storagepath}?#{paramstr}",@storageport,@storagescheme)
151
158
  return [] if (response.code == "204")
@@ -167,7 +174,7 @@ module CloudFiles
167
174
  def containers_detail(limit=0,marker="")
168
175
  paramarr = []
169
176
  paramarr << ["limit=#{URI.encode(limit.to_s).gsub(/&/,'%26')}"] if limit.to_i > 0
170
- paramarr << ["offset=#{URI.encode(marker.to_s).gsub(/&/,'%26')}"] unless marker.to_s.empty?
177
+ paramarr << ["marker=#{URI.encode(marker.to_s).gsub(/&/,'%26')}"] unless marker.to_s.empty?
171
178
  paramstr = (paramarr.size > 0)? paramarr.join("&") : "" ;
172
179
  response = cfreq("GET",@storagehost,"#{@storagepath}?format=xml&#{paramstr}",@storageport,@storagescheme)
173
180
  return {} if (response.code == "204")
@@ -118,11 +118,11 @@ module CloudFiles
118
118
 
119
119
  # Gathers a list of all available objects in the current container and returns an array of object names.
120
120
  # container = cf.container("My Container")
121
- # container.objects #=> [ "dog", "cat", "donkey", "monkeydir/capuchin"]
121
+ # container.objects #=> [ "cat", "dog", "donkey", "monkeydir", "monkeydir/capuchin"]
122
122
  # Pass a limit argument to limit the list to a number of objects:
123
- # container.objects(:limit => 1) #=> [ "dog" ]
124
- # Pass an offset with or without a limit to start the list at a certain object:
125
- # container.objects(:limit => 1, :offset => 2) #=> [ "donkey" ]
123
+ # container.objects(:limit => 1) #=> [ "cat" ]
124
+ # Pass an marker with or without a limit to start the list at a certain object:
125
+ # container.objects(:limit => 1, :marker => 'dog') #=> [ "donkey" ]
126
126
  # Pass a prefix to search for objects that start with a certain string:
127
127
  # container.objects(:prefix => "do") #=> [ "dog", "donkey" ]
128
128
  # Only search within a certain pseudo-filesystem path:
@@ -132,9 +132,10 @@ module CloudFiles
132
132
  # Returns an empty array if no object exist in the container. Throws an InvalidResponseException
133
133
  # if the request fails.
134
134
  def objects(params = {})
135
+ params[:marker] ||= params[:offset]
135
136
  paramarr = []
136
137
  paramarr << ["limit=#{URI.encode(params[:limit].to_s).gsub(/&/,'%26')}"] if params[:limit]
137
- paramarr << ["offset=#{URI.encode(params[:offset].to_s).gsub(/&/,'%26')}"] if params[:offset]
138
+ paramarr << ["marker=#{URI.encode(params[:marker].to_s).gsub(/&/,'%26')}"] if params[:marker]
138
139
  paramarr << ["prefix=#{URI.encode(params[:prefix]).gsub(/&/,'%26')}"] if params[:prefix]
139
140
  paramarr << ["path=#{URI.encode(params[:path]).gsub(/&/,'%26')}"] if params[:path]
140
141
  paramstr = (paramarr.size > 0)? paramarr.join("&") : "" ;
@@ -162,10 +163,11 @@ module CloudFiles
162
163
  # :bytes=>"22"}
163
164
  # }
164
165
  def objects_detail(params = {})
166
+ params[:marker] ||= params[:offset]
165
167
  paramarr = []
166
168
  paramarr << ["format=xml"]
167
169
  paramarr << ["limit=#{URI.encode(params[:limit].to_s).gsub(/&/,'%26')}"] if params[:limit]
168
- paramarr << ["offset=#{URI.encode(params[:offset].to_s).gsub(/&/,'%26')}"] if params[:offset]
170
+ paramarr << ["marker=#{URI.encode(params[:marker].to_s).gsub(/&/,'%26')}"] if params[:marker]
169
171
  paramarr << ["prefix=#{URI.encode(params[:prefix]).gsub(/&/,'%26')}"] if params[:prefix]
170
172
  paramarr << ["path=#{URI.encode(params[:path]).gsub(/&/,'%26')}"] if params[:path]
171
173
  paramstr = (paramarr.size > 0)? paramarr.join("&") : "" ;
@@ -8,8 +8,8 @@ class CloudfilesAuthenticationTest < Test::Unit::TestCase
8
8
  response.stubs(:code).returns('204')
9
9
  server = mock(:use_ssl= => true, :verify_mode= => true, :start => true, :finish => true)
10
10
  server.stubs(:get).returns(response)
11
- Net::HTTP.stubs(:new).returns(server)
12
- @connection = stub(:authuser => 'dummy_user', :authkey => 'dummy_key', :cdnmgmthost= => true, :cdnmgmtpath= => true, :cdnmgmtport= => true, :cdnmgmtscheme= => true, :storagehost= => true, :storagepath= => true, :storageport= => true, :storagescheme= => true, :authtoken= => true, :authok= => true, :snet? => false)
11
+ CloudFiles::Authentication.any_instance.stubs(:get_server).returns(server)
12
+ @connection = stub(:authuser => 'dummy_user', :authkey => 'dummy_key', :cdnmgmthost= => true, :cdnmgmtpath= => true, :cdnmgmtport= => true, :cdnmgmtscheme= => true, :storagehost= => true, :storagepath= => true, :storageport= => true, :storagescheme= => true, :authtoken= => true, :authok= => true, :snet? => false, :authurl => 'https://auth.api.rackspacecloud.com/v1.0')
13
13
  result = CloudFiles::Authentication.new(@connection)
14
14
  assert_equal result.class, CloudFiles::Authentication
15
15
  end
@@ -19,8 +19,8 @@ class CloudfilesAuthenticationTest < Test::Unit::TestCase
19
19
  response.stubs(:code).returns('204')
20
20
  server = mock(:use_ssl= => true, :verify_mode= => true, :start => true, :finish => true)
21
21
  server.stubs(:get).returns(response)
22
- Net::HTTP.stubs(:new).returns(server)
23
- @connection = stub(:authuser => 'dummy_user', :authkey => 'dummy_key', :cdnmgmthost= => true, :cdnmgmtpath= => true, :cdnmgmtport= => true, :cdnmgmtscheme= => true, :storagehost= => true, :storagepath= => true, :storageport= => true, :storagescheme= => true, :authtoken= => true, :authok= => true, :snet? => true)
22
+ CloudFiles::Authentication.any_instance.stubs(:get_server).returns(server)
23
+ @connection = stub(:authuser => 'dummy_user', :authkey => 'dummy_key', :cdnmgmthost= => true, :cdnmgmtpath= => true, :cdnmgmtport= => true, :cdnmgmtscheme= => true, :storagehost= => true, :storagepath= => true, :storageport= => true, :storagescheme= => true, :authtoken= => true, :authok= => true, :snet? => true, :authurl => 'https://auth.api.rackspacecloud.com/v1.0')
24
24
  result = CloudFiles::Authentication.new(@connection)
25
25
  assert_equal result.class, CloudFiles::Authentication
26
26
  end
@@ -30,8 +30,8 @@ class CloudfilesAuthenticationTest < Test::Unit::TestCase
30
30
  response.stubs(:code).returns('499')
31
31
  server = mock(:use_ssl= => true, :verify_mode= => true, :start => true)
32
32
  server.stubs(:get).returns(response)
33
- Net::HTTP.stubs(:new).returns(server)
34
- @connection = stub(:authuser => 'bad_user', :authkey => 'bad_key', :authok= => true, :authtoken= => true)
33
+ CloudFiles::Authentication.any_instance.stubs(:get_server).returns(server)
34
+ @connection = stub(:authuser => 'bad_user', :authkey => 'bad_key', :authok= => true, :authtoken= => true, :authurl => 'https://auth.api.rackspacecloud.com/v1.0')
35
35
  assert_raises(AuthenticationException) do
36
36
  result = CloudFiles::Authentication.new(@connection)
37
37
  end
@@ -39,7 +39,7 @@ class CloudfilesAuthenticationTest < Test::Unit::TestCase
39
39
 
40
40
  def test_bad_hostname
41
41
  Net::HTTP.stubs(:new).raises(ConnectionException)
42
- @connection = stub(:authuser => 'bad_user', :authkey => 'bad_key', :authok= => true, :authtoken= => true)
42
+ @connection = stub(:authuser => 'bad_user', :authkey => 'bad_key', :authok= => true, :authtoken= => true, :authurl => 'https://auth.api.rackspacecloud.com/v1.0')
43
43
  assert_raises(ConnectionException) do
44
44
  result = CloudFiles::Authentication.new(@connection)
45
45
  end
@@ -232,6 +232,22 @@ class CloudfilesConnectionTest < Test::Unit::TestCase
232
232
  assert_equal containers.first, 'foo'
233
233
  end
234
234
 
235
+ def test_containers_with_limit
236
+ build_net_http_object_with_cfreq_expectations({:body => "foo", :code => '200'},
237
+ {:path => includes('limit=1')})
238
+ containers = @connection.containers(1)
239
+ assert_equal containers.size, 1
240
+ assert_equal containers.first, 'foo'
241
+ end
242
+
243
+ def test_containers_with_marker
244
+ build_net_http_object_with_cfreq_expectations({:body => "boo", :code => '200'},
245
+ {:path => includes('marker=baz')})
246
+ containers = @connection.containers(0, 'baz')
247
+ assert_equal containers.size, 1
248
+ assert_equal containers.first, 'boo'
249
+ end
250
+
235
251
  def test_no_containers_yet
236
252
  build_net_http_object
237
253
  containers = @connection.containers
@@ -270,17 +286,25 @@ class CloudfilesConnectionTest < Test::Unit::TestCase
270
286
 
271
287
  private
272
288
 
273
- def build_net_http_object(args={:code => '204' })
289
+ def build_net_http_object(args={:code => '204' }, cfreq_expectations={})
274
290
  args[:response] = {} unless args[:response]
275
291
  response = {'x-cdn-management-url' => 'http://cdn.example.com/path', 'x-storage-url' => 'http://cdn.example.com/storage', 'authtoken' => 'dummy_token'}.merge(args[:response])
276
292
  response.stubs(:code).returns(args[:code])
277
293
  response.stubs(:body).returns args[:body] || nil
278
- server = mock()
279
- server.stubs(:verify_mode= => true)
280
- server.stubs(:start => true)
281
- server.stubs(:use_ssl=).returns(true)
282
- server.stubs(:request).returns(response)
283
- Net::HTTP.stubs(:new).returns(server)
294
+
295
+ if !cfreq_expectations.empty?
296
+ parameter_expectations = [anything(), anything(), anything(), anything(), anything(), anything(), anything(), anything()]
297
+ parameter_expectations[0] = cfreq_expectations[:method] if cfreq_expectations[:method]
298
+ parameter_expectations[2] = cfreq_expectations[:path] if cfreq_expectations[:path]
299
+
300
+ @connection.expects(:cfreq).with(*parameter_expectations).returns(response)
301
+ else
302
+ @connection.stubs(:cfreq).returns(response)
303
+ end
304
+
305
+ end
306
+
307
+ def build_net_http_object_with_cfreq_expectations(args={:code => '204' }, cfreq_expectations={})
308
+ build_net_http_object(args, cfreq_expectations)
284
309
  end
285
-
286
310
  end
@@ -149,19 +149,78 @@ class CloudfilesContainerTest < Test::Unit::TestCase
149
149
  assert_equal objects.first, 'foo'
150
150
  end
151
151
 
152
- def test_fetch_object_detail
153
- body = %{<?xml version="1.0" encoding="UTF-8"?>
154
- <container name="video">
155
- <object><name>kisscam.mov</name><hash>96efd5a0d78b74cfe2a911c479b98ddd</hash><bytes>9196332</bytes><content_type>video/quicktime</content_type><last_modified>2008-12-18T10:34:43.867648</last_modified></object>
156
- <object><name>penaltybox.mov</name><hash>d2a4c0c24d8a7b4e935bee23080e0685</hash><bytes>24944966</bytes><content_type>video/quicktime</content_type><last_modified>2008-12-18T10:35:19.273927</last_modified></object>
157
- </container>
158
- }
159
- build_net_http_object(:code => '200', :body => body)
152
+ def test_fetch_objects_with_limit
153
+ build_net_http_object_with_cfreq_expectations({:code => '200', :body => "foo"},
154
+ {:path => includes("limit=1")})
155
+ objects = @container.objects(:limit => 1)
156
+ assert_equal objects.class, Array
157
+ assert_equal objects.size, 1
158
+ assert_equal objects.first, 'foo'
159
+ end
160
+
161
+ def test_fetch_objects_with_marker
162
+ build_net_http_object_with_cfreq_expectations({:code => '200', :body => "bar"},
163
+ {:path => includes("marker=foo")})
164
+ objects = @container.objects(:marker => 'foo')
165
+ assert_equal objects.class, Array
166
+ assert_equal objects.size, 1
167
+ assert_equal objects.first, 'bar'
168
+ end
169
+
170
+ def test_fetch_objects_with_deprecated_offset_param
171
+ build_net_http_object_with_cfreq_expectations({:code => '200', :body => "bar"},
172
+ {:path => includes("marker=foo")})
173
+ objects = @container.objects(:offset => 'foo')
174
+ assert_equal objects.class, Array
175
+ assert_equal objects.size, 1
176
+ assert_equal objects.first, 'bar'
177
+ end
178
+
179
+ def object_detail_body(skip_kisscam=false)
180
+ lines = ['<?xml version="1.0" encoding="UTF-8"?>',
181
+ '<container name="video">']
182
+ unless skip_kisscam
183
+ lines << '<object><name>kisscam.mov</name><hash>96efd5a0d78b74cfe2a911c479b98ddd</hash><bytes>9196332</bytes><content_type>video/quicktime</content_type><last_modified>2008-12-18T10:34:43.867648</last_modified></object>
184
+ >'
185
+ end
186
+ lines << '<object><name>penaltybox.mov</name><hash>d2a4c0c24d8a7b4e935bee23080e0685</hash><bytes>24944966</bytes><content_type>video/quicktime</content_type><last_modified>2008-12-18T10:35:19.273927</last_modified></object>'
187
+ lines << '</container>'
188
+
189
+ lines.join("\n\n")
190
+ end
191
+
192
+ def test_fetch_objects_detail
193
+ build_net_http_object(:code => '200', :body => object_detail_body)
160
194
  details = @container.objects_detail
161
195
  assert_equal details.size, 2
162
196
  assert_equal details['kisscam.mov'][:bytes], '9196332'
163
197
  end
164
198
 
199
+ def test_fetch_objects_details_with_limit
200
+ build_net_http_object_with_cfreq_expectations({:code => '200', :body => object_detail_body},
201
+ {:path => includes("limit=2")})
202
+ details = @container.objects_detail(:limit => 2)
203
+ assert_equal details.size, 2
204
+ assert_equal details['kisscam.mov'][:bytes], '9196332'
205
+ end
206
+
207
+ def test_fetch_objects_detail_with_marker
208
+ build_net_http_object_with_cfreq_expectations({:code => '200', :body => object_detail_body(true)},
209
+ {:path => includes("marker=kisscam.mov")})
210
+ details = @container.objects_detail(:marker => 'kisscam.mov')
211
+ assert_equal details.size, 1
212
+ assert_equal details['penaltybox.mov'][:bytes], '24944966'
213
+ end
214
+
215
+ def test_fetch_objects_detail_with_deprecated_offset_param
216
+ build_net_http_object_with_cfreq_expectations({:code => '200', :body => object_detail_body(true)},
217
+ {:path => includes("marker=kisscam.mov")})
218
+ details = @container.objects_detail(:offset => 'kisscam.mov')
219
+ assert_equal details.size, 1
220
+ assert_equal details['penaltybox.mov'][:bytes], '24944966'
221
+ end
222
+
223
+
165
224
  def test_fetch_object_detail_empty
166
225
  build_net_http_object
167
226
  details = @container.objects_detail
@@ -182,17 +241,31 @@ class CloudfilesContainerTest < Test::Unit::TestCase
182
241
 
183
242
  private
184
243
 
185
- def build_net_http_object(args={:code => '204' })
244
+ def build_net_http_object(args={:code => '204' }, cfreq_expectations={})
186
245
  CloudFiles::Container.any_instance.stubs(:populate).returns(true)
187
246
  connection = stub(:storagehost => 'test.storage.example', :storagepath => '/dummy/path', :storageport => 443, :storagescheme => 'https', :cdnmgmthost => 'cdm.test.example', :cdnmgmtpath => '/dummy/path', :cdnmgmtport => 443, :cdnmgmtscheme => 'https')
188
247
  args[:response] = {} unless args[:response]
189
248
  response = {'x-cdn-management-url' => 'http://cdn.example.com/path', 'x-storage-url' => 'http://cdn.example.com/storage', 'authtoken' => 'dummy_token', 'last-modified' => Time.now.to_s}.merge(args[:response])
190
249
  response.stubs(:code).returns(args[:code])
191
250
  response.stubs(:body).returns args[:body] || nil
192
- connection.stubs(:cfreq => response)
251
+
252
+ if !cfreq_expectations.empty?
253
+ #cfreq(method,server,path,port,scheme,headers = {},data = nil,attempts = 0,&block)
254
+
255
+ parameter_expectations = [anything(), anything(), anything(), anything(), anything(), anything(), anything(), anything()]
256
+ parameter_expectations[0] = cfreq_expectations[:method] if cfreq_expectations[:method]
257
+ parameter_expectations[2] = cfreq_expectations[:path] if cfreq_expectations[:path]
258
+
259
+ connection.expects(:cfreq).with(*parameter_expectations).returns(response)
260
+ else
261
+ connection.stubs(:cfreq => response)
262
+ end
263
+
193
264
  @container = CloudFiles::Container.new(connection, 'test_container')
194
265
  @container.stubs(:connection).returns(connection)
195
266
  end
196
267
 
197
-
268
+ def build_net_http_object_with_cfreq_expectations(args={:code => '204'}, cfreq_expectations={})
269
+ build_net_http_object(args, cfreq_expectations)
270
+ end
198
271
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudfiles
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 4
9
- - 8
10
- version: 1.4.8
9
+ - 9
10
+ version: 1.4.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - H. Wade Minter
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-08-02 00:00:00 -04:00
19
+ date: 2010-10-19 00:00:00 -04:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -34,6 +34,22 @@ dependencies:
34
34
  version: "1.16"
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: mocha
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 43
46
+ segments:
47
+ - 0
48
+ - 9
49
+ - 8
50
+ version: 0.9.8
51
+ type: :development
52
+ version_requirements: *id002
37
53
  description: A Ruby version of the Rackspace Cloud Files API.
38
54
  email: minter@lunenburg.org
39
55
  executables: []