rggen-core 0.24.0 → 0.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rggen/core.rb +2 -1
  3. data/lib/rggen/core/base/component.rb +5 -6
  4. data/lib/rggen/core/base/component_factory.rb +8 -5
  5. data/lib/rggen/core/builder/builder.rb +6 -8
  6. data/lib/rggen/core/builder/feature_registry.rb +11 -8
  7. data/lib/rggen/core/builder/list_feature_entry.rb +5 -9
  8. data/lib/rggen/core/builder/loader_registry.rb +1 -2
  9. data/lib/rggen/core/builder/simple_feature_entry.rb +4 -4
  10. data/lib/rggen/core/core_extensions/object.rb +4 -4
  11. data/lib/rggen/core/facets.rb +1 -0
  12. data/lib/rggen/core/input_base/component.rb +12 -0
  13. data/lib/rggen/core/input_base/component_factory.rb +1 -0
  14. data/lib/rggen/core/input_base/feature.rb +20 -6
  15. data/lib/rggen/core/input_base/input_data.rb +17 -14
  16. data/lib/rggen/core/input_base/input_matcher.rb +5 -5
  17. data/lib/rggen/core/input_base/loader.rb +15 -15
  18. data/lib/rggen/core/input_base/property.rb +17 -11
  19. data/lib/rggen/core/input_base/yaml_loader.rb +1 -22
  20. data/lib/rggen/core/output_base/code_generator.rb +4 -5
  21. data/lib/rggen/core/output_base/document_component_factory.rb +10 -0
  22. data/lib/rggen/core/output_base/feature.rb +15 -11
  23. data/lib/rggen/core/output_base/file_writer.rb +1 -1
  24. data/lib/rggen/core/output_base/source_file_component_factory.rb +15 -0
  25. data/lib/rggen/core/output_base/template_engine.rb +4 -5
  26. data/lib/rggen/core/register_map/hash_loader.rb +6 -9
  27. data/lib/rggen/core/utility/code_utility/code_block.rb +11 -5
  28. data/lib/rggen/core/version.rb +1 -1
  29. metadata +6 -5
  30. data/lib/rggen/core/base/proxy_call.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 040113a3bef96502aae386b3aa7dafcca07af29d8881b41bfc6e17b3e0769885
4
- data.tar.gz: 4392f0ae0bc1cd8d7422606eea73f11dffe293e29cc39250c5fd3479581dc349
3
+ metadata.gz: 57e33c7b563198efa0e1d2c20adcb0b6896d72d4575673c9f64761aeca93779a
4
+ data.tar.gz: 61e593cab9704bdc330a3767791afc9e6373020809777c7cd4f67ac18adb7b92
5
5
  SHA512:
6
- metadata.gz: c77e46129bc726cb7afee6b21b3b31e2a692ee3fa2d99aade8eb6f6a3d1082e4f3fab1c83ff4f20afead532c521dfea6f23c8c6762a0b54ed9ab9cfbf013b484
7
- data.tar.gz: c20b96a0be7b1f15cae6cc8b1512d05b83d8f06cb3407b34fe1731221065de3467522bdabfd74b2b5336fcc96b245a9eff191629ff58c61635b8ca77af511be1
6
+ metadata.gz: 40b23ff5bd0eca3b9a53cda4cb37a220bd8e7a5648bfce598c1404031bfb43421eda997eb8a7c37868e31418a54c7267d336f72631d29522106c20dc3752433a
7
+ data.tar.gz: 6918ad93d019dd22e4af13205eb5c8529b1ae8b7c71cd50352b183ae84d3c5a54682189e606859adcd7e70cd292f42d11b8621997cff95ac2e89e2b47f876d1f
data/lib/rggen/core.rb CHANGED
@@ -27,7 +27,6 @@ require_relative 'core/utility/regexp_patterns'
27
27
 
28
28
  require_relative 'core/exceptions'
29
29
 
30
- require_relative 'core/base/proxy_call'
31
30
  require_relative 'core/base/internal_struct'
32
31
  require_relative 'core/base/shared_context'
33
32
  require_relative 'core/base/component'
@@ -87,6 +86,8 @@ require_relative 'core/output_base/file_writer'
87
86
  require_relative 'core/output_base/raise_error'
88
87
  require_relative 'core/output_base/component'
89
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'
90
91
  require_relative 'core/output_base/feature'
91
92
  require_relative 'core/output_base/feature_factory'
92
93
 
@@ -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
@@ -43,9 +43,8 @@ module RgGen
43
43
  else
44
44
  @layers.values
45
45
  end
46
- target_layers.each do |layer|
47
- layer.add_feature_registry(name, registry)
48
- end
46
+ target_layers
47
+ .each { |layer| layer.add_feature_registry(name, registry) }
49
48
  end
50
49
 
51
50
  [
@@ -79,8 +78,7 @@ module RgGen
79
78
  if targets.empty?
80
79
  @component_registries[type]
81
80
  else
82
- @component_registries[type]
83
- .select { |name, _| targets.include?(name) }
81
+ @component_registries[type].slice(*targets)
84
82
  end
85
83
  registries.each_value.map(&:build_factory)
86
84
  end
@@ -130,9 +128,9 @@ module RgGen
130
128
 
131
129
  def component_registry(type, name, &body)
132
130
  registries = @component_registries[type]
133
- klass = COMPONENT_REGISTRIES[type]
134
- registries.key?(name) || (registries[name] = klass.new(name, self))
135
- block_given? && Docile.dsl_eval(registries[name], &body) || registries[name]
131
+ registries.key?(name) ||
132
+ (registries[name] = COMPONENT_REGISTRIES[type].new(name, self))
133
+ body && Docile.dsl_eval(registries[name], &body) || registries[name]
136
134
  end
137
135
  end
138
136
  end
@@ -12,11 +12,11 @@ module RgGen
12
12
  end
13
13
 
14
14
  def define_simple_feature(name, context = nil, &body)
15
- create_new_entry(:simple, name, context, body)
15
+ create_new_entry(:simple, name, context, &body)
16
16
  end
17
17
 
18
18
  def define_list_feature(list_name, context = nil, &body)
19
- create_new_entry(:list, list_name, context, body)
19
+ create_new_entry(:list, list_name, context, &body)
20
20
  end
21
21
 
22
22
  def define_list_item_feature(list_name, feature_name, context = nil, &body)
@@ -88,10 +88,9 @@ module RgGen
88
88
  end
89
89
 
90
90
  def build_factories
91
- @enabled_features
92
- .select { |n, _| @feature_entries.key?(n) }
93
- .map { |n, f| [n, @feature_entries[n].build_factory(f)] }
94
- .to_h
91
+ @feature_entries
92
+ .slice(*@enabled_features.keys)
93
+ .transform_values(&method(:build_factory))
95
94
  end
96
95
 
97
96
  private
@@ -100,9 +99,9 @@ module RgGen
100
99
  simple: SimpleFeatureEntry, list: ListFeatureEntry
101
100
  }.freeze
102
101
 
103
- def create_new_entry(type, name, context, body)
102
+ def create_new_entry(type, name, context, &body)
104
103
  entry = FEATURE_ENTRIES[type].new(self, name)
105
- entry.setup(@base_feature, @factory, context, body)
104
+ entry.setup(@base_feature, @factory, context, &body)
106
105
  @feature_entries[name] = entry
107
106
  end
108
107
 
@@ -117,6 +116,10 @@ module RgGen
117
116
  .feature?(feature_name)
118
117
  @enabled_features[list_name].include?(feature_name)
119
118
  end
119
+
120
+ def build_factory(entry)
121
+ entry.build_factory(@enabled_features[entry.name])
122
+ end
120
123
  end
121
124
  end
122
125
  end
@@ -15,11 +15,11 @@ module RgGen
15
15
  attr_reader :registry
16
16
  attr_reader :name
17
17
 
18
- def setup(base_feature, base_factory, context, body)
18
+ def setup(base_feature, base_factory, context, &body)
19
19
  @base_feature = Class.new(base_feature)
20
20
  @factory = Class.new(base_factory)
21
21
  context && attach_shared_context(context)
22
- body && Docile.dsl_eval(self, @name, &body)
22
+ block_given? && Docile.dsl_eval(self, @name, &body)
23
23
  end
24
24
 
25
25
  def match_entry_type?(entry_type)
@@ -49,9 +49,8 @@ module RgGen
49
49
  @features[feature_name] ||= Class.new(@base_feature)
50
50
  feature = @features[feature_name]
51
51
  if context
52
- feature.method_defined?(:shared_context) && (
53
- raise BuilderError.new('shared context has already been set')
54
- )
52
+ feature.method_defined?(:shared_context) &&
53
+ (raise BuilderError.new('shared context has already been set'))
55
54
  feature.attach_context(context)
56
55
  end
57
56
  body && feature.class_exec(feature_name, &body)
@@ -87,10 +86,7 @@ module RgGen
87
86
  end
88
87
 
89
88
  def target_features(enabled_features)
90
- enabled_features
91
- .select { |n| @features.key?(n) }
92
- .map { |n| [n, @features[n]] }
93
- .to_h
89
+ @features.slice(*enabled_features)
94
90
  end
95
91
  end
96
92
  end
@@ -19,8 +19,7 @@ module RgGen
19
19
  end
20
20
 
21
21
  def define_value_extractor(layers, value, &body)
22
- @extractors <<
23
- create_extractor(layers, value, &body)
22
+ @extractors << create_extractor(layers, value, &body)
24
23
  end
25
24
 
26
25
  def ignore_value(layers, value)
@@ -12,8 +12,8 @@ module RgGen
12
12
  attr_reader :registry
13
13
  attr_reader :name
14
14
 
15
- def setup(base_feature, factory, context, body)
16
- @feature = define_feature(base_feature, context, body)
15
+ def setup(base_feature, factory, context, &body)
16
+ @feature = define_feature(base_feature, context, &body)
17
17
  @factory = factory
18
18
  end
19
19
 
@@ -27,10 +27,10 @@ module RgGen
27
27
 
28
28
  private
29
29
 
30
- def define_feature(base, context, body)
30
+ def define_feature(base, context, &body)
31
31
  feature = Class.new(base)
32
32
  context && feature.attach_context(context)
33
- body && feature.class_exec(@name, &body)
33
+ block_given? && feature.class_exec(@name, &body)
34
34
  feature
35
35
  end
36
36
  end
@@ -2,10 +2,10 @@
2
2
 
3
3
  class Object
4
4
  def export_instance_variable(variable, to)
5
- return unless instance_variable_defined?(variable)
6
- v = instance_variable_get(variable)
7
- v = yield(v) if block_given?
8
- to.instance_variable_set(variable, v)
5
+ instance_variable_defined?(variable) &&
6
+ instance_variable_get(variable)
7
+ .yield_self { |v| block_given? ? yield(v) : v }
8
+ .yield_self { |v| to.instance_variable_set(variable, v) }
9
9
  end
10
10
 
11
11
  def singleton_exec(*args, &block)
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'facets/array/merge'
4
4
  require 'facets/file/ext'
5
+ require 'facets/hash/except' if RUBY_VERSION < '3.0.0'
5
6
  require 'facets/pathname/to_path'
6
7
  require 'facets/module/attr_setter'
7
8
  require 'facets/module/lastname'
@@ -9,10 +9,22 @@ module RgGen
9
9
  define_proxy_calls(feature, feature.properties)
10
10
  end
11
11
 
12
+ def document_only
13
+ @document_only = true
14
+ end
15
+
16
+ def document_only?
17
+ instance_variable_defined?(:@document_only) && @document_only
18
+ end
19
+
12
20
  def properties
13
21
  features.flat_map(&:properties)
14
22
  end
15
23
 
24
+ def post_build
25
+ features.each(&:post_build)
26
+ end
27
+
16
28
  def verify(scope)
17
29
  features.each { |feature| feature.verify(scope) }
18
30
  children.each { |child| child.verify(scope) } if scope == :all
@@ -79,6 +79,7 @@ module RgGen
79
79
  def post_build(component)
80
80
  exist_no_children?(component) &&
81
81
  raise_no_children_error(component)
82
+ component.post_build
82
83
  component.verify(:component)
83
84
  end
84
85
 
@@ -34,6 +34,13 @@ module RgGen
34
34
 
35
35
  attr_reader :builders
36
36
 
37
+ def post_build(&block)
38
+ @post_builders ||= []
39
+ @post_builders << block
40
+ end
41
+
42
+ attr_reader :post_builders
43
+
37
44
  def active_feature?
38
45
  !passive_feature?
39
46
  end
@@ -68,6 +75,7 @@ module RgGen
68
75
  export_instance_variable(:@properties, subclass, &:dup)
69
76
  export_instance_variable(:@ignore_empty_value, subclass)
70
77
  export_instance_variable(:@builders, subclass, &:dup)
78
+ export_instance_variable(:@post_builders, subclass, &:dup)
71
79
  export_instance_variable(:@input_matcher, subclass)
72
80
  export_instance_variable(:@printables, subclass, &:dup)
73
81
  export_verifiers(subclass) if @verifiers
@@ -95,6 +103,12 @@ module RgGen
95
103
  self.class.builders && do_build(args)
96
104
  end
97
105
 
106
+ def post_build
107
+ self.class.post_builders&.each do |post_builder|
108
+ instance_exec(&post_builder)
109
+ end
110
+ end
111
+
98
112
  def verify(scope)
99
113
  verified?(scope) || do_verify(scope)
100
114
  end
@@ -102,7 +116,7 @@ module RgGen
102
116
  def printables
103
117
  helper
104
118
  .printables
105
- &.map { |name, body| [name, printable(name, body)] }
119
+ &.map { |name, body| [name, printable(name, &body)] }
106
120
  end
107
121
 
108
122
  def printable?
@@ -119,10 +133,10 @@ module RgGen
119
133
 
120
134
  def do_build(args)
121
135
  @position = args.last.position
122
- args = [*args[0..-2], args.last.value]
123
- match_automatically? && match_pattern(args.last)
136
+ value = args.last.value
137
+ match_automatically? && match_pattern(value)
124
138
  Array(self.class.builders)
125
- .each { |builder| instance_exec(*args, &builder) }
139
+ .each { |builder| instance_exec(*args[0..-2], value, &builder) }
126
140
  end
127
141
 
128
142
  attr_reader :position
@@ -154,8 +168,8 @@ module RgGen
154
168
  (@verified ||= {})[scope] = true
155
169
  end
156
170
 
157
- def printable(name, body)
158
- body ? instance_exec(&body) : __send__(name)
171
+ def printable(name, &body)
172
+ block_given? ? instance_exec(&body) : __send__(name)
159
173
  end
160
174
  end
161
175
  end
@@ -17,14 +17,8 @@ module RgGen
17
17
 
18
18
  def value(value_name, value, position = nil)
19
19
  symbolized_name = value_name.to_sym
20
- return unless valid_value?(symbolized_name)
21
- @values[symbolized_name] =
22
- case value
23
- when InputValue
24
- value
25
- else
26
- InputValue.new(value, position)
27
- end
20
+ valid_value?(symbolized_name) &&
21
+ assign_value(symbolized_name, value, position)
28
22
  end
29
23
 
30
24
  def []=(value_name, position_or_value, value = nil)
@@ -44,14 +38,14 @@ module RgGen
44
38
 
45
39
  def child(layer, value_list = nil, &block)
46
40
  create_child_data(layer) do |child_data|
47
- child_data.build_by_block(block)
41
+ child_data.build_by_block(&block)
48
42
  child_data.values(value_list)
49
43
  @children << child_data
50
44
  end
51
45
  end
52
46
 
53
47
  def load_file(file)
54
- build_by_block(instance_eval(<<~BODY, file, 1))
48
+ build_by_block(&instance_eval(<<~BODY, file, 1))
55
49
  -> { #{File.binread(file)} } # -> { File.binread(file) }
56
50
  BODY
57
51
  end
@@ -62,6 +56,16 @@ module RgGen
62
56
  @valid_value_lists[layer].include?(value_name)
63
57
  end
64
58
 
59
+ def assign_value(value_name, value, position)
60
+ @values[value_name] =
61
+ case value
62
+ when InputValue
63
+ value
64
+ else
65
+ InputValue.new(value, position)
66
+ end
67
+ end
68
+
65
69
  def define_setter_methods
66
70
  @valid_value_lists[layer].each(&method(:define_setter_method))
67
71
  end
@@ -73,8 +77,7 @@ module RgGen
73
77
  end
74
78
 
75
79
  def value_setter(value_name, value, position)
76
- position ||= position_from_caller
77
- value(value_name, value, position)
80
+ value(value_name, value, position || position_from_caller)
78
81
  end
79
82
 
80
83
  def position_from_caller
@@ -96,8 +99,8 @@ module RgGen
96
99
 
97
100
  protected
98
101
 
99
- def build_by_block(block)
100
- block && Docile.dsl_eval(self, &block)
102
+ def build_by_block(&block)
103
+ block_given? && Docile.dsl_eval(self, &block)
101
104
  end
102
105
  end
103
106
  end
@@ -11,9 +11,10 @@ module RgGen
11
11
  end
12
12
 
13
13
  def match(rhs)
14
- rhs = rhs.to_s
15
- rhs = delete_blanks(rhs) if ignore_blanks?
16
- match_patterns(rhs)
14
+ rhs
15
+ .to_s
16
+ .yield_self { |s| ignore_blanks? && delete_blanks(s) || s }
17
+ .yield_self(&method(:match_patterns))
17
18
  end
18
19
 
19
20
  def match_automatically?
@@ -64,8 +65,7 @@ module RgGen
64
65
  index, match_data =
65
66
  @patterns
66
67
  .transform_values { |pattern| pattern.match(rhs) }
67
- .compact
68
- .max_by { |_, m| m[0].length }
68
+ .max_by { |_, m| m && m[0].length || 0 }
69
69
  match_data && [convert_match_data(match_data), index]
70
70
  end
71
71
 
@@ -53,33 +53,33 @@ module RgGen
53
53
  end
54
54
 
55
55
  def format_layer_data_by_extractors(read_data, layer)
56
- layer_data = {}
57
- valid_values(layer).each do |value|
58
- @extractors
59
- .select { |extractor| extractor.target_value?(layer, value) }
60
- .each do |extractor|
61
- extract_value(read_data, extractor, layer_data, value)
62
- end
63
- end
56
+ layer_data =
57
+ valid_values(layer)
58
+ .map { |value_name| extract_value(read_data, layer, value_name) }
59
+ .compact.to_h
64
60
  layer_data.empty? ? nil : layer_data
65
61
  end
66
62
 
67
- def extract_value(read_data, extractor, layer_data, value)
68
- data = extractor.extract(read_data)
69
- data && (layer_data[value] = data)
63
+ def extract_value(read_data, layer, value_name)
64
+ value =
65
+ @extractors
66
+ .select { |extractor| extractor.target_value?(layer, value_name) }
67
+ .map { |extractor| extractor.extract(read_data) }
68
+ .compact.last
69
+ value && [value_name, value]
70
70
  end
71
71
 
72
72
  def filter_layer_data(layer_data, layer)
73
- layer_data
74
- .select { |key, _| valid_values(layer).include?(key) }
73
+ layer_data.slice(*valid_values(layer))
75
74
  end
76
75
 
77
76
  def format_sub_layer_data(_read_data, _layer, _file)
78
77
  end
79
78
 
80
79
  def valid_values(layer)
81
- @valid_value_lists[layer]
82
- .reject { |value| @ignore_values[layer]&.include?(value) }
80
+ list = @valid_value_lists[layer]
81
+ ignore_values = @ignore_values[layer]
82
+ ignore_values && (list - ignore_values) || list
83
83
  end
84
84
  end
85
85
  end
@@ -5,13 +5,18 @@ module RgGen
5
5
  module InputBase
6
6
  class Property
7
7
  def self.define(feature, name, **options, &body)
8
- new(name, options, body).define(feature)
8
+ new(name, options, &body).define(feature)
9
9
  end
10
10
 
11
- def initialize(name, options, body)
11
+ def initialize(name, options, &body)
12
12
  @name = name
13
13
  @options = options
14
- @costom_property = create_costom_property(@options[:body] || body)
14
+ @costom_property =
15
+ if options[:body]
16
+ create_costom_property(&options[:body])
17
+ elsif block_given?
18
+ create_costom_property(&body)
19
+ end
15
20
  end
16
21
 
17
22
  attr_reader :name
@@ -19,15 +24,15 @@ module RgGen
19
24
  def define(feature)
20
25
  feature.class_exec(self) do |property|
21
26
  define_method(property.name) do |*args, &block|
22
- property.evaluate(self, args, block)
27
+ property.evaluate(self, args, &block)
23
28
  end
24
29
  end
25
30
  end
26
31
 
27
- def evaluate(feature, args, block)
32
+ def evaluate(feature, args, &block)
28
33
  feature.verify(@options[:verify]) if @options.key?(:verify)
29
34
  if proxy_property?
30
- proxy_property(feature, args, block)
35
+ proxy_property(feature, args, &block)
31
36
  else
32
37
  default_property(feature)
33
38
  end
@@ -35,7 +40,7 @@ module RgGen
35
40
 
36
41
  private
37
42
 
38
- def create_costom_property(body)
43
+ def create_costom_property(&body)
39
44
  body && Module.new.module_eval do
40
45
  define_method(:__costom_property__, &body)
41
46
  instance_method(:__costom_property__)
@@ -50,7 +55,7 @@ module RgGen
50
55
  ].any?
51
56
  end
52
57
 
53
- def proxy_property(feature, args, block)
58
+ def proxy_property(feature, args, &block)
54
59
  receiver, method =
55
60
  if @costom_property
56
61
  [@costom_property.bind(feature), :call]
@@ -63,7 +68,7 @@ module RgGen
63
68
  end
64
69
 
65
70
  def default_property(feature)
66
- varible_name = "@#{@name[-1] == '?' ? @name[0..-2] : @name}"
71
+ varible_name = "@#{@name.to_s.delete_suffix('?')}"
67
72
  if feature.instance_variable_defined?(varible_name)
68
73
  feature.instance_variable_get(varible_name)
69
74
  elsif @options.key?(:initial)
@@ -74,8 +79,9 @@ module RgGen
74
79
  end
75
80
 
76
81
  def set_initial_value(feature, varible_name)
77
- value = evaluate_default_initial_value(feature, @options[:initial])
78
- feature.instance_variable_set(varible_name, value)
82
+ @options[:initial]
83
+ .yield_self { |v| evaluate_default_initial_value(feature, v) }
84
+ .yield_self { |v| feature.instance_variable_set(varible_name, v) }
79
85
  end
80
86
 
81
87
  def evaluate_default_initial_value(feature, value)
@@ -14,30 +14,9 @@ module RgGen
14
14
  symbolize_names: true
15
15
  )
16
16
  end
17
- elsif RUBY_VERSION >= '2.5.0'
18
- def yaml_safe_load(yaml, file)
19
- YAML.safe_load(yaml, [Symbol], [], true, file, symbolize_names: true)
20
- end
21
17
  else
22
18
  def yaml_safe_load(yaml, file)
23
- reuslt = YAML.safe_load(yaml, [Symbol], [], true, file)
24
- symbolize_keys(reuslt)
25
- end
26
-
27
- def symbolize_keys(result)
28
- case result
29
- when Hash then symbolize_hash(result)
30
- when Array then symbolize_array(result)
31
- else result
32
- end
33
- end
34
-
35
- def symbolize_hash(result)
36
- result.map { |key, value| [key.to_sym, symbolize_keys(value)] }.to_h
37
- end
38
-
39
- def symbolize_array(result)
40
- result.map(&method(:symbolize_keys))
19
+ YAML.safe_load(yaml, [Symbol], [], true, file, symbolize_names: true)
41
20
  end
42
21
  end
43
22
 
@@ -4,14 +4,13 @@ module RgGen
4
4
  module Core
5
5
  module OutputBase
6
6
  class CodeGenerator
7
- def register(kind, block)
8
- return unless block
9
- code_blocks[kind] << block
7
+ def register(kind, &block)
8
+ block_given? && (code_blocks[kind] << block)
10
9
  end
11
10
 
12
11
  def generate(context, code, kind)
13
12
  code_blocks[kind].each do |block|
14
- execute_code_block(context, code, block)
13
+ execute_code_block(context, code, &block)
15
14
  end
16
15
  end
17
16
 
@@ -27,7 +26,7 @@ module RgGen
27
26
  @code_blocks ||= Hash.new { |blocks, kind| blocks[kind] = [] }
28
27
  end
29
28
 
30
- def execute_code_block(context, code, block)
29
+ def execute_code_block(context, code, &block)
31
30
  if block.arity.zero?
32
31
  code << context.instance_exec(&block)
33
32
  else
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module OutputBase
6
+ class DocumentComponentFactory < ComponentFactory
7
+ end
8
+ end
9
+ end
10
+ end
@@ -40,26 +40,30 @@ module RgGen
40
40
 
41
41
  [:pre_code, :main_code, :post_code].each do |phase|
42
42
  define_method(phase) do |kind, **options, &body|
43
- block =
44
- if options[:from_template]
45
- caller_location = caller_locations(1, 1).first
46
- template_path = extract_template_path(options)
47
- -> { process_template(template_path, caller_location) }
48
- else
49
- body
50
- end
51
- code_generators[__method__] ||= CodeGenerator.new
52
- code_generators[__method__].register(kind, block)
43
+ register_code_generator(__method__, kind, **options, &body)
53
44
  end
54
45
  end
55
46
 
47
+ def register_code_generator(phase, kind, **options, &body)
48
+ block =
49
+ if options[:from_template]
50
+ path = extract_template_path(options)
51
+ location = caller_locations(2, 1).first
52
+ -> { process_template(path, location) }
53
+ else
54
+ body
55
+ end
56
+ (code_generators[phase] ||= CodeGenerator.new)
57
+ .register(kind, &block)
58
+ end
59
+
56
60
  def extract_template_path(options)
57
61
  path = options[:from_template]
58
62
  path.equal?(true) ? nil : path
59
63
  end
60
64
 
61
65
  def write_file(file_name_pattern, &body)
62
- @file_writer = FileWriter.new(file_name_pattern, body)
66
+ @file_writer = FileWriter.new(file_name_pattern, &body)
63
67
  end
64
68
 
65
69
  def export(*methods)
@@ -4,7 +4,7 @@ module RgGen
4
4
  module Core
5
5
  module OutputBase
6
6
  class FileWriter
7
- def initialize(pattern, body)
7
+ def initialize(pattern, &body)
8
8
  @pattern = Erubi::Engine.new(pattern)
9
9
  @body = body
10
10
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module OutputBase
6
+ class SourceFileComponentFactory < ComponentFactory
7
+ private
8
+
9
+ def create_component?(_, register_map)
10
+ !register_map.document_only?
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -11,15 +11,14 @@ module RgGen
11
11
  caller_location ||= caller_locations(1, 1).first
12
12
  path = File.ext(caller_location.path, file_extension.to_s)
13
13
  end
14
- render(context, templates[path])
14
+ render(context, template(path))
15
15
  end
16
16
 
17
17
  private
18
18
 
19
- def templates
20
- @templates ||= Hash.new do |templates, path|
21
- templates[path] = parse_template(path)
22
- end
19
+ def template(path)
20
+ @templates ||= {}
21
+ (@templates[path] ||= parse_template(path))
23
22
  end
24
23
  end
25
24
  end
@@ -29,14 +29,13 @@ module RgGen
29
29
  end
30
30
 
31
31
  def format_array_layer_data(read_data, layer, file)
32
- read_data.each_with_object({}) do |data, layer_data|
33
- layer_data.merge!(fomrat_hash_layer_data(data, layer, file))
34
- end
32
+ read_data
33
+ .map { |data| fomrat_hash_layer_data(data, layer, file) }
34
+ .inject(&:merge)
35
35
  end
36
36
 
37
37
  def fomrat_hash_layer_data(read_data, layer, file)
38
- convert_to_hash(read_data, file)
39
- .reject { |key, _| SUB_LAYER_KEYS[layer]&.include?(key) }
38
+ convert_to_hash(read_data, file).except(*SUB_LAYER_KEYS[layer])
40
39
  end
41
40
 
42
41
  def format_sub_layer_data(read_data, layer, file)
@@ -55,10 +54,8 @@ module RgGen
55
54
 
56
55
  def format_hash_sub_layer_data(read_data, layer, file, sub_layer_data = {})
57
56
  convert_to_hash(read_data, file)
58
- .select { |key, _| SUB_LAYER_KEYS[layer]&.include?(key) }
59
- .each do |key, value|
60
- merge_sub_layer_data(sub_layer_data, layer, key, value)
61
- end
57
+ .slice(*SUB_LAYER_KEYS[layer])
58
+ .each { |k, v| merge_sub_layer_data(sub_layer_data, layer, k, v) }
62
59
  sub_layer_data
63
60
  end
64
61
 
@@ -15,11 +15,13 @@ module RgGen
15
15
  attr_reader :indent
16
16
 
17
17
  def <<(rhs)
18
- return push_string(rhs) if rhs.is_a?(String)
19
- return push_code_block(rhs) if rhs.is_a?(CodeBlock)
20
- return rhs.inject(self, :<<) if rhs.is_a?(Array)
21
- return self << rhs.to_code if rhs.respond_to?(:to_code)
22
- push_word(rhs)
18
+ case rhs
19
+ when String then push_string(rhs)
20
+ when CodeBlock then push_code_block(rhs)
21
+ when Array then rhs.inject(self, :<<)
22
+ when code? then self << rhs.to_code
23
+ else push_word(rhs)
24
+ end
23
25
  end
24
26
 
25
27
  def indent=(indent)
@@ -74,6 +76,10 @@ module RgGen
74
76
  self
75
77
  end
76
78
 
79
+ def code?
80
+ ->(rhs) { rhs.respond_to?(:to_code) }
81
+ end
82
+
77
83
  def newline
78
84
  "\n"
79
85
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module RgGen
4
4
  module Core
5
- VERSION = '0.24.0'
5
+ VERSION = '0.25.0'
6
6
  MAJOR, MINOR, PATCH = VERSION.split('.').map(&:to_i)
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rggen-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.24.0
4
+ version: 0.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taichi Ishitani
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-20 00:00:00.000000000 Z
11
+ date: 2021-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docile
@@ -106,7 +106,6 @@ files:
106
106
  - lib/rggen/core/base/feature_factory.rb
107
107
  - lib/rggen/core/base/feature_layer_extension.rb
108
108
  - lib/rggen/core/base/internal_struct.rb
109
- - lib/rggen/core/base/proxy_call.rb
110
109
  - lib/rggen/core/base/shared_context.rb
111
110
  - lib/rggen/core/builder.rb
112
111
  - lib/rggen/core/builder/builder.rb
@@ -158,11 +157,13 @@ files:
158
157
  - lib/rggen/core/output_base/code_generator.rb
159
158
  - lib/rggen/core/output_base/component.rb
160
159
  - lib/rggen/core/output_base/component_factory.rb
160
+ - lib/rggen/core/output_base/document_component_factory.rb
161
161
  - lib/rggen/core/output_base/erb_engine.rb
162
162
  - lib/rggen/core/output_base/feature.rb
163
163
  - lib/rggen/core/output_base/feature_factory.rb
164
164
  - lib/rggen/core/output_base/file_writer.rb
165
165
  - lib/rggen/core/output_base/raise_error.rb
166
+ - lib/rggen/core/output_base/source_file_component_factory.rb
166
167
  - lib/rggen/core/output_base/template_engine.rb
167
168
  - lib/rggen/core/plugin.rb
168
169
  - lib/rggen/core/printers.rb
@@ -204,7 +205,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
204
205
  requirements:
205
206
  - - ">="
206
207
  - !ruby/object:Gem::Version
207
- version: '2.4'
208
+ version: '2.5'
208
209
  required_rubygems_version: !ruby/object:Gem::Requirement
209
210
  requirements:
210
211
  - - ">="
@@ -214,5 +215,5 @@ requirements: []
214
215
  rubygems_version: 3.2.3
215
216
  signing_key:
216
217
  specification_version: 4
217
- summary: rggen-core-0.24.0
218
+ summary: rggen-core-0.25.0
218
219
  test_files: []
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RgGen
4
- module Core
5
- module Base
6
- class ProxyCall
7
- def initialize(receiver, method)
8
- @receiver = receiver
9
- @method = method
10
- end
11
-
12
- def call(*args, &block)
13
- @receiver.__send__(@method, *args, &block)
14
- end
15
- end
16
- end
17
- end
18
- end