roku_builder 3.13.0 → 4.0.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.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CHANGELOG +12 -0
  4. data/Gemfile.lock +22 -7
  5. data/Guardfile +3 -3
  6. data/README.md +22 -398
  7. data/bin/roku +1 -194
  8. data/config.json.example +1 -1
  9. data/intergration/roku_builder/test_core.rb +52 -0
  10. data/intergration/roku_builder/test_files/core_intergration_test/manifest_template +7 -0
  11. data/intergration/roku_builder/test_files/core_intergration_test/test.pkg +0 -0
  12. data/intergration/roku_builder/test_files/inspector_intergration_test/components/rectanglescene.xml +28 -0
  13. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  14. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  15. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_fhd.jpg +0 -0
  16. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_hd.jpg +0 -0
  17. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_sd.jpg +0 -0
  18. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  19. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  20. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  21. data/intergration/roku_builder/test_files/inspector_intergration_test/manifest +21 -0
  22. data/intergration/roku_builder/test_files/inspector_intergration_test/source/main.brs +23 -0
  23. data/intergration/roku_builder/test_files/inspector_intergration_test/test.pkg +0 -0
  24. data/intergration/roku_builder/test_files/linker_intergration_test/components/rectanglescene.xml +29 -0
  25. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  26. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  27. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_fhd.jpg +0 -0
  28. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_hd.jpg +0 -0
  29. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_sd.jpg +0 -0
  30. data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  31. data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  32. data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  33. data/intergration/roku_builder/test_files/linker_intergration_test/manifest +21 -0
  34. data/intergration/roku_builder/test_files/linker_intergration_test/source/main.brs +21 -0
  35. data/intergration/roku_builder/test_files/linker_intergration_test/test.pkg +0 -0
  36. data/intergration/roku_builder/test_files/loader_intergration_test/components/rectanglescene.xml +29 -0
  37. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  38. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  39. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_fhd.jpg +0 -0
  40. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_hd.jpg +0 -0
  41. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_sd.jpg +0 -0
  42. data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  43. data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  44. data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  45. data/intergration/roku_builder/test_files/loader_intergration_test/manifest +21 -0
  46. data/intergration/roku_builder/test_files/loader_intergration_test/source/main.brs +21 -0
  47. data/intergration/roku_builder/test_files/loader_intergration_test/test.pkg +0 -0
  48. data/intergration/roku_builder/test_files/monitor_intergration_test/components/rectanglescene.xml +29 -0
  49. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  50. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  51. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_fhd.jpg +0 -0
  52. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_hd.jpg +0 -0
  53. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_sd.jpg +0 -0
  54. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  55. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  56. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  57. data/intergration/roku_builder/test_files/monitor_intergration_test/manifest +21 -0
  58. data/intergration/roku_builder/test_files/monitor_intergration_test/source/main.brs +21 -0
  59. data/intergration/roku_builder/test_files/monitor_intergration_test/test.pkg +0 -0
  60. data/intergration/roku_builder/test_files/navigator_intergration_test/components/rectanglescene.xml +29 -0
  61. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  62. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  63. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_fhd.jpg +0 -0
  64. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_hd.jpg +0 -0
  65. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_sd.jpg +0 -0
  66. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  67. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  68. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  69. data/intergration/roku_builder/test_files/navigator_intergration_test/manifest +21 -0
  70. data/intergration/roku_builder/test_files/navigator_intergration_test/source/main.brs +21 -0
  71. data/intergration/roku_builder/test_files/navigator_intergration_test/test.pkg +0 -0
  72. data/intergration/roku_builder/test_files/packager_intergration_test/components/rectanglescene.xml +29 -0
  73. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  74. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  75. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_fhd.jpg +0 -0
  76. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_hd.jpg +0 -0
  77. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_sd.jpg +0 -0
  78. data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  79. data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  80. data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  81. data/intergration/roku_builder/test_files/packager_intergration_test/manifest +21 -0
  82. data/intergration/roku_builder/test_files/packager_intergration_test/source/main.brs +21 -0
  83. data/intergration/roku_builder/test_files/packager_intergration_test/test.pkg +0 -0
  84. data/intergration/roku_builder/test_files/profiler_intergration_test/components/rectanglescene.xml +29 -0
  85. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  86. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  87. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_fhd.jpg +0 -0
  88. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_hd.jpg +0 -0
  89. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_sd.jpg +0 -0
  90. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  91. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  92. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  93. data/intergration/roku_builder/test_files/profiler_intergration_test/manifest +21 -0
  94. data/intergration/roku_builder/test_files/profiler_intergration_test/source/main.brs +21 -0
  95. data/intergration/roku_builder/test_files/profiler_intergration_test/test.pkg +0 -0
  96. data/intergration/roku_builder/test_files/scripter_intergration_test/components/rectanglescene.xml +29 -0
  97. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  98. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  99. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_fhd.jpg +0 -0
  100. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_hd.jpg +0 -0
  101. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_sd.jpg +0 -0
  102. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  103. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  104. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  105. data/intergration/roku_builder/test_files/scripter_intergration_test/manifest +21 -0
  106. data/intergration/roku_builder/test_files/scripter_intergration_test/source/main.brs +21 -0
  107. data/intergration/roku_builder/test_files/scripter_intergration_test/test.pkg +0 -0
  108. data/intergration/roku_builder/test_files/tester_intergration_test/components/rectanglescene.xml +29 -0
  109. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  110. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  111. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_fhd.jpg +0 -0
  112. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_hd.jpg +0 -0
  113. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_sd.jpg +0 -0
  114. data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  115. data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  116. data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  117. data/intergration/roku_builder/test_files/tester_intergration_test/manifest +21 -0
  118. data/intergration/roku_builder/test_files/tester_intergration_test/source/main.brs +21 -0
  119. data/intergration/roku_builder/test_files/tester_intergration_test/test.pkg +0 -0
  120. data/intergration/roku_builder/test_helper.rb +138 -0
  121. data/intergration/roku_builder/test_inspector.rb +35 -0
  122. data/intergration/roku_builder/test_linker.rb +32 -0
  123. data/intergration/roku_builder/test_loader.rb +38 -0
  124. data/intergration/roku_builder/test_monitor.rb +21 -0
  125. data/intergration/roku_builder/test_navigator.rb +34 -0
  126. data/intergration/roku_builder/test_packager.rb +41 -0
  127. data/intergration/roku_builder/test_profiler.rb +48 -0
  128. data/intergration/roku_builder/test_scripter.rb +38 -0
  129. data/intergration/roku_builder/test_tester.rb +21 -0
  130. data/lib/roku_builder.rb +143 -154
  131. data/lib/roku_builder/config.rb +17 -40
  132. data/lib/roku_builder/config_parser.rb +49 -200
  133. data/lib/roku_builder/config_validator.rb +1 -1
  134. data/lib/roku_builder/errors.rb +12 -0
  135. data/lib/roku_builder/git.rb +28 -0
  136. data/lib/roku_builder/hash.rb +8 -0
  137. data/lib/roku_builder/manifest.rb +121 -0
  138. data/lib/roku_builder/options.rb +68 -29
  139. data/lib/roku_builder/plugin.rb +30 -0
  140. data/lib/roku_builder/plugins/core.rb +117 -0
  141. data/lib/roku_builder/plugins/inspector.rb +104 -0
  142. data/lib/roku_builder/{linker.rb → plugins/linker.rb} +38 -12
  143. data/lib/roku_builder/plugins/loader.rb +152 -0
  144. data/lib/roku_builder/{monitor.rb → plugins/monitor.rb} +20 -9
  145. data/lib/roku_builder/{navigator.rb → plugins/navigator.rb} +136 -88
  146. data/lib/roku_builder/plugins/packager.rb +194 -0
  147. data/lib/roku_builder/plugins/profiler.rb +135 -0
  148. data/lib/roku_builder/plugins/scripter.rb +53 -0
  149. data/lib/roku_builder/{tester.rb → plugins/tester.rb} +28 -19
  150. data/lib/roku_builder/stager.rb +48 -12
  151. data/lib/roku_builder/string.rb +20 -0
  152. data/lib/roku_builder/util.rb +10 -34
  153. data/lib/roku_builder/version.rb +1 -1
  154. data/rakefile +5 -1
  155. data/roku_builder.gemspec +2 -0
  156. data/test/roku_builder/plugins/test_core.rb +112 -0
  157. data/test/roku_builder/plugins/test_inspector.rb +165 -0
  158. data/test/roku_builder/plugins/test_linker.rb +123 -0
  159. data/test/roku_builder/plugins/test_loader.rb +115 -0
  160. data/test/roku_builder/plugins/test_monitor.rb +141 -0
  161. data/test/roku_builder/plugins/test_navigator.rb +274 -0
  162. data/test/roku_builder/plugins/test_packager.rb +202 -0
  163. data/test/roku_builder/plugins/test_profiler.rb +127 -0
  164. data/test/roku_builder/plugins/test_scripter.rb +110 -0
  165. data/test/roku_builder/plugins/test_tester.rb +109 -0
  166. data/test/roku_builder/test_config.rb +51 -35
  167. data/test/roku_builder/test_config_parser.rb +76 -154
  168. data/test/roku_builder/test_config_validator.rb +18 -1
  169. data/test/roku_builder/test_files/{loader_test/manifest → config_parser_test/test.pkg} +0 -0
  170. data/test/roku_builder/test_files/config_test/config.json +3 -0
  171. data/test/roku_builder/test_files/controller_commands_test/manifest_template +7 -0
  172. data/test/roku_builder/test_files/core_test/manifest_template +7 -0
  173. data/test/roku_builder/test_files/core_test/test.pkg +0 -0
  174. data/test/roku_builder/test_files/inspector_test/manifest +6 -0
  175. data/test/roku_builder/test_files/inspector_test/test.pkg +0 -0
  176. data/test/roku_builder/test_files/linker_test/manifest +6 -0
  177. data/test/roku_builder/test_files/linker_test/test.pkg +0 -0
  178. data/test/roku_builder/test_files/loader_test/manifest_template +6 -0
  179. data/test/roku_builder/test_files/loader_test/test.pkg +0 -0
  180. data/test/roku_builder/test_files/loader_test/test.zip +0 -0
  181. data/test/roku_builder/test_files/manifest_test/manifest_comments +6 -0
  182. data/test/roku_builder/test_files/manifest_test/manifest_template +7 -0
  183. data/test/roku_builder/test_files/manifest_test/test.zip +0 -0
  184. data/test/roku_builder/test_files/packager_test/manifest +6 -0
  185. data/test/roku_builder/test_files/packager_test/scripter_test/manifest +6 -0
  186. data/test/roku_builder/test_files/packager_test/test.pkg +0 -0
  187. data/test/roku_builder/test_files/roku_builder_test/config.json +32 -0
  188. data/test/roku_builder/test_files/scripter_test/manifest +6 -0
  189. data/test/roku_builder/test_files/scripter_test/test.pkg +0 -0
  190. data/test/roku_builder/test_files/stager_test/test.pkg +0 -0
  191. data/test/roku_builder/test_files/tester_test/manifest +6 -0
  192. data/test/roku_builder/test_files/tester_test/test.pkg +0 -0
  193. data/test/roku_builder/test_helper.rb +44 -11
  194. data/test/roku_builder/test_logger.rb +1 -0
  195. data/test/roku_builder/test_manifest.rb +99 -0
  196. data/test/roku_builder/test_options.rb +106 -77
  197. data/test/roku_builder/test_options_plugins.rb +111 -0
  198. data/test/roku_builder/test_plugin.rb +48 -0
  199. data/test/roku_builder/test_roku_builder.rb +239 -0
  200. data/test/roku_builder/test_stager.rb +49 -101
  201. data/test/roku_builder/test_util.rb +19 -4
  202. metadata +241 -47
  203. data/lib/roku_builder/controller.rb +0 -98
  204. data/lib/roku_builder/controller_commands.rb +0 -224
  205. data/lib/roku_builder/error_handler.rb +0 -142
  206. data/lib/roku_builder/inspector.rb +0 -82
  207. data/lib/roku_builder/keyer.rb +0 -106
  208. data/lib/roku_builder/loader.rb +0 -131
  209. data/lib/roku_builder/manifest_manager.rb +0 -126
  210. data/lib/roku_builder/packager.rb +0 -43
  211. data/lib/roku_builder/profiler.rb +0 -96
  212. data/lib/roku_builder/scripter.rb +0 -39
  213. data/test/roku_builder/test_controller.rb +0 -70
  214. data/test/roku_builder/test_controller_commands.rb +0 -465
  215. data/test/roku_builder/test_error_handler.rb +0 -90
  216. data/test/roku_builder/test_inspector.rb +0 -298
  217. data/test/roku_builder/test_keyer.rb +0 -176
  218. data/test/roku_builder/test_linker.rb +0 -110
  219. data/test/roku_builder/test_loader.rb +0 -337
  220. data/test/roku_builder/test_manifest_manager.rb +0 -103
  221. data/test/roku_builder/test_monitor.rb +0 -137
  222. data/test/roku_builder/test_navigator.rb +0 -280
  223. data/test/roku_builder/test_packager.rb +0 -127
  224. data/test/roku_builder/test_profiler.rb +0 -35
  225. data/test/roku_builder/test_scripter.rb +0 -102
  226. data/test/roku_builder/test_tester.rb +0 -130
@@ -0,0 +1,194 @@
1
+ # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
+
3
+ module RokuBuilder
4
+
5
+ class Packager < Util
6
+ extend Plugin
7
+
8
+ def self.commands
9
+ {
10
+ package: {device: true, source: true, stage: true, exclude: true},
11
+ genkey: {device: true},
12
+ key: {device: true, source: true}
13
+ }
14
+ end
15
+
16
+ def self.parse_options(parser:, options:)
17
+ parser.separator "Commands:"
18
+ parser.on("-p", "--package", "Package an app") do
19
+ options[:package] = true
20
+ end
21
+ parser.on("-k", "--key", "Change device key") do
22
+ options[:key] = true
23
+ end
24
+ parser.on("--genkey", "Generate a new key") do
25
+ options[:genkey] = true
26
+ end
27
+ parser.separator "Options:"
28
+ parser.on("-i", "--inspect-package", "Inspect package after packaging") do
29
+ options[:inspect_package] = true
30
+ end
31
+ end
32
+
33
+ def self.dependencies
34
+ [Loader, Inspector]
35
+ end
36
+
37
+ def package(options:)
38
+ check_options(options)
39
+ #sideload
40
+ Loader.new(config: @config).sideload(options: options)
41
+ #rekey
42
+ key(options: options)
43
+ #package
44
+ sign_package(app_name_version: "", password: @config.key[:password], stage: options[:stage])
45
+ #inspect
46
+ if options[:inspect_package]
47
+ @config.in = @config.out
48
+ options[:password] = @config.key[:password]
49
+ Inspector.new(config: @config).inspect(options: options)
50
+ end
51
+ end
52
+
53
+ def genkey(options:)
54
+ password, dev_id = generate_new_key()
55
+ @logger.unknown("Password: "+password)
56
+ @logger.info("DevID: "+dev_id)
57
+
58
+ out = @config.out
59
+ out[:file] ||= "key_"+dev_id+".pkg"
60
+ @config.out = out
61
+
62
+ Dir.mktmpdir { |dir|
63
+ config_copy = @config.dup
64
+ config_copy.root_dir = dir
65
+ Manifest.generate({config: config_copy, attributes: {}})
66
+ Dir.mkdir(File.join(dir, "source"))
67
+ File.open(File.join(dir, "source", "main.brs"), "w") do |io|
68
+ io.puts "sub main()"
69
+ io.puts " print \"Load\""
70
+ io.puts "end sub"
71
+ end
72
+ loader = Loader.new(config: config_copy)
73
+ options[:current] = true
74
+ loader.sideload(options: options)
75
+ sign_package(app_name_version: "key_"+dev_id, password: password, stage: options[:stage])
76
+ @logger.unknown("Keyed PKG: #{File.join(@config.out[:folder], @config.out[:file])}")
77
+ }
78
+ end
79
+
80
+ # Sets the key on the roku device
81
+ # @param keyed_pkg [String] Path for a package signed with the desired key
82
+ # @param password [String] Password for the package
83
+ # @return [Boolean] True if key changed, false otherwise
84
+ def key(options:)
85
+ oldId = dev_id
86
+
87
+ # upload new key with password
88
+ payload = {
89
+ mysubmit: "Rekey",
90
+ passwd: @config.key[:password],
91
+ archive: Faraday::UploadIO.new(@config.key[:keyed_pkg], 'application/octet-stream')
92
+ }
93
+ multipart_connection.post "/plugin_inspect", payload
94
+
95
+ # check key
96
+ newId = dev_id
97
+ @logger.info("Key did not change") unless newId != oldId
98
+ @logger.debug(oldId + " -> " + newId)
99
+ end
100
+
101
+ # Get the current dev id
102
+ # @return [String] The current dev id
103
+ def dev_id
104
+ path = "/plugin_package"
105
+ conn = simple_connection
106
+ response = conn.get path
107
+
108
+ dev_id = /Your Dev ID:\s*<font[^>]*>([^<]*)<\/font>/.match(response.body)
109
+ dev_id ||= /Your Dev ID:[^>]*<\/label> ([^<]*)/.match(response.body)
110
+ dev_id = dev_id[1] if dev_id
111
+ dev_id ||= "none"
112
+ dev_id
113
+ end
114
+
115
+ private
116
+
117
+ def check_options(options)
118
+ raise InvalidOptions, "Can not use '--in' for packaging" if options[:in]
119
+ raise InvalidOptions, "Can not use '--ref' for packaging" if options[:ref]
120
+ raise InvalidOptions, "Can not use '--current' for packaging" if options[:current]
121
+ end
122
+
123
+ # Sign and download the currently sideloaded app
124
+ def sign_package(app_name_version:, password:, stage: nil)
125
+ payload = {
126
+ mysubmit: "Package",
127
+ app_name: app_name_version,
128
+ passwd: password,
129
+ pkg_time: Time.now.to_i
130
+ }
131
+ response = multipart_connection.post "/plugin_package", payload
132
+
133
+ # Check for error
134
+ failed = /(Failed: [^\.]*\.)/.match(response.body)
135
+ raise ExecutionError, failed[1] if failed
136
+
137
+ # Download signed package
138
+ pkg = /<a href="pkgs[^>]*>([^<]*)</.match(response.body)[1]
139
+ path = "/pkgs/#{pkg}"
140
+ conn = Faraday.new(url: @url) do |f|
141
+ f.request :digest, @dev_username, @dev_password
142
+ f.adapter Faraday.default_adapter
143
+ end
144
+ response = conn.get path
145
+ raise ExecutionError, "Failed to download signed package" if response.status != 200
146
+ out_file = nil
147
+ unless @config.out[:file]
148
+ out = @config.out
149
+ if stage
150
+ out[:file] = "#{@config.project[:app_name]}_#{stage}"
151
+ else
152
+ out[:file] = "#{@config.project[:app_name]}_working"
153
+ end
154
+ @config.out = out
155
+ end
156
+ out_file = File.join(@config.out[:folder], @config.out[:file])
157
+ out_file = out_file+".pkg" unless out_file.end_with?(".pkg")
158
+ File.open(out_file, 'w+') {|fp| fp.write(response.body)}
159
+ true
160
+ end
161
+
162
+ # Uses the device to generate a new signing key
163
+ # @return [Array<String>] Password and dev_id for the new key
164
+ def generate_new_key()
165
+ telnet_config = {
166
+ 'Host' => @roku_ip_address,
167
+ 'Port' => 8080
168
+ }
169
+ connection = Net::Telnet.new(telnet_config)
170
+ connection.puts("genkey")
171
+ waitfor_config = {
172
+ 'Match' => /./,
173
+ 'Timeout' => false
174
+ }
175
+ password = nil
176
+ dev_id = nil
177
+ while password.nil? or dev_id.nil?
178
+ connection.waitfor(waitfor_config) do |txt|
179
+ while line = txt.slice!(/^.*\n/) do
180
+ words = line.split
181
+ if words[0] == "Password:"
182
+ password = words[1]
183
+ elsif words[0] == "DevID:"
184
+ dev_id = words[1]
185
+ end
186
+ end
187
+ end
188
+ end
189
+ connection.close
190
+ return password, dev_id
191
+ end
192
+ end
193
+ RokuBuilder.register_plugin(Packager)
194
+ end
@@ -0,0 +1,135 @@
1
+ # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
+
3
+ module RokuBuilder
4
+
5
+ # Scene Graph Profiler
6
+ class Profiler < Util
7
+ extend Plugin
8
+
9
+ def self.commands
10
+ {profile: {device: true}}
11
+ end
12
+
13
+ def self.parse_options(parser:, options:)
14
+ parser.separator "Commands:"
15
+ parser.on("--profile COMMAND", "Run various profiler options") do |c|
16
+ options[:profile] = c
17
+ end
18
+ end
19
+
20
+ # Run the profiler commands
21
+ # @param command [Symbol] The profiler command to run
22
+ def profile(options:)
23
+ case options[:profile].to_sym
24
+ when :stats
25
+ print_stats
26
+ when :all
27
+ print_all_nodes
28
+ when :images
29
+ print_image_information
30
+ when :textures
31
+ print_texture_information
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ # Print the node stats
38
+ def print_stats
39
+ end_reg = /<\/All_Nodes>/
40
+ start_reg = /<All_Nodes>/
41
+ lines = get_command_response(command: "sgnodes all", start_reg: start_reg, end_reg: end_reg)
42
+ xml_string = lines.join("\n")
43
+ stats = {"Total" => 0}
44
+ doc = Nokogiri::XML(xml_string)
45
+ handle_node(stats: stats, node: doc.root)
46
+ stats = stats.to_a
47
+ stats = stats.sort {|a, b| b[1] <=> a[1]}
48
+ printf "%30s | %5s\n", "Name", "Count"
49
+ stats.each do |key_pair|
50
+ printf "%30s | %5d\n", key_pair[0], key_pair[1]
51
+ end
52
+ end
53
+
54
+ def handle_node(stats:, node:)
55
+ node.element_children.each do |element|
56
+ stats[element.name] ||= 0
57
+ stats[element.name] += 1
58
+ stats["Total"] += 1
59
+ handle_node(stats: stats, node: element)
60
+ end
61
+ end
62
+
63
+ def print_all_nodes
64
+ start_reg = /<All_Nodes>/
65
+ end_reg = /<\/All_Nodes>/
66
+ lines = get_command_response(command: "sgnodes all", start_reg: start_reg, end_reg: end_reg)
67
+ lines.each {|line| print line}
68
+ end
69
+ def print_image_information
70
+ start_reg = /RoGraphics instance/
71
+ end_reg = /Available memory/
72
+ lines = get_command_response(command: "r2d2_bitmaps", start_reg: start_reg, end_reg: end_reg)
73
+ lines.each {|line| print line}
74
+ end
75
+ def print_texture_information
76
+ start_reg = /\*+/
77
+ end_reg = /#{SecureRandom.uuid}/
78
+ lines = get_command_response(command: "loaded_textures", start_reg: start_reg, end_reg: end_reg)
79
+ lines.each {|line| print line}
80
+ end
81
+
82
+ # Retrive list of all nodes
83
+ # @return [Array<String>] Array of lines
84
+ def get_command_response(command:, start_reg:, end_reg:, unique: false)
85
+ waitfor_config = {
86
+ 'Match' => /.+/,
87
+ 'Timeout' => 5
88
+ }
89
+ telnet_config ={
90
+ 'Host' => @roku_ip_address,
91
+ 'Port' => 8080
92
+ }
93
+
94
+ connection = Net::Telnet.new(telnet_config)
95
+
96
+ @lines = []
97
+ @all_txt = ""
98
+ @begun = false
99
+ @done = false
100
+ connection.puts("#{command}\n")
101
+ while not @done
102
+ begin
103
+ connection.waitfor(waitfor_config) do |txt|
104
+ handle_text(txt: txt, start_reg: start_reg, end_reg: end_reg, unique: unique)
105
+ end
106
+ rescue Net::ReadTimeout
107
+ @logger.warn "Timed out reading profiler information"
108
+ @done = true
109
+ end
110
+ end
111
+ @lines
112
+ end
113
+
114
+ # Handle profiling text
115
+ # @param all_txt [String] remainder text from last run
116
+ # @param txt [String] current text from telnet
117
+ # @param in_nodes [Boolean] currently parsing test text
118
+ # @return [Boolean] currently parsing test text
119
+ def handle_text(txt:, start_reg:, end_reg:, unique:)
120
+ @all_txt += txt
121
+ while line = @all_txt.slice!(/^.*\n/) do
122
+ if line =~ start_reg
123
+ @begun = true
124
+ @lines = [] if unique
125
+ end
126
+ @lines.push(line) if @begun
127
+ if line =~ end_reg
128
+ @begun = false
129
+ @done = true
130
+ end
131
+ end
132
+ end
133
+ end
134
+ RokuBuilder.register_plugin(Profiler)
135
+ end
@@ -0,0 +1,53 @@
1
+ # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
+
3
+ module RokuBuilder
4
+
5
+ # Helper for extending for scripting
6
+ class Scripter
7
+ extend Plugin
8
+
9
+ def self.commands
10
+ {print: {source: true, stage: true}}
11
+ end
12
+
13
+ def self.parse_options(parser:, options:)
14
+ parser.separator("Commands:")
15
+ parser.on("--print ATTRIBUTE", "Print attribute for scripting") do |a|
16
+ options[:print] = a.to_sym
17
+ end
18
+ end
19
+
20
+ def initialize(config:)
21
+ @config = config
22
+ end
23
+
24
+ def print(options:)
25
+ attributes = [
26
+ :title, :build_version, :app_version, :root_dir, :app_name
27
+ ]
28
+
29
+ unless attributes.include? options[:print]
30
+ raise ExecutionError, "Unknown attribute: #{options[:print]}"
31
+ end
32
+
33
+ manifest = Manifest.new(config: @config)
34
+
35
+ case options[:print]
36
+ when :root_dir
37
+ printf "%s", @config.project[:directory]
38
+ when :app_name
39
+ printf "%s", @config.project[:app_name]
40
+ when :title
41
+ printf "%s", manifest.title
42
+ when :build_version
43
+ printf "%s", manifest.build_version
44
+ when :app_version
45
+ major = manifest.major_version
46
+ minor = manifest.minor_version
47
+ printf "%s.%s", major, minor
48
+ end
49
+ end
50
+ end
51
+
52
+ RokuBuilder.register_plugin(Scripter)
53
+ end
@@ -6,10 +6,25 @@ module RokuBuilder
6
6
  # This is intended to be used with the brstest librbary but should work
7
7
  # with other testing libraries
8
8
  class Tester < Util
9
+ extend Plugin
10
+
11
+ def self.commands
12
+ {test: {device: true, source: true, stage: true}}
13
+ end
14
+
15
+ def self.parse_options(parser:, options:)
16
+ parser.separator "Commands:"
17
+ parser.on("-t", "--test", "Test an app") do
18
+ options[:test] = true
19
+ end
20
+ end
21
+
22
+ def self.dependencies
23
+ [Loader, Linker]
24
+ end
9
25
 
10
26
  # Initialize starting and ending regular expressions
11
- def init(root_dir:)
12
- @root_dir = root_dir
27
+ def init()
13
28
  @end_reg = /\*+\s*End testing\s*\*+/
14
29
  @start_reg = /\*+\s*Start testing\s*\*+/
15
30
  @test_logger = ::Logger.new(STDOUT)
@@ -22,29 +37,22 @@ module RokuBuilder
22
37
 
23
38
  # Run tests and report results
24
39
  # @param sideload_config [Hash] The config for sideloading the app
25
- def run_tests(sideload_config:)
40
+ def test(options:)
41
+ loader = Loader.new(config: @config)
42
+ loader.sideload(options: options)
43
+ linker = Linker.new(config: @config)
44
+ linker.deeplink(options: Options.new(options: {deeplink: "RunTests:true"}))
45
+
26
46
  telnet_config ={
27
47
  'Host' => @roku_ip_address,
28
48
  'Port' => 8085
29
49
  }
30
-
31
- @device_config[:init_params] = {
32
- root_dir: @root_dir
33
- }
34
- loader = Loader.new(**@device_config)
35
50
  connection = Net::Telnet.new(telnet_config)
36
- code, _build_version = loader.sideload(**sideload_config)
37
- if code == SUCCESS
38
- @device_config[:init_params] = nil
39
- linker = Linker.new(**@device_config)
40
- linker.launch(options: "RunTests:true")
41
-
42
- connection.waitfor(@end_reg) do |txt|
43
- handle_text(txt: txt)
44
- end
45
- print_logs
46
- connection.puts("cont\n")
51
+ connection.waitfor(@end_reg) do |txt|
52
+ handle_text(txt: txt)
47
53
  end
54
+ print_logs
55
+ connection.puts("cont\n")
48
56
  end
49
57
 
50
58
  private
@@ -95,4 +103,5 @@ module RokuBuilder
95
103
  end
96
104
  end
97
105
  end
106
+ RokuBuilder.register_plugin(Tester)
98
107
  end