dry-initializer 1.4.1 → 2.0.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -8
  3. data/.travis.yml +0 -3
  4. data/CHANGELOG.md +339 -196
  5. data/LICENSE.txt +1 -1
  6. data/README.md +3 -3
  7. data/Rakefile +2 -47
  8. data/benchmarks/{several_defaults.rb → compare_several_defaults.rb} +4 -4
  9. data/benchmarks/{without_options.rb → plain_options.rb} +20 -9
  10. data/benchmarks/{params.rb → plain_params.rb} +20 -9
  11. data/benchmarks/{with_types.rb → with_coercion.rb} +20 -9
  12. data/benchmarks/with_defaults.rb +19 -8
  13. data/benchmarks/{with_types_and_defaults.rb → with_defaults_and_coercion.rb} +21 -10
  14. data/dry-initializer.gemspec +3 -3
  15. data/lib/dry/initializer/builders/attribute.rb +76 -0
  16. data/lib/dry/initializer/builders/initializer.rb +61 -0
  17. data/lib/dry/initializer/builders/reader.rb +50 -0
  18. data/lib/dry/initializer/builders/signature.rb +32 -0
  19. data/lib/dry/initializer/builders.rb +7 -0
  20. data/lib/dry/initializer/config.rb +161 -0
  21. data/lib/dry/initializer/definition.rb +93 -0
  22. data/lib/dry/initializer/dsl.rb +43 -0
  23. data/lib/dry/initializer/mixin/local.rb +19 -0
  24. data/lib/dry/initializer/mixin/root.rb +10 -0
  25. data/lib/dry/initializer/mixin.rb +15 -0
  26. data/lib/dry/initializer.rb +45 -41
  27. data/lib/tasks/benchmark.rake +41 -0
  28. data/lib/tasks/profile.rake +78 -0
  29. data/spec/{options_var_spec.rb → attributes_spec.rb} +9 -9
  30. data/spec/custom_initializer_spec.rb +1 -1
  31. data/spec/default_values_spec.rb +6 -6
  32. data/spec/definition_spec.rb +21 -14
  33. data/spec/invalid_default_spec.rb +2 -2
  34. data/spec/missed_default_spec.rb +2 -2
  35. data/spec/optional_spec.rb +2 -2
  36. data/spec/options_tolerance_spec.rb +1 -1
  37. data/spec/public_attributes_utility_spec.rb +22 -0
  38. data/spec/reader_spec.rb +11 -11
  39. data/spec/repetitive_definitions_spec.rb +5 -5
  40. data/spec/several_assignments_spec.rb +1 -1
  41. data/spec/spec_helper.rb +5 -0
  42. data/spec/subclassing_spec.rb +7 -3
  43. data/spec/type_argument_spec.rb +1 -1
  44. data/spec/type_constraint_spec.rb +2 -2
  45. data/spec/value_coercion_via_dry_types_spec.rb +1 -1
  46. metadata +27 -27
  47. data/benchmarks/options.rb +0 -54
  48. data/benchmarks/params_vs_options.rb +0 -35
  49. data/benchmarks/profiler.rb +0 -28
  50. data/lib/dry/initializer/attribute.rb +0 -123
  51. data/lib/dry/initializer/builder.rb +0 -127
  52. data/lib/dry/initializer/class_dsl.rb +0 -37
  53. data/lib/dry/initializer/exceptions/default_value_error.rb +0 -8
  54. data/lib/dry/initializer/exceptions/params_order_error.rb +0 -8
  55. data/lib/dry/initializer/exceptions/type_constraint_error.rb +0 -7
  56. data/lib/dry/initializer/instance_dsl.rb +0 -15
  57. data/lib/dry/initializer/option.rb +0 -61
  58. data/lib/dry/initializer/param.rb +0 -52
  59. data/spec/gem_enhancement_spec.rb +0 -18
@@ -0,0 +1,161 @@
1
+ module Dry::Initializer
2
+ #
3
+ # Gem-related configuration of some class
4
+ #
5
+ class Config
6
+ # @!attribute [r] null
7
+ # @return [Dry::Initializer::UNDEFINED, nil] value of unassigned variable
8
+
9
+ # @!attribute [r] extended_class
10
+ # @return [Class] the class whose config collected by current object
11
+
12
+ # @!attribute [r] parent
13
+ # @return [Dry::Initializer::Config] parent configuration
14
+
15
+ # @!attribute [r] definitions
16
+ # @return [Hash<Symbol, Dry::Initializer::Definition>]
17
+ # hash of attribute definitions with their source names
18
+
19
+ attr_reader :null, :extended_class, :parent, :definitions
20
+
21
+ # @!attribute [r] mixin
22
+ # @return [Module] reference to the module to be included into class
23
+ def mixin
24
+ @mixin ||= Module.new.tap do |mod|
25
+ __dry_initializer__ = self
26
+ mod.extend(Mixin::Local)
27
+ mod.send :define_method, :__dry_initializer_config__ do
28
+ __dry_initializer__
29
+ end
30
+ mod.send :private, :__dry_initializer_config__
31
+ end
32
+ end
33
+
34
+ # List of configs of all subclasses of the [#extended_class]
35
+ # @return [Array<Dry::Initializer::Config>]
36
+ def children
37
+ @children ||= Set.new
38
+ end
39
+
40
+ # List of definitions for initializer params
41
+ # @return [Array<Dry::Initializer::Definition>]
42
+ def params
43
+ definitions.values.reject(&:option)
44
+ end
45
+
46
+ # List of definitions for initializer options
47
+ # @return [Array<Dry::Initializer::Definition>]
48
+ def options
49
+ definitions.values.select(&:option)
50
+ end
51
+
52
+ # Adds or redefines a parameter
53
+ # @param [Symbol] name
54
+ # @param [#call, nil] coercer (nil)
55
+ # @option opts [#call] :type
56
+ # @option opts [Proc] :default
57
+ # @option opts [Boolean] :optional
58
+ # @option opts [Symbol] :as
59
+ # @option opts [true, false, :protected, :public, :private] :reader
60
+ # @return [self] itself
61
+ def param(name, type = nil, **opts)
62
+ add_definition(false, name, type, opts)
63
+ end
64
+
65
+ # Adds or redefines an option of [#dry_initializer]
66
+ #
67
+ # @param (see #param)
68
+ # @option (see #param)
69
+ # @return (see #param)
70
+ #
71
+ def option(name, type = nil, **opts)
72
+ add_definition(true, name, type, opts)
73
+ end
74
+
75
+ # The hash of public attributes for an instance of the [#extended_class]
76
+ # @param [Dry::Initializer::Instance] instance
77
+ # @return [Hash<Symbol, Object>]
78
+ def public_attributes(instance)
79
+ definitions.values.each_with_object({}) do |item, obj|
80
+ key = item.target
81
+ next unless instance.respond_to? key
82
+ val = instance.send(key)
83
+ obj[key] = val unless val == null
84
+ end
85
+ end
86
+
87
+ # The hash of assigned attributes for an instance of the [#extended_class]
88
+ # @param [Dry::Initializer::Instance] instance
89
+ # @return [Hash<Symbol, Object>]
90
+ def attributes(instance)
91
+ definitions.values.each_with_object({}) do |item, obj|
92
+ key = item.target
93
+ val = instance.send(:instance_variable_get, item.ivar)
94
+ obj[key] = val unless val == null
95
+ end
96
+ end
97
+
98
+ # Code of the `#__initialize__` method
99
+ # @return [String]
100
+ def code
101
+ Builders::Initializer[self]
102
+ end
103
+
104
+ # Finalizes config
105
+ # @return [self]
106
+ def finalize
107
+ @definitions = final_definitions
108
+ check_order_of_params
109
+ mixin.class_eval(code)
110
+ children.each(&:finalize)
111
+ self
112
+ end
113
+
114
+ private
115
+
116
+ def initialize(extended_class = nil, null: UNDEFINED)
117
+ @extended_class = extended_class.tap { |klass| klass&.include mixin }
118
+ sklass = extended_class&.superclass
119
+ @parent = sklass.dry_initializer if sklass.is_a? Dry::Initializer
120
+ @null = null || parent&.null
121
+ @definitions = {}
122
+ finalize
123
+ end
124
+
125
+ def add_definition(option, name, type, opts)
126
+ definition = Definition.new(option, null, name, type, opts)
127
+ definitions[definition.source] = definition
128
+ finalize
129
+
130
+ mixin.class_eval definition.code
131
+ end
132
+
133
+ def final_definitions
134
+ parent_definitions = Hash(parent&.definitions&.dup)
135
+ definitions.each_with_object(parent_definitions) do |(key, val), obj|
136
+ obj[key] = check_type(obj[key], val)
137
+ end
138
+ end
139
+
140
+ def check_type(previous, current)
141
+ return current unless previous
142
+ return current if previous.option == current.option
143
+ raise SyntaxError,
144
+ "cannot reload #{previous} of #{extended_class.superclass}" \
145
+ " by #{current} of its subclass #{extended_class}"
146
+ end
147
+
148
+ def check_order_of_params
149
+ params.inject(nil) do |optional, current|
150
+ if current.optional
151
+ current
152
+ elsif optional
153
+ raise SyntaxError, "#{extended_class}: required #{current}" \
154
+ " goes after optional #{optional}"
155
+ else
156
+ optional
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,93 @@
1
+ module Dry::Initializer
2
+ #
3
+ # @private
4
+ # @abstract
5
+ #
6
+ # Base class for parameter or option definitions
7
+ # Defines methods to add corresponding reader to the class,
8
+ # and build value of instance attribute.
9
+ #
10
+ class Definition
11
+ attr_reader :option, :null, :source, :target, :ivar,
12
+ :type, :optional, :default, :reader
13
+
14
+ def name
15
+ @name ||= (option ? "option" : "parameter") << " '#{source}'"
16
+ end
17
+ alias to_s name
18
+ alias to_str name
19
+ alias inspect name
20
+
21
+ def ==(other)
22
+ other.instance_of?(self.class) && (other.source == source)
23
+ end
24
+
25
+ def code
26
+ Builders::Reader[self]
27
+ end
28
+
29
+ private
30
+
31
+ def initialize(option, null, source, coercer = nil, **options)
32
+ @option = !!option
33
+ @null = null
34
+ @source = source.to_sym
35
+ @target = check_target options.fetch(:as, source).to_sym
36
+ @ivar = :"@#{target}"
37
+ @type = check_type(coercer || options[:type])
38
+ @reader = prepare_reader options.fetch(:reader, true)
39
+ @default = check_default options[:default]
40
+ @optional = options.fetch(:optional, @default)
41
+ end
42
+
43
+ def check_source(value)
44
+ if RESERVED.include? value
45
+ raise ArgumentError, "Name #{value} is reserved by dry-initializer gem"
46
+ end
47
+
48
+ unless option || value[ATTRIBUTE]
49
+ raise ArgumentError, "Invalid parameter name :'#{value}'"
50
+ end
51
+
52
+ value
53
+ end
54
+
55
+ def check_target(value)
56
+ return value if value[ATTRIBUTE]
57
+ raise ArgumentError, "Invalid variable name :'#{value}'"
58
+ end
59
+
60
+ def check_type(value)
61
+ return if value.nil?
62
+ arity = value.respond_to?(:call) ? value.method(:call).arity : 0
63
+ return value unless arity.zero? || arity > 1
64
+ raise TypeError,
65
+ "type of #{inspect} should respond to #call with one argument"
66
+ end
67
+
68
+ def check_default(value)
69
+ return if value.nil?
70
+ return value if value.is_a?(Proc) && value.arity < 1
71
+ raise TypeError,
72
+ "default value of #{inspect} should be a proc without params"
73
+ end
74
+
75
+ def prepare_reader(value)
76
+ case value.to_s
77
+ when "", "false" then false
78
+ when "private" then :private
79
+ when "protected" then :protected
80
+ else :public
81
+ end
82
+ end
83
+
84
+ ATTRIBUTE = /\A\w+\z/
85
+ RESERVED = %i[
86
+ __dry_initializer_options__
87
+ __dry_initializer_config__
88
+ __dry_initializer_value__
89
+ __dry_initializer_definition__
90
+ __dry_initializer_initializer__
91
+ ].freeze
92
+ end
93
+ end
@@ -0,0 +1,43 @@
1
+ module Dry::Initializer
2
+ # Module-level DSL
3
+ module DSL
4
+ # Setting for null (undefined value)
5
+ # @return [nil, Dry::Initializer::UNDEFINED]
6
+ attr_reader :null
7
+
8
+ # Returns a version of the module with custom settings
9
+ # @option settings [Boolean] :undefined
10
+ # If unassigned params and options should be treated different from nil
11
+ # @return [Dry::Initializer]
12
+ def [](undefined: true, **)
13
+ null = (undefined == false) ? nil : UNDEFINED
14
+ Module.new.tap do |mod|
15
+ mod.extend DSL
16
+ mod.include self
17
+ mod.send(:instance_variable_set, :@null, null)
18
+ end
19
+ end
20
+
21
+ # Returns mixin module to be included to target class by hand
22
+ # @return [Module]
23
+ # @yield proc defining params and options
24
+ def define(procedure = nil, &block)
25
+ config = Config.new(null: null)
26
+ config.instance_exec(&(procedure || block))
27
+ config.mixin.include Mixin::Root
28
+ config.mixin
29
+ end
30
+
31
+ private
32
+
33
+ def extended(klass)
34
+ config = Config.new(klass, null: null)
35
+ klass.send :instance_variable_set, :@dry_initializer, config
36
+ klass.include Mixin::Root
37
+ end
38
+
39
+ def self.extended(mod)
40
+ mod.instance_variable_set :@null, UNDEFINED
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,19 @@
1
+ module Dry::Initializer::Mixin
2
+ # @private
3
+ module Local
4
+ attr_reader :klass
5
+
6
+ def inspect
7
+ "Dry::Initializer::Mixin::Local[#{klass}]"
8
+ end
9
+ alias to_s inspect
10
+ alias to_str inspect
11
+
12
+ private
13
+
14
+ def included(klass)
15
+ @klass = klass
16
+ super
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ module Dry::Initializer::Mixin
2
+ # @private
3
+ module Root
4
+ private
5
+
6
+ def initialize(*args)
7
+ __dry_initializer_initialize__(*args)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ module Dry::Initializer
2
+ # @private
3
+ module Mixin
4
+ extend DSL # @deprecated
5
+ include Dry::Initializer # @deprecated
6
+ def self.extended(klass) # @deprecated
7
+ warn "[DEPRECATED] Use Dry::Initializer instead of its alias" \
8
+ " Dry::Initializer::Mixin. The later will be removed in v2.1.0"
9
+ super
10
+ end
11
+
12
+ require_relative "mixin/root"
13
+ require_relative "mixin/local"
14
+ end
15
+ end
@@ -1,55 +1,59 @@
1
+ require "set"
2
+
3
+ # Namespace for gems in a dry-rb community
1
4
  module Dry
5
+ #
6
+ # DSL for declaring params and options of class initializers
7
+ #
2
8
  module Initializer
3
- require_relative "initializer/exceptions/default_value_error"
4
- require_relative "initializer/exceptions/type_constraint_error"
5
- require_relative "initializer/exceptions/params_order_error"
6
-
7
- require_relative "initializer/attribute"
8
- require_relative "initializer/param"
9
- require_relative "initializer/option"
10
- require_relative "initializer/builder"
11
- require_relative "initializer/instance_dsl"
12
- require_relative "initializer/class_dsl"
13
-
14
- # rubocop: disable Style/ConstantName
15
- Mixin = self # for compatibility to versions below 0.12
16
- # rubocop: enable Style/ConstantName
17
-
18
- UNDEFINED = Object.new.tap do |obj|
19
- obj.define_singleton_method(:inspect) { "Dry::Initializer::UNDEFINED" }
20
- end.freeze
21
-
22
- extend Dry::Initializer::ClassDSL
23
-
24
- def param(*args)
25
- __initializer_builder__.param(*args).call(__initializer_mixin__)
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
+
18
+ # Adds methods [.[]] and [.define]
19
+ extend DSL
20
+
21
+ # Gem-related configuration
22
+ # @return [Dry::Initializer::Config]
23
+ def dry_initializer
24
+ @dry_initializer ||= Config.new(self)
26
25
  end
27
26
 
28
- def option(*args)
29
- __initializer_builder__.option(*args).call(__initializer_mixin__)
27
+ # Adds or redefines a parameter of [#dry_initializer]
28
+ # @param [Symbol] name
29
+ # @param [#call, nil] coercer (nil)
30
+ # @option opts [#call] :type
31
+ # @option opts [Proc] :default
32
+ # @option opts [Boolean] :optional
33
+ # @option opts [Symbol] :as
34
+ # @option opts [true, false, :protected, :public, :private] :reader
35
+ # @return [self] itself
36
+ def param(name, type = nil, **opts)
37
+ dry_initializer.param(name, type, opts)
38
+ self
30
39
  end
31
40
 
32
- private
33
-
34
- def __initializer_mixin__
35
- @__initializer_mixin__ ||= Module.new
41
+ # Adds or redefines an option of [#dry_initializer]
42
+ # @param (see #param)
43
+ # @option (see #param)
44
+ # @return (see #param)
45
+ def option(name, type = nil, **opts)
46
+ dry_initializer.option(name, type, opts)
47
+ self
36
48
  end
37
49
 
38
- def __initializer_builder__(**settings)
39
- @__initializer_builder__ ||= Dry::Initializer::Builder.new(settings)
40
- end
50
+ private
41
51
 
42
52
  def inherited(klass)
43
- builder = @__initializer_builder__.dup
44
- mixin = Module.new
45
-
46
- klass.instance_variable_set :@__initializer_builder__, builder
47
- klass.instance_variable_set :@__initializer_mixin__, mixin
48
-
49
- builder.call(mixin)
50
- klass.include mixin
51
-
52
53
  super
54
+ config = Config.new(klass, null: dry_initializer.null)
55
+ klass.send(:instance_variable_set, :@dry_initializer, config)
56
+ dry_initializer.children << config
53
57
  end
54
58
  end
55
59
  end
@@ -0,0 +1,41 @@
1
+ namespace :benchmark do
2
+ desc "Runs benchmarks for plain params"
3
+ task :plain_params do
4
+ system "ruby benchmarks/plain_params.rb"
5
+ end
6
+
7
+ desc "Runs benchmarks for plain options"
8
+ task :plain_options do
9
+ system "ruby benchmarks/plain_options.rb"
10
+ end
11
+
12
+ desc "Runs benchmarks for value coercion"
13
+ task :with_coercion do
14
+ system "ruby benchmarks/with_coercion.rb"
15
+ end
16
+
17
+ desc "Runs benchmarks with defaults"
18
+ task :with_defaults do
19
+ system "ruby benchmarks/with_defaults.rb"
20
+ end
21
+
22
+ desc "Runs benchmarks with defaults and coercion"
23
+ task :with_defaults_and_coercion do
24
+ system "ruby benchmarks/with_defaults_and_coercion.rb"
25
+ end
26
+
27
+ desc "Runs benchmarks for several defaults"
28
+ task :compare_several_defaults do
29
+ system "ruby benchmarks/with_several_defaults.rb"
30
+ end
31
+ end
32
+
33
+ desc "Runs all benchmarks"
34
+ task benchmark: %i[
35
+ benchmark:plain_params
36
+ benchmark:plain_options
37
+ benchmark:with_coercion
38
+ benchmark:with_defaults
39
+ benchmark:with_defaults_and_coercion
40
+ benchmark:compare_several_defaults
41
+ ]
@@ -0,0 +1,78 @@
1
+ namespace :profile do
2
+ def profile(name, execution, &definition)
3
+ require "dry-initializer"
4
+ require "ruby-prof"
5
+ require "fileutils"
6
+
7
+ definition.call
8
+ result = RubyProf.profile do
9
+ 1_000.times { execution.call }
10
+ end
11
+
12
+ FileUtils.mkdir_p "./tmp"
13
+
14
+ FileUtils.touch "./tmp/#{name}.dot"
15
+ File.open("./tmp/#{name}.dot", "w+") do |output|
16
+ RubyProf::DotPrinter.new(result).print(output, min_percent: 0)
17
+ end
18
+
19
+ FileUtils.touch "./tmp/#{name}.html"
20
+ File.open("./tmp/#{name}.html", "w+") do |output|
21
+ RubyProf::CallStackPrinter.new(result).print(output, min_percent: 0)
22
+ end
23
+
24
+ system "dot -Tpng ./tmp/#{name}.dot > ./tmp/#{name}.png"
25
+ end
26
+
27
+ desc "Profiles initialization with required param and option"
28
+ task :required do
29
+ profile("required", -> { User.new :Andy, email: "andy@example.com" }) do
30
+ class User
31
+ extend Dry::Initializer
32
+ param :name
33
+ option :email
34
+ end
35
+ end
36
+ end
37
+
38
+ desc "Profiles initialization with default param and option"
39
+ task :defaults do
40
+ profile("defaults", -> { User.new }) do
41
+ class User
42
+ extend Dry::Initializer
43
+ param :name, default: -> { :Andy }
44
+ option :email, default: -> { "andy@example.com" }
45
+ end
46
+ end
47
+ end
48
+
49
+ desc "Profiles initialization with coerced param and option"
50
+ task :coercion do
51
+ profile("coercion", -> { User.new :Andy, email: :"andy@example.com" }) do
52
+ class User
53
+ extend Dry::Initializer
54
+ param :name, proc(&:to_s)
55
+ option :email, proc(&:to_s)
56
+ end
57
+ end
58
+ end
59
+
60
+ desc "Profiles initialization with coerced defaults of param and option"
61
+ task :default_coercion do
62
+ profile("default_coercion", -> { User.new }) do
63
+ class User
64
+ extend Dry::Initializer
65
+ param :name, proc(&:to_s), default: -> { :Andy }
66
+ option :email, proc(&:to_s), default: -> { :"andy@example.com" }
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ desc "Makes all profiling at once"
73
+ task profile: %i[
74
+ profile:required
75
+ profile:defaults
76
+ profile:coercion
77
+ profile:default_coercion
78
+ ]
@@ -1,4 +1,6 @@
1
- describe "@__options__" do
1
+ describe Dry::Initializer, "dry_initializer.attributes" do
2
+ subject { instance.class.dry_initializer.attributes(instance) }
3
+
2
4
  context "when class has params" do
3
5
  before do
4
6
  class Test::Foo
@@ -9,11 +11,10 @@ describe "@__options__" do
9
11
  end
10
12
  end
11
13
 
12
- it "collects coerced params with default values" do
13
- subject = Test::Foo.new(:FOO)
14
+ let(:instance) { Test::Foo.new(:FOO) }
14
15
 
15
- expect(subject.instance_variable_get(:@__options__))
16
- .to eq({ foo: "FOO", bar: 1 })
16
+ it "collects coerced params with default values" do
17
+ expect(subject).to eq({ foo: "FOO", bar: 1 })
17
18
  end
18
19
  end
19
20
 
@@ -28,11 +29,10 @@ describe "@__options__" do
28
29
  end
29
30
  end
30
31
 
31
- it "collects coerced and renamed options with default values" do
32
- subject = Test::Foo.new(foo: :FOO, qux: :QUX)
32
+ let(:instance) { Test::Foo.new(foo: :FOO, qux: :QUX) }
33
33
 
34
- expect(subject.instance_variable_get(:@__options__))
35
- .to eq({ foo: :FOO, bar: 1, quxx: "QUX" })
34
+ it "collects coerced and renamed options with default values" do
35
+ expect(subject).to eq({ foo: :FOO, bar: 1, quxx: "QUX" })
36
36
  end
37
37
  end
38
38
  end
@@ -1,7 +1,7 @@
1
1
  describe "custom initializer" do
2
2
  before do
3
3
  class Test::Foo
4
- extend Dry::Initializer::Mixin
4
+ extend Dry::Initializer
5
5
 
6
6
  param :bar
7
7
 
@@ -1,7 +1,7 @@
1
1
  describe "default values" do
2
2
  before do
3
3
  class Test::Foo
4
- extend Dry::Initializer::Mixin
4
+ extend Dry::Initializer
5
5
 
6
6
  param :foo, default: proc { :FOO }
7
7
  param :bar, default: proc { :BAR }
@@ -52,14 +52,14 @@ describe "default values" do
52
52
  describe "when the last param has a default and there are no options" do
53
53
  before do
54
54
  class Test::Bar
55
- extend Dry::Initializer::Mixin
55
+ extend Dry::Initializer
56
56
 
57
- param :foo
58
- param :bar, default: proc { {} }
57
+ param :foo
58
+ param :bar, default: proc { {} }
59
59
  end
60
60
  end
61
61
 
62
- it "instantiate arguments" do
62
+ it "instantiates arguments" do
63
63
  subject = Test::Bar.new(1, 2)
64
64
 
65
65
  expect(subject.foo).to eql 1
@@ -73,7 +73,7 @@ describe "default values" do
73
73
  expect(subject.bar).to eql({})
74
74
  end
75
75
 
76
- it "instantiate arguments also if the last is an hash" do
76
+ it "instantiates arguments also if the last is an hash" do
77
77
  subject = Test::Bar.new(1, { baz: 2, qux: 3 })
78
78
 
79
79
  expect(subject.foo).to eql 1