dry-initializer 0.7.0 → 0.8.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/CHANGELOG.md +50 -0
- data/README.md +4 -1
- data/dry-initializer.gemspec +1 -1
- data/lib/dry/initializer/builder.rb +0 -16
- data/lib/dry/initializer/mixin.rb +14 -4
- data/lib/dry/initializer/plugins/signature.rb +10 -20
- data/lib/dry/initializer/plugins/variable_setter.rb +19 -2
- data/lib/dry/initializer/signature.rb +3 -3
- data/spec/{dry/base_spec.rb → base_spec.rb} +0 -0
- data/spec/{dry/container_spec.rb → container_spec.rb} +0 -0
- data/spec/{dry/default_nil_spec.rb → default_nil_spec.rb} +0 -0
- data/spec/{dry/default_values_spec.rb → default_values_spec.rb} +0 -0
- data/spec/{dry/invalid_default_spec.rb → invalid_default_spec.rb} +0 -0
- data/spec/{dry/missed_default_spec.rb → missed_default_spec.rb} +0 -0
- data/spec/{dry/optional_spec.rb → optional_spec.rb} +0 -0
- data/spec/options_tolerance_spec.rb +20 -0
- data/spec/{dry/plugin_registry_spec.rb → plugin_registry_spec.rb} +0 -0
- data/spec/{dry/reader_spec.rb → reader_spec.rb} +0 -0
- data/spec/{dry/repetitive_definitions_spec.rb → repetitive_definitions_spec.rb} +0 -0
- data/spec/shared_definitions_spec.rb +35 -0
- data/spec/{dry/subclassing_spec.rb → subclassing_spec.rb} +0 -0
- data/spec/{dry/type_constraint_spec.rb → type_constraint_spec.rb} +0 -0
- data/spec/{dry/value_coercion_via_dry_types_spec.rb → value_coercion_via_dry_types_spec.rb} +0 -0
- metadata +32 -32
- data/spec/dry/options_tolerance_spec.rb +0 -27
- data/spec/dry/shared_definitions_spec.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc5b54635b8cfc7c85c33e0aac287c54919cb3de
|
4
|
+
data.tar.gz: dde1379e2f5f9f86ad1de906e8402a326a850c70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 512704ff1885b0c9bbb147020b950e97e70eacd4405548cad5478b728eee2861c47e58f19ff4603c21edf08965372820386645fb451e3c93edfdb61f3185d3e2
|
7
|
+
data.tar.gz: 7090b29b8c66d79c1b7c9f9ccb4019ec9ccc9ae07126a9c2b670eb4f6a0f6b4b669f450dd701514e24cab465a9d760b81443db5959d38834c4cec327ad9ec336
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,53 @@
|
|
1
|
+
## v0.8.0 2016-11-05
|
2
|
+
|
3
|
+
In this version we switched from key arguments to ** to support special keys:
|
4
|
+
|
5
|
+
option :end
|
6
|
+
option :begin
|
7
|
+
|
8
|
+
In previous versions this was translated to
|
9
|
+
|
10
|
+
def initialize(end:, begin:)
|
11
|
+
@end = end # BOOM! SyntaxError!
|
12
|
+
@begin = begin # Potential BOOM (unreached)
|
13
|
+
end
|
14
|
+
|
15
|
+
Now the assignment is imlemented like this:
|
16
|
+
|
17
|
+
def initialize(**__options__)
|
18
|
+
@end = __options__.fetch(:end)
|
19
|
+
@begin = __options__.fetch(:begin)
|
20
|
+
end
|
21
|
+
|
22
|
+
As a side effect of the change the initializer becomes tolerant
|
23
|
+
to any unknown option if, and only if some `option` was set explicitly.
|
24
|
+
|
25
|
+
Methods `tolerant_to_unknown_options` and `intolerant_to_unknown_options`
|
26
|
+
are deprecated and will be removed in the next version of the gem.
|
27
|
+
|
28
|
+
### Added
|
29
|
+
|
30
|
+
* support for special options like `option :end`, `option :begin` etc. (@nepalez)
|
31
|
+
|
32
|
+
### Internals
|
33
|
+
|
34
|
+
* switched from key arguments to serialized hash argument in the initializer (@nepalez)
|
35
|
+
|
36
|
+
### Breaking Changes
|
37
|
+
|
38
|
+
* the initializer becomes tolerant to unknown options when any `option` was set,
|
39
|
+
ignoring `intolerant_to_unknown_options` helper.
|
40
|
+
|
41
|
+
* the initializer becomes intolerant to options when no `option` was set,
|
42
|
+
ignoring `tolerant_to_unknown_options` helper.
|
43
|
+
|
44
|
+
### Deprecated
|
45
|
+
|
46
|
+
* `tolerant_to_unknown_options`
|
47
|
+
* `intolerant_to_unknown_options`
|
48
|
+
|
49
|
+
[Compare v0.7.0...v0.8.0](https://github.com/dry-rb/dry-initializer/compare/v0.7.0..v0.8.0)
|
50
|
+
|
1
51
|
## v0.7.0 2016-10-11
|
2
52
|
|
3
53
|
### Added
|
data/README.md
CHANGED
@@ -43,15 +43,17 @@ $ gem install dry-initializer
|
|
43
43
|
|
44
44
|
```ruby
|
45
45
|
require 'dry-initializer'
|
46
|
+
require 'dry-types'
|
46
47
|
|
47
48
|
class User
|
48
49
|
extend Dry::Initializer::Mixin
|
49
50
|
|
50
51
|
# Params of the initializer along with corresponding readers
|
51
|
-
param :name
|
52
|
+
param :name, type: Dry::Types["strict.string"]
|
52
53
|
param :role, default: proc { 'customer' }
|
53
54
|
# Options of the initializer along with corresponding readers
|
54
55
|
option :admin, default: proc { false }
|
56
|
+
option :vip, optional: true
|
55
57
|
end
|
56
58
|
|
57
59
|
# Defines the initializer with params and options
|
@@ -61,6 +63,7 @@ user = User.new 'Vladimir', 'admin', admin: true
|
|
61
63
|
user.name # => 'Vladimir'
|
62
64
|
user.role # => 'admin'
|
63
65
|
user.admin # => true
|
66
|
+
user.vip # => Dry::Initializer::UNDEFINED
|
64
67
|
```
|
65
68
|
|
66
69
|
See full documentation on the [Dry project official site][docs]
|
data/dry-initializer.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = "dry-initializer"
|
3
|
-
gem.version = "0.
|
3
|
+
gem.version = "0.8.0"
|
4
4
|
gem.author = ["Vladimir Kochnev (marshall-lee)", "Andrew Kozin (nepalez)"]
|
5
5
|
gem.email = ["hashtable@yandex.ru", "andrew.kozin@gmail.com"]
|
6
6
|
gem.homepage = "https://github.com/dryrb/dry-initializer"
|
@@ -25,22 +25,6 @@ module Dry::Initializer
|
|
25
25
|
copy { @plugins = plugins }
|
26
26
|
end
|
27
27
|
|
28
|
-
# Makes builder to provide options-tolerant initializer
|
29
|
-
#
|
30
|
-
# @return [Dry::Initializer::Builder]
|
31
|
-
#
|
32
|
-
def tolerant_to_unknown_options
|
33
|
-
copy { @tolerant = "**" }
|
34
|
-
end
|
35
|
-
|
36
|
-
# Makes builder to provide options-intolerant initializer
|
37
|
-
#
|
38
|
-
# @return [Dry::Initializer::Builder]
|
39
|
-
#
|
40
|
-
def intolerant_to_unknown_options
|
41
|
-
copy { @tolerant = nil }
|
42
|
-
end
|
43
|
-
|
44
28
|
# Defines new agrument and reloads mixin definitions
|
45
29
|
#
|
46
30
|
# @param [#to_sym] name
|
@@ -57,8 +57,13 @@ module Dry::Initializer
|
|
57
57
|
# @return [self] itself
|
58
58
|
#
|
59
59
|
def tolerant_to_unknown_options
|
60
|
-
|
61
|
-
|
60
|
+
warn <<-MESSAGE.gsub(/ +\|/, "")
|
61
|
+
|[DEPRECATION] Helper method `tolerant_to_unknown_options` was deprecated,
|
62
|
+
|and will be removed in v0.9.0.
|
63
|
+
|If any `option` was defined, the initializer becomes tolerant to all the others.
|
64
|
+
|This is necessary to support "special" names in options like `option :end`.
|
65
|
+
|It forbids options only when no one was declared explicitly.
|
66
|
+
MESSAGE
|
62
67
|
end
|
63
68
|
|
64
69
|
# Makes initializer intolerant to unknown options
|
@@ -66,8 +71,13 @@ module Dry::Initializer
|
|
66
71
|
# @return [self] itself
|
67
72
|
#
|
68
73
|
def intolerant_to_unknown_options
|
69
|
-
|
70
|
-
|
74
|
+
warn <<-MESSAGE.gsub(/ +\|/, "")
|
75
|
+
|[DEPRECATION] Helper method `intolerant_to_unknown_options` was deprecated.
|
76
|
+
|and will be removed in v0.9.0.
|
77
|
+
|If any `option` was defined, the initializer becomes tolerant to all the others.
|
78
|
+
|This is necessary to support "special" names in options like `option :end`.
|
79
|
+
|It forbids options only when no one was declared explicitly.
|
80
|
+
MESSAGE
|
71
81
|
end
|
72
82
|
|
73
83
|
private
|
@@ -2,38 +2,28 @@ module Dry::Initializer::Plugins
|
|
2
2
|
# Plugin builds a chunk of code for the initializer's signature:
|
3
3
|
#
|
4
4
|
# @example
|
5
|
-
# Signature.call(:user
|
6
|
-
# # => "user
|
5
|
+
# Signature.call(:user)
|
6
|
+
# # => "user"
|
7
7
|
#
|
8
8
|
# Signature.call(:user, default: -> { nil })
|
9
9
|
# # => "user = Dry::Initializer::UNDEFINED"
|
10
10
|
#
|
11
|
+
# Signature.call(:user, option: true)
|
12
|
+
# # => "**__options__"
|
13
|
+
#
|
11
14
|
class Signature < Base
|
12
15
|
def param?
|
13
16
|
settings[:option] != true
|
14
17
|
end
|
15
18
|
|
16
|
-
def
|
17
|
-
settings.key? :
|
18
|
-
end
|
19
|
-
|
20
|
-
def optional?
|
21
|
-
default? || settings.key?(:optional)
|
19
|
+
def required?
|
20
|
+
!settings.key?(:default) && !settings[:optional]
|
22
21
|
end
|
23
22
|
|
24
23
|
def call
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
when [true, true] then "#{name} = #{undefined}"
|
29
|
-
when [false, true] then "#{name}: #{undefined}"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def undefined
|
36
|
-
@undefined ||= "Dry::Initializer::UNDEFINED"
|
24
|
+
return "**__options__" unless param?
|
25
|
+
return name.to_s if required?
|
26
|
+
"#{name} = Dry::Initializer::UNDEFINED"
|
37
27
|
end
|
38
28
|
end
|
39
29
|
end
|
@@ -2,11 +2,28 @@ module Dry::Initializer::Plugins
|
|
2
2
|
# Plugin builds a code for variable setter:
|
3
3
|
#
|
4
4
|
# @example
|
5
|
-
# VariableSetter.call(:user,
|
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)"
|
6
13
|
#
|
7
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
|
+
|
8
23
|
def call
|
9
|
-
"@#{name} = #{name}"
|
24
|
+
return "@#{name} = #{name}" if param?
|
25
|
+
return "@#{name} = __options__.fetch(:#{name})" if required?
|
26
|
+
"@#{name} = __options__.fetch(:#{name}, Dry::Initializer::UNDEFINED)"
|
10
27
|
end
|
11
28
|
end
|
12
29
|
end
|
@@ -25,7 +25,7 @@ module Dry::Initializer
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def call
|
28
|
-
map(&:call).join(", ")
|
28
|
+
map(&:call).compact.uniq.join(", ")
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
@@ -43,8 +43,8 @@ module Dry::Initializer
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def validates_order_of(signature)
|
46
|
-
return unless signature.param? &&
|
47
|
-
return unless any? { |item| item.param? && item.
|
46
|
+
return unless signature.param? && signature.required?
|
47
|
+
return unless any? { |item| item.param? && !item.required? }
|
48
48
|
|
49
49
|
fail OrderError.new(signature.name)
|
50
50
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe "options tolerance" do
|
2
|
+
before do
|
3
|
+
class Test::Foo
|
4
|
+
extend Dry::Initializer::Mixin
|
5
|
+
option :foo
|
6
|
+
end
|
7
|
+
|
8
|
+
class Test::Bar
|
9
|
+
extend Dry::Initializer::Mixin
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it "allows unknown options when someone defined" do
|
14
|
+
expect { Test::Foo.new foo: :bar, bar: :baz }.not_to raise_error
|
15
|
+
end
|
16
|
+
|
17
|
+
it "forbids options when no one defined" do
|
18
|
+
expect { Test::Bar.new bar: :baz }.to raise_error(ArgumentError)
|
19
|
+
end
|
20
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,35 @@
|
|
1
|
+
describe "shared definition" do
|
2
|
+
subject do
|
3
|
+
class Test::Foo
|
4
|
+
extend Dry::Initializer::Mixin
|
5
|
+
|
6
|
+
using default: proc { nil } do
|
7
|
+
param :foo
|
8
|
+
option :end
|
9
|
+
option :baz, default: proc { 0 }
|
10
|
+
end
|
11
|
+
|
12
|
+
using optional: true do
|
13
|
+
option :qux
|
14
|
+
option :quxx, optional: false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "is applied to params and options" do
|
20
|
+
instance = subject.new(quxx: 1)
|
21
|
+
|
22
|
+
expect(instance.foo).to be_nil
|
23
|
+
expect(instance.end).to be_nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can be reloaded" do
|
27
|
+
instance = subject.new(quxx: 1)
|
28
|
+
|
29
|
+
expect(instance.baz).to eq 0
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can reload :optional setting" do
|
33
|
+
expect { subject.new }.to raise_error(KeyError, /quxx/)
|
34
|
+
end
|
35
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
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: 0.
|
4
|
+
version: 0.8.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: 2016-
|
12
|
+
date: 2016-11-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -121,22 +121,22 @@ files:
|
|
121
121
|
- lib/dry/initializer/plugins/variable_setter.rb
|
122
122
|
- lib/dry/initializer/scope.rb
|
123
123
|
- lib/dry/initializer/signature.rb
|
124
|
-
- spec/
|
125
|
-
- spec/
|
126
|
-
- spec/
|
127
|
-
- spec/
|
128
|
-
- spec/
|
129
|
-
- spec/
|
130
|
-
- spec/
|
131
|
-
- spec/
|
132
|
-
- spec/
|
133
|
-
- spec/
|
134
|
-
- spec/
|
135
|
-
- spec/
|
136
|
-
- spec/dry/subclassing_spec.rb
|
137
|
-
- spec/dry/type_constraint_spec.rb
|
138
|
-
- spec/dry/value_coercion_via_dry_types_spec.rb
|
124
|
+
- spec/base_spec.rb
|
125
|
+
- spec/container_spec.rb
|
126
|
+
- spec/default_nil_spec.rb
|
127
|
+
- spec/default_values_spec.rb
|
128
|
+
- spec/invalid_default_spec.rb
|
129
|
+
- spec/missed_default_spec.rb
|
130
|
+
- spec/optional_spec.rb
|
131
|
+
- spec/options_tolerance_spec.rb
|
132
|
+
- spec/plugin_registry_spec.rb
|
133
|
+
- spec/reader_spec.rb
|
134
|
+
- spec/repetitive_definitions_spec.rb
|
135
|
+
- spec/shared_definitions_spec.rb
|
139
136
|
- spec/spec_helper.rb
|
137
|
+
- spec/subclassing_spec.rb
|
138
|
+
- spec/type_constraint_spec.rb
|
139
|
+
- spec/value_coercion_via_dry_types_spec.rb
|
140
140
|
homepage: https://github.com/dryrb/dry-initializer
|
141
141
|
licenses:
|
142
142
|
- MIT
|
@@ -162,19 +162,19 @@ signing_key:
|
|
162
162
|
specification_version: 4
|
163
163
|
summary: DSL for declaring params and options of the initializer
|
164
164
|
test_files:
|
165
|
-
- spec/
|
166
|
-
- spec/
|
167
|
-
- spec/
|
168
|
-
- spec/
|
169
|
-
- spec/
|
170
|
-
- spec/
|
171
|
-
- spec/
|
172
|
-
- spec/
|
173
|
-
- spec/
|
174
|
-
- spec/
|
175
|
-
- spec/
|
176
|
-
- spec/
|
177
|
-
- spec/dry/subclassing_spec.rb
|
178
|
-
- spec/dry/type_constraint_spec.rb
|
179
|
-
- spec/dry/value_coercion_via_dry_types_spec.rb
|
165
|
+
- spec/base_spec.rb
|
166
|
+
- spec/container_spec.rb
|
167
|
+
- spec/default_nil_spec.rb
|
168
|
+
- spec/default_values_spec.rb
|
169
|
+
- spec/invalid_default_spec.rb
|
170
|
+
- spec/missed_default_spec.rb
|
171
|
+
- spec/optional_spec.rb
|
172
|
+
- spec/options_tolerance_spec.rb
|
173
|
+
- spec/plugin_registry_spec.rb
|
174
|
+
- spec/reader_spec.rb
|
175
|
+
- spec/repetitive_definitions_spec.rb
|
176
|
+
- spec/shared_definitions_spec.rb
|
180
177
|
- spec/spec_helper.rb
|
178
|
+
- spec/subclassing_spec.rb
|
179
|
+
- spec/type_constraint_spec.rb
|
180
|
+
- spec/value_coercion_via_dry_types_spec.rb
|
@@ -1,27 +0,0 @@
|
|
1
|
-
describe "options tolerance" do
|
2
|
-
before do
|
3
|
-
class Test::Foo
|
4
|
-
extend Dry::Initializer::Mixin
|
5
|
-
end
|
6
|
-
|
7
|
-
class Test::Bar < Test::Foo
|
8
|
-
tolerant_to_unknown_options
|
9
|
-
end
|
10
|
-
|
11
|
-
class Test::Baz < Test::Bar
|
12
|
-
intolerant_to_unknown_options
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
it "is strict by default" do
|
17
|
-
expect { Test::Foo.new foo: :bar }.to raise_error(ArgumentError)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "allows unknown options when switched on" do
|
21
|
-
expect { Test::Bar.new foo: :bar }.not_to raise_error
|
22
|
-
end
|
23
|
-
|
24
|
-
it "can be switched off" do
|
25
|
-
expect { Test::Baz.new foo: :bar }.to raise_error(ArgumentError)
|
26
|
-
end
|
27
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
describe "shared definition" do
|
2
|
-
subject do
|
3
|
-
class Test::Foo
|
4
|
-
extend Dry::Initializer::Mixin
|
5
|
-
|
6
|
-
using default: proc { nil } do
|
7
|
-
param :foo
|
8
|
-
option :bar
|
9
|
-
option :baz, default: proc { 0 }
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
it "is applied to params and options" do
|
15
|
-
expect(subject.new.foo).to be_nil
|
16
|
-
expect(subject.new.bar).to be_nil
|
17
|
-
end
|
18
|
-
|
19
|
-
it "can be reloaded" do
|
20
|
-
expect(subject.new.baz).to eq 0
|
21
|
-
end
|
22
|
-
end
|