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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +8 -0
  3. data/Gemfile.lock +4 -2
  4. data/lib/roku_builder/hash.rb +3 -0
  5. data/lib/roku_builder/manifest.rb +4 -0
  6. data/lib/roku_builder/plugins/analyzer.rb +102 -0
  7. data/lib/roku_builder/plugins/inspector_config.json +358 -0
  8. data/lib/roku_builder/plugins/line_inspector.rb +50 -0
  9. data/lib/roku_builder/plugins/loader.rb +17 -0
  10. data/lib/roku_builder/plugins/manifest_attributes.json +229 -0
  11. data/lib/roku_builder/plugins/manifest_inspector.rb +142 -0
  12. data/lib/roku_builder/plugins/raf_inspector.rb +74 -0
  13. data/lib/roku_builder/version.rb +1 -1
  14. data/lib/roku_builder.rb +2 -0
  15. data/roku_builder.gemspec +1 -0
  16. data/test/roku_builder/plugins/test_analyzer.rb +344 -0
  17. data/test/roku_builder/plugins/test_loader.rb +9 -0
  18. data/test/roku_builder/test_config_parser.rb +1 -1
  19. data/test/roku_builder/test_files/analyzer_test/analyzer_config.json +1 -0
  20. data/test/roku_builder/test_files/analyzer_test/images/focus.png +0 -0
  21. data/test/roku_builder/test_files/analyzer_test/images/focus_hd.png +0 -0
  22. data/test/roku_builder/test_files/analyzer_test/images/focus_sd.png +0 -0
  23. data/test/roku_builder/test_files/analyzer_test/images/splash.png +0 -0
  24. data/test/roku_builder/test_files/analyzer_test/images/splash_hd.png +0 -0
  25. data/test/roku_builder/test_files/analyzer_test/images/splash_sd.png +0 -0
  26. data/test/roku_builder/test_files/analyzer_test/images/too_small.png +0 -0
  27. data/test/roku_builder/test_files/analyzer_test/manifest_depricated_attribute +9 -0
  28. data/test/roku_builder/test_files/analyzer_test/manifest_duplicate_attribute +9 -0
  29. data/test/roku_builder/test_files/analyzer_test/manifest_empty_value +9 -0
  30. data/test/roku_builder/test_files/analyzer_test/manifest_has_value +9 -0
  31. data/test/roku_builder/test_files/analyzer_test/manifest_incorrect_image_resolution +8 -0
  32. data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_equals +9 -0
  33. data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_float +9 -0
  34. data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_integer +8 -0
  35. data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_negative +8 -0
  36. data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_not_equal +8 -0
  37. data/test/roku_builder/test_files/analyzer_test/manifest_invalid_value_starts_with +8 -0
  38. data/test/roku_builder/test_files/analyzer_test/manifest_missing_attribute +7 -0
  39. data/test/roku_builder/test_files/analyzer_test/manifest_missing_file +8 -0
  40. data/test/roku_builder/test_files/analyzer_test/manifest_raf +9 -0
  41. data/test/roku_builder/test_files/analyzer_test/manifest_template +8 -0
  42. data/test/roku_builder/test_files/analyzer_test/test.pkg +0 -0
  43. data/test/roku_builder/test_helper.rb +2 -2
  44. metadata +72 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: af58bfb5b9096e330d060b5173ef8bb8d2cb5ba7
4
- data.tar.gz: 371b9486d00d1ab29f2e759c06eaed0e248072db
3
+ metadata.gz: 38d4cd944ab2ba9a7b286c37cda4328f9dbe7038
4
+ data.tar.gz: 0e48951e36d4ab8469c92fa74c5b3e24c922c8a3
5
5
  SHA512:
6
- metadata.gz: 9d07e8f924405c4138a1aade52e97f2e088e49ed84c92c1c77832550cea5490de99949377817c67896b80ab40aa2ccbb1531462b825682c517b1d56e2b830b8d
7
- data.tar.gz: 6fa886b8431a2fd5e26319a05154a5a9abdaaeaf3a97b3166f897024199cb2e853bdf66515abd9015d853286035960eeb1f99e8ccc7cadcc4e2250428eb58403
6
+ metadata.gz: b61247bd31d9aa8da330157c74d5b982a82785c88b7f49d8cdc8f18e4b7b54e7ec1bc627274b4b917f1c93071c9807fde71cf6eb8ab2478b7a4b130ea9e5a2b7
7
+ data.tar.gz: 9dcdba8b1687c8a4b4ee5a694c172dc80967a5cc9058ca8870b61ccda0bdc12cb07f4968927c06160b165b732d8d3e327bf4e9586efe3cbc15e532a8f6a1164b
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ = 4.8.0 =
2
+
3
+ - Add Static Analyzer
4
+
5
+ = 4.7.2 =
6
+
7
+ - Fix monitor regexp
8
+
1
9
  = 4.7.1 =
2
10
 
3
11
  - Update Dependencies
data/Gemfile.lock CHANGED
@@ -1,10 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- roku_builder (4.7.2)
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.2)
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)
@@ -5,4 +5,7 @@ class ::Hash
5
5
  merger = proc { |_key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
6
6
  self.merge(second, &merger)
7
7
  end
8
+ def deep_dup
9
+ Marshal.load(Marshal.dump(self))
10
+ end
8
11
  end
@@ -22,6 +22,10 @@ module RokuBuilder
22
22
  write_file
23
23
  end
24
24
 
25
+ def get_attributes
26
+ @attributes
27
+ end
28
+
25
29
  def increment_build_version
26
30
  build_version_parts = @attributes[:build_version].split(".")
27
31
  if build_version_parts.length == 2
@@ -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