roku_builder 3.8.5 → 3.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/README.md +0 -1
- data/bin/roku +16 -5
- data/config.json.example +7 -4
- data/lib/roku_builder/config_parser.rb +7 -4
- data/lib/roku_builder/config_validator.rb +23 -1
- data/lib/roku_builder/controller.rb +1 -5
- data/lib/roku_builder/controller_commands.rb +1 -1
- data/lib/roku_builder/error_handler.rb +4 -0
- data/lib/roku_builder/linker.rb +4 -1
- data/lib/roku_builder/loader.rb +18 -5
- data/lib/roku_builder/manifest_manager.rb +21 -1
- data/lib/roku_builder/version.rb +1 -1
- data/roku_builder.gemspec +1 -1
- data/tests/roku_builder/controller_test.rb +11 -16
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f57f3dc9e27633cf6455dd16f475e29c3ad4ac7
|
4
|
+
data.tar.gz: 0d772e6d322cd620e17a6ad861ec6188a77fbaa6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e5f2ac10ed8c2788e5105b117db686cbedb628be12894b9a1867474dbeee934ff739359157ad471d34de1fb05d2c15a47e7460b9cce48daa7db40b74f7e5fe2
|
7
|
+
data.tar.gz: 41774f8096866ae56473ad8d9bbd970ece9403728ac88e680d7558550c85adfdfcc51a458a7b4842bd625b9ec5c05b132bc913c946bdaf8762d702264a715074
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
roku_builder (3.
|
4
|
+
roku_builder (3.9.0)
|
5
5
|
faraday (~> 0.9)
|
6
6
|
faraday-digestauth (~> 0.2)
|
7
7
|
git (~> 1.3)
|
8
|
-
net-ping (~>
|
8
|
+
net-ping (~> 2.0)
|
9
9
|
net-telnet (~> 0.1)
|
10
10
|
nokogiri (~> 1.6)
|
11
11
|
rubyzip (~> 1.2)
|
@@ -67,7 +67,7 @@ GEM
|
|
67
67
|
multipart-post (2.0.0)
|
68
68
|
nenv (0.3.0)
|
69
69
|
net-http-digest_auth (1.4)
|
70
|
-
net-ping (
|
70
|
+
net-ping (2.0.1)
|
71
71
|
net-telnet (0.1.1)
|
72
72
|
nokogiri (1.6.8)
|
73
73
|
mini_portile2 (~> 2.1.0)
|
data/README.md
CHANGED
data/bin/roku
CHANGED
@@ -12,7 +12,12 @@ options = {}
|
|
12
12
|
options[:config] = '~/.roku_config.json'
|
13
13
|
options[:update_manifest] = false
|
14
14
|
|
15
|
-
|
15
|
+
logger = Logger.new(STDOUT)
|
16
|
+
logger.formatter = proc {|severity, datetime, _progname, msg|
|
17
|
+
"[%s #%s] %5s: %s\n\r" % [datetime.strftime("%Y-%m-%d %H:%M:%S.%4N"), $$, severity, msg]
|
18
|
+
}
|
19
|
+
|
20
|
+
parser = OptionParser.new do |opts|
|
16
21
|
opts.banner = "Usage: roku <command> [options]"
|
17
22
|
|
18
23
|
opts.on("-l", "--sideload", "Command: Sideload an app") do
|
@@ -75,11 +80,11 @@ OptionParser.new do |opts|
|
|
75
80
|
options[:profile] = c
|
76
81
|
end
|
77
82
|
|
78
|
-
opts.on("--do-stage", "Command: Run the stager. Used for scripting.
|
83
|
+
opts.on("--do-stage", "Command: Run the stager. Used for scripting. Always run --do-unscript after") do
|
79
84
|
options[:dostage] = true
|
80
85
|
end
|
81
86
|
|
82
|
-
opts.on("--do-unstage", "Command: Run the unstager. Used for scripting.
|
87
|
+
opts.on("--do-unstage", "Command: Run the unstager. Used for scripting. Always run --do-script first") do
|
83
88
|
options[:dounstage] = true
|
84
89
|
end
|
85
90
|
|
@@ -178,6 +183,12 @@ OptionParser.new do |opts|
|
|
178
183
|
puts RokuBuilder::VERSION
|
179
184
|
exit
|
180
185
|
end
|
181
|
-
end
|
186
|
+
end
|
187
|
+
|
188
|
+
begin
|
189
|
+
parser.parse!
|
190
|
+
RokuBuilder::Controller.run(options: options, logger: logger)
|
191
|
+
rescue OptionParser::ParseError => e
|
192
|
+
logger.fatal e.message
|
193
|
+
end
|
182
194
|
|
183
|
-
RokuBuilder::Controller.run(options: options)
|
data/config.json.example
CHANGED
@@ -19,12 +19,15 @@
|
|
19
19
|
"stages":{
|
20
20
|
"production": {
|
21
21
|
"branch": "production",
|
22
|
-
"key":
|
23
|
-
"keyed_pkg": "<path/to/signed/pkg>",
|
24
|
-
"password": "<password for pkg>"
|
25
|
-
}
|
22
|
+
"key": "key1"
|
26
23
|
}
|
27
24
|
}
|
28
25
|
}
|
26
|
+
},
|
27
|
+
"keys": {
|
28
|
+
"key1": {
|
29
|
+
"keyed_pkg": "<path/to/signed/package>",
|
30
|
+
"password": "<password>"
|
31
|
+
}
|
29
32
|
}
|
30
33
|
}
|
@@ -32,7 +32,7 @@ module RokuBuilder
|
|
32
32
|
stage = setup_stage_config(configs: configs, options: options, logger: logger)[1]
|
33
33
|
return [UNKNOWN_STAGE, nil, nil] unless stage
|
34
34
|
setup_sideload_config(configs: configs, options: options)
|
35
|
-
setup_package_config(configs: configs, options: options, stage: stage)
|
35
|
+
setup_package_config(config: config, configs: configs, options: options, stage: stage)
|
36
36
|
setup_simple_configs(configs: configs, options: options, logger: logger)
|
37
37
|
return [SUCCESS, configs]
|
38
38
|
end
|
@@ -135,11 +135,11 @@ module RokuBuilder
|
|
135
135
|
if options[:ref]
|
136
136
|
stage_config[:key] = options[:ref]
|
137
137
|
else
|
138
|
-
return nil unless project_config[:stages][stage]
|
138
|
+
return [nil, nil] unless project_config[:stages][stage]
|
139
139
|
stage_config[:key] = project_config[:stages][stage][:branch]
|
140
140
|
end
|
141
141
|
when :script
|
142
|
-
return nil unless project_config[:stages][stage]
|
142
|
+
return [nil, nil] unless project_config[:stages][stage]
|
143
143
|
stage_config[:key] = project_config[:stages][stage][:script]
|
144
144
|
end
|
145
145
|
configs[:stage_config] = stage_config
|
@@ -182,10 +182,13 @@ module RokuBuilder
|
|
182
182
|
# @param configs [Hash] The parsed configs hash
|
183
183
|
# @param options [Hash] The options hash
|
184
184
|
# @param stage [Symbol] The stage to package
|
185
|
-
def self.setup_package_config(configs:, options:, stage:)
|
185
|
+
def self.setup_package_config(config:, configs:, options:, stage:)
|
186
186
|
if options[:package] or options[:key]
|
187
187
|
# Create Key Config
|
188
188
|
configs[:key] = configs[:project_config][:stages][stage][:key]
|
189
|
+
if configs[:key].class == String
|
190
|
+
configs[:key] = config[:keys][configs[:key].to_sym]
|
191
|
+
end
|
189
192
|
end
|
190
193
|
if options[:package]
|
191
194
|
# Create Package Config
|
@@ -20,7 +20,8 @@ module RokuBuilder
|
|
20
20
|
STAGE_MISSING_BRANCH = 16
|
21
21
|
STAGE_MISSING_SCRIPT = 17
|
22
22
|
PROJECT_STAGE_METHOD_BAD = 18
|
23
|
-
|
23
|
+
KEY_MISSING_PATH = 19
|
24
|
+
KEY_MISSING_PASSWORD = 20
|
24
25
|
|
25
26
|
MISSING_STAGE_METHOD = -1
|
26
27
|
|
@@ -50,6 +51,11 @@ module RokuBuilder
|
|
50
51
|
end
|
51
52
|
}
|
52
53
|
end
|
54
|
+
if config[:keys]
|
55
|
+
config[:keys].each {|key,key_config|
|
56
|
+
validate_key(codes: codes, key: key_config)
|
57
|
+
}
|
58
|
+
end
|
53
59
|
codes.uniq!
|
54
60
|
codes.push(0) if codes.empty?
|
55
61
|
codes
|
@@ -79,6 +85,8 @@ module RokuBuilder
|
|
79
85
|
"A project stage is missing its branch.",
|
80
86
|
"A project stage is missing its script.",
|
81
87
|
"A project as an invalid stage method.",
|
88
|
+
"A key is missing its keyed package path.",
|
89
|
+
"A key is missing its password.", #20
|
82
90
|
#===============WARNINGS===============#
|
83
91
|
"A project is missing its stage method."
|
84
92
|
]
|
@@ -150,6 +158,20 @@ module RokuBuilder
|
|
150
158
|
end
|
151
159
|
private_class_method :validate_stage
|
152
160
|
|
161
|
+
# Validates a roku config project
|
162
|
+
# @param codes [Array] array of error codes
|
163
|
+
# @param project [Hash] project config object
|
164
|
+
def self.validate_key(codes:, key:)
|
165
|
+
errors= [
|
166
|
+
[KEY_MISSING_PATH, (!key[:keyed_pkg])],
|
167
|
+
[KEY_MISSING_PATH, (key[:keyed_pkg] == "<path/to/signed/package>")],
|
168
|
+
[KEY_MISSING_PASSWORD, (!key[:password])],
|
169
|
+
[KEY_MISSING_PASSWORD, (key[:password] == "<password>")],
|
170
|
+
]
|
171
|
+
process_errors(codes: codes, errors: errors)
|
172
|
+
end
|
173
|
+
private_class_method :validate_key
|
174
|
+
|
153
175
|
def self.process_errors(codes:, errors:)
|
154
176
|
errors.each do |error|
|
155
177
|
codes.push(error[0]) if error[1]
|
@@ -7,11 +7,7 @@ module RokuBuilder
|
|
7
7
|
|
8
8
|
# Run the builder
|
9
9
|
# @param options [Hash] The options hash
|
10
|
-
def self.run(options:)
|
11
|
-
logger = Logger.new(STDOUT)
|
12
|
-
logger.formatter = proc {|severity, datetime, _progname, msg|
|
13
|
-
"[%s #%s] %5s: %s\n\r" % [datetime.strftime("%Y-%m-%d %H:%M:%S.%4N"), $$, severity, msg]
|
14
|
-
}
|
10
|
+
def self.run(options:, logger:)
|
15
11
|
if options[:debug]
|
16
12
|
logger.level = Logger::DEBUG
|
17
13
|
elsif options[:verbose]
|
data/lib/roku_builder/linker.rb
CHANGED
@@ -17,7 +17,10 @@ module RokuBuilder
|
|
17
17
|
unless payload.keys.count > 0
|
18
18
|
@logger.warn "No options sent to launched app"
|
19
19
|
else
|
20
|
-
|
20
|
+
payload = parameterize(payload)
|
21
|
+
path = "#{path}?#{payload}"
|
22
|
+
@logger.info "Deeplink:"
|
23
|
+
@logger.info payload
|
21
24
|
end
|
22
25
|
|
23
26
|
conn = multipart_connection(port: 8060)
|
data/lib/roku_builder/loader.rb
CHANGED
@@ -21,15 +21,19 @@ module RokuBuilder
|
|
21
21
|
build_version = nil
|
22
22
|
if infile
|
23
23
|
build_version = ManifestManager.build_version(root_dir: infile)
|
24
|
+
return [MISSING_MANIFEST, nil] if outfile == MISSING_MANIFEST
|
24
25
|
outfile = infile
|
25
26
|
else
|
26
27
|
# Update manifest
|
27
28
|
if update_manifest
|
28
29
|
build_version = ManifestManager.update_build(root_dir: @root_dir)
|
30
|
+
return [MISSING_MANIFEST, nil] if outfile == MISSING_MANIFEST
|
29
31
|
else
|
30
32
|
build_version = ManifestManager.build_version(root_dir: @root_dir)
|
33
|
+
return [MISSING_MANIFEST, nil] if outfile == MISSING_MANIFEST
|
31
34
|
end
|
32
35
|
outfile = build(build_version: build_version, content: content)
|
36
|
+
return [MISSING_MANIFEST, nil] if outfile == MISSING_MANIFEST
|
33
37
|
end
|
34
38
|
path = "/plugin_install"
|
35
39
|
# Connect to roku and upload file
|
@@ -55,6 +59,7 @@ module RokuBuilder
|
|
55
59
|
# @return [String] Path of the build
|
56
60
|
def build(build_version: nil, outfile: nil, content: nil)
|
57
61
|
build_version = ManifestManager.build_version(root_dir: @root_dir) unless build_version
|
62
|
+
return MISSING_MANIFEST if build_version == MISSING_MANIFEST
|
58
63
|
content ||= {}
|
59
64
|
unless content and content[:folders]
|
60
65
|
content[:folders] = Dir.entries(@root_dir).select {|entry| File.directory? File.join(@root_dir, entry) and !(entry =='.' || entry == '..') }
|
@@ -69,10 +74,14 @@ module RokuBuilder
|
|
69
74
|
# Add folders to zip
|
70
75
|
content[:folders].each do |folder|
|
71
76
|
base_folder = File.join(@root_dir, folder)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
77
|
+
if File.exist?(base_folder)
|
78
|
+
entries = Dir.entries(base_folder)
|
79
|
+
entries.delete(".")
|
80
|
+
entries.delete("..")
|
81
|
+
writeEntries(@root_dir, entries, folder, content[:excludes], io)
|
82
|
+
else
|
83
|
+
@logger.warn "Missing Folder: #{base_folder}"
|
84
|
+
end
|
76
85
|
end
|
77
86
|
# Add file to zip
|
78
87
|
writeEntries(@root_dir, content[:files], "", content[:excludes], io)
|
@@ -114,7 +123,11 @@ module RokuBuilder
|
|
114
123
|
writeEntries(root_dir, subdir, zipFilePath, excludes, io)
|
115
124
|
else
|
116
125
|
unless excludes.include?(zipFilePath)
|
117
|
-
|
126
|
+
if File.exist?(diskFilePath)
|
127
|
+
io.get_output_stream(zipFilePath) { |f| f.puts(File.open(diskFilePath, "rb").read()) }
|
128
|
+
else
|
129
|
+
@logger.warn "Missing File: #{diskFilePath}"
|
130
|
+
end
|
118
131
|
end
|
119
132
|
end
|
120
133
|
}
|
@@ -9,7 +9,7 @@ module RokuBuilder
|
|
9
9
|
# @param root_dir [String] Path to the root directory for the app
|
10
10
|
# @return [String] Build version on success, empty string otherwise
|
11
11
|
def self.update_build(root_dir:)
|
12
|
-
|
12
|
+
return MISSING_MANIFEST unless self.check_manifest(root_dir: root_dir)
|
13
13
|
build_version = self.build_version(root_dir: root_dir).split(".")
|
14
14
|
if 2 == build_version.length
|
15
15
|
iteration = build_version[1].to_i + 1
|
@@ -24,14 +24,17 @@ module RokuBuilder
|
|
24
24
|
self.build_version(root_dir: root_dir)
|
25
25
|
end
|
26
26
|
|
27
|
+
|
27
28
|
# Retrive the build version from the manifest file
|
28
29
|
# @param root_dir [String] Path to the root directory for the app
|
29
30
|
# @return [String] Build version on success, empty string otherwise
|
30
31
|
def self.build_version(root_dir:)
|
32
|
+
return MISSING_MANIFEST unless self.check_manifest(root_dir: root_dir)
|
31
33
|
read_manifest(root_dir: root_dir)[:build_version]
|
32
34
|
end
|
33
35
|
|
34
36
|
def self.read_manifest(root_dir:)
|
37
|
+
return MISSING_MANIFEST unless self.check_manifest(root_dir: root_dir)
|
35
38
|
attrs = {}
|
36
39
|
get_attrs = lambda { |file|
|
37
40
|
file.each_line do |line|
|
@@ -90,6 +93,23 @@ module RokuBuilder
|
|
90
93
|
end
|
91
94
|
end
|
92
95
|
|
96
|
+
# Check to make sure that the manifest file exists
|
97
|
+
# @param root_dir [String] Path to the root directory for the app
|
98
|
+
# @return [Boolean] True if manifest exists, false otherwise
|
99
|
+
def self.check_manifest(root_dir:)
|
100
|
+
return false unless File.exist?(root_dir)
|
101
|
+
if File.directory?(root_dir)
|
102
|
+
path = File.join(root_dir, 'manifest')
|
103
|
+
return false unless File.exist?(path)
|
104
|
+
elsif File.extname(root_dir) == ".zip"
|
105
|
+
Zip::File.open(root_dir) do |zip_file|
|
106
|
+
entry = zip_file.glob("manifest").first
|
107
|
+
return false unless entry
|
108
|
+
end
|
109
|
+
end
|
110
|
+
true
|
111
|
+
end
|
112
|
+
|
93
113
|
# Returns the default manafest values
|
94
114
|
# @return [Hash] default manifest values
|
95
115
|
def self.default_params
|
data/lib/roku_builder/version.rb
CHANGED
data/roku_builder.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency "faraday", "~> 0.9"
|
25
25
|
spec.add_dependency "faraday-digestauth", "~> 0.2"
|
26
26
|
spec.add_dependency "git", "~> 1.3"
|
27
|
-
spec.add_dependency "net-ping", "~>
|
27
|
+
spec.add_dependency "net-ping", "~> 2.0"
|
28
28
|
spec.add_dependency "net-telnet", "~> 0.1"
|
29
29
|
spec.add_dependency "nokogiri", "~> 1.6"
|
30
30
|
|
@@ -142,23 +142,18 @@ class ControllerTest < Minitest::Test
|
|
142
142
|
]
|
143
143
|
tests.each do |test|
|
144
144
|
logger = Minitest::Mock.new
|
145
|
-
logger.expect(:formatter=, nil) do |proc_object|
|
146
|
-
proc_object.class == Proc and proc_object.arity == 4
|
147
|
-
end
|
148
145
|
logger.expect(:level=, nil, [test[:level]])
|
149
|
-
|
150
|
-
RokuBuilder::
|
151
|
-
RokuBuilder::
|
152
|
-
RokuBuilder::
|
153
|
-
RokuBuilder::
|
154
|
-
RokuBuilder::
|
155
|
-
RokuBuilder::
|
156
|
-
RokuBuilder::
|
157
|
-
RokuBuilder::
|
158
|
-
RokuBuilder::
|
159
|
-
RokuBuilder::
|
160
|
-
RokuBuilder::Controller.run(options: test[:options])
|
161
|
-
end
|
146
|
+
RokuBuilder::Controller.stub(:validate_options, nil) do
|
147
|
+
RokuBuilder::ErrorHandler.stub(:handle_options_codes, nil) do
|
148
|
+
RokuBuilder::Controller.stub(:configure, nil) do
|
149
|
+
RokuBuilder::ErrorHandler.stub(:handle_configure_codes, nil) do
|
150
|
+
RokuBuilder::ConfigManager.stub(:load_config, nil) do
|
151
|
+
RokuBuilder::ErrorHandler.stub(:handle_load_codes, nil) do
|
152
|
+
RokuBuilder::Controller.stub(:check_devices, nil) do
|
153
|
+
RokuBuilder::ErrorHandler.stub(:handle_device_codes, nil) do
|
154
|
+
RokuBuilder::Controller.stub(:execute_commands, nil) do
|
155
|
+
RokuBuilder::ErrorHandler.stub(:handle_command_codes, nil) do
|
156
|
+
RokuBuilder::Controller.run(options: test[:options], logger: logger)
|
162
157
|
end
|
163
158
|
end
|
164
159
|
end
|
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.9.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-08
|
11
|
+
date: 2016-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '2.0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '2.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: net-telnet
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|