roku_builder 3.13.0 → 4.0.0

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