rggen-core 0.21.0 → 0.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -1
  4. data/exe/rggen +2 -2
  5. data/lib/rggen/core.rb +9 -2
  6. data/lib/rggen/core/base/component.rb +5 -6
  7. data/lib/rggen/core/base/component_factory.rb +8 -5
  8. data/lib/rggen/core/builder/builder.rb +29 -35
  9. data/lib/rggen/core/builder/component_registry.rb +8 -9
  10. data/lib/rggen/core/builder/feature_registry.rb +15 -15
  11. data/lib/rggen/core/builder/layer.rb +44 -29
  12. data/lib/rggen/core/builder/list_feature_entry.rb +5 -9
  13. data/lib/rggen/core/builder/loader_registry.rb +1 -2
  14. data/lib/rggen/core/builder/plugin_manager.rb +122 -0
  15. data/lib/rggen/core/builder/plugin_spec.rb +83 -0
  16. data/lib/rggen/core/builder/simple_feature_entry.rb +4 -4
  17. data/lib/rggen/core/configuration.rb +3 -2
  18. data/lib/rggen/core/configuration/toml_loader.rb +18 -0
  19. data/lib/rggen/core/core_extensions/object.rb +4 -4
  20. data/lib/rggen/core/dsl.rb +3 -1
  21. data/lib/rggen/core/exceptions.rb +9 -4
  22. data/lib/rggen/core/facets.rb +1 -1
  23. data/lib/rggen/core/generator.rb +3 -3
  24. data/lib/rggen/core/input_base/component.rb +12 -0
  25. data/lib/rggen/core/input_base/component_factory.rb +1 -0
  26. data/lib/rggen/core/input_base/feature.rb +22 -8
  27. data/lib/rggen/core/input_base/input_data.rb +24 -17
  28. data/lib/rggen/core/input_base/input_matcher.rb +5 -5
  29. data/lib/rggen/core/input_base/loader.rb +15 -15
  30. data/lib/rggen/core/input_base/property.rb +17 -11
  31. data/lib/rggen/core/input_base/toml_loader.rb +16 -0
  32. data/lib/rggen/core/input_base/yaml_loader.rb +1 -18
  33. data/lib/rggen/core/options.rb +18 -14
  34. data/lib/rggen/core/output_base/code_generator.rb +5 -6
  35. data/lib/rggen/core/output_base/document_component_factory.rb +10 -0
  36. data/lib/rggen/core/output_base/feature.rb +15 -11
  37. data/lib/rggen/core/output_base/file_writer.rb +1 -1
  38. data/lib/rggen/core/output_base/source_file_component_factory.rb +15 -0
  39. data/lib/rggen/core/output_base/template_engine.rb +4 -5
  40. data/lib/rggen/core/plugin.rb +16 -0
  41. data/lib/rggen/core/printers.rb +11 -7
  42. data/lib/rggen/core/register_map.rb +4 -5
  43. data/lib/rggen/core/register_map/hash_loader.rb +6 -9
  44. data/lib/rggen/core/register_map/toml_loader.rb +18 -0
  45. data/lib/rggen/core/utility/attribute_setter.rb +5 -0
  46. data/lib/rggen/core/utility/code_utility/code_block.rb +11 -5
  47. data/lib/rggen/core/utility/error_utility.rb +33 -6
  48. data/lib/rggen/core/version.rb +2 -4
  49. metadata +33 -7
  50. data/lib/rggen/core/base/proxy_call.rb +0 -18
  51. data/lib/rggen/core/builder/plugins.rb +0 -79
@@ -40,26 +40,30 @@ module RgGen
40
40
 
41
41
  [:pre_code, :main_code, :post_code].each do |phase|
42
42
  define_method(phase) do |kind, **options, &body|
43
- block =
44
- if options[:from_template]
45
- caller_location = caller_locations(1, 1).first
46
- template_path = extract_template_path(options)
47
- -> { process_template(template_path, caller_location) }
48
- else
49
- body
50
- end
51
- code_generators[__method__] ||= CodeGenerator.new
52
- code_generators[__method__].register(kind, block)
43
+ register_code_generator(__method__, kind, **options, &body)
53
44
  end
54
45
  end
55
46
 
47
+ def register_code_generator(phase, kind, **options, &body)
48
+ block =
49
+ if options[:from_template]
50
+ path = extract_template_path(options)
51
+ location = caller_locations(2, 1).first
52
+ -> { process_template(path, location) }
53
+ else
54
+ body
55
+ end
56
+ (code_generators[phase] ||= CodeGenerator.new)
57
+ .register(kind, &block)
58
+ end
59
+
56
60
  def extract_template_path(options)
57
61
  path = options[:from_template]
58
62
  path.equal?(true) ? nil : path
59
63
  end
60
64
 
61
65
  def write_file(file_name_pattern, &body)
62
- @file_writer = FileWriter.new(file_name_pattern, body)
66
+ @file_writer = FileWriter.new(file_name_pattern, &body)
63
67
  end
64
68
 
65
69
  def export(*methods)
@@ -4,7 +4,7 @@ module RgGen
4
4
  module Core
5
5
  module OutputBase
6
6
  class FileWriter
7
- def initialize(pattern, body)
7
+ def initialize(pattern, &body)
8
8
  @pattern = Erubi::Engine.new(pattern)
9
9
  @body = body
10
10
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module OutputBase
6
+ class SourceFileComponentFactory < ComponentFactory
7
+ private
8
+
9
+ def create_component?(_, register_map)
10
+ !register_map.document_only?
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -11,15 +11,14 @@ module RgGen
11
11
  caller_location ||= caller_locations(1, 1).first
12
12
  path = File.ext(caller_location.path, file_extension.to_s)
13
13
  end
14
- render(context, templates[path])
14
+ render(context, template(path))
15
15
  end
16
16
 
17
17
  private
18
18
 
19
- def templates
20
- @templates ||= Hash.new do |templates, path|
21
- templates[path] = parse_template(path)
22
- end
19
+ def template(path)
20
+ @templates ||= {}
21
+ (@templates[path] ||= parse_template(path))
23
22
  end
24
23
  end
25
24
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module Plugin
6
+ attr_reader :plugin_spec
7
+
8
+ private
9
+
10
+ def setup_plugin(name)
11
+ @plugin_spec = Builder::PluginSpec.new(name, self)
12
+ block_given? && yield(@plugin_spec)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -18,18 +18,20 @@ module RgGen
18
18
  end
19
19
 
20
20
  def run(builder, options)
21
- verbose? && load_setup_file(builder, options[:setup])
21
+ verbose? && load_plugins(builder, options)
22
22
  puts version_message(builder)
23
23
  end
24
24
 
25
25
  private
26
26
 
27
- def verbose?
28
- @verbose
27
+ def load_plugins(builder, options)
28
+ plugins = options[:plugins]
29
+ no_default_plugins = options[:no_default_plugins]
30
+ builder.load_plugins(plugins, no_default_plugins, false)
29
31
  end
30
32
 
31
- def load_setup_file(builder, file)
32
- file.nil? || file.empty? || builder.load_setup_file(file, false)
33
+ def verbose?
34
+ @verbose
33
35
  end
34
36
 
35
37
  def version_message(builder)
@@ -44,8 +46,10 @@ module RgGen
44
46
  end
45
47
 
46
48
  def verbose_version(builder)
47
- ["rggen-core #{Core::VERSION}", *builder.plugins.version_info]
48
- .map { |version_info| " - #{version_info}" }
49
+ [
50
+ "rggen-core #{Core::VERSION}",
51
+ *builder.plugin_manager.version_info
52
+ ].map { |version_info| " - #{version_info}" }
49
53
  end
50
54
  end
51
55
  end
@@ -5,16 +5,15 @@ module RgGen
5
5
  module RegisterMap
6
6
  def self.setup(builder)
7
7
  builder.input_component_registry(:register_map) do
8
- register_component [
9
- :root, :register_block, :register_file, :register, :bit_field
10
- ] do |layer|
8
+ register_component do
11
9
  component Component, ComponentFactory
12
- feature Feature, FeatureFactory if layer != :root
10
+ feature Feature, FeatureFactory
13
11
  end
14
12
 
15
13
  register_loader :ruby, RubyLoader
16
- register_loader :yaml, YAMLLoader
17
14
  register_loader :json, JSONLoader
15
+ register_loader :toml, TOMLLoader
16
+ register_loader :yaml, YAMLLoader
18
17
  end
19
18
  end
20
19
  end
@@ -29,14 +29,13 @@ module RgGen
29
29
  end
30
30
 
31
31
  def format_array_layer_data(read_data, layer, file)
32
- read_data.each_with_object({}) do |data, layer_data|
33
- layer_data.merge!(fomrat_hash_layer_data(data, layer, file))
34
- end
32
+ read_data
33
+ .map { |data| fomrat_hash_layer_data(data, layer, file) }
34
+ .inject(&:merge)
35
35
  end
36
36
 
37
37
  def fomrat_hash_layer_data(read_data, layer, file)
38
- convert_to_hash(read_data, file)
39
- .reject { |key, _| SUB_LAYER_KEYS[layer]&.include?(key) }
38
+ convert_to_hash(read_data, file).except(*SUB_LAYER_KEYS[layer])
40
39
  end
41
40
 
42
41
  def format_sub_layer_data(read_data, layer, file)
@@ -55,10 +54,8 @@ module RgGen
55
54
 
56
55
  def format_hash_sub_layer_data(read_data, layer, file, sub_layer_data = {})
57
56
  convert_to_hash(read_data, file)
58
- .select { |key, _| SUB_LAYER_KEYS[layer]&.include?(key) }
59
- .each do |key, value|
60
- merge_sub_layer_data(sub_layer_data, layer, key, value)
61
- end
57
+ .slice(*SUB_LAYER_KEYS[layer])
58
+ .each { |k, v| merge_sub_layer_data(sub_layer_data, layer, k, v) }
62
59
  sub_layer_data
63
60
  end
64
61
 
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module RegisterMap
6
+ class TOMLLoader < Loader
7
+ include HashLoader
8
+ include InputBase::TOMLLoader
9
+
10
+ support_types [:toml]
11
+
12
+ def read_file(file)
13
+ load_toml(file)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -24,6 +24,11 @@ module RgGen
24
24
  end
25
25
  end
26
26
  end
27
+
28
+ def inherited(subclass)
29
+ super
30
+ export_instance_variable(:@attributes, subclass, &:dup)
31
+ end
27
32
  end
28
33
 
29
34
  def self.included(class_or_module)
@@ -15,11 +15,13 @@ module RgGen
15
15
  attr_reader :indent
16
16
 
17
17
  def <<(rhs)
18
- return push_string(rhs) if rhs.is_a?(String)
19
- return push_code_block(rhs) if rhs.is_a?(CodeBlock)
20
- return rhs.inject(self, :<<) if rhs.is_a?(Array)
21
- return self << rhs.to_code if rhs.respond_to?(:to_code)
22
- push_word(rhs)
18
+ case rhs
19
+ when String then push_string(rhs)
20
+ when CodeBlock then push_code_block(rhs)
21
+ when Array then rhs.inject(self, :<<)
22
+ when code? then self << rhs.to_code
23
+ else push_word(rhs)
24
+ end
23
25
  end
24
26
 
25
27
  def indent=(indent)
@@ -74,6 +76,10 @@ module RgGen
74
76
  self
75
77
  end
76
78
 
79
+ def code?
80
+ ->(rhs) { rhs.respond_to?(:to_code) }
81
+ end
82
+
77
83
  def newline
78
84
  "\n"
79
85
  end
@@ -4,14 +4,41 @@ module RgGen
4
4
  module Core
5
5
  module Utility
6
6
  module ErrorUtility
7
- module_function
7
+ class MessageComposer
8
+ def compose(error, verbose, backtrace)
9
+ lines = []
10
+ add_basic_info(error, lines)
11
+ add_verbose_info(error, lines) if verbose
12
+ add_backtrace(error, lines) if backtrace
13
+ lines.join("\n")
14
+ end
15
+
16
+ private
17
+
18
+ def add_basic_info(error, lines)
19
+ lines << "[#{error.class.lastname}] #{error}"
20
+ end
21
+
22
+ def add_verbose_info(error, lines)
23
+ return unless error.respond_to?(:verbose_info)
24
+ return unless error.verbose_info
25
+
26
+ lines << 'verbose information:'
27
+ error
28
+ .verbose_info.lines(chomp: true)
29
+ .each { |info| lines << " #{info}" }
30
+ end
8
31
 
9
- def compose_error_message(error, verbose)
10
- lines = []
11
- lines << "[#{error.class.lastname}] #{error.message}"
12
- verbose &&
32
+ def add_backtrace(error, lines)
33
+ lines << 'backtrace:'
13
34
  error.backtrace.each { |trace| lines << " #{trace}" }
14
- lines.join("\n")
35
+ end
36
+ end
37
+
38
+ module_function
39
+
40
+ def compose_error_message(error, verbose, backtrace)
41
+ MessageComposer.new.compose(error, verbose, backtrace)
15
42
  end
16
43
  end
17
44
  end
@@ -2,9 +2,7 @@
2
2
 
3
3
  module RgGen
4
4
  module Core
5
- MAJOR = 0
6
- MINOR = 21
7
- PATCH = 0
8
- VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
5
+ VERSION = '0.25.0'
6
+ MAJOR, MINOR, PATCH = VERSION.split('.').map(&:to_i)
9
7
  end
10
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rggen-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0
4
+ version: 0.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taichi Ishitani
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-22 00:00:00.000000000 Z
11
+ date: 2021-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docile
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.1.5
20
+ - - "!="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.3.3
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,9 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: 1.1.5
30
+ - - "!="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.3.3
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: erubi
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +58,20 @@ dependencies:
52
58
  - - ">="
53
59
  - !ruby/object:Gem::Version
54
60
  version: '3.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: tomlrb
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '2.0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
55
75
  - !ruby/object:Gem::Dependency
56
76
  name: bundler
57
77
  requirement: !ruby/object:Gem::Requirement
@@ -86,7 +106,6 @@ files:
86
106
  - lib/rggen/core/base/feature_factory.rb
87
107
  - lib/rggen/core/base/feature_layer_extension.rb
88
108
  - lib/rggen/core/base/internal_struct.rb
89
- - lib/rggen/core/base/proxy_call.rb
90
109
  - lib/rggen/core/base/shared_context.rb
91
110
  - lib/rggen/core/builder.rb
92
111
  - lib/rggen/core/builder/builder.rb
@@ -98,7 +117,8 @@ files:
98
117
  - lib/rggen/core/builder/list_feature_entry.rb
99
118
  - lib/rggen/core/builder/loader_registry.rb
100
119
  - lib/rggen/core/builder/output_component_registry.rb
101
- - lib/rggen/core/builder/plugins.rb
120
+ - lib/rggen/core/builder/plugin_manager.rb
121
+ - lib/rggen/core/builder/plugin_spec.rb
102
122
  - lib/rggen/core/builder/simple_feature_entry.rb
103
123
  - lib/rggen/core/cli.rb
104
124
  - lib/rggen/core/configuration.rb
@@ -112,6 +132,7 @@ files:
112
132
  - lib/rggen/core/configuration/json_loader.rb
113
133
  - lib/rggen/core/configuration/loader.rb
114
134
  - lib/rggen/core/configuration/ruby_loader.rb
135
+ - lib/rggen/core/configuration/toml_loader.rb
115
136
  - lib/rggen/core/configuration/yaml_loader.rb
116
137
  - lib/rggen/core/core_extensions/object.rb
117
138
  - lib/rggen/core/dsl.rb
@@ -129,18 +150,22 @@ files:
129
150
  - lib/rggen/core/input_base/json_loader.rb
130
151
  - lib/rggen/core/input_base/loader.rb
131
152
  - lib/rggen/core/input_base/property.rb
153
+ - lib/rggen/core/input_base/toml_loader.rb
132
154
  - lib/rggen/core/input_base/verifier.rb
133
155
  - lib/rggen/core/input_base/yaml_loader.rb
134
156
  - lib/rggen/core/options.rb
135
157
  - lib/rggen/core/output_base/code_generator.rb
136
158
  - lib/rggen/core/output_base/component.rb
137
159
  - lib/rggen/core/output_base/component_factory.rb
160
+ - lib/rggen/core/output_base/document_component_factory.rb
138
161
  - lib/rggen/core/output_base/erb_engine.rb
139
162
  - lib/rggen/core/output_base/feature.rb
140
163
  - lib/rggen/core/output_base/feature_factory.rb
141
164
  - lib/rggen/core/output_base/file_writer.rb
142
165
  - lib/rggen/core/output_base/raise_error.rb
166
+ - lib/rggen/core/output_base/source_file_component_factory.rb
143
167
  - lib/rggen/core/output_base/template_engine.rb
168
+ - lib/rggen/core/plugin.rb
144
169
  - lib/rggen/core/printers.rb
145
170
  - lib/rggen/core/register_map.rb
146
171
  - lib/rggen/core/register_map/component.rb
@@ -153,6 +178,7 @@ files:
153
178
  - lib/rggen/core/register_map/json_loader.rb
154
179
  - lib/rggen/core/register_map/loader.rb
155
180
  - lib/rggen/core/register_map/ruby_loader.rb
181
+ - lib/rggen/core/register_map/toml_loader.rb
156
182
  - lib/rggen/core/register_map/yaml_loader.rb
157
183
  - lib/rggen/core/utility/attribute_setter.rb
158
184
  - lib/rggen/core/utility/code_utility.rb
@@ -179,15 +205,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
179
205
  requirements:
180
206
  - - ">="
181
207
  - !ruby/object:Gem::Version
182
- version: '2.4'
208
+ version: '2.5'
183
209
  required_rubygems_version: !ruby/object:Gem::Requirement
184
210
  requirements:
185
211
  - - ">="
186
212
  - !ruby/object:Gem::Version
187
213
  version: '0'
188
214
  requirements: []
189
- rubygems_version: 3.1.2
215
+ rubygems_version: 3.2.3
190
216
  signing_key:
191
217
  specification_version: 4
192
- summary: rggen-core-0.21.0
218
+ summary: rggen-core-0.25.0
193
219
  test_files: []