rggen-core 0.15.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -2
  4. data/exe/rggen +0 -0
  5. data/lib/rggen/core.rb +4 -4
  6. data/lib/rggen/core/base/component.rb +25 -4
  7. data/lib/rggen/core/base/component_factory.rb +22 -9
  8. data/lib/rggen/core/base/component_layer_extension.rb +194 -0
  9. data/lib/rggen/core/base/feature.rb +16 -3
  10. data/lib/rggen/core/base/feature_factory.rb +7 -5
  11. data/lib/rggen/core/base/feature_layer_extension.rb +158 -0
  12. data/lib/rggen/core/builder/builder.rb +25 -25
  13. data/lib/rggen/core/builder/component_entry.rb +6 -1
  14. data/lib/rggen/core/builder/component_registry.rb +24 -18
  15. data/lib/rggen/core/builder/{category.rb → layer.rb} +27 -26
  16. data/lib/rggen/core/builder/plugins.rb +5 -3
  17. data/lib/rggen/core/configuration/component.rb +5 -0
  18. data/lib/rggen/core/configuration/component_factory.rb +1 -5
  19. data/lib/rggen/core/configuration/input_data.rb +15 -0
  20. data/lib/rggen/core/input_base/component_factory.rb +37 -6
  21. data/lib/rggen/core/input_base/feature.rb +15 -5
  22. data/lib/rggen/core/input_base/input_data.rb +13 -10
  23. data/lib/rggen/core/input_base/input_matcher.rb +15 -16
  24. data/lib/rggen/core/input_base/loader.rb +2 -3
  25. data/lib/rggen/core/input_base/verifier.rb +6 -7
  26. data/lib/rggen/core/input_base/yaml_loader.rb +22 -17
  27. data/lib/rggen/core/output_base/code_generator.rb +10 -23
  28. data/lib/rggen/core/output_base/component.rb +42 -39
  29. data/lib/rggen/core/output_base/component_factory.rb +6 -2
  30. data/lib/rggen/core/output_base/feature.rb +6 -7
  31. data/lib/rggen/core/printers.rb +2 -2
  32. data/lib/rggen/core/register_map.rb +3 -3
  33. data/lib/rggen/core/register_map/component.rb +4 -3
  34. data/lib/rggen/core/register_map/component_factory.rb +20 -3
  35. data/lib/rggen/core/register_map/feature.rb +2 -2
  36. data/lib/rggen/core/register_map/hash_loader.rb +16 -23
  37. data/lib/rggen/core/register_map/input_data.rb +30 -16
  38. data/lib/rggen/core/register_map/loader.rb +1 -1
  39. data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
  40. data/lib/rggen/core/utility/code_utility.rb +8 -2
  41. data/lib/rggen/core/version.rb +1 -1
  42. metadata +9 -9
  43. data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
  44. data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
  45. data/lib/rggen/core/core_extensions/casecmp.rb +0 -12
@@ -63,9 +63,11 @@ module RgGen
63
63
  @plugins << Plugin.new(name, module_or_version, &block)
64
64
  end
65
65
 
66
- def activate(builder)
67
- @plugins.each { |plugin| plugin.default_setup(builder) }
68
- @plugins.each { |plugin| plugin.optional_setup(builder) }
66
+ def activate(builder, **options)
67
+ options[:no_default_setup] ||
68
+ @plugins.each { |plugin| plugin.default_setup(builder) }
69
+ options[:no_optional_setup] ||
70
+ @plugins.each { |plugin| plugin.optional_setup(builder) }
69
71
  end
70
72
 
71
73
  def version_info
@@ -4,6 +4,11 @@ module RgGen
4
4
  module Core
5
5
  module Configuration
6
6
  class Component < InputBase::Component
7
+ private
8
+
9
+ def post_initialize
10
+ need_no_children
11
+ end
7
12
  end
8
13
  end
9
14
  end
@@ -6,12 +6,8 @@ module RgGen
6
6
  class ComponentFactory < InputBase::ComponentFactory
7
7
  private
8
8
 
9
- def create_component(*_, &block)
10
- @target_component.new(&block)
11
- end
12
-
13
9
  def create_input_data(&block)
14
- InputBase::InputData.new(valid_value_lists, &block)
10
+ InputData.new(valid_value_lists, &block)
15
11
  end
16
12
  end
17
13
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module Configuration
6
+ class InputData < InputBase::InputData
7
+ def initialize(valid_value_lists, &block)
8
+ super(nil, valid_value_lists, &block)
9
+ end
10
+
11
+ undef_method :child
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,6 +4,20 @@ module RgGen
4
4
  module Core
5
5
  module InputBase
6
6
  class ComponentFactory < Base::ComponentFactory
7
+ class << self
8
+ def enable_no_children_error
9
+ @enable_no_children_error = true
10
+ end
11
+
12
+ def disable_no_children_error
13
+ @enable_no_children_error = false
14
+ end
15
+
16
+ def enable_no_children_error?
17
+ @enable_no_children_error.nil? || @enable_no_children_error
18
+ end
19
+ end
20
+
7
21
  attr_setter :loaders
8
22
 
9
23
  private
@@ -27,8 +41,13 @@ module RgGen
27
41
  end
28
42
 
29
43
  def find_loader(file)
30
- loader = loaders.find { |l| l.support?(file) }
31
- loader || (raise Core::LoadError.new('unsupported file type', file))
44
+ loaders.find { |l| l.support?(file) } ||
45
+ (raise Core::LoadError.new('unsupported file type', file))
46
+ end
47
+
48
+ def valid_value_lists
49
+ component_factories
50
+ .transform_values(&->(f) { f.valid_value_list })
32
51
  end
33
52
 
34
53
  def create_input_data(&block)
@@ -58,9 +77,23 @@ module RgGen
58
77
  end
59
78
 
60
79
  def post_build(component)
80
+ exist_no_children?(component) &&
81
+ raise_no_children_error(component)
61
82
  component.verify(:component)
62
83
  end
63
84
 
85
+ def exist_no_children?(component)
86
+ enable_no_children_error? &&
87
+ component.need_children? && component.children.empty?
88
+ end
89
+
90
+ def enable_no_children_error?
91
+ self.class.enable_no_children_error?
92
+ end
93
+
94
+ def raise_no_children_error(_component)
95
+ end
96
+
64
97
  def finalize(component)
65
98
  component.verify(:all)
66
99
  end
@@ -77,10 +110,8 @@ module RgGen
77
110
 
78
111
  protected
79
112
 
80
- def valid_value_lists
81
- list = [Array(active_feature_factories&.keys)]
82
- list.concat(Array(child_factory&.valid_value_lists))
83
- list
113
+ def valid_value_list
114
+ Array(active_feature_factories&.keys)
84
115
  end
85
116
  end
86
117
  end
@@ -44,14 +44,14 @@ module RgGen
44
44
 
45
45
  def input_pattern(pattern_or_patterns, **options, &converter)
46
46
  @input_matcher =
47
- InputMatcher.new(pattern_or_patterns, options, &converter)
47
+ InputMatcher.new(pattern_or_patterns, **options, &converter)
48
48
  end
49
49
 
50
50
  attr_reader :input_matcher
51
51
 
52
52
  def verify(scope, &block)
53
53
  @verifiers ||= {}
54
- (@verifiers[scope] ||= []) << Verifier.new(&block)
54
+ (@verifiers[scope] ||= []) << create_verifier(&block)
55
55
  end
56
56
 
57
57
  attr_reader :verifiers
@@ -75,10 +75,14 @@ module RgGen
75
75
 
76
76
  private
77
77
 
78
+ def create_verifier(&body)
79
+ Verifier.new(&body)
80
+ end
81
+
78
82
  def export_verifiers(subclass)
79
- copied_verifiers =
80
- @verifiers.map { |scope, blocks| [scope, blocks.dup] }.to_h
81
- subclass.instance_variable_set(:@verifiers, copied_verifiers)
83
+ subclass.instance_variable_set(
84
+ :@verifiers, @verifiers.transform_values(&:dup)
85
+ )
82
86
  end
83
87
  end
84
88
 
@@ -105,6 +109,12 @@ module RgGen
105
109
  !helper.printables.nil?
106
110
  end
107
111
 
112
+ def inspect
113
+ printable_values =
114
+ printables&.map { |name, value| "#{name}: #{value.inspect}" }
115
+ (printable_values && "#{super}[#{printable_values.join(', ')}]") || super
116
+ end
117
+
108
118
  private
109
119
 
110
120
  def do_build(args)
@@ -4,7 +4,8 @@ module RgGen
4
4
  module Core
5
5
  module InputBase
6
6
  class InputData
7
- def initialize(valid_value_lists)
7
+ def initialize(layer, valid_value_lists)
8
+ @layer = layer
8
9
  @valid_value_lists = valid_value_lists
9
10
  @values = Hash.new(NAValue)
10
11
  @children = []
@@ -12,6 +13,8 @@ module RgGen
12
13
  block_given? && yield(self)
13
14
  end
14
15
 
16
+ attr_reader :layer
17
+
15
18
  def value(value_name, value, position = nil)
16
19
  symbolized_name = value_name.to_sym
17
20
  return unless valid_value?(symbolized_name)
@@ -24,8 +27,8 @@ module RgGen
24
27
  end
25
28
  end
26
29
 
27
- def []=(value_name, position = nil, value)
28
- value(value_name, value, position)
30
+ def []=(value_name, position_or_value, value = nil)
31
+ value(value_name, value || position_or_value, position_or_value)
29
32
  end
30
33
 
31
34
  def [](value_name)
@@ -39,8 +42,8 @@ module RgGen
39
42
 
40
43
  attr_reader :children
41
44
 
42
- def child(value_list = nil, &block)
43
- create_child_data do |child_data|
45
+ def child(layer, value_list = nil, &block)
46
+ create_child_data(layer) do |child_data|
44
47
  child_data.build_by_block(block)
45
48
  child_data.values(value_list)
46
49
  @children << child_data
@@ -56,11 +59,11 @@ module RgGen
56
59
  private
57
60
 
58
61
  def valid_value?(value_name)
59
- @valid_value_lists.first.include?(value_name)
62
+ @valid_value_lists[layer].include?(value_name)
60
63
  end
61
64
 
62
65
  def define_setter_methods
63
- @valid_value_lists.first.each(&method(:define_setter_method))
66
+ @valid_value_lists[layer].each(&method(:define_setter_method))
64
67
  end
65
68
 
66
69
  def define_setter_method(value_name)
@@ -79,12 +82,12 @@ module RgGen
79
82
  locations[0].path.include?('docile') ? locations[1] : locations[0]
80
83
  end
81
84
 
82
- def create_child_data(&block)
83
- child_data_class.new(@valid_value_lists[1..-1], &block)
85
+ def create_child_data(layer, &block)
86
+ child_data_class.new(layer, @valid_value_lists, &block)
84
87
  end
85
88
 
86
89
  def child_data_class
87
- InputData
90
+ self.class
88
91
  end
89
92
 
90
93
  protected
@@ -4,7 +4,7 @@ module RgGen
4
4
  module Core
5
5
  module InputBase
6
6
  class InputMatcher
7
- def initialize(pattern_or_patterns, options, &converter)
7
+ def initialize(pattern_or_patterns, **options, &converter)
8
8
  @options = options
9
9
  @converter = converter
10
10
  @patterns = format_patterns(pattern_or_patterns)
@@ -22,23 +22,22 @@ module RgGen
22
22
 
23
23
  private
24
24
 
25
- def format_patterns(patterns)
25
+ def format_patterns(pattern_or_patterns)
26
26
  if @options.fetch(:match_wholly, true)
27
- patterns_hash(patterns)
28
- .map { |i, pattern| [i, /\A#{pattern}\z/] }
29
- .to_h
27
+ expand_patterns(pattern_or_patterns)
28
+ .transform_values { |pattern| /\A#{pattern}\z/ }
30
29
  else
31
- patterns_hash(patterns)
30
+ expand_patterns(pattern_or_patterns)
32
31
  end
33
32
  end
34
33
 
35
- def patterns_hash(patterns)
36
- if patterns.is_a?(Hash)
37
- patterns
38
- else
39
- Array(patterns)
40
- .map.with_index { |pattern, i| [i, pattern] }
41
- .to_h
34
+ def expand_patterns(pattern_or_patterns)
35
+ Array(pattern_or_patterns).each_with_object({}) do |pattern, patterns|
36
+ if pattern.is_a? Hash
37
+ patterns.update(pattern)
38
+ else
39
+ patterns[patterns.size] = pattern
40
+ end
42
41
  end
43
42
  end
44
43
 
@@ -62,11 +61,11 @@ module RgGen
62
61
  end
63
62
 
64
63
  def match_patterns(rhs)
65
- match_data, index =
64
+ index, match_data =
66
65
  @patterns
67
- .map { |i, pattern| pattern.match(rhs) { |m| [m, i] } }
66
+ .transform_values { |pattern| pattern.match(rhs) }
68
67
  .compact
69
- .max { |m| m[0].length }
68
+ .max_by { |_, m| m[0].length }
70
69
  match_data && [convert_match_data(match_data), index]
71
70
  end
72
71
 
@@ -25,9 +25,8 @@ module RgGen
25
25
  end
26
26
 
27
27
  def load_file(file)
28
- File.readable?(file) || (
29
- raise Core::LoadError.new('cannot load such file', file)
30
- )
28
+ File.readable?(file) ||
29
+ (raise Core::LoadError.new('cannot load such file', file))
31
30
  format(read_file(file), file)
32
31
  end
33
32
 
@@ -20,20 +20,19 @@ module RgGen
20
20
  @message = block
21
21
  end
22
22
 
23
- def verify(feature)
23
+ def verify(feature, *values)
24
24
  if @error_checker
25
- feature.instance_eval(&@error_checker)
25
+ feature.instance_exec(*values, &@error_checker)
26
26
  else
27
- default_error_check(feature)
27
+ default_error_check(feature, values)
28
28
  end
29
29
  end
30
30
 
31
31
  private
32
32
 
33
- def default_error_check(feature)
34
- feature.instance_exec(@condition, @message) do |condition, message|
35
- instance_eval(&condition) && error(instance_eval(&message))
36
- end
33
+ def default_error_check(feature, values)
34
+ feature.instance_exec(*values, &@condition) &&
35
+ feature.__send__(:error, feature.instance_exec(*values, &@message))
37
36
  end
38
37
  end
39
38
  end
@@ -6,34 +6,39 @@ module RgGen
6
6
  module YAMLLoader
7
7
  private
8
8
 
9
- def load_yaml(file)
10
- result = yaml_safe_load(File.binread(file), file)
11
- symbolize_key(result)
12
- end
13
-
14
- if Psych::VERSION >= '3.1.0'
9
+ if RUBY_VERSION >= '2.6.0'
15
10
  def yaml_safe_load(yaml, file)
16
11
  YAML.safe_load(
17
12
  yaml,
18
- permitted_classes: [Symbol], aliases: true, filename: file
13
+ permitted_classes: [Symbol], aliases: true, filename: file,
14
+ symbolize_names: true
19
15
  )
20
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
21
  else
22
22
  def yaml_safe_load(yaml, file)
23
- YAML.safe_load(yaml, [Symbol], [], true, file)
23
+ reuslt = YAML.safe_load(yaml, [Symbol], [], true, file)
24
+ symbolize_keys(reuslt)
24
25
  end
25
- end
26
26
 
27
- def symbolize_key(result)
28
- case result
29
- when Hash
30
- result.keys.each do |key|
31
- result[key.to_sym] = symbolize_key(result.delete(key))
27
+ def symbolize_keys(result)
28
+ if result.is_a? Hash
29
+ result.each_with_object({}) do |(key, value), hash|
30
+ hash[key.to_sym] = symbolize_keys(value)
31
+ end
32
+ elsif result.is_a? Array
33
+ result.map(&method(:symbolize_keys))
34
+ else
35
+ result
32
36
  end
33
- when Array
34
- result.map! { |value| symbolize_key(value) }
35
37
  end
36
- result
38
+ end
39
+
40
+ def load_yaml(file)
41
+ yaml_safe_load(File.binread(file), file)
37
42
  end
38
43
  end
39
44
  end
@@ -9,11 +9,10 @@ module RgGen
9
9
  code_blocks[kind] << block
10
10
  end
11
11
 
12
- def generate(context, kind, code)
13
- return code unless generatable?(kind)
14
- execute_code_blocks(
15
- context, kind, code || context.create_blank_code
16
- )
12
+ def generate(context, code, kind)
13
+ code_blocks[kind].each do |block|
14
+ execute_code_block(context, code, block)
15
+ end
17
16
  end
18
17
 
19
18
  def copy
@@ -28,30 +27,18 @@ module RgGen
28
27
  @code_blocks ||= Hash.new { |blocks, kind| blocks[kind] = [] }
29
28
  end
30
29
 
31
- def generatable?(kind)
32
- @code_blocks&.key?(kind)
33
- end
34
-
35
- def execute_code_blocks(context, kind, code)
36
- code_blocks[kind].each(&code_block_executor(context, code))
37
- code
38
- end
39
-
40
- def code_block_executor(context, code)
41
- lambda do |block|
42
- if block.arity.zero?
43
- code << context.instance_exec(&block)
44
- else
45
- context.instance_exec(code, &block)
46
- end
30
+ def execute_code_block(context, code, block)
31
+ if block.arity.zero?
32
+ code << context.instance_exec(&block)
33
+ else
34
+ context .instance_exec(code, &block)
47
35
  end
48
36
  end
49
37
 
50
38
  protected
51
39
 
52
40
  def copy_code_blocks(original_blocks)
53
- original_blocks
54
- .each { |kind, blocks| code_blocks[kind] = blocks.dup }
41
+ original_blocks.each { |kind, blocks| code_blocks[kind] = blocks.dup }
55
42
  end
56
43
  end
57
44
  end