rggen-core 0.18.0 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -2
  4. data/exe/rggen +2 -2
  5. data/lib/rggen/core.rb +7 -5
  6. data/lib/rggen/core/base/component.rb +16 -7
  7. data/lib/rggen/core/base/component_factory.rb +12 -9
  8. data/lib/rggen/core/base/component_layer_extension.rb +194 -0
  9. data/lib/rggen/core/base/feature_layer_extension.rb +158 -0
  10. data/lib/rggen/core/builder/builder.rb +38 -52
  11. data/lib/rggen/core/builder/component_entry.rb +3 -2
  12. data/lib/rggen/core/builder/component_registry.rb +22 -17
  13. data/lib/rggen/core/builder/input_component_registry.rb +43 -10
  14. data/lib/rggen/core/builder/{category.rb → layer.rb} +27 -26
  15. data/lib/rggen/core/builder/loader_registry.rb +48 -0
  16. data/lib/rggen/core/builder/plugin_manager.rb +140 -0
  17. data/lib/rggen/core/configuration.rb +3 -2
  18. data/lib/rggen/core/configuration/component.rb +5 -0
  19. data/lib/rggen/core/configuration/component_factory.rb +1 -1
  20. data/lib/rggen/core/configuration/hash_loader.rb +4 -2
  21. data/lib/rggen/core/configuration/input_data.rb +15 -0
  22. data/lib/rggen/core/dsl.rb +3 -1
  23. data/lib/rggen/core/exceptions.rb +9 -4
  24. data/lib/rggen/core/generator.rb +3 -3
  25. data/lib/rggen/core/input_base/component_factory.rb +37 -6
  26. data/lib/rggen/core/input_base/feature.rb +4 -4
  27. data/lib/rggen/core/input_base/input_data.rb +13 -10
  28. data/lib/rggen/core/input_base/input_matcher.rb +15 -16
  29. data/lib/rggen/core/input_base/input_value_extractor.rb +34 -0
  30. data/lib/rggen/core/input_base/loader.rb +64 -21
  31. data/lib/rggen/core/input_base/yaml_loader.rb +22 -17
  32. data/lib/rggen/core/options.rb +18 -14
  33. data/lib/rggen/core/output_base/code_generator.rb +10 -23
  34. data/lib/rggen/core/output_base/component.rb +42 -39
  35. data/lib/rggen/core/output_base/component_factory.rb +4 -0
  36. data/lib/rggen/core/output_base/feature.rb +6 -7
  37. data/lib/rggen/core/printers.rb +11 -7
  38. data/lib/rggen/core/register_map.rb +6 -5
  39. data/lib/rggen/core/register_map/component.rb +4 -3
  40. data/lib/rggen/core/register_map/component_factory.rb +18 -1
  41. data/lib/rggen/core/register_map/feature.rb +2 -2
  42. data/lib/rggen/core/register_map/hash_loader.rb +61 -27
  43. data/lib/rggen/core/register_map/input_data.rb +30 -16
  44. data/lib/rggen/core/register_map/loader.rb +1 -1
  45. data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
  46. data/lib/rggen/core/utility/code_utility.rb +8 -2
  47. data/lib/rggen/core/utility/error_utility.rb +33 -6
  48. data/lib/rggen/core/version.rb +1 -1
  49. metadata +12 -10
  50. data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
  51. data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
  52. data/lib/rggen/core/builder/plugins.rb +0 -77
  53. data/lib/rggen/core/core_extensions/casecmp.rb +0 -12
@@ -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
@@ -6,14 +6,15 @@ module RgGen
6
6
  def self.setup(builder)
7
7
  builder.input_component_registry(:register_map) do
8
8
  register_component [
9
- :register_map, :register_block, :register, :bit_field
10
- ] do |category|
9
+ :root, :register_block, :register_file, :register, :bit_field
10
+ ] do |layer|
11
11
  component Component, ComponentFactory
12
- feature Feature, FeatureFactory if category != :register_map
12
+ feature Feature, FeatureFactory if layer != :root
13
13
  end
14
14
 
15
- base_loader Loader
16
- register_loaders [RubyLoader, JSONLoader, YAMLLoader]
15
+ register_loader :ruby, RubyLoader
16
+ register_loader :yaml, YAMLLoader
17
+ register_loader :json, JSONLoader
17
18
  end
18
19
  end
19
20
  end
@@ -4,15 +4,16 @@ module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
6
  class Component < InputBase::Component
7
- include Base::HierarchicalAccessors
7
+ include Base::ComponentLayerExtension
8
8
 
9
9
  attr_reader :configuration
10
10
 
11
11
  private
12
12
 
13
- def post_initialize(_parent, configuration)
13
+ def post_initialize(configuration)
14
14
  @configuration = configuration
15
- define_hierarchical_accessors
15
+ define_layer_methods
16
+ layer == :bit_field && need_no_children
16
17
  end
17
18
  end
18
19
  end
@@ -4,6 +4,8 @@ module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
6
  class ComponentFactory < InputBase::ComponentFactory
7
+ include RaiseError
8
+
7
9
  private
8
10
 
9
11
  def select_actual_sources(configuration, *_)
@@ -11,7 +13,22 @@ module RgGen
11
13
  end
12
14
 
13
15
  def create_input_data(&block)
14
- RegisterMapData.new(valid_value_lists, &block)
16
+ InputData.new(:root, valid_value_lists, &block)
17
+ end
18
+
19
+ def find_child_factory(_configuration, register_map)
20
+ component_factories[register_map.layer]
21
+ end
22
+
23
+ NO_CHILDREN_ERROR_MESSAGES = {
24
+ root: 'no register blocks are given',
25
+ register_block: 'neither register files nor registers are given',
26
+ register_file: 'neither register files nor registers are given',
27
+ register: 'no bit fields are given'
28
+ }.freeze
29
+
30
+ def raise_no_children_error(comoponent)
31
+ error(NO_CHILDREN_ERROR_MESSAGES[comoponent.layer])
15
32
  end
16
33
  end
17
34
  end
@@ -4,7 +4,7 @@ module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
6
  class Feature < InputBase::Feature
7
- include Base::HierarchicalFeatureAccessors
7
+ include Base::FeatureLayerExtension
8
8
  include RaiseError
9
9
 
10
10
  private
@@ -14,7 +14,7 @@ module RgGen
14
14
  end
15
15
 
16
16
  def post_initialize
17
- define_hierarchical_accessors
17
+ define_layer_methods
18
18
  end
19
19
  end
20
20
  end
@@ -4,42 +4,76 @@ module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
6
  module HashLoader
7
- def format(read_data, file)
8
- format_data(:register_map, register_map, read_data, file)
9
- rescue TypeError => e
10
- raise Core::LoadError.new(e.message, file)
11
- end
12
-
13
7
  private
14
8
 
15
- CHILD_HIERARCHY = {
16
- register_map: :register_block,
17
- register_block: :register,
18
- register: :bit_field
9
+ SUB_LAYER_KEYS = {
10
+ root: [:register_block, :register_blocks],
11
+ register_block: [:register_file, :register_files, :register, :registers],
12
+ register_file: [:register_file, :register_files, :register, :registers],
13
+ register: [:bit_field, :bit_fields]
19
14
  }.freeze
20
15
 
21
- CHILD_HIERARCHY_KEY = {
22
- register_map: :register_blocks,
23
- register_block: :registers,
24
- register: :bit_fields
16
+ SUB_LAYER_KEY_MAP = {
17
+ root: { register_blocks: :register_block },
18
+ register_block: { register_files: :register_file, registers: :register },
19
+ register_file: { register_files: :register_file, registers: :register },
20
+ register: { bit_fields: :bit_field }
25
21
  }.freeze
26
22
 
27
- def format_data(hierarchy, input_data, read_data, file)
28
- read_data = Hash(read_data)
29
- input_data.values(read_data, file)
30
- read_data_for_child(hierarchy, read_data).each do |data|
31
- format_data(
32
- CHILD_HIERARCHY[hierarchy],
33
- input_data.child,
34
- data,
35
- file
36
- )
23
+ def format_layer_data(read_data, layer, file)
24
+ if read_data.is_a?(Array)
25
+ format_array_layer_data(read_data, layer, file)
26
+ else
27
+ fomrat_hash_layer_data(read_data, layer, file)
28
+ end
29
+ end
30
+
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
35
+ end
36
+
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) }
40
+ end
41
+
42
+ def format_sub_layer_data(read_data, layer, file)
43
+ if read_data.is_a?(Array)
44
+ format_array_sub_layer_data(read_data, layer, file)
45
+ else
46
+ format_hash_sub_layer_data(read_data, layer, file)
47
+ end
48
+ end
49
+
50
+ def format_array_sub_layer_data(read_data, layer, file)
51
+ read_data.each_with_object({}) do |data, sub_layer_data|
52
+ format_hash_sub_layer_data(data, layer, file, sub_layer_data)
37
53
  end
38
54
  end
39
55
 
40
- def read_data_for_child(hierarchy, read_data)
41
- key = CHILD_HIERARCHY_KEY[hierarchy]
42
- Array(key && read_data[key])
56
+ def format_hash_sub_layer_data(read_data, layer, file, sub_layer_data = {})
57
+ 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
62
+ sub_layer_data
63
+ end
64
+
65
+ def merge_sub_layer_data(sub_layer_data, layer, key, value)
66
+ if SUB_LAYER_KEY_MAP[layer].key?(key)
67
+ (sub_layer_data[SUB_LAYER_KEY_MAP[layer][key]] ||= []).concat(value)
68
+ else
69
+ (sub_layer_data[key] ||= []) << value
70
+ end
71
+ end
72
+
73
+ def convert_to_hash(read_data, file)
74
+ Hash(read_data)
75
+ rescue TypeError => e
76
+ raise Core::LoadError.new(e.message, file)
43
77
  end
44
78
  end
45
79
  end
@@ -3,30 +3,44 @@
3
3
  module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
- class BitFieldData < InputBase::InputData
7
- end
6
+ class InputData < InputBase::InputData
7
+ module Root
8
+ def register_block(value_list = nil, &block)
9
+ child(:register_block, value_list, &block)
10
+ end
11
+ end
8
12
 
9
- class RegisterData < InputBase::InputData
10
- alias_method :bit_field, :child
13
+ module RegisterBlockRegisterFile
14
+ def register_file(value_list = nil, &block)
15
+ child(:register_file, value_list, &block)
16
+ end
11
17
 
12
- def child_data_class
13
- BitFieldData
18
+ def register(value_list = nil, &block)
19
+ child(:register, value_list, &block)
20
+ end
14
21
  end
15
- end
16
22
 
17
- class RegisterBlockData < InputBase::InputData
18
- alias_method :register, :child
23
+ module Register
24
+ def bit_field(value_list = nil, &block)
25
+ child(:bit_field, value_list, &block)
26
+ end
27
+ end
19
28
 
20
- def child_data_class
21
- RegisterData
29
+ module BitField
30
+ def self.extended(object)
31
+ object.singleton_exec { undef_method :child }
32
+ end
22
33
  end
23
- end
24
34
 
25
- class RegisterMapData < InputBase::InputData
26
- alias_method :register_block, :child
35
+ LAYER_EXTENSIONS = {
36
+ root: Root, register_block: RegisterBlockRegisterFile,
37
+ register_file: RegisterBlockRegisterFile, register: Register,
38
+ bit_field: BitField
39
+ }.freeze
27
40
 
28
- def child_data_class
29
- RegisterBlockData
41
+ def initialize(layer, valid_value_list)
42
+ extend(LAYER_EXTENSIONS[layer])
43
+ super
30
44
  end
31
45
  end
32
46
  end
@@ -6,7 +6,7 @@ module RgGen
6
6
  class Loader < InputBase::Loader
7
7
  private
8
8
 
9
- def register_map
9
+ def root
10
10
  input_data
11
11
  end
12
12
  end
@@ -7,7 +7,7 @@ module RgGen
7
7
  support_types [:rb]
8
8
 
9
9
  def read_file(file)
10
- register_map.load_file(file)
10
+ root.load_file(file)
11
11
  end
12
12
  end
13
13
  end
@@ -8,13 +8,15 @@ module RgGen
8
8
  code_block
9
9
  end
10
10
 
11
- private
11
+ module_function
12
12
 
13
13
  def newline
14
14
  "\n"
15
15
  end
16
16
 
17
- alias_method :nl, :newline
17
+ def nl
18
+ newline
19
+ end
18
20
 
19
21
  def comma
20
22
  ','
@@ -36,6 +38,10 @@ module RgGen
36
38
  "\"#{expression}\""
37
39
  end
38
40
 
41
+ def array_name(name, size)
42
+ [name, *size&.map { |s| "[#{s}]" }].join
43
+ end
44
+
39
45
  def code_block(indent = 0, &body)
40
46
  CodeBlock.new(indent, &body)
41
47
  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
@@ -3,7 +3,7 @@
3
3
  module RgGen
4
4
  module Core
5
5
  MAJOR = 0
6
- MINOR = 18
6
+ MINOR = 23
7
7
  PATCH = 0
8
8
  VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
9
9
  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.18.0
4
+ version: 0.23.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: 2019-11-19 00:00:00.000000000 Z
11
+ date: 2020-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docile
@@ -81,23 +81,24 @@ files:
81
81
  - lib/rggen/core.rb
82
82
  - lib/rggen/core/base/component.rb
83
83
  - lib/rggen/core/base/component_factory.rb
84
+ - lib/rggen/core/base/component_layer_extension.rb
84
85
  - lib/rggen/core/base/feature.rb
85
86
  - lib/rggen/core/base/feature_factory.rb
86
- - lib/rggen/core/base/hierarchical_accessors.rb
87
- - lib/rggen/core/base/hierarchical_feature_accessors.rb
87
+ - lib/rggen/core/base/feature_layer_extension.rb
88
88
  - lib/rggen/core/base/internal_struct.rb
89
89
  - lib/rggen/core/base/proxy_call.rb
90
90
  - lib/rggen/core/base/shared_context.rb
91
91
  - lib/rggen/core/builder.rb
92
92
  - lib/rggen/core/builder/builder.rb
93
- - lib/rggen/core/builder/category.rb
94
93
  - lib/rggen/core/builder/component_entry.rb
95
94
  - lib/rggen/core/builder/component_registry.rb
96
95
  - lib/rggen/core/builder/feature_registry.rb
97
96
  - lib/rggen/core/builder/input_component_registry.rb
97
+ - lib/rggen/core/builder/layer.rb
98
98
  - lib/rggen/core/builder/list_feature_entry.rb
99
+ - lib/rggen/core/builder/loader_registry.rb
99
100
  - lib/rggen/core/builder/output_component_registry.rb
100
- - lib/rggen/core/builder/plugins.rb
101
+ - lib/rggen/core/builder/plugin_manager.rb
101
102
  - lib/rggen/core/builder/simple_feature_entry.rb
102
103
  - lib/rggen/core/cli.rb
103
104
  - lib/rggen/core/configuration.rb
@@ -107,11 +108,11 @@ files:
107
108
  - lib/rggen/core/configuration/feature.rb
108
109
  - lib/rggen/core/configuration/feature_factory.rb
109
110
  - lib/rggen/core/configuration/hash_loader.rb
111
+ - lib/rggen/core/configuration/input_data.rb
110
112
  - lib/rggen/core/configuration/json_loader.rb
111
113
  - lib/rggen/core/configuration/loader.rb
112
114
  - lib/rggen/core/configuration/ruby_loader.rb
113
115
  - lib/rggen/core/configuration/yaml_loader.rb
114
- - lib/rggen/core/core_extensions/casecmp.rb
115
116
  - lib/rggen/core/core_extensions/object.rb
116
117
  - lib/rggen/core/dsl.rb
117
118
  - lib/rggen/core/exceptions.rb
@@ -124,6 +125,7 @@ files:
124
125
  - lib/rggen/core/input_base/input_data.rb
125
126
  - lib/rggen/core/input_base/input_matcher.rb
126
127
  - lib/rggen/core/input_base/input_value.rb
128
+ - lib/rggen/core/input_base/input_value_extractor.rb
127
129
  - lib/rggen/core/input_base/json_loader.rb
128
130
  - lib/rggen/core/input_base/loader.rb
129
131
  - lib/rggen/core/input_base/property.rb
@@ -177,15 +179,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
179
  requirements:
178
180
  - - ">="
179
181
  - !ruby/object:Gem::Version
180
- version: '2.3'
182
+ version: '2.4'
181
183
  required_rubygems_version: !ruby/object:Gem::Requirement
182
184
  requirements:
183
185
  - - ">="
184
186
  - !ruby/object:Gem::Version
185
187
  version: '0'
186
188
  requirements: []
187
- rubygems_version: 3.0.3
189
+ rubygems_version: 3.1.2
188
190
  signing_key:
189
191
  specification_version: 4
190
- summary: rggen-core-0.18.0
192
+ summary: rggen-core-0.23.0
191
193
  test_files: []