roku_builder 3.3.4 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -5
- data/README.md +2 -0
- data/config.json.example +1 -0
- data/lib/roku_builder.rb +13 -0
- data/lib/roku_builder/config_manager.rb +6 -0
- data/lib/roku_builder/config_parser.rb +40 -15
- data/lib/roku_builder/config_validator.rb +14 -2
- data/lib/roku_builder/controller_commands.rb +6 -1
- data/lib/roku_builder/loader.rb +22 -60
- data/lib/roku_builder/manifest_manager.rb +48 -0
- data/lib/roku_builder/stager.rb +86 -0
- data/lib/roku_builder/util.rb +6 -2
- data/lib/roku_builder/version.rb +1 -1
- data/tests/roku_builder/loader_test.rb +20 -12
- data/tests/roku_builder/manifest_manager_test.rb +30 -0
- data/tests/roku_builder/stager_test.rb +179 -0
- data/tests/roku_builder/test_files/manifest_manager_test/manifest_template +5 -1
- data/tests/roku_builder/test_files/manifest_manager_test/manifest_template_2 +5 -1
- data/tests/roku_builder/test_files/manifest_manager_test/updated_title_manifest +6 -0
- data/tests/roku_builder/test_files/stager_test/a +0 -0
- data/tests/roku_builder/test_files/stager_test/manifest +0 -0
- data/tests/roku_builder/test_files/stager_test/source/b +0 -0
- data/tests/roku_builder/test_files/stager_test/source/c/d +0 -0
- data/tests/roku_builder/test_helper.rb +1 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a9d534271fdbd6b97dd36575bfd13e248af80d8
|
4
|
+
data.tar.gz: 1d250755fb3a741fd8887f9756c70f52648225c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7460a08f88a3cc134bac6a47c29ae76bfb8810110a667d7498b9274db8a86b2d5b6cb4370206d55716fb31c5d822952d0f8d952aef8ccbb07b5ed5a7b20c1ffd
|
7
|
+
data.tar.gz: dfcb56377c93de06217de2cd359877ccdecd496de1c2b6cbc2014c95b6adc0e778e973767961c082fdde9d8dcb576887cd8fef7807cf9e317471733e35cfe5f2
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
roku_builder (3.
|
4
|
+
roku_builder (3.4.0)
|
5
5
|
faraday (~> 0.9)
|
6
6
|
faraday-digestauth (~> 0.2)
|
7
7
|
git (~> 1.3)
|
@@ -11,8 +11,8 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
byebug (8.2.
|
15
|
-
coderay (1.1.
|
14
|
+
byebug (8.2.4)
|
15
|
+
coderay (1.1.1)
|
16
16
|
coveralls (0.8.13)
|
17
17
|
json (~> 1.8)
|
18
18
|
simplecov (~> 0.11.0)
|
@@ -23,7 +23,7 @@ GEM
|
|
23
23
|
em-websocket (0.5.1)
|
24
24
|
eventmachine (>= 0.12.9)
|
25
25
|
http_parser.rb (~> 0.6.0)
|
26
|
-
eventmachine (1.0.
|
26
|
+
eventmachine (1.2.0.1)
|
27
27
|
faraday (0.9.2)
|
28
28
|
multipart-post (>= 1.2, < 3)
|
29
29
|
faraday-digestauth (0.2.1)
|
@@ -71,7 +71,7 @@ GEM
|
|
71
71
|
coderay (~> 1.1.0)
|
72
72
|
method_source (~> 0.8.1)
|
73
73
|
slop (~> 3.4)
|
74
|
-
rake (11.1.
|
74
|
+
rake (11.1.2)
|
75
75
|
rb-fsevent (0.9.7)
|
76
76
|
rb-inotify (0.9.7)
|
77
77
|
ffi (>= 0.5.0)
|
data/README.md
CHANGED
data/config.json.example
CHANGED
data/lib/roku_builder.rb
CHANGED
@@ -17,6 +17,7 @@ require "roku_builder/controller_commands"
|
|
17
17
|
require "roku_builder/util"
|
18
18
|
require "roku_builder/keyer"
|
19
19
|
require "roku_builder/inspector"
|
20
|
+
require "roku_builder/stager"
|
20
21
|
require "roku_builder/loader"
|
21
22
|
require "roku_builder/packager"
|
22
23
|
require "roku_builder/linker"
|
@@ -125,3 +126,15 @@ module RokuBuilder
|
|
125
126
|
# Failed to capture screen
|
126
127
|
FAILED_SCREENCAPTURE = 12
|
127
128
|
end
|
129
|
+
|
130
|
+
class String
|
131
|
+
def underscore
|
132
|
+
word = self.dup
|
133
|
+
word.gsub!(/::/, '/')
|
134
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
135
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
136
|
+
word.tr!("-", "_")
|
137
|
+
word.downcase!
|
138
|
+
word
|
139
|
+
end
|
140
|
+
end
|
@@ -47,6 +47,12 @@ module RokuBuilder
|
|
47
47
|
config = JSON.parse(File.open(config).read, {symbolize_names: true})
|
48
48
|
config[:devices][:default] = config[:devices][:default].to_sym
|
49
49
|
config[:projects][:default] = config[:projects][:default].to_sym
|
50
|
+
config[:projects].each_pair do |key,value|
|
51
|
+
next if key == :default
|
52
|
+
if value[:stage_method]
|
53
|
+
value[:stage_method] = value[:stage_method].to_sym
|
54
|
+
end
|
55
|
+
end
|
50
56
|
config
|
51
57
|
rescue JSON::ParserError
|
52
58
|
logger.fatal "Config file is not valid JSON"
|
@@ -11,7 +11,7 @@ module RokuBuilder
|
|
11
11
|
# @return [Integer] Return code
|
12
12
|
# @return [Hash] Intermeidate configs
|
13
13
|
def self.parse_config(options:, config:, logger:)
|
14
|
-
configs = {}
|
14
|
+
configs = {init_params: {}}
|
15
15
|
#set device
|
16
16
|
unless options[:device]
|
17
17
|
options[:device] = config[:devices][:default]
|
@@ -27,14 +27,10 @@ module RokuBuilder
|
|
27
27
|
project_config = setup_project_config(config: config, options: options)
|
28
28
|
return [UNKNOWN_PROJECT, nil, nil] unless project_config
|
29
29
|
configs[:project_config] = project_config
|
30
|
-
stage = options
|
31
|
-
return [UNKNOWN_STAGE, nil, nil] unless
|
32
|
-
configs[:
|
33
|
-
|
34
|
-
branch = options[:ref] if options[:ref]
|
35
|
-
branch = nil if options[:current]
|
36
|
-
branch = nil if options[:working]
|
37
|
-
setup_sideload_config(configs: configs, options: options, branch: branch)
|
30
|
+
stage_config, stage = setup_stage_config(configs: configs, options: options, logger: logger)
|
31
|
+
return [UNKNOWN_STAGE, nil, nil] unless stage
|
32
|
+
configs[:stage_config] = stage_config
|
33
|
+
setup_sideload_config(configs: configs, options: options)
|
38
34
|
setup_package_config(configs: configs, options: options, stage: stage)
|
39
35
|
setup_simple_configs(configs: configs, options: options, logger: logger)
|
40
36
|
return [SUCCESS, configs]
|
@@ -97,36 +93,65 @@ module RokuBuilder
|
|
97
93
|
directory: pwd,
|
98
94
|
folders: nil,
|
99
95
|
files: nil,
|
100
|
-
|
96
|
+
stage_method: :current
|
101
97
|
}
|
102
98
|
else
|
103
99
|
project_config = config[:projects][options[:project].to_sym]
|
100
|
+
project_config[:stage_method] = :working if options[:working]
|
104
101
|
end
|
105
102
|
project_config
|
106
103
|
end
|
107
104
|
private_class_method :setup_project_config
|
108
105
|
|
106
|
+
# Setup the project stage config
|
107
|
+
# @param configs [Hash] The loaded config hash
|
108
|
+
# @param options [Hash] The options hash
|
109
|
+
# @return [Hash] The stage config hash
|
110
|
+
def self.setup_stage_config(configs:, options:, logger:)
|
111
|
+
stage_config = {logger: logger}
|
112
|
+
stage = options[:stage].to_sym
|
113
|
+
project_config = configs[:project_config]
|
114
|
+
stage_config[:root_dir] = project_config[:directory]
|
115
|
+
stage_config[:method] = project_config[:stage_method]
|
116
|
+
stage_config[:method] ||= :git
|
117
|
+
case stage_config[:method]
|
118
|
+
when :git
|
119
|
+
if options[:ref]
|
120
|
+
stage_config[:key] = options[:ref]
|
121
|
+
else
|
122
|
+
return nil unless project_config[:stages][stage]
|
123
|
+
stage_config[:key] = project_config[:stages][stage][:branch]
|
124
|
+
end
|
125
|
+
when :script
|
126
|
+
return nil unless project_config[:stages][stage]
|
127
|
+
stage_config[:key] = project_config[:stages][stage][:script]
|
128
|
+
end
|
129
|
+
configs[:stage] = stage_config
|
130
|
+
[stage_config, stage]
|
131
|
+
end
|
132
|
+
|
109
133
|
# Setup config hashes for sideloading
|
110
134
|
# @param configs [Hash] The parsed configs hash
|
111
135
|
# @param options [Hash] The options hash
|
112
136
|
# @param branch [String] the branch to sideload
|
113
|
-
def self.setup_sideload_config(configs:, options
|
137
|
+
def self.setup_sideload_config(configs:, options:)
|
114
138
|
root_dir = configs[:project_config][:directory]
|
115
139
|
# Create Sideload Config
|
116
140
|
configs[:sideload_config] = {
|
117
|
-
|
118
|
-
branch: branch,
|
141
|
+
stage: configs[:stage_config],
|
119
142
|
update_manifest: options[:update_manifest],
|
120
143
|
folders: configs[:project_config][:folders],
|
121
144
|
files: configs[:project_config][:files]
|
122
145
|
}
|
123
146
|
# Create Build Config
|
124
147
|
configs[:build_config] = {
|
125
|
-
|
126
|
-
branch: branch,
|
148
|
+
stage: configs[:stage_config],
|
127
149
|
folders: configs[:project_config][:folders],
|
128
150
|
files: configs[:project_config][:files]
|
129
151
|
}
|
152
|
+
configs[:init_params][:loader] = {
|
153
|
+
root_dir: root_dir
|
154
|
+
}
|
130
155
|
end
|
131
156
|
private_class_method :setup_sideload_config
|
132
157
|
|
@@ -16,6 +16,11 @@ module RokuBuilder
|
|
16
16
|
PROJECT_MISSING_FILES = 14
|
17
17
|
PROJECT_FILES_BAD = 15
|
18
18
|
STAGE_MISSING_BRANCH = 16
|
19
|
+
STAGE_MISSING_SCRIPT = 17
|
20
|
+
PROJECT_STAGE_METHOD_BAD = 18
|
21
|
+
|
22
|
+
|
23
|
+
MISSING_STAGE_METHOD = -1
|
19
24
|
|
20
25
|
# Validate Config File
|
21
26
|
class ConfigValidator
|
@@ -39,6 +44,7 @@ module RokuBuilder
|
|
39
44
|
validate_project(codes: codes, project: v)
|
40
45
|
}
|
41
46
|
end
|
47
|
+
codes.uniq!
|
42
48
|
codes.push(0) if codes.empty?
|
43
49
|
codes
|
44
50
|
end
|
@@ -64,8 +70,11 @@ module RokuBuilder
|
|
64
70
|
"A project config's folders is not an array.",
|
65
71
|
"A project config is missing its files.",
|
66
72
|
"A project config's files is not an array.", #15
|
67
|
-
"A project stage is missing its branch."
|
73
|
+
"A project stage is missing its branch.",
|
74
|
+
"A project stage is missing its script.",
|
75
|
+
"A project as an invalid stage method.",
|
68
76
|
#===============WARNINGS===============#
|
77
|
+
"A project is missing its stage method."
|
69
78
|
]
|
70
79
|
end
|
71
80
|
|
@@ -116,8 +125,11 @@ module RokuBuilder
|
|
116
125
|
codes.push(PROJECT_FOLDERS_BAD) if project[:folders] and not project[:folders].is_a?(Array)
|
117
126
|
codes.push(PROJECT_MISSING_FILES) if not project[:files]
|
118
127
|
codes.push(PROJECT_FILES_BAD) if project[:files] and not project[:files].is_a?(Array)
|
128
|
+
codes.push(MISSING_STAGE_METHOD) unless project[:stage_method]
|
129
|
+
codes.push(PROJECT_STAGE_METHOD_BAD) unless [:git, :script, nil].include?(project[:stage_method])
|
119
130
|
project[:stages].each {|_stage,value|
|
120
|
-
codes.push(STAGE_MISSING_BRANCH) if not value[:branch]
|
131
|
+
codes.push(STAGE_MISSING_BRANCH) if not value[:branch] and project[:stage_method] == :git
|
132
|
+
codes.push(STAGE_MISSING_SCRIPT) if not value[:script] and project[:stage_method] == :script
|
121
133
|
}
|
122
134
|
end
|
123
135
|
private_class_method :validate_project
|
@@ -99,7 +99,12 @@ module RokuBuilder
|
|
99
99
|
# @param failure [Integer] failure code to return on failure if not nil
|
100
100
|
# @return [Integer] Success of failure code
|
101
101
|
def self.simple_command(klass:, method:, config_key: nil, configs:, failure: nil)
|
102
|
-
|
102
|
+
config = configs[:device_config].dup
|
103
|
+
key = klass.to_s.split("::")[-1].underscore.to_sym
|
104
|
+
if configs[:init_params][key]
|
105
|
+
config[:init_params] = configs[:init_params][key]
|
106
|
+
end
|
107
|
+
instance = klass.new(**config)
|
103
108
|
if config_key
|
104
109
|
success = instance.send(method, configs[config_key])
|
105
110
|
else
|
data/lib/roku_builder/loader.rb
CHANGED
@@ -3,26 +3,31 @@ module RokuBuilder
|
|
3
3
|
# Load/Unload/Build roku applications
|
4
4
|
class Loader < Util
|
5
5
|
|
6
|
+
|
7
|
+
# Set the root directory
|
8
|
+
def init(root_dir: nil)
|
9
|
+
@root_dir = root_dir
|
10
|
+
end
|
11
|
+
|
6
12
|
# Sideload an app onto a roku device
|
7
13
|
# @param root_dir [String] Path to the root directory of the roku app
|
8
|
-
# @param
|
14
|
+
# @param stage [Hash] stage to use for sideloading.
|
9
15
|
# @param update_manifest [Boolean] Flag to update the manifest file before sideloading. Default: false
|
10
16
|
# @param folders [Array<String>] Array of folders to be sideloaded. Pass nil to send all folders. Default: nil
|
11
17
|
# @param files [Array<String>] Array of files to be sideloaded. Pass nil to send all files. Default: nil
|
12
18
|
# @return [String] Build version on success, nil otherwise
|
13
|
-
def sideload(
|
14
|
-
@root_dir = root_dir
|
19
|
+
def sideload(stage:, update_manifest: false, folders: nil, files: nil)
|
15
20
|
result = nil
|
16
|
-
|
17
|
-
|
21
|
+
stager = Stager.new(**stage)
|
22
|
+
if stager.stage
|
18
23
|
# Update manifest
|
19
24
|
build_version = ""
|
20
25
|
if update_manifest
|
21
|
-
build_version = ManifestManager.update_build(root_dir: root_dir)
|
26
|
+
build_version = ManifestManager.update_build(root_dir: @root_dir)
|
22
27
|
else
|
23
|
-
build_version = ManifestManager.build_version(root_dir: root_dir)
|
28
|
+
build_version = ManifestManager.build_version(root_dir: @root_dir)
|
24
29
|
end
|
25
|
-
outfile = build(
|
30
|
+
outfile = build(stage: stage, build_version: build_version, folders: folders, files: files)
|
26
31
|
path = "/plugin_install"
|
27
32
|
# Connect to roku and upload file
|
28
33
|
conn = multipart_connection
|
@@ -34,35 +39,29 @@ module RokuBuilder
|
|
34
39
|
# Cleanup
|
35
40
|
File.delete(outfile)
|
36
41
|
result = build_version if response.status==200 and response.body=~/Install Success/
|
37
|
-
git_switch_from(branch: branch)
|
38
|
-
rescue Git::GitExecuteError
|
39
|
-
git_rescue
|
40
|
-
ensure
|
41
|
-
@current_dir ||= Dir.pwd
|
42
|
-
Dir.chdir(@current_dir) unless @current_dir == Dir.pwd
|
43
42
|
end
|
43
|
+
stager.unstage
|
44
44
|
result
|
45
45
|
end
|
46
46
|
|
47
47
|
|
48
48
|
# Build an app to sideload later
|
49
49
|
# @param root_dir [String] Path to the root directory of the roku app
|
50
|
-
# @param
|
50
|
+
# @param stage [Hash] stage to use for sideloading.
|
51
51
|
# @param build_version [String] Version to assigne to the build. If nil will pull the build version form the manifest. Default: nil
|
52
52
|
# @param outfile [String] Path for the output file. If nil will create a file in /tmp. Default: nil
|
53
53
|
# @param folders [Array<String>] Array of folders to be sideloaded. Pass nil to send all folders. Default: nil
|
54
54
|
# @param files [Array<String>] Array of files to be sideloaded. Pass nil to send all files. Default: nil
|
55
55
|
# @return [String] Path of the build
|
56
|
-
def build(
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
build_version = ManifestManager.build_version(root_dir: root_dir, logger: @logger) unless build_version
|
56
|
+
def build(stage:, build_version: nil, outfile: nil, folders: nil, files: nil)
|
57
|
+
stager = Stager.new(**stage)
|
58
|
+
if stager.stage
|
59
|
+
build_version = ManifestManager.build_version(root_dir: @root_dir, logger: @logger) unless build_version
|
61
60
|
unless folders
|
62
|
-
folders = Dir.entries(root_dir).select {|entry| File.directory? File.join(root_dir, entry) and !(entry =='.' || entry == '..') }
|
61
|
+
folders = Dir.entries(@root_dir).select {|entry| File.directory? File.join(@root_dir, entry) and !(entry =='.' || entry == '..') }
|
63
62
|
end
|
64
63
|
unless files
|
65
|
-
files = Dir.entries(root_dir).select {|entry| File.file? File.join(root_dir, entry)}
|
64
|
+
files = Dir.entries(@root_dir).select {|entry| File.file? File.join(@root_dir, entry)}
|
66
65
|
end
|
67
66
|
outfile = "/tmp/build_#{build_version}.zip" unless outfile
|
68
67
|
File.delete(outfile) if File.exist?(outfile)
|
@@ -78,13 +77,8 @@ module RokuBuilder
|
|
78
77
|
# Add file to zip
|
79
78
|
writeEntries(@root_dir, files, "", io)
|
80
79
|
io.close()
|
81
|
-
git_switch_from(branch: branch)
|
82
|
-
rescue Git::GitExecuteError
|
83
|
-
git_rescue
|
84
|
-
ensure
|
85
|
-
@current_dir ||= Dir.pwd
|
86
|
-
Dir.chdir(@current_dir) unless @current_dir == Dir.pwd
|
87
80
|
end
|
81
|
+
stager.unstage
|
88
82
|
outfile
|
89
83
|
end
|
90
84
|
|
@@ -125,37 +119,5 @@ module RokuBuilder
|
|
125
119
|
end
|
126
120
|
}
|
127
121
|
end
|
128
|
-
|
129
|
-
# Switch to the correct branch
|
130
|
-
def git_switch_to(branch:)
|
131
|
-
if branch
|
132
|
-
@current_dir = Dir.pwd
|
133
|
-
@git ||= Git.open(@root_dir)
|
134
|
-
if branch != @git.current_branch
|
135
|
-
Dir.chdir(@root_dir)
|
136
|
-
@current_branch = @git.current_branch
|
137
|
-
@stash = @git.branch.stashes.save("roku-builder-temp-stash")
|
138
|
-
@git.checkout(branch)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
# Switch back to the previous branch
|
144
|
-
def git_switch_from(branch:)
|
145
|
-
if branch
|
146
|
-
@git ||= Git.open(@root_dir)
|
147
|
-
if @git and @current_branch
|
148
|
-
@git.checkout(@current_branch)
|
149
|
-
@git.branch.stashes.apply if @stash
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
# Called if resuce from git exception
|
155
|
-
def git_rescue
|
156
|
-
@logger.error "Branch or ref does not exist"
|
157
|
-
@logger.error e.message
|
158
|
-
@logger.error e.backtrace
|
159
|
-
end
|
160
122
|
end
|
161
123
|
end
|
@@ -58,5 +58,53 @@ module RokuBuilder
|
|
58
58
|
end
|
59
59
|
build_version
|
60
60
|
end
|
61
|
+
|
62
|
+
# Update attributes in the app manifest
|
63
|
+
# It will add missing attributes but not remove them
|
64
|
+
# @param root_dir [String] The app root directory
|
65
|
+
# @param attributes [Hash] The new attributes for the app manifest
|
66
|
+
def self.update_manifest(root_dir:, attributes:)
|
67
|
+
temp_file = Tempfile.new('manifest')
|
68
|
+
path = File.join(root_dir, 'manifest')
|
69
|
+
new_params = attributes.dup
|
70
|
+
begin
|
71
|
+
if File.exist?(path)
|
72
|
+
File.open(path, 'r') do |file|
|
73
|
+
file.each_line do |line|
|
74
|
+
key = line.split("=")[0]
|
75
|
+
if new_params.include?(key.to_sym)
|
76
|
+
temp_file.puts("#{key}=#{new_params[key.to_sym]}")
|
77
|
+
new_params.delete(key)
|
78
|
+
else
|
79
|
+
temp_file.puts(line)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
else
|
84
|
+
new_params = self.default_params().merge(new_params)
|
85
|
+
end
|
86
|
+
new_params.each_pair do |key, value|
|
87
|
+
temp_file.puts("#{key}=#{value}")
|
88
|
+
end
|
89
|
+
temp_file.rewind
|
90
|
+
FileUtils.cp(temp_file.path, path)
|
91
|
+
ensure
|
92
|
+
temp_file.close
|
93
|
+
temp_file.unlink
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Returns the default manafest values
|
98
|
+
# @return [Hash] default manifest values
|
99
|
+
def self.default_params
|
100
|
+
{
|
101
|
+
title: "Default Title",
|
102
|
+
major_version: 1,
|
103
|
+
minor_version: 0,
|
104
|
+
build_version: "010101.0001",
|
105
|
+
mm_icon_focus_hd: "<insert hd focus icon url>",
|
106
|
+
mm_icon_focus_sd: "<insert sd focus icon url>"
|
107
|
+
}
|
108
|
+
end
|
61
109
|
end
|
62
110
|
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module RokuBuilder
|
2
|
+
|
3
|
+
# Change stage of roku application
|
4
|
+
class Stager
|
5
|
+
|
6
|
+
def initialize(key: nil, method:, root_dir:, logger:)
|
7
|
+
@method = method
|
8
|
+
@key = key
|
9
|
+
@root_dir = root_dir
|
10
|
+
@logger = logger
|
11
|
+
@stage_success = true
|
12
|
+
@orginal_directory = Dir.pwd
|
13
|
+
end
|
14
|
+
|
15
|
+
def stage
|
16
|
+
Dir.chdir(@root_dir) unless @root_dir == @orginal_directory
|
17
|
+
case @method
|
18
|
+
when :current
|
19
|
+
# Do Nothing
|
20
|
+
when :working
|
21
|
+
# Do Nothing
|
22
|
+
when :git
|
23
|
+
begin
|
24
|
+
git_switch_to(branch: @key)
|
25
|
+
rescue Git::GitExecuteError
|
26
|
+
git_rescue
|
27
|
+
@stage_success = false
|
28
|
+
end
|
29
|
+
when :script
|
30
|
+
Controller.system(command: @key[:stage])
|
31
|
+
end
|
32
|
+
@stage_success
|
33
|
+
end
|
34
|
+
|
35
|
+
def unstage
|
36
|
+
unstage_success = true
|
37
|
+
case @method
|
38
|
+
when :current
|
39
|
+
# Do Nothing
|
40
|
+
when :working
|
41
|
+
# Do Nothing
|
42
|
+
when :git
|
43
|
+
begin
|
44
|
+
git_switch_from(branch: @key, checkout: @stage_success)
|
45
|
+
rescue Git::GitExecuteError
|
46
|
+
git_rescue
|
47
|
+
unstage_success = false
|
48
|
+
end
|
49
|
+
when :script
|
50
|
+
Controller.system(command: @key[:unstage])
|
51
|
+
end
|
52
|
+
Dir.chdir(@orginal_directory) unless @root_dir == @orginal_directory
|
53
|
+
unstage_success
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
# Switch to the correct branch
|
59
|
+
def git_switch_to(branch:)
|
60
|
+
if branch
|
61
|
+
@git ||= Git.open(@root_dir)
|
62
|
+
if branch != @git.current_branch
|
63
|
+
@current_branch = @git.current_branch
|
64
|
+
@stash = @git.branch.stashes.save("roku-builder-temp-stash")
|
65
|
+
@git.checkout(branch)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Switch back to the previous branch
|
71
|
+
def git_switch_from(branch:, checkout: true)
|
72
|
+
if branch
|
73
|
+
@git ||= Git.open(@root_dir)
|
74
|
+
if @git and @current_branch
|
75
|
+
@git.checkout(@current_branch) if checkout
|
76
|
+
@git.branch.stashes.apply if @stash
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Called if resuce from git exception
|
82
|
+
def git_rescue
|
83
|
+
@logger.error "Branch or ref does not exist"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/roku_builder/util.rb
CHANGED
@@ -9,7 +9,7 @@ module RokuBuilder
|
|
9
9
|
# @param ip [String] IP address of roku device
|
10
10
|
# @param user [String] Username for roku device
|
11
11
|
# @param password [String] Password for roku device
|
12
|
-
def initialize(ip:, user:, password:, logger:)
|
12
|
+
def initialize(ip:, user:, password:, logger:, init_params: nil)
|
13
13
|
@device_config = {
|
14
14
|
ip: ip,
|
15
15
|
user: user,
|
@@ -20,7 +20,11 @@ module RokuBuilder
|
|
20
20
|
@dev_password = password
|
21
21
|
@url = "http://#{@roku_ip_address}"
|
22
22
|
@logger = logger
|
23
|
-
|
23
|
+
if init_params
|
24
|
+
init(**init_params)
|
25
|
+
else
|
26
|
+
init
|
27
|
+
end
|
24
28
|
end
|
25
29
|
|
26
30
|
# Second initializer to be overwriten
|
data/lib/roku_builder/version.rb
CHANGED
@@ -8,14 +8,16 @@ class LoaderTest < Minitest::Test
|
|
8
8
|
response = Minitest::Mock.new
|
9
9
|
|
10
10
|
root_dir = File.join(File.dirname(__FILE__), "test_files", "loader_test")
|
11
|
+
logger = Logger.new("/dev/null")
|
11
12
|
device_config = {
|
12
13
|
ip: "111.222.333",
|
13
14
|
user: "user",
|
14
15
|
password: "password",
|
15
|
-
logger:
|
16
|
+
logger: logger,
|
17
|
+
init_params: {root_dir: root_dir}
|
16
18
|
}
|
17
19
|
loader_config = {
|
18
|
-
root_dir: root_dir,
|
20
|
+
stage: {method: :working, root_dir: root_dir, logger: logger},
|
19
21
|
folders: ["source"],
|
20
22
|
files: ["manifest"]
|
21
23
|
}
|
@@ -66,14 +68,16 @@ class LoaderTest < Minitest::Test
|
|
66
68
|
response = Minitest::Mock.new
|
67
69
|
|
68
70
|
root_dir = File.join(File.dirname(__FILE__), "test_files", "loader_test")
|
71
|
+
logger = Logger.new("/dev/null")
|
69
72
|
device_config = {
|
70
73
|
ip: "111.222.333",
|
71
74
|
user: "user",
|
72
75
|
password: "password",
|
73
|
-
logger:
|
76
|
+
logger: logger,
|
77
|
+
init_params: {root_dir: root_dir}
|
74
78
|
}
|
75
79
|
loader_config = {
|
76
|
-
root_dir: root_dir,
|
80
|
+
stage: {method: :working, root_dir: root_dir, logger: logger},
|
77
81
|
update_manifest: true,
|
78
82
|
folders: ["source"],
|
79
83
|
files: ["manifest"]
|
@@ -121,14 +125,16 @@ class LoaderTest < Minitest::Test
|
|
121
125
|
|
122
126
|
def test_loader_build_defining_folder_and_files
|
123
127
|
root_dir = File.join(File.dirname(__FILE__), "test_files", "loader_test")
|
128
|
+
logger = Logger.new("/dev/null")
|
124
129
|
device_config = {
|
125
130
|
ip: "111.222.333",
|
126
131
|
user: "user",
|
127
132
|
password: "password",
|
128
|
-
logger:
|
133
|
+
logger: logger,
|
134
|
+
init_params: {root_dir: root_dir}
|
129
135
|
}
|
130
136
|
build_config = {
|
131
|
-
root_dir: root_dir,
|
137
|
+
stage: {method: :working, root_dir: root_dir, logger: logger},
|
132
138
|
folders: ["source"],
|
133
139
|
files: ["manifest"]
|
134
140
|
}
|
@@ -146,15 +152,15 @@ class LoaderTest < Minitest::Test
|
|
146
152
|
end
|
147
153
|
def test_loader_build_all_contents
|
148
154
|
root_dir = File.join(File.dirname(__FILE__), "test_files", "loader_test")
|
155
|
+
logger = Logger.new("/dev/null")
|
149
156
|
device_config = {
|
150
157
|
ip: "111.222.333",
|
151
158
|
user: "user",
|
152
159
|
password: "password",
|
153
|
-
logger:
|
154
|
-
|
155
|
-
build_config = {
|
156
|
-
root_dir: root_dir,
|
160
|
+
logger: logger,
|
161
|
+
init_params: {root_dir: root_dir}
|
157
162
|
}
|
163
|
+
build_config = {stage: {method: :working, root_dir: root_dir, logger: logger}}
|
158
164
|
loader = RokuBuilder::Loader.new(**device_config)
|
159
165
|
outfile = nil
|
160
166
|
RokuBuilder::ManifestManager.stub(:build_version, "build_version") do
|
@@ -177,7 +183,8 @@ class LoaderTest < Minitest::Test
|
|
177
183
|
ip: "111.222.333",
|
178
184
|
user: "user",
|
179
185
|
password: "password",
|
180
|
-
logger: Logger.new("/dev/null")
|
186
|
+
logger: Logger.new("/dev/null"),
|
187
|
+
init_params: {root_dir: "/dev/null"}
|
181
188
|
}
|
182
189
|
payload = {
|
183
190
|
mysubmit: "Delete",
|
@@ -219,7 +226,8 @@ class LoaderTest < Minitest::Test
|
|
219
226
|
ip: "111.222.333",
|
220
227
|
user: "user",
|
221
228
|
password: "password",
|
222
|
-
logger: Logger.new("/dev/null")
|
229
|
+
logger: Logger.new("/dev/null"),
|
230
|
+
init_params: {root_dir: "/dev/null"}
|
223
231
|
}
|
224
232
|
payload = {
|
225
233
|
mysubmit: "Delete",
|
@@ -31,4 +31,34 @@ class ManifestManagerTest < Minitest::Test
|
|
31
31
|
assert_equal "010101.1", build_version
|
32
32
|
FileUtils.rm(File.join(root_dir, "manifest"))
|
33
33
|
end
|
34
|
+
|
35
|
+
def test_manifest_manager_update_manifest
|
36
|
+
root_dir = File.join(File.dirname(__FILE__), "test_files", "manifest_manager_test")
|
37
|
+
FileUtils.cp(File.join(root_dir, "manifest_template"), File.join(root_dir, "manifest"))
|
38
|
+
attrs = {
|
39
|
+
title: "New Title",
|
40
|
+
major_version: 2,
|
41
|
+
minor_version: 2,
|
42
|
+
build_version: "020202.0002",
|
43
|
+
mm_icon_focus_hd: "pkg:/images/focus1.png",
|
44
|
+
mm_icon_focus_sd: "pkg:/images/focus2.png"
|
45
|
+
}
|
46
|
+
RokuBuilder::ManifestManager.update_manifest(root_dir: root_dir, attributes: attrs)
|
47
|
+
assert FileUtils.compare_file(File.join(root_dir, "manifest"), File.join(root_dir, "updated_title_manifest"))
|
48
|
+
FileUtils.rm(File.join(root_dir, "manifest"))
|
49
|
+
end
|
50
|
+
def test_manifest_manager_update_manifest
|
51
|
+
root_dir = File.join(File.dirname(__FILE__), "test_files", "manifest_manager_test")
|
52
|
+
attrs = {
|
53
|
+
title: "New Title",
|
54
|
+
major_version: 2,
|
55
|
+
minor_version: 2,
|
56
|
+
build_version: "020202.0002",
|
57
|
+
mm_icon_focus_hd: "pkg:/images/focus1.png",
|
58
|
+
mm_icon_focus_sd: "pkg:/images/focus2.png"
|
59
|
+
}
|
60
|
+
RokuBuilder::ManifestManager.update_manifest(root_dir: root_dir, attributes: attrs)
|
61
|
+
assert FileUtils.compare_file(File.join(root_dir, "manifest"), File.join(root_dir, "updated_title_manifest"))
|
62
|
+
FileUtils.rm(File.join(root_dir, "manifest"))
|
63
|
+
end
|
34
64
|
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require_relative "test_helper.rb"
|
2
|
+
|
3
|
+
class StagerTest < Minitest::Test
|
4
|
+
def test_stager_stage_working
|
5
|
+
root_dir = File.join(File.dirname(__FILE__), "test_files", "stager_test")
|
6
|
+
stager_config = {
|
7
|
+
method: :working,
|
8
|
+
root_dir: root_dir,
|
9
|
+
logger: nil
|
10
|
+
}
|
11
|
+
stager = RokuBuilder::Stager.new(**stager_config)
|
12
|
+
assert stager.stage
|
13
|
+
assert stager.unstage
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_stager_stage_current
|
17
|
+
root_dir = File.join(File.dirname(__FILE__), "test_files", "stager_test")
|
18
|
+
stager_config = {
|
19
|
+
method: :current,
|
20
|
+
root_dir: root_dir,
|
21
|
+
logger: nil
|
22
|
+
}
|
23
|
+
stager = RokuBuilder::Stager.new(**stager_config)
|
24
|
+
assert stager.stage
|
25
|
+
assert stager.unstage
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_stager_stage_git_stash
|
29
|
+
root_dir = File.join(File.dirname(__FILE__), "test_files", "stager_test")
|
30
|
+
branch_name = 'branch'
|
31
|
+
git = Minitest::Mock.new
|
32
|
+
branch = Minitest::Mock.new
|
33
|
+
stashes = Minitest::Mock.new
|
34
|
+
|
35
|
+
stager_config = {
|
36
|
+
method: :git,
|
37
|
+
root_dir: root_dir,
|
38
|
+
key: branch_name,
|
39
|
+
logger: nil
|
40
|
+
}
|
41
|
+
|
42
|
+
git.expect(:current_branch, 'other_branch')
|
43
|
+
git.expect(:current_branch, 'other_branch')
|
44
|
+
git.expect(:branch, branch)
|
45
|
+
branch.expect(:stashes, stashes)
|
46
|
+
stashes.expect(:save, true, ["roku-builder-temp-stash"])
|
47
|
+
git.expect(:checkout, nil, [branch_name])
|
48
|
+
git.expect(:checkout, nil, ['other_branch'])
|
49
|
+
git.expect(:branch, branch)
|
50
|
+
branch.expect(:stashes, stashes)
|
51
|
+
stashes.expect(:apply, nil)
|
52
|
+
|
53
|
+
Git.stub(:open, git) do
|
54
|
+
stager = RokuBuilder::Stager.new(**stager_config)
|
55
|
+
assert stager.stage
|
56
|
+
assert stager.unstage
|
57
|
+
end
|
58
|
+
git.verify
|
59
|
+
branch.verify
|
60
|
+
stashes.verify
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_stager_stage_git_no_stash
|
64
|
+
root_dir = File.join(File.dirname(__FILE__), "test_files", "stager_test")
|
65
|
+
branch_name = 'branch'
|
66
|
+
git = Minitest::Mock.new
|
67
|
+
branch = Minitest::Mock.new
|
68
|
+
stashes = Minitest::Mock.new
|
69
|
+
|
70
|
+
stager_config = {
|
71
|
+
method: :git,
|
72
|
+
root_dir: root_dir,
|
73
|
+
key: branch_name,
|
74
|
+
logger: nil
|
75
|
+
}
|
76
|
+
|
77
|
+
git.expect(:current_branch, 'other_branch')
|
78
|
+
git.expect(:current_branch, 'other_branch')
|
79
|
+
git.expect(:branch, branch)
|
80
|
+
branch.expect(:stashes, stashes)
|
81
|
+
stashes.expect(:save, nil, ["roku-builder-temp-stash"])
|
82
|
+
git.expect(:checkout, nil, [branch_name])
|
83
|
+
git.expect(:checkout, nil, ['other_branch'])
|
84
|
+
|
85
|
+
Git.stub(:open, git) do
|
86
|
+
stager = RokuBuilder::Stager.new(**stager_config)
|
87
|
+
assert stager.stage
|
88
|
+
assert stager.unstage
|
89
|
+
end
|
90
|
+
git.verify
|
91
|
+
branch.verify
|
92
|
+
stashes.verify
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_stager_stage_git_error_stage
|
96
|
+
root_dir = File.join(File.dirname(__FILE__), "test_files", "stager_test")
|
97
|
+
branch_name = 'branch'
|
98
|
+
git = Minitest::Mock.new
|
99
|
+
branch = Minitest::Mock.new
|
100
|
+
stashes = Minitest::Mock.new
|
101
|
+
logger = Minitest::Mock.new
|
102
|
+
|
103
|
+
stager_config = {
|
104
|
+
method: :git,
|
105
|
+
root_dir: root_dir,
|
106
|
+
key: branch_name,
|
107
|
+
logger: logger
|
108
|
+
}
|
109
|
+
|
110
|
+
def git.checkout(branch)
|
111
|
+
raise Git::GitExecuteError.new
|
112
|
+
end
|
113
|
+
|
114
|
+
git.expect(:current_branch, 'other_branch')
|
115
|
+
git.expect(:current_branch, 'other_branch')
|
116
|
+
git.expect(:branch, branch)
|
117
|
+
branch.expect(:stashes, stashes)
|
118
|
+
stashes.expect(:save, true, ["roku-builder-temp-stash"])
|
119
|
+
logger.expect(:error, nil, ["Branch or ref does not exist"])
|
120
|
+
git.expect(:branch, branch)
|
121
|
+
branch.expect(:stashes, stashes)
|
122
|
+
stashes.expect(:apply, nil)
|
123
|
+
|
124
|
+
Git.stub(:open, git) do
|
125
|
+
stager = RokuBuilder::Stager.new(**stager_config)
|
126
|
+
assert !stager.stage
|
127
|
+
assert stager.unstage
|
128
|
+
end
|
129
|
+
git.verify
|
130
|
+
branch.verify
|
131
|
+
stashes.verify
|
132
|
+
logger.verify
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_stager_stage_git_error_unstage
|
136
|
+
root_dir = File.join(File.dirname(__FILE__), "test_files", "stager_test")
|
137
|
+
branch_name = 'branch'
|
138
|
+
git = Minitest::Mock.new
|
139
|
+
branch = Minitest::Mock.new
|
140
|
+
stashes = Minitest::Mock.new
|
141
|
+
logger = Minitest::Mock.new
|
142
|
+
|
143
|
+
stager_config = {
|
144
|
+
method: :git,
|
145
|
+
root_dir: root_dir,
|
146
|
+
key: branch_name,
|
147
|
+
logger: logger
|
148
|
+
}
|
149
|
+
|
150
|
+
def git.checkout(branch)
|
151
|
+
raise Git::GitExecuteError.new
|
152
|
+
end
|
153
|
+
|
154
|
+
logger.expect(:error, nil, ["Branch or ref does not exist"])
|
155
|
+
|
156
|
+
Git.stub(:open, git) do
|
157
|
+
stager = RokuBuilder::Stager.new(**stager_config)
|
158
|
+
stager.instance_variable_set(:@current_branch, "branch")
|
159
|
+
assert !stager.unstage
|
160
|
+
end
|
161
|
+
logger.verify
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_stager_stage_script
|
165
|
+
root_dir = File.join(File.dirname(__FILE__), "test_files", "stager_test")
|
166
|
+
stager_config = {
|
167
|
+
method: :script,
|
168
|
+
key: {stage: "stage_script", unstage: "unstage_script"},
|
169
|
+
root_dir: root_dir,
|
170
|
+
logger: nil
|
171
|
+
}
|
172
|
+
RokuBuilder::Controller.stub(:system, nil) do
|
173
|
+
stager = RokuBuilder::Stager.new(**stager_config)
|
174
|
+
assert stager.stage
|
175
|
+
assert stager.unstage
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roku_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- greeneca
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -253,6 +253,7 @@ files:
|
|
253
253
|
- lib/roku_builder/monitor.rb
|
254
254
|
- lib/roku_builder/navigator.rb
|
255
255
|
- lib/roku_builder/packager.rb
|
256
|
+
- lib/roku_builder/stager.rb
|
256
257
|
- lib/roku_builder/tester.rb
|
257
258
|
- lib/roku_builder/util.rb
|
258
259
|
- lib/roku_builder/version.rb
|
@@ -272,6 +273,7 @@ files:
|
|
272
273
|
- tests/roku_builder/monitor_test.rb
|
273
274
|
- tests/roku_builder/navigator_test.rb
|
274
275
|
- tests/roku_builder/packager_test.rb
|
276
|
+
- tests/roku_builder/stager_test.rb
|
275
277
|
- tests/roku_builder/test_files/controller_config_test/valid_config.json
|
276
278
|
- tests/roku_builder/test_files/controller_test/load_config_test.json
|
277
279
|
- tests/roku_builder/test_files/controller_test/valid_config.json
|
@@ -281,6 +283,11 @@ files:
|
|
281
283
|
- tests/roku_builder/test_files/loader_test/source/c/d
|
282
284
|
- tests/roku_builder/test_files/manifest_manager_test/manifest_template
|
283
285
|
- tests/roku_builder/test_files/manifest_manager_test/manifest_template_2
|
286
|
+
- tests/roku_builder/test_files/manifest_manager_test/updated_title_manifest
|
287
|
+
- tests/roku_builder/test_files/stager_test/a
|
288
|
+
- tests/roku_builder/test_files/stager_test/manifest
|
289
|
+
- tests/roku_builder/test_files/stager_test/source/b
|
290
|
+
- tests/roku_builder/test_files/stager_test/source/c/d
|
284
291
|
- tests/roku_builder/test_helper.rb
|
285
292
|
- tests/roku_builder/tester_test.rb
|
286
293
|
- tests/roku_builder/util_test.rb
|