roku_builder 3.7.3 → 3.8.0
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 +7 -1
- data/README.md +19 -2
- data/bin/roku +4 -0
- data/lib/roku_builder/config_parser.rb +4 -0
- data/lib/roku_builder/controller.rb +2 -2
- data/lib/roku_builder/controller_commands.rb +12 -5
- data/lib/roku_builder/profiler.rb +96 -0
- data/lib/roku_builder/util.rb +2 -1
- data/lib/roku_builder/version.rb +1 -1
- data/lib/roku_builder.rb +3 -0
- data/roku_builder.gemspec +1 -0
- data/tests/roku_builder/config_manager_test.rb +1 -1
- data/tests/roku_builder/controller_commands_test.rb +7 -3
- data/tests/roku_builder/profiler_test.rb +34 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c19396d0acc214911d18c3be499dc2577f1a10de
|
4
|
+
data.tar.gz: 2b0fc5733f711314090aa5d5758f803e105df7af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3df993d3bee3eb41e489b947fe537d5b3585aac44c2939d9c398d40978b3476079dd11f407e9381fb8598226fec8eaf81be42ebe8d72938bcca8646514ae7ce0
|
7
|
+
data.tar.gz: d92b072dc3d1a6d803bac96d004005c76418f6a390cbd0737899b4c73ad2162a6264c5a794c03ec4ab3eb3d3924485094c84d51907a2c8d6e33d134cbd04f666
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
roku_builder (3.
|
4
|
+
roku_builder (3.8.0)
|
5
5
|
faraday (~> 0.9)
|
6
6
|
faraday-digestauth (~> 0.2)
|
7
7
|
git (~> 1.3)
|
8
8
|
net-ping (~> 1.7)
|
9
9
|
net-telnet (~> 0.1)
|
10
|
+
nokogiri (~> 1.6)
|
10
11
|
rubyzip (~> 1.2)
|
11
12
|
|
12
13
|
GEM
|
@@ -56,6 +57,7 @@ GEM
|
|
56
57
|
ruby_dep (~> 1.2)
|
57
58
|
lumberjack (1.0.10)
|
58
59
|
method_source (0.8.2)
|
60
|
+
mini_portile2 (2.1.0)
|
59
61
|
minitest (5.9.0)
|
60
62
|
minitest-autotest (1.0.3)
|
61
63
|
minitest-server (~> 1.0)
|
@@ -67,9 +69,13 @@ GEM
|
|
67
69
|
net-http-digest_auth (1.4)
|
68
70
|
net-ping (1.7.8)
|
69
71
|
net-telnet (0.1.1)
|
72
|
+
nokogiri (1.6.8)
|
73
|
+
mini_portile2 (~> 2.1.0)
|
74
|
+
pkg-config (~> 1.1.7)
|
70
75
|
notiffany (0.1.0)
|
71
76
|
nenv (~> 0.1)
|
72
77
|
shellany (~> 0.0)
|
78
|
+
pkg-config (1.1.7)
|
73
79
|
pry (0.10.3)
|
74
80
|
coderay (~> 1.1.0)
|
75
81
|
method_source (~> 0.8.1)
|
data/README.md
CHANGED
@@ -19,12 +19,14 @@ development tasks:
|
|
19
19
|
* App Deleteing
|
20
20
|
* Package Inspection
|
21
21
|
* Monitoring logs
|
22
|
+
* Profile Scene Graph applications
|
22
23
|
|
23
|
-
The tool allows scripting of the following
|
24
|
+
The tool allows scripting of the following:
|
24
25
|
|
25
26
|
* Conroller inputs
|
26
27
|
* Text Input
|
27
28
|
* Screencaptures
|
29
|
+
* Printing project information
|
28
30
|
|
29
31
|
Other tasks the tool can complete:
|
30
32
|
|
@@ -174,11 +176,25 @@ The following are the options to be passed in as type:
|
|
174
176
|
* task2
|
175
177
|
* task3
|
176
178
|
* taskX
|
179
|
+
* profile
|
177
180
|
|
178
181
|
The tool connects to the roku via telnet and prints everything that it
|
179
182
|
recieves. It will continue indefinatly unless it is stopped via Ctrl-c or
|
180
183
|
entering "q".
|
181
184
|
|
185
|
+
#### Profiling Scene Graph
|
186
|
+
|
187
|
+
The tool will help a little with profiling scenegraph applications. Running the
|
188
|
+
following command will print a list of all of the currently created nodes
|
189
|
+
types and how many of each are being created.
|
190
|
+
|
191
|
+
$ roku --profile stats
|
192
|
+
|
193
|
+
If you want to see more information about each node you can monitor the
|
194
|
+
profile log (See Monitoring Logs above) and enter teh following command:
|
195
|
+
|
196
|
+
$ sgnodes all
|
197
|
+
|
182
198
|
#### Testing
|
183
199
|
|
184
200
|
There are a few tools that can be used for testing. The testing command will
|
@@ -302,7 +318,8 @@ directory:
|
|
302
318
|
* Intergration Tests
|
303
319
|
* Move RokuBuilder::Controller to RokuBuilder?
|
304
320
|
* Allow start and end delimiter for tests to be configured
|
305
|
-
* Fix
|
321
|
+
* Fix file naming when building from a referance
|
322
|
+
* Extend profiling
|
306
323
|
|
307
324
|
## Contributing
|
308
325
|
|
data/bin/roku
CHANGED
@@ -72,6 +72,10 @@ OptionParser.new do |opts|
|
|
72
72
|
options[:print] = a
|
73
73
|
end
|
74
74
|
|
75
|
+
opts.on("--profile COMMAND", "Command: Run various profiler options") do |c|
|
76
|
+
options[:profile] = c
|
77
|
+
end
|
78
|
+
|
75
79
|
opts.on("--do-stage", "Command: Run the stager. Used for scripting. Alwasy run --do-unscript after") do
|
76
80
|
options[:dostage] = true
|
77
81
|
end
|
@@ -228,6 +228,10 @@ module RokuBuilder
|
|
228
228
|
if options[:screen]
|
229
229
|
configs[:screen_config] = {type: options[:screen].to_sym}
|
230
230
|
end
|
231
|
+
#Create Profiler Config
|
232
|
+
if options[:profile]
|
233
|
+
configs[:profiler_config] = {command: options[:profile].to_sym}
|
234
|
+
end
|
231
235
|
end
|
232
236
|
private_class_method :setup_simple_configs
|
233
237
|
end
|
@@ -166,7 +166,7 @@ module RokuBuilder
|
|
166
166
|
def self.commands
|
167
167
|
[:sideload, :package, :test, :deeplink,:configure, :validate, :delete,
|
168
168
|
:navigate, :text, :build, :monitor, :update, :screencapture, :key, :screen,
|
169
|
-
:screens, :applist, :print, :dostage, :dounstage]
|
169
|
+
:screens, :applist, :print, :profile, :dostage, :dounstage]
|
170
170
|
end
|
171
171
|
|
172
172
|
# List of depricated options
|
@@ -197,7 +197,7 @@ module RokuBuilder
|
|
197
197
|
# @return [Array<Symbol>] List of commands that require a device
|
198
198
|
def self.device_commands
|
199
199
|
[:sideload, :package, :test, :deeplink, :delete, :navigate, :text,
|
200
|
-
:monitor, :screencapture, :applist, :print ]
|
200
|
+
:monitor, :screencapture, :applist, :print, :profile ]
|
201
201
|
end
|
202
202
|
|
203
203
|
|
@@ -23,7 +23,8 @@ module RokuBuilder
|
|
23
23
|
test: { klass: Tester, method: :run_tests, config_key: :test_config },
|
24
24
|
screencapture: { klass: Inspector, method: :screencapture, config_key: :screencapture_config,
|
25
25
|
failure: FAILED_SCREENCAPTURE },
|
26
|
-
applist: {klass: Linker, method: :list}
|
26
|
+
applist: {klass: Linker, method: :list},
|
27
|
+
profile: {klass: Profiler, method: :run, config_key: :profiler_config}
|
27
28
|
}
|
28
29
|
end
|
29
30
|
# Validate Config
|
@@ -83,10 +84,16 @@ module RokuBuilder
|
|
83
84
|
# Inspect #
|
84
85
|
if options[:inspect]
|
85
86
|
info = inspector.inspect(configs[:inspect_config])
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
87
|
+
inspect_logger = Logger.new(STDOUT)
|
88
|
+
inspect_logger.formatter = proc {|_severity, _datetime, _progname, msg|
|
89
|
+
"%s\n\r" % [msg]
|
90
|
+
}
|
91
|
+
inspect_logger.unknown "=============================================================="
|
92
|
+
inspect_logger.unknown "App Name: #{info[:app_name]}"
|
93
|
+
inspect_logger.unknown "Dev ID: #{info[:dev_id]}"
|
94
|
+
inspect_logger.unknown "Creation Date: #{info[:creation_date]}"
|
95
|
+
inspect_logger.unknown "dev.zip: #{info[:dev_zip]}"
|
96
|
+
inspect_logger.unknown "=============================================================="
|
90
97
|
end
|
91
98
|
end
|
92
99
|
stager.unstage
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
module RokuBuilder
|
4
|
+
|
5
|
+
# Scene Graph Profiler
|
6
|
+
class Profiler < Util
|
7
|
+
|
8
|
+
# Run the profiler commands
|
9
|
+
# @param command [Symbol] The profiler command to run
|
10
|
+
def run(command:)
|
11
|
+
case command
|
12
|
+
when :stats
|
13
|
+
print_stats
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# Print the node stats
|
20
|
+
def print_stats
|
21
|
+
lines = get_all_nodes
|
22
|
+
xml_string = lines.join("\n")
|
23
|
+
stats = {"Total" => 0}
|
24
|
+
doc = Nokogiri::XML(xml_string)
|
25
|
+
handle_node(stats: stats, node: doc.root)
|
26
|
+
stats = stats.to_a
|
27
|
+
stats = stats.sort {|a, b| b[1] <=> a[1]}
|
28
|
+
printf "%30s | %5s\n", "Name", "Count"
|
29
|
+
stats.each do |key_pair|
|
30
|
+
printf "%30s | %5d\n", key_pair[0], key_pair[1]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle_node(stats:, node:)
|
35
|
+
node.element_children.each do |element|
|
36
|
+
stats[element.name] ||= 0
|
37
|
+
stats[element.name] += 1
|
38
|
+
stats["Total"] += 1
|
39
|
+
handle_node(stats: stats, node: element)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Retrive list of all nodes
|
44
|
+
# @return [Array<String>] Array of lines
|
45
|
+
def get_all_nodes
|
46
|
+
waitfor_config = {
|
47
|
+
'Match' => /.+/,
|
48
|
+
'Timeout' => 5
|
49
|
+
}
|
50
|
+
telnet_config ={
|
51
|
+
'Host' => @roku_ip_address,
|
52
|
+
'Port' => 8080
|
53
|
+
}
|
54
|
+
|
55
|
+
connection = Net::Telnet.new(telnet_config)
|
56
|
+
|
57
|
+
lines = []
|
58
|
+
all_txt = ""
|
59
|
+
in_nodes = false
|
60
|
+
done = false
|
61
|
+
connection.puts("sgnodes all\n")
|
62
|
+
while not done
|
63
|
+
begin
|
64
|
+
connection.waitfor(waitfor_config) do |txt|
|
65
|
+
in_nodes, done, all_txt = handle_text(all_txt: all_txt, txt: txt, in_nodes: in_nodes, lines: lines)
|
66
|
+
end
|
67
|
+
rescue Net::ReadTimeout
|
68
|
+
@logger.warn "Timed out reading profiler information"
|
69
|
+
done = true
|
70
|
+
end
|
71
|
+
end
|
72
|
+
lines
|
73
|
+
end
|
74
|
+
|
75
|
+
# Handle profiling text
|
76
|
+
# @param all_txt [String] remainder text from last run
|
77
|
+
# @param txt [String] current text from telnet
|
78
|
+
# @param in_nodes [Boolean] currently parsing test text
|
79
|
+
# @return [Boolean] currently parsing test text
|
80
|
+
def handle_text(all_txt:, txt:, in_nodes:, lines:)
|
81
|
+
all_txt += txt
|
82
|
+
end_reg = /<\/All_Nodes>/
|
83
|
+
start_reg = /<All_Nodes>/
|
84
|
+
done = false
|
85
|
+
while line = all_txt.slice!(/^.*\n/) do
|
86
|
+
in_nodes = true if line =~ start_reg
|
87
|
+
lines.push(line) if in_nodes
|
88
|
+
if line =~ end_reg
|
89
|
+
in_nodes = false
|
90
|
+
done = true
|
91
|
+
end
|
92
|
+
end
|
93
|
+
[in_nodes, done, all_txt]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/lib/roku_builder/util.rb
CHANGED
data/lib/roku_builder/version.rb
CHANGED
data/lib/roku_builder.rb
CHANGED
@@ -16,6 +16,8 @@ require "git"
|
|
16
16
|
require 'json'
|
17
17
|
#stager
|
18
18
|
require 'pstore'
|
19
|
+
#profiler
|
20
|
+
require 'nokogiri'
|
19
21
|
|
20
22
|
require "roku_builder/controller"
|
21
23
|
require "roku_builder/controller_commands"
|
@@ -28,6 +30,7 @@ require "roku_builder/packager"
|
|
28
30
|
require "roku_builder/linker"
|
29
31
|
require "roku_builder/tester"
|
30
32
|
require "roku_builder/scripter"
|
33
|
+
require "roku_builder/profiler"
|
31
34
|
require "roku_builder/manifest_manager"
|
32
35
|
require "roku_builder/config_manager"
|
33
36
|
require "roku_builder/config_validator"
|
data/roku_builder.gemspec
CHANGED
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_dependency "git", "~> 1.3"
|
27
27
|
spec.add_dependency "net-ping", "~> 1.7"
|
28
28
|
spec.add_dependency "net-telnet", "~> 0.1"
|
29
|
+
spec.add_dependency "nokogiri", "~> 1.6"
|
29
30
|
|
30
31
|
spec.add_development_dependency "bundler", "~> 1.7"
|
31
32
|
spec.add_development_dependency "rake", "~> 11.1"
|
@@ -272,7 +272,7 @@ class ConfigManagerTest < Minitest::Test
|
|
272
272
|
FileUtils.cp(File.join(File.dirname(target_config), "parent_config.json"), target_config)
|
273
273
|
|
274
274
|
options = {validate: true, config: target_config, stage: :production}
|
275
|
-
code, config,
|
275
|
+
code, config, _configs = RokuBuilder::ConfigManager.load_config(options: options, logger: logger)
|
276
276
|
assert_equal RokuBuilder::SUCCESS, code
|
277
277
|
assert_equal "app2", config[:projects][:p2][:app_name]
|
278
278
|
assert_equal "/dev/null", config[:projects][:p2][:directory]
|
@@ -75,7 +75,9 @@ class ControllerCommandsTest < Minitest::Test
|
|
75
75
|
RokuBuilder::Packager.stub(:new, packager) do
|
76
76
|
RokuBuilder::Inspector.stub(:new, inspector) do
|
77
77
|
RokuBuilder::Stager.stub(:new, stager) do
|
78
|
-
|
78
|
+
Logger.stub(:new, logger) do
|
79
|
+
code = RokuBuilder::Controller.send(:execute_commands, {options: options, config: config, configs: configs, logger: logger})
|
80
|
+
end
|
79
81
|
end
|
80
82
|
end
|
81
83
|
end
|
@@ -117,7 +119,9 @@ class ControllerCommandsTest < Minitest::Test
|
|
117
119
|
RokuBuilder::Packager.stub(:new, packager) do
|
118
120
|
RokuBuilder::Inspector.stub(:new, inspector) do
|
119
121
|
RokuBuilder::Stager.stub(:new, stager) do
|
120
|
-
|
122
|
+
Logger.stub(:new, logger) do
|
123
|
+
code = RokuBuilder::Controller.send(:execute_commands, {options: options, config: config, configs: configs, logger: logger})
|
124
|
+
end
|
121
125
|
end
|
122
126
|
end
|
123
127
|
end
|
@@ -398,7 +402,7 @@ class ControllerCommandsTest < Minitest::Test
|
|
398
402
|
configs = {stage_config: {}}
|
399
403
|
code = nil
|
400
404
|
scripter_config = {attribute: :title, configs: configs}
|
401
|
-
print_check = lambda {|
|
405
|
+
print_check = lambda {|print_config| RokuBuilder::SUCCESS if print_config == scripter_config }
|
402
406
|
stager.expect(:stage, true)
|
403
407
|
stager.expect(:unstage, true)
|
404
408
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
require_relative "test_helper.rb"
|
4
|
+
|
5
|
+
class ProfilerTest < Minitest::Test
|
6
|
+
def test_profiler_stats
|
7
|
+
waitfor = Proc.new do |config, &blk|
|
8
|
+
assert_equal(/.+/, config["Match"])
|
9
|
+
assert_equal(5, config["Timeout"])
|
10
|
+
txt = "<All_Nodes><NodeA /><NodeB /><NodeC><NodeD /></NodeC></All_Nodes>\n"
|
11
|
+
blk.call(txt)
|
12
|
+
true
|
13
|
+
end
|
14
|
+
connection = Minitest::Mock.new
|
15
|
+
device_config = {
|
16
|
+
ip: "111.222.333",
|
17
|
+
user: "user",
|
18
|
+
password: "password",
|
19
|
+
logger: Logger.new("/dev/null")
|
20
|
+
}
|
21
|
+
profiler = RokuBuilder::Profiler.new(**device_config)
|
22
|
+
|
23
|
+
connection.expect(:puts, nil, ["sgnodes all\n"])
|
24
|
+
connection.expect(:waitfor, nil, &waitfor)
|
25
|
+
|
26
|
+
Net::Telnet.stub(:new, connection) do
|
27
|
+
profiler.stub(:printf, nil) do
|
28
|
+
profiler.run(command: :stats)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
connection.verify
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roku_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- greeneca
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.1'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: nokogiri
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.6'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.6'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: bundler
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -267,6 +281,7 @@ files:
|
|
267
281
|
- lib/roku_builder/monitor.rb
|
268
282
|
- lib/roku_builder/navigator.rb
|
269
283
|
- lib/roku_builder/packager.rb
|
284
|
+
- lib/roku_builder/profiler.rb
|
270
285
|
- lib/roku_builder/scripter.rb
|
271
286
|
- lib/roku_builder/stager.rb
|
272
287
|
- lib/roku_builder/tester.rb
|
@@ -288,6 +303,7 @@ files:
|
|
288
303
|
- tests/roku_builder/monitor_test.rb
|
289
304
|
- tests/roku_builder/navigator_test.rb
|
290
305
|
- tests/roku_builder/packager_test.rb
|
306
|
+
- tests/roku_builder/profiler_test.rb
|
291
307
|
- tests/roku_builder/scripter_test.rb
|
292
308
|
- tests/roku_builder/stager_test.rb
|
293
309
|
- tests/roku_builder/test_files/controller_config_test/valid_config.json
|