roku_builder 3.6.1 → 3.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/bin/roku +8 -0
- data/lib/roku_builder/config_parser.rb +4 -1
- data/lib/roku_builder/controller.rb +1 -1
- data/lib/roku_builder/controller_commands.rb +3 -2
- data/lib/roku_builder/linker.rb +26 -6
- data/lib/roku_builder/version.rb +1 -1
- data/tests/roku_builder/controller_commands_test.rb +3 -3
- data/tests/roku_builder/linker_test.rb +63 -4
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cda87c8c79464c6cbaadc76552d553d1d4f992f8
|
4
|
+
data.tar.gz: b2f72f1595cb30bc54ba7fabde915ff1f5761454
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4bc039de589e530c0424df8067bc0985d54ce37ef356cd212a7d668a4934391ca41490d83d5af0710b291edf7a274b7a7787fb080275b43350a47cdacf7e5a8
|
7
|
+
data.tar.gz: f7470fa07bb4bb460ffc011d71a58bc278414674b0718b286cc4b1844a9f93bee3a441dc00912cef2aa3fec905be71258eb4ed72da065f9d04924574fe1dee09
|
data/Gemfile.lock
CHANGED
data/bin/roku
CHANGED
@@ -83,6 +83,10 @@ OptionParser.new do |opts|
|
|
83
83
|
options[:update] = true
|
84
84
|
end
|
85
85
|
|
86
|
+
opts.on("-A", "--app-list", "Command: List currently installed apps") do
|
87
|
+
options[:applist] = true
|
88
|
+
end
|
89
|
+
|
86
90
|
opts.on("-r", "--ref REF", "Git referance to use for sideloading") do |r|
|
87
91
|
options[:ref] = r
|
88
92
|
end
|
@@ -125,6 +129,10 @@ OptionParser.new do |opts|
|
|
125
129
|
options[:project] = p
|
126
130
|
end
|
127
131
|
|
132
|
+
opts.on("-a", "--app ID", "Send App id for deeplinking") do |a|
|
133
|
+
options[:app_id] = a
|
134
|
+
end
|
135
|
+
|
128
136
|
opts.on("-O", "--out PATH", "Output file/folder. If PATH ends in .pkg/.zip/.jpg, file is assumed, otherwise folder is assumed") do |o|
|
129
137
|
options[:out] = o
|
130
138
|
end
|
@@ -202,7 +202,10 @@ module RokuBuilder
|
|
202
202
|
root_dir: configs[:project_config][:directory]
|
203
203
|
}
|
204
204
|
# Create Deeplink Config
|
205
|
-
configs[:deeplink_config] ={options: options[:deeplink]}
|
205
|
+
configs[:deeplink_config] = {options: options[:deeplink]}
|
206
|
+
if options[:app_id]
|
207
|
+
configs[:deeplink_config][:app_id] = options[:app_id]
|
208
|
+
end
|
206
209
|
# Create Monitor Config
|
207
210
|
if options[:monitor]
|
208
211
|
configs[:monitor_config] = {type: options[:monitor].to_sym}
|
@@ -160,7 +160,7 @@ module RokuBuilder
|
|
160
160
|
def self.commands
|
161
161
|
[:sideload, :package, :test, :deeplink,:configure, :validate, :delete,
|
162
162
|
:navigate, :text, :build, :monitor, :update, :screencapture, :key, :screen,
|
163
|
-
:screens]
|
163
|
+
:screens, :applist]
|
164
164
|
end
|
165
165
|
|
166
166
|
# List of depricated options
|
@@ -20,7 +20,8 @@ module RokuBuilder
|
|
20
20
|
text: { klass: Navigator, method: :type, config_key: :text_config },
|
21
21
|
test: { klass: Tester, method: :run_tests, config_key: :test_config },
|
22
22
|
screencapture: { klass: Inspector, method: :screencapture, config_key: :screencapture_config,
|
23
|
-
failure: FAILED_SCREENCAPTURE }
|
23
|
+
failure: FAILED_SCREENCAPTURE },
|
24
|
+
applist: {klass: Linker, method: :list}
|
24
25
|
}
|
25
26
|
end
|
26
27
|
# Validate Config
|
@@ -139,7 +140,7 @@ module RokuBuilder
|
|
139
140
|
end
|
140
141
|
|
141
142
|
linker = Linker.new(configs[:device_config])
|
142
|
-
if linker.
|
143
|
+
if linker.launch(configs[:deeplink_config])
|
143
144
|
logger.info "Deeplinked into app"
|
144
145
|
return SUCCESS
|
145
146
|
else
|
data/lib/roku_builder/linker.rb
CHANGED
@@ -2,26 +2,46 @@ module RokuBuilder
|
|
2
2
|
|
3
3
|
# Launch application, sending parameters
|
4
4
|
class Linker < Util
|
5
|
-
# Deeplink to
|
5
|
+
# Deeplink to an app
|
6
6
|
# @param options [String] Options string
|
7
|
+
# @param app_id [String] Id of the app to launch (defaults to dev)
|
8
|
+
# @param logger [Logger] System Logger
|
7
9
|
# @note Options string should be formated like the following: "<key>:<value>[, <key>:<value>]*"
|
8
10
|
# @note Any options will be accepted and sent to the app
|
9
|
-
def
|
10
|
-
path = "/launch
|
11
|
-
return false unless options
|
11
|
+
def launch(options: nil, app_id: "dev")
|
12
|
+
path = "/launch/#{app_id}"
|
12
13
|
payload = Util.options_parse(options: options)
|
13
14
|
|
14
15
|
unless payload.keys.count > 0
|
15
|
-
|
16
|
+
@logger.warn "No options sent to launched app"
|
17
|
+
else
|
18
|
+
path = "#{path}?#{parameterize(payload)}"
|
16
19
|
end
|
17
20
|
|
18
|
-
path = "#{path}?#{parameterize(payload)}"
|
19
21
|
conn = multipart_connection(port: 8060)
|
20
22
|
|
21
23
|
response = conn.post path
|
22
24
|
return response.success?
|
23
25
|
end
|
24
26
|
|
27
|
+
# List currently installed apps
|
28
|
+
# @param logger [Logger] System Logger
|
29
|
+
def list()
|
30
|
+
path = "/query/apps"
|
31
|
+
conn = multipart_connection(port: 8060)
|
32
|
+
response = conn.get path
|
33
|
+
|
34
|
+
if response.success?
|
35
|
+
regexp = /id="([^"]*)"\stype="([^"]*)"\sversion="([^"]*)">([^<]*)</
|
36
|
+
apps = response.body.scan(regexp)
|
37
|
+
printf("%30s | %10s | %10s | %10s\n", "title", "id", "type", "version")
|
38
|
+
printf("---------------------------------------------------------------------\n")
|
39
|
+
apps.each do |app|
|
40
|
+
printf("%30s | %10s | %10s | %10s\n", app[3], app[0], app[1], app[2])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
25
45
|
private
|
26
46
|
|
27
47
|
# Parameterize options to be sent to the app
|
data/lib/roku_builder/version.rb
CHANGED
@@ -189,7 +189,7 @@ class ControllerCommandsTest < Minitest::Test
|
|
189
189
|
options = {deeplink: true, stage: 'production', deeplink_options: "a:b", config: "~/.roku_config.json"}
|
190
190
|
config = good_config
|
191
191
|
code, configs = RokuBuilder::ConfigParser.parse_config(options: options, config: config, logger: logger)
|
192
|
-
mock.expect(:
|
192
|
+
mock.expect(:launch, "true", [configs[:deeplink_config]])
|
193
193
|
RokuBuilder::Linker.stub(:new, mock) do
|
194
194
|
code = RokuBuilder::Controller.send(:execute_commands, {options: options, config: config, configs: configs, logger: logger})
|
195
195
|
end
|
@@ -208,7 +208,7 @@ class ControllerCommandsTest < Minitest::Test
|
|
208
208
|
options = {deeplink: true, set_stage: true, stage: 'production', deeplink_options: "a:b", config: "~/.roku_config.json"}
|
209
209
|
config = good_config
|
210
210
|
code, configs = RokuBuilder::ConfigParser.parse_config(options: options, config: config, logger: logger)
|
211
|
-
mock.expect(:
|
211
|
+
mock.expect(:launch, "true", [configs[:deeplink_config]])
|
212
212
|
RokuBuilder::Linker.stub(:new, mock) do
|
213
213
|
RokuBuilder::ControllerCommands.stub(:sideload, sideload) do
|
214
214
|
code = RokuBuilder::Controller.send(:execute_commands, {options: options, config: config, configs: configs, logger: logger})
|
@@ -226,7 +226,7 @@ class ControllerCommandsTest < Minitest::Test
|
|
226
226
|
options = {deeplink: true, stage: 'production', deeplink_options: "a:b", config: "~/.roku_config.json"}
|
227
227
|
config = good_config
|
228
228
|
code, configs = RokuBuilder::ConfigParser.parse_config(options: options, config: config, logger: logger)
|
229
|
-
mock.expect(:
|
229
|
+
mock.expect(:launch, false, [configs[:deeplink_config]])
|
230
230
|
RokuBuilder::Linker.stub(:new, mock) do
|
231
231
|
code = RokuBuilder::Controller.send(:execute_commands, {options: options, config: config, configs: configs, logger: logger})
|
232
232
|
end
|
@@ -26,7 +26,7 @@ class LinkerTest < Minitest::Test
|
|
26
26
|
linker = RokuBuilder::Linker.new(**device_config)
|
27
27
|
success = nil
|
28
28
|
Faraday.stub(:new, connection, faraday) do
|
29
|
-
success = linker.
|
29
|
+
success = linker.launch(options: options)
|
30
30
|
end
|
31
31
|
|
32
32
|
assert success
|
@@ -36,18 +36,77 @@ class LinkerTest < Minitest::Test
|
|
36
36
|
response.verify
|
37
37
|
end
|
38
38
|
def test_linker_link_nothing
|
39
|
+
logger = Minitest::Mock.new
|
40
|
+
connection = Minitest::Mock.new
|
41
|
+
faraday = Minitest::Mock.new
|
42
|
+
response = Minitest::Mock.new
|
43
|
+
|
39
44
|
device_config = {
|
40
45
|
ip: "111.222.333",
|
41
46
|
user: "user",
|
42
47
|
password: "password",
|
43
|
-
logger:
|
48
|
+
logger: logger
|
44
49
|
}
|
50
|
+
path = "/launch/dev"
|
45
51
|
options = ''
|
52
|
+
logger.expect(:warn, nil, ["No options sent to launched app"])
|
53
|
+
connection.expect(:post, response, [path])
|
54
|
+
faraday.expect(:headers, {})
|
55
|
+
faraday.expect(:request, nil, [:digest, device_config[:user], device_config[:password]])
|
56
|
+
faraday.expect(:request, nil, [:multipart])
|
57
|
+
faraday.expect(:request, nil, [:url_encoded])
|
58
|
+
faraday.expect(:adapter, nil, [Faraday.default_adapter])
|
59
|
+
response.expect(:success?, true)
|
46
60
|
linker = RokuBuilder::Linker.new(**device_config)
|
47
61
|
success = nil
|
48
|
-
|
62
|
+
Faraday.stub(:new, connection, faraday) do
|
63
|
+
success = linker.launch(options: options)
|
64
|
+
end
|
65
|
+
|
66
|
+
assert success
|
67
|
+
logger.verify
|
68
|
+
connection.verify
|
69
|
+
faraday.verify
|
70
|
+
response.verify
|
71
|
+
end
|
49
72
|
|
50
|
-
|
73
|
+
def test_linker_list
|
74
|
+
connection = Minitest::Mock.new
|
75
|
+
faraday = Minitest::Mock.new
|
76
|
+
response = Minitest::Mock.new
|
77
|
+
|
78
|
+
device_config = {
|
79
|
+
ip: "111.222.333",
|
80
|
+
user: "user",
|
81
|
+
password: "password",
|
82
|
+
logger: Logger.new("/dev/null")
|
83
|
+
}
|
84
|
+
path = "/query/apps"
|
85
|
+
body = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<apps>\n\t
|
86
|
+
<app id=\"31012\" type=\"menu\" version=\"1.6.3\">Movie Store and TV Store</app>\n\t
|
87
|
+
<app id=\"31863\" type=\"menu\" version=\"1.2.6\">Roku Home News</app>\n\t
|
88
|
+
<app id=\"65066\" type=\"appl\" version=\"1.3.0\">Nick</app>\n\t
|
89
|
+
<app id=\"68161\" type=\"appl\" version=\"1.3.0\">Nick</app>\n\t
|
90
|
+
</apps>\n"
|
91
|
+
connection.expect(:get, response, [path])
|
92
|
+
faraday.expect(:headers, {})
|
93
|
+
faraday.expect(:request, nil, [:digest, device_config[:user], device_config[:password]])
|
94
|
+
faraday.expect(:request, nil, [:multipart])
|
95
|
+
faraday.expect(:request, nil, [:url_encoded])
|
96
|
+
faraday.expect(:adapter, nil, [Faraday.default_adapter])
|
97
|
+
response.expect(:success?, true)
|
98
|
+
response.expect(:body, body)
|
99
|
+
linker = RokuBuilder::Linker.new(**device_config)
|
100
|
+
|
101
|
+
print_count = 0
|
102
|
+
did_print = Proc.new { |msg| print_count+=1 }
|
103
|
+
|
104
|
+
Faraday.stub(:new, connection, faraday) do
|
105
|
+
linker.stub(:printf, did_print) do
|
106
|
+
linker.list
|
107
|
+
end
|
108
|
+
end
|
51
109
|
|
110
|
+
assert_equal 6, print_count
|
52
111
|
end
|
53
112
|
end
|