browserstack-local 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/browserstack/local.rb +136 -0
- data/lib/browserstack/localbinary.rb +88 -0
- metadata +53 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA512:
|
3
|
+
metadata.gz: f4445863dbc5f71843fa4794855e95505ef65ddb402b74ae668ed0b67d9c6fda8db2de5fa9f5954deaaf51ada3f870a883e5a12c963a6cc0ffb6681593a21ce2
|
4
|
+
data.tar.gz: d8b41e259ce95761bc3d4d0a1e5374358c4f8144267a1da8cfacade7c8643e256393aed3a596b5105395407234d12b8358dd6ba7d9ada73742f1247deab979bc
|
5
|
+
SHA1:
|
6
|
+
metadata.gz: 65c5e18b24c7a27508774143b8216f6fe53287cd
|
7
|
+
data.tar.gz: 31a1d287582f92b6d1d5756ce83c9d98070d72f3
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'browserstack/localbinary'
|
2
|
+
require 'browserstack/localexception'
|
3
|
+
|
4
|
+
module BrowserStack
|
5
|
+
|
6
|
+
class Local
|
7
|
+
attr_reader :pid
|
8
|
+
|
9
|
+
def initialize(key = ENV["BROWSERSTACK_ACCESS_KEY"])
|
10
|
+
@key = key
|
11
|
+
@user_arguments = []
|
12
|
+
@logfile = File.join(Dir.pwd, "local.log")
|
13
|
+
@is_windows = RbConfig::CONFIG['host_os'].match(/mswin|msys|mingw|cygwin|bccwin|wince|emc|win32/)
|
14
|
+
@exec = @is_windows ? "call" : "exec";
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_args(key, value=nil)
|
18
|
+
if key == "key"
|
19
|
+
@key = value
|
20
|
+
elsif key == "v" && value.to_s != "false"
|
21
|
+
@verbose_flag = "-vvv"
|
22
|
+
elsif key == "force" && value.to_s != "false"
|
23
|
+
@force_flag = "-force"
|
24
|
+
elsif key == "only" && value.to_s != "false"
|
25
|
+
@only_flag = "-only"
|
26
|
+
elsif key == "onlyAutomate" && value.to_s != "false"
|
27
|
+
@only_automate_flag = "-onlyAutomate"
|
28
|
+
elsif key == "forcelocal" && value.to_s != "false"
|
29
|
+
@force_local_flag = "-forcelocal"
|
30
|
+
elsif key == "localIdentifier"
|
31
|
+
@local_identifier_flag = "-localIdentifier '#{value}'"
|
32
|
+
elsif key == "f"
|
33
|
+
@folder_flag = "-f"
|
34
|
+
@folder_path = "'#{value}'"
|
35
|
+
elsif key == "proxyHost"
|
36
|
+
@proxy_host = "-proxyHost '#{value}'"
|
37
|
+
elsif key == "proxyPort"
|
38
|
+
@proxy_port = "-proxyPort #{value}"
|
39
|
+
elsif key == "proxyUser"
|
40
|
+
@proxy_user = "-proxyUser '#{value}'"
|
41
|
+
elsif key == "proxyPass"
|
42
|
+
@proxy_pass = "-proxyPass '#{value}'"
|
43
|
+
elsif key == "hosts"
|
44
|
+
@hosts = value
|
45
|
+
elsif key == "logfile"
|
46
|
+
@logfile = value
|
47
|
+
elsif key == "binarypath"
|
48
|
+
@binary_path = value
|
49
|
+
elsif key == "forceproxy" && value.to_s != "false"
|
50
|
+
@force_proxy_flag = "-forceproxy"
|
51
|
+
else
|
52
|
+
if value.to_s.downcase.eql?("true")
|
53
|
+
@user_arguments << "-#{key}"
|
54
|
+
else
|
55
|
+
@user_arguments << "-#{key} '#{value}'"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def start(options = {})
|
61
|
+
options.each_pair do |key, value|
|
62
|
+
self.add_args(key, value)
|
63
|
+
end
|
64
|
+
|
65
|
+
@binary_path = if @binary_path.nil?
|
66
|
+
BrowserStack::LocalBinary.new.binary_path
|
67
|
+
else
|
68
|
+
@binary_path
|
69
|
+
end
|
70
|
+
|
71
|
+
if @is_windows
|
72
|
+
system("echo > #{@logfile}")
|
73
|
+
else
|
74
|
+
system("echo '' > '#{@logfile}'")
|
75
|
+
end
|
76
|
+
|
77
|
+
if defined? spawn
|
78
|
+
@process = IO.popen(command_args)
|
79
|
+
else
|
80
|
+
@process = IO.popen(command)
|
81
|
+
end
|
82
|
+
@stdout = File.open(@logfile, "r")
|
83
|
+
|
84
|
+
while true
|
85
|
+
begin
|
86
|
+
line = @stdout.readline
|
87
|
+
rescue EOFError => e
|
88
|
+
sleep 1
|
89
|
+
next
|
90
|
+
end
|
91
|
+
break if line.nil?
|
92
|
+
if line.match(/\*\*\* Error\:/)
|
93
|
+
@stdout.close
|
94
|
+
raise BrowserStack::LocalException.new(line)
|
95
|
+
return
|
96
|
+
end
|
97
|
+
if line.strip == "Press Ctrl-C to exit"
|
98
|
+
@pid = @process.pid
|
99
|
+
@stdout.close
|
100
|
+
break
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
while true
|
105
|
+
break if self.isRunning
|
106
|
+
sleep 1
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def isRunning
|
111
|
+
return true if (!@pid.nil? && Process.kill(0, @pid)) rescue false
|
112
|
+
end
|
113
|
+
|
114
|
+
def stop
|
115
|
+
return if @pid.nil?
|
116
|
+
Process.kill("TERM", @pid) rescue Process.kill(9, @pid)
|
117
|
+
@process.close
|
118
|
+
@pid = nil if @is_windows
|
119
|
+
while self.isRunning
|
120
|
+
sleep 1
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def command
|
125
|
+
"#{@exec} #{@binary_path} -logFile '#{@logfile}' #{@folder_flag} #{@key} #{@folder_path} #{@force_local_flag} #{@local_identifier_flag} #{@only_flag} #{@only_automate_flag} #{@proxy_host} #{@proxy_port} #{@proxy_user} #{@proxy_pass} #{@force_proxy_flag} #{@force_flag} #{@verbose_flag} #{@hosts} #{@user_arguments.join(" ")}".strip
|
126
|
+
end
|
127
|
+
|
128
|
+
def command_args
|
129
|
+
args = ["#{@binary_path}", "-logFile", "#{@logfile}", "#{@key}", "#{@folder_flag}", "#{@folder_path}", "#{@force_local_flag}", "#{@local_identifier_flag}", "#{@only_flag}", "#{@only_automate_flag}", "#{@proxy_host}", "#{@proxy_port}", "#{@proxy_user}", "#{@proxy_pass}", "#{@force_proxy_flag}","#{@force_flag}", "#{@verbose_flag}", "#{@hosts}", "#{@user_arguments.join(" ")}"]
|
130
|
+
args = args.select {|a| a.to_s != "" }
|
131
|
+
args.push(:err => [:child, :out])
|
132
|
+
args
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'net/https'
|
3
|
+
require 'rbconfig'
|
4
|
+
require 'openssl'
|
5
|
+
require 'tmpdir'
|
6
|
+
require 'browserstack/localexception'
|
7
|
+
|
8
|
+
module BrowserStack
|
9
|
+
|
10
|
+
class LocalBinary
|
11
|
+
def initialize
|
12
|
+
host_os = RbConfig::CONFIG['host_os']
|
13
|
+
@http_path = case host_os
|
14
|
+
when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
|
15
|
+
@windows = true
|
16
|
+
"https://s3.amazonaws.com/browserStack/browserstack-local/BrowserStackLocal.exe"
|
17
|
+
when /darwin|mac os/
|
18
|
+
"https://s3.amazonaws.com/browserStack/browserstack-local/BrowserStackLocal-darwin-x64"
|
19
|
+
when /linux/
|
20
|
+
if 1.size == 8
|
21
|
+
"https://s3.amazonaws.com/browserStack/browserstack-local/BrowserStackLocal-linux-x64"
|
22
|
+
else
|
23
|
+
"https://s3.amazonaws.com/browserStack/browserstack-local/BrowserStackLocal-linux-ia32"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
@ordered_paths = [
|
28
|
+
File.join(File.expand_path('~'), '.browserstack'),
|
29
|
+
Dir.pwd,
|
30
|
+
Dir.tmpdir
|
31
|
+
]
|
32
|
+
end
|
33
|
+
|
34
|
+
def download(dest_parent_dir)
|
35
|
+
unless File.exists? dest_parent_dir
|
36
|
+
Dir.mkdir dest_parent_dir
|
37
|
+
end
|
38
|
+
uri = URI.parse(@http_path)
|
39
|
+
binary_path = File.join(dest_parent_dir, "BrowserStackLocal#{".exe" if @windows}")
|
40
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
41
|
+
http.use_ssl = true
|
42
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
43
|
+
|
44
|
+
res = http.get(uri.path)
|
45
|
+
file = open(binary_path, 'w')
|
46
|
+
file.write(res.body)
|
47
|
+
file.close
|
48
|
+
FileUtils.chmod 0755, binary_path
|
49
|
+
|
50
|
+
binary_path
|
51
|
+
end
|
52
|
+
|
53
|
+
def binary_path
|
54
|
+
dest_parent_dir = get_available_dirs
|
55
|
+
binary_path = File.join(dest_parent_dir, "BrowserStackLocal#{".exe" if @windows}")
|
56
|
+
if File.exists? binary_path
|
57
|
+
binary_path
|
58
|
+
else
|
59
|
+
download(dest_parent_dir)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def get_available_dirs
|
66
|
+
i = 0
|
67
|
+
while i < @ordered_paths.size
|
68
|
+
path = @ordered_paths[i]
|
69
|
+
if make_path(path)
|
70
|
+
return path
|
71
|
+
else
|
72
|
+
i += 1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
raise BrowserStack::LocalException.new('Error trying to download BrowserStack Local binary')
|
76
|
+
end
|
77
|
+
|
78
|
+
def make_path(path)
|
79
|
+
begin
|
80
|
+
FileUtils.mkdir_p path if !File.directory?(path)
|
81
|
+
return true
|
82
|
+
rescue Exception
|
83
|
+
return false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: browserstack-local
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- ""
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2016-05-01 00:00:00 Z
|
13
|
+
dependencies: []
|
14
|
+
|
15
|
+
description: Ruby bindings for BrowserStack Local
|
16
|
+
email: support@browserstack.com
|
17
|
+
executables: []
|
18
|
+
|
19
|
+
extensions: []
|
20
|
+
|
21
|
+
extra_rdoc_files: []
|
22
|
+
|
23
|
+
files:
|
24
|
+
- lib/browserstack/local.rb
|
25
|
+
- lib/browserstack/localbinary.rb
|
26
|
+
homepage: http://rubygems.org/gems/browserstack-local
|
27
|
+
licenses:
|
28
|
+
- MIT
|
29
|
+
metadata: {}
|
30
|
+
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- &id001
|
39
|
+
- ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: "0"
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- *id001
|
45
|
+
requirements: []
|
46
|
+
|
47
|
+
rubyforge_project:
|
48
|
+
rubygems_version: 2.0.14
|
49
|
+
signing_key:
|
50
|
+
specification_version: 4
|
51
|
+
summary: BrowserStack Local
|
52
|
+
test_files: []
|
53
|
+
|