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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: feed4192cc00b8d7f1abb2638fa2c05e6ca9be88
4
- data.tar.gz: d84f3a2ede1dd2ef20da90b11bd3c225437e220f
3
+ metadata.gz: c19396d0acc214911d18c3be499dc2577f1a10de
4
+ data.tar.gz: 2b0fc5733f711314090aa5d5758f803e105df7af
5
5
  SHA512:
6
- metadata.gz: 1cf3453ce1d28a1c43c528eb85d3dc83444da9e48a86a1c55880ef4f044939299f10e0b16b2df802a0f0d675b5399b99dc83ca6fc4a19ee93bd7f78ce13a77dd
7
- data.tar.gz: b5bbc214dcd936dbe7a6fcf88417f407f46283e0625dc8384e875a36534a60d798aefc85b311c05f4cdf7606f2b7c6c374a2dffa43edb7a75c2f732357de6f01
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.7.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 interactions with the roku:
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 fgile naming when building from a referance
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
- logger.unknown "App Name: #{info[:app_name]}"
87
- logger.unknown "Dev ID: #{info[:dev_id]}"
88
- logger.unknown "Creation Date: #{info[:creation_date]}"
89
- logger.unknown "dev.zip: #{info[:dev_zip]}"
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
@@ -15,7 +15,8 @@ module RokuBuilder
15
15
  @device_config = {
16
16
  ip: ip,
17
17
  user: user,
18
- password: password
18
+ password: password,
19
+ logger: logger
19
20
  }
20
21
  @roku_ip_address = ip
21
22
  @dev_username = user
@@ -2,5 +2,5 @@
2
2
 
3
3
  module RokuBuilder
4
4
  # Version of the RokuBuilder Gem
5
- VERSION = "3.7.3"
5
+ VERSION = "3.8.0"
6
6
  end
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, configs = RokuBuilder::ConfigManager.load_config(options: options, logger: logger)
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
- code = RokuBuilder::Controller.send(:execute_commands, {options: options, config: config, configs: configs, logger: logger})
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
- code = RokuBuilder::Controller.send(:execute_commands, {options: options, config: config, configs: configs, logger: logger})
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 {|config| RokuBuilder::SUCCESS if config == scripter_config }
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.7.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-28 00:00:00.000000000 Z
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