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.
- 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
|