stf-client 0.1.4 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +6 -0
- data/.travis.yml +3 -0
- data/README.md +8 -2
- data/lib/stf/interactor/get_keys_interactor.rb +33 -0
- data/lib/stf/interactor/get_values_interactor.rb +32 -0
- data/lib/stf/interactor/start_debug_session_interactor.rb +74 -43
- data/lib/stf/model/device.rb +38 -0
- data/lib/stf/version.rb +1 -1
- data/lib/stf/view/cli.rb +34 -4
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f4e33126f8648b92df84f8f064226d2cda27f06
|
4
|
+
data.tar.gz: ec864ead54872cd022c637b16e8860298a7438bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6fd1cf716d57494d7c3e244b995ee947f11182f9dff13b192927e5db81d2c93f384f375caa91462656d1832069299972b279ce7b67bd34eba4d206e8b7372ca7
|
7
|
+
data.tar.gz: eb8c0476effa4f868403464d7bd7a6d35b56a12cbd00e236504c8526abfb5aeba4b2ebb4a9551f7ce53ed2caca636f4d241e94c8bbd204c041f1eecf543d155c
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -35,8 +35,8 @@ SYNOPSIS
|
|
35
35
|
|
36
36
|
GLOBAL OPTIONS
|
37
37
|
--help - Show this message
|
38
|
-
-t, --token=arg - Authorization token (default: none)
|
39
|
-
-u, --url=arg - URL to STF (default: none)
|
38
|
+
-t, --token=arg - Authorization token, can also be set by environment variable STF_TOKEN (default: none)
|
39
|
+
-u, --url=arg - URL to STF, can also be set by environment variable STF_URL (default: none)
|
40
40
|
-v, --[no-]verbose - Be verbose
|
41
41
|
|
42
42
|
COMMANDS
|
@@ -44,6 +44,12 @@ COMMANDS
|
|
44
44
|
connect - Search for a device available in STF and attach it to local adb server
|
45
45
|
disconnect - Disconnect device(s) from local adb server and remove device(s) from user devices in STF
|
46
46
|
help - Shows a list of commands or help for one command
|
47
|
+
keys - Show avaliable keys for filtering
|
48
|
+
values - Show known values for the filtering key
|
49
|
+
|
50
|
+
ENVIRONMENT VARIABLES
|
51
|
+
STF_TOKEN - Authorization token
|
52
|
+
STF_URL - URL to STF
|
47
53
|
```
|
48
54
|
|
49
55
|
## Contributing
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'ADB'
|
2
|
+
|
3
|
+
require 'stf/client'
|
4
|
+
require 'stf/log/log'
|
5
|
+
require 'stf/errors'
|
6
|
+
require 'stf/model/session'
|
7
|
+
require 'stf/model/device'
|
8
|
+
|
9
|
+
class GetKeysInteractor
|
10
|
+
|
11
|
+
include Log
|
12
|
+
include ADB
|
13
|
+
|
14
|
+
def initialize(stf)
|
15
|
+
@stf = stf
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute
|
19
|
+
devices = @stf.get_devices
|
20
|
+
|
21
|
+
if devices.nil? || (devices.is_a?(Array) && devices.empty?)
|
22
|
+
logger.info 'No devices connected to STF'
|
23
|
+
return []
|
24
|
+
end
|
25
|
+
|
26
|
+
return devices
|
27
|
+
.map {|d| Device.new(d)}
|
28
|
+
.flat_map {|d| d.getKeys }
|
29
|
+
.uniq
|
30
|
+
.sort
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'ADB'
|
2
|
+
|
3
|
+
require 'stf/client'
|
4
|
+
require 'stf/log/log'
|
5
|
+
require 'stf/errors'
|
6
|
+
require 'stf/model/session'
|
7
|
+
require 'stf/model/device'
|
8
|
+
|
9
|
+
class GetValuesInteractor
|
10
|
+
|
11
|
+
include Log
|
12
|
+
include ADB
|
13
|
+
|
14
|
+
def initialize(stf)
|
15
|
+
@stf = stf
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute(key)
|
19
|
+
devices = @stf.get_devices
|
20
|
+
|
21
|
+
if devices.nil? || (devices.is_a?(Array) && devices.empty?)
|
22
|
+
logger.info r 'No devices connected to STF'
|
23
|
+
return []
|
24
|
+
end
|
25
|
+
|
26
|
+
return devices
|
27
|
+
.map {|d| Device.new(d)}
|
28
|
+
.map {|d| d.getValue(key)}
|
29
|
+
.uniq
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -14,52 +14,83 @@ class StartDebugSessionInteractor
|
|
14
14
|
@stf = stf
|
15
15
|
end
|
16
16
|
|
17
|
-
def execute
|
18
|
-
|
17
|
+
def execute(wanted, all_flag, filter)
|
18
|
+
wanted = 1 if wanted.nil?
|
19
|
+
wanted = wanted.to_i
|
19
20
|
|
20
21
|
1..10.times do
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
22
|
+
wanted -= connect(wanted, all_flag, filter)
|
23
|
+
return if all_flag || wanted <= 0
|
24
|
+
logger.info 'We are still waiting for ' + wanted.to_s + ' device(s). Retrying'
|
25
|
+
sleep 5
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def connect(wanted, all_flag, filter)
|
30
|
+
devices = @stf.get_devices
|
31
|
+
if devices.nil? || (devices.is_a?(Array) && devices.empty?)
|
32
|
+
logger.info 'No devices connected to STF'
|
33
|
+
return 0
|
34
|
+
end
|
35
|
+
|
36
|
+
usable_devices = devices
|
37
|
+
.map {|d| Device.new(d)}
|
38
|
+
.select do |d|
|
39
|
+
d.ready == true && d.present == true && d.using == false
|
40
|
+
end
|
41
|
+
|
42
|
+
if usable_devices.empty?
|
43
|
+
logger.error 'All devices are being used'
|
44
|
+
return 0
|
45
|
+
end
|
46
|
+
|
47
|
+
unless filter.nil?
|
48
|
+
key, value = filter.split(':', 2)
|
49
|
+
|
50
|
+
usable_devices = usable_devices.select do |d|
|
51
|
+
d.getValue(key) == value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if usable_devices.empty?
|
56
|
+
logger.error 'There is no device with criteria ' + filter
|
57
|
+
return 0
|
58
|
+
end
|
59
|
+
|
60
|
+
n = 0
|
61
|
+
usable_devices.shuffle.each do |d|
|
62
|
+
n += 1 if connect_device(d)
|
63
|
+
break if !all_flag && n >= wanted
|
64
|
+
end
|
65
|
+
|
66
|
+
n
|
67
|
+
end
|
68
|
+
|
69
|
+
def connect_device(device)
|
70
|
+
begin
|
71
|
+
return false if device.nil?
|
72
|
+
|
73
|
+
serial = device.serial
|
74
|
+
success = @stf.add_device serial
|
75
|
+
if success
|
76
|
+
logger.info "Device #{serial} added"
|
77
|
+
elsif logger.error "Can't add device #{serial}"
|
78
|
+
return false
|
79
|
+
end
|
80
|
+
|
81
|
+
result = @stf.start_debug serial
|
82
|
+
unless result.success
|
83
|
+
logger.error "Can't start debugging session for device #{serial}"
|
84
|
+
@stf.remove_device serial
|
85
|
+
return false
|
62
86
|
end
|
87
|
+
|
88
|
+
execute_adb_with 30, "connect #{result.remoteConnectUrl}"
|
89
|
+
return true
|
90
|
+
|
91
|
+
rescue Net::HTTPFatalError
|
92
|
+
logger.error 'Failed to start debug session'
|
93
|
+
return false
|
63
94
|
end
|
64
95
|
end
|
65
96
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class Device < OpenStruct
|
2
|
+
def getValue(key)
|
3
|
+
getValueFromObject(self, key)
|
4
|
+
end
|
5
|
+
|
6
|
+
def getKeys
|
7
|
+
getKeysNextLevel('', self)
|
8
|
+
end
|
9
|
+
|
10
|
+
def getKeysNextLevel(prefix, o)
|
11
|
+
return [] if o.nil?
|
12
|
+
|
13
|
+
o.each_pair.flat_map do |k, v|
|
14
|
+
if v.is_a? OpenStruct
|
15
|
+
getKeysNextLevel(concat(prefix, k.to_s), v)
|
16
|
+
else
|
17
|
+
[concat(prefix, k.to_s)]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def concat(prefix, key)
|
23
|
+
prefix.to_s.empty? ? key : prefix + '.' + key
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def getValueFromObject(obj, key)
|
28
|
+
keys = key.split('.', 2)
|
29
|
+
if keys[1].nil?
|
30
|
+
obj[key]
|
31
|
+
else
|
32
|
+
getValueFromObject(obj[keys[0]], keys[1])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private :getValueFromObject,:concat, :getKeysNextLevel
|
37
|
+
|
38
|
+
end
|
data/lib/stf/version.rb
CHANGED
data/lib/stf/view/cli.rb
CHANGED
@@ -7,6 +7,8 @@ module Stf
|
|
7
7
|
require 'stf/interactor/stop_debug_session_interactor'
|
8
8
|
require 'stf/interactor/stop_all_debug_sessions_interactor'
|
9
9
|
require 'stf/interactor/remove_all_user_devices_interactor'
|
10
|
+
require 'stf/interactor/get_keys_interactor'
|
11
|
+
require 'stf/interactor/get_values_interactor'
|
10
12
|
|
11
13
|
include GLI::App
|
12
14
|
extend self
|
@@ -16,13 +18,17 @@ module Stf
|
|
16
18
|
desc 'Be verbose'
|
17
19
|
switch [:v, :verbose]
|
18
20
|
|
19
|
-
desc 'Authorization token'
|
21
|
+
desc 'Authorization token, can also be set by environment variable STF_TOKEN'
|
20
22
|
flag [:t, :token]
|
21
23
|
|
22
|
-
desc 'URL to STF'
|
24
|
+
desc 'URL to STF, can also be set by environment variable STF_URL'
|
23
25
|
flag [:u, :url]
|
24
26
|
|
25
27
|
pre do |global_options, command, options, args|
|
28
|
+
|
29
|
+
global_options[:url] = ENV['STF_URL'] if global_options[:url].nil?
|
30
|
+
global_options[:token] = ENV['STF_TOKEN'] if global_options[:token].nil?
|
31
|
+
|
26
32
|
help_now!('STF url is required') if global_options[:url].nil?
|
27
33
|
help_now!('Authorization token is required') if global_options[:token].nil?
|
28
34
|
|
@@ -33,8 +39,32 @@ module Stf
|
|
33
39
|
|
34
40
|
desc 'Search for a device available in STF and attach it to local adb server'
|
35
41
|
command :connect do |c|
|
42
|
+
c.switch [:all]
|
43
|
+
c.flag [:n, :number]
|
44
|
+
c.flag [:f, :filter]
|
45
|
+
|
46
|
+
c.action do |global_options, options, args|
|
47
|
+
StartDebugSessionInteractor.new($stf).execute(options[:number], options[:all], options[:filter])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
desc 'Show avaliable keys for filtering'
|
52
|
+
command :keys do |c|
|
36
53
|
c.action do |global_options, options, args|
|
37
|
-
|
54
|
+
puts GetKeysInteractor.new($stf).execute
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
desc 'Show known values for the filtering key'
|
59
|
+
command :values do |c|
|
60
|
+
c.flag [:k, :key]
|
61
|
+
|
62
|
+
c.action do |global_options, options, args|
|
63
|
+
if options[:key].nil?
|
64
|
+
help_now!('Please specify the key (--key)')
|
65
|
+
else
|
66
|
+
puts GetValuesInteractor.new($stf).execute(options[:key])
|
67
|
+
end
|
38
68
|
end
|
39
69
|
end
|
40
70
|
|
@@ -49,7 +79,7 @@ module Stf
|
|
49
79
|
StopAllDebugSessionsInteractor.new($stf).execute
|
50
80
|
elsif !options[:device].nil? && options[:all] == false
|
51
81
|
StopDebugSessionInteractor.new($stf).execute(options[:device])
|
52
|
-
elsif help_now!('Please specify disconnect mode (
|
82
|
+
elsif help_now!('Please specify disconnect mode (--all or --device)')
|
53
83
|
end
|
54
84
|
end
|
55
85
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stf-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Malinskiy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gli
|
@@ -118,6 +118,7 @@ extra_rdoc_files: []
|
|
118
118
|
files:
|
119
119
|
- ".gitignore"
|
120
120
|
- ".rspec"
|
121
|
+
- ".travis.yml"
|
121
122
|
- Gemfile
|
122
123
|
- LICENSE.txt
|
123
124
|
- README.md
|
@@ -127,11 +128,14 @@ files:
|
|
127
128
|
- lib/stf.rb
|
128
129
|
- lib/stf/client.rb
|
129
130
|
- lib/stf/errors.rb
|
131
|
+
- lib/stf/interactor/get_keys_interactor.rb
|
132
|
+
- lib/stf/interactor/get_values_interactor.rb
|
130
133
|
- lib/stf/interactor/remove_all_user_devices_interactor.rb
|
131
134
|
- lib/stf/interactor/start_debug_session_interactor.rb
|
132
135
|
- lib/stf/interactor/stop_all_debug_sessions_interactor.rb
|
133
136
|
- lib/stf/interactor/stop_debug_session_interactor.rb
|
134
137
|
- lib/stf/log/log.rb
|
138
|
+
- lib/stf/model/device.rb
|
135
139
|
- lib/stf/model/session.rb
|
136
140
|
- lib/stf/version.rb
|
137
141
|
- lib/stf/view/cli.rb
|
@@ -156,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
160
|
version: '0'
|
157
161
|
requirements: []
|
158
162
|
rubyforge_project:
|
159
|
-
rubygems_version: 2.6.
|
163
|
+
rubygems_version: 2.6.13
|
160
164
|
signing_key:
|
161
165
|
specification_version: 4
|
162
166
|
summary: Request devices from Smartphone Test Farm for adb connection
|