rggen-core 0.16.0 → 0.21.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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -2
  4. data/exe/rggen +0 -0
  5. data/lib/rggen/core.rb +6 -4
  6. data/lib/rggen/core/base/component.rb +18 -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 +33 -35
  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/plugins.rb +5 -3
  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/input_base/component_factory.rb +37 -6
  23. data/lib/rggen/core/input_base/feature.rb +9 -5
  24. data/lib/rggen/core/input_base/input_data.rb +13 -10
  25. data/lib/rggen/core/input_base/input_matcher.rb +15 -16
  26. data/lib/rggen/core/input_base/input_value_extractor.rb +34 -0
  27. data/lib/rggen/core/input_base/loader.rb +64 -21
  28. data/lib/rggen/core/input_base/verifier.rb +6 -7
  29. data/lib/rggen/core/input_base/yaml_loader.rb +22 -17
  30. data/lib/rggen/core/output_base/code_generator.rb +10 -23
  31. data/lib/rggen/core/output_base/component.rb +42 -39
  32. data/lib/rggen/core/output_base/component_factory.rb +4 -0
  33. data/lib/rggen/core/output_base/feature.rb +6 -7
  34. data/lib/rggen/core/printers.rb +2 -2
  35. data/lib/rggen/core/register_map.rb +6 -5
  36. data/lib/rggen/core/register_map/component.rb +4 -3
  37. data/lib/rggen/core/register_map/component_factory.rb +18 -1
  38. data/lib/rggen/core/register_map/feature.rb +2 -2
  39. data/lib/rggen/core/register_map/hash_loader.rb +61 -27
  40. data/lib/rggen/core/register_map/input_data.rb +30 -16
  41. data/lib/rggen/core/register_map/loader.rb +1 -1
  42. data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
  43. data/lib/rggen/core/utility/code_utility.rb +8 -2
  44. data/lib/rggen/core/version.rb +1 -1
  45. metadata +11 -9
  46. data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
  47. data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
  48. data/lib/rggen/core/core_extensions/casecmp.rb +0 -12
@@ -6,7 +6,7 @@ module RgGen
6
6
  class Builder
7
7
  def initialize
8
8
  initialize_component_registries
9
- initialize_categories
9
+ initialize_layers
10
10
  @plugins = Plugins.new
11
11
  end
12
12
 
@@ -20,27 +20,25 @@ module RgGen
20
20
  component_registry(:output, name, body)
21
21
  end
22
22
 
23
- def register_loader(component, loader)
24
- @component_registries[:input][component].register_loader(loader)
25
- end
26
-
27
- def register_loaders(component, loaders)
28
- @component_registries[:input][component].register_loaders(loaders)
29
- end
30
-
31
- def define_loader(component, &body)
32
- @component_registries[:input][component].define_loader(&body)
23
+ [
24
+ :register_loader, :register_loaders,
25
+ :define_value_extractor, :ignore_value, :ignore_values
26
+ ].each do |method_name|
27
+ define_method(method_name) do |component, *args, &block|
28
+ @component_registries[:input][component]
29
+ .__send__(__method__, *args, &block)
30
+ end
33
31
  end
34
32
 
35
- def add_feature_registry(name, target_category, registry)
36
- target_categories =
37
- if target_category
38
- Array(@categories[target_category])
33
+ def add_feature_registry(name, target_layer, registry)
34
+ target_layers =
35
+ if target_layer
36
+ Array(@layers[target_layer])
39
37
  else
40
- @categories.values
38
+ @layers.values
41
39
  end
42
- target_categories.each do |category|
43
- category.add_feature_registry(name, registry)
40
+ target_layers.each do |layer|
41
+ layer.add_feature_registry(name, registry)
44
42
  end
45
43
  end
46
44
 
@@ -49,21 +47,21 @@ module RgGen
49
47
  :define_list_feature,
50
48
  :define_list_item_feature
51
49
  ].each do |method_name|
52
- define_method(method_name) do |category, *args, &body|
53
- @categories[category].__send__(__method__, *args, &body)
50
+ define_method(method_name) do |layer, *args, &body|
51
+ @layers[layer].__send__(__method__, *args, &body)
54
52
  end
55
53
  end
56
54
 
57
- def enable(category, *args)
58
- @categories[category].enable(*args)
55
+ def enable(layer, *args)
56
+ @layers[layer].enable(*args)
59
57
  end
60
58
 
61
59
  def disable_all
62
- @categories.each_value(&:disable)
60
+ @layers.each_value(&:disable)
63
61
  end
64
62
 
65
- def disable(category, *args)
66
- @categories.key?(category) && @categories[category].disable(*args)
63
+ def disable(layer, *args)
64
+ @layers.key?(layer) && @layers[layer].disable(*args)
67
65
  end
68
66
 
69
67
  def build_factory(type, component)
@@ -81,8 +79,8 @@ module RgGen
81
79
  registries.each_value.map(&:build_factory)
82
80
  end
83
81
 
84
- def delete(category, *args)
85
- @categories.key?(category) && @categories[category].delete(*args)
82
+ def delete(layer, *args)
83
+ @layers.key?(layer) && @layers[layer].delete(*args)
86
84
  end
87
85
 
88
86
  def register_input_components
@@ -94,8 +92,8 @@ module RgGen
94
92
  plugins.add(name, module_or_version, &block)
95
93
  end
96
94
 
97
- def activate_plugins
98
- plugins.activate(self)
95
+ def activate_plugins(**options)
96
+ plugins.activate(self, **options)
99
97
  end
100
98
 
101
99
  def load_setup_file(file, activation = true)
@@ -119,14 +117,14 @@ module RgGen
119
117
  end
120
118
  end
121
119
 
122
- def initialize_categories
123
- @categories = Hash.new do |_, category_name|
124
- raise BuilderError.new("unknown category: #{category_name}")
120
+ def initialize_layers
121
+ @layers = Hash.new do |_, layer_name|
122
+ raise BuilderError.new("unknown layer: #{layer_name}")
125
123
  end
126
124
  [
127
- :global, :register_map, :register_block, :register, :bit_field
128
- ].each do |category|
129
- @categories[category] = Category.new(category)
125
+ :global, :root, :register_block, :register_file, :register, :bit_field
126
+ ].each do |layer|
127
+ @layers[layer] = Layer.new(layer)
130
128
  end
131
129
  end
132
130
 
@@ -6,8 +6,9 @@ module RgGen
6
6
  class ComponentEntry
7
7
  Entry = Struct.new(:target, :factory)
8
8
 
9
- def initialize(component_name)
9
+ def initialize(component_name, layer)
10
10
  @component_name = component_name
11
+ @layer = layer
11
12
  end
12
13
 
13
14
  [:component, :feature].each do |entry_name|
@@ -22,7 +23,7 @@ module RgGen
22
23
  end
23
24
 
24
25
  def build_factory
25
- @component.factory.new(@component_name) do |f|
26
+ @component.factory.new(@component_name, @layer) do |f|
26
27
  f.target_component(@component.target)
27
28
  f.feature_factories(feature_registry&.build_factories)
28
29
  end
@@ -10,10 +10,10 @@ module RgGen
10
10
  @entries = []
11
11
  end
12
12
 
13
- def register_component(categories = nil, &block)
14
- if categories
15
- Array(categories).each do |category|
16
- @entries << create_new_entry(category, block)
13
+ def register_component(layers = nil, &block)
14
+ if layers
15
+ Array(layers).each do |layer|
16
+ @entries << create_new_entry(layer, block)
17
17
  end
18
18
  else
19
19
  @entries << create_new_entry(nil, block)
@@ -21,26 +21,31 @@ module RgGen
21
21
  end
22
22
 
23
23
  def build_factory
24
- factories = @entries.map(&:build_factory)
25
- factories.each_cons(2) { |(f0, f1)| f0.child_factory(f1) }
26
- root_factory = factories.first
27
- root_factory.root_factory
28
- root_factory
24
+ build_factories.first.tap(&:root_factory)
29
25
  end
30
26
 
31
27
  private
32
28
 
33
- def create_new_entry(category, block)
34
- entry = ComponentEntry.new(@component_name)
35
- Docile.dsl_eval(entry, category, &block)
36
- add_feature_registry(category, entry.feature_registry)
29
+ def create_new_entry(layer, block)
30
+ entry = ComponentEntry.new(@component_name, layer)
31
+ Docile.dsl_eval(entry, layer, &block)
32
+ add_feature_registry(layer, entry.feature_registry)
37
33
  entry
38
34
  end
39
35
 
40
- def add_feature_registry(category, feature_registry)
41
- feature_registry || return
42
- @builder
43
- .add_feature_registry(@component_name, category, feature_registry)
36
+ def add_feature_registry(layer, feature_registry)
37
+ feature_registry &&
38
+ @builder
39
+ .add_feature_registry(@component_name, layer, feature_registry)
40
+ end
41
+
42
+ def build_factories
43
+ factories =
44
+ @entries
45
+ .map(&:build_factory)
46
+ .map { |f| [f.layer, f] }.to_h
47
+ factories.each_value { |f| f.component_factories factories }
48
+ factories.values
44
49
  end
45
50
  end
46
51
  end
@@ -6,29 +6,62 @@ module RgGen
6
6
  class InputComponentRegistry < ComponentRegistry
7
7
  def initialize(name, builder)
8
8
  super
9
- @loaders = []
9
+ @loader_registries = {}
10
10
  end
11
11
 
12
- attr_setter :base_loader
12
+ def register_loader(loader_type, loader)
13
+ loader_registry(loader_type).register_loader(loader)
14
+ end
15
+
16
+ def register_loaders(loader_type, loaders)
17
+ loader_registry(loader_type).register_loaders(loaders)
18
+ end
13
19
 
14
- def register_loader(loader)
15
- @loaders << loader
20
+ def define_value_extractor(loader_type, layers_or_value, value = nil, &body)
21
+ layers, value =
22
+ if value
23
+ [layers_or_value, value]
24
+ else
25
+ [nil, layers_or_value]
26
+ end
27
+ loader_registry(loader_type).define_value_extractor(layers, value, &body)
16
28
  end
17
29
 
18
- def register_loaders(loaders)
19
- @loaders.concat(Array(loaders))
30
+ def ignore_value(loader_type, layers_or_value, value = nil)
31
+ layers, value =
32
+ if value
33
+ [layers_or_value, value]
34
+ else
35
+ [nil, layers_or_value]
36
+ end
37
+ loader_registry(loader_type).ignore_value(layers, value)
20
38
  end
21
39
 
22
- def define_loader(&body)
23
- loader = Class.new(@base_loader, &body)
24
- register_loader(loader)
40
+ def ignore_values(loader_type, layers_or_values, values = nil)
41
+ layers, values =
42
+ if values
43
+ [layers_or_values, values]
44
+ else
45
+ [nil, layers_or_values]
46
+ end
47
+ loader_registry(loader_type).ignore_values(layers, values)
25
48
  end
26
49
 
27
50
  def build_factory
28
51
  factory = super
29
- factory.loaders(@loaders)
52
+ factory.loaders(build_loaders)
30
53
  factory
31
54
  end
55
+
56
+ private
57
+
58
+ def loader_registry(loader_type)
59
+ @loader_registries[loader_type] ||= LoaderRegistry.new
60
+ end
61
+
62
+ def build_loaders
63
+ @loader_registries.values.flat_map(&:create_loaders)
64
+ end
32
65
  end
33
66
  end
34
67
  end
@@ -3,13 +3,14 @@
3
3
  module RgGen
4
4
  module Core
5
5
  module Builder
6
- class Category
6
+ class Layer
7
7
  class Proxy
8
- def initialize(body)
9
- body.call(self)
8
+ def initialize
9
+ block_given? && yield(self)
10
10
  end
11
11
 
12
- attr_setter :method
12
+ attr_setter :body
13
+ attr_setter :method_name
13
14
  attr_setter :list_names
14
15
  attr_setter :feature_names
15
16
 
@@ -21,25 +22,22 @@ module RgGen
21
22
  @shared_context
22
23
  end
23
24
 
24
- def register_execution(registry, args, body)
25
+ def register_execution(registry, &body)
25
26
  @executions ||= []
26
- @executions << { registry: registry, args: args, body: body }
27
+ @executions << { registry: registry, body: body }
27
28
  end
28
29
 
29
- def execute(category, body)
30
- Docile.dsl_eval(category, &body)
31
- Array(@executions).each { |execution| call_execution(execution) }
30
+ def execute(layer)
31
+ Docile.dsl_eval(layer, &body)
32
+ @executions&.each(&method(:call_execution))
32
33
  end
33
34
 
34
35
  private
35
36
 
36
37
  def call_execution(execution)
37
- send_args = [
38
- list_names, feature_names, shared_context, *execution[:args]
39
- ].compact
40
- execution[:registry].__send__(
41
- method, *send_args, &execution[:body]
42
- )
38
+ args = [list_names, feature_names, shared_context].compact
39
+ execution[:registry]
40
+ .__send__(method_name, *args, &execution[:body])
43
41
  end
44
42
  end
45
43
 
@@ -58,22 +56,25 @@ module RgGen
58
56
  end
59
57
 
60
58
  def define_simple_feature(feature_names, &body)
61
- do_proxy_call(body) do |proxy|
62
- proxy.method(__method__)
59
+ do_proxy_call do |proxy|
60
+ proxy.body(body)
61
+ proxy.method_name(__method__)
63
62
  proxy.feature_names(feature_names)
64
63
  end
65
64
  end
66
65
 
67
66
  def define_list_feature(list_names, &body)
68
- do_proxy_call(body) do |proxy|
69
- proxy.method(__method__)
67
+ do_proxy_call do |proxy|
68
+ proxy.body(body)
69
+ proxy.method_name(__method__)
70
70
  proxy.list_names(list_names)
71
71
  end
72
72
  end
73
73
 
74
74
  def define_list_item_feature(list_name, feature_names, &body)
75
- do_proxy_call(body) do |proxy|
76
- proxy.method(__method__)
75
+ do_proxy_call do |proxy|
76
+ proxy.body(body)
77
+ proxy.method_name(__method__)
77
78
  proxy.list_names(list_name)
78
79
  proxy.feature_names(feature_names)
79
80
  end
@@ -100,14 +101,14 @@ module RgGen
100
101
  private
101
102
 
102
103
  def define_proxy_call(name)
103
- define_singleton_method(name) do |*args, &body|
104
- @proxy.register_execution(@feature_registries[name], args, body)
104
+ define_singleton_method(name) do |&body|
105
+ @proxy.register_execution(@feature_registries[__method__], &body)
105
106
  end
106
107
  end
107
108
 
108
- def do_proxy_call(body, &proxy_block)
109
- @proxy = Proxy.new(proxy_block)
110
- @proxy.execute(self, body)
109
+ def do_proxy_call(&block)
110
+ @proxy = Proxy.new(&block)
111
+ @proxy.execute(self)
111
112
  remove_instance_variable(:@proxy)
112
113
  end
113
114
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module Builder
6
+ class LoaderRegistry
7
+ def initialize
8
+ @loaders = []
9
+ @extractors = []
10
+ @ignore_values = {}
11
+ end
12
+
13
+ def register_loader(loader)
14
+ register_loaders([loader])
15
+ end
16
+
17
+ def register_loaders(loaders)
18
+ @loaders.concat(Array(loaders))
19
+ end
20
+
21
+ def define_value_extractor(layers, value, &body)
22
+ @extractors <<
23
+ create_extractor(layers, value, &body)
24
+ end
25
+
26
+ def ignore_value(layers, value)
27
+ ignore_values(layers, [value])
28
+ end
29
+
30
+ def ignore_values(layers, values)
31
+ [layers].flatten.each do |layer|
32
+ (@ignore_values[layer] ||= []).concat(Array(values))
33
+ end
34
+ end
35
+
36
+ def create_loaders
37
+ @loaders.map { |loader| loader.new(@extractors, @ignore_values) }
38
+ end
39
+
40
+ private
41
+
42
+ def create_extractor(layers, value, &body)
43
+ Class.new(Core::InputBase::InputValueExtractor, &body).new(layers, value)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -63,9 +63,11 @@ module RgGen
63
63
  @plugins << Plugin.new(name, module_or_version, &block)
64
64
  end
65
65
 
66
- def activate(builder)
67
- @plugins.each { |plugin| plugin.default_setup(builder) }
68
- @plugins.each { |plugin| plugin.optional_setup(builder) }
66
+ def activate(builder, **options)
67
+ options[:no_default_setup] ||
68
+ @plugins.each { |plugin| plugin.default_setup(builder) }
69
+ options[:no_optional_setup] ||
70
+ @plugins.each { |plugin| plugin.optional_setup(builder) }
69
71
  end
70
72
 
71
73
  def version_info
@@ -10,8 +10,9 @@ module RgGen
10
10
  feature Feature, FeatureFactory
11
11
  end
12
12
 
13
- base_loader Loader
14
- register_loaders [RubyLoader, JSONLoader, YAMLLoader]
13
+ register_loader :ruby, RubyLoader
14
+ register_loader :yaml, YAMLLoader
15
+ register_loader :json, JSONLoader
15
16
  end
16
17
  end
17
18
  end