rggen-core 0.22.0 → 0.25.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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +2 -1
- data/exe/rggen +2 -2
- data/lib/rggen/core.rb +8 -1
- data/lib/rggen/core/base/component.rb +5 -6
- data/lib/rggen/core/base/component_factory.rb +8 -5
- data/lib/rggen/core/builder/builder.rb +23 -17
- data/lib/rggen/core/builder/component_registry.rb +8 -9
- data/lib/rggen/core/builder/feature_registry.rb +15 -15
- data/lib/rggen/core/builder/layer.rb +44 -29
- data/lib/rggen/core/builder/list_feature_entry.rb +5 -9
- data/lib/rggen/core/builder/loader_registry.rb +1 -2
- data/lib/rggen/core/builder/plugin_manager.rb +38 -43
- data/lib/rggen/core/builder/plugin_spec.rb +83 -0
- data/lib/rggen/core/builder/simple_feature_entry.rb +4 -4
- data/lib/rggen/core/configuration.rb +3 -2
- data/lib/rggen/core/configuration/toml_loader.rb +18 -0
- data/lib/rggen/core/core_extensions/object.rb +4 -4
- data/lib/rggen/core/dsl.rb +1 -1
- data/lib/rggen/core/exceptions.rb +6 -4
- data/lib/rggen/core/facets.rb +1 -1
- data/lib/rggen/core/input_base/component.rb +12 -0
- data/lib/rggen/core/input_base/component_factory.rb +1 -0
- data/lib/rggen/core/input_base/feature.rb +22 -8
- data/lib/rggen/core/input_base/input_data.rb +24 -17
- data/lib/rggen/core/input_base/input_matcher.rb +5 -5
- data/lib/rggen/core/input_base/loader.rb +15 -15
- data/lib/rggen/core/input_base/property.rb +17 -11
- data/lib/rggen/core/input_base/toml_loader.rb +16 -0
- data/lib/rggen/core/input_base/yaml_loader.rb +1 -18
- data/lib/rggen/core/options.rb +6 -0
- data/lib/rggen/core/output_base/code_generator.rb +5 -6
- data/lib/rggen/core/output_base/document_component_factory.rb +10 -0
- data/lib/rggen/core/output_base/feature.rb +15 -11
- data/lib/rggen/core/output_base/file_writer.rb +1 -1
- data/lib/rggen/core/output_base/source_file_component_factory.rb +15 -0
- data/lib/rggen/core/output_base/template_engine.rb +4 -5
- data/lib/rggen/core/plugin.rb +16 -0
- data/lib/rggen/core/register_map.rb +4 -5
- data/lib/rggen/core/register_map/hash_loader.rb +6 -9
- 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/code_utility/code_block.rb +11 -5
- data/lib/rggen/core/utility/error_utility.rb +33 -6
- data/lib/rggen/core/version.rb +2 -4
- metadata +32 -6
- data/lib/rggen/core/base/proxy_call.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7915fd6d79d893307c6b14ef89fa805139615cfd12e7400c68098a14e824fe0d
|
4
|
+
data.tar.gz: 0f41b79d7df0cfd60b46d30a411d168e1ba4bfafb337c2af1ca87616e4cdf296
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3982fd1243a0181d48e3588c58493fb14457a476d1615c23e54583a09b42fe53e7625dced0405d6d6deaca22a1673f49ceb1568840ec66a8c8bbbd5f52dbaa8b
|
7
|
+
data.tar.gz: ac8fbcebc7f56751455069e11e972e319e38a379e8bf1855537444bcfb82f2fbb34f03f419e1079552fce44176ea94c56e3311a0c0b0dbfe4e9b5b6019123a2e
|
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'
|
@@ -26,7 +27,6 @@ require_relative 'core/utility/regexp_patterns'
|
|
26
27
|
|
27
28
|
require_relative 'core/exceptions'
|
28
29
|
|
29
|
-
require_relative 'core/base/proxy_call'
|
30
30
|
require_relative 'core/base/internal_struct'
|
31
31
|
require_relative 'core/base/shared_context'
|
32
32
|
require_relative 'core/base/component'
|
@@ -41,6 +41,7 @@ require_relative 'core/input_base/input_data'
|
|
41
41
|
require_relative 'core/input_base/input_value_extractor'
|
42
42
|
require_relative 'core/input_base/loader'
|
43
43
|
require_relative 'core/input_base/json_loader'
|
44
|
+
require_relative 'core/input_base/toml_loader'
|
44
45
|
require_relative 'core/input_base/yaml_loader'
|
45
46
|
require_relative 'core/input_base/component'
|
46
47
|
require_relative 'core/input_base/component_factory'
|
@@ -60,6 +61,7 @@ require_relative 'core/configuration/loader'
|
|
60
61
|
require_relative 'core/configuration/ruby_loader'
|
61
62
|
require_relative 'core/configuration/hash_loader'
|
62
63
|
require_relative 'core/configuration/json_loader'
|
64
|
+
require_relative 'core/configuration/toml_loader'
|
63
65
|
require_relative 'core/configuration/yaml_loader'
|
64
66
|
require_relative 'core/configuration'
|
65
67
|
|
@@ -73,6 +75,7 @@ require_relative 'core/register_map/loader'
|
|
73
75
|
require_relative 'core/register_map/ruby_loader'
|
74
76
|
require_relative 'core/register_map/hash_loader'
|
75
77
|
require_relative 'core/register_map/json_loader'
|
78
|
+
require_relative 'core/register_map/toml_loader'
|
76
79
|
require_relative 'core/register_map/yaml_loader'
|
77
80
|
require_relative 'core/register_map'
|
78
81
|
|
@@ -83,6 +86,8 @@ require_relative 'core/output_base/file_writer'
|
|
83
86
|
require_relative 'core/output_base/raise_error'
|
84
87
|
require_relative 'core/output_base/component'
|
85
88
|
require_relative 'core/output_base/component_factory'
|
89
|
+
require_relative 'core/output_base/source_file_component_factory'
|
90
|
+
require_relative 'core/output_base/document_component_factory'
|
86
91
|
require_relative 'core/output_base/feature'
|
87
92
|
require_relative 'core/output_base/feature_factory'
|
88
93
|
|
@@ -95,10 +100,12 @@ require_relative 'core/builder/simple_feature_entry'
|
|
95
100
|
require_relative 'core/builder/list_feature_entry'
|
96
101
|
require_relative 'core/builder/feature_registry'
|
97
102
|
require_relative 'core/builder/layer'
|
103
|
+
require_relative 'core/builder/plugin_spec'
|
98
104
|
require_relative 'core/builder/plugin_manager'
|
99
105
|
require_relative 'core/builder/builder'
|
100
106
|
require_relative 'core/builder'
|
101
107
|
|
108
|
+
require_relative 'core/plugin'
|
102
109
|
require_relative 'core/printers'
|
103
110
|
require_relative 'core/options'
|
104
111
|
require_relative 'core/dsl'
|
@@ -70,15 +70,14 @@ module RgGen
|
|
70
70
|
|
71
71
|
def define_proxy_calls(receiver, methods)
|
72
72
|
Array(methods)
|
73
|
-
.map(&:to_sym)
|
74
73
|
.each { |method| define_proxy_call(receiver, method) }
|
75
74
|
end
|
76
75
|
|
77
|
-
def define_proxy_call(receiver,
|
78
|
-
@
|
79
|
-
|
80
|
-
|
81
|
-
@
|
76
|
+
def define_proxy_call(receiver, method_name)
|
77
|
+
(@proxy_receivers ||= {})[method_name.to_sym] = receiver
|
78
|
+
define_singleton_method(method_name) do |*args, &block|
|
79
|
+
name = __method__
|
80
|
+
@proxy_receivers[name].__send__(name, *args, &block)
|
82
81
|
end
|
83
82
|
end
|
84
83
|
end
|
@@ -43,11 +43,15 @@ module RgGen
|
|
43
43
|
|
44
44
|
def create_component(parent, sources, &block)
|
45
45
|
actual_sources = Array(select_actual_sources(*sources))
|
46
|
-
|
47
|
-
.new(parent, component_name, layer, *actual_sources, &block)
|
46
|
+
create_component?(*actual_sources) &&
|
47
|
+
@target_component.new(parent, component_name, layer, *actual_sources, &block)
|
48
48
|
end
|
49
49
|
|
50
|
-
def select_actual_sources(*
|
50
|
+
def select_actual_sources(*_sources)
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_component?(*_sources)
|
54
|
+
true
|
51
55
|
end
|
52
56
|
|
53
57
|
def build_component(parent, component, sources)
|
@@ -88,8 +92,7 @@ module RgGen
|
|
88
92
|
end
|
89
93
|
|
90
94
|
def create_child(component, *args)
|
91
|
-
|
92
|
-
factory.create(component, *args)
|
95
|
+
find_child_factory(*args).create(component, *args)
|
93
96
|
end
|
94
97
|
end
|
95
98
|
end
|
@@ -15,11 +15,11 @@ module RgGen
|
|
15
15
|
attr_reader :plugin_manager
|
16
16
|
|
17
17
|
def input_component_registry(name, &body)
|
18
|
-
component_registry(:input, name, body)
|
18
|
+
component_registry(:input, name, &body)
|
19
19
|
end
|
20
20
|
|
21
21
|
def output_component_registry(name, &body)
|
22
|
-
component_registry(:output, name, body)
|
22
|
+
component_registry(:output, name, &body)
|
23
23
|
end
|
24
24
|
|
25
25
|
[
|
@@ -32,6 +32,10 @@ module RgGen
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
def register_map_layers
|
36
|
+
REGISTER_MAP_LAYERS
|
37
|
+
end
|
38
|
+
|
35
39
|
def add_feature_registry(name, target_layer, registry)
|
36
40
|
target_layers =
|
37
41
|
if target_layer
|
@@ -39,9 +43,8 @@ module RgGen
|
|
39
43
|
else
|
40
44
|
@layers.values
|
41
45
|
end
|
42
|
-
target_layers
|
43
|
-
layer.add_feature_registry(name, registry)
|
44
|
-
end
|
46
|
+
target_layers
|
47
|
+
.each { |layer| layer.add_feature_registry(name, registry) }
|
45
48
|
end
|
46
49
|
|
47
50
|
[
|
@@ -75,8 +78,7 @@ module RgGen
|
|
75
78
|
if targets.empty?
|
76
79
|
@component_registries[type]
|
77
80
|
else
|
78
|
-
@component_registries[type]
|
79
|
-
.select { |name, _| targets.include?(name) }
|
81
|
+
@component_registries[type].slice(*targets)
|
80
82
|
end
|
81
83
|
registries.each_value.map(&:build_factory)
|
82
84
|
end
|
@@ -92,7 +94,7 @@ module RgGen
|
|
92
94
|
|
93
95
|
def_delegator :plugin_manager, :load_plugin
|
94
96
|
def_delegator :plugin_manager, :load_plugins
|
95
|
-
def_delegator :plugin_manager, :
|
97
|
+
def_delegator :plugin_manager, :register_plugin
|
96
98
|
|
97
99
|
private
|
98
100
|
|
@@ -105,26 +107,30 @@ module RgGen
|
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
110
|
+
REGISTER_MAP_LAYERS = [
|
111
|
+
:root, :register_block, :register_file, :register, :bit_field
|
112
|
+
].freeze
|
113
|
+
|
114
|
+
ALL_LAYERS = [
|
115
|
+
:global, *REGISTER_MAP_LAYERS
|
116
|
+
].freeze
|
117
|
+
|
108
118
|
def initialize_layers
|
109
119
|
@layers = Hash.new do |_, layer_name|
|
110
120
|
raise BuilderError.new("unknown layer: #{layer_name}")
|
111
121
|
end
|
112
|
-
[
|
113
|
-
:global, :root, :register_block, :register_file, :register, :bit_field
|
114
|
-
].each do |layer|
|
115
|
-
@layers[layer] = Layer.new(layer)
|
116
|
-
end
|
122
|
+
ALL_LAYERS.each { |layer| @layers[layer] = Layer.new(layer) }
|
117
123
|
end
|
118
124
|
|
119
125
|
COMPONENT_REGISTRIES = {
|
120
126
|
input: InputComponentRegistry, output: OutputComponentRegistry
|
121
127
|
}.freeze
|
122
128
|
|
123
|
-
def component_registry(type, name, body)
|
129
|
+
def component_registry(type, name, &body)
|
124
130
|
registries = @component_registries[type]
|
125
|
-
|
126
|
-
|
127
|
-
Docile.dsl_eval(registries[name], &body)
|
131
|
+
registries.key?(name) ||
|
132
|
+
(registries[name] = COMPONENT_REGISTRIES[type].new(name, self))
|
133
|
+
body && Docile.dsl_eval(registries[name], &body) || registries[name]
|
128
134
|
end
|
129
135
|
end
|
130
136
|
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)
|
@@ -91,10 +88,9 @@ module RgGen
|
|
91
88
|
end
|
92
89
|
|
93
90
|
def build_factories
|
94
|
-
@
|
95
|
-
.
|
96
|
-
.
|
97
|
-
.to_h
|
91
|
+
@feature_entries
|
92
|
+
.slice(*@enabled_features.keys)
|
93
|
+
.transform_values(&method(:build_factory))
|
98
94
|
end
|
99
95
|
|
100
96
|
private
|
@@ -103,9 +99,9 @@ module RgGen
|
|
103
99
|
simple: SimpleFeatureEntry, list: ListFeatureEntry
|
104
100
|
}.freeze
|
105
101
|
|
106
|
-
def create_new_entry(type, name, context, body)
|
102
|
+
def create_new_entry(type, name, context, &body)
|
107
103
|
entry = FEATURE_ENTRIES[type].new(self, name)
|
108
|
-
entry.setup(@base_feature, @factory, context, body)
|
104
|
+
entry.setup(@base_feature, @factory, context, &body)
|
109
105
|
@feature_entries[name] = entry
|
110
106
|
end
|
111
107
|
|
@@ -120,6 +116,10 @@ module RgGen
|
|
120
116
|
.feature?(feature_name)
|
121
117
|
@enabled_features[list_name].include?(feature_name)
|
122
118
|
end
|
119
|
+
|
120
|
+
def build_factory(entry)
|
121
|
+
entry.build_factory(@enabled_features[entry.name])
|
122
|
+
end
|
123
123
|
end
|
124
124
|
end
|
125
125
|
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
|