rggen-core 0.21.0 → 0.25.0

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