sauce_whisk 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b58bf72d04b598a6481cf55f18f9e2e56303907a
4
- data.tar.gz: 41b817b03dce1171362b43ac3de941da0e1ed7f1
3
+ metadata.gz: 4bf448319c0803865a31b54bfafcb93352cce5d1
4
+ data.tar.gz: db2ca1732b5b4f77bbd6a4ac09dde89d1207c49f
5
5
  SHA512:
6
- metadata.gz: c06d53dc011a497b69825bc1cb2916765b146f5d03f85f510a8b48035959a0a6b5807bb2351b70ebf1506fa73c6c3d3f8e1ea9722312dbf360dd8ec61da087cb
7
- data.tar.gz: a4ba5f66c7751d18e3dac1078e2aaed243d4c9ff31762d4f8d6926562f863708574eb4a6f017faed815256a37ad497a400a6ad5b9212c322b0be7074cb74e57a
6
+ metadata.gz: 98c4e3050d83593799e9fb790601c8f2c703bf3da16aaaa2e6b7063e7b8da1e824cdb4b8335f5e3d4866d5deb78825b549da2d41ce78b94d15fa705498753a1d
7
+ data.tar.gz: 748b08420eb38e8d72f3ad227e8524260367fa8a6f7ef98ce6ba3e1d4aba3158e59c360ea8d888a629403e40e6a7ce5ecf56c40b4d450f198aa92d58a30dbbc7
@@ -1,4 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
+ - 2.0.0
4
5
  - 2.1.1
data/Gemfile CHANGED
@@ -1,6 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'pry'
4
- gem 'psych', '~> 2.0.0'
4
+ gem 'psych', '~> 2.0.5'
5
+ gem "nyan-cat-formatter"
5
6
 
6
- gemspec
7
+ gemspec
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  SauceWhisk provides an "ActiveRecord" style client for the [Sauce Labs](http://www.saucelabs.com) RESTful API. If you're not using the [Sauce Gem](https://rubygems.org/gems/sauce) and you want a nice way to interact with our API, give this a try.
4
4
 
5
+ [![Gem Version](https://badge.fury.io/rb/sauce_whisk.svg)](http://badge.fury.io/rb/sauce_whisk)
5
6
  [![Build Status](https://travis-ci.org/saucelabs/sauce_whisk.svg?branch=v0.0.12)](https://travis-ci.org/saucelabs/sauce_whisk)
6
7
  [![Dependency Status](https://gemnasium.com/saucelabs/sauce_whisk.svg)](https://gemnasium.com/saucelabs/sauce_whisk)
7
8
 
@@ -9,7 +10,7 @@ SauceWhisk provides an "ActiveRecord" style client for the [Sauce Labs](http://w
9
10
 
10
11
  Add this line to your application's Gemfile:
11
12
 
12
- gem 'sauce_whisk'
13
+ gem 'sauce_whisk', 'Some Version Here'
13
14
 
14
15
  And then execute:
15
16
 
@@ -19,6 +20,8 @@ Or install it yourself as:
19
20
 
20
21
  $ gem install sauce_whisk
21
22
 
23
+ We recommend setting a hard version for now, as the gem is still kinda beta-y.
24
+
22
25
  ## Configuration
23
26
 
24
27
  You'll need a [Sauce Labs account](http://wwww.saucelabs.com/signup). They're free to try and, if you're an open source project, [your access is always free](http://saucelabs.com/opensauce).
@@ -66,7 +69,7 @@ SAUCE_ACCESS_KEY=Your Access Key, found on the lower left of your Account page
66
69
 
67
70
  ### Creating Job Objects
68
71
 
69
- There are two ways to create a Job object.
72
+ There are three ways to create a Job object.
70
73
 
71
74
  ```ruby
72
75
  # Create an 'empty' job (i.e. don't retrieve job details from the API)
@@ -74,9 +77,12 @@ empty_job = SauceWhisk::Job.new job_id
74
77
 
75
78
  # Create a job with details fetched from the API
76
79
  fully_detailed_job = SauceWhisk::Jobs.fetch job_id
80
+
81
+ # Create a job with details fetched from the API, failing if the job is incomplete
82
+ partially_detailed_job = SauceWhisk::Jobs.fetch! job_id
77
83
  ```
78
84
 
79
- Use the first form when you just want a simple way to push details to the API. Use the last form when you want to fetch details from the API.
85
+ Use the first form when you just want a simple way to push details to the API. Use the second form when you want to fetch details from the API, but aren't overly fussy about having complete job information. Use the third form to throw a `SauceWhisk::JobNotComplete` exception when fetching an incomplete job. Jobs that are fetched incomplete will not have screenshots, and may not have videos or logs.
80
86
 
81
87
  NB: It's not possible to create a new job on Sauce Labs' infrastructure with the API.
82
88
 
@@ -96,6 +102,29 @@ job.save
96
102
 
97
103
  It is not possible to alter any other job properties.
98
104
 
105
+ ### Other Job Properties
106
+
107
+ ```ruby
108
+ job = SauceWhisk::Jobs.fetch job_id
109
+ job.id # Sauce job_id
110
+ job.owner # Account name of job's owner
111
+ job.browser # Browser job ran on
112
+ job.browser_verion # Version of Browser
113
+ job.os # OS job ran on
114
+ job.log_url # URL for accessing Job Log
115
+ job.creation_time # When the job was first created
116
+ job.start_time # When the job started running
117
+ job.end_time # When the job finished
118
+ job.video_url # URL for accessing screencast video
119
+ job.screenshot_urls # Array of URLs for accessing screenshots
120
+ job.has_all_asset_names? # True if all asset names were fetched (eg job was complete)
121
+ ```
122
+
123
+ ### Deleting Jobs
124
+ ```ruby
125
+ Jobs.delete_job job_id
126
+ ```
127
+
99
128
  ### Assets
100
129
 
101
130
  There are three types of asset for Sauce Labs jobs: screenshots, video and logs. Assets are represented as an Asset object, which include the name, asset type and data.
@@ -114,6 +143,12 @@ There are three types of asset for Sauce Labs jobs: screenshots, video and logs.
114
143
  video = job.video # A single Asset, holding the video
115
144
  ```
116
145
 
146
+ #### Deleting Assets
147
+
148
+ ```ruby
149
+ SauceWhisk::Assets.delete job_id #==> Deletes all assets for job.
150
+ ```
151
+
117
152
  ### Accounts
118
153
 
119
154
  At the moment, it is only possible to query existing accounts, and create subaccounts.
@@ -254,7 +289,7 @@ You can set a custom logger object, passing anything that responds to puts:
254
289
  SauceWhisk.logger = my_logger
255
290
  ```
256
291
 
257
- SauceWhisk.logger defaults to STDOUT.
292
+ SauceWhisk.logger defaults to STDOUT, at the warn level.
258
293
 
259
294
  ### Storage
260
295
 
@@ -267,7 +302,7 @@ storage = SauceWhisk::Storage.new username: 'my_user_name', key: '00', debug: tr
267
302
  If the environment variables SAUCE_USERNAME and SAUCE_ACCESS_KEY are set then:
268
303
 
269
304
  ```ruby
270
- storage = SauceStorage.new debug: true
305
+ storage = SauceWhisk::Storage.new debug: true
271
306
  ```
272
307
 
273
308
  List all files in storage.
@@ -1,7 +1,16 @@
1
1
  # Major Version 0
2
+
3
+ ### 0.0.14
4
+ * Added `fetch!` to fail when jobs don't fetch assets
5
+ * Made `fetch` succeed in all cases
6
+ * Added retries for all 404s
7
+ * Added `delete` for assets (Thanks, @dmfranko!)
8
+
2
9
  ### 0.0.13
3
10
  * Sauce storage support added (Thanks @bootstraponline)
4
11
  * Various gem build quality fixes (Thanks @bootstraponline)
12
+ * Added `Jobs.delete_job` (Thanks, @seanknox!)
13
+
5
14
  ### 0.0.12
6
15
  * Added additional minute types
7
16
 
@@ -10,6 +19,7 @@
10
19
 
11
20
  ### 0.0.6
12
21
  * Correct RestClient -- Actually require it
22
+
13
23
  ### 0.0.5
14
24
  * Added Sauce class
15
25
 
@@ -8,6 +8,7 @@ require "sauce_whisk/accounts"
8
8
  require "sauce_whisk/storage"
9
9
 
10
10
  require 'yaml'
11
+ require 'logger'
11
12
 
12
13
 
13
14
  module SauceWhisk
@@ -31,6 +32,13 @@ module SauceWhisk
31
32
  return 1
32
33
  end
33
34
 
35
+ def self.rest_retries
36
+ retries = self.load_first_found(:rest_retries)
37
+
38
+ return retries.to_i if retries
39
+ return 1
40
+ end
41
+
34
42
  def self.pass_job(job_id)
35
43
  Jobs.pass_job job_id
36
44
  end
@@ -40,7 +48,7 @@ module SauceWhisk
40
48
  end
41
49
 
42
50
  def self.logger
43
- @logger||= STDOUT
51
+ @logger||= default_logger
44
52
  end
45
53
 
46
54
  def self.public_link(job_id)
@@ -83,4 +91,15 @@ module SauceWhisk
83
91
 
84
92
  return value
85
93
  end
86
- end
94
+
95
+ class JobNotComplete < StandardError
96
+ end
97
+
98
+ private
99
+
100
+ def self.default_logger
101
+ log = ::Logger.new(STDOUT)
102
+ log.level = Logger::WARN
103
+ log
104
+ end
105
+ end
@@ -1,6 +1,9 @@
1
1
  module SauceWhisk
2
2
  class Assets
3
3
  extend RestRequestBuilder
4
+ class << self
5
+ alias_method :rest_delete, :delete
6
+ end
4
7
 
5
8
  def self.resource
6
9
  "#{SauceWhisk.username}/jobs"
@@ -9,23 +12,43 @@ module SauceWhisk
9
12
  def self.fetch(job_id, asset, type=nil)
10
13
  retries ||= SauceWhisk.asset_fetch_retries
11
14
  attempts ||= 1
15
+
12
16
  data = get "#{job_id}/assets/#{asset}"
13
17
  Asset.new({:name => asset, :data => data, :job_id => job_id, :type => type})
14
18
  rescue RestClient::ResourceNotFound => e
15
19
  if attempts <= retries
16
20
  attempts += 1
17
21
  sleep(5)
18
- retry
22
+ retry
19
23
  else
20
24
  raise e
21
25
  end
22
26
  end
27
+
28
+ def self.delete(job_id)
29
+ retries ||= SauceWhisk.asset_fetch_retries
30
+ attempts ||= 1
31
+
32
+ data = rest_delete "#{job_id}/assets/"
33
+ Asset.new({:data => data,:job_id => job_id})
34
+ rescue RestClient::ResourceNotFound => e
35
+ if attempts <= retries
36
+ attempts += 1
37
+ sleep(5)
38
+ retry
39
+ else
40
+ raise e
41
+ end
42
+
43
+ # Return nil as all of the assets we're already deleted.
44
+ rescue RestClient::BadRequest => e
45
+ nil
46
+ end
23
47
  end
24
48
 
25
49
  class Asset
26
50
 
27
51
  attr_reader :asset_type, :name, :data, :job
28
-
29
52
  def initialize(parameters={})
30
53
  @asset_type = parameters[:type] || :screenshot
31
54
  @name = parameters[:name]
@@ -38,20 +38,41 @@ module SauceWhisk
38
38
 
39
39
  def self.fetch(job_id)
40
40
  job_hash = JSON.parse(get job_id)
41
- assets = JSON.parse get "#{job_id}/assets"
42
- screenshots = assets["screenshots"]
41
+ assets = job_assets job_id
42
+ job_hash.merge! assets
43
+ rescue SauceWhisk::JobNotComplete
44
+ # Always succeed
45
+ ensure
46
+ return Job.new(job_hash)
47
+ end
43
48
 
44
- job_hash.merge!({"screenshot_urls" => screenshots})
45
- Job.new(job_hash)
49
+ def self.fetch!(job_id)
50
+ job_hash = JSON.parse(get job_id)
51
+ assets = job_assets job_id
52
+ job_hash.merge! assets
53
+ Job.new job_hash
46
54
  end
47
55
 
48
56
  def self.stop(job_id)
49
57
  put "#{job_id}/stop", {}
50
58
  end
51
59
 
60
+ def self.delete_job(job_id)
61
+ delete "#{job_id}"
62
+ end
63
+
52
64
  def self.fetch_asset(job_id, asset)
53
65
  asset = get "#{job_id}/assets/#{asset}"
54
66
  end
67
+
68
+ def self.job_assets(job_id)
69
+ assets = JSON.parse get "#{job_id}/assets"
70
+ screenshots = assets["screenshots"]
71
+
72
+ {"screenshot_urls" => screenshots}
73
+ rescue RestClient::BadRequest
74
+ raise SauceWhisk::JobNotComplete
75
+ end
55
76
  end
56
77
 
57
78
  class Job
@@ -99,12 +120,20 @@ module SauceWhisk
99
120
  Jobs.stop id
100
121
  end
101
122
 
123
+ def delete
124
+ Jobs.delete_job id
125
+ end
126
+
127
+ def has_all_asset_names?
128
+ !screenshot_urls.nil?
129
+ end
130
+
102
131
  def updated_fields
103
132
  @updated_fields ||= []
104
133
  end
105
134
 
106
135
  def screenshots
107
- unless @screenshots
136
+ unless @screenshots || screenshot_urls.nil?
108
137
  @screenshots = screenshot_urls.map do |screenshot|
109
138
  Assets.fetch id, screenshot
110
139
  end
@@ -121,4 +150,4 @@ module SauceWhisk
121
150
  @video
122
151
  end
123
152
  end
124
- end
153
+ end
@@ -6,7 +6,7 @@ module SauceWhisk
6
6
  def get(resource_to_fetch=nil)
7
7
  resource_url = fully_qualified_resource
8
8
  resource_url << "/#{resource_to_fetch}" if resource_to_fetch
9
- RestClient::Request.execute({:method => :get, :url => resource_url}.merge auth_details)
9
+ make_request({:method => :get, :url => resource_url}.merge auth_details)
10
10
  end
11
11
 
12
12
  def put(resource_id, body={})
@@ -20,12 +20,12 @@ module SauceWhisk
20
20
  :content_type => "application/json",
21
21
  :headers => headers
22
22
  }
23
- RestClient::Request.execute(req_params.merge auth_details)
23
+ make_request(req_params.merge auth_details)
24
24
  end
25
25
 
26
26
  def delete(resource_id)
27
27
  resource_to_delete = fully_qualified_resource << "/#{resource_id}"
28
- RestClient::Request.execute({:method => :delete, :url => resource_to_delete}.merge auth_details)
28
+ make_request({:method => :delete, :url => resource_to_delete}.merge auth_details)
29
29
  end
30
30
 
31
31
  def post(opts)
@@ -46,8 +46,23 @@ module SauceWhisk
46
46
 
47
47
  req_params.merge!({:payload => payload}) unless payload.nil?
48
48
 
49
- RestClient::Request.execute(req_params.merge auth_details)
49
+ make_request(req_params.merge auth_details)
50
+ end
51
+
52
+ def make_request(req_params)
53
+ SauceWhisk.logger.debug "Performing Request: \n#{req_params}"
54
+ request_from_rest_client req_params
55
+ end
50
56
 
57
+ def request_from_rest_client(req_params)
58
+ tries ||= SauceWhisk.rest_retries
59
+ RestClient::Request.execute(req_params)
60
+ rescue RestClient::ResourceNotFound => e
61
+ if (tries -= 1) > 0
62
+ retry
63
+ else
64
+ raise e
65
+ end
51
66
  end
52
67
 
53
68
  def auth_details
@@ -1,3 +1,3 @@
1
1
  module SauceWhisk
2
- VERSION = "0.0.13"
2
+ VERSION = "0.0.14"
3
3
  end
@@ -19,10 +19,10 @@ Gem::Specification.new do |gem|
19
19
 
20
20
  gem.license = 'MIT'
21
21
 
22
- gem.add_runtime_dependency 'rest-client', '~> 1.6.7'
22
+ gem.add_runtime_dependency 'rest-client', '~> 1.7.1'
23
23
  gem.add_runtime_dependency 'json', '~> 1.8.1'
24
24
  gem.add_development_dependency 'vcr', '~> 2.9.0'
25
- gem.add_development_dependency 'webmock', '~> 1.17.4'
26
- gem.add_development_dependency 'rspec', '~> 2.14.1'
27
- gem.add_development_dependency 'rake', '~> 10.2.2'
25
+ gem.add_development_dependency 'webmock', '~> 1.18.0'
26
+ gem.add_development_dependency 'rspec', '~> 3.0.0'
27
+ gem.add_development_dependency 'rake', '~> 10.3.2'
28
28
  end
@@ -8,7 +8,7 @@ http_interactions:
8
8
  string: ''
9
9
  headers:
10
10
  Accept:
11
- - '*/*; q=0.5, application/xml'
11
+ - "*/*; q=0.5, application/xml"
12
12
  Accept-Encoding:
13
13
  - gzip, deflate
14
14
  User-Agent:
@@ -24735,7 +24735,7 @@ http_interactions:
24735
24735
  string: ''
24736
24736
  headers:
24737
24737
  Accept:
24738
- - '*/*; q=0.5, application/xml'
24738
+ - "*/*; q=0.5, application/xml"
24739
24739
  Accept-Encoding:
24740
24740
  - gzip, deflate
24741
24741
  User-Agent:
@@ -24785,7 +24785,7 @@ http_interactions:
24785
24785
  string: ''
24786
24786
  headers:
24787
24787
  Accept:
24788
- - '*/*; q=0.5, application/xml'
24788
+ - "*/*; q=0.5, application/xml"
24789
24789
  Accept-Encoding:
24790
24790
  - gzip, deflate
24791
24791
  User-Agent:
@@ -24831,7 +24831,7 @@ http_interactions:
24831
24831
  string: ''
24832
24832
  headers:
24833
24833
  Accept:
24834
- - '*/*; q=0.5, application/xml'
24834
+ - "*/*; q=0.5, application/xml"
24835
24835
  Accept-Encoding:
24836
24836
  - gzip, deflate
24837
24837
  User-Agent:
@@ -49563,7 +49563,7 @@ http_interactions:
49563
49563
  string: ''
49564
49564
  headers:
49565
49565
  Accept:
49566
- - '*/*; q=0.5, application/xml'
49566
+ - "*/*; q=0.5, application/xml"
49567
49567
  Accept-Encoding:
49568
49568
  - gzip, deflate
49569
49569
  User-Agent:
@@ -74291,7 +74291,7 @@ http_interactions:
74291
74291
  string: ''
74292
74292
  headers:
74293
74293
  Accept:
74294
- - '*/*; q=0.5, application/xml'
74294
+ - "*/*; q=0.5, application/xml"
74295
74295
  Accept-Encoding:
74296
74296
  - gzip, deflate
74297
74297
  User-Agent:
@@ -99020,7 +99020,7 @@ http_interactions:
99020
99020
  string: ''
99021
99021
  headers:
99022
99022
  Accept:
99023
- - '*/*; q=0.5, application/xml'
99023
+ - "*/*; q=0.5, application/xml"
99024
99024
  Accept-Encoding:
99025
99025
  - gzip, deflate
99026
99026
  User-Agent:
@@ -161346,7 +161346,7 @@ http_interactions:
161346
161346
  string: ''
161347
161347
  headers:
161348
161348
  Accept:
161349
- - '*/*; q=0.5, application/xml'
161349
+ - "*/*; q=0.5, application/xml"
161350
161350
  Accept-Encoding:
161351
161351
  - gzip, deflate
161352
161352
  User-Agent:
@@ -161381,45 +161381,7 @@ http_interactions:
161381
161381
  - '22'
161382
161382
  body:
161383
161383
  encoding: US-ASCII
161384
- string: &1 !ruby/string
161385
- str: '{"error": "Not Found"}'
161386
- net_http_res: !ruby/object:Net::HTTPNotFound
161387
- http_version: '1.0'
161388
- code: '404'
161389
- message: Not Found
161390
- header:
161391
- server:
161392
- - nginx/0.7.62
161393
- date:
161394
- - Mon, 13 Jan 2014 23:10:28 GMT
161395
- content-type:
161396
- - application/json
161397
- connection:
161398
- - keep-alive
161399
- pragma:
161400
- - no-cache
161401
- cache-control:
161402
- - no-cache
161403
- x-frame-options:
161404
- - DENY
161405
- set-cookie:
161406
- - csrf_token=6ea50a1163294346d6d23151fa87a69a; expires="Mon, 13-Jan-2014
161407
- 23:23:23 GMT"; Max-Age=600; Path=/
161408
- - metrics=b3682a1e55dcd7afdcc4f0ecdbd2a4697766b9206a770d1e40274dd19d01b27c8096a15a;
161409
- Path=/
161410
- - metrics=f01e5f3d38f6a178ed8a2219738d06831e026cbcd5b16625602b4ddf96cb3d7202c93963;
161411
- Path=/
161412
- content-length:
161413
- - '22'
161414
- body: *1
161415
- read: true
161416
- __read_body_previously_called: true
161417
- args:
161418
- :method: :get
161419
- :url: https://saucelabs.com/rest/v1/<SAUCE_USERNAME>/jobs/aaaaaaaaaaaaaaaa/assets/0000screenshot.png
161420
- :user: <SAUCE_USERNAME>
161421
- :password: 8f5210dd-f0cf-477f-b720-9f721a9679a4
161422
- code: 404
161384
+ string: '{"error": "Not Found"}'
161423
161385
  http_version:
161424
161386
  recorded_at: Mon, 13 Jan 2014 23:13:23 GMT
161425
161387
  - request:
@@ -161430,7 +161392,7 @@ http_interactions:
161430
161392
  string: ''
161431
161393
  headers:
161432
161394
  Accept:
161433
- - '*/*; q=0.5, application/xml'
161395
+ - "*/*; q=0.5, application/xml"
161434
161396
  Accept-Encoding:
161435
161397
  - gzip, deflate
161436
161398
  User-Agent:
@@ -161476,7 +161438,7 @@ http_interactions:
161476
161438
  string: ''
161477
161439
  headers:
161478
161440
  Accept:
161479
- - '*/*; q=0.5, application/xml'
161441
+ - "*/*; q=0.5, application/xml"
161480
161442
  Accept-Encoding:
161481
161443
  - gzip, deflate
161482
161444
  User-Agent:
@@ -186203,7 +186165,7 @@ http_interactions:
186203
186165
  string: ''
186204
186166
  headers:
186205
186167
  Accept:
186206
- - '*/*; q=0.5, application/xml'
186168
+ - "*/*; q=0.5, application/xml"
186207
186169
  Accept-Encoding:
186208
186170
  - gzip, deflate
186209
186171
  User-Agent:
@@ -186253,7 +186215,7 @@ http_interactions:
186253
186215
  string: ''
186254
186216
  headers:
186255
186217
  Accept:
186256
- - '*/*; q=0.5, application/xml'
186218
+ - "*/*; q=0.5, application/xml"
186257
186219
  Accept-Encoding:
186258
186220
  - gzip, deflate
186259
186221
  User-Agent:
@@ -186299,7 +186261,7 @@ http_interactions:
186299
186261
  string: ''
186300
186262
  headers:
186301
186263
  Accept:
186302
- - '*/*; q=0.5, application/xml'
186264
+ - "*/*; q=0.5, application/xml"
186303
186265
  Accept-Encoding:
186304
186266
  - gzip, deflate
186305
186267
  User-Agent:
@@ -211031,7 +210993,7 @@ http_interactions:
211031
210993
  string: ''
211032
210994
  headers:
211033
210995
  Accept:
211034
- - '*/*; q=0.5, application/xml'
210996
+ - "*/*; q=0.5, application/xml"
211035
210997
  Accept-Encoding:
211036
210998
  - gzip, deflate
211037
210999
  User-Agent:
@@ -235759,7 +235721,7 @@ http_interactions:
235759
235721
  string: ''
235760
235722
  headers:
235761
235723
  Accept:
235762
- - '*/*; q=0.5, application/xml'
235724
+ - "*/*; q=0.5, application/xml"
235763
235725
  Accept-Encoding:
235764
235726
  - gzip, deflate
235765
235727
  User-Agent:
@@ -260488,7 +260450,7 @@ http_interactions:
260488
260450
  string: ''
260489
260451
  headers:
260490
260452
  Accept:
260491
- - '*/*; q=0.5, application/xml'
260453
+ - "*/*; q=0.5, application/xml"
260492
260454
  Accept-Encoding:
260493
260455
  - gzip, deflate
260494
260456
  User-Agent:
@@ -322814,7 +322776,7 @@ http_interactions:
322814
322776
  string: ''
322815
322777
  headers:
322816
322778
  Accept:
322817
- - '*/*; q=0.5, application/xml'
322779
+ - "*/*; q=0.5, application/xml"
322818
322780
  Accept-Encoding:
322819
322781
  - gzip, deflate
322820
322782
  User-Agent:
@@ -322852,4 +322814,190 @@ http_interactions:
322852
322814
  string: '{"error": "Not Found"}'
322853
322815
  http_version:
322854
322816
  recorded_at: Tue, 14 Jan 2014 04:56:06 GMT
322855
- recorded_with: VCR 2.5.0
322817
+ - request:
322818
+ method: delete
322819
+ uri: https://<SAUCE_USERNAME>:<SAUCE_ACCESS_KEY>@saucelabs.com/rest/v1/<SAUCE_USERNAME>/jobs/f7bcec8f706f4910ba128f48e0b8c6c7/assets/
322820
+ body:
322821
+ encoding: US-ASCII
322822
+ string: ''
322823
+ headers:
322824
+ Accept:
322825
+ - "*/*; q=0.5, application/xml"
322826
+ Accept-Encoding:
322827
+ - gzip, deflate
322828
+ User-Agent:
322829
+ - Ruby
322830
+ response:
322831
+ status:
322832
+ code: 200
322833
+ message: OK
322834
+ headers:
322835
+ Server:
322836
+ - nginx
322837
+ Date:
322838
+ - Fri, 13 Jun 2014 20:52:15 GMT
322839
+ Content-Type:
322840
+ - application/json
322841
+ Transfer-Encoding:
322842
+ - chunked
322843
+ Connection:
322844
+ - keep-alive
322845
+ Pragma:
322846
+ - no-cache
322847
+ Cache-Control:
322848
+ - no-cache
322849
+ X-Frame-Options:
322850
+ - DENY
322851
+ Set-Cookie:
322852
+ - csrf_token=c1292391c88e8976876760e761641641; expires="Fri, 13-Jun-2014 21:02:12
322853
+ GMT"; Max-Age=600; Path=/
322854
+ - metrics=12fa0dcffc765cf1bf6b827361fb0d686210c418212d8f0ab9774db98604d70a9b0f9a75;
322855
+ Path=/
322856
+ X-Backend:
322857
+ - mix
322858
+ Content-Encoding:
322859
+ - gzip
322860
+ body:
322861
+ encoding: ASCII-8BIT
322862
+ string: !binary |-
322863
+ H4sIAAAAAAAAA32V3VICMQxGX4XhWnean7bpszBc6Yo4CA6rPL9FTcT5Ou4l
322864
+ Z9MmhyS72axTf5aH8zwfl+fT+/R23K3vViWnnLZ3qy9MiMWIHTNiJTHHMsDM
322865
+ xbEOsGRxnAd3SwtcAFdOhch5HXBqOXI34GqUIrwhbil77oTeOlaPJvSmjYpr
322866
+ JfRGXWZ4JRRnPTrCUZyllppjFGcsEoejuGZm2TF6y6nlOBy15VJSdYzaihVx
322867
+ zCNtJf5yRm23hzNqy8bqhTFay8xRGKO1fnf0C6O1fjdFamjtT2ForahapIbW
322868
+ jGtTxyNrLeZIBkPaG9lTE7Rm1MTrFrRmSlGYDHrtFg+sWeFIDa3V3umB0Zo1
322869
+ bu5c0JpwrpE5Wqu9Ab0VBa1RTyiWlw60XQfB8f/adKitRvRQ2y9GbVKteeqK
322870
+ 2noviveDjnabxfrQgTa1WF060MYscfdIW0mxWDNqu+GH0256WU7H/iv3D0X9
322871
+ XojLfJiP+4/X+2U+X+bz1N+6zk8fyZ+kL/vH+TQ9HS7X06zrsVK3208F4+rM
322872
+ gwYAAA==
322873
+ http_version:
322874
+ recorded_at: Fri, 13 Jun 2014 20:52:15 GMT
322875
+ - request:
322876
+ method: delete
322877
+ uri: https://<SAUCE_USERNAME>:<SAUCE_ACCESS_KEY>@saucelabs.com/rest/v1/<SAUCE_USERNAME>/jobs/651c7d737b7547e994678d981dcc433c/assets/
322878
+ body:
322879
+ encoding: US-ASCII
322880
+ string: ''
322881
+ headers:
322882
+ Accept:
322883
+ - "*/*; q=0.5, application/xml"
322884
+ Accept-Encoding:
322885
+ - gzip, deflate
322886
+ User-Agent:
322887
+ - Ruby
322888
+ response:
322889
+ status:
322890
+ code: 200
322891
+ message: OK
322892
+ headers:
322893
+ Server:
322894
+ - nginx
322895
+ Date:
322896
+ - Fri, 13 Jun 2014 20:55:27 GMT
322897
+ Content-Type:
322898
+ - application/json
322899
+ Connection:
322900
+ - keep-alive
322901
+ Pragma:
322902
+ - no-cache
322903
+ Cache-Control:
322904
+ - no-cache
322905
+ X-Frame-Options:
322906
+ - DENY
322907
+ Set-Cookie:
322908
+ - csrf_token=6f3ba9b18daba6a999f7d0c4f047968c; expires="Fri, 13-Jun-2014 21:05:26
322909
+ GMT"; Max-Age=600; Path=/
322910
+ - metrics=306cb83bf24e32b33b1299c117e92e7c32ab3862a40496101b2b42828a66f29bd67b89e3;
322911
+ Path=/
322912
+ Content-Length:
322913
+ - '242'
322914
+ X-Backend:
322915
+ - mix
322916
+ body:
322917
+ encoding: UTF-8
322918
+ string: '[["0000screenshot.png", 65457], ["0001screenshot.png", 54411], ["0002screenshot.png",
322919
+ 58764], ["0003screenshot.png", 37685], ["0004screenshot.png", 59464], ["0005screenshot.png",
322920
+ 59464], ["automator.log", 506], ["selenium-server.log", 11401]]'
322921
+ http_version:
322922
+ recorded_at: Fri, 13 Jun 2014 20:55:28 GMT
322923
+ - request:
322924
+ method: get
322925
+ uri: https://<SAUCE_USERNAME>:<SAUCE_ACCESS_KEY>@saucelabs.com/rest/v1/<SAUCE_USERNAME>/jobs/1ca64b180cfa40e0a4aee5a4a482f271/assets
322926
+ body:
322927
+ encoding: US-ASCII
322928
+ string: ''
322929
+ headers:
322930
+ Accept:
322931
+ - "*/*; q=0.5, application/xml"
322932
+ Accept-Encoding:
322933
+ - gzip, deflate
322934
+ User-Agent:
322935
+ - Ruby
322936
+ response:
322937
+ status:
322938
+ code: 400
322939
+ message: Bad Request
322940
+ headers:
322941
+ Server:
322942
+ - nginx
322943
+ Date:
322944
+ - Fri, 11 Jul 2014 04:54:09 GMT
322945
+ Content-Type:
322946
+ - application/json
322947
+ Transfer-Encoding:
322948
+ - chunked
322949
+ Connection:
322950
+ - keep-alive
322951
+ body:
322952
+ encoding: US-ASCII
322953
+ string: |
322954
+ "Job hasn't finished running"
322955
+ http_version:
322956
+ recorded_at: Fri, 11 Jul 2014 04:53:50 GMT
322957
+ - request:
322958
+ method: get
322959
+ uri: https://<SAUCE_USERNAME>:<SAUCE_ACCESS_KEY>@saucelabs.com/rest/v1/<SAUCE_USERNAME>/jobs/1ca64b180cfa40e0a4aee5a4a482f271
322960
+ body:
322961
+ encoding: US-ASCII
322962
+ string: ''
322963
+ headers:
322964
+ Accept:
322965
+ - "*/*; q=0.5, application/xml"
322966
+ Accept-Encoding:
322967
+ - gzip, deflate
322968
+ User-Agent:
322969
+ - Ruby
322970
+ response:
322971
+ status:
322972
+ code: 200
322973
+ message: OK
322974
+ headers:
322975
+ Server:
322976
+ - nginx
322977
+ Date:
322978
+ - Fri, 11 Jul 2014 09:27:57 GMT
322979
+ Content-Type:
322980
+ - application/json
322981
+ Transfer-Encoding:
322982
+ - chunked
322983
+ Connection:
322984
+ - keep-alive
322985
+ X-Backend:
322986
+ - mix
322987
+ Content-Encoding:
322988
+ - gzip
322989
+ body:
322990
+ encoding: ASCII-8BIT
322991
+ string: !binary |-
322992
+ H4sIAAAAAAAAA61Sy07kMBC88xVWzkweKAMDNz6AE+KAEIo6dmfGu447crcH
322993
+ 0Gr/HXd2VzPishcOseSqVj3a+VWNid4Y08AHSjIcMbGnWN2Z6qa6NNXRO6Qh
322994
+ p6DIQWThu6YBZhSuGbLFACPXlubmB43cdBau+7HbtXaCvsUWekDclrPfXU1X
322995
+ N12z6tVTOKq4TQhS3AbxMxaDrm+37bbvu52SmYXmjQOBQsUcQgH/hT2PWbe1
322996
+ itFbxKSA+wgQQdZ0Snin6P+S6WSg/TdWZQwYfZ43JXDJWxd1NRmzD+7UaFEH
322997
+ vUvKqPc8Bm9PPAtIZo1UnJeAsnYS2Cv28vpnojzc1xXeqlaid7+KTxBY1YvG
322998
+ DNHxEEkGztYi85S18bawEVaN6plyMk8ltrnfYxTzeKAcnBnRlGUYsJaS83Fv
322999
+ hIwc0CwJNylHzVXEM4QzQ4zuS7TyKZ4SpVNLWhs+gDVdW9+uayr/xs+FfBQ8
323000
+ 29bf99dhhgmSr35ffAJrf/AcwwIAAA==
323001
+ http_version:
323002
+ recorded_at: Fri, 11 Jul 2014 09:27:34 GMT
323003
+ recorded_with: VCR 2.9.2