rggen-core 0.21.0 → 0.25.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 (51) 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 -2
  6. data/lib/rggen/core/base/component.rb +5 -6
  7. data/lib/rggen/core/base/component_factory.rb +8 -5
  8. data/lib/rggen/core/builder/builder.rb +29 -35
  9. data/lib/rggen/core/builder/component_registry.rb +8 -9
  10. data/lib/rggen/core/builder/feature_registry.rb +15 -15
  11. data/lib/rggen/core/builder/layer.rb +44 -29
  12. data/lib/rggen/core/builder/list_feature_entry.rb +5 -9
  13. data/lib/rggen/core/builder/loader_registry.rb +1 -2
  14. data/lib/rggen/core/builder/plugin_manager.rb +122 -0
  15. data/lib/rggen/core/builder/plugin_spec.rb +83 -0
  16. data/lib/rggen/core/builder/simple_feature_entry.rb +4 -4
  17. data/lib/rggen/core/configuration.rb +3 -2
  18. data/lib/rggen/core/configuration/toml_loader.rb +18 -0
  19. data/lib/rggen/core/core_extensions/object.rb +4 -4
  20. data/lib/rggen/core/dsl.rb +3 -1
  21. data/lib/rggen/core/exceptions.rb +9 -4
  22. data/lib/rggen/core/facets.rb +1 -1
  23. data/lib/rggen/core/generator.rb +3 -3
  24. data/lib/rggen/core/input_base/component.rb +12 -0
  25. data/lib/rggen/core/input_base/component_factory.rb +1 -0
  26. data/lib/rggen/core/input_base/feature.rb +22 -8
  27. data/lib/rggen/core/input_base/input_data.rb +24 -17
  28. data/lib/rggen/core/input_base/input_matcher.rb +5 -5
  29. data/lib/rggen/core/input_base/loader.rb +15 -15
  30. data/lib/rggen/core/input_base/property.rb +17 -11
  31. data/lib/rggen/core/input_base/toml_loader.rb +16 -0
  32. data/lib/rggen/core/input_base/yaml_loader.rb +1 -18
  33. data/lib/rggen/core/options.rb +18 -14
  34. data/lib/rggen/core/output_base/code_generator.rb +5 -6
  35. data/lib/rggen/core/output_base/document_component_factory.rb +10 -0
  36. data/lib/rggen/core/output_base/feature.rb +15 -11
  37. data/lib/rggen/core/output_base/file_writer.rb +1 -1
  38. data/lib/rggen/core/output_base/source_file_component_factory.rb +15 -0
  39. data/lib/rggen/core/output_base/template_engine.rb +4 -5
  40. data/lib/rggen/core/plugin.rb +16 -0
  41. data/lib/rggen/core/printers.rb +11 -7
  42. data/lib/rggen/core/register_map.rb +4 -5
  43. data/lib/rggen/core/register_map/hash_loader.rb +6 -9
  44. data/lib/rggen/core/register_map/toml_loader.rb +18 -0
  45. data/lib/rggen/core/utility/attribute_setter.rb +5 -0
  46. data/lib/rggen/core/utility/code_utility/code_block.rb +11 -5
  47. data/lib/rggen/core/utility/error_utility.rb +33 -6
  48. data/lib/rggen/core/version.rb +2 -4
  49. metadata +33 -7
  50. data/lib/rggen/core/base/proxy_call.rb +0 -18
  51. data/lib/rggen/core/builder/plugins.rb +0 -79
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 135125b25bc30e8eb74fa97644c356afd817cda2a84a810a401efbcde7d2a647
4
- data.tar.gz: c4cb605aaa49801ff0f70458148f1349a220de2c41b6f7ed614e98466e425668
3
+ metadata.gz: 57e33c7b563198efa0e1d2c20adcb0b6896d72d4575673c9f64761aeca93779a
4
+ data.tar.gz: 61e593cab9704bdc330a3767791afc9e6373020809777c7cd4f67ac18adb7b92
5
5
  SHA512:
6
- metadata.gz: 122340fafae09f08a604c54b3f21e8428a0d03af5ef81b37f4211f881a99186c2f0a45e50cad9367406a75f784041eabc0ef87ebf692946a2dfbec5221135e8f
7
- data.tar.gz: fb87835adc54ec4416f5811126ff65355ada76e05cc46d89eedbe87e2899fd16665d26caf66e41a9919a074824f51ef97fd6dee9abc2aa959b42d83b9c4dd35c
6
+ metadata.gz: 40b23ff5bd0eca3b9a53cda4cb37a220bd8e7a5648bfce598c1404031bfb43421eda997eb8a7c37868e31418a54c7267d336f72631d29522106c20dc3752433a
7
+ data.tar.gz: 6918ad93d019dd22e4af13205eb5c8529b1ae8b7c71cd50352b183ae84d3c5a54682189e606859adcd7e70cd292f42d11b8621997cff95ac2e89e2b47f876d1f
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
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'
98
- require_relative 'core/builder/plugins'
103
+ require_relative 'core/builder/plugin_spec'
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, method)
78
- @proxy_calls ||= {}
79
- @proxy_calls[method] = ProxyCall.new(receiver, method)
80
- define_singleton_method(method) do |*args, &block|
81
- @proxy_calls[__method__].call(*args, &block)
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
- @target_component
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(*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
- factory = find_child_factory(*args)
92
- factory.create(component, *args)
95
+ find_child_factory(*args).create(component, *args)
93
96
  end
94
97
  end
95
98
  end
@@ -4,20 +4,22 @@ 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)
22
+ component_registry(:output, name, &body)
21
23
  end
22
24
 
23
25
  [
@@ -30,6 +32,10 @@ module RgGen
30
32
  end
31
33
  end
32
34
 
35
+ def register_map_layers
36
+ REGISTER_MAP_LAYERS
37
+ end
38
+
33
39
  def add_feature_registry(name, target_layer, registry)
34
40
  target_layers =
35
41
  if target_layer
@@ -37,9 +43,8 @@ module RgGen
37
43
  else
38
44
  @layers.values
39
45
  end
40
- target_layers.each do |layer|
41
- layer.add_feature_registry(name, registry)
42
- end
46
+ target_layers
47
+ .each { |layer| layer.add_feature_registry(name, registry) }
43
48
  end
44
49
 
45
50
  [
@@ -73,8 +78,7 @@ module RgGen
73
78
  if targets.empty?
74
79
  @component_registries[type]
75
80
  else
76
- @component_registries[type]
77
- .select { |name, _| targets.include?(name) }
81
+ @component_registries[type].slice(*targets)
78
82
  end
79
83
  registries.each_value.map(&:build_factory)
80
84
  end
@@ -88,23 +92,9 @@ module RgGen
88
92
  RegisterMap.setup(self)
89
93
  end
90
94
 
91
- def setup(name, module_or_version = nil, &block)
92
- plugins.add(name, module_or_version, &block)
93
- end
94
-
95
- def activate_plugins(**options)
96
- plugins.activate(self, **options)
97
- end
98
-
99
- def load_setup_file(file, activation = true)
100
- (file.nil? || file.empty?) &&
101
- (raise Core::LoadError.new('no setup file is given'))
102
- File.readable?(file) ||
103
- (raise Core::LoadError.new("cannot load such setup file: #{file}"))
104
- RgGen.builder(self)
105
- load(file)
106
- activation && activate_plugins
107
- end
95
+ def_delegator :plugin_manager, :load_plugin
96
+ def_delegator :plugin_manager, :load_plugins
97
+ def_delegator :plugin_manager, :register_plugin
108
98
 
109
99
  private
110
100
 
@@ -117,26 +107,30 @@ module RgGen
117
107
  end
118
108
  end
119
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
+
120
118
  def initialize_layers
121
119
  @layers = Hash.new do |_, layer_name|
122
120
  raise BuilderError.new("unknown layer: #{layer_name}")
123
121
  end
124
- [
125
- :global, :root, :register_block, :register_file, :register, :bit_field
126
- ].each do |layer|
127
- @layers[layer] = Layer.new(layer)
128
- end
122
+ ALL_LAYERS.each { |layer| @layers[layer] = Layer.new(layer) }
129
123
  end
130
124
 
131
125
  COMPONENT_REGISTRIES = {
132
126
  input: InputComponentRegistry, output: OutputComponentRegistry
133
127
  }.freeze
134
128
 
135
- def component_registry(type, name, body)
129
+ def component_registry(type, name, &body)
136
130
  registries = @component_registries[type]
137
- klass = COMPONENT_REGISTRIES[type]
138
- registries.key?(name) || (registries[name] = klass.new(name, self))
139
- 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]
140
134
  end
141
135
  end
142
136
  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)
@@ -91,10 +88,9 @@ module RgGen
91
88
  end
92
89
 
93
90
  def build_factories
94
- @enabled_features
95
- .select { |n, _| @feature_entries.key?(n) }
96
- .map { |n, f| [n, @feature_entries[n].build_factory(f)] }
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 :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