roku_builder 4.8.2 → 4.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7406e49f56028e7b453dced404c279af36f4619e
4
- data.tar.gz: 67cffee550e2059add97755ae247e29966a6f6ef
3
+ metadata.gz: 826bb48694fa32bff380d9ea9143772b019d3845
4
+ data.tar.gz: ab2c380e350b704fe788f04fcdab7c30655f176c
5
5
  SHA512:
6
- metadata.gz: 953875238157d4dfda237ca8c860af59ab85c205d4d6b8dbe6d79e837492daa399464e8b99778456bb52b3884f601e4c9d70b8958cd589518d89de16a5990d0e
7
- data.tar.gz: 31b36d4a0720ce67ce20c1e5e5c6d3c505ab1a1dbf2213b549e8db6383dd110da71679574d9ccd7881ce9c37a4cef177fad55c6670e75462bd3b0b9f8b635a69
6
+ metadata.gz: 24f1e3f0f88aa3bd262e48a3f83b1a38962e0c050432da73c6d230447dbc807179577ba7ceddecb1cf1aa20b05a2c13d11e0bfea85b6e8311ae506bc0527b209
7
+ data.tar.gz: 2cb77fd249b35bfa5e4b0c819f317911642944e6ee1c47120a8773617224a1c9b7bf8c63e244fd1157eb8f5f047d029f8657e106c5a184ff50d26897751fe654
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ = 4.9.0 =
2
+
3
+ - Add performance checks to --analyze command
4
+
1
5
  = 4.8.2 =
2
6
 
3
7
  - Sort --profile textures command
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- roku_builder (4.8.2)
4
+ roku_builder (4.9.0)
5
5
  faraday (~> 0.13)
6
6
  faraday-digestauth (~> 0.2)
7
7
  git (~> 1.3)
@@ -0,0 +1,12 @@
1
+ # ********** Copyright 2016 Viacom, Inc. Apache 2.0 **********
2
+
3
+ class ::Array
4
+ def any_is_start?(full_string)
5
+ each do |item|
6
+ if full_string.start_with?(item)
7
+ return true
8
+ end
9
+ end
10
+ return false
11
+ end
12
+ end
@@ -17,6 +17,10 @@ module RokuBuilder
17
17
  parser.on("--analyze", "Run a static analysis on a given stage") do
18
18
  options[:analyze] = true
19
19
  end
20
+ parser.separator "Options:"
21
+ parser.on("--inclide-libraries", "Include libraries in analyze") do
22
+ options[:include_libraries] = true
23
+ end
20
24
  end
21
25
 
22
26
  def self.dependencies
@@ -26,7 +30,9 @@ module RokuBuilder
26
30
  def analyze(options:, quiet: false)
27
31
  @options = options
28
32
  @warnings = []
29
- analyzer_config = get_analyzer_config
33
+ plugin_config = get_config(".roku_builder_analyze.json", true) || {}
34
+ analyzer_config = get_config("inspector_config.json")
35
+ performance_config = get_config("performance_config.json")
30
36
  @inspector_config = analyzer_config[:inspectors]
31
37
  loader = Loader.new(config: @config)
32
38
  Dir.mktmpdir do |dir|
@@ -35,16 +41,23 @@ module RokuBuilder
35
41
  manifest_inspector = ManifestInspector.new(config: @config, dir: dir, raf: raf_inspector)
36
42
  @warnings.concat(manifest_inspector.run(analyzer_config[:inspectors]))
37
43
  has_source_dir = false
44
+ libraries = plugin_config[:libraries]
45
+ libraries ||= []
38
46
  Dir.glob(File.join(dir, "**", "*")).each do |file_path|
39
- if File.file?(file_path) and file_path.end_with?(".brs", ".xml")
40
- line_inspector = LineInspector.new(config: @config, raf: raf_inspector, inspector_config: analyzer_config[:lineInspectors])
41
- @warnings.concat(line_inspector.run(file_path))
42
- end
43
- if file_path.end_with?("__MACOSX")
44
- add_warning(warning: :packageMacosxDirectory, path: file_path)
45
- end
46
- if file_path.end_with?(".zip", ".md", ".pkg")
47
- add_warning(warning: :packageExtraneousFiles, path: file_path)
47
+ file = file_path.dup; file.slice!(dir)
48
+ unless libraries.any_is_start?(file) and not @options[:include_libraries]
49
+ if File.file?(file_path) and file_path.end_with?(".brs", ".xml")
50
+ line_inspector_config = analyzer_config[:lineInspectors]
51
+ line_inspector_config += performance_config
52
+ line_inspector = LineInspector.new(config: @config, raf: raf_inspector, inspector_config: line_inspector_config)
53
+ @warnings.concat(line_inspector.run(file_path))
54
+ end
55
+ if file_path.end_with?("__MACOSX")
56
+ add_warning(warning: :packageMacosxDirectory, path: file_path)
57
+ end
58
+ if file_path.end_with?(".zip", ".md", ".pkg")
59
+ add_warning(warning: :packageExtraneousFiles, path: file_path)
60
+ end
48
61
  end
49
62
  has_source_dir = true if file_path.end_with?("source")
50
63
  end
@@ -59,12 +72,13 @@ module RokuBuilder
59
72
 
60
73
  private
61
74
 
62
- def get_analyzer_config
63
- #url = "http://devtools.web.roku.com/static-code-analyzer/config.json"
64
- #url = @options[:analyze_config] if @options[:analyze_config]
65
- #JSON.parse(Faraday.get(url).body, {symbolize_names: true})
66
- file = File.join(File.dirname(__FILE__), "inspector_config.json")
67
- JSON.parse(File.open(file).read, {symbolize_names: true})
75
+ def get_config(file, project_root=false)
76
+ if project_root
77
+ file = File.join(@config.root_dir, file)
78
+ else
79
+ file = File.join(File.dirname(__FILE__), file)
80
+ end
81
+ JSON.parse(File.open(file).read, {symbolize_names: true}) if File.exist? file
68
82
  end
69
83
 
70
84
  def add_warning(warning:, path:)
@@ -15,6 +15,7 @@ module RokuBuilder
15
15
  line_number = 0
16
16
  in_xml_comment = false
17
17
  file.readlines.each do |line|
18
+ full_line = line.dup
18
19
  line = line.partition("'").first if file_path.end_with?(".brs")
19
20
  if file_path.end_with?(".xml")
20
21
  if in_xml_comment
@@ -28,8 +29,10 @@ module RokuBuilder
28
29
  in_xml_comment = true if line.gsub!(/<!--.*/, "")
29
30
  end
30
31
  @inspector_config.each do |line_inspector|
31
- if /#{line_inspector[:regex]}/.match(line)
32
- add_warning(inspector: line_inspector, file: file_path, line: line_number)
32
+ if /#{line_inspector[:regex]}/i.match(line)
33
+ unless /'.*ignore-warning/i.match(full_line)
34
+ add_warning(inspector: line_inspector, file: file_path, line: line_number)
35
+ end
33
36
  end
34
37
  end
35
38
  @raf_inspector.inspect_line(line: line, file: file_path, line_number: line_number)
@@ -0,0 +1,27 @@
1
+ [
2
+ {
3
+ "regex": "\\sas\\s(Object|Boolean|String|Integer|LongInteger|Double|Float|Function|Dynamic)",
4
+ "severity": "warning",
5
+ "message": "Found function return type. Consider removing"
6
+ } ,
7
+ {
8
+ "regex": "DoesExist",
9
+ "severity": "warning",
10
+ "message": "Found DoesExist check. Try using invalid check on dot referance"
11
+ },
12
+ {
13
+ "regex": "\\[\"[^\"]+\"\\]",
14
+ "severity": "warning",
15
+ "message": "Found AA String referance. Try switching to dot referance"
16
+ },
17
+ {
18
+ "regex": "FOR.*TO",
19
+ "severity": "warning",
20
+ "message": "For loop found. Try switching to a For Each loop"
21
+ },
22
+ {
23
+ "regex": "\"roRegex\"",
24
+ "severity": "warning",
25
+ "message": "Regexp found. Avoid if possible"
26
+ }
27
+ ]
@@ -2,5 +2,5 @@
2
2
 
3
3
  module RokuBuilder
4
4
  # Version of the RokuBuilder Gem
5
- VERSION = "4.8.2"
5
+ VERSION = "4.9.0"
6
6
  end
@@ -9,7 +9,7 @@ module RokuBuilder
9
9
  RokuBuilder.class_variable_set(:@@dev, false)
10
10
  RokuBuilder.setup_plugins
11
11
  register_plugins(Analyzer)
12
- @config, @options = build_config_options_objects(AnalyzerTest, {analyze: true, working: true, quiet_analyze: true}, false)
12
+ @config, @options = build_config_options_objects(AnalyzerTest, {analyze: true, working: true}, false)
13
13
  @root_dir = @config.root_dir
14
14
  @device_config = @config.device_config
15
15
  FileUtils.cp(File.join(@root_dir, "manifest_template"), File.join(@root_dir, "manifest"))
@@ -26,6 +26,7 @@ module RokuBuilder
26
26
  def teardown
27
27
  manifest = File.join(@root_dir, "manifest")
28
28
  FileUtils.rm(manifest) if File.exist?(manifest)
29
+ remove_config
29
30
  @request_stubs.each {|req| remove_request_stub(req)}
30
31
  end
31
32
  def test_analyzer_parse_commands
@@ -252,7 +253,7 @@ module RokuBuilder
252
253
  def test_macosx_directory
253
254
  config = good_config(AnalyzerTest)
254
255
  config[:projects][:project1][:folders].push("Test__MACOSX")
255
- @config, @options = build_config_options_objects(AnalyzerTest, {analyze: true, working: true, quiet_analyze: true}, false, config)
256
+ @config, @options = build_config_options_objects(AnalyzerTest, {analyze: true, working: true}, false, config)
256
257
  folder = File.join(@root_dir, "Test__MACOSX")
257
258
  Dir.mkdir(folder) unless File.exist?(folder)
258
259
  warnings = test
@@ -297,6 +298,70 @@ module RokuBuilder
297
298
  def test_logging_info
298
299
  test_logger_with_file_content(text: "\"roSGScreen\"", severity: :info)
299
300
  end
301
+ def test_performance_function_return_types
302
+ warnings = test_file(text: "function test() as String\n? \"test\"\nend function")
303
+ assert_equal 1, warnings.count
304
+ assert_match(/function return/, warnings[0][:message])
305
+ end
306
+ def test_performance_function_return_types_lowercase
307
+ warnings = test_file(text: "function test() as string\n? \"test\"\nend function")
308
+ assert_equal 1, warnings.count
309
+ assert_match(/function return/, warnings[0][:message])
310
+ end
311
+ def test_performance_aa_does_exist
312
+ warnings = test_file(text: "exists = aa.doesExist(\"test\")")
313
+ assert_equal 1, warnings.count
314
+ assert_match(/DoesExist check/, warnings[0][:message])
315
+ end
316
+ def test_performance_aa_string_ref
317
+ warnings = test_file(text: "aa[\"test\"] = \"test\"")
318
+ assert_equal 1, warnings.count
319
+ assert_match(/String referance/, warnings[0][:message])
320
+ end
321
+ def test_performance_for_loop
322
+ warnings = test_file(text: "FOR i=0 TO 10\n ? i\nEND FOR")
323
+ assert_equal 1, warnings.count
324
+ assert_match(/For loop found/, warnings[0][:message])
325
+ end
326
+ def test_performance_for_loop_lower_case
327
+ warnings = test_file(text: "for i=0 to 10\n ? i\nEND FOR")
328
+ assert_equal 1, warnings.count
329
+ assert_match(/For loop found/, warnings[0][:message])
330
+ end
331
+ def test_performance_for_loop_title_case
332
+ warnings = test_file(text: "For i=0 To 10\n ? i\nEND FOR")
333
+ assert_equal 1, warnings.count
334
+ assert_match(/For loop found/, warnings[0][:message])
335
+ end
336
+ def test_performance_regex
337
+ warnings = test_file(text: "\"roRegex\"")
338
+ assert_equal 1, warnings.count
339
+ assert_match(/Regexp found/, warnings[0][:message])
340
+ end
341
+ def test_library_skip
342
+ set_config({libraries: ["/source/test.brs"]})
343
+ warnings = test_file(text: "\"roRegex\"")
344
+ assert_equal 0, warnings.count
345
+ end
346
+ def test_library_skip_folder
347
+ set_config({libraries: ["/source"]})
348
+ warnings = test_file(text: "\"roRegex\"")
349
+ assert_equal 0, warnings.count
350
+ end
351
+ def test_library_include
352
+ @config, @options = build_config_options_objects(AnalyzerTest, {analyze: true, working: true, include_libraries: true}, false)
353
+ set_config({libraries: ["/source/test.brs"]})
354
+ warnings = test_file(text: "\"roRegex\"")
355
+ assert_equal 1, warnings.count
356
+ end
357
+ def test_performance_skip_warning_comment
358
+ warnings = test_file(text: "function test() as String 'ignore-warning\n? \"test\"\nend function")
359
+ assert_equal 0, warnings.count
360
+ end
361
+ def test_performance_skip_warning_comment_upper_case
362
+ warnings = test_file(text: "function test() as String 'IGNORE-WARNING\n? \"test\"\nend function")
363
+ assert_equal 0, warnings.count
364
+ end
300
365
 
301
366
 
302
367
  private
@@ -342,6 +407,19 @@ module RokuBuilder
342
407
  analyzer.analyze(options: @options, quiet: quiet)
343
408
  end
344
409
 
410
+ def set_config(config_content)
411
+ config = File.join(@root_dir, ".roku_builder_analyze.json")
412
+ File.open(config, "w") do |file|
413
+ file.write(config_content.to_json)
414
+ end
415
+ end
416
+
417
+ def remove_config
418
+ config = File.join(@root_dir, ".roku_builder_analyze.json")
419
+ FileUtils.rm(config) if File.exist? config
420
+ end
421
+
422
+
345
423
  def print_all(warnings)
346
424
  warnings.each do |warning|
347
425
  puts warning[:message]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roku_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.8.2
4
+ version: 4.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - greeneca
@@ -474,6 +474,7 @@ files:
474
474
  - intergration/roku_builder/test_scripter.rb
475
475
  - intergration/roku_builder/test_tester.rb
476
476
  - lib/roku_builder.rb
477
+ - lib/roku_builder/array.rb
477
478
  - lib/roku_builder/config.rb
478
479
  - lib/roku_builder/config_parser.rb
479
480
  - lib/roku_builder/config_validator.rb
@@ -496,6 +497,7 @@ files:
496
497
  - lib/roku_builder/plugins/monitor.rb
497
498
  - lib/roku_builder/plugins/navigator.rb
498
499
  - lib/roku_builder/plugins/packager.rb
500
+ - lib/roku_builder/plugins/performance_config.json
499
501
  - lib/roku_builder/plugins/profiler.rb
500
502
  - lib/roku_builder/plugins/raf_inspector.rb
501
503
  - lib/roku_builder/plugins/scripter.rb