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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +2 -1
- data/exe/rggen +2 -2
- data/lib/rggen/core.rb +9 -2
- 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 +29 -35
- 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 +122 -0
- 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 +3 -1
- data/lib/rggen/core/exceptions.rb +9 -4
- data/lib/rggen/core/facets.rb +1 -1
- data/lib/rggen/core/generator.rb +3 -3
- 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 +18 -14
- 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/printers.rb +11 -7
- 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 +33 -7
- data/lib/rggen/core/base/proxy_call.rb +0 -18
- data/lib/rggen/core/builder/plugins.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57e33c7b563198efa0e1d2c20adcb0b6896d72d4575673c9f64761aeca93779a
|
4
|
+
data.tar.gz: 61e593cab9704bdc330a3767791afc9e6373020809777c7cd4f67ac18adb7b92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40b23ff5bd0eca3b9a53cda4cb37a220bd8e7a5648bfce598c1404031bfb43421eda997eb8a7c37868e31418a54c7267d336f72631d29522106c20dc3752433a
|
7
|
+
data.tar.gz: 6918ad93d019dd22e4af13205eb5c8529b1ae8b7c71cd50352b183ae84d3c5a54682189e606859adcd7e70cd292f42d11b8621997cff95ac2e89e2b47f876d1f
|
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'
|
98
|
-
require_relative 'core/builder/
|
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,
|
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
|
@@ -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
|
-
@
|
12
|
+
@plugin_manager = PluginManager.new(self)
|
11
13
|
end
|
12
14
|
|
13
|
-
attr_reader :
|
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
|
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
|
-
|
92
|
-
|
93
|
-
|
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
|
-
|
138
|
-
|
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
|
-
|
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
|