rggen-core 0.19.0 → 0.23.1

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/exe/rggen +2 -2
  3. data/lib/rggen/core.rb +7 -4
  4. data/lib/rggen/core/base/component.rb +16 -7
  5. data/lib/rggen/core/base/component_factory.rb +12 -9
  6. data/lib/rggen/core/base/component_layer_extension.rb +194 -0
  7. data/lib/rggen/core/base/feature_layer_extension.rb +158 -0
  8. data/lib/rggen/core/builder/builder.rb +38 -52
  9. data/lib/rggen/core/builder/component_entry.rb +3 -2
  10. data/lib/rggen/core/builder/component_registry.rb +22 -17
  11. data/lib/rggen/core/builder/feature_registry.rb +6 -9
  12. data/lib/rggen/core/builder/input_component_registry.rb +43 -10
  13. data/lib/rggen/core/builder/layer.rb +132 -0
  14. data/lib/rggen/core/builder/loader_registry.rb +48 -0
  15. data/lib/rggen/core/builder/plugin_manager.rb +140 -0
  16. data/lib/rggen/core/configuration.rb +3 -2
  17. data/lib/rggen/core/configuration/component.rb +5 -0
  18. data/lib/rggen/core/configuration/component_factory.rb +1 -1
  19. data/lib/rggen/core/configuration/hash_loader.rb +4 -2
  20. data/lib/rggen/core/configuration/input_data.rb +15 -0
  21. data/lib/rggen/core/dsl.rb +3 -1
  22. data/lib/rggen/core/exceptions.rb +9 -4
  23. data/lib/rggen/core/generator.rb +3 -3
  24. data/lib/rggen/core/input_base/component_factory.rb +37 -6
  25. data/lib/rggen/core/input_base/feature.rb +3 -3
  26. data/lib/rggen/core/input_base/input_data.rb +13 -10
  27. data/lib/rggen/core/input_base/input_value_extractor.rb +34 -0
  28. data/lib/rggen/core/input_base/loader.rb +64 -21
  29. data/lib/rggen/core/input_base/yaml_loader.rb +5 -4
  30. data/lib/rggen/core/options.rb +18 -14
  31. data/lib/rggen/core/output_base/code_generator.rb +10 -23
  32. data/lib/rggen/core/output_base/component.rb +42 -39
  33. data/lib/rggen/core/output_base/component_factory.rb +4 -0
  34. data/lib/rggen/core/output_base/feature.rb +6 -7
  35. data/lib/rggen/core/printers.rb +11 -7
  36. data/lib/rggen/core/register_map.rb +6 -5
  37. data/lib/rggen/core/register_map/component.rb +4 -3
  38. data/lib/rggen/core/register_map/component_factory.rb +18 -1
  39. data/lib/rggen/core/register_map/feature.rb +2 -2
  40. data/lib/rggen/core/register_map/hash_loader.rb +61 -27
  41. data/lib/rggen/core/register_map/input_data.rb +30 -16
  42. data/lib/rggen/core/register_map/loader.rb +1 -1
  43. data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
  44. data/lib/rggen/core/utility/attribute_setter.rb +4 -0
  45. data/lib/rggen/core/utility/code_utility.rb +8 -2
  46. data/lib/rggen/core/utility/error_utility.rb +33 -6
  47. data/lib/rggen/core/version.rb +2 -2
  48. metadata +10 -7
  49. data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
  50. data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
  51. data/lib/rggen/core/builder/category.rb +0 -116
  52. data/lib/rggen/core/builder/plugins.rb +0 -77
@@ -4,13 +4,15 @@ module RgGen
4
4
  module Core
5
5
  module Builder
6
6
  class Builder
7
+ extend Forwardable
8
+
7
9
  def initialize
8
10
  initialize_component_registries
9
- initialize_categories
10
- @plugins = Plugins.new
11
+ initialize_layers
12
+ @plugin_manager = PluginManager.new(self)
11
13
  end
12
14
 
13
- attr_reader :plugins
15
+ attr_reader :plugin_manager
14
16
 
15
17
  def input_component_registry(name, &body)
16
18
  component_registry(:input, name, body)
@@ -20,27 +22,25 @@ module RgGen
20
22
  component_registry(:output, name, body)
21
23
  end
22
24
 
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)
25
+ [
26
+ :register_loader, :register_loaders,
27
+ :define_value_extractor, :ignore_value, :ignore_values
28
+ ].each do |method_name|
29
+ define_method(method_name) do |component, *args, &block|
30
+ @component_registries[:input][component]
31
+ .__send__(__method__, *args, &block)
32
+ end
33
33
  end
34
34
 
35
- def add_feature_registry(name, target_category, registry)
36
- target_categories =
37
- if target_category
38
- Array(@categories[target_category])
35
+ def add_feature_registry(name, target_layer, registry)
36
+ target_layers =
37
+ if target_layer
38
+ Array(@layers[target_layer])
39
39
  else
40
- @categories.values
40
+ @layers.values
41
41
  end
42
- target_categories.each do |category|
43
- category.add_feature_registry(name, registry)
42
+ target_layers.each do |layer|
43
+ layer.add_feature_registry(name, registry)
44
44
  end
45
45
  end
46
46
 
@@ -49,21 +49,21 @@ module RgGen
49
49
  :define_list_feature,
50
50
  :define_list_item_feature
51
51
  ].each do |method_name|
52
- define_method(method_name) do |category, *args, &body|
53
- @categories[category].__send__(__method__, *args, &body)
52
+ define_method(method_name) do |layer, *args, &body|
53
+ @layers[layer].__send__(__method__, *args, &body)
54
54
  end
55
55
  end
56
56
 
57
- def enable(category, *args)
58
- @categories[category].enable(*args)
57
+ def enable(layer, *args)
58
+ @layers[layer].enable(*args)
59
59
  end
60
60
 
61
61
  def disable_all
62
- @categories.each_value(&:disable)
62
+ @layers.each_value(&:disable)
63
63
  end
64
64
 
65
- def disable(category, *args)
66
- @categories.key?(category) && @categories[category].disable(*args)
65
+ def disable(layer, *args)
66
+ @layers.key?(layer) && @layers[layer].disable(*args)
67
67
  end
68
68
 
69
69
  def build_factory(type, component)
@@ -81,8 +81,8 @@ module RgGen
81
81
  registries.each_value.map(&:build_factory)
82
82
  end
83
83
 
84
- def delete(category, *args)
85
- @categories.key?(category) && @categories[category].delete(*args)
84
+ def delete(layer, *args)
85
+ @layers.key?(layer) && @layers[layer].delete(*args)
86
86
  end
87
87
 
88
88
  def register_input_components
@@ -90,23 +90,9 @@ module RgGen
90
90
  RegisterMap.setup(self)
91
91
  end
92
92
 
93
- def setup(name, module_or_version = nil, &block)
94
- plugins.add(name, module_or_version, &block)
95
- end
96
-
97
- def activate_plugins
98
- plugins.activate(self)
99
- end
100
-
101
- def load_setup_file(file, activation = true)
102
- (file.nil? || file.empty?) &&
103
- (raise Core::LoadError.new('no setup file is given'))
104
- File.readable?(file) ||
105
- (raise Core::LoadError.new("cannot load such setup file: #{file}"))
106
- RgGen.builder(self)
107
- load(file)
108
- activation && activate_plugins
109
- end
93
+ def_delegator :plugin_manager, :load_plugin
94
+ def_delegator :plugin_manager, :load_plugins
95
+ def_delegator :plugin_manager, :setup
110
96
 
111
97
  private
112
98
 
@@ -119,14 +105,14 @@ module RgGen
119
105
  end
120
106
  end
121
107
 
122
- def initialize_categories
123
- @categories = Hash.new do |_, category_name|
124
- raise BuilderError.new("unknown category: #{category_name}")
108
+ def initialize_layers
109
+ @layers = Hash.new do |_, layer_name|
110
+ raise BuilderError.new("unknown layer: #{layer_name}")
125
111
  end
126
112
  [
127
- :global, :register_map, :register_block, :register, :bit_field
128
- ].each do |category|
129
- @categories[category] = Category.new(category)
113
+ :global, :root, :register_block, :register_file, :register, :bit_field
114
+ ].each do |layer|
115
+ @layers[layer] = Layer.new(layer)
130
116
  end
131
117
  end
132
118
 
@@ -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
@@ -11,22 +11,19 @@ module RgGen
11
11
  @enabled_features = {}
12
12
  end
13
13
 
14
- def define_simple_feature(names, context = nil, &body)
15
- Array(names)
16
- .each { |name| create_new_entry(:simple, name, context, body) }
14
+ def define_simple_feature(name, context = nil, &body)
15
+ create_new_entry(:simple, name, context, body)
17
16
  end
18
17
 
19
- def define_list_feature(list_names, context = nil, &body)
20
- Array(list_names)
21
- .each { |name| create_new_entry(:list, name, context, body) }
18
+ def define_list_feature(list_name, context = nil, &body)
19
+ create_new_entry(:list, list_name, context, body)
22
20
  end
23
21
 
24
- def define_list_item_feature(list_name, feature_names, context = nil, &body)
22
+ def define_list_item_feature(list_name, feature_name, context = nil, &body)
25
23
  entry = @feature_entries[list_name]
26
24
  entry&.match_entry_type?(:list) ||
27
25
  (raise BuilderError.new("unknown list feature: #{list_name}"))
28
- Array(feature_names)
29
- .each { |name| entry.define_feature(name, context, &body) }
26
+ entry.define_feature(feature_name, context, &body)
30
27
  end
31
28
 
32
29
  def enable(feature_or_list_names, feature_names = nil)
@@ -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
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module Builder
6
+ class Layer
7
+ class Proxy
8
+ def initialize
9
+ block_given? && yield(self)
10
+ end
11
+
12
+ attr_setter :body
13
+ attr_setter :method_name
14
+ attr_setter :list_name
15
+ attr_setter :feature_name
16
+
17
+ def register_execution(registry, &body)
18
+ @executions ||= []
19
+ @executions << { registry: registry, body: body }
20
+ end
21
+
22
+ def execute(layer)
23
+ Docile.dsl_eval(layer, &body)
24
+ @executions&.each { |execution| call_execution(layer, execution) }
25
+ end
26
+
27
+ private
28
+
29
+ def call_execution(layer, execution)
30
+ args = [list_name, feature_name, layer.shared_context].compact
31
+ execution[:registry].__send__(method_name, *args, &execution[:body])
32
+ end
33
+ end
34
+
35
+ def initialize(name)
36
+ @name = name
37
+ @feature_registries = {}
38
+ end
39
+
40
+ def add_feature_registry(name, registry)
41
+ @feature_registries[name] = registry
42
+ define_proxy_call(name)
43
+ end
44
+
45
+ def shared_context(&body)
46
+ return unless @proxy
47
+
48
+ if block_given?
49
+ context = current_shared_context(true)
50
+ context.singleton_exec(&body)
51
+ end
52
+
53
+ current_shared_context(false)
54
+ end
55
+
56
+ def define_simple_feature(feature_names, &body)
57
+ Array(feature_names).each do |feature_name|
58
+ do_proxy_call do |proxy|
59
+ proxy.body(body)
60
+ proxy.method_name(__method__)
61
+ proxy.feature_name(feature_name)
62
+ end
63
+ end
64
+ end
65
+
66
+ def define_list_feature(list_names, &body)
67
+ Array(list_names).each do |list_name|
68
+ do_proxy_call do |proxy|
69
+ proxy.body(body)
70
+ proxy.method_name(__method__)
71
+ proxy.list_name(list_name)
72
+ end
73
+ end
74
+ end
75
+
76
+ def define_list_item_feature(list_name, feature_names, &body)
77
+ Array(feature_names).each do |feature_name|
78
+ do_proxy_call do |proxy|
79
+ proxy.body(body)
80
+ proxy.method_name(__method__)
81
+ proxy.list_name(list_name)
82
+ proxy.feature_name(feature_name)
83
+ end
84
+ end
85
+ end
86
+
87
+ def enable(feature_or_list_names, feature_names = nil)
88
+ @feature_registries.each_value do |registry|
89
+ registry.enable(feature_or_list_names, feature_names)
90
+ end
91
+ end
92
+
93
+ def disable(feature_or_list_names = nil, feature_names = nil)
94
+ @feature_registries.each_value do |registry|
95
+ registry.disable(*[feature_or_list_names, feature_names].compact)
96
+ end
97
+ end
98
+
99
+ def delete(feature_or_list_names = nil, feature_names = nil)
100
+ @feature_registries.each_value do |registry|
101
+ registry.delete(*[feature_or_list_names, feature_names].compact)
102
+ end
103
+ end
104
+
105
+ private
106
+
107
+ def define_proxy_call(name)
108
+ define_singleton_method(name) do |&body|
109
+ @proxy.register_execution(@feature_registries[__method__], &body)
110
+ end
111
+ end
112
+
113
+ def do_proxy_call(&block)
114
+ @proxy = Proxy.new(&block)
115
+ @proxy.execute(self)
116
+ remove_instance_variable(:@proxy)
117
+ end
118
+
119
+ def current_shared_context(allocate)
120
+ list_name = @proxy.list_name || @proxy.feature_name
121
+ feature_name = @proxy.feature_name
122
+ allocate && (shared_contexts[list_name][feature_name] ||= Object.new)
123
+ shared_contexts[list_name][feature_name]
124
+ end
125
+
126
+ def shared_contexts
127
+ @shared_contexts ||= Hash.new { |h, k| h[k] = {} }
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end