rggen-core 0.20.0 → 0.24.0

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