roku_builder_generator 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b0204f922e4434a1a0c814410ba2d655c82e771edbd1175a1705a689185a0819
4
- data.tar.gz: 36650f221ae40b8903153f840536254853362d3e207e06f6e52d5d0fb8e3b8a0
3
+ metadata.gz: 50d50e79d829314444a02c6dfea8082c609185b2efdd0951c33f754daa6fcbda
4
+ data.tar.gz: 4ecb281d387c3eb92fa9dd345a75670ba2596d98dc831748a4cbe4842122cb69
5
5
  SHA512:
6
- metadata.gz: 4bf23c381e6473c46bdfb0866cc6f5f252948f0da310cee0b18fcecf7508f5a12662f355acbc1446cbac20ac704163137a55a7119dee394cc1c2c7813c244497
7
- data.tar.gz: a17b132d2a5035afa12522e87e14710b6c239df97fc6143925849120c4e5e1aabf26c9042db4173f0be3528073160c204aed452af927a2007feefd592eb42eaa
6
+ metadata.gz: 226244599f730ae30f767a8473c48e9d416e0579b1e4ba643db134afd1fc2cd942210bb6dd80434735618f4fbd82f549314a9273bd789761bd501b9f8afded2c
7
+ data.tar.gz: 8e0a6d16062f870f60107977ad63a43e71945ede45d6d6aa7db5dd643d8efe4a3290b71efab6c1eac057799eaeda4dbc28755c040798ea1caab26e5e9dd8bab7
data/Gemfile CHANGED
@@ -2,5 +2,3 @@ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in roku_builder_generator.gemspec
4
4
  gemspec
5
-
6
- gem 'solargraph', group: :development
data/README.md CHANGED
@@ -25,10 +25,16 @@ Options for RokuBuilder::Generator:
25
25
  Commands:
26
26
  --generate COMPONENT_TYPE Generate a component: manager, module, task, screen
27
27
  --name COMPONENT_NAME Name of the component
28
+ Options:
28
29
  --extends COMPONENT_NAME A component to extend
29
- --base-dir Base directory for generated code (eg.: 'brands/core/components/<type>s')
30
+ --for-brand BRAND Brand to put component in (default:' core')
31
+ --base-dir Base directory for generated brs/xml code (eg.: 'brands/core/components/<type>s')
30
32
  --with-config Add empty config JSON
31
33
  --config-dir Use custom directory for config json (eg.: 'brands/core/region/US/configs/<type>s')
34
+ --with-tests Add unit tests
35
+ --only-tests Only unit tests
36
+ --tests-dir Use custom directory for unit tests
37
+
32
38
  ```
33
39
 
34
40
  ### Examples
@@ -41,6 +47,10 @@ Generate a task ("Bar"), but just display the output on screen:
41
47
 
42
48
  `roku --generate task --name bar --dry-run -V`
43
49
 
50
+ Generate a module ("Buz"), and also generate config and unit tests
51
+
52
+ `roku --generate module --name buz --with-config --with-tests`
53
+
44
54
  ### Config
45
55
 
46
56
  You can supplement the default configuration using a local file `.roku_builder_generator.json`
@@ -49,12 +59,45 @@ Format of config file:
49
59
 
50
60
  ```js
51
61
  {
52
- "component_dir": "base/directory/for/components", // default: "./brands/core/components"
53
- "config_dir": "base/directory/for/config/json/files", // default: "./brands/core/region/US/configs"
62
+ "component_dir": "base/directory/for/components", // default: "./brands/%brand%/components"
63
+ "config_dir": "base/directory/for/config/json/files", // default: "./brands/%brand%/region/US/configs"
54
64
  "template_dir": "directory/for/templates" // default: "./roku_builder_generator"
55
65
  }
56
66
  ```
57
67
 
68
+ ### Directories and Brands
69
+
70
+ Unless you specify a custom directory, generated files will be placed in the default directory. For example,
71
+ `roku --generate manager --name foo --with-config`
72
+ will generate the following files:
73
+
74
+ - ./brands/core/components/Managers/FooManager/FooManager.xml
75
+ - ./brands/core/components/Managers/FooManager/FooManager.brs
76
+ - ./brands/core/region/US/configs/Managers/Foo.json
77
+
78
+ without specifying custom directories, files can be generated for other brands. For example,
79
+
80
+ `roku --generate manager --name foo --for-brand comedy --with-config`
81
+
82
+ will generate:
83
+
84
+ - ./brands/comedy/components/Managers/FooManager/FooManager.xml
85
+ - ./brands/comedy/components/Managers/FooManager/FooManager.brs
86
+ - ./brands/comedy/region/US/configs/Managers/Foo.json
87
+
88
+ To enable changing brands for directories specified in `.roku_builder_generator.json`, use `%brand%` in the position where the brand should be replaced.
89
+
90
+ For example, if you specify `"component_dir": "some/directory/%brand%/components"` and you ran the command
91
+
92
+ `roku --generate manager --name foo --for-brand my-brand`
93
+
94
+ it would generate files
95
+
96
+ - ./some/directory/my-brand/components/Managers/FooManager/FooManager.xml
97
+ - ./some/directory/my-brand/components/Managers/FooManager/FooManager.brs
98
+
99
+ Note: If nothing is specified by the `--for-brand` option, it will use "core".
100
+
58
101
  ### Custom Templates
59
102
 
60
103
  You can add custom templates for different component types by adding [ERB](https://www.stuartellis.name/articles/erb/) files to the template directory (either `./roku_builder_generator` or whatever was defined in the config).
@@ -5,23 +5,36 @@ require_relative '../../roku_builder_generator'
5
5
 
6
6
  def default_config()
7
7
  return {
8
- :component_dir => "brands/core/components",
9
- :config_dir => "brands/core/region/US/configs",
8
+ :component_dir => "brands/%brand%/components",
9
+ :config_dir => "brands/%brand%/region/US/configs",
10
+ :unitTests_dir => "brands/unit-tests/components/tests",
10
11
  :template_dir => "roku_builder_generator"
11
12
  }
12
13
  end
13
14
 
14
- def default_output_dir(component_type, base_dir = nil)
15
+ def default_output_dir(component_type, brand = 'core', base_dir = nil)
15
16
  base_dir = base_dir || default_config[:component_dir]
17
+ base_dir = replace_brand(base_dir, brand)
16
18
  return "#{base_dir}/#{component_type.capitalize()}s"
17
19
  end
18
20
 
19
- def default_config_dir(component_type, base_dir = nil)
21
+ def default_config_dir(component_type, brand = 'core', base_dir = nil)
20
22
  base_dir = base_dir || default_config[:config_dir]
21
- return "#{base_dir}/#{component_type.capitalize()}s"
23
+ base_dir = replace_brand(base_dir, brand)
24
+ return "#{base_dir}/#{component_type.capitalize()}s"
25
+ end
26
+
27
+ def default_unitTests_dir(component_type, base_dir = nil)
28
+ base_dir = base_dir || default_config[:unitTests_dir]
29
+ return "#{base_dir}/#{component_type.capitalize()}s"
22
30
  end
23
31
 
24
32
 
33
+ def replace_brand(directory, newBrand = 'core')
34
+ directory["%brand%"]=newBrand
35
+ return directory
36
+ end
37
+
25
38
  module RokuBuilder
26
39
 
27
40
  class Generator < Util
@@ -43,20 +56,24 @@ module RokuBuilder
43
56
  end
44
57
 
45
58
 
46
- def get_output_dir( component_type, component_name, parent_dir = nil, custom_dir = nil, base_component_dir = nil )
59
+ def get_output_dir( component_type, component_name, brand, parent_dir = nil, custom_dir = nil, base_component_dir = nil )
47
60
  output_dir = get_directory_name(component_type, component_name)
48
61
  unless parent_dir.nil? || "" === parent_dir
49
62
  output_dir = parent_dir+"/"+output_dir
50
63
  end
51
- base_dir = custom_dir ? custom_dir : default_output_dir(component_type, base_component_dir)
64
+ base_dir = !custom_dir.nil? ? replace_brand(custom_dir, brand) : default_output_dir(component_type, brand, base_component_dir)
52
65
  return "./#{base_dir}/#{output_dir}"
53
66
 
54
67
  end
55
68
 
56
- def get_config_output_dir( component_type, custom_dir = nil, base_config_dir = nil )
57
- base_dir = custom_dir ? custom_dir : default_config_dir(component_type, base_config_dir)
69
+ def get_config_output_dir( component_type, brand, custom_dir = nil )
70
+ base_dir = !custom_dir.nil? ? replace_brand(custom_dir, brand) : default_config_dir(component_type, brand)
58
71
  return "./#{base_dir}"
72
+ end
59
73
 
74
+ def get_unitTests_output_dir(component_type, custom_dir = nil )
75
+ base_dir = !custom_dir.nil? ? custom_dir : default_unitTests_dir(component_type)
76
+ return "./#{base_dir}"
60
77
  end
61
78
 
62
79
  # Hook to add options to the parser
@@ -64,16 +81,21 @@ module RokuBuilder
64
81
  # hash
65
82
  def self.parse_options(parser:, options:)
66
83
  parser.separator "Commands:"
84
+ options[:brand] = 'core'
67
85
  parser.on("--generate COMPONENT_TYPE", "Generate a component: manager, module, task, screen") do |component_type|
68
86
  options[:generate] = component_type
69
87
  end
70
88
  parser.on("--name COMPONENT_NAME", "Name of the component") do |component_name|
71
89
  options[:name] = component_name
72
90
  end
91
+ parser.separator "Options:"
73
92
  parser.on("--extends COMPONENT_NAME", "A component to extend") do |component_name|
74
93
  options[:extends] = component_name
75
94
  end
76
- parser.on("--base-dir", "Base directory for generated code (eg.: '#{default_output_dir('<type>')}')") do |base_dir|
95
+ parser.on("--for-brand BRAND", "Brand to put component in (default:' core')") do |brand|
96
+ options[:brand] = brand
97
+ end
98
+ parser.on("--base-dir", "Base directory for generated brs/xml code (eg.: '#{default_output_dir('<type>')}')") do |base_dir|
77
99
  options[:custom_dir] = base_dir
78
100
  end
79
101
  parser.on("--with-config", "Add empty config JSON") do |d|
@@ -82,6 +104,16 @@ module RokuBuilder
82
104
  parser.on("--config-dir", "Use custom directory for config json (eg.: '#{default_config_dir('<type>')}')") do |d|
83
105
  options[:config_dir] = d
84
106
  end
107
+ parser.on("--with-tests", "Add unit tests") do |d|
108
+ options[:with_tests] = true
109
+ end
110
+ parser.on("--only-tests", "Only unit tests") do |d|
111
+ options[:only_tests] = true
112
+ options[:with_tests] = true
113
+ end
114
+ parser.on("--tests-dir", "Use custom directory for unit tests (eg.: '#{default_unitTests_dir('<type>')}')") do |d|
115
+ options[:tests_dir] = d
116
+ end
85
117
  parser.on("--dry-run", "Do not write files, just output") do |d|
86
118
  options[:dry_run] = true
87
119
  end
@@ -96,9 +128,11 @@ module RokuBuilder
96
128
  #Setup
97
129
  end
98
130
 
131
+ def capitalizeFirst(name)
132
+ name.slice(0,1).capitalize + name.slice(1..-1)
133
+ end
99
134
 
100
135
  def get_file_name(component_type, name)
101
- name = name.slice(0,1).capitalize + name.slice(1..-1)
102
136
  if(component_type == 'screen' && !name.end_with?("Screen"))
103
137
  return name+ "Screen"
104
138
  end
@@ -109,7 +143,6 @@ module RokuBuilder
109
143
  end
110
144
 
111
145
  def get_directory_name(component_type, name)
112
- name = name.slice(0,1).capitalize + name.slice(1..-1)
113
146
  if(component_type === 'manager'&& !name.end_with?("Manager"))
114
147
  return name+'Manager'
115
148
  end
@@ -118,7 +151,6 @@ module RokuBuilder
118
151
 
119
152
  def component_has_config_json(component_type)
120
153
  ['module', 'screen', 'manager'].include? component_type
121
-
122
154
  end
123
155
 
124
156
  def generate(options:)
@@ -131,8 +163,9 @@ module RokuBuilder
131
163
  config = read_config()
132
164
  component_type = options[:generate].downcase
133
165
  component_name_parts = options[:name].split('/')
134
- component_proper_name = component_name_parts.last
166
+ component_proper_name = capitalizeFirst(component_name_parts.last)
135
167
  component_parent_dir = component_name_parts.first(component_name_parts.size-1).join('/')
168
+ brand = options[:brand].downcase
136
169
 
137
170
  component_name = get_file_name(component_type, component_proper_name)
138
171
  component = RokuBuilderGenerator::BrsComponent.new(component_name, options[:extends], component_type, @logger)
@@ -140,27 +173,52 @@ module RokuBuilder
140
173
  brs_text = component.render("brs")
141
174
  json_text = options[:with_config] && component_has_config_json(component_type) ? component.render("json") : nil
142
175
 
143
- output_dir = get_output_dir(component_type, component_name, component_parent_dir, options[:custom_dir], config[:component_dir])
144
- output_config_dir = get_config_output_dir(component_type, options[:config_dir], config[:config_dir])
176
+ test_xml_text = options[:with_tests] ? component.renderTest("xml") : nil
177
+ test_brs_text = options[:with_tests] ? component.renderTest("brs") : nil
178
+ testSetup_brs_text = options[:with_tests] ? component.renderTestSetup() : nil
179
+
180
+ output_dir = get_output_dir(component_type, component_name, brand, component_parent_dir, options[:custom_dir], config[:component_dir])
181
+ output_config_dir = get_config_output_dir(component_type, brand, options[:config_dir])
145
182
  output_file_name = File.join(output_dir, component_name)
146
183
  output_config_file_name = File.join(output_config_dir, component_proper_name)
147
184
 
185
+ output_unitTests_dir = get_unitTests_output_dir(component_type, options[:config_dir])
186
+
187
+ test_component_name= "Test_"+component_proper_name
188
+
189
+ output_test_file_name = File.join(output_unitTests_dir, test_component_name)
190
+ output_test_setup_file_name= File.join(output_unitTests_dir, test_component_name+".setup")
191
+
148
192
  if(options[:dry_run])
149
193
  @logger.unknown "Dry Run, not writing files"
150
194
  show_line()
151
- display_file(output_file_name+".xml", xml_text)
152
- display_file(output_file_name+".brs", brs_text)
153
- display_file(output_config_file_name+".json", json_text)
195
+ unless options[:only_tests]
196
+ display_file(output_file_name+".xml", xml_text)
197
+ display_file(output_file_name+".brs", brs_text)
198
+ display_file(output_config_file_name+".json", json_text)
199
+ end
200
+
201
+ display_file(output_test_file_name+".xml", test_xml_text)
202
+ display_file(output_test_file_name+".brs", test_brs_text)
203
+ display_file(output_test_setup_file_name+".brs", testSetup_brs_text)
154
204
  else
155
205
  @logger.unknown "Writing files"
156
206
  show_line()
157
- FileUtils.mkdir_p output_dir
158
- unless json_text.nil?
159
- FileUtils.mkdir_p output_config_dir
207
+ unless options[:only_tests]
208
+ FileUtils.mkdir_p output_dir
209
+ unless json_text.nil?
210
+ FileUtils.mkdir_p output_config_dir
211
+ end
212
+ write_file(output_file_name+".xml", xml_text)
213
+ write_file(output_file_name+".brs", brs_text)
214
+ write_file(output_config_file_name+".json", json_text)
160
215
  end
161
- write_file(output_file_name+".xml", xml_text)
162
- write_file(output_file_name+".brs", brs_text)
163
- write_file(output_config_file_name+".json", json_text)
216
+ unless test_xml_text.nil?
217
+ FileUtils.mkdir_p output_unitTests_dir
218
+ end
219
+ write_file(output_test_file_name+".xml", test_xml_text)
220
+ write_file(output_test_file_name+".brs", test_brs_text)
221
+ write_file(output_test_setup_file_name+".brs", testSetup_brs_text)
164
222
  end
165
223
  end
166
224
 
@@ -176,7 +234,11 @@ module RokuBuilder
176
234
  def write_file(output_file_name, contents)
177
235
  unless contents.nil?
178
236
  @logger.unknown output_file_name
179
- File.open(output_file_name, "w") { |f| f.write contents }
237
+ if File.exist?(output_file_name)
238
+ @logger.warn "#{output_file_name} already exists, skipping"
239
+ else
240
+ File.open(output_file_name, "w") { |f| f.write contents }
241
+ end
180
242
  end
181
243
  end
182
244
 
@@ -27,6 +27,26 @@ module RokuBuilderGenerator
27
27
  return nil
28
28
  end
29
29
 
30
+ def renderTest(file_type)
31
+ file_name = get_template_name("test", file_type)
32
+
33
+ unless file_name.nil?
34
+ template = File.read(file_name)
35
+ return render_template(template)
36
+ end
37
+ return nil
38
+ end
39
+
40
+ def renderTestSetup()
41
+ file_name = get_template_name("test.setup", "brs")
42
+
43
+ unless file_name.nil?
44
+ template = File.read(file_name)
45
+ return render_template(template)
46
+ end
47
+ return nil
48
+ end
49
+
30
50
  def log(message)
31
51
  unless @logger.nil?
32
52
  @logger.info message
@@ -0,0 +1,6 @@
1
+ sub init()
2
+ Runner = TestRunner()
3
+ Runner.SetFunctions([
4
+ TestSuite_<%= name %>_Setup
5
+ ])
6
+ end sub
@@ -0,0 +1,20 @@
1
+ function TestSuite_<%= name %>_Setup()
2
+ ' Inherit your test suite from BaseTestSuite
3
+ this = BaseTestSuite()
4
+
5
+ ' Test suite name for log statistics
6
+ this.Name = "TestSuite_<%= name %>_Setup"
7
+
8
+ ' Add tests to suite's tests collection
9
+ this.addTest("TestCase_Config_Exists", TestCase_Config_Exists)
10
+
11
+ return this
12
+ end function
13
+
14
+ function TestCase_Example()
15
+ config = getGlobalAA().channelConfig
16
+ codebox = getGlobalAA().codebox
17
+
18
+ m.assertNotInvalid(config)
19
+ m.assertNotInvalid(codebox)
20
+ end function
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="utf-8" ?>
2
+ <!-- ##COPYRIGHT HEADER## -->
3
+
4
+ <component name="Test_<%= name %>" extends="<%= name %>">
5
+ <!-- Function, used by framework, to run tests. Should not be called manually! -->
6
+ <interface>
7
+ <function name="TestFramework__RunNodeTests"/>
8
+ </interface>
9
+
10
+ <!-- Import test suites. -->
11
+ <script type="text/brightscript" uri="Test_<%= name %>.brs" />
12
+ <script type="text/brightscript" uri="Test_<%= name %>.setup.brs" />
13
+
14
+ <!-- Import test framework. -->
15
+ <script type="text/brightscript" uri="pkg:/source/UnitTestFramework.brs"/>
16
+ </component>
@@ -1,4 +1,4 @@
1
1
  module RokuBuilderGenerator
2
2
  NAME = "roku_builder_generator"
3
- VERSION = "0.1.0"
3
+ VERSION = "0.3.0"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roku_builder_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Pearce
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-13 00:00:00.000000000 Z
11
+ date: 2022-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: roku_builder
@@ -58,13 +58,16 @@ files:
58
58
  - lib/roku_builder_generator/templates/manager.brs.erb
59
59
  - lib/roku_builder_generator/templates/module.xml.erb
60
60
  - lib/roku_builder_generator/templates/screen.xml.erb
61
+ - lib/roku_builder_generator/templates/test.brs.erb
62
+ - lib/roku_builder_generator/templates/test.setup.brs.erb
63
+ - lib/roku_builder_generator/templates/test.xml.erb
61
64
  - lib/roku_builder_generator/utils.rb
62
65
  - lib/roku_builder_generator/version.rb
63
66
  - roku_builder_generator.gemspec
64
67
  homepage: ''
65
68
  licenses: []
66
69
  metadata: {}
67
- post_install_message:
70
+ post_install_message:
68
71
  rdoc_options: []
69
72
  require_paths:
70
73
  - lib
@@ -79,8 +82,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
82
  - !ruby/object:Gem::Version
80
83
  version: '0'
81
84
  requirements: []
82
- rubygems_version: 3.0.8
83
- signing_key:
85
+ rubygems_version: 3.2.32
86
+ signing_key:
84
87
  specification_version: 4
85
88
  summary: RokuBuilder Generator Plugin
86
89
  test_files: []