dry-container 0.2.8 → 0.3.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/README.md +14 -0
- data/lib/dry/container/mixin.rb +10 -1
- data/lib/dry/container/namespace_dsl.rb +1 -1
- data/lib/dry/container/registry.rb +4 -4
- data/lib/dry/container/resolver.rb +12 -3
- data/lib/dry/container/stub.rb +48 -0
- data/lib/dry/container/version.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/support/shared_examples/container.rb +58 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e3d3bf439e6c3bd3b03269a0b1b078df324550a
|
4
|
+
data.tar.gz: 43daf4430f1496b7444becd4619db45a1f5c47ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3eb73cfbddb9a59a929c1e6a27dc5087830c48733077f584f77cc974c72a0f5661ae2a42d78899ecec9c3e9bba3ddb134bffae771442258a8fa8eb31b08e61a8
|
7
|
+
data.tar.gz: ec5253b3eb128f50420befe89f40a9855b22a60638fb323a9fba34f16a7744dfa5eaab1a5522e6442b682de3863022445839376da96c4f193c0cc7ce5817f423
|
data/README.md
CHANGED
@@ -10,6 +10,20 @@ A simple, configurable container implemented in Ruby
|
|
10
10
|
|
11
11
|
## Synopsis
|
12
12
|
|
13
|
+
### Brief Example
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
container = Dry::Container.new
|
17
|
+
container.register(:parrot) { |a| puts a }
|
18
|
+
|
19
|
+
parrot = container.resolve(:parrot)
|
20
|
+
parrot.call("Hello World")
|
21
|
+
# Hello World
|
22
|
+
# => nil
|
23
|
+
```
|
24
|
+
|
25
|
+
### Detailed Example
|
26
|
+
|
13
27
|
```ruby
|
14
28
|
User = Struct.new(:name, :email)
|
15
29
|
|
data/lib/dry/container/mixin.rb
CHANGED
@@ -105,7 +105,7 @@ module Dry
|
|
105
105
|
def resolve(key)
|
106
106
|
config.resolver.call(_container, key)
|
107
107
|
end
|
108
|
-
|
108
|
+
alias [] resolve
|
109
109
|
|
110
110
|
# Merge in the items of the other container
|
111
111
|
#
|
@@ -132,6 +132,15 @@ module Dry
|
|
132
132
|
config.resolver.key?(_container, key)
|
133
133
|
end
|
134
134
|
|
135
|
+
# An array of registered names for the container
|
136
|
+
#
|
137
|
+
# @return [Array<String>]
|
138
|
+
#
|
139
|
+
# @api public
|
140
|
+
def keys
|
141
|
+
config.resolver.keys(_container)
|
142
|
+
end
|
143
|
+
|
135
144
|
# Evaluate block and register items in namespace
|
136
145
|
#
|
137
146
|
# @param [Mixed] namespace
|
@@ -28,13 +28,13 @@ module Dry
|
|
28
28
|
#
|
29
29
|
# @api public
|
30
30
|
def call(container, key, item, options)
|
31
|
+
key = key.to_s.dup.freeze
|
31
32
|
@_mutex.synchronize do
|
32
33
|
if container.key?(key)
|
33
|
-
|
34
|
-
else
|
35
|
-
key = key.is_a?(::String) ? key.dup.freeze : key
|
36
|
-
container[key] = ::Dry::Container::Item.new(item, options)
|
34
|
+
raise Error, "There is already an item registered with the key #{key.inspect}"
|
37
35
|
end
|
36
|
+
|
37
|
+
container[key] = ::Dry::Container::Item.new(item, options)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -18,8 +18,8 @@ module Dry
|
|
18
18
|
#
|
19
19
|
# @api public
|
20
20
|
def call(container, key)
|
21
|
-
item = container.fetch(key) do
|
22
|
-
|
21
|
+
item = container.fetch(key.to_s) do
|
22
|
+
raise Error, "Nothing registered with the key #{key.inspect}"
|
23
23
|
end
|
24
24
|
|
25
25
|
item.call
|
@@ -36,7 +36,16 @@ module Dry
|
|
36
36
|
#
|
37
37
|
# @api public
|
38
38
|
def key?(container, key)
|
39
|
-
container.key?(key)
|
39
|
+
container.key?(key.to_s)
|
40
|
+
end
|
41
|
+
|
42
|
+
# An array of registered names for the container
|
43
|
+
#
|
44
|
+
# @return [Array]
|
45
|
+
#
|
46
|
+
# @api public
|
47
|
+
def keys(container)
|
48
|
+
container.keys
|
40
49
|
end
|
41
50
|
end
|
42
51
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Dry
|
2
|
+
class Container
|
3
|
+
module Stub
|
4
|
+
# Overrides resolve to look into stubbed keys first
|
5
|
+
#
|
6
|
+
# @api public
|
7
|
+
def resolve(key)
|
8
|
+
_stubs.fetch(key) { super }
|
9
|
+
end
|
10
|
+
|
11
|
+
# Add a stub to the container
|
12
|
+
def stub(key, value, &block)
|
13
|
+
_stubs[key] = value
|
14
|
+
|
15
|
+
if block
|
16
|
+
yield
|
17
|
+
unstub(key)
|
18
|
+
end
|
19
|
+
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
# Remove stubbed keys from the container
|
24
|
+
def unstub(*keys)
|
25
|
+
keys = _stubs.keys if keys.empty?
|
26
|
+
keys.each { |key| _stubs.delete(key) }
|
27
|
+
end
|
28
|
+
|
29
|
+
# Stubs have already been enabled turning this into a noop
|
30
|
+
def enable_stubs!
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
# Stubs container
|
36
|
+
def _stubs
|
37
|
+
@_stubs ||= {}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module Mixin
|
42
|
+
# Enable stubbing functionality into the current container
|
43
|
+
def enable_stubs!
|
44
|
+
extend Dry::Container::Stub
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -116,6 +116,7 @@ shared_examples 'a container' do
|
|
116
116
|
it 'registers and resolves an object' do
|
117
117
|
container.register(:item) { 'item' }
|
118
118
|
|
119
|
+
expect(container.keys).to eq(['item'])
|
119
120
|
expect(container.key?(:item)).to be true
|
120
121
|
expect(container.resolve(:item)).to eq('item')
|
121
122
|
end
|
@@ -134,6 +135,7 @@ shared_examples 'a container' do
|
|
134
135
|
it 'registers and resolves a proc' do
|
135
136
|
container.register(:item, call: false) { 'item' }
|
136
137
|
|
138
|
+
expect(container.keys).to eq(['item'])
|
137
139
|
expect(container.key?(:item)).to be true
|
138
140
|
expect(container.resolve(:item).call).to eq('item')
|
139
141
|
expect(container[:item].call).to eq('item')
|
@@ -147,6 +149,7 @@ shared_examples 'a container' do
|
|
147
149
|
it 'registers and resolves an object' do
|
148
150
|
container.register(:item, proc { 'item' })
|
149
151
|
|
152
|
+
expect(container.keys).to eq(['item'])
|
150
153
|
expect(container.key?(:item)).to be true
|
151
154
|
expect(container.resolve(:item)).to eq('item')
|
152
155
|
expect(container[:item]).to eq('item')
|
@@ -157,6 +160,7 @@ shared_examples 'a container' do
|
|
157
160
|
it 'registers and resolves a proc' do
|
158
161
|
container.register(:item, proc { |item| item })
|
159
162
|
|
163
|
+
expect(container.keys).to eq(['item'])
|
160
164
|
expect(container.key?(:item)).to be true
|
161
165
|
expect(container.resolve(:item).call('item')).to eq('item')
|
162
166
|
expect(container[:item].call('item')).to eq('item')
|
@@ -168,6 +172,7 @@ shared_examples 'a container' do
|
|
168
172
|
it 'registers and resolves a proc' do
|
169
173
|
container.register(:item, proc { 'item' }, call: false)
|
170
174
|
|
175
|
+
expect(container.keys).to eq(['item'])
|
171
176
|
expect(container.key?(:item)).to be true
|
172
177
|
expect(container.resolve(:item).call).to eq('item')
|
173
178
|
expect(container[:item].call).to eq('item')
|
@@ -181,6 +186,7 @@ shared_examples 'a container' do
|
|
181
186
|
item = 'item'
|
182
187
|
container.register(:item, item)
|
183
188
|
|
189
|
+
expect(container.keys).to eq(['item'])
|
184
190
|
expect(container.key?(:item)).to be true
|
185
191
|
expect(container.resolve(:item)).to be(item)
|
186
192
|
expect(container[:item]).to be(item)
|
@@ -192,6 +198,7 @@ shared_examples 'a container' do
|
|
192
198
|
item = -> { 'test' }
|
193
199
|
container.register(:item, item, call: false)
|
194
200
|
|
201
|
+
expect(container.keys).to eq(['item'])
|
195
202
|
expect(container.key?(:item)).to be true
|
196
203
|
expect(container.resolve(:item)).to eq(item)
|
197
204
|
expect(container[:item]).to eq(item)
|
@@ -214,6 +221,13 @@ shared_examples 'a container' do
|
|
214
221
|
end
|
215
222
|
end
|
216
223
|
|
224
|
+
describe 'mixing Strings and Symbols' do
|
225
|
+
it do
|
226
|
+
container.register(:item, 'item')
|
227
|
+
expect(container.resolve('item')).to eql('item')
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
217
231
|
describe '#merge' do
|
218
232
|
let(:key) { :key }
|
219
233
|
let(:other) { Dry::Container.new }
|
@@ -299,4 +313,48 @@ shared_examples 'a container' do
|
|
299
313
|
end
|
300
314
|
end
|
301
315
|
end
|
316
|
+
|
317
|
+
describe 'stubbing' do
|
318
|
+
before do
|
319
|
+
container.enable_stubs!
|
320
|
+
|
321
|
+
container.register(:item, 'item')
|
322
|
+
container.register(:foo, 'bar')
|
323
|
+
end
|
324
|
+
|
325
|
+
after do
|
326
|
+
container.unstub
|
327
|
+
end
|
328
|
+
|
329
|
+
it 'keys can be stubbed' do
|
330
|
+
container.stub(:item, 'stub')
|
331
|
+
expect(container.resolve(:item)).to eql('stub')
|
332
|
+
end
|
333
|
+
|
334
|
+
it 'only other keys remain accesible' do
|
335
|
+
container.stub(:item, 'stub')
|
336
|
+
expect(container.resolve(:foo)).to eql('bar')
|
337
|
+
end
|
338
|
+
|
339
|
+
it 'keys can be reverted back to their original value' do
|
340
|
+
container.stub(:item, 'stub')
|
341
|
+
container.unstub(:item)
|
342
|
+
|
343
|
+
expect(container.resolve(:item)).to eql('item')
|
344
|
+
end
|
345
|
+
|
346
|
+
describe 'with block argument' do
|
347
|
+
it 'executes the block with the given stubs' do
|
348
|
+
expect { |b| container.stub(:item, 'stub', &b) }.to yield_control
|
349
|
+
end
|
350
|
+
|
351
|
+
it 'keys are stubbed only while inside the block' do
|
352
|
+
container.stub(:item, 'stub') do
|
353
|
+
expect(container.resolve(:item)).to eql('stub')
|
354
|
+
end
|
355
|
+
|
356
|
+
expect(container.resolve(:item)).to eql('item')
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|
302
360
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-container
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Holland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thread_safe
|
@@ -112,6 +112,7 @@ files:
|
|
112
112
|
- lib/dry/container/namespace_dsl.rb
|
113
113
|
- lib/dry/container/registry.rb
|
114
114
|
- lib/dry/container/resolver.rb
|
115
|
+
- lib/dry/container/stub.rb
|
115
116
|
- lib/dry/container/version.rb
|
116
117
|
- rakelib/rubocop.rake
|
117
118
|
- spec/integration/container_spec.rb
|