dry-initializer 0.10.2 → 0.11.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 +35 -0
- data/dry-initializer.gemspec +1 -1
- data/lib/dry/initializer/builder.rb +3 -1
- data/lib/dry/initializer/mixin.rb +27 -10
- data/spec/custom_initializer_spec.rb +30 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 604898d7c7112e84b0e097a2913e81ba54918e25
|
4
|
+
data.tar.gz: 417c9a1e41b76162b12d7ce36dd19a156ca408e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aec2d5e6f46522584d247e1c106eaab9bcec8b2787c4a827ddb24e1f533c81b242b3c04796207f97c4cb0a179d7581146e94495296f995e31b5a9e0a6c269ccf
|
7
|
+
data.tar.gz: 0ee2c8d900d400312a8c8ddae17648e1b37d28edb61034a76b0c01e87b2ed740cb135281f391f2e3d3f6170ece71faa977772e463ed5603d8c7a1039d51a0948
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,38 @@
|
|
1
|
+
## v0.11.0 2017-01-02
|
2
|
+
|
3
|
+
### Added
|
4
|
+
|
5
|
+
* Support of reloading `#initializer` with `super` (@nepalez)
|
6
|
+
|
7
|
+
### Internal
|
8
|
+
|
9
|
+
* Refactor the way [#initializer] method is (re)defined (@nepalez)
|
10
|
+
|
11
|
+
When you extend class with `Dry::Initializer::Mixin`, the initializer is
|
12
|
+
defined not "inside" the class per se, but inside the included module. The
|
13
|
+
reference to that module is stored as class-level `__initializer_mixin__`.
|
14
|
+
|
15
|
+
Mixin method [#initialize] calls another private method [#__initialize__].
|
16
|
+
It is this method to be reloaded every time you envoke a helper
|
17
|
+
`option` or `product`.
|
18
|
+
|
19
|
+
When new subclass is inherited, new mixin is added to chain of accessors,
|
20
|
+
but this time it does reload `__initialize__` only, not the `initialize`.
|
21
|
+
That is how you can safely reload initializer using `super`, but at the same
|
22
|
+
time use the whole power of dry-initializer DSL both in parent class and its
|
23
|
+
subclasses.
|
24
|
+
|
25
|
+
The whole stack of accessors looks like the following:
|
26
|
+
- Parent class mixin: `initialize` --> `__initialize__`
|
27
|
+
^
|
28
|
+
- Parent class: `initialize`
|
29
|
+
- Subclass mixin: ^ `__initialize__`
|
30
|
+
- Subclass: `initialize`
|
31
|
+
|
32
|
+
See specification `spec/custom_initializer_spec.rb` to see how this works.
|
33
|
+
|
34
|
+
[Compare v0.10.2...v0.11.0](https://github.com/dry-rb/dry-initializer/compare/v0.10.2...v0.11.0)
|
35
|
+
|
1
36
|
## v0.10.2 2016-12-31
|
2
37
|
|
3
38
|
### Added
|
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.11.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"
|
@@ -77,12 +77,14 @@ module Dry::Initializer
|
|
77
77
|
|
78
78
|
def reload_initializer(mixin)
|
79
79
|
mixin.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
80
|
-
def
|
80
|
+
def __initialize__(#{@signature.call})
|
81
81
|
@__options__ = __options__
|
82
82
|
#{@parts.select { |part| String === part }.join("\n")}
|
83
83
|
__after_initialize__
|
84
84
|
end
|
85
85
|
RUBY
|
86
|
+
|
87
|
+
mixin.send :private, :__initialize__
|
86
88
|
end
|
87
89
|
|
88
90
|
def reload_callback(mixin)
|
@@ -14,8 +14,8 @@ module Dry::Initializer
|
|
14
14
|
def param(name, type = nil, **options)
|
15
15
|
options[:type] = type if type
|
16
16
|
options[:option] = false
|
17
|
-
@
|
18
|
-
|
17
|
+
@__initializer_builder__ = __initializer_builder__.define(name, **options)
|
18
|
+
__initializer_builder__.call(__initializer_mixin__)
|
19
19
|
end
|
20
20
|
|
21
21
|
# Declares a named argument
|
@@ -27,8 +27,8 @@ module Dry::Initializer
|
|
27
27
|
def option(name, type = nil, **options)
|
28
28
|
options[:type] = type if type
|
29
29
|
options[:option] = true
|
30
|
-
@
|
31
|
-
|
30
|
+
@__initializer_builder__ = __initializer_builder__.define(name, **options)
|
31
|
+
__initializer_builder__.call(__initializer_mixin__)
|
32
32
|
end
|
33
33
|
|
34
34
|
# Adds new plugin to the builder
|
@@ -37,24 +37,41 @@ module Dry::Initializer
|
|
37
37
|
# @return [self] itself
|
38
38
|
#
|
39
39
|
def register_initializer_plugin(plugin)
|
40
|
-
@
|
41
|
-
|
40
|
+
@__initializer_builder__ = __initializer_builder__.register(plugin)
|
41
|
+
__initializer_builder__.call(__initializer_mixin__)
|
42
42
|
end
|
43
43
|
|
44
44
|
private
|
45
45
|
|
46
|
-
def
|
47
|
-
@
|
46
|
+
def __initializer_mixin__
|
47
|
+
@__initializer_mixin__ ||= Module.new do
|
48
|
+
def initialize(*args)
|
49
|
+
__initialize__(*args)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def __initializer_builder__
|
55
|
+
@__initializer_builder__ ||= Builder.new
|
48
56
|
end
|
49
57
|
|
50
58
|
def inherited(klass)
|
51
|
-
|
59
|
+
new_builder = __initializer_builder__.dup
|
60
|
+
klass.instance_variable_set :@__initializer_builder__, new_builder
|
61
|
+
|
62
|
+
new_mixin = Module.new
|
63
|
+
new_builder.call(new_mixin)
|
64
|
+
klass.instance_variable_set :@__initializer_mixin__, new_mixin
|
65
|
+
klass.include new_mixin
|
52
66
|
|
53
67
|
super
|
54
68
|
end
|
55
69
|
|
56
70
|
def self.extended(klass)
|
57
|
-
|
71
|
+
super
|
72
|
+
mixin = klass.send(:__initializer_mixin__)
|
73
|
+
klass.send(:__initializer_builder__).call(mixin)
|
74
|
+
klass.include mixin
|
58
75
|
end
|
59
76
|
end
|
60
77
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
describe "custom initializer" do
|
2
|
+
before do
|
3
|
+
class Test::Foo
|
4
|
+
extend Dry::Initializer::Mixin
|
5
|
+
|
6
|
+
param :bar
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
super
|
10
|
+
@bar *= 3
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Test::Baz < Test::Foo
|
15
|
+
param :qux
|
16
|
+
|
17
|
+
def initialize(*args)
|
18
|
+
super
|
19
|
+
@qux += 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "reloads the initializer" do
|
25
|
+
baz = Test::Baz.new(5, 5)
|
26
|
+
|
27
|
+
expect(baz.bar).to eq 15 # 5 * 3
|
28
|
+
expect(baz.qux).to eq 6 # 5 + 1
|
29
|
+
end
|
30
|
+
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: 0.
|
4
|
+
version: 0.11.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: 2017-01-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- lib/dry/initializer/signature.rb
|
117
117
|
- spec/base_spec.rb
|
118
118
|
- spec/container_spec.rb
|
119
|
+
- spec/custom_initializer_spec.rb
|
119
120
|
- spec/default_nil_spec.rb
|
120
121
|
- spec/default_values_spec.rb
|
121
122
|
- spec/invalid_default_spec.rb
|
@@ -158,6 +159,7 @@ summary: DSL for declaring params and options of the initializer
|
|
158
159
|
test_files:
|
159
160
|
- spec/base_spec.rb
|
160
161
|
- spec/container_spec.rb
|
162
|
+
- spec/custom_initializer_spec.rb
|
161
163
|
- spec/default_nil_spec.rb
|
162
164
|
- spec/default_values_spec.rb
|
163
165
|
- spec/invalid_default_spec.rb
|