roku_builder 3.7.3 → 3.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|