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
@@ -1,224 +0,0 @@
1
- # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
-
3
- module RokuBuilder
4
-
5
- # Commands that the controller uses to interface with the rest of the gem.
6
- class ControllerCommands
7
-
8
- # Provides a hash of all of the options needed to run simple commands via
9
- # the simple_command method
10
- # @return [Hash] options to run simple commands
11
- def self.simple_commands
12
- {
13
- delete: { klass: Loader, method: :unload },
14
- monitor: { klass: Monitor, method: :monitor,
15
- config_key: :monitor_config },
16
- navigate: { klass: Navigator, method: :nav, config_key: :navigate_config,
17
- failure: FAILED_NAVIGATING },
18
- navigator: { klass: Navigator, method: :interactive },
19
- screen: { klass: Navigator, method: :screen, config_key: :screen_config,
20
- failure: FAILED_NAVIGATING },
21
- key: { klass: Keyer, method: :rekey, config_key: :key },
22
- genkey: { klass: Keyer, method: :genkey, config_key: :genkey },
23
- screens: { klass: Navigator, method: :screens },
24
- text: { klass: Navigator, method: :type, config_key: :text_config },
25
- screencapture: { klass: Inspector, method: :screencapture, config_key: :screencapture_config,
26
- failure: FAILED_SCREENCAPTURE },
27
- applist: {klass: Linker, method: :list},
28
- profile: {klass: Profiler, method: :run, config_key: :profiler_config}
29
- }
30
- end
31
- # Validate Config
32
- # @return [Integer] Success or Failure Code
33
- def self.validate()
34
- Logger.instance.info "Config validated"
35
- SUCCESS
36
- end
37
- # Run Sideload
38
- # @param options [Hash] user options
39
- # @param config [Config] parsed config
40
- # @return [Integer] Success or Failure Code
41
- def self.sideload(options:, config:)
42
- device_config = config.parsed[:device_config].dup
43
- device_config[:init_params] = config.parsed[:init_params][:loader]
44
- stager = Stager.new(**config.parsed[:stage_config])
45
- success = nil
46
- if stager.stage
47
- loader = Loader.new(**device_config)
48
- build_version = ManifestManager.build_version(**config.parsed[:manifest_config])
49
- options[:build_version] = build_version
50
- config.update
51
- success = loader.sideload(**config.parsed[:sideload_config])[0]
52
- end
53
- stager.unstage
54
- if success == SUCCESS
55
- Logger.instance.info "App Sideloaded; staged using #{stager.method}"
56
- end
57
- success
58
- end
59
- # Run Package
60
- # @param options [Hash] user options
61
- # @param config [Conifg] config object
62
- # @return [Integer] Success or Failure Code
63
- def self.package(options:, config:)
64
- loader_config = config.parsed[:device_config].dup
65
- loader_config[:init_params] = config.parsed[:init_params][:loader]
66
- keyer = Keyer.new(**config.parsed[:device_config])
67
- stager = Stager.new(**config.parsed[:stage_config])
68
- loader = Loader.new(**loader_config)
69
- packager = Packager.new(**config.parsed[:device_config])
70
- Logger.instance.warn "Packaging working directory" if options[:working]
71
- if stager.stage
72
- # Sideload #
73
- code, build_version = loader.sideload(**config.parsed[:sideload_config])
74
- return code unless code == SUCCESS
75
- # Key #
76
- _success = keyer.rekey(**config.parsed[:key])
77
- # Package #
78
- options[:build_version] = build_version
79
- config.update
80
- success = packager.package(**config.parsed[:package_config])
81
- Logger.instance.info "Signing Successful: #{config.parsed[:package_config][:out_file]}" if success
82
- return FAILED_SIGNING unless success
83
- # Inspect #
84
- if options[:inspect]
85
- inspect_package(config: config)
86
- end
87
- end
88
- stager.unstage
89
- Logger.instance.info "App Packaged; staged using #{stager.method}"
90
- SUCCESS
91
- end
92
- # Run Sideload
93
- # @param options [Hash] user options
94
- # @param config [Config] parsed config
95
- # @return [Integer] Success or Failure Code
96
- def self.test(options:, config:)
97
- device_config = config.parsed[:device_config].dup
98
- device_config[:init_params] = config.parsed[:init_params][:tester]
99
- stager = Stager.new(**config.parsed[:stage_config])
100
- if stager.stage
101
- tester = Tester.new(**device_config)
102
- tester.run_tests(**config.parsed[:test_config])
103
- end
104
- stager.unstage
105
- SUCCESS
106
- end
107
-
108
- def self.inspect_package(config:)
109
- inspector = Inspector.new(**config.parsed[:device_config])
110
- info = inspector.inspect(config.parsed[:inspect_config])
111
- inspect_logger = ::Logger.new(STDOUT)
112
- inspect_logger.formatter = proc {|_severity, _datetime, _progname, msg|
113
- "%s\n\r" % [msg]
114
- }
115
- inspect_logger.unknown "=============================================================="
116
- inspect_logger.unknown "App Name: #{info[:app_name]}"
117
- inspect_logger.unknown "Dev ID: #{info[:dev_id]}"
118
- inspect_logger.unknown "Creation Date: #{info[:creation_date]}"
119
- inspect_logger.unknown "dev.zip: #{info[:dev_zip]}"
120
- inspect_logger.unknown "=============================================================="
121
- end
122
- private_class_method :inspect_package
123
-
124
- # Run Build
125
- # @param options [Hash] user options
126
- # @param config [Config] config object
127
- # @return [Integer] Success or Failure Code
128
- def self.build(options:, config:)
129
- ### Build ###
130
- loader_config = config.parsed[:device_config].dup
131
- loader_config[:init_params] = config.parsed[:init_params][:loader]
132
- stager = Stager.new(**config.parsed[:stage_config])
133
- loader = Loader.new(**loader_config)
134
- if stager.stage
135
- build_version = ManifestManager.build_version(**config.parsed[:manifest_config])
136
- options[:build_version] = build_version
137
- config.update
138
- outfile = loader.build(**config.parsed[:build_config])
139
- Logger.instance.info "Build: #{outfile}"
140
- end
141
- stager.unstage
142
- Logger.instance.info "App build; staged using #{stager.method}"
143
- SUCCESS
144
- end
145
- # Run update
146
- # @param config [Config] config object
147
- # @return [Integer] Success or Failure Code
148
- def self.update(config:)
149
- ### Update ###
150
- stager = Stager.new(**config.parsed[:stage_config])
151
- if stager.stage
152
- old_version = ManifestManager.build_version(**config.parsed[:manifest_config])
153
- new_version = ManifestManager.update_build(**config.parsed[:manifest_config])
154
- Logger.instance.info "Update build version from:\n#{old_version}\nto:\n#{new_version}"
155
- end
156
- stager.unstage
157
- SUCCESS
158
- end
159
-
160
- # Run Deeplink
161
- # @param options [Hash] user options
162
- # @param config [Config] config object
163
- def self.deeplink(options:, config:)
164
- if options.has_source?
165
- sideload(options: options, config: config)
166
- end
167
-
168
- linker = Linker.new(config.parsed[:device_config])
169
- if linker.launch(config.parsed[:deeplink_config])
170
- Logger.instance.info "Deeplinked into app"
171
- return SUCCESS
172
- else
173
- return FAILED_DEEPLINKING
174
- end
175
- end
176
-
177
- # Run Print
178
- # @param options [Hash] user options
179
- # @param config [Config] config object
180
- def self.print(options:, config:)
181
- stager = Stager.new(**config.parsed[:stage_config])
182
- code = nil
183
- if stager.stage
184
- code = Scripter.print(attribute: options[:print].to_sym, configs: config.parsed)
185
- end
186
- stager.unstage
187
- code
188
- end
189
-
190
- def self.dostage(config:)
191
- stager = Stager.new(**config.parsed[:stage_config])
192
- stager.stage
193
- end
194
-
195
- def self.dounstage(config:)
196
- stager = Stager.new(**config.parsed[:stage_config])
197
- stager.unstage
198
- end
199
-
200
- # Run a simple command
201
- # @param klass [Class] class of object to create
202
- # @param method [Symbol] methog to run on klass
203
- # @param config_key [Symbol] config to send from configs if not nil
204
- # @param config [Configs] config object
205
- # @param failure [Integer] failure code to return on failure if not nil
206
- # @return [Integer] Success of failure code
207
- def self.simple_command(klass:, method:, config_key: nil, config:, failure: nil)
208
- klass_config = config.parsed[:device_config].dup
209
- key = klass.to_s.split("::")[-1].underscore.to_sym
210
- if config.parsed[:init_params][key]
211
- klass_config[:init_params] = config.parsed[:init_params][key]
212
- end
213
- instance = klass.new(**klass_config)
214
- if config_key
215
- success = instance.send(method, config.parsed[config_key])
216
- else
217
- success = instance.send(method)
218
- end
219
- return failure unless failure.nil? or success
220
- Logger.instance.debug "#{klass} call #{method} successfully"
221
- SUCCESS
222
- end
223
- end
224
- end
@@ -1,142 +0,0 @@
1
- # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
-
3
- module RokuBuilder
4
-
5
- # Contains methods to handle errors from different sources.
6
- class ErrorHandler
7
- # Handle codes returned from validating options
8
- # @param options_code [Integer] the error code returned by validate_options
9
- # @param logger [Logger] system logger
10
- def self.handle_options_codes(options_code:, options:, logger:)
11
- case options_code
12
- when EXTRA_COMMANDS
13
- logger.fatal "Only one command is allowed"
14
- abort
15
- when NO_COMMANDS
16
- logger.fatal "At least one command is required"
17
- abort
18
- when EXTRA_SOURCES
19
- logger.fatal "Only use one of --ref, --working, --current or --stage"
20
- abort
21
- when NO_SOURCE
22
- logger.fatal "Must use at least one of --ref, --working, --current or --stage"
23
- abort
24
- when BAD_CURRENT
25
- logger.fatal "Can only sideload or build 'current' directory"
26
- abort
27
- when BAD_IN_FILE
28
- logger.fatal "Can only supply in file for building"
29
- abort
30
- when DEPRICATED
31
- print_options_depricateions(options: options, logger: logger)
32
- end
33
- end
34
-
35
- # Handle codes returned from configuring
36
- # @param configure_code [Integer] the error code returned by configure
37
- # @param logger [Logger] system logger
38
- def self.handle_configure_codes(configure_code:, logger:)
39
- case configure_code
40
- when CONFIG_OVERWRITE
41
- logger.fatal 'Config already exists. To create default please remove config first.'
42
- abort
43
- when SUCCESS
44
- logger.info 'Configure successful'
45
- abort
46
- end
47
- end
48
-
49
- # Handle codes returned from load_config
50
- # @param options [Hash] the options hash
51
- # @param load_code [Integer] the error code returned by configure
52
- # @param logger [Logger] system logger
53
- def self.handle_load_codes(options:, load_code:, logger:)
54
- case load_code
55
- when DEPRICATED_CONFIG
56
- logger.warn 'Depricated config. See Above'
57
- when MISSING_CONFIG
58
- logger.fatal "Missing config file: #{options[:config]}"
59
- abort
60
- when INVALID_CONFIG
61
- logger.fatal 'Invalid config. See Above'
62
- abort
63
- when MISSING_MANIFEST
64
- logger.fatal 'Manifest file missing'
65
- abort
66
- when UNKNOWN_DEVICE
67
- logger.fatal "Unkown device id"
68
- abort
69
- when UNKNOWN_PROJECT
70
- logger.fatal "Unknown project id"
71
- abort
72
- when UNKNOWN_STAGE
73
- logger.fatal "Unknown stage"
74
- abort
75
- when BAD_PROJECT_DIR
76
- logger.fatal "Invalid directory for project"
77
- abort
78
- when BAD_KEY_FILE
79
- logger.fatal "Invalid key path"
80
- abort
81
- end
82
- end
83
-
84
- # Handle codes returned from configuring
85
- # @param configure_code [Integer] the error code returned by configure
86
- # @param logger [Logger] system logger
87
- def self.handle_configs_codes(configs_code:, logger:)
88
- case configs_code
89
- when MISSING_OUT_FOLDER
90
- logger.fatal 'The folder passed in the command line options does not exist.'
91
- abort
92
- when VALID
93
- logger.debug 'Configs OK'
94
- end
95
- end
96
-
97
- # Handle codes returned from checking devices
98
- # @param device_code [Integer] the error code returned by check_devices
99
- # @param logger [Logger] system logger
100
- def self.handle_device_codes(device_code:, logger:)
101
- case device_code
102
- when CHANGED_DEVICE
103
- logger.info "The default device was not online so a secondary device is being used"
104
- when BAD_DEVICE
105
- logger.fatal "The selected device was not online"
106
- abort
107
- when NO_DEVICES
108
- logger.fatal "No configured devices were found"
109
- abort
110
- end
111
- end
112
-
113
- # Handle codes returned from handeling commands devices
114
- # @param command_code [Integer] the error code returned by handle_options
115
- # @param logger [Logger] system logger
116
- def self.handle_command_codes(command_code:, logger:)
117
- case command_code
118
- when FAILED_SIDELOAD
119
- logger.fatal "Failed Sideloading App"
120
- abort
121
- when FAILED_SIGNING
122
- logger.fatal "Failed Signing App"
123
- abort
124
- when FAILED_DEEPLINKING
125
- logger.fatal "Failed Deeplinking To App"
126
- abort
127
- when FAILED_NAVIGATING
128
- logger.fatal "Command not sent"
129
- abort
130
- when FAILED_SCREENCAPTURE
131
- logger.fatal "Failed to Capture Screen"
132
- abort
133
- when BAD_PRINT_ATTRIBUTE
134
- logger.fatal "Unknown print attribute"
135
- abort
136
- when MISSING_MANIFEST
137
- logger.fatal 'Manifest file missing'
138
- abort
139
- end
140
- end
141
- end
142
- end
@@ -1,82 +0,0 @@
1
- # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
-
3
- module RokuBuilder
4
-
5
- # Collects information on a package for submission
6
- class Inspector < Util
7
-
8
- # Inspects the given pkg
9
- # @param pkg [String] Path to the pkg to be inspected
10
- # @param password [String] Password for the given pkg
11
- # @return [Hash] Package information. Contains the following keys:
12
- # * app_name
13
- # * dev_id
14
- # * creation_date
15
- # * dev_zip
16
- def inspect(pkg:, password:)
17
-
18
- pkg = pkg+".pkg" unless pkg.end_with?(".pkg")
19
- # upload new key with password
20
- path = "/plugin_inspect"
21
- conn = multipart_connection
22
- payload = {
23
- mysubmit: "Inspect",
24
- passwd: password,
25
- archive: Faraday::UploadIO.new(pkg, 'application/octet-stream')
26
- }
27
- response = conn.post path, payload
28
-
29
- app_name = /App Name:\s*<\/td>\s*<td>\s*<font[^>]*>([^<]*)<\/font>\s*<\/td>/.match(response.body)
30
- dev_id = nil
31
- creation_date = nil
32
- dev_zip = nil
33
- if app_name
34
- app_name = app_name[1]
35
- dev_id = /Dev ID:\s*<\/td>\s*<td>\s*<font[^>]*>([^<]*)<\/font>\s*<\/td>/.match(response.body)[1]
36
- creation_date = /new Date\(([^)]*)\)/.match(response.body.delete("\n"))[1]
37
- dev_zip = /dev.zip:\s*<\/td>\s*<td>\s*<font[^>]*>([^<]*)<\/font>\s*<\/td>/.match(response.body)[1]
38
- else
39
- app_name = /App Name:[^<]*<div[^>]*>([^<]*)<\/div>/.match(response.body)[1]
40
- dev_id = /Dev ID:[^<]*<div[^>]*><font[^>]*>([^<]*)<\/font><\/div>/.match(response.body)[1]
41
- creation_date = /new Date\(([^\/]*)\)/.match(response.body.delete("\n"))[1]
42
- dev_zip = /dev.zip:[^<]*<div[^>]*><font[^>]*>([^<]*)<\/font><\/div>/.match(response.body)[1]
43
- end
44
-
45
- return {app_name: app_name, dev_id: dev_id, creation_date: Time.at(creation_date.to_i).to_s, dev_zip: dev_zip}
46
-
47
- end
48
-
49
- # Capture a screencapture for the currently sideloaded app
50
- # @return [Boolean] Success
51
- def screencapture(out_folder:, out_file: nil)
52
- path = "/plugin_inspect"
53
- conn = multipart_connection
54
- payload = {
55
- mysubmit: "Screenshot",
56
- passwd: @dev_password,
57
- archive: Faraday::UploadIO.new(File::NULL, 'application/octet-stream')
58
- }
59
- response = conn.post path, payload
60
-
61
- path = /<img src="([^"]*)">/.match(response.body)
62
- return false unless path
63
- path = path[1]
64
- unless out_file
65
- out_time = /time=([^"]*)">/.match(response.body)
66
- out_ext = /dev.([^"]*)\?/.match(response.body)
67
- out_file = "dev_#{out_time[1]}.#{out_ext[1]}" if out_time and out_ext
68
- out_file = "dev.jpg" unless out_file
69
- end
70
-
71
- conn = simple_connection
72
-
73
- response = conn.get path
74
-
75
- File.open(File.join(out_folder, out_file), "wb") do |io|
76
- io.write(response.body)
77
- end
78
- @logger.info "Screen captured to #{File.join(out_folder, out_file)}"
79
- return response.success?
80
- end
81
- end
82
- end