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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG +12 -0
- data/Gemfile.lock +22 -7
- data/Guardfile +3 -3
- data/README.md +22 -398
- data/bin/roku +1 -194
- data/config.json.example +1 -1
- data/intergration/roku_builder/test_core.rb +52 -0
- data/intergration/roku_builder/test_files/core_intergration_test/manifest_template +7 -0
- data/intergration/roku_builder/test_files/core_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/components/rectanglescene.xml +28 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/source/main.brs +23 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_helper.rb +138 -0
- data/intergration/roku_builder/test_inspector.rb +35 -0
- data/intergration/roku_builder/test_linker.rb +32 -0
- data/intergration/roku_builder/test_loader.rb +38 -0
- data/intergration/roku_builder/test_monitor.rb +21 -0
- data/intergration/roku_builder/test_navigator.rb +34 -0
- data/intergration/roku_builder/test_packager.rb +41 -0
- data/intergration/roku_builder/test_profiler.rb +48 -0
- data/intergration/roku_builder/test_scripter.rb +38 -0
- data/intergration/roku_builder/test_tester.rb +21 -0
- data/lib/roku_builder.rb +143 -154
- data/lib/roku_builder/config.rb +17 -40
- data/lib/roku_builder/config_parser.rb +49 -200
- data/lib/roku_builder/config_validator.rb +1 -1
- data/lib/roku_builder/errors.rb +12 -0
- data/lib/roku_builder/git.rb +28 -0
- data/lib/roku_builder/hash.rb +8 -0
- data/lib/roku_builder/manifest.rb +121 -0
- data/lib/roku_builder/options.rb +68 -29
- data/lib/roku_builder/plugin.rb +30 -0
- data/lib/roku_builder/plugins/core.rb +117 -0
- data/lib/roku_builder/plugins/inspector.rb +104 -0
- data/lib/roku_builder/{linker.rb → plugins/linker.rb} +38 -12
- data/lib/roku_builder/plugins/loader.rb +152 -0
- data/lib/roku_builder/{monitor.rb → plugins/monitor.rb} +20 -9
- data/lib/roku_builder/{navigator.rb → plugins/navigator.rb} +136 -88
- data/lib/roku_builder/plugins/packager.rb +194 -0
- data/lib/roku_builder/plugins/profiler.rb +135 -0
- data/lib/roku_builder/plugins/scripter.rb +53 -0
- data/lib/roku_builder/{tester.rb → plugins/tester.rb} +28 -19
- data/lib/roku_builder/stager.rb +48 -12
- data/lib/roku_builder/string.rb +20 -0
- data/lib/roku_builder/util.rb +10 -34
- data/lib/roku_builder/version.rb +1 -1
- data/rakefile +5 -1
- data/roku_builder.gemspec +2 -0
- data/test/roku_builder/plugins/test_core.rb +112 -0
- data/test/roku_builder/plugins/test_inspector.rb +165 -0
- data/test/roku_builder/plugins/test_linker.rb +123 -0
- data/test/roku_builder/plugins/test_loader.rb +115 -0
- data/test/roku_builder/plugins/test_monitor.rb +141 -0
- data/test/roku_builder/plugins/test_navigator.rb +274 -0
- data/test/roku_builder/plugins/test_packager.rb +202 -0
- data/test/roku_builder/plugins/test_profiler.rb +127 -0
- data/test/roku_builder/plugins/test_scripter.rb +110 -0
- data/test/roku_builder/plugins/test_tester.rb +109 -0
- data/test/roku_builder/test_config.rb +51 -35
- data/test/roku_builder/test_config_parser.rb +76 -154
- data/test/roku_builder/test_config_validator.rb +18 -1
- data/test/roku_builder/test_files/{loader_test/manifest → config_parser_test/test.pkg} +0 -0
- data/test/roku_builder/test_files/config_test/config.json +3 -0
- data/test/roku_builder/test_files/controller_commands_test/manifest_template +7 -0
- data/test/roku_builder/test_files/core_test/manifest_template +7 -0
- data/test/roku_builder/test_files/core_test/test.pkg +0 -0
- data/test/roku_builder/test_files/inspector_test/manifest +6 -0
- data/test/roku_builder/test_files/inspector_test/test.pkg +0 -0
- data/test/roku_builder/test_files/linker_test/manifest +6 -0
- data/test/roku_builder/test_files/linker_test/test.pkg +0 -0
- data/test/roku_builder/test_files/loader_test/manifest_template +6 -0
- data/test/roku_builder/test_files/loader_test/test.pkg +0 -0
- data/test/roku_builder/test_files/loader_test/test.zip +0 -0
- data/test/roku_builder/test_files/manifest_test/manifest_comments +6 -0
- data/test/roku_builder/test_files/manifest_test/manifest_template +7 -0
- data/test/roku_builder/test_files/manifest_test/test.zip +0 -0
- data/test/roku_builder/test_files/packager_test/manifest +6 -0
- data/test/roku_builder/test_files/packager_test/scripter_test/manifest +6 -0
- data/test/roku_builder/test_files/packager_test/test.pkg +0 -0
- data/test/roku_builder/test_files/roku_builder_test/config.json +32 -0
- data/test/roku_builder/test_files/scripter_test/manifest +6 -0
- data/test/roku_builder/test_files/scripter_test/test.pkg +0 -0
- data/test/roku_builder/test_files/stager_test/test.pkg +0 -0
- data/test/roku_builder/test_files/tester_test/manifest +6 -0
- data/test/roku_builder/test_files/tester_test/test.pkg +0 -0
- data/test/roku_builder/test_helper.rb +44 -11
- data/test/roku_builder/test_logger.rb +1 -0
- data/test/roku_builder/test_manifest.rb +99 -0
- data/test/roku_builder/test_options.rb +106 -77
- data/test/roku_builder/test_options_plugins.rb +111 -0
- data/test/roku_builder/test_plugin.rb +48 -0
- data/test/roku_builder/test_roku_builder.rb +239 -0
- data/test/roku_builder/test_stager.rb +49 -101
- data/test/roku_builder/test_util.rb +19 -4
- metadata +241 -47
- data/lib/roku_builder/controller.rb +0 -98
- data/lib/roku_builder/controller_commands.rb +0 -224
- data/lib/roku_builder/error_handler.rb +0 -142
- data/lib/roku_builder/inspector.rb +0 -82
- data/lib/roku_builder/keyer.rb +0 -106
- data/lib/roku_builder/loader.rb +0 -131
- data/lib/roku_builder/manifest_manager.rb +0 -126
- data/lib/roku_builder/packager.rb +0 -43
- data/lib/roku_builder/profiler.rb +0 -96
- data/lib/roku_builder/scripter.rb +0 -39
- data/test/roku_builder/test_controller.rb +0 -70
- data/test/roku_builder/test_controller_commands.rb +0 -465
- data/test/roku_builder/test_error_handler.rb +0 -90
- data/test/roku_builder/test_inspector.rb +0 -298
- data/test/roku_builder/test_keyer.rb +0 -176
- data/test/roku_builder/test_linker.rb +0 -110
- data/test/roku_builder/test_loader.rb +0 -337
- data/test/roku_builder/test_manifest_manager.rb +0 -103
- data/test/roku_builder/test_monitor.rb +0 -137
- data/test/roku_builder/test_navigator.rb +0 -280
- data/test/roku_builder/test_packager.rb +0 -127
- data/test/roku_builder/test_profiler.rb +0 -35
- data/test/roku_builder/test_scripter.rb +0 -102
- data/test/roku_builder/test_tester.rb +0 -130
@@ -0,0 +1,121 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
module RokuBuilder
|
4
|
+
class Manifest
|
5
|
+
|
6
|
+
def self.generate(config:, attributes:)
|
7
|
+
FileUtils.touch(File.join(config.parsed[:root_dir], "manifest"))
|
8
|
+
manifest = new(config: config)
|
9
|
+
manifest.update(attributes: default_params.merge(attributes))
|
10
|
+
manifest
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(config:)
|
14
|
+
@config = config
|
15
|
+
@attributes = {}
|
16
|
+
check_for_manifest
|
17
|
+
read
|
18
|
+
end
|
19
|
+
|
20
|
+
def update(attributes:)
|
21
|
+
update_attributes(attributes)
|
22
|
+
write_file
|
23
|
+
end
|
24
|
+
|
25
|
+
def increment_build_version
|
26
|
+
build_version_parts = @attributes[:build_version].split(".")
|
27
|
+
if build_version_parts.length == 2
|
28
|
+
build_version_parts[0] = Time.now.strftime("%m%d%y")
|
29
|
+
build_version_parts[1] = build_version_parts[1].to_i + 1
|
30
|
+
@attributes[:build_version] = build_version_parts.join(".")
|
31
|
+
else
|
32
|
+
@attributes[:build_version] = build_version_parts[0].to_i + 1
|
33
|
+
end
|
34
|
+
write_file
|
35
|
+
end
|
36
|
+
|
37
|
+
def method_missing(method)
|
38
|
+
@attributes[method]
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def read
|
44
|
+
process_folder = -> (path){
|
45
|
+
File.open(path, 'r') do |file|
|
46
|
+
read_attributes(file)
|
47
|
+
end
|
48
|
+
}
|
49
|
+
process_zip = -> (entry){
|
50
|
+
entry.get_input_stream do |file|
|
51
|
+
read_attributes(file)
|
52
|
+
end
|
53
|
+
}
|
54
|
+
process_manifest(process_folder, process_zip)
|
55
|
+
end
|
56
|
+
|
57
|
+
def read_attributes(file)
|
58
|
+
file.each_line do |line|
|
59
|
+
key, value = line.split("=")
|
60
|
+
key = key.chomp.to_sym
|
61
|
+
value.chomp! if value
|
62
|
+
@attributes[key] = value
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def check_for_manifest
|
67
|
+
process_folder = -> (path) {
|
68
|
+
raise ManifestError, "Missing Manifest: #{path}" unless File.exist?(path)
|
69
|
+
}
|
70
|
+
process_zip = -> (entry) {
|
71
|
+
raise ManifestError, "Missing Manifest in #{root_dir}" unless entry
|
72
|
+
}
|
73
|
+
process_manifest(process_folder, process_zip)
|
74
|
+
end
|
75
|
+
|
76
|
+
def process_manifest(process_folder, process_zip)
|
77
|
+
root_dir = @config.root_dir
|
78
|
+
if File.directory?(root_dir)
|
79
|
+
path = File.join(root_dir, "manifest")
|
80
|
+
process_folder.call(path)
|
81
|
+
elsif File.extname(root_dir) == ".zip"
|
82
|
+
Zip::File.open(root_dir) do |zip_file|
|
83
|
+
entry = zip_file.glob("manifest").first
|
84
|
+
process_zip.call(entry)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def update_attributes(attributes)
|
90
|
+
@attributes.merge!(attributes)
|
91
|
+
end
|
92
|
+
|
93
|
+
def write_file
|
94
|
+
root_dir = @config.parsed[:root_dir]
|
95
|
+
raise ManifestError, "Cannot Update zipped manifest" if File.extname(root_dir) == ".zip"
|
96
|
+
path = File.join(root_dir, "manifest")
|
97
|
+
File.open(path, "w") do |file|
|
98
|
+
@attributes.each_pair do |key,value|
|
99
|
+
if value
|
100
|
+
file.puts "#{key}=#{value}"
|
101
|
+
else
|
102
|
+
file.puts key
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.default_params
|
109
|
+
{
|
110
|
+
title: "Default Title",
|
111
|
+
major_version: 1,
|
112
|
+
minor_version: 0,
|
113
|
+
build_version: "010101.0001",
|
114
|
+
mm_icon_focus_fhd: "<insert fhd focus icon url>",
|
115
|
+
mm_icon_focus_hd: "<insert hd focus icon url>",
|
116
|
+
mm_icon_focus_sd: "<insert sd focus icon url>"
|
117
|
+
}
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
data/lib/roku_builder/options.rb
CHANGED
@@ -2,10 +2,17 @@
|
|
2
2
|
|
3
3
|
module RokuBuilder
|
4
4
|
class Options < Hash
|
5
|
-
def initialize(options:)
|
6
|
-
merge!(options)
|
5
|
+
def initialize(options: nil)
|
7
6
|
@logger = Logger.instance
|
8
|
-
|
7
|
+
setup_plugin_commands
|
8
|
+
options ||= parse
|
9
|
+
merge!(options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def validate
|
13
|
+
validate_commands
|
14
|
+
validate_sources
|
15
|
+
validate_deprivated
|
9
16
|
end
|
10
17
|
|
11
18
|
def command
|
@@ -17,7 +24,7 @@ module RokuBuilder
|
|
17
24
|
end
|
18
25
|
|
19
26
|
def source_command?
|
20
|
-
(
|
27
|
+
source_commands.include?(command)
|
21
28
|
end
|
22
29
|
|
23
30
|
def device_command?
|
@@ -30,11 +37,57 @@ module RokuBuilder
|
|
30
37
|
|
31
38
|
private
|
32
39
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
40
|
+
def setup_plugin_commands
|
41
|
+
RokuBuilder.plugins.each do |plugin|
|
42
|
+
plugin.commands.each do |command, attributes|
|
43
|
+
commands << command
|
44
|
+
[:device, :source, :exclude].each do |type|
|
45
|
+
if attributes[type]
|
46
|
+
send("#{type}_commands".to_sym) << command
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse
|
54
|
+
options = {}
|
55
|
+
options[:config] = '~/.roku_config.json'
|
56
|
+
options[:update_manifest] = false
|
57
|
+
parser = OptionParser.new
|
58
|
+
parser.banner = "Usage: roku <command> [options]"
|
59
|
+
add_plugin_options(parser: parser, options:options)
|
60
|
+
validate_parser(parser: parser)
|
61
|
+
parser.parse!
|
62
|
+
options
|
63
|
+
end
|
64
|
+
|
65
|
+
def add_plugin_options(parser:, options:)
|
66
|
+
RokuBuilder.plugins.each do |plugin|
|
67
|
+
parser.separator ""
|
68
|
+
parser.separator "Options for #{plugin}:"
|
69
|
+
plugin.parse_options(parser: parser, options: options)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def validate_parser(parser:)
|
74
|
+
short = []
|
75
|
+
long = []
|
76
|
+
stack = parser.instance_variable_get(:@stack)
|
77
|
+
stack.each do |optionsList|
|
78
|
+
optionsList.each_option do |option|
|
79
|
+
if option.respond_to?(:short)
|
80
|
+
if short.include?(option.short.first)
|
81
|
+
raise ImplementationError, "Duplicate short option defined: #{option.short.first}"
|
82
|
+
end
|
83
|
+
short.push(option.short.first) if option.short.first
|
84
|
+
if long.include?(option.long.first)
|
85
|
+
raise ImplementationError, "Duplicate long option defined: #{option.long.first}"
|
86
|
+
end
|
87
|
+
long.push(option.long.first) if option.long.first
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
38
91
|
end
|
39
92
|
|
40
93
|
def validate_commands
|
@@ -51,16 +104,6 @@ module RokuBuilder
|
|
51
104
|
end
|
52
105
|
end
|
53
106
|
|
54
|
-
def validate_combinations
|
55
|
-
all_sources = keys & sources
|
56
|
-
if all_sources.include?(:current) and not (self[:build] or self[:sideload])
|
57
|
-
raise InvalidOptions, "Current source onle works for build or sideload"
|
58
|
-
end
|
59
|
-
if self[:in] and not self[:sideload]
|
60
|
-
raise InvalidOptions, "In source only works for sideloading"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
107
|
def validate_deprivated
|
65
108
|
depricated = keys & depricated_options.keys
|
66
109
|
if depricated.count > 0
|
@@ -73,41 +116,37 @@ module RokuBuilder
|
|
73
116
|
# List of command options
|
74
117
|
# @return [Array<Symbol>] List of command symbols that can be used in the options hash
|
75
118
|
def commands
|
76
|
-
|
77
|
-
:navigate, :navigator, :text, :build, :monitor, :update, :screencapture,
|
78
|
-
:key, :genkey, :screen, :screens, :applist, :print, :profile, :dostage,
|
79
|
-
:dounstage]
|
119
|
+
@commands ||= []
|
80
120
|
end
|
81
121
|
|
82
122
|
# List of depricated options
|
83
123
|
# @return [Hash] Hash of depricated options and the warning message for each
|
84
124
|
def depricated_options
|
85
|
-
|
125
|
+
@depricated_options ||= {}
|
86
126
|
end
|
87
127
|
|
88
128
|
# List of source options
|
89
129
|
# @return [Array<Symbol>] List of source symbols that can be used in the options hash
|
90
130
|
def sources
|
91
|
-
[:ref, :
|
131
|
+
[:ref, :stage, :working, :current, :in]
|
92
132
|
end
|
93
133
|
|
94
134
|
# List of commands requiring a source option
|
95
135
|
# @return [Array<Symbol>] List of command symbols that require a source in the options hash
|
96
136
|
def source_commands
|
97
|
-
|
137
|
+
@source_commands ||= []
|
98
138
|
end
|
99
139
|
|
100
140
|
# List of commands the activate the exclude files
|
101
141
|
# @return [Array<Symbol] List of commands the will activate the exclude files lists
|
102
142
|
def exclude_commands
|
103
|
-
[
|
143
|
+
@exclude_commands ||= []
|
104
144
|
end
|
105
145
|
|
106
146
|
# List of commands that require a device
|
107
147
|
# @return [Array<Symbol>] List of commands that require a device
|
108
148
|
def device_commands
|
109
|
-
|
110
|
-
:text, :monitor, :screencapture, :applist, :profile, :key, :genkey ]
|
149
|
+
@device_commands ||= []
|
111
150
|
end
|
112
151
|
end
|
113
152
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
module RokuBuilder
|
4
|
+
|
5
|
+
# Super class for modules
|
6
|
+
# This class defines a common initializer and allows subclasses
|
7
|
+
# to define their own secondary initializer
|
8
|
+
module Plugin
|
9
|
+
|
10
|
+
def commands
|
11
|
+
raise ImplementationError, "commands method not implemented in #{self}"
|
12
|
+
#[
|
13
|
+
# {
|
14
|
+
# name: :command_name,
|
15
|
+
# device: true || false,
|
16
|
+
# source: true || false,
|
17
|
+
# exclude: true || false
|
18
|
+
# }
|
19
|
+
#]
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse_options(option_parser:, options:)
|
23
|
+
raise ImplementationError, "parse_options method not implemented"
|
24
|
+
end
|
25
|
+
|
26
|
+
def dependencies
|
27
|
+
[]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
module RokuBuilder
|
4
|
+
|
5
|
+
class Core
|
6
|
+
extend Plugin
|
7
|
+
|
8
|
+
def self.commands
|
9
|
+
{
|
10
|
+
configure: {},
|
11
|
+
validate: {},
|
12
|
+
increment: {source: true, stage: true},
|
13
|
+
dostage: {source: true},
|
14
|
+
dounstage: {source: true}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.parse_options(parser:, options:)
|
19
|
+
parser.separator "Commands:"
|
20
|
+
parser.on("--configure", "Copy base configuration file to the --config location. Default: '~/.roku_config.json'") do
|
21
|
+
options[:configure] = true
|
22
|
+
end
|
23
|
+
parser.on("--validate", "Validate configuration") do
|
24
|
+
options[:validate] = true
|
25
|
+
end
|
26
|
+
parser.on("-u", "--update-manifest", "Increment manifest build version") do
|
27
|
+
options[:increment] = true
|
28
|
+
end
|
29
|
+
parser.on("--do-stage", "Run the stager. Used for scripting. Always run --do-unstage after") do
|
30
|
+
options[:dostage] = true
|
31
|
+
end
|
32
|
+
parser.on("--do-unstage", "Run the unstager. Used for scripting. Always run --do-script first") do
|
33
|
+
options[:dounstage] = true
|
34
|
+
end
|
35
|
+
parser.separator ""
|
36
|
+
parser.separator "Config Options:"
|
37
|
+
parser.on("-e", "--edit PARAMS", "Edit config params when configuring. (eg. a:b, c:d,e:f)") do |p|
|
38
|
+
options[:edit_params] = p
|
39
|
+
end
|
40
|
+
parser.on("--config CONFIG", "Set a custom config file. Default: '~/.roku_config.json'") do |c|
|
41
|
+
options[:config] = c
|
42
|
+
end
|
43
|
+
parser.separator ""
|
44
|
+
parser.separator "Source Options:"
|
45
|
+
parser.on("-r", "--ref REF", "Git referance to use for sideloading") do |r|
|
46
|
+
options[:ref] = r
|
47
|
+
end
|
48
|
+
parser.on("-w", "--working", "Use working directory to sideload or test") do
|
49
|
+
options[:working] = true
|
50
|
+
end
|
51
|
+
parser.on("-c", "--current", "Use current directory to sideload or test. Overrides any project config") do
|
52
|
+
options[:current] = true
|
53
|
+
end
|
54
|
+
parser.on("-s", "--stage STAGE", "Set the stage to use. Default: 'production'") do |b|
|
55
|
+
options[:stage] = b
|
56
|
+
end
|
57
|
+
parser.on("-P", "--project ID", "Use a different project") do |p|
|
58
|
+
options[:project] = p
|
59
|
+
end
|
60
|
+
parser.separator ""
|
61
|
+
parser.separator "Other Options:"
|
62
|
+
parser.on("-O", "--out PATH", "Output file/folder. If PATH ends in .pkg/.zip/.jpg, file is assumed, otherwise folder is assumed") do |o|
|
63
|
+
options[:out] = o
|
64
|
+
end
|
65
|
+
parser.on("-I", "--in PATH", "Input file for sideloading") do |i|
|
66
|
+
options[:in] = i
|
67
|
+
end
|
68
|
+
parser.on("-D", "--device ID", "Use a different device corresponding to the given ID") do |d|
|
69
|
+
options[:device] = d
|
70
|
+
options[:device_given] = true
|
71
|
+
end
|
72
|
+
parser.on("-V", "--verbose", "Print Info message") do
|
73
|
+
options[:verbose] = true
|
74
|
+
end
|
75
|
+
parser.on("--debug", "Print Debug messages") do
|
76
|
+
options[:debug] = true
|
77
|
+
end
|
78
|
+
parser.on("-h", "--help", "Show this message") do
|
79
|
+
puts parser
|
80
|
+
exit
|
81
|
+
end
|
82
|
+
parser.on("-v", "--version", "Show version") do
|
83
|
+
puts RokuBuilder::VERSION
|
84
|
+
exit
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def initialize(config:)
|
89
|
+
@config = config
|
90
|
+
end
|
91
|
+
|
92
|
+
def configure(options:)
|
93
|
+
# Stub command
|
94
|
+
# Handled in the config class
|
95
|
+
Logger.instance.unknown "Configured"
|
96
|
+
end
|
97
|
+
def validate(options:)
|
98
|
+
# Stub command
|
99
|
+
# Handled in the config class
|
100
|
+
Logger.instance.unknown "Config Validated"
|
101
|
+
end
|
102
|
+
def increment(options:)
|
103
|
+
manifest = Manifest.new(config: @config)
|
104
|
+
old = manifest.build_version
|
105
|
+
manifest.increment_build_version
|
106
|
+
new = manifest.build_version
|
107
|
+
Logger.instance.info "Update build version from:\n#{old}\nto:\n#{new}"
|
108
|
+
end
|
109
|
+
def dostage(options:)
|
110
|
+
Stager.new(config: @config, options: options).stage
|
111
|
+
end
|
112
|
+
def dounstage(options:)
|
113
|
+
Stager.new(config: @config, options: options).unstage
|
114
|
+
end
|
115
|
+
end
|
116
|
+
RokuBuilder.register_plugin(Core)
|
117
|
+
end
|
@@ -0,0 +1,104 @@
|
|
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
|
+
extend Plugin
|
8
|
+
|
9
|
+
def self.commands
|
10
|
+
{
|
11
|
+
inspect: {device: true, source: true},
|
12
|
+
screencapture: {device: true}
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.parse_options(parser:, options:)
|
17
|
+
parser.separator "Commands:"
|
18
|
+
parser.on("--inspect", "Print out information about a packaged app") do
|
19
|
+
options[:inspect] = true
|
20
|
+
end
|
21
|
+
parser.on("-S", "--screencapture", "Save a screencapture to the output file/folder") do
|
22
|
+
options[:screencapture] = true
|
23
|
+
end
|
24
|
+
parser.separator "Options:"
|
25
|
+
parser.on("--password PASSWORD", "Password used for inspect") do |p|
|
26
|
+
options[:password] = p
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Inspects the given pkg
|
31
|
+
def inspect(options:)
|
32
|
+
pkg = File.join(@config.in[:folder], @config.in[:file])
|
33
|
+
pkg = pkg+".pkg" unless pkg.end_with?(".pkg")
|
34
|
+
# upload new key with password
|
35
|
+
path = "/plugin_inspect"
|
36
|
+
conn = multipart_connection
|
37
|
+
payload = {
|
38
|
+
mysubmit: "Inspect",
|
39
|
+
passwd: options[:password],
|
40
|
+
archive: Faraday::UploadIO.new(pkg, 'application/octet-stream')
|
41
|
+
}
|
42
|
+
response = conn.post path, payload
|
43
|
+
|
44
|
+
app_name = /App Name:\s*<\/td>\s*<td>\s*<font[^>]*>([^<]*)<\/font>\s*<\/td>/.match(response.body)
|
45
|
+
dev_id = nil
|
46
|
+
creation_date = nil
|
47
|
+
dev_zip = nil
|
48
|
+
if app_name
|
49
|
+
app_name = app_name[1]
|
50
|
+
dev_id = /Dev ID:\s*<\/td>\s*<td>\s*<font[^>]*>([^<]*)<\/font>\s*<\/td>/.match(response.body)[1]
|
51
|
+
creation_date = /new Date\(([^)]*)\)/.match(response.body.delete("\n"))[1]
|
52
|
+
dev_zip = /dev.zip:\s*<\/td>\s*<td>\s*<font[^>]*>([^<]*)<\/font>\s*<\/td>/.match(response.body)[1]
|
53
|
+
else
|
54
|
+
app_name = /App Name:[^<]*<div[^>]*>([^<]*)<\/div>/.match(response.body)[1]
|
55
|
+
dev_id = /Dev ID:[^<]*<div[^>]*><font[^>]*>([^<]*)<\/font><\/div>/.match(response.body)[1]
|
56
|
+
creation_date = /new Date\(([^\/]*)\)/.match(response.body.delete("\n"))[1]
|
57
|
+
dev_zip = /dev.zip:[^<]*<div[^>]*><font[^>]*>([^<]*)<\/font><\/div>/.match(response.body)[1]
|
58
|
+
end
|
59
|
+
|
60
|
+
info = {app_name: app_name, dev_id: dev_id, creation_date: Time.at(creation_date.to_i).to_s, dev_zip: dev_zip}
|
61
|
+
|
62
|
+
inspect_logger = ::Logger.new(STDOUT)
|
63
|
+
inspect_logger.formatter = proc {|_severity, _datetime, _progname, msg|
|
64
|
+
"%s\n\r" % [msg]
|
65
|
+
}
|
66
|
+
inspect_logger.unknown "=============================================================="
|
67
|
+
inspect_logger.unknown "App Name: #{info[:app_name]}"
|
68
|
+
inspect_logger.unknown "Dev ID: #{info[:dev_id]}"
|
69
|
+
inspect_logger.unknown "Creation Date: #{info[:creation_date]}"
|
70
|
+
inspect_logger.unknown "dev.zip: #{info[:dev_zip]}"
|
71
|
+
inspect_logger.unknown "=============================================================="
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
# Capture a screencapture for the currently sideloaded app
|
76
|
+
# @return [Boolean] Success
|
77
|
+
def screencapture(options:)
|
78
|
+
out = @config.out
|
79
|
+
payload = {
|
80
|
+
mysubmit: "Screenshot",
|
81
|
+
passwd: @dev_password,
|
82
|
+
archive: Faraday::UploadIO.new(File::NULL, 'application/octet-stream')
|
83
|
+
}
|
84
|
+
response = multipart_connection.post "/plugin_inspect", payload
|
85
|
+
|
86
|
+
path = /<img src="([^"]*)">/.match(response.body)
|
87
|
+
raise ExecutionError, "Failed to capture screen" unless path
|
88
|
+
path = path[1]
|
89
|
+
|
90
|
+
unless out[:file]
|
91
|
+
out[:file] = /time=([^"]*)">/.match(response.body)
|
92
|
+
out[:file] = "dev_#{out[:file][1]}.jpg" if out[:file]
|
93
|
+
end
|
94
|
+
|
95
|
+
response = simple_connection.get path
|
96
|
+
|
97
|
+
File.open(File.join(out[:folder], out[:file]), "w") do |io|
|
98
|
+
io.write(response.body)
|
99
|
+
end
|
100
|
+
@logger.info "Screen captured to #{File.join(out[:folder], out[:file])}"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
RokuBuilder.register_plugin(Inspector)
|
104
|
+
end
|