bs_plus 1.0.8 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -0
- data/bin/BrowserStackLocalLinux +0 -0
- data/bin/BrowserStackLocalMac +0 -0
- data/bin/BrowserStackLocalWindows.exe +0 -0
- data/bs_plus.gemspec +7 -2
- data/lib/bs_plus.rb +14 -0
- data/lib/bs_plus/browser.rb +69 -15
- data/lib/bs_plus/cli.rb +31 -5
- data/lib/bs_plus/config.rb +4 -4
- data/lib/bs_plus/version.rb +1 -1
- metadata +69 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31c9318207264588a4c9f051e500cf5eece9bc10
|
4
|
+
data.tar.gz: 1db8198c21da3785d102d3ec5c636dce741054e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 518a9294bf768795f36ceb728e72837575e7cbeae979f0aa3c9221b30b6f226ae83a203cb4e3de4cfcdf3ab6b1570ebb1e963b0a042c68598c1174400899ab0a
|
7
|
+
data.tar.gz: 9410299b2ead437cb5572697de8435c0dbef8075890e9a1770be0690421bc5f0f49f31be629cd2f5ba63892c183751391ca0e92f7d3b1f036d38c70be03d38f4
|
data/README.md
CHANGED
@@ -27,3 +27,7 @@ Currently there's a binary named bs, it prints its usage.
|
|
27
27
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
28
|
4. Push to the branch (`git push origin my-new-feature`)
|
29
29
|
5. Create a new Pull Request
|
30
|
+
|
31
|
+
Launch with
|
32
|
+
RUBYLIB=lib bundle exec rescue bin/bs get google.com -b "ie8"
|
33
|
+
or RUBYLIB pry -rbs_plus
|
Binary file
|
Binary file
|
Binary file
|
data/bs_plus.gemspec
CHANGED
@@ -20,17 +20,22 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
|
22
22
|
spec.add_dependency 'highline', '>=1.6.21'
|
23
|
-
spec.add_dependency 'activesupport', '>=
|
23
|
+
spec.add_dependency 'activesupport', '>=4.2.0'
|
24
24
|
spec.add_dependency 'retryable', '>=1.3.5'
|
25
25
|
spec.add_dependency 'parallel', '>=1.3.0'
|
26
26
|
spec.add_dependency 'thor', '>=0.19.1'
|
27
27
|
spec.add_dependency 'rest-client', '>=1.7.2'
|
28
|
-
spec.add_dependency 'hashie', '>3.
|
28
|
+
spec.add_dependency 'hashie', '>3.1.0'
|
29
29
|
spec.add_dependency 'launchy', '>=2.4.0'
|
30
30
|
spec.add_dependency 'selenium-webdriver', '>=2.44.0'
|
31
|
+
spec.add_dependency 'capybara', '>=2.2.1'
|
32
|
+
spec.add_dependency 'os', '>=0.9.4'
|
33
|
+
spec.add_dependency 'childprocess', '>=0.5.5'
|
31
34
|
|
32
35
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
33
36
|
spec.add_development_dependency 'rake'
|
34
37
|
spec.add_development_dependency 'pry-rescue'
|
38
|
+
spec.add_development_dependency 'pry-doc'
|
39
|
+
# spec.add_development_dependency 'pry-stack_explorer'
|
35
40
|
spec.add_development_dependency 'pry'
|
36
41
|
end
|
data/lib/bs_plus.rb
CHANGED
@@ -1,9 +1,23 @@
|
|
1
1
|
require 'bs_plus/core_ext'
|
2
2
|
require 'bs_plus/version'
|
3
3
|
require 'bs_plus/config'
|
4
|
+
require 'childprocess'
|
5
|
+
require 'os'
|
4
6
|
BsPlus::Config.init # will ask for username/password if not present, hehe
|
5
7
|
|
6
8
|
require 'bs_plus/cli'
|
7
9
|
|
8
10
|
module BsPlus
|
11
|
+
def self.with_tunnel
|
12
|
+
p = ChildProcess.build File.expand_path(File.join(Kernel.__dir__, '../bin', "BrowserStackLocal#{case
|
13
|
+
when OS.windows? then 'Windows'; when OS.linux? then 'Linux'; when OS.mac? then 'Mac'; end}")),
|
14
|
+
'-force', '-forcelocal', Config.fetch(:password)
|
15
|
+
p.io.inherit!
|
16
|
+
p.start
|
17
|
+
sleep 4.5
|
18
|
+
raise "Problem with tunnel" unless p.alive?
|
19
|
+
yield
|
20
|
+
ensure
|
21
|
+
p.stop# unless p.alive?
|
22
|
+
end
|
9
23
|
end
|
data/lib/bs_plus/browser.rb
CHANGED
@@ -6,6 +6,7 @@ require 'selenium-webdriver'
|
|
6
6
|
require 'launchy'
|
7
7
|
require 'hashie'
|
8
8
|
require 'cgi'
|
9
|
+
require 'capybara'
|
9
10
|
require 'bs_plus/config'
|
10
11
|
|
11
12
|
module BsPlus
|
@@ -43,35 +44,88 @@ class Browser < Hashie::Dash
|
|
43
44
|
]
|
44
45
|
Popular = (Desktop + Mobile)
|
45
46
|
|
46
|
-
|
47
|
-
|
47
|
+
|
48
|
+
def new_session options={}
|
49
|
+
options.reverse_merge! local: true
|
48
50
|
caps = Selenium::WebDriver::Remote::Capabilities.new.tap {|c|
|
49
51
|
self.stringify_keys.select{|k,v| v}.each {|k,v| c[k] = v}
|
50
|
-
c["browserstack.debug"] =
|
51
|
-
c[
|
52
|
+
c["browserstack.debug"] = 'true'
|
53
|
+
c['browserstack.local'] = (!!options[:local]).to_s
|
54
|
+
c['acceptSslCerts'] = 'true'
|
55
|
+
c["name"] = 'Running bs_plus from command line'
|
52
56
|
}
|
53
57
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
+
Capybara.register_driver(:"#{to_s}") { |app|
|
59
|
+
Capybara::Selenium::Driver.new(app, browser: :remote,
|
60
|
+
url: "https://#{Config.fetch(:username)}:#{Config.fetch(:password)}"\
|
61
|
+
"@hub-eu.browserstack.com/wd/hub",
|
62
|
+
desired_capabilities: caps) }
|
63
|
+
|
64
|
+
yield (s = Capybara::Session.new(:"#{to_s}"))
|
65
|
+
ensure
|
66
|
+
s.driver.quit
|
67
|
+
end
|
58
68
|
|
59
|
-
|
69
|
+
def snapshot url
|
70
|
+
new_session do |browser|
|
60
71
|
puts "Starting #{self}"
|
61
|
-
|
62
|
-
puts "Reached #{
|
63
|
-
|
64
|
-
driver.quit
|
72
|
+
browser.visit url
|
73
|
+
puts "Reached #{browser.title} from #{self}, saving screenshot"
|
74
|
+
browser.save_screenshot file = CGI.escape("#{url}__#{self}.png")
|
65
75
|
puts "Done #{self}"
|
66
76
|
Launchy.open "./#{file}"
|
67
|
-
rescue => e
|
68
|
-
puts "#{e.inspect} from #{self}"
|
69
77
|
end
|
78
|
+
rescue => e
|
79
|
+
puts "#{e.inspect} from #{self}"
|
70
80
|
end
|
71
81
|
|
72
82
|
def to_s
|
73
83
|
"#{browser}#{browser_version}"\
|
74
84
|
"(#{os}-#{os_version}#{':' + device if device})"
|
75
85
|
end
|
86
|
+
|
87
|
+
def self.parse browser_string
|
88
|
+
all.select {|b| b.to_s[Regexp.new browser_string, 'i']}
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.logins
|
92
|
+
@logins ||= begin
|
93
|
+
File.expand_path('~/.loginfile.rb').tap! {|home_path| load home_path if File.exists? home_path }
|
94
|
+
File.expand_path('./.loginfile.rb').tap! {|local_path| load local_path if File.exists? local_path }
|
95
|
+
|
96
|
+
(defined?(LoginsGlobal) ? LoginsGlobal : {}).merge(defined?(LoginsLocal) ? LoginsLocal : {})
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.actions
|
101
|
+
@actions ||= begin
|
102
|
+
File.expand_path('~/.loginfile.rb').tap! {|home_path| load home_path if File.exists? home_path }
|
103
|
+
File.expand_path('./.loginfile.rb').tap! {|local_path| load local_path if File.exists? local_path }
|
104
|
+
|
105
|
+
(defined?(ActionsGlobal) ? ActionsGlobal : {}).merge(defined?(ActionsLocal) ? ActionsLocal : {})
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
def raw_selenium_session options={}
|
115
|
+
options.reverse_merge! local: true
|
116
|
+
caps = Selenium::WebDriver::Remote::Capabilities.new.tap {|c|
|
117
|
+
self.stringify_keys.select{|k,v| v}.each {|k,v| c[k] = v}
|
118
|
+
c["browserstack.debug"] = 'true'
|
119
|
+
c['browserstack.local'] = (!!options[:local]).to_s
|
120
|
+
c['acceptSslCerts'] = 'true'
|
121
|
+
c["name"] = 'Running bs_plus from command line'
|
122
|
+
}
|
123
|
+
|
124
|
+
driver = Selenium::WebDriver.for(:remote,
|
125
|
+
url: "https://#{Config.fetch(:username)}:#{Config.fetch(:password)}"\
|
126
|
+
"@hub.browserstack.com/wd/hub",
|
127
|
+
desired_capabilities: caps)
|
128
|
+
end
|
129
|
+
|
76
130
|
end
|
77
131
|
end
|
data/lib/bs_plus/cli.rb
CHANGED
@@ -3,6 +3,8 @@ require 'rest-client'
|
|
3
3
|
require 'json' unless defined? JSON # wtf is can't activate json-1.8.0, already activated json-1.8.1 (Gem::LoadError)
|
4
4
|
require 'parallel'
|
5
5
|
require 'bs_plus/browser'
|
6
|
+
require 'bs_plus/config'
|
7
|
+
require 'os'
|
6
8
|
|
7
9
|
module BsPlus
|
8
10
|
class Cli < Thor
|
@@ -21,16 +23,40 @@ module BsPlus
|
|
21
23
|
'popular' => Browser::Popular,
|
22
24
|
}
|
23
25
|
|
24
|
-
desc 'get WHAT [-b BROWSERS]',
|
26
|
+
desc 'get WHAT [-b BROWSERS]', "takes snapshot(s). Browsers: #{BrowsersOption.keys.to_sentence} or one from 'bs list'"
|
25
27
|
method_option :browsers, default: 'desktop', aliases: '-b',
|
26
28
|
desc:"#{BrowsersOption.keys.to_sentence} or one from 'bs list'"
|
27
29
|
def get url
|
28
30
|
url = "http://#{url}" unless url[/http/]
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
BsPlus.with_tunnel {
|
33
|
+
(BrowsersOption[options[:browsers]] ||
|
34
|
+
Browser.parse(options[:browsers]).take(1)).
|
35
|
+
tap {|e| puts "Snapshotting with #{e.size} browsers:"}.
|
36
|
+
tap!{|e| Parallel.map(e, in_threads: 5) {|b| b.snapshot url}} }
|
37
|
+
end
|
38
|
+
|
39
|
+
desc 'live URL -b BROWSER', "Opens browser on browserstack. Browser one from 'bs list' by regex"
|
40
|
+
method_option :browser, required: true, aliases: '-b', desc:"Browser one from 'bs list' by regex"
|
41
|
+
def live url
|
42
|
+
url = "http://#{url}" unless url[/http/]
|
43
|
+
|
44
|
+
BsPlus.with_tunnel {
|
45
|
+
(Browser.parse(options[:browser]).first || (raise %Q[#{Browser.all.map(&:to_s).join("\n")}]+"\nCouldn't find browser in the list." )).
|
46
|
+
tap {|e| puts "Opening with #{e}. Please log in to BrowserStack"}.
|
47
|
+
tap!{|b| Launchy.open "https://www.browserstack.com/automate"
|
48
|
+
b.new_session do |browser|
|
49
|
+
browser.visit url
|
50
|
+
loop { browser.has_title?('.'); sleep 30 }
|
51
|
+
end } }
|
52
|
+
end
|
53
|
+
|
54
|
+
desc 'tunnel', 'Runs BrowserStackLocal binary with your key and --automate flag'
|
55
|
+
def tunnel detach = false
|
56
|
+
#Process.detach
|
57
|
+
system File.join Kernel.__dir__, '../../bin', "BrowserStackLocal#{case
|
58
|
+
when OS.windows? then 'Windows'; when OS.linux? then 'Linux'; when OS.mac? then 'Mac'; end
|
59
|
+
} -force -onlyAutomate -forcelocal #{Config.fetch(:password)}"
|
34
60
|
end
|
35
61
|
end
|
36
62
|
end
|
data/lib/bs_plus/config.rb
CHANGED
@@ -3,15 +3,15 @@ require 'highline'
|
|
3
3
|
require 'active_support/core_ext/hash'
|
4
4
|
|
5
5
|
class BsPlus::Config
|
6
|
-
HomePath = File.expand_path '~/.browserstack-
|
7
|
-
LocalPath = File.expand_path './.browserstack-
|
6
|
+
HomePath = File.expand_path '~/.browserstack-plus'
|
7
|
+
LocalPath = File.expand_path './.browserstack-plus'
|
8
8
|
|
9
9
|
class <<self
|
10
10
|
def init
|
11
|
-
fetch(:username) {HighLine.new.ask('Please enter your browserstack username')}
|
11
|
+
fetch(:username) {HighLine.new.ask('Please enter your browserstack username').to_s}
|
12
12
|
|
13
13
|
fetch(:password) {HighLine.new.ask('Please enter your password') {|h|
|
14
|
-
h.echo = false }}
|
14
|
+
h.echo = false }.to_s}
|
15
15
|
end
|
16
16
|
|
17
17
|
OtherDefaults =
|
data/lib/bs_plus/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bs_plus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 4.2.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 4.2.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: retryable
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - ">"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 3.
|
103
|
+
version: 3.1.0
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - ">"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 3.
|
110
|
+
version: 3.1.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: launchy
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +136,48 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 2.44.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: capybara
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 2.2.1
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 2.2.1
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: os
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.9.4
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.9.4
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: childprocess
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.5.5
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.5.5
|
139
181
|
- !ruby/object:Gem::Dependency
|
140
182
|
name: bundler
|
141
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,6 +220,20 @@ dependencies:
|
|
178
220
|
- - ">="
|
179
221
|
- !ruby/object:Gem::Version
|
180
222
|
version: '0'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: pry-doc
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '0'
|
181
237
|
- !ruby/object:Gem::Dependency
|
182
238
|
name: pry
|
183
239
|
requirement: !ruby/object:Gem::Requirement
|
@@ -196,6 +252,9 @@ description: This should use your automate plan of browserstack and do screensho
|
|
196
252
|
email:
|
197
253
|
- leonid.inbox@gmail.com
|
198
254
|
executables:
|
255
|
+
- BrowserStackLocalLinux
|
256
|
+
- BrowserStackLocalMac
|
257
|
+
- BrowserStackLocalWindows.exe
|
199
258
|
- bs
|
200
259
|
extensions: []
|
201
260
|
extra_rdoc_files: []
|
@@ -205,6 +264,9 @@ files:
|
|
205
264
|
- LICENSE.txt
|
206
265
|
- README.md
|
207
266
|
- Rakefile
|
267
|
+
- bin/BrowserStackLocalLinux
|
268
|
+
- bin/BrowserStackLocalMac
|
269
|
+
- bin/BrowserStackLocalWindows.exe
|
208
270
|
- bin/bs
|
209
271
|
- bs_plus.gemspec
|
210
272
|
- lib/bs_plus.rb
|
@@ -238,3 +300,4 @@ signing_key:
|
|
238
300
|
specification_version: 4
|
239
301
|
summary: This should use your automate plan of browserstack and do screenshots
|
240
302
|
test_files: []
|
303
|
+
has_rdoc:
|