roku_builder 3.6.1 → 3.6.2
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/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
|