rggen-core 0.19.0 → 0.23.1

Sign up to get free protection for your applications and to get access to all the features.
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