dry-initializer 0.11.0 → 2.5.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/.codeclimate.yml +8 -0
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/.rubocop.yml +14 -62
- data/.travis.yml +15 -11
- data/CHANGELOG.md +538 -158
- data/Gemfile +2 -2
- data/LICENSE.txt +1 -1
- data/README.md +6 -6
- data/Rakefile +2 -41
- data/benchmarks/{several_defaults.rb → compare_several_defaults.rb} +4 -4
- data/benchmarks/{without_options.rb → plain_options.rb} +21 -10
- data/benchmarks/{params.rb → plain_params.rb} +20 -9
- data/benchmarks/{with_types.rb → with_coercion.rb} +23 -16
- data/benchmarks/with_defaults.rb +19 -8
- data/benchmarks/{with_types_and_defaults.rb → with_defaults_and_coercion.rb} +21 -12
- data/dry-initializer.gemspec +4 -4
- data/lib/dry/initializer/builders/attribute.rb +81 -0
- data/lib/dry/initializer/builders/initializer.rb +61 -0
- data/lib/dry/initializer/builders/reader.rb +50 -0
- data/lib/dry/initializer/builders/signature.rb +32 -0
- data/lib/dry/initializer/builders.rb +7 -0
- data/lib/dry/initializer/config.rb +172 -0
- data/lib/dry/initializer/definition.rb +116 -0
- data/lib/dry/initializer/dispatchers.rb +44 -0
- data/lib/dry/initializer/dsl.rb +43 -0
- data/lib/dry/initializer/mixin/local.rb +19 -0
- data/lib/dry/initializer/mixin/root.rb +10 -0
- data/lib/dry/initializer/mixin.rb +8 -70
- data/lib/dry/initializer.rb +49 -12
- data/lib/tasks/benchmark.rake +41 -0
- data/lib/tasks/profile.rake +78 -0
- data/spec/attributes_spec.rb +38 -0
- data/spec/coercion_of_nil_spec.rb +25 -0
- data/spec/custom_dispatchers_spec.rb +35 -0
- data/spec/custom_initializer_spec.rb +1 -1
- data/spec/default_values_spec.rb +8 -8
- data/spec/definition_spec.rb +107 -0
- data/spec/invalid_default_spec.rb +2 -2
- data/spec/missed_default_spec.rb +3 -3
- data/spec/optional_spec.rb +35 -8
- data/spec/options_tolerance_spec.rb +1 -1
- data/spec/public_attributes_utility_spec.rb +22 -0
- data/spec/reader_spec.rb +11 -11
- data/spec/repetitive_definitions_spec.rb +41 -21
- data/spec/several_assignments_spec.rb +41 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/subclassing_spec.rb +7 -3
- data/spec/type_argument_spec.rb +1 -1
- data/spec/type_constraint_spec.rb +38 -7
- data/spec/value_coercion_via_dry_types_spec.rb +12 -4
- metadata +37 -40
- data/benchmarks/options.rb +0 -54
- data/benchmarks/params_vs_options.rb +0 -35
- data/lib/dry/initializer/builder.rb +0 -100
- data/lib/dry/initializer/errors/default_value_error.rb +0 -6
- data/lib/dry/initializer/errors/order_error.rb +0 -7
- data/lib/dry/initializer/errors/plugin_error.rb +0 -6
- data/lib/dry/initializer/errors/redefinition_error.rb +0 -5
- data/lib/dry/initializer/errors/type_constraint_error.rb +0 -5
- data/lib/dry/initializer/errors.rb +0 -10
- data/lib/dry/initializer/plugins/base.rb +0 -47
- data/lib/dry/initializer/plugins/default_proc.rb +0 -28
- data/lib/dry/initializer/plugins/signature.rb +0 -28
- data/lib/dry/initializer/plugins/type_constraint.rb +0 -21
- data/lib/dry/initializer/plugins/variable_setter.rb +0 -30
- data/lib/dry/initializer/plugins.rb +0 -10
- data/lib/dry/initializer/signature.rb +0 -61
- data/spec/base_spec.rb +0 -21
- data/spec/container_spec.rb +0 -45
- data/spec/default_nil_spec.rb +0 -17
- data/spec/plugin_registry_spec.rb +0 -45
- data/spec/renaming_options_spec.rb +0 -20
@@ -1,11 +1,41 @@
|
|
1
1
|
require "dry-types"
|
2
2
|
|
3
3
|
describe "type constraint" do
|
4
|
+
context "by a proc with 1 argument" do
|
5
|
+
before do
|
6
|
+
class Test::Foo
|
7
|
+
extend Dry::Initializer
|
8
|
+
param :foo, proc(&:to_s), optional: true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
subject { Test::Foo.new :foo }
|
13
|
+
|
14
|
+
it "coerces a value" do
|
15
|
+
expect(subject.foo).to eq "foo"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "by a proc with 2 arguments" do
|
20
|
+
before do
|
21
|
+
class Test::Foo
|
22
|
+
extend Dry::Initializer
|
23
|
+
param :foo, proc { |val, obj| "#{obj.hash}:#{val}" }, optional: true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
subject { Test::Foo.new :foo }
|
28
|
+
|
29
|
+
it "coerces a value with self as a second argument" do
|
30
|
+
expect(subject.foo).to eq "#{subject.hash}:foo"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
4
34
|
context "by dry-type" do
|
5
35
|
before do
|
6
36
|
class Test::Foo
|
7
|
-
extend Dry::Initializer
|
8
|
-
param :foo,
|
37
|
+
extend Dry::Initializer
|
38
|
+
param :foo, Dry::Types["strict.string"], optional: true
|
9
39
|
end
|
10
40
|
end
|
11
41
|
|
@@ -28,20 +58,21 @@ describe "type constraint" do
|
|
28
58
|
context "if optional value not set" do
|
29
59
|
subject { Test::Foo.new }
|
30
60
|
|
31
|
-
it "
|
32
|
-
expect
|
61
|
+
it "not applicable to Dry::Initializer::UNDEFINED" do
|
62
|
+
expect(subject.instance_variable_get(:@foo))
|
63
|
+
.to eq Dry::Initializer::UNDEFINED
|
33
64
|
end
|
34
65
|
end
|
35
66
|
end
|
36
67
|
|
37
68
|
context "by invalid constraint" do
|
38
69
|
it "raises TypeError" do
|
39
|
-
expect
|
70
|
+
expect do
|
40
71
|
class Test::Foo
|
41
|
-
extend Dry::Initializer
|
72
|
+
extend Dry::Initializer
|
42
73
|
param :foo, type: String
|
43
74
|
end
|
44
|
-
|
75
|
+
end.to raise_error(TypeError)
|
45
76
|
end
|
46
77
|
end
|
47
78
|
end
|
@@ -7,15 +7,23 @@ describe "value coercion via dry-types" do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
class Test::Foo
|
10
|
-
extend Dry::Initializer
|
10
|
+
extend Dry::Initializer
|
11
11
|
|
12
|
-
param
|
12
|
+
param :foo, type: Test::Types::Coercible::String
|
13
|
+
option :bar, proc(&:to_i), default: proc { "16" }
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
+
it "coerces assigned values" do
|
18
|
+
subject = Test::Foo.new :foo, bar: "13"
|
17
19
|
|
18
|
-
it "coerces values" do
|
19
20
|
expect(subject.foo).to eql "foo"
|
21
|
+
expect(subject.bar).to eql 13
|
22
|
+
end
|
23
|
+
|
24
|
+
it "coerces defaults as well" do
|
25
|
+
subject = Test::Foo.new :foo
|
26
|
+
|
27
|
+
expect(subject.bar).to eql 16
|
20
28
|
end
|
21
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-initializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Kochnev (marshall-lee)
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-08-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -59,18 +59,16 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
62
|
+
version: 0.49.0
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
69
|
+
version: 0.49.0
|
70
70
|
description:
|
71
|
-
email:
|
72
|
-
- hashtable@yandex.ru
|
73
|
-
- andrew.kozin@gmail.com
|
71
|
+
email: andrew.kozin@gmail.com
|
74
72
|
executables: []
|
75
73
|
extensions: []
|
76
74
|
extra_rdoc_files:
|
@@ -88,45 +86,43 @@ files:
|
|
88
86
|
- LICENSE.txt
|
89
87
|
- README.md
|
90
88
|
- Rakefile
|
91
|
-
- benchmarks/
|
92
|
-
- benchmarks/
|
93
|
-
- benchmarks/
|
94
|
-
- benchmarks/
|
89
|
+
- benchmarks/compare_several_defaults.rb
|
90
|
+
- benchmarks/plain_options.rb
|
91
|
+
- benchmarks/plain_params.rb
|
92
|
+
- benchmarks/with_coercion.rb
|
95
93
|
- benchmarks/with_defaults.rb
|
96
|
-
- benchmarks/
|
97
|
-
- benchmarks/with_types_and_defaults.rb
|
98
|
-
- benchmarks/without_options.rb
|
94
|
+
- benchmarks/with_defaults_and_coercion.rb
|
99
95
|
- dry-initializer.gemspec
|
100
96
|
- lib/dry-initializer.rb
|
101
97
|
- lib/dry/initializer.rb
|
102
|
-
- lib/dry/initializer/
|
103
|
-
- lib/dry/initializer/
|
104
|
-
- lib/dry/initializer/
|
105
|
-
- lib/dry/initializer/
|
106
|
-
- lib/dry/initializer/
|
107
|
-
- lib/dry/initializer/
|
108
|
-
- lib/dry/initializer/
|
98
|
+
- lib/dry/initializer/builders.rb
|
99
|
+
- lib/dry/initializer/builders/attribute.rb
|
100
|
+
- lib/dry/initializer/builders/initializer.rb
|
101
|
+
- lib/dry/initializer/builders/reader.rb
|
102
|
+
- lib/dry/initializer/builders/signature.rb
|
103
|
+
- lib/dry/initializer/config.rb
|
104
|
+
- lib/dry/initializer/definition.rb
|
105
|
+
- lib/dry/initializer/dispatchers.rb
|
106
|
+
- lib/dry/initializer/dsl.rb
|
109
107
|
- lib/dry/initializer/mixin.rb
|
110
|
-
- lib/dry/initializer/
|
111
|
-
- lib/dry/initializer/
|
112
|
-
- lib/
|
113
|
-
- lib/
|
114
|
-
-
|
115
|
-
-
|
116
|
-
-
|
117
|
-
- spec/base_spec.rb
|
118
|
-
- spec/container_spec.rb
|
108
|
+
- lib/dry/initializer/mixin/local.rb
|
109
|
+
- lib/dry/initializer/mixin/root.rb
|
110
|
+
- lib/tasks/benchmark.rake
|
111
|
+
- lib/tasks/profile.rake
|
112
|
+
- spec/attributes_spec.rb
|
113
|
+
- spec/coercion_of_nil_spec.rb
|
114
|
+
- spec/custom_dispatchers_spec.rb
|
119
115
|
- spec/custom_initializer_spec.rb
|
120
|
-
- spec/default_nil_spec.rb
|
121
116
|
- spec/default_values_spec.rb
|
117
|
+
- spec/definition_spec.rb
|
122
118
|
- spec/invalid_default_spec.rb
|
123
119
|
- spec/missed_default_spec.rb
|
124
120
|
- spec/optional_spec.rb
|
125
121
|
- spec/options_tolerance_spec.rb
|
126
|
-
- spec/
|
122
|
+
- spec/public_attributes_utility_spec.rb
|
127
123
|
- spec/reader_spec.rb
|
128
|
-
- spec/renaming_options_spec.rb
|
129
124
|
- spec/repetitive_definitions_spec.rb
|
125
|
+
- spec/several_assignments_spec.rb
|
130
126
|
- spec/spec_helper.rb
|
131
127
|
- spec/subclassing_spec.rb
|
132
128
|
- spec/type_argument_spec.rb
|
@@ -144,7 +140,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
140
|
requirements:
|
145
141
|
- - ">="
|
146
142
|
- !ruby/object:Gem::Version
|
147
|
-
version: '2.
|
143
|
+
version: '2.3'
|
148
144
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
145
|
requirements:
|
150
146
|
- - ">="
|
@@ -152,24 +148,25 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
148
|
version: '0'
|
153
149
|
requirements: []
|
154
150
|
rubyforge_project:
|
155
|
-
rubygems_version: 2.
|
151
|
+
rubygems_version: 2.6.14
|
156
152
|
signing_key:
|
157
153
|
specification_version: 4
|
158
154
|
summary: DSL for declaring params and options of the initializer
|
159
155
|
test_files:
|
160
|
-
- spec/
|
161
|
-
- spec/
|
156
|
+
- spec/attributes_spec.rb
|
157
|
+
- spec/coercion_of_nil_spec.rb
|
158
|
+
- spec/custom_dispatchers_spec.rb
|
162
159
|
- spec/custom_initializer_spec.rb
|
163
|
-
- spec/default_nil_spec.rb
|
164
160
|
- spec/default_values_spec.rb
|
161
|
+
- spec/definition_spec.rb
|
165
162
|
- spec/invalid_default_spec.rb
|
166
163
|
- spec/missed_default_spec.rb
|
167
164
|
- spec/optional_spec.rb
|
168
165
|
- spec/options_tolerance_spec.rb
|
169
|
-
- spec/
|
166
|
+
- spec/public_attributes_utility_spec.rb
|
170
167
|
- spec/reader_spec.rb
|
171
|
-
- spec/renaming_options_spec.rb
|
172
168
|
- spec/repetitive_definitions_spec.rb
|
169
|
+
- spec/several_assignments_spec.rb
|
173
170
|
- spec/spec_helper.rb
|
174
171
|
- spec/subclassing_spec.rb
|
175
172
|
- spec/type_argument_spec.rb
|
data/benchmarks/options.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
Bundler.require(:benchmarks)
|
2
|
-
|
3
|
-
require "dry-initializer"
|
4
|
-
class NoOptsTest
|
5
|
-
extend Dry::Initializer::Mixin
|
6
|
-
|
7
|
-
param :foo
|
8
|
-
option :bar
|
9
|
-
end
|
10
|
-
|
11
|
-
class DefaultsTest
|
12
|
-
extend Dry::Initializer::Mixin
|
13
|
-
|
14
|
-
param :foo, default: proc { "FOO" }
|
15
|
-
option :bar, default: proc { "BAR" }
|
16
|
-
end
|
17
|
-
|
18
|
-
class TypesTest
|
19
|
-
extend Dry::Initializer::Mixin
|
20
|
-
|
21
|
-
param :foo, type: String
|
22
|
-
option :bar, type: String
|
23
|
-
end
|
24
|
-
|
25
|
-
class DefaultsAndTypesTest
|
26
|
-
extend Dry::Initializer::Mixin
|
27
|
-
|
28
|
-
param :foo, type: String, default: proc { "FOO" }
|
29
|
-
option :bar, type: String, default: proc { "BAR" }
|
30
|
-
end
|
31
|
-
|
32
|
-
puts "Benchmark for various options"
|
33
|
-
|
34
|
-
Benchmark.ips do |x|
|
35
|
-
x.config time: 15, warmup: 10
|
36
|
-
|
37
|
-
x.report("no opts") do
|
38
|
-
NoOptsTest.new "foo", bar: "bar"
|
39
|
-
end
|
40
|
-
|
41
|
-
x.report("with defaults") do
|
42
|
-
DefaultsTest.new
|
43
|
-
end
|
44
|
-
|
45
|
-
x.report("with types") do
|
46
|
-
TypesTest.new "foo", bar: "bar"
|
47
|
-
end
|
48
|
-
|
49
|
-
x.report("with defaults and types") do
|
50
|
-
DefaultsAndTypesTest.new
|
51
|
-
end
|
52
|
-
|
53
|
-
x.compare!
|
54
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
Bundler.require(:benchmarks)
|
2
|
-
|
3
|
-
require "dry-initializer"
|
4
|
-
|
5
|
-
class ParamDefaults
|
6
|
-
extend Dry::Initializer::Mixin
|
7
|
-
|
8
|
-
param :foo, default: proc { "FOO" }
|
9
|
-
param :bar, default: proc { "BAR" }
|
10
|
-
param :baz, default: proc { "BAZ" }
|
11
|
-
end
|
12
|
-
|
13
|
-
class OptionDefaults
|
14
|
-
extend Dry::Initializer::Mixin
|
15
|
-
|
16
|
-
option :foo, default: proc { "FOO" }
|
17
|
-
option :bar, default: proc { "BAR" }
|
18
|
-
option :baz, default: proc { "BAZ" }
|
19
|
-
end
|
20
|
-
|
21
|
-
puts "Benchmark for param's vs. option's defaults"
|
22
|
-
|
23
|
-
Benchmark.ips do |x|
|
24
|
-
x.config time: 15, warmup: 10
|
25
|
-
|
26
|
-
x.report("param's defaults") do
|
27
|
-
ParamDefaults.new
|
28
|
-
end
|
29
|
-
|
30
|
-
x.report("option's defaults") do
|
31
|
-
OptionDefaults.new
|
32
|
-
end
|
33
|
-
|
34
|
-
x.compare!
|
35
|
-
end
|
@@ -1,100 +0,0 @@
|
|
1
|
-
require "set"
|
2
|
-
module Dry::Initializer
|
3
|
-
# Rebuilds the initializer every time a new argument defined
|
4
|
-
#
|
5
|
-
# @api private
|
6
|
-
#
|
7
|
-
class Builder
|
8
|
-
include Plugins
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@signature = Signature.new
|
12
|
-
@plugins = Set.new [VariableSetter, TypeConstraint, DefaultProc]
|
13
|
-
@parts = []
|
14
|
-
end
|
15
|
-
|
16
|
-
# Register new plugin to be applied as a chunk of code, or a proc
|
17
|
-
# to be evaluated in the instance's scope
|
18
|
-
#
|
19
|
-
# @param [Dry::Initializer::Plugin]
|
20
|
-
#
|
21
|
-
# @return [Dry::Initializer::Builder]
|
22
|
-
#
|
23
|
-
def register(plugin)
|
24
|
-
plugins = @plugins + [plugin]
|
25
|
-
copy { @plugins = plugins }
|
26
|
-
end
|
27
|
-
|
28
|
-
# Defines new agrument and reloads mixin definitions
|
29
|
-
#
|
30
|
-
# @param [#to_sym] name
|
31
|
-
# @param [Hash<Symbol, Object>] settings
|
32
|
-
#
|
33
|
-
# @return [Dry::Initializer::Builder]
|
34
|
-
#
|
35
|
-
def define(name, settings)
|
36
|
-
signature = @signature.add(name, settings)
|
37
|
-
parts = @parts + @plugins.map { |p| p.call(name, settings) }.compact
|
38
|
-
|
39
|
-
copy do
|
40
|
-
@signature = signature
|
41
|
-
@parts = parts
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# Redeclares initializer and readers in the mixin module
|
46
|
-
#
|
47
|
-
# @param [Module] mixin
|
48
|
-
#
|
49
|
-
def call(mixin)
|
50
|
-
define_readers(mixin)
|
51
|
-
reload_initializer(mixin)
|
52
|
-
reload_callback(mixin)
|
53
|
-
mixin
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def copy(&block)
|
59
|
-
dup.tap { |instance| instance.instance_eval(&block) }
|
60
|
-
end
|
61
|
-
|
62
|
-
def define_readers(mixin)
|
63
|
-
define_reader(
|
64
|
-
mixin,
|
65
|
-
:attr_reader,
|
66
|
-
->(item) { item.settings[:reader] != false }
|
67
|
-
)
|
68
|
-
define_reader mixin, :private
|
69
|
-
define_reader mixin, :protected
|
70
|
-
end
|
71
|
-
|
72
|
-
def define_reader(mixin, method, filter_lambda = nil)
|
73
|
-
filter_lambda ||= ->(item) { item.settings[:reader] == method }
|
74
|
-
readers = @signature.select(&filter_lambda).map(&:rename)
|
75
|
-
mixin.send method, *readers if readers.any?
|
76
|
-
end
|
77
|
-
|
78
|
-
def reload_initializer(mixin)
|
79
|
-
mixin.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
80
|
-
def __initialize__(#{@signature.call})
|
81
|
-
@__options__ = __options__
|
82
|
-
#{@parts.select { |part| String === part }.join("\n")}
|
83
|
-
__after_initialize__
|
84
|
-
end
|
85
|
-
RUBY
|
86
|
-
|
87
|
-
mixin.send :private, :__initialize__
|
88
|
-
end
|
89
|
-
|
90
|
-
def reload_callback(mixin)
|
91
|
-
blocks = @parts.select { |part| Proc === part }
|
92
|
-
|
93
|
-
mixin.send :define_method, :__after_initialize__ do
|
94
|
-
blocks.each { |block| instance_eval(&block) }
|
95
|
-
end
|
96
|
-
|
97
|
-
mixin.send :private, :__after_initialize__
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
class Dry::Initializer::Errors::OrderError < SyntaxError
|
2
|
-
def initialize(name)
|
3
|
-
super "Cannot define the required param '#{name}' after optional ones." \
|
4
|
-
" Either provide a default value for the '#{name}', or declare it" \
|
5
|
-
" before params with default values."
|
6
|
-
end
|
7
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
module Dry::Initializer
|
2
|
-
# Collection of gem-specific exceptions
|
3
|
-
module Errors
|
4
|
-
require_relative "errors/default_value_error"
|
5
|
-
require_relative "errors/order_error"
|
6
|
-
require_relative "errors/plugin_error"
|
7
|
-
require_relative "errors/redefinition_error"
|
8
|
-
require_relative "errors/type_constraint_error"
|
9
|
-
end
|
10
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Dry::Initializer::Plugins
|
2
|
-
# Base class for plugins
|
3
|
-
#
|
4
|
-
# A plugin should has class method [.call] that takes argument name and
|
5
|
-
# settings and return a chunk of code for the #initialize method body.
|
6
|
-
#
|
7
|
-
class Base
|
8
|
-
include Dry::Initializer::Errors
|
9
|
-
|
10
|
-
# Builds the proc for the `__after_initializer__` callback
|
11
|
-
#
|
12
|
-
# @param [#to_s] name
|
13
|
-
# @param [Hash<Symbol, Object>] settings
|
14
|
-
#
|
15
|
-
# @return [String, Proc, nil]
|
16
|
-
#
|
17
|
-
def self.call(name, settings)
|
18
|
-
new(name, settings).call
|
19
|
-
end
|
20
|
-
|
21
|
-
# @private
|
22
|
-
attr_reader :name, :settings
|
23
|
-
|
24
|
-
# Initializes a builder with argument name and settings
|
25
|
-
# @param (see .call)
|
26
|
-
def initialize(name, settings)
|
27
|
-
@name = name
|
28
|
-
@settings = settings
|
29
|
-
end
|
30
|
-
|
31
|
-
# Checks equality to another instance by name
|
32
|
-
# @return [Boolean]
|
33
|
-
def ==(other)
|
34
|
-
other.instance_of?(self.class) && (other.name == name)
|
35
|
-
end
|
36
|
-
|
37
|
-
# Builds a chunk of code
|
38
|
-
# @return (see .call)
|
39
|
-
def call; end
|
40
|
-
|
41
|
-
# Returns the name for the attribute
|
42
|
-
# @return (see .name)
|
43
|
-
def rename
|
44
|
-
@rename ||= settings[:option] ? (settings[:as] || name) : name
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Dry::Initializer::Plugins
|
2
|
-
# Builds a block to be evaluated by initializer (__after_initialize__)
|
3
|
-
# to assign a default value to the argument
|
4
|
-
class DefaultProc < Base
|
5
|
-
def call
|
6
|
-
return unless default
|
7
|
-
|
8
|
-
ivar = :"@#{rename}"
|
9
|
-
default_proc = default
|
10
|
-
|
11
|
-
proc do
|
12
|
-
if instance_variable_get(ivar) == Dry::Initializer::UNDEFINED
|
13
|
-
instance_variable_set ivar, instance_eval(&default_proc)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def default
|
21
|
-
return unless settings.key? :default
|
22
|
-
|
23
|
-
@default ||= settings[:default].tap do |value|
|
24
|
-
fail DefaultValueError.new(name, value) unless Proc === value
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Dry::Initializer::Plugins
|
2
|
-
# Plugin builds a chunk of code for the initializer's signature:
|
3
|
-
#
|
4
|
-
# @example
|
5
|
-
# Signature.call(:user)
|
6
|
-
# # => "user"
|
7
|
-
#
|
8
|
-
# Signature.call(:user, default: -> { nil })
|
9
|
-
# # => "user = Dry::Initializer::UNDEFINED"
|
10
|
-
#
|
11
|
-
# Signature.call(:user, option: true)
|
12
|
-
# # => nil
|
13
|
-
#
|
14
|
-
class Signature < Base
|
15
|
-
def param?
|
16
|
-
settings[:option] != true
|
17
|
-
end
|
18
|
-
|
19
|
-
def required?
|
20
|
-
!settings.key?(:default) && !settings[:optional]
|
21
|
-
end
|
22
|
-
|
23
|
-
def call
|
24
|
-
return unless param?
|
25
|
-
required? ? name.to_s : "#{name} = Dry::Initializer::UNDEFINED"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Dry::Initializer::Plugins
|
2
|
-
# Plugin builds either chunk of code for the #initializer,
|
3
|
-
# or a proc for the ##__after_initialize__ callback.
|
4
|
-
class TypeConstraint < Base
|
5
|
-
def call
|
6
|
-
return unless settings.key? :type
|
7
|
-
|
8
|
-
type = settings[:type]
|
9
|
-
fail TypeConstraintError.new(rename, type) unless type.respond_to? :call
|
10
|
-
|
11
|
-
ivar = :"@#{rename}"
|
12
|
-
lambda do |*|
|
13
|
-
value = instance_variable_get(ivar)
|
14
|
-
|
15
|
-
if value != Dry::Initializer::UNDEFINED
|
16
|
-
instance_variable_set ivar, type.call(value)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Dry::Initializer::Plugins
|
2
|
-
# Plugin builds a code for variable setter:
|
3
|
-
#
|
4
|
-
# @example
|
5
|
-
# VariableSetter.call(:user, option: false)
|
6
|
-
# # => "@user = user"
|
7
|
-
#
|
8
|
-
# VariableSetter.call(:user, option: true)
|
9
|
-
# # => "@user = __options__.fetch(:user)"
|
10
|
-
#
|
11
|
-
# VariableSetter.call(:user, option: true, optional: true)
|
12
|
-
# # => "@user = __options__.fetch(:user, Dry::Initializer::UNDEFINED)"
|
13
|
-
#
|
14
|
-
class VariableSetter < Base
|
15
|
-
def param?
|
16
|
-
settings[:option] != true
|
17
|
-
end
|
18
|
-
|
19
|
-
def required?
|
20
|
-
!settings.key?(:default) && !settings[:optional]
|
21
|
-
end
|
22
|
-
|
23
|
-
def call
|
24
|
-
return "@#{name} = #{name}" if param?
|
25
|
-
key = ":\"#{name}\""
|
26
|
-
return "@#{rename} = __options__.fetch(#{key})" if required?
|
27
|
-
"@#{rename} = __options__.fetch(#{key}, Dry::Initializer::UNDEFINED)"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
module Dry::Initializer
|
2
|
-
# Namespace for code plugins builders
|
3
|
-
module Plugins
|
4
|
-
require_relative "plugins/base"
|
5
|
-
require_relative "plugins/default_proc"
|
6
|
-
require_relative "plugins/signature"
|
7
|
-
require_relative "plugins/type_constraint"
|
8
|
-
require_relative "plugins/variable_setter"
|
9
|
-
end
|
10
|
-
end
|