roku_builder 4.7.2 → 4.8.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.
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