roku_builder 4.7.2 → 4.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +8 -0
- data/Gemfile.lock +4 -2
- data/lib/roku_builder/hash.rb +3 -0
- data/lib/roku_builder/manifest.rb +4 -0
- data/lib/roku_builder/plugins/analyzer.rb +102 -0
- data/lib/roku_builder/plugins/inspector_config.json +358 -0
- data/lib/roku_builder/plugins/line_inspector.rb +50 -0
- data/lib/roku_builder/plugins/loader.rb +17 -0
- data/lib/roku_builder/plugins/manifest_attributes.json +229 -0
- data/lib/roku_builder/plugins/manifest_inspector.rb +142 -0
- data/lib/roku_builder/plugins/raf_inspector.rb +74 -0
- data/lib/roku_builder/version.rb +1 -1
- data/lib/roku_builder.rb +2 -0
- data/roku_builder.gemspec +1 -0
- data/test/roku_builder/plugins/test_analyzer.rb +344 -0
- data/test/roku_builder/plugins/test_loader.rb +9 -0
- data/test/roku_builder/test_config_parser.rb +1 -1
- data/test/roku_builder/test_files/analyzer_test/analyzer_config.json +1 -0
- data/test/roku_builder/test_files/analyzer_test/images/focus.png +0 -0
- data/test/roku_builder/test_files/analyzer_test/images/focus_hd.png +0 -0
- data/test/roku_builder/test_files/analyzer_test/images/focus_sd.png +0 -0
- data/test/roku_builder/test_files/analyzer_test/images/splash.png +0 -0
- data/test/roku_builder/test_files/analyzer_test/images/splash_hd.png +0 -0
- data/test/roku_builder/test_files/analyzer_test/images/splash_sd.png +0 -0
- data/test/roku_builder/test_files/analyzer_test/images/too_small.png +0 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_depricated_attribute +9 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_duplicate_attribute +9 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_empty_value +9 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_has_value +9 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_incorrect_image_resolution +8 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_equals +9 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_float +9 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_integer +8 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_negative +8 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_not_equal +8 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_starts_with +8 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_missing_attribute +7 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_missing_file +8 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_raf +9 -0
- data/test/roku_builder/test_files/analyzer_test/manifest_template +8 -0
- data/test/roku_builder/test_files/analyzer_test/test.pkg +0 -0
- data/test/roku_builder/test_helper.rb +2 -2
- metadata +72 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38d4cd944ab2ba9a7b286c37cda4328f9dbe7038
|
4
|
+
data.tar.gz: 0e48951e36d4ab8469c92fa74c5b3e24c922c8a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b61247bd31d9aa8da330157c74d5b982a82785c88b7f49d8cdc8f18e4b7b54e7ec1bc627274b4b917f1c93071c9807fde71cf6eb8ab2478b7a4b130ea9e5a2b7
|
7
|
+
data.tar.gz: 9dcdba8b1687c8a4b4ee5a694c172dc80967a5cc9058ca8870b61ccda0bdc12cb07f4968927c06160b165b732d8d3e327bf4e9586efe3cbc15e532a8f6a1164b
|
data/CHANGELOG
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
roku_builder (4.
|
4
|
+
roku_builder (4.8.0)
|
5
5
|
faraday (~> 0.13)
|
6
6
|
faraday-digestauth (~> 0.2)
|
7
7
|
git (~> 1.3)
|
8
|
+
image_size (~> 2.0)
|
8
9
|
net-ping (~> 2.0)
|
9
10
|
net-telnet (~> 0.1)
|
10
11
|
oga (~> 2.11)
|
@@ -29,7 +30,7 @@ GEM
|
|
29
30
|
crack (0.4.3)
|
30
31
|
safe_yaml (~> 1.0.0)
|
31
32
|
docile (1.3.1)
|
32
|
-
faraday (0.15.
|
33
|
+
faraday (0.15.3)
|
33
34
|
multipart-post (>= 1.2, < 3)
|
34
35
|
faraday-digestauth (0.3.0)
|
35
36
|
faraday (~> 0.7)
|
@@ -53,6 +54,7 @@ GEM
|
|
53
54
|
guard-compat (~> 1.2)
|
54
55
|
minitest (>= 3.0)
|
55
56
|
hashdiff (0.3.7)
|
57
|
+
image_size (2.0.0)
|
56
58
|
json (2.1.0)
|
57
59
|
listen (3.1.5)
|
58
60
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
data/lib/roku_builder/hash.rb
CHANGED
@@ -0,0 +1,102 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
module RokuBuilder
|
4
|
+
|
5
|
+
# Collects information on a package for submission
|
6
|
+
class Analyzer < Util
|
7
|
+
extend Plugin
|
8
|
+
|
9
|
+
def self.commands
|
10
|
+
{
|
11
|
+
analyze: {source: true, stage: true},
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.parse_options(parser:, options:)
|
16
|
+
parser.separator "Commands:"
|
17
|
+
parser.on("--analyze", "Run a static analysis on a given stage") do
|
18
|
+
options[:analyze] = true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.dependencies
|
23
|
+
[Loader]
|
24
|
+
end
|
25
|
+
|
26
|
+
def analyze(options:, quiet: false)
|
27
|
+
@options = options
|
28
|
+
@warnings = []
|
29
|
+
analyzer_config = get_analyzer_config
|
30
|
+
@inspector_config = analyzer_config[:inspectors]
|
31
|
+
loader = Loader.new(config: @config)
|
32
|
+
Dir.mktmpdir do |dir|
|
33
|
+
loader.copy(options: options, path: dir)
|
34
|
+
raf_inspector = RafInspector.new(config: @config, dir: dir)
|
35
|
+
manifest_inspector = ManifestInspector.new(config: @config, dir: dir, raf: raf_inspector)
|
36
|
+
@warnings.concat(manifest_inspector.run(analyzer_config[:inspectors]))
|
37
|
+
has_source_dir = false
|
38
|
+
Dir.glob(File.join(dir, "**", "*")).each do |file_path|
|
39
|
+
if File.file?(file_path) and file_path.end_with?(".brs", ".xml")
|
40
|
+
line_inspector = LineInspector.new(config: @config, raf: raf_inspector, inspector_config: analyzer_config[:lineInspectors])
|
41
|
+
@warnings.concat(line_inspector.run(file_path))
|
42
|
+
end
|
43
|
+
if file_path.end_with?("__MACOSX")
|
44
|
+
add_warning(warning: :packageMacosxDirectory, path: file_path)
|
45
|
+
end
|
46
|
+
if file_path.end_with?(".zip", ".md", ".pkg")
|
47
|
+
add_warning(warning: :packageExtraneousFiles, path: file_path)
|
48
|
+
end
|
49
|
+
has_source_dir = true if file_path.end_with?("source")
|
50
|
+
end
|
51
|
+
unless has_source_dir
|
52
|
+
add_warning(warning: :packageSourceDirectory, path: "source")
|
53
|
+
end
|
54
|
+
@warnings.concat(raf_inspector.run(analyzer_config[:inspectors]))
|
55
|
+
print_warnings(dir) unless quiet
|
56
|
+
end
|
57
|
+
@warnings
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def get_analyzer_config
|
63
|
+
#url = "http://devtools.web.roku.com/static-code-analyzer/config.json"
|
64
|
+
#url = @options[:analyze_config] if @options[:analyze_config]
|
65
|
+
#JSON.parse(Faraday.get(url).body, {symbolize_names: true})
|
66
|
+
file = File.join(File.dirname(__FILE__), "inspector_config.json")
|
67
|
+
JSON.parse(File.open(file).read, {symbolize_names: true})
|
68
|
+
end
|
69
|
+
|
70
|
+
def add_warning(warning:, path:)
|
71
|
+
@warnings.push(@inspector_config[warning].deep_dup)
|
72
|
+
@warnings.last[:path] = path
|
73
|
+
end
|
74
|
+
|
75
|
+
def print_warnings(dir)
|
76
|
+
logger = ::Logger.new(STDOUT)
|
77
|
+
logger.level = @logger.level
|
78
|
+
logger.formatter = proc {|severity, _datetime, _progname, msg|
|
79
|
+
"%5s: %s\n\r" % [severity, msg]
|
80
|
+
}
|
81
|
+
@warnings.each do |warning|
|
82
|
+
message = warning[:message]
|
83
|
+
if warning[:path]
|
84
|
+
warning[:path].slice!(dir) if dir
|
85
|
+
warning[:path].slice!(/^\//)
|
86
|
+
message += ". pkg:/"+warning[:path]
|
87
|
+
message += ":"+warning[:line].to_s if warning[:line]
|
88
|
+
end
|
89
|
+
case(warning[:severity])
|
90
|
+
when "error"
|
91
|
+
logger.error(message)
|
92
|
+
when "warning"
|
93
|
+
logger.warn(message)
|
94
|
+
when "info"
|
95
|
+
logger.info(message)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
RokuBuilder.register_plugin(Analyzer)
|
101
|
+
end
|
102
|
+
|
@@ -0,0 +1,358 @@
|
|
1
|
+
{
|
2
|
+
"lineInspectors": [
|
3
|
+
{
|
4
|
+
"regex": "\"roCaptionRenderer\"",
|
5
|
+
"severity": "warning",
|
6
|
+
"message": "Found deprecated \"roCaptionRenderer\"",
|
7
|
+
"category": "deprecatedComponents"
|
8
|
+
},
|
9
|
+
{
|
10
|
+
"regex": "\"roCodeRegistrationScreen\"",
|
11
|
+
"severity": "warning",
|
12
|
+
"message": "Found deprecated \"roCodeRegistrationScreen\"",
|
13
|
+
"category": "deprecatedComponents"
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"regex": "\"roGridScreen\"",
|
17
|
+
"severity": "warning",
|
18
|
+
"message": "Found deprecated \"roGridScreen\"",
|
19
|
+
"category": "deprecatedComponents"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"regex": "\"roKeyboardScreen\"",
|
23
|
+
"severity": "warning",
|
24
|
+
"message": "Found deprecated \"roKeyboardScreen\"",
|
25
|
+
"category": "deprecatedComponents"
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"regex": "\"roListScreen\"",
|
29
|
+
"severity": "warning",
|
30
|
+
"message": "Found deprecated \"roListScreen\"",
|
31
|
+
"category": "deprecatedComponents"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"regex": "\"roMessageDialog\"",
|
35
|
+
"severity": "warning",
|
36
|
+
"message": "Found deprecated \"roMessageDialog\"",
|
37
|
+
"category": "deprecatedComponents"
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"regex": "\"roOneLineDialog\"",
|
41
|
+
"severity": "warning",
|
42
|
+
"message": "Found deprecated \"roOneLineDialog\"",
|
43
|
+
"category": "deprecatedComponents"
|
44
|
+
},
|
45
|
+
{
|
46
|
+
"regex": "\"roParagraphScreen\"",
|
47
|
+
"severity": "warning",
|
48
|
+
"message": "Found deprecated \"roParagraphScreen\"",
|
49
|
+
"category": "deprecatedComponents"
|
50
|
+
},
|
51
|
+
{
|
52
|
+
"regex": "\"roPinEntryDialog\"",
|
53
|
+
"severity": "warning",
|
54
|
+
"message": "Found deprecated \"roPinEntryDialog\"",
|
55
|
+
"category": "deprecatedComponents"
|
56
|
+
},
|
57
|
+
{
|
58
|
+
"regex": "\"roPosterScreen\"",
|
59
|
+
"severity": "warning",
|
60
|
+
"message": "Found deprecated \"roPosterScreen\"",
|
61
|
+
"category": "deprecatedComponents"
|
62
|
+
},
|
63
|
+
{
|
64
|
+
"regex": "\"roSearchHistory\"",
|
65
|
+
"severity": "warning",
|
66
|
+
"message": "Found deprecated \"roSearchHistory\"",
|
67
|
+
"category": "deprecatedComponents"
|
68
|
+
},
|
69
|
+
{
|
70
|
+
"regex": "\"roSearchScreen\"",
|
71
|
+
"severity": "warning",
|
72
|
+
"message": "Found deprecated \"roSearchScreen\"",
|
73
|
+
"category": "deprecatedComponents"
|
74
|
+
},
|
75
|
+
{
|
76
|
+
"regex": "\"roSGGridScreen\"",
|
77
|
+
"severity": "warning",
|
78
|
+
"message": "Found deprecated \"roSGGridScreen\"",
|
79
|
+
"category": "deprecatedComponents"
|
80
|
+
},
|
81
|
+
{
|
82
|
+
"regex": "\"roSlideShow\"",
|
83
|
+
"severity": "warning",
|
84
|
+
"message": "Found deprecated \"roSlideShow\"",
|
85
|
+
"category": "deprecatedComponents"
|
86
|
+
},
|
87
|
+
{
|
88
|
+
"regex": "\"roSpringboardScreen\"",
|
89
|
+
"severity": "warning",
|
90
|
+
"message": "Found deprecated \"roSpringboardScreen\"",
|
91
|
+
"category": "deprecatedComponents"
|
92
|
+
},
|
93
|
+
{
|
94
|
+
"regex": "\"roTextScreen\"",
|
95
|
+
"severity": "warning",
|
96
|
+
"message": "Found deprecated \"roTextScreen\"",
|
97
|
+
"category": "deprecatedComponents"
|
98
|
+
},
|
99
|
+
// Comment roVideoPlayer, roVideoPlayerEvent and roVideoScreenEvent per https://jira.portal.roku.com:8443/browse/RDE-1488.
|
100
|
+
// Might be uncommented later.
|
101
|
+
// {
|
102
|
+
// "regex": "\"roVideoPlayer\"",
|
103
|
+
// "severity": "warning",
|
104
|
+
// "message": "Found deprecated \"roVideoPlayer\"",
|
105
|
+
// "category": "deprecatedComponents"
|
106
|
+
// },
|
107
|
+
{
|
108
|
+
"regex": "\"roVideoScreen\"",
|
109
|
+
"severity": "warning",
|
110
|
+
"message": "Found deprecated \"roVideoScreen\"",
|
111
|
+
"category": "deprecatedComponents"
|
112
|
+
},
|
113
|
+
{
|
114
|
+
"regex": "\"roImageCanvas\"",
|
115
|
+
"severity": "warning",
|
116
|
+
"message": "Found deprecated \"roImageCanvas\"",
|
117
|
+
"category": "deprecatedComponents"
|
118
|
+
},
|
119
|
+
{
|
120
|
+
"regex": "\"roCaptionRendererEvent\"",
|
121
|
+
"severity": "warning",
|
122
|
+
"message": "Found deprecated \"roCaptionRendererEvent\"",
|
123
|
+
"category": "deprecatedComponents"
|
124
|
+
},
|
125
|
+
{
|
126
|
+
"regex": "\"roCodeRegistrationScreenEvent\"",
|
127
|
+
"severity": "warning",
|
128
|
+
"message": "Found deprecated \"roCodeRegistrationScreenEvent\"",
|
129
|
+
"category": "deprecatedComponents"
|
130
|
+
},
|
131
|
+
{
|
132
|
+
"regex": "\"roGridScreenEvent\"",
|
133
|
+
"severity": "warning",
|
134
|
+
"message": "Found deprecated \"roGridScreenEvent\"",
|
135
|
+
"category": "deprecatedComponents"
|
136
|
+
},
|
137
|
+
{
|
138
|
+
"regex": "\"roKeyboardScreenEvent\"",
|
139
|
+
"severity": "warning",
|
140
|
+
"message": "Found deprecated \"roKeyboardScreenEvent\"",
|
141
|
+
"category": "deprecatedComponents"
|
142
|
+
},
|
143
|
+
{
|
144
|
+
"regex": "\"roListScreenEvent\"",
|
145
|
+
"severity": "warning",
|
146
|
+
"message": "Found deprecated \"roListScreenEvent\"",
|
147
|
+
"category": "deprecatedComponents"
|
148
|
+
},
|
149
|
+
{
|
150
|
+
"regex": "\"roMessageDialogEvent\"",
|
151
|
+
"severity": "warning",
|
152
|
+
"message": "Found deprecated \"roMessageDialogEvent\"",
|
153
|
+
"category": "deprecatedComponents"
|
154
|
+
},
|
155
|
+
{
|
156
|
+
"regex": "\"roOneLineDialogEvent\"",
|
157
|
+
"severity": "warning",
|
158
|
+
"message": "Found deprecated \"roOneLineDialogEvent\"",
|
159
|
+
"category": "deprecatedComponents"
|
160
|
+
},
|
161
|
+
{
|
162
|
+
"regex": "\"roParagraphScreenEvent\"",
|
163
|
+
"severity": "warning",
|
164
|
+
"message": "Found deprecated \"roParagraphScreenEvent\"",
|
165
|
+
"category": "deprecatedComponents"
|
166
|
+
},
|
167
|
+
{
|
168
|
+
"regex": "\"roPinEntryDialogEvent\"",
|
169
|
+
"severity": "warning",
|
170
|
+
"message": "Found deprecated \"roPinEntryDialogEvent\"",
|
171
|
+
"category": "deprecatedComponents"
|
172
|
+
},
|
173
|
+
{
|
174
|
+
"regex": "\"roPosterScreenEvent\"",
|
175
|
+
"severity": "warning",
|
176
|
+
"message": "Found deprecated \"roPosterScreenEvent\"",
|
177
|
+
"category": "deprecatedComponents"
|
178
|
+
},
|
179
|
+
{
|
180
|
+
"regex": "\"roSearchScreenEvent\"",
|
181
|
+
"severity": "warning",
|
182
|
+
"message": "Found deprecated \"roSearchScreenEvent\"",
|
183
|
+
"category": "deprecatedComponents"
|
184
|
+
},
|
185
|
+
{
|
186
|
+
"regex": "\"roSGGridScreenEvent\"",
|
187
|
+
"severity": "warning",
|
188
|
+
"message": "Found deprecated \"roSGGridScreenEvent\"",
|
189
|
+
"category": "deprecatedComponents"
|
190
|
+
},
|
191
|
+
{
|
192
|
+
"regex": "\"roSlideShowEvent\"",
|
193
|
+
"severity": "warning",
|
194
|
+
"message": "Found deprecated \"roSlideShowEvent\"",
|
195
|
+
"category": "deprecatedComponents"
|
196
|
+
},
|
197
|
+
{
|
198
|
+
"regex": "\"roSpringboardScreenEvent\"",
|
199
|
+
"severity": "warning",
|
200
|
+
"message": "Found deprecated \"roSpringboardScreenEvent\"",
|
201
|
+
"category": "deprecatedComponents"
|
202
|
+
},
|
203
|
+
{
|
204
|
+
"regex": "\"roTextScreenEvent\"",
|
205
|
+
"severity": "warning",
|
206
|
+
"message": "Found deprecated \"roTextScreenEvent\"",
|
207
|
+
"category": "deprecatedComponents"
|
208
|
+
},
|
209
|
+
// {
|
210
|
+
// "regex": "\"roVideoPlayerEvent\"",
|
211
|
+
// "severity": "warning",
|
212
|
+
// "message": "Found deprecated \"roVideoPlayerEvent\"",
|
213
|
+
// "category": "deprecatedComponents"
|
214
|
+
// },
|
215
|
+
// {
|
216
|
+
// "regex": "\"roVideoScreenEvent\"",
|
217
|
+
// "severity": "warning",
|
218
|
+
// "message": "Found deprecated \"roVideoScreenEvent\"",
|
219
|
+
// "category": "deprecatedComponents"
|
220
|
+
// },
|
221
|
+
{
|
222
|
+
"regex": "\"roImageCanvasEvent\"",
|
223
|
+
"severity": "warning",
|
224
|
+
"message": "Found deprecated \"roImageCanvasEvent\"",
|
225
|
+
"category": "deprecatedComponents"
|
226
|
+
},
|
227
|
+
{
|
228
|
+
"regexMatch": "^.*:\\s*stop\\b.*$|^(.*[^.\\s])?\\s*\\bstop\\b\\s*([^:\\s].*)?$",
|
229
|
+
"regex": "([^.{,\"\\s]|^)\\s*\\bstop\\b",
|
230
|
+
"severity": "error",
|
231
|
+
"message": "STOP command is present"
|
232
|
+
},
|
233
|
+
{
|
234
|
+
"regex": "(\"ChannelStore\"|\"roChannelStore\")",
|
235
|
+
"severity": "info",
|
236
|
+
"message": "Usage of ChannelStore is spotted. Roku billing might be integrated."
|
237
|
+
},
|
238
|
+
{
|
239
|
+
"regex": "\"roSGScreen\"",
|
240
|
+
"severity": "info",
|
241
|
+
"message": "This is an RSG channel"
|
242
|
+
},
|
243
|
+
{
|
244
|
+
"regex": "\"TimeGrid\"",
|
245
|
+
"severity": "warning",
|
246
|
+
"message": "TimeGrid component is found"
|
247
|
+
},
|
248
|
+
{
|
249
|
+
"regex": "\"roTuner\"",
|
250
|
+
"severity": "warning",
|
251
|
+
"message": "roTuner component is found"
|
252
|
+
},
|
253
|
+
{
|
254
|
+
"regex": "\"roProgramGuide\"",
|
255
|
+
"severity": "warning",
|
256
|
+
"message": "roProgramGuide component is found"
|
257
|
+
}
|
258
|
+
],
|
259
|
+
"inspectors": {
|
260
|
+
"manifestDuplicateAttribute": {
|
261
|
+
"severity": "warning",
|
262
|
+
"message": "Found duplicate attribute in manifest: \"{0}\"",
|
263
|
+
"category": "manifest"
|
264
|
+
},
|
265
|
+
"manifestDeprecatedAttribute": {
|
266
|
+
"severity": "warning",
|
267
|
+
"message": "Found deprecated attribute in manifest: \"{0}\"",
|
268
|
+
"category": "manifest"
|
269
|
+
},
|
270
|
+
"manifestEmptyValue": {
|
271
|
+
"severity": "error",
|
272
|
+
"message": "\"{0}\" attribute in manifest has an empty value",
|
273
|
+
"category": "manifest"
|
274
|
+
},
|
275
|
+
"manifestInvalidValue": {
|
276
|
+
"severity": "error",
|
277
|
+
"message": "\"{0}\" attribute in manifest has invalid value: \"{1}\"",
|
278
|
+
"category": "manifest"
|
279
|
+
},
|
280
|
+
"manifestHasValue": {
|
281
|
+
"severity": "warning",
|
282
|
+
"message": "\"{0}\" attribute in manifest has value \"{1}\"",
|
283
|
+
"category": "manifest"
|
284
|
+
},
|
285
|
+
"manifestMissingFile": {
|
286
|
+
"severity": "error",
|
287
|
+
"message": "\"{0}\" file used for \"{1}\" attribute is missing",
|
288
|
+
"category": "manifest"
|
289
|
+
},
|
290
|
+
"manifestMissingAttribute": {
|
291
|
+
"severity": "error",
|
292
|
+
"message": "Manifest is missing a required attribute: \"{0}\"",
|
293
|
+
"category": "manifest"
|
294
|
+
},
|
295
|
+
"manifestIncorrectImageResolution": {
|
296
|
+
"severity": "error",
|
297
|
+
"message": "\"{0}\" image used for \"{1}\" attribute has incorrect size \"{2}\". Correct size is \"{3}\"",
|
298
|
+
"category": "manifest"
|
299
|
+
},
|
300
|
+
"rafConstructorPresentImportMissing": {
|
301
|
+
"severity": "error",
|
302
|
+
"message": "RAF constructor call is present but library import is missing",
|
303
|
+
"category": "raf"
|
304
|
+
},
|
305
|
+
"rafConstructorPresentManifestMissing": {
|
306
|
+
"severity": "error",
|
307
|
+
"message": "RAF constructor call is present but manifest entry is missing",
|
308
|
+
"category": "raf"
|
309
|
+
},
|
310
|
+
"rafConstructorMissingManifestPresent": {
|
311
|
+
"severity": "warning",
|
312
|
+
"message": "RAF constructor call is not present but manifest entry is present",
|
313
|
+
"category": "raf"
|
314
|
+
},
|
315
|
+
"rafManifestPresentImportMissing": {
|
316
|
+
"severity": "warning",
|
317
|
+
"message": "RAF manifest entry is present but library import is missing",
|
318
|
+
"category": "raf"
|
319
|
+
},
|
320
|
+
"rafConstructorMissingImportPresent": {
|
321
|
+
"severity": "warning",
|
322
|
+
"message": "RAF constructor call is not present but library import is present",
|
323
|
+
"category": "raf"
|
324
|
+
},
|
325
|
+
"rafProperIntegration": {
|
326
|
+
"severity": "info",
|
327
|
+
"message": "RAF is integrated properly",
|
328
|
+
"category": "raf"
|
329
|
+
},
|
330
|
+
"packageMacosxDirectory": {
|
331
|
+
"severity": "error",
|
332
|
+
"message": "Package includes __MACOSX directory",
|
333
|
+
"category": "package"
|
334
|
+
},
|
335
|
+
"packageExtraneousFiles": {
|
336
|
+
"severity": "error",
|
337
|
+
"message": "Package contains extraneous file",
|
338
|
+
"category": "package"
|
339
|
+
},
|
340
|
+
"packageSourceDirectory": {
|
341
|
+
"severity": "error",
|
342
|
+
"message": "\"source\" directory does not exist",
|
343
|
+
"category": "package"
|
344
|
+
},
|
345
|
+
"packageManifestFile": {
|
346
|
+
"severity": "error",
|
347
|
+
"message": "Manifest file is missing",
|
348
|
+
"category": "package"
|
349
|
+
}
|
350
|
+
},
|
351
|
+
"logCategories": {
|
352
|
+
"uncategorized": "Uncategorized",
|
353
|
+
"deprecatedComponents": "Deprecated components",
|
354
|
+
"manifest": "Manifest",
|
355
|
+
"raf": "RAF",
|
356
|
+
"package": "Package"
|
357
|
+
}
|
358
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
module RokuBuilder
|
4
|
+
|
5
|
+
class LineInspector
|
6
|
+
def initialize(config:, raf:, inspector_config:)
|
7
|
+
@config = config
|
8
|
+
@raf_inspector = raf
|
9
|
+
@inspector_config = inspector_config
|
10
|
+
end
|
11
|
+
|
12
|
+
def run(file_path)
|
13
|
+
@warnings = []
|
14
|
+
File.open(file_path) do |file|
|
15
|
+
line_number = 0
|
16
|
+
in_xml_comment = false
|
17
|
+
file.readlines.each do |line|
|
18
|
+
line = line.partition("'").first if file_path.end_with?(".brs")
|
19
|
+
if file_path.end_with?(".xml")
|
20
|
+
if in_xml_comment
|
21
|
+
if line.gsub!(/.*-->/, "")
|
22
|
+
in_xml_comment = false
|
23
|
+
else
|
24
|
+
line = ""
|
25
|
+
end
|
26
|
+
end
|
27
|
+
line.gsub!(/<!--.*-->/, "")
|
28
|
+
in_xml_comment = true if line.gsub!(/<!--.*/, "")
|
29
|
+
end
|
30
|
+
@inspector_config.each do |line_inspector|
|
31
|
+
if /#{line_inspector[:regex]}/.match(line)
|
32
|
+
add_warning(inspector: line_inspector, file: file_path, line: line_number)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
@raf_inspector.inspect_line(line: line, file: file_path, line_number: line_number)
|
36
|
+
line_number += 1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
@warnings
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def add_warning(inspector:, file:, line:)
|
45
|
+
@warnings.push(inspector.deep_dup)
|
46
|
+
@warnings.last[:path] = file
|
47
|
+
@warnings.last[:line] = line
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -70,6 +70,12 @@ module RokuBuilder
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
+
def copy(options:, path:)
|
74
|
+
@options = options
|
75
|
+
@target = path
|
76
|
+
copy_channel_files(setup_build_content)
|
77
|
+
end
|
78
|
+
|
73
79
|
private
|
74
80
|
|
75
81
|
def is_build_command(options)
|
@@ -156,6 +162,17 @@ module RokuBuilder
|
|
156
162
|
end
|
157
163
|
}
|
158
164
|
end
|
165
|
+
def copy_channel_files(content)
|
166
|
+
[:files, :folders].each do |type|
|
167
|
+
content[type].each do |entity|
|
168
|
+
begin
|
169
|
+
FileUtils.copy_entry(File.join(@config.parsed[:root_dir], entity), File.join(@target, entity))
|
170
|
+
rescue Errno::ENOENT
|
171
|
+
@logger.warn "Missing Entry: #{entity}"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
159
176
|
end
|
160
177
|
RokuBuilder.register_plugin(Loader)
|
161
178
|
end
|