sauce_rspec 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -0
- data/lib/sauce_rspec/config.rb +25 -2
- data/lib/sauce_rspec/{jenkins.rb → sauce_rspec.rb} +44 -35
- data/lib/sauce_rspec/version.rb +2 -2
- data/lib/sauce_rspec.rb +9 -1
- data/release_notes.md +11 -0
- data/sauce_rspec.gemspec +4 -1
- metadata +48 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7d1ebc7fdc156c5ea51d76d7f8526fd298e2a38
|
4
|
+
data.tar.gz: 9dd34789cebaf4884e7b3e02374b42e568a987d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f58071d081f0afa8851721a5e4b68b7838024493b70640036d5da04d1668d4c62a35440265786d93420334e48980e428b3165fe8ab4f7aa93fe81d41c6e430a
|
7
|
+
data.tar.gz: 59a6c65ccd5218416238a4d61bbc1c3e2758f6ce097e400feb4794eadeabef2285f96e471a35c5d2498627c5b5a27a87807579659da074b255dab11cb42838ba
|
data/.rubocop.yml
CHANGED
data/lib/sauce_rspec/config.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module SauceRSpec
|
2
2
|
class Config
|
3
|
-
attr_reader :caps
|
3
|
+
attr_reader :caps, :concurrency_timeout
|
4
4
|
attr_accessor :opts, :user, :key, :host, :port
|
5
5
|
|
6
6
|
public
|
@@ -18,6 +18,11 @@ module SauceRSpec
|
|
18
18
|
"http://#{user}:#{key}@#{host}:#{port}/wd/hub"
|
19
19
|
end
|
20
20
|
|
21
|
+
def concurrency_timeout= value
|
22
|
+
fail 'concurrency_timeout must be a numeric' unless value.is_a?(Numeric)
|
23
|
+
@concurrency_timeout = value
|
24
|
+
end
|
25
|
+
|
21
26
|
def caps= value
|
22
27
|
fail 'caps must be an array' unless value && value.is_a?(Array)
|
23
28
|
@caps = value
|
@@ -44,7 +49,7 @@ module SauceRSpec
|
|
44
49
|
# caps and opts aren't required to run on sauce because the user may
|
45
50
|
# provide the caps outside of the SauceRSpec config.
|
46
51
|
def sauce?
|
47
|
-
@user && @key && @host && @port
|
52
|
+
!!(@user && @key && @host && @port)
|
48
53
|
end
|
49
54
|
|
50
55
|
def to_h
|
@@ -65,6 +70,24 @@ module SauceRSpec
|
|
65
70
|
def config &block
|
66
71
|
return @config unless block_given?
|
67
72
|
block.call @config
|
73
|
+
|
74
|
+
# Set test-queue-split workers to the Sauce concurrency limit by default
|
75
|
+
test_queue_workers = 'TEST_QUEUE_WORKERS'
|
76
|
+
if SauceRSpec.config.sauce? && (!ENV[test_queue_workers] || ENV[test_queue_workers].empty?)
|
77
|
+
user = SauceRSpec.config.user
|
78
|
+
hurley_client = SauceRSpec.hurley_client
|
79
|
+
concurrency_url = "users/#{user}/concurrency"
|
80
|
+
concurrency_timeout = SauceRSpec.config.concurrency_timeout || 2 * 60
|
81
|
+
|
82
|
+
wait_true(concurrency_timeout) do
|
83
|
+
body = hurley_client.get(concurrency_url).body
|
84
|
+
concurrency = body['concurrency'][user]['remaining']['overall'] rescue false
|
85
|
+
ENV[test_queue_workers] = concurrency.to_s if concurrency
|
86
|
+
|
87
|
+
concurrency ? true : fail(body)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
68
91
|
@config
|
69
92
|
end
|
70
93
|
end # class << self
|
@@ -1,11 +1,13 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'curb'
|
3
|
-
require 'json'
|
4
|
-
|
5
1
|
module SauceRSpec
|
6
2
|
class << self
|
7
3
|
attr_reader :driver
|
8
4
|
|
5
|
+
MUTEX = Mutex.new
|
6
|
+
# from: https://github.com/lostisland/hurley/blob/b61f4c96bcfa4fcd51c6718bc05f13e1c2ba01e6/lib/hurley.rb#L17
|
7
|
+
def mutex
|
8
|
+
MUTEX.synchronize(&Proc.new)
|
9
|
+
end
|
10
|
+
|
9
11
|
# Fully initialized Selenium Webdriver.
|
10
12
|
def driver= driver
|
11
13
|
fail 'Driver must not be nil' unless driver
|
@@ -57,44 +59,51 @@ module SauceRSpec
|
|
57
59
|
caps
|
58
60
|
end
|
59
61
|
|
60
|
-
|
62
|
+
def hurley_client
|
63
|
+
mutex do
|
64
|
+
return @hurley_client if @hurley_client
|
65
|
+
client = @hurley_client = Hurley::Client.new 'https://saucelabs.com/rest/v1/'
|
66
|
+
client.header[:content_type] = 'application/json'
|
67
|
+
client.request_options.timeout = 2 * 60
|
68
|
+
client.request_options.open_timeout = 2 * 60
|
69
|
+
|
70
|
+
config = SauceRSpec.config
|
71
|
+
client.url.user = config.user
|
72
|
+
client.url.password = config.key
|
73
|
+
|
74
|
+
# Ensure body JSON string is parsed into a hash
|
75
|
+
# Detect errors and fail so wait_true will retry the request
|
76
|
+
client.after_call do |response|
|
77
|
+
response.body = Oj.load(response.body) rescue {}
|
78
|
+
|
79
|
+
client_server_error = %i(client_error server_error).include? response.status_type
|
80
|
+
body_error = response.body['error']
|
81
|
+
|
82
|
+
if client_server_error || body_error
|
83
|
+
response_error = body_error || ''
|
84
|
+
fail(::Errno::ECONNREFUSED, response_error)
|
85
|
+
end
|
86
|
+
end
|
61
87
|
|
62
|
-
|
88
|
+
@hurley_client
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
63
93
|
|
64
94
|
# @param timeout <Integer> timeout in seconds to wait for sauce labs response
|
65
95
|
def update_job_status_on_sauce timeout
|
96
|
+
# PUT https://saucelabs.com/rest/v1/:username/jobs/:job_id
|
66
97
|
# https://docs.saucelabs.com/reference/rest-api/#update-job
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
request = Curl::Easy.new('')
|
74
|
-
request.http_auth_types = :basic
|
75
|
-
request.username = user
|
76
|
-
request.password = key
|
77
|
-
|
78
|
-
@update_job = request
|
79
|
-
end
|
80
|
-
|
81
|
-
passed = RSpec.current_example.exception.nil?
|
82
|
-
passed = { passed: passed }
|
83
|
-
url = "https://saucelabs.com/rest/v1/#{user}/jobs/#{driver.session_id}"
|
84
|
-
|
85
|
-
update_job.url = url
|
98
|
+
user = SauceRSpec.config.user
|
99
|
+
passed = RSpec.current_example.exception.nil?
|
100
|
+
passed = { passed: passed }
|
101
|
+
passed_json = Oj.dump(passed)
|
102
|
+
update_job_url = "#{user}/jobs/#{driver.session_id}"
|
86
103
|
|
87
104
|
wait_true(timeout) do
|
88
|
-
|
89
|
-
|
90
|
-
response_passed = response['passed']
|
91
|
-
response_error = response['error'] || ''
|
92
|
-
|
93
|
-
if response_error.include? 'Not authorized'
|
94
|
-
fail(::Errno::ECONNREFUSED, response_error)
|
95
|
-
end
|
96
|
-
|
97
|
-
response_passed == passed[:passed] ? true : fail(response)
|
105
|
+
body = hurley_client.put(update_job_url, passed_json).body
|
106
|
+
body['passed'] == passed[:passed] ? true : fail(body)
|
98
107
|
end
|
99
108
|
end
|
100
109
|
|
data/lib/sauce_rspec/version.rb
CHANGED
data/lib/sauce_rspec.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
require 'oj'
|
3
|
+
# Ensure Hash symbols are serialized as JSON strings
|
4
|
+
# {:passed=>true} => "{\"passed\":true}" not "{\":passed\":true}"
|
5
|
+
Oj.default_options = { mode: :compat }
|
6
|
+
|
2
7
|
require 'webdriver_utils'
|
8
|
+
require 'addressable/uri'
|
9
|
+
require 'hurley'
|
10
|
+
require 'hurley/addressable'
|
3
11
|
|
4
12
|
require_relative 'sauce_rspec/version'
|
5
13
|
require_relative 'sauce_rspec/config'
|
6
|
-
require_relative 'sauce_rspec/
|
14
|
+
require_relative 'sauce_rspec/sauce_rspec'
|
data/release_notes.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
#### v1.0.2 2015-10-12
|
2
|
+
|
3
|
+
- [21b3df0](https://github.com/bootstraponline/sauce_rspec/commit/21b3df0b6042fc93a2426522213b0bfdd4902db7) Release 1.0.2
|
4
|
+
- [d21bd01](https://github.com/bootstraponline/sauce_rspec/commit/d21bd01bafff4cfd8a87469094ad7b53998b9130) Fix thor cop and thor spec
|
5
|
+
- [25504d1](https://github.com/bootstraponline/sauce_rspec/commit/25504d1d13d3da96445e80c4009083ee43ae34d1) Fix Oj.dump
|
6
|
+
- [780496e](https://github.com/bootstraponline/sauce_rspec/commit/780496e1547bad10fe55e3bdba7624cfb0f6183a) Use hurely for HTTP instead of curb
|
7
|
+
- [3ac6a7c](https://github.com/bootstraponline/sauce_rspec/commit/3ac6a7c106bedd8669be4b9b730280c3b9e9fd77) Create a new Curl::Easy object each time
|
8
|
+
- [03ddc81](https://github.com/bootstraponline/sauce_rspec/commit/03ddc81a6a0a1d5d3b36a61f34210e3ebfcb5d6f) Clean up Sauce API code
|
9
|
+
- [7bc7a24](https://github.com/bootstraponline/sauce_rspec/commit/7bc7a24a06c60ee874b8f360b87598544d0fe891) Add concurrency detection. Fix 401 check
|
10
|
+
|
11
|
+
|
1
12
|
#### v1.0.1 2015-10-08
|
2
13
|
|
3
14
|
- [52bcf9f](https://github.com/bootstraponline/sauce_rspec/commit/52bcf9fd9dc970122a42fb7eb407de2a9ff37db5) Release 1.0.1
|
data/sauce_rspec.gemspec
CHANGED
@@ -21,7 +21,9 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_runtime_dependency 'webdriver_utils', '~> 1.0.2'
|
22
22
|
# Recommended way of doing parallel execution
|
23
23
|
spec.add_runtime_dependency 'test-queue-split', '~> 0.3.2'
|
24
|
-
spec.add_runtime_dependency '
|
24
|
+
spec.add_runtime_dependency 'hurley', '~> 0.2'
|
25
|
+
spec.add_runtime_dependency 'addressable', '~> 2.3.8'
|
26
|
+
spec.add_runtime_dependency 'oj', '~> 2.12.14'
|
25
27
|
|
26
28
|
spec.add_development_dependency 'webmock', '~> 1.21.0'
|
27
29
|
spec.add_development_dependency 'appium_thor', '~> 1.0.1'
|
@@ -31,4 +33,5 @@ Gem::Specification.new do |spec|
|
|
31
33
|
spec.add_development_dependency 'bundler', '~> 1.10.6'
|
32
34
|
spec.add_development_dependency 'rake', '~> 10.4.2'
|
33
35
|
spec.add_development_dependency 'rubocop', '~> 0.34.2'
|
36
|
+
spec.add_development_dependency 'trace_files', '~> 1.0.0'
|
34
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sauce_rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- code@bootstraponline.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -53,19 +53,47 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.3.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: hurley
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: '0.2'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: '0.2'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: addressable
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.3.8
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.3.8
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: oj
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.12.14
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.12.14
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: webmock
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,6 +206,20 @@ dependencies:
|
|
178
206
|
- - "~>"
|
179
207
|
- !ruby/object:Gem::Version
|
180
208
|
version: 0.34.2
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: trace_files
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: 1.0.0
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: 1.0.0
|
181
223
|
description: Sauce rspec integration.
|
182
224
|
email:
|
183
225
|
- code@bootstraponline.com
|
@@ -194,8 +236,8 @@ files:
|
|
194
236
|
- Thorfile
|
195
237
|
- lib/sauce_rspec.rb
|
196
238
|
- lib/sauce_rspec/config.rb
|
197
|
-
- lib/sauce_rspec/jenkins.rb
|
198
239
|
- lib/sauce_rspec/rspec.rb
|
240
|
+
- lib/sauce_rspec/sauce_rspec.rb
|
199
241
|
- lib/sauce_rspec/version.rb
|
200
242
|
- release_notes.md
|
201
243
|
- sauce_rspec.gemspec
|