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 +4 -4
- data/.travis.yml +1 -0
- data/Gemfile +3 -2
- data/README.md +40 -5
- data/changelog.markdown +10 -0
- data/lib/sauce_whisk.rb +21 -2
- data/lib/sauce_whisk/assets.rb +25 -2
- data/lib/sauce_whisk/jobs.rb +35 -6
- data/lib/sauce_whisk/rest_request_builder.rb +19 -4
- data/lib/sauce_whisk/version.rb +1 -1
- data/sauce_whisk.gemspec +4 -4
- data/spec/fixtures/vcr_cassettes/assets.yml +205 -57
- data/spec/fixtures/vcr_cassettes/info.yml +131 -5
- data/spec/fixtures/vcr_cassettes/jobs.yml +130 -10
- data/spec/lib/sauce_whisk/account_spec.rb +8 -8
- data/spec/lib/sauce_whisk/accounts_spec.rb +8 -8
- data/spec/lib/sauce_whisk/asset_spec.rb +5 -5
- data/spec/lib/sauce_whisk/assets_spec.rb +18 -3
- data/spec/lib/sauce_whisk/info_spec.rb +5 -5
- data/spec/lib/sauce_whisk/job_spec.rb +32 -18
- data/spec/lib/sauce_whisk/jobs_spec.rb +46 -10
- data/spec/lib/sauce_whisk/rest_request_builder_spec.rb +41 -18
- data/spec/lib/sauce_whisk/sauce_whisk_spec.rb +25 -6
- data/spec/lib/sauce_whisk/subaccounts_spec.rb +2 -2
- data/spec/lib/sauce_whisk/tunnel_spec.rb +6 -6
- data/spec/lib/sauce_whisk/tunnels_spec.rb +9 -9
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4bf448319c0803865a31b54bfafcb93352cce5d1
|
4
|
+
data.tar.gz: db2ca1732b5b4f77bbd6a4ac09dde89d1207c49f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98c4e3050d83593799e9fb790601c8f2c703bf3da16aaaa2e6b7063e7b8da1e824cdb4b8335f5e3d4866d5deb78825b549da2d41ce78b94d15fa705498753a1d
|
7
|
+
data.tar.gz: 748b08420eb38e8d72f3ad227e8524260367fa8a6f7ef98ce6ba3e1d4aba3158e59c360ea8d888a629403e40e6a7ce5ecf56c40b4d450f198aa92d58a30dbbc7
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
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
|
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
|
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 =
|
305
|
+
storage = SauceWhisk::Storage.new debug: true
|
271
306
|
```
|
272
307
|
|
273
308
|
List all files in storage.
|
data/changelog.markdown
CHANGED
@@ -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
|
|
data/lib/sauce_whisk.rb
CHANGED
@@ -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||=
|
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
|
-
|
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
|
data/lib/sauce_whisk/assets.rb
CHANGED
@@ -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
|
-
|
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]
|
data/lib/sauce_whisk/jobs.rb
CHANGED
@@ -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 =
|
42
|
-
|
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
|
-
|
45
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/sauce_whisk/version.rb
CHANGED
data/sauce_whisk.gemspec
CHANGED
@@ -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.
|
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.
|
26
|
-
gem.add_development_dependency 'rspec', '~>
|
27
|
-
gem.add_development_dependency 'rake', '~> 10.
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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:
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
|
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
|