rggen-core 0.20.0 → 0.24.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 -1
- data/exe/rggen +2 -2
- data/lib/rggen/core.rb +9 -1
- data/lib/rggen/core/builder/builder.rb +30 -36
- data/lib/rggen/core/builder/component_registry.rb +8 -9
- data/lib/rggen/core/builder/feature_registry.rb +6 -9
- data/lib/rggen/core/builder/input_component_registry.rb +43 -10
- data/lib/rggen/core/builder/layer.rb +44 -29
- data/lib/rggen/core/builder/loader_registry.rb +48 -0
- data/lib/rggen/core/builder/plugin_manager.rb +122 -0
- data/lib/rggen/core/builder/plugin_spec.rb +83 -0
- data/lib/rggen/core/configuration.rb +5 -3
- data/lib/rggen/core/configuration/hash_loader.rb +4 -2
- data/lib/rggen/core/configuration/toml_loader.rb +18 -0
- data/lib/rggen/core/dsl.rb +3 -1
- data/lib/rggen/core/exceptions.rb +9 -4
- data/lib/rggen/core/facets.rb +0 -1
- data/lib/rggen/core/generator.rb +3 -3
- data/lib/rggen/core/input_base/feature.rb +2 -2
- data/lib/rggen/core/input_base/input_data.rb +8 -4
- data/lib/rggen/core/input_base/input_value_extractor.rb +34 -0
- data/lib/rggen/core/input_base/loader.rb +64 -20
- data/lib/rggen/core/input_base/toml_loader.rb +16 -0
- data/lib/rggen/core/input_base/yaml_loader.rb +12 -8
- data/lib/rggen/core/options.rb +18 -14
- data/lib/rggen/core/output_base/code_generator.rb +1 -1
- data/lib/rggen/core/plugin.rb +16 -0
- data/lib/rggen/core/printers.rb +11 -7
- data/lib/rggen/core/register_map.rb +6 -6
- data/lib/rggen/core/register_map/hash_loader.rb +58 -17
- data/lib/rggen/core/register_map/toml_loader.rb +18 -0
- data/lib/rggen/core/utility/attribute_setter.rb +5 -0
- data/lib/rggen/core/utility/error_utility.rb +33 -6
- data/lib/rggen/core/version.rb +2 -4
- metadata +32 -5
- data/lib/rggen/core/builder/plugins.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 040113a3bef96502aae386b3aa7dafcca07af29d8881b41bfc6e17b3e0769885
|
4
|
+
data.tar.gz: 4392f0ae0bc1cd8d7422606eea73f11dffe293e29cc39250c5fd3479581dc349
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c77e46129bc726cb7afee6b21b3b31e2a692ee3fa2d99aade8eb6f6a3d1082e4f3fab1c83ff4f20afead532c521dfea6f23c8c6762a0b54ed9ab9cfbf013b484
|
7
|
+
data.tar.gz: c20b96a0be7b1f15cae6cc8b1512d05b83d8f06cb3407b34fe1731221065de3467522bdabfd74b2b5336fcc96b245a9eff191629ff58c61635b8ca77af511be1
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -13,6 +13,7 @@ RgGen::Core is a core library of RgGen tool and provides features listed below:
|
|
13
13
|
* Basic loaders for configuration file and register map documents
|
14
14
|
* Ruby with APIs for description
|
15
15
|
* YAML
|
16
|
+
* TOML
|
16
17
|
* JSON
|
17
18
|
* Structure and APIs for defining output file writers
|
18
19
|
* Building RgGen tool up by linking defined above features
|
@@ -43,7 +44,7 @@ Feedbacks, bug reports, questions and etc. are wellcome! You can post them by us
|
|
43
44
|
|
44
45
|
## Copyright & License
|
45
46
|
|
46
|
-
Copyright © 2017-
|
47
|
+
Copyright © 2017-2021 Taichi Ishitani. RgGen::Core is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
|
47
48
|
|
48
49
|
## Code of Conduct
|
49
50
|
|
data/exe/rggen
CHANGED
@@ -8,6 +8,6 @@ begin
|
|
8
8
|
cli = RgGen::Core::CLI.new
|
9
9
|
cli.run(ARGV)
|
10
10
|
rescue ScriptError, StandardError => e
|
11
|
-
|
12
|
-
|
11
|
+
options = [cli.options[:print_verbose_info], cli.options[:print_backtrace]]
|
12
|
+
abort RgGen::Core::Utility::ErrorUtility.compose_error_message(e, *options)
|
13
13
|
end
|
data/lib/rggen/core.rb
CHANGED
@@ -8,6 +8,7 @@ require 'json'
|
|
8
8
|
require 'optparse'
|
9
9
|
require 'pathname'
|
10
10
|
require 'singleton'
|
11
|
+
require 'tomlrb'
|
11
12
|
require 'yaml'
|
12
13
|
|
13
14
|
require_relative 'core/version'
|
@@ -38,8 +39,10 @@ require_relative 'core/base/feature_layer_extension'
|
|
38
39
|
|
39
40
|
require_relative 'core/input_base/input_value'
|
40
41
|
require_relative 'core/input_base/input_data'
|
42
|
+
require_relative 'core/input_base/input_value_extractor'
|
41
43
|
require_relative 'core/input_base/loader'
|
42
44
|
require_relative 'core/input_base/json_loader'
|
45
|
+
require_relative 'core/input_base/toml_loader'
|
43
46
|
require_relative 'core/input_base/yaml_loader'
|
44
47
|
require_relative 'core/input_base/component'
|
45
48
|
require_relative 'core/input_base/component_factory'
|
@@ -59,6 +62,7 @@ require_relative 'core/configuration/loader'
|
|
59
62
|
require_relative 'core/configuration/ruby_loader'
|
60
63
|
require_relative 'core/configuration/hash_loader'
|
61
64
|
require_relative 'core/configuration/json_loader'
|
65
|
+
require_relative 'core/configuration/toml_loader'
|
62
66
|
require_relative 'core/configuration/yaml_loader'
|
63
67
|
require_relative 'core/configuration'
|
64
68
|
|
@@ -72,6 +76,7 @@ require_relative 'core/register_map/loader'
|
|
72
76
|
require_relative 'core/register_map/ruby_loader'
|
73
77
|
require_relative 'core/register_map/hash_loader'
|
74
78
|
require_relative 'core/register_map/json_loader'
|
79
|
+
require_relative 'core/register_map/toml_loader'
|
75
80
|
require_relative 'core/register_map/yaml_loader'
|
76
81
|
require_relative 'core/register_map'
|
77
82
|
|
@@ -87,16 +92,19 @@ require_relative 'core/output_base/feature_factory'
|
|
87
92
|
|
88
93
|
require_relative 'core/builder/component_entry'
|
89
94
|
require_relative 'core/builder/component_registry'
|
95
|
+
require_relative 'core/builder/loader_registry'
|
90
96
|
require_relative 'core/builder/input_component_registry'
|
91
97
|
require_relative 'core/builder/output_component_registry'
|
92
98
|
require_relative 'core/builder/simple_feature_entry'
|
93
99
|
require_relative 'core/builder/list_feature_entry'
|
94
100
|
require_relative 'core/builder/feature_registry'
|
95
101
|
require_relative 'core/builder/layer'
|
96
|
-
require_relative 'core/builder/
|
102
|
+
require_relative 'core/builder/plugin_spec'
|
103
|
+
require_relative 'core/builder/plugin_manager'
|
97
104
|
require_relative 'core/builder/builder'
|
98
105
|
require_relative 'core/builder'
|
99
106
|
|
107
|
+
require_relative 'core/plugin'
|
100
108
|
require_relative 'core/printers'
|
101
109
|
require_relative 'core/options'
|
102
110
|
require_relative 'core/dsl'
|
@@ -4,32 +4,36 @@ 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
11
|
initialize_layers
|
10
|
-
@
|
12
|
+
@plugin_manager = PluginManager.new(self)
|
11
13
|
end
|
12
14
|
|
13
|
-
attr_reader :
|
15
|
+
attr_reader :plugin_manager
|
14
16
|
|
15
17
|
def input_component_registry(name, &body)
|
16
|
-
component_registry(:input, name, body)
|
18
|
+
component_registry(:input, name, &body)
|
17
19
|
end
|
18
20
|
|
19
21
|
def output_component_registry(name, &body)
|
20
|
-
component_registry(:output, name, body)
|
21
|
-
end
|
22
|
-
|
23
|
-
def register_loader(component, loader)
|
24
|
-
@component_registries[:input][component].register_loader(loader)
|
22
|
+
component_registry(:output, name, &body)
|
25
23
|
end
|
26
24
|
|
27
|
-
|
28
|
-
|
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
|
29
33
|
end
|
30
34
|
|
31
|
-
def
|
32
|
-
|
35
|
+
def register_map_layers
|
36
|
+
REGISTER_MAP_LAYERS
|
33
37
|
end
|
34
38
|
|
35
39
|
def add_feature_registry(name, target_layer, registry)
|
@@ -90,23 +94,9 @@ module RgGen
|
|
90
94
|
RegisterMap.setup(self)
|
91
95
|
end
|
92
96
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
def activate_plugins(**options)
|
98
|
-
plugins.activate(self, **options)
|
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
|
97
|
+
def_delegator :plugin_manager, :load_plugin
|
98
|
+
def_delegator :plugin_manager, :load_plugins
|
99
|
+
def_delegator :plugin_manager, :register_plugin
|
110
100
|
|
111
101
|
private
|
112
102
|
|
@@ -119,26 +109,30 @@ module RgGen
|
|
119
109
|
end
|
120
110
|
end
|
121
111
|
|
112
|
+
REGISTER_MAP_LAYERS = [
|
113
|
+
:root, :register_block, :register_file, :register, :bit_field
|
114
|
+
].freeze
|
115
|
+
|
116
|
+
ALL_LAYERS = [
|
117
|
+
:global, *REGISTER_MAP_LAYERS
|
118
|
+
].freeze
|
119
|
+
|
122
120
|
def initialize_layers
|
123
121
|
@layers = Hash.new do |_, layer_name|
|
124
122
|
raise BuilderError.new("unknown layer: #{layer_name}")
|
125
123
|
end
|
126
|
-
[
|
127
|
-
:global, :root, :register_block, :register_file, :register, :bit_field
|
128
|
-
].each do |layer|
|
129
|
-
@layers[layer] = Layer.new(layer)
|
130
|
-
end
|
124
|
+
ALL_LAYERS.each { |layer| @layers[layer] = Layer.new(layer) }
|
131
125
|
end
|
132
126
|
|
133
127
|
COMPONENT_REGISTRIES = {
|
134
128
|
input: InputComponentRegistry, output: OutputComponentRegistry
|
135
129
|
}.freeze
|
136
130
|
|
137
|
-
def component_registry(type, name, body)
|
131
|
+
def component_registry(type, name, &body)
|
138
132
|
registries = @component_registries[type]
|
139
133
|
klass = COMPONENT_REGISTRIES[type]
|
140
134
|
registries.key?(name) || (registries[name] = klass.new(name, self))
|
141
|
-
Docile.dsl_eval(registries[name], &body)
|
135
|
+
block_given? && Docile.dsl_eval(registries[name], &body) || registries[name]
|
142
136
|
end
|
143
137
|
end
|
144
138
|
end
|
@@ -11,22 +11,22 @@ module RgGen
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def register_component(layers = nil, &block)
|
14
|
-
|
15
|
-
|
16
|
-
@entries << create_new_entry(layer, block)
|
17
|
-
end
|
18
|
-
else
|
19
|
-
@entries << create_new_entry(nil, block)
|
14
|
+
Array(layers || @builder.register_map_layers).each do |layer|
|
15
|
+
@entries << create_new_entry(layer, &block)
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
19
|
+
def register_global_component(&block)
|
20
|
+
@entries << create_new_entry(nil, &block)
|
21
|
+
end
|
22
|
+
|
23
23
|
def build_factory
|
24
24
|
build_factories.first.tap(&:root_factory)
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
-
def create_new_entry(layer, block)
|
29
|
+
def create_new_entry(layer, &block)
|
30
30
|
entry = ComponentEntry.new(@component_name, layer)
|
31
31
|
Docile.dsl_eval(entry, layer, &block)
|
32
32
|
add_feature_registry(layer, entry.feature_registry)
|
@@ -35,8 +35,7 @@ module RgGen
|
|
35
35
|
|
36
36
|
def add_feature_registry(layer, feature_registry)
|
37
37
|
feature_registry &&
|
38
|
-
@builder
|
39
|
-
.add_feature_registry(@component_name, layer, feature_registry)
|
38
|
+
@builder.add_feature_registry(@component_name, layer, feature_registry)
|
40
39
|
end
|
41
40
|
|
42
41
|
def build_factories
|
@@ -11,22 +11,19 @@ module RgGen
|
|
11
11
|
@enabled_features = {}
|
12
12
|
end
|
13
13
|
|
14
|
-
def define_simple_feature(
|
15
|
-
|
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(
|
20
|
-
|
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,
|
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
|
-
|
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
|
-
@
|
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
|
@@ -11,16 +11,8 @@ module RgGen
|
|
11
11
|
|
12
12
|
attr_setter :body
|
13
13
|
attr_setter :method_name
|
14
|
-
attr_setter :
|
15
|
-
attr_setter :
|
16
|
-
|
17
|
-
def shared_context(&body)
|
18
|
-
if block_given?
|
19
|
-
@shared_context ||= Object.new
|
20
|
-
@shared_context.instance_eval(&body)
|
21
|
-
end
|
22
|
-
@shared_context
|
23
|
-
end
|
14
|
+
attr_setter :list_name
|
15
|
+
attr_setter :feature_name
|
24
16
|
|
25
17
|
def register_execution(registry, &body)
|
26
18
|
@executions ||= []
|
@@ -29,15 +21,14 @@ module RgGen
|
|
29
21
|
|
30
22
|
def execute(layer)
|
31
23
|
Docile.dsl_eval(layer, &body)
|
32
|
-
@executions&.each(
|
24
|
+
@executions&.each { |execution| call_execution(layer, execution) }
|
33
25
|
end
|
34
26
|
|
35
27
|
private
|
36
28
|
|
37
|
-
def call_execution(execution)
|
38
|
-
args = [
|
39
|
-
execution[:registry]
|
40
|
-
.__send__(method_name, *args, &execution[:body])
|
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])
|
41
32
|
end
|
42
33
|
end
|
43
34
|
|
@@ -52,31 +43,44 @@ module RgGen
|
|
52
43
|
end
|
53
44
|
|
54
45
|
def shared_context(&body)
|
55
|
-
|
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)
|
56
54
|
end
|
57
55
|
|
58
56
|
def define_simple_feature(feature_names, &body)
|
59
|
-
|
60
|
-
proxy
|
61
|
-
|
62
|
-
|
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
63
|
end
|
64
64
|
end
|
65
65
|
|
66
66
|
def define_list_feature(list_names, &body)
|
67
|
-
|
68
|
-
proxy
|
69
|
-
|
70
|
-
|
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
|
71
73
|
end
|
72
74
|
end
|
73
75
|
|
74
76
|
def define_list_item_feature(list_name, feature_names, &body)
|
75
|
-
|
76
|
-
proxy
|
77
|
-
|
78
|
-
|
79
|
-
|
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
|
80
84
|
end
|
81
85
|
end
|
82
86
|
|
@@ -111,6 +115,17 @@ module RgGen
|
|
111
115
|
@proxy.execute(self)
|
112
116
|
remove_instance_variable(:@proxy)
|
113
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
|
114
129
|
end
|
115
130
|
end
|
116
131
|
end
|