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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +2 -2
- data/exe/rggen +0 -0
- data/lib/rggen/core.rb +6 -4
- data/lib/rggen/core/base/component.rb +18 -7
- data/lib/rggen/core/base/component_factory.rb +12 -9
- data/lib/rggen/core/base/component_layer_extension.rb +194 -0
- data/lib/rggen/core/base/feature_layer_extension.rb +158 -0
- data/lib/rggen/core/builder/builder.rb +33 -35
- data/lib/rggen/core/builder/component_entry.rb +3 -2
- data/lib/rggen/core/builder/component_registry.rb +22 -17
- data/lib/rggen/core/builder/input_component_registry.rb +43 -10
- data/lib/rggen/core/builder/{category.rb → layer.rb} +27 -26
- data/lib/rggen/core/builder/loader_registry.rb +48 -0
- data/lib/rggen/core/builder/plugins.rb +5 -3
- data/lib/rggen/core/configuration.rb +3 -2
- data/lib/rggen/core/configuration/component.rb +5 -0
- data/lib/rggen/core/configuration/component_factory.rb +1 -1
- data/lib/rggen/core/configuration/hash_loader.rb +4 -2
- data/lib/rggen/core/configuration/input_data.rb +15 -0
- data/lib/rggen/core/input_base/component_factory.rb +37 -6
- data/lib/rggen/core/input_base/feature.rb +9 -5
- data/lib/rggen/core/input_base/input_data.rb +13 -10
- data/lib/rggen/core/input_base/input_matcher.rb +15 -16
- data/lib/rggen/core/input_base/input_value_extractor.rb +34 -0
- data/lib/rggen/core/input_base/loader.rb +64 -21
- data/lib/rggen/core/input_base/verifier.rb +6 -7
- data/lib/rggen/core/input_base/yaml_loader.rb +22 -17
- data/lib/rggen/core/output_base/code_generator.rb +10 -23
- data/lib/rggen/core/output_base/component.rb +42 -39
- data/lib/rggen/core/output_base/component_factory.rb +4 -0
- data/lib/rggen/core/output_base/feature.rb +6 -7
- data/lib/rggen/core/printers.rb +2 -2
- data/lib/rggen/core/register_map.rb +6 -5
- data/lib/rggen/core/register_map/component.rb +4 -3
- data/lib/rggen/core/register_map/component_factory.rb +18 -1
- data/lib/rggen/core/register_map/feature.rb +2 -2
- data/lib/rggen/core/register_map/hash_loader.rb +61 -27
- data/lib/rggen/core/register_map/input_data.rb +30 -16
- data/lib/rggen/core/register_map/loader.rb +1 -1
- data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
- data/lib/rggen/core/utility/code_utility.rb +8 -2
- data/lib/rggen/core/version.rb +1 -1
- metadata +11 -9
- data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
- data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
- 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
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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,
|
36
|
-
|
37
|
-
if
|
38
|
-
Array(@
|
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
|
-
@
|
38
|
+
@layers.values
|
41
39
|
end
|
42
|
-
|
43
|
-
|
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 |
|
53
|
-
@
|
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(
|
58
|
-
@
|
55
|
+
def enable(layer, *args)
|
56
|
+
@layers[layer].enable(*args)
|
59
57
|
end
|
60
58
|
|
61
59
|
def disable_all
|
62
|
-
@
|
60
|
+
@layers.each_value(&:disable)
|
63
61
|
end
|
64
62
|
|
65
|
-
def disable(
|
66
|
-
@
|
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(
|
85
|
-
@
|
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
|
123
|
-
@
|
124
|
-
raise BuilderError.new("unknown
|
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, :
|
128
|
-
].each do |
|
129
|
-
@
|
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(
|
14
|
-
if
|
15
|
-
Array(
|
16
|
-
@entries << create_new_entry(
|
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
|
-
|
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(
|
34
|
-
entry = ComponentEntry.new(@component_name)
|
35
|
-
Docile.dsl_eval(entry,
|
36
|
-
add_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(
|
41
|
-
feature_registry
|
42
|
-
|
43
|
-
|
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
|
-
@
|
9
|
+
@loader_registries = {}
|
10
10
|
end
|
11
11
|
|
12
|
-
|
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
|
15
|
-
|
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
|
19
|
-
|
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
|
23
|
-
|
24
|
-
|
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(
|
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
|
6
|
+
class Layer
|
7
7
|
class Proxy
|
8
|
-
def initialize
|
9
|
-
|
8
|
+
def initialize
|
9
|
+
block_given? && yield(self)
|
10
10
|
end
|
11
11
|
|
12
|
-
attr_setter :
|
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,
|
25
|
+
def register_execution(registry, &body)
|
25
26
|
@executions ||= []
|
26
|
-
@executions << { registry: registry,
|
27
|
+
@executions << { registry: registry, body: body }
|
27
28
|
end
|
28
29
|
|
29
|
-
def execute(
|
30
|
-
Docile.dsl_eval(
|
31
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
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
|
62
|
-
proxy.
|
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
|
69
|
-
proxy.
|
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
|
76
|
-
proxy.
|
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
|
104
|
-
@proxy.register_execution(@feature_registries[
|
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(
|
109
|
-
@proxy = Proxy.new(
|
110
|
-
@proxy.execute(self
|
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
|
-
|
68
|
-
|
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
|
-
|
14
|
-
|
13
|
+
register_loader :ruby, RubyLoader
|
14
|
+
register_loader :yaml, YAMLLoader
|
15
|
+
register_loader :json, JSONLoader
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|