dry-initializer 2.5.0 → 3.0.4

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 (67) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +367 -239
  3. data/LICENSE +20 -0
  4. data/README.md +17 -79
  5. data/dry-initializer.gemspec +29 -16
  6. data/lib/dry-initializer.rb +1 -1
  7. data/lib/dry/initializer.rb +16 -14
  8. data/lib/dry/initializer/builders.rb +2 -2
  9. data/lib/dry/initializer/builders/attribute.rb +12 -7
  10. data/lib/dry/initializer/builders/initializer.rb +9 -13
  11. data/lib/dry/initializer/builders/reader.rb +3 -1
  12. data/lib/dry/initializer/builders/signature.rb +3 -3
  13. data/lib/dry/initializer/config.rb +22 -8
  14. data/lib/dry/initializer/definition.rb +20 -71
  15. data/lib/dry/initializer/dispatchers.rb +101 -33
  16. data/lib/dry/initializer/dispatchers/build_nested_type.rb +59 -0
  17. data/lib/dry/initializer/dispatchers/check_type.rb +43 -0
  18. data/lib/dry/initializer/dispatchers/prepare_default.rb +40 -0
  19. data/lib/dry/initializer/dispatchers/prepare_ivar.rb +12 -0
  20. data/lib/dry/initializer/dispatchers/prepare_optional.rb +13 -0
  21. data/lib/dry/initializer/dispatchers/prepare_reader.rb +30 -0
  22. data/lib/dry/initializer/dispatchers/prepare_source.rb +28 -0
  23. data/lib/dry/initializer/dispatchers/prepare_target.rb +44 -0
  24. data/lib/dry/initializer/dispatchers/unwrap_type.rb +22 -0
  25. data/lib/dry/initializer/dispatchers/wrap_type.rb +28 -0
  26. data/lib/dry/initializer/mixin.rb +4 -4
  27. data/lib/dry/initializer/mixin/root.rb +1 -0
  28. data/lib/dry/initializer/struct.rb +39 -0
  29. data/lib/dry/initializer/undefined.rb +2 -0
  30. data/lib/dry/initializer/version.rb +5 -0
  31. data/lib/tasks/benchmark.rake +13 -13
  32. data/lib/tasks/profile.rake +16 -16
  33. metadata +38 -103
  34. data/.codeclimate.yml +0 -23
  35. data/.gitignore +0 -10
  36. data/.rspec +0 -4
  37. data/.rubocop.yml +0 -51
  38. data/.travis.yml +0 -24
  39. data/Gemfile +0 -29
  40. data/Guardfile +0 -5
  41. data/LICENSE.txt +0 -21
  42. data/Rakefile +0 -8
  43. data/benchmarks/compare_several_defaults.rb +0 -82
  44. data/benchmarks/plain_options.rb +0 -63
  45. data/benchmarks/plain_params.rb +0 -84
  46. data/benchmarks/with_coercion.rb +0 -71
  47. data/benchmarks/with_defaults.rb +0 -66
  48. data/benchmarks/with_defaults_and_coercion.rb +0 -59
  49. data/spec/attributes_spec.rb +0 -38
  50. data/spec/coercion_of_nil_spec.rb +0 -25
  51. data/spec/custom_dispatchers_spec.rb +0 -35
  52. data/spec/custom_initializer_spec.rb +0 -30
  53. data/spec/default_values_spec.rb +0 -83
  54. data/spec/definition_spec.rb +0 -107
  55. data/spec/invalid_default_spec.rb +0 -13
  56. data/spec/missed_default_spec.rb +0 -14
  57. data/spec/optional_spec.rb +0 -71
  58. data/spec/options_tolerance_spec.rb +0 -11
  59. data/spec/public_attributes_utility_spec.rb +0 -22
  60. data/spec/reader_spec.rb +0 -87
  61. data/spec/repetitive_definitions_spec.rb +0 -69
  62. data/spec/several_assignments_spec.rb +0 -41
  63. data/spec/spec_helper.rb +0 -21
  64. data/spec/subclassing_spec.rb +0 -49
  65. data/spec/type_argument_spec.rb +0 -35
  66. data/spec/type_constraint_spec.rb +0 -78
  67. data/spec/value_coercion_via_dry_types_spec.rb +0 -29
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015-2020 dry-rb team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,91 +1,29 @@
1
- # dry-initializer [![Join the chat at https://gitter.im/dry-rb/chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/dry-rb/chat)
2
-
3
- [![Gem Version](https://badge.fury.io/rb/dry-initializer.svg)][gem]
4
- [![Build Status](https://travis-ci.org/dry-rb/dry-initializer.svg?branch=master)][travis]
5
- [![Dependency Status](https://gemnasium.com/dry-rb/dry-initializer.svg)][gemnasium]
6
- [![Code Climate](https://codeclimate.com/github/dry-rb/dry-initializer/badges/gpa.svg)][codeclimate]
7
- [![Test Coverage](https://codeclimate.com/github/dry-rb/dry-initializer/badges/coverage.svg)][coveralls]
8
- [![Inline docs](http://inch-ci.org/github/dry-rb/dry-initializer.svg?branch=master)][inchpages]
9
-
10
1
  [gem]: https://rubygems.org/gems/dry-initializer
11
- [travis]: https://travis-ci.org/dry-rb/dry-initializer
12
- [gemnasium]: https://gemnasium.com/dry-rb/dry-initializer
13
- [codeclimate]: https://codeclimate.com/github/dry-rb/dry-initializer
14
- [coveralls]: https://coveralls.io/r/dry-rb/dry-initializer
2
+ [actions]: https://github.com/dry-rb/dry-initializer/actions
3
+ [codacy]: https://www.codacy.com/gh/dry-rb/dry-initializer
4
+ [chat]: https://dry-rb.zulipchat.com
15
5
  [inchpages]: http://inch-ci.org/github/dry-rb/dry-initializer
16
- [docs]: http://dry-rb.org/gems/dry-initializer/
17
- [benchmarks]: https://github.com/dry-rb/dry-initializer/wiki
18
- [license]: http://opensource.org/licenses/MIT
19
-
20
- DSL for building class initializer with params and options.
21
-
22
- ## Installation
23
-
24
- Add this line to your application's Gemfile:
25
-
26
- ```ruby
27
- gem 'dry-initializer'
28
- ```
29
-
30
- And then execute:
31
-
32
- ```shell
33
- $ bundle
34
- ```
35
-
36
- Or install it yourself as:
37
6
 
38
- ```shell
39
- $ gem install dry-initializer
40
- ```
7
+ # dry-initializer [![Join the chat at https://dry-rb.zulipchat.com](https://img.shields.io/badge/dry--rb-join%20chat-%23346b7a.svg)][chat]
41
8
 
42
- ## Synopsis
43
-
44
- ```ruby
45
- require 'dry-initializer'
46
- require 'dry-types'
47
-
48
- class User
49
- extend Dry::Initializer
50
-
51
- # Params of the initializer along with corresponding readers
52
- param :name, proc(&:to_s)
53
- param :role, default: -> { 'customer' }
54
- # Options of the initializer along with corresponding readers
55
- option :admin, default: -> { false }
56
- option :vip, optional: true
57
- end
58
-
59
- # Defines the initializer with params and options
60
- user = User.new 'Vladimir', 'admin', admin: true
61
-
62
- # Defines readers for single attributes
63
- user.name # => 'Vladimir'
64
- user.role # => 'admin'
65
- user.admin # => true
66
- user.vip # => Dry::Initializer::UNDEFINED
67
- ```
68
-
69
- See full documentation on the [Dry project official site][docs]
70
-
71
- ## Benchmarks
9
+ [![Gem Version](https://badge.fury.io/rb/dry-initializer.svg)][gem]
10
+ [![CI Status](https://github.com/dry-rb/dry-initializer/workflows/ci/badge.svg)][actions]
11
+ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/03c8923afd734e9fb0f4bfe9cc893edb)][codacy]
12
+ [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/03c8923afd734e9fb0f4bfe9cc893edb)][codacy]
13
+ [![Inline docs](http://inch-ci.org/github/dry-rb/dry-initializer.svg?branch=master)][inchpages]
72
14
 
73
- The `dry-initializer` is pretty fast for rubies 2.3+ [comparing to other libraries][benchmarks].
15
+ ## Links
74
16
 
75
- ## Compatibility
17
+ * [User documentation](http://dry-rb.org/gems/dry-initializer)
18
+ * [API documentation](http://rubydoc.info/gems/dry-initializer)
76
19
 
77
- Tested under rubies [compatible to MRI 2.3+](.travis.yml).
20
+ ## Supported Ruby versions
78
21
 
79
- ## Contributing
22
+ This library officially supports the following Ruby versions:
80
23
 
81
- * [Fork the project](https://github.com/dry-rb/dry-initializer)
82
- * Create your feature branch (`git checkout -b my-new-feature`)
83
- * Add tests for it
84
- * Commit your changes (`git commit -am '[UPDATE] Add some feature'`)
85
- * Push to the branch (`git push origin my-new-feature`)
86
- * Create a new Pull Request
24
+ * MRI >= `2.4`
25
+ * jruby >= `9.2`
87
26
 
88
27
  ## License
89
28
 
90
- The gem is available as open source under the terms of the [MIT License][license].
91
-
29
+ See `LICENSE` file.
@@ -1,20 +1,33 @@
1
- Gem::Specification.new do |gem|
2
- gem.name = "dry-initializer"
3
- gem.version = "2.5.0"
4
- gem.author = ["Vladimir Kochnev (marshall-lee)", "Andrew Kozin (nepalez)"]
5
- gem.email = "andrew.kozin@gmail.com"
6
- gem.homepage = "https://github.com/dryrb/dry-initializer"
7
- gem.summary = "DSL for declaring params and options of the initializer"
8
- gem.license = "MIT"
1
+ # frozen_string_literal: true
2
+ # this file is managed by dry-rb/devtools project
9
3
 
10
- gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
11
- gem.test_files = gem.files.grep(/^spec/)
12
- gem.extra_rdoc_files = Dir["README.md", "LICENSE", "CHANGELOG.md"]
4
+ lib = File.expand_path('lib', __dir__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+ require 'dry/initializer/version'
13
7
 
14
- gem.required_ruby_version = ">= 2.3"
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'dry-initializer'
10
+ spec.authors = ["Vladimir Kochnev (marshall-lee)", "Andrew Kozin (nepalez)"]
11
+ spec.email = ["andrew.kozin@gmail.com"]
12
+ spec.license = 'MIT'
13
+ spec.version = Dry::Initializer::VERSION.dup
15
14
 
16
- gem.add_development_dependency "rspec", "~> 3.0"
17
- gem.add_development_dependency "rake", "> 10"
18
- gem.add_development_dependency "dry-types", "> 0.5.1"
19
- gem.add_development_dependency "rubocop", "~> 0.49.0"
15
+ spec.summary = "DSL for declaring params and options of the initializer"
16
+ spec.description = spec.summary
17
+ spec.homepage = 'https://dry-rb.org/gems/dry-initializer'
18
+ spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-initializer.gemspec", "lib/**/*"]
19
+ spec.bindir = 'bin'
20
+ spec.executables = []
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
24
+ spec.metadata['changelog_uri'] = 'https://github.com/dry-rb/dry-initializer/blob/master/CHANGELOG.md'
25
+ spec.metadata['source_code_uri'] = 'https://github.com/dry-rb/dry-initializer'
26
+ spec.metadata['bug_tracker_uri'] = 'https://github.com/dry-rb/dry-initializer/issues'
27
+
28
+ spec.required_ruby_version = ">= 2.4.0"
29
+
30
+ # to update dependencies edit project.yml
31
+ spec.add_development_dependency "rake"
32
+ spec.add_development_dependency "rspec"
20
33
  end
@@ -1 +1 @@
1
- require_relative "dry/initializer"
1
+ require_relative 'dry/initializer'
@@ -1,4 +1,4 @@
1
- require "set"
1
+ require 'set'
2
2
 
3
3
  # Namespace for gems in a dry-rb community
4
4
  module Dry
@@ -6,15 +6,13 @@ module Dry
6
6
  # DSL for declaring params and options of class initializers
7
7
  #
8
8
  module Initializer
9
- # Singleton for unassigned values
10
- UNDEFINED = Object.new.freeze
11
-
12
- require_relative "initializer/dsl"
13
- require_relative "initializer/definition"
14
- require_relative "initializer/builders"
15
- require_relative "initializer/config"
16
- require_relative "initializer/mixin"
17
- require_relative "initializer/dispatchers"
9
+ require_relative 'initializer/undefined'
10
+ require_relative 'initializer/dsl'
11
+ require_relative 'initializer/definition'
12
+ require_relative 'initializer/builders'
13
+ require_relative 'initializer/config'
14
+ require_relative 'initializer/mixin'
15
+ require_relative 'initializer/dispatchers'
18
16
 
19
17
  # Adds methods [.[]] and [.define]
20
18
  extend DSL
@@ -32,18 +30,20 @@ module Dry
32
30
  # @option opts [Boolean] :optional
33
31
  # @option opts [Symbol] :as
34
32
  # @option opts [true, false, :protected, :public, :private] :reader
33
+ # @yield block with nested definition
35
34
  # @return [self] itself
36
- def param(name, type = nil, **opts)
37
- dry_initializer.param(name, type, Dispatchers[opts])
35
+ def param(name, type = nil, **opts, &block)
36
+ dry_initializer.param(name, type, **opts, &block)
38
37
  self
39
38
  end
40
39
 
41
40
  # Adds or redefines an option of [#dry_initializer]
42
41
  # @param (see #param)
43
42
  # @option (see #param)
43
+ # @yield (see #param)
44
44
  # @return (see #param)
45
- def option(name, type = nil, **opts)
46
- dry_initializer.option(name, type, Dispatchers[opts])
45
+ def option(name, type = nil, **opts, &block)
46
+ dry_initializer.option(name, type, **opts, &block)
47
47
  self
48
48
  end
49
49
 
@@ -55,5 +55,7 @@ module Dry
55
55
  klass.send(:instance_variable_set, :@dry_initializer, config)
56
56
  dry_initializer.children << config
57
57
  end
58
+
59
+ require_relative 'initializer/struct'
58
60
  end
59
61
  end
@@ -1,7 +1,7 @@
1
1
  module Dry::Initializer
2
2
  # @private
3
3
  module Builders
4
- require_relative "builders/reader"
5
- require_relative "builders/initializer"
4
+ require_relative 'builders/reader'
5
+ require_relative 'builders/initializer'
6
6
  end
7
7
  end
@@ -20,17 +20,17 @@ module Dry::Initializer::Builders
20
20
  @default = definition.default
21
21
  @source = definition.source
22
22
  @ivar = definition.ivar
23
- @null = definition.null ? "Dry::Initializer::UNDEFINED" : "nil"
24
- @opts = "__dry_initializer_options__"
25
- @congif = "__dry_initializer_config__"
26
- @item = "__dry_initializer_definition__"
27
- @val = @option ? "__dry_initializer_value__" : @source
23
+ @null = definition.null ? 'Dry::Initializer::UNDEFINED' : 'nil'
24
+ @opts = '__dry_initializer_options__'
25
+ @congif = '__dry_initializer_config__'
26
+ @item = '__dry_initializer_definition__'
27
+ @val = @option ? '__dry_initializer_value__' : @source
28
28
  end
29
29
  # rubocop: enable Metrics/MethodLength
30
30
 
31
31
  def lines
32
32
  [
33
- "",
33
+ '',
34
34
  definition_line,
35
35
  reader_line,
36
36
  default_line,
@@ -41,6 +41,7 @@ module Dry::Initializer::Builders
41
41
 
42
42
  def reader_line
43
43
  return unless @option
44
+
44
45
  @optional ? optional_reader : required_reader
45
46
  end
46
47
 
@@ -55,18 +56,22 @@ module Dry::Initializer::Builders
55
56
 
56
57
  def definition_line
57
58
  return unless @type || @default
59
+
58
60
  "#{@item} = __dry_initializer_config__.definitions[:'#{@source}']"
59
61
  end
60
62
 
61
63
  def default_line
62
64
  return unless @default
65
+
63
66
  "#{@val} = instance_exec(&#{@item}.default) if #{@null} == #{@val}"
64
67
  end
65
68
 
66
69
  def coercion_line
67
70
  return unless @type
71
+
68
72
  arity = @type.is_a?(Proc) ? @type.arity : @type.method(:call).arity
69
- if arity.abs == 1
73
+
74
+ if arity.equal?(1) || arity.negative?
70
75
  "#{@val} = #{@item}.type.call(#{@val}) unless #{@null} == #{@val}"
71
76
  else
72
77
  "#{@val} = #{@item}.type.call(#{@val}, self) unless #{@null} == #{@val}"
@@ -1,8 +1,8 @@
1
1
  module Dry::Initializer::Builders
2
2
  # @private
3
3
  class Initializer
4
- require_relative "signature"
5
- require_relative "attribute"
4
+ require_relative 'signature'
5
+ require_relative 'attribute'
6
6
 
7
7
  def self.[](config)
8
8
  new(config).call
@@ -30,8 +30,8 @@ module Dry::Initializer::Builders
30
30
  end
31
31
 
32
32
  def undef_line
33
- "undef :__dry_initializer_initialize__" \
34
- " if private_method_defined? :__dry_initializer_initialize__"
33
+ 'undef :__dry_initializer_initialize__' \
34
+ ' if private_method_defined? :__dry_initializer_initialize__'
35
35
  end
36
36
 
37
37
  def define_line
@@ -40,22 +40,18 @@ module Dry::Initializer::Builders
40
40
 
41
41
  def params_lines
42
42
  @definitions.reject(&:option)
43
- .flat_map { |item| Attribute[item] }
44
- .map { |line| " " << line }
43
+ .flat_map { |item| Attribute[item] }
44
+ .map { |line| ' ' << line }
45
45
  end
46
46
 
47
47
  def options_lines
48
48
  @definitions.select(&:option)
49
- .flat_map { |item| Attribute[item] }
50
- .map { |line| " " << line }
49
+ .flat_map { |item| Attribute[item] }
50
+ .map { |line| ' ' << line }
51
51
  end
52
52
 
53
53
  def end_line
54
- "end"
55
- end
56
-
57
- def private_line
58
- "private :__dry_initializer_initialize__"
54
+ 'end'
59
55
  end
60
56
  end
61
57
  end
@@ -30,16 +30,18 @@ module Dry::Initializer::Builders
30
30
 
31
31
  def attribute_line
32
32
  return unless @reader
33
+
33
34
  "attr_reader :#{@target}" unless @null
34
35
  end
35
36
 
36
37
  def method_lines
37
38
  return unless @reader
38
39
  return unless @null
40
+
39
41
  [
40
42
  "def #{@target}",
41
43
  " #{@ivar} unless Dry::Initializer::UNDEFINED == #{@ivar}",
42
- "end"
44
+ 'end'
43
45
  ]
44
46
  end
45
47
 
@@ -6,7 +6,7 @@ module Dry::Initializer::Builders
6
6
  end
7
7
 
8
8
  def call
9
- [*required_params, *optional_params, "*", options].compact.join(", ")
9
+ [*required_params, *optional_params, '*', options].compact.join(', ')
10
10
  end
11
11
 
12
12
  private
@@ -14,7 +14,7 @@ module Dry::Initializer::Builders
14
14
  def initialize(config)
15
15
  @config = config
16
16
  @options = config.options.any?
17
- @null = config.null ? "Dry::Initializer::UNDEFINED" : "nil"
17
+ @null = config.null ? 'Dry::Initializer::UNDEFINED' : 'nil'
18
18
  end
19
19
 
20
20
  def required_params
@@ -26,7 +26,7 @@ module Dry::Initializer::Builders
26
26
  end
27
27
 
28
28
  def options
29
- "**__dry_initializer_options__" if @options
29
+ '**__dry_initializer_options__' if @options
30
30
  end
31
31
  end
32
32
  end
@@ -57,8 +57,8 @@ module Dry::Initializer
57
57
  # @option opts [Symbol] :as
58
58
  # @option opts [true, false, :protected, :public, :private] :reader
59
59
  # @return [self] itself
60
- def param(name, type = nil, **opts)
61
- add_definition(false, name, type, opts)
60
+ def param(name, type = nil, **opts, &block)
61
+ add_definition(false, name, type, block, **opts)
62
62
  end
63
63
 
64
64
  # Adds or redefines an option of [#dry_initializer]
@@ -67,8 +67,8 @@ module Dry::Initializer
67
67
  # @option (see #param)
68
68
  # @return (see #param)
69
69
  #
70
- def option(name, type = nil, **opts)
71
- add_definition(true, name, type, opts)
70
+ def option(name, type = nil, **opts, &block)
71
+ add_definition(true, name, type, block, **opts)
72
72
  end
73
73
 
74
74
  # The hash of public attributes for an instance of the [#extended_class]
@@ -78,6 +78,7 @@ module Dry::Initializer
78
78
  definitions.values.each_with_object({}) do |item, obj|
79
79
  key = item.target
80
80
  next unless instance.respond_to? key
81
+
81
82
  val = instance.send(key)
82
83
  obj[key] = val unless null == val
83
84
  end
@@ -114,7 +115,7 @@ module Dry::Initializer
114
115
  # @return [String]
115
116
  def inch
116
117
  line = Builders::Signature[self]
117
- line = line.gsub("__dry_initializer_options__", "options")
118
+ line = line.gsub('__dry_initializer_options__', 'options')
118
119
  lines = ["@!method initialize(#{line})"]
119
120
  lines += ["Initializes an instance of #{extended_class}"]
120
121
  lines += definitions.values.map(&:inch)
@@ -133,13 +134,25 @@ module Dry::Initializer
133
134
  finalize
134
135
  end
135
136
 
136
- def add_definition(option, name, type, opts)
137
- definition = Definition.new(option, null, name, type, Dispatchers[opts])
137
+ # rubocop: disable Metrics/MethodLength
138
+ def add_definition(option, name, type, block, **opts)
139
+ opts = {
140
+ parent: extended_class,
141
+ option: option,
142
+ null: null,
143
+ source: name,
144
+ type: type,
145
+ block: block,
146
+ **opts
147
+ }
148
+
149
+ options = Dispatchers.call(**opts)
150
+ definition = Definition.new(**options)
138
151
  definitions[definition.source] = definition
139
152
  finalize
140
-
141
153
  mixin.class_eval definition.code
142
154
  end
155
+ # rubocop: enable Metrics/MethodLength
143
156
 
144
157
  def final_definitions
145
158
  parent_definitions = Hash(parent&.definitions&.dup)
@@ -151,6 +164,7 @@ module Dry::Initializer
151
164
  def check_type(previous, current)
152
165
  return current unless previous
153
166
  return current if previous.option == current.option
167
+
154
168
  raise SyntaxError,
155
169
  "cannot reload #{previous} of #{extended_class.superclass}" \
156
170
  " by #{current} of its subclass #{extended_class}"