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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -1
  4. data/exe/rggen +2 -2
  5. data/lib/rggen/core.rb +9 -1
  6. data/lib/rggen/core/builder/builder.rb +30 -36
  7. data/lib/rggen/core/builder/component_registry.rb +8 -9
  8. data/lib/rggen/core/builder/feature_registry.rb +6 -9
  9. data/lib/rggen/core/builder/input_component_registry.rb +43 -10
  10. data/lib/rggen/core/builder/layer.rb +44 -29
  11. data/lib/rggen/core/builder/loader_registry.rb +48 -0
  12. data/lib/rggen/core/builder/plugin_manager.rb +122 -0
  13. data/lib/rggen/core/builder/plugin_spec.rb +83 -0
  14. data/lib/rggen/core/configuration.rb +5 -3
  15. data/lib/rggen/core/configuration/hash_loader.rb +4 -2
  16. data/lib/rggen/core/configuration/toml_loader.rb +18 -0
  17. data/lib/rggen/core/dsl.rb +3 -1
  18. data/lib/rggen/core/exceptions.rb +9 -4
  19. data/lib/rggen/core/facets.rb +0 -1
  20. data/lib/rggen/core/generator.rb +3 -3
  21. data/lib/rggen/core/input_base/feature.rb +2 -2
  22. data/lib/rggen/core/input_base/input_data.rb +8 -4
  23. data/lib/rggen/core/input_base/input_value_extractor.rb +34 -0
  24. data/lib/rggen/core/input_base/loader.rb +64 -20
  25. data/lib/rggen/core/input_base/toml_loader.rb +16 -0
  26. data/lib/rggen/core/input_base/yaml_loader.rb +12 -8
  27. data/lib/rggen/core/options.rb +18 -14
  28. data/lib/rggen/core/output_base/code_generator.rb +1 -1
  29. data/lib/rggen/core/plugin.rb +16 -0
  30. data/lib/rggen/core/printers.rb +11 -7
  31. data/lib/rggen/core/register_map.rb +6 -6
  32. data/lib/rggen/core/register_map/hash_loader.rb +58 -17
  33. data/lib/rggen/core/register_map/toml_loader.rb +18 -0
  34. data/lib/rggen/core/utility/attribute_setter.rb +5 -0
  35. data/lib/rggen/core/utility/error_utility.rb +33 -6
  36. data/lib/rggen/core/version.rb +2 -4
  37. metadata +32 -5
  38. data/lib/rggen/core/builder/plugins.rb +0 -79
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9079e5f068e752e9f083fd64c97dda8cdc9f47f2e4ce3c6f1d0568f4950caa3
4
- data.tar.gz: e60e14aa24f9f7b003391f0d87d773a35adbdf99c794016cdd803fc8025df8de
3
+ metadata.gz: 040113a3bef96502aae386b3aa7dafcca07af29d8881b41bfc6e17b3e0769885
4
+ data.tar.gz: 4392f0ae0bc1cd8d7422606eea73f11dffe293e29cc39250c5fd3479581dc349
5
5
  SHA512:
6
- metadata.gz: 7f2b3f56089899d459e62bd6873166a467eec667d559690ad26a17558a72b4e399744d156c9a092181067a1313c82615db12a63469e8b7d9145678adfed2c830
7
- data.tar.gz: a5cf836ea12ba57a905d925f29406f76155ce3e389d4678f76adee6da8bec9f5964c3f973f2803019c4aa8756f7223abf1de958f2ceb6b6fd97024d663c02327
6
+ metadata.gz: c77e46129bc726cb7afee6b21b3b31e2a692ee3fa2d99aade8eb6f6a3d1082e4f3fab1c83ff4f20afead532c521dfea6f23c8c6762a0b54ed9ab9cfbf013b484
7
+ data.tar.gz: c20b96a0be7b1f15cae6cc8b1512d05b83d8f06cb3407b34fe1731221065de3467522bdabfd74b2b5336fcc96b245a9eff191629ff58c61635b8ca77af511be1
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2017-2020 Taichi Ishitani
3
+ Copyright (c) 2017-2021 Taichi Ishitani
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
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-2020 Taichi Ishitani. RgGen::Core is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
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
- abort RgGen::Core::Utility::ErrorUtility
12
- .compose_error_message(e, cli.options[:print_backtrace])
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
@@ -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/plugins'
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
- @plugins = Plugins.new
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
- 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
- def register_loaders(component, loaders)
28
- @component_registries[:input][component].register_loaders(loaders)
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 define_loader(component, &body)
32
- @component_registries[:input][component].define_loader(&body)
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
- def setup(name, module_or_version = nil, &block)
94
- plugins.add(name, module_or_version, &block)
95
- end
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
- if layers
15
- Array(layers).each do |layer|
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(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
@@ -11,16 +11,8 @@ module RgGen
11
11
 
12
12
  attr_setter :body
13
13
  attr_setter :method_name
14
- attr_setter :list_names
15
- attr_setter :feature_names
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(&method(:call_execution))
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 = [list_names, feature_names, shared_context].compact
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
- block_given? && @proxy&.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)
56
54
  end
57
55
 
58
56
  def define_simple_feature(feature_names, &body)
59
- do_proxy_call do |proxy|
60
- proxy.body(body)
61
- proxy.method_name(__method__)
62
- proxy.feature_names(feature_names)
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
- do_proxy_call do |proxy|
68
- proxy.body(body)
69
- proxy.method_name(__method__)
70
- proxy.list_names(list_names)
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
- do_proxy_call do |proxy|
76
- proxy.body(body)
77
- proxy.method_name(__method__)
78
- proxy.list_names(list_name)
79
- proxy.feature_names(feature_names)
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