dry-container 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +1 -2
- data/.travis.yml +8 -5
- data/CHANGELOG.md +7 -1
- data/Gemfile +4 -1
- data/README.md +3 -1
- data/lib/dry/container/mixin.rb +24 -5
- data/lib/dry/container/resolver.rb +14 -0
- data/lib/dry/container/version.rb +1 -1
- data/spec/integration/mixin_spec.rb +13 -0
- data/spec/spec_helper.rb +83 -4
- data/spec/support/shared_examples/container.rb +25 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35fd3e8023c0220150dade45164cdefbe011633c
|
4
|
+
data.tar.gz: 4060a17b5831ef9c1fe7aa4440e0c34ef7d8fb4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e1f8876a5ea3cdb77b8516e1d85481ed86b58d70c8d41aa77d71c45fbf30bdd1b4c226a60a50a0795fde809934461a8c72ff6225b6a2b4b9bd6e468cb369709
|
7
|
+
data.tar.gz: bf68f2feb7608a30d851f69c7e370741a0cf2af50e539abe027cad53ce3714b7965b8964266b5e045fabb43fcdcb6f86f95b9398de874b8f7752cf4c56797558
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.travis.yml
CHANGED
@@ -1,26 +1,29 @@
|
|
1
1
|
language: ruby
|
2
|
-
|
2
|
+
dist: trusty
|
3
|
+
sudo: required
|
3
4
|
cache: bundler
|
4
5
|
bundler_args: --without console
|
5
6
|
script:
|
6
7
|
- bundle exec rake spec
|
8
|
+
after_success:
|
9
|
+
- '[ -d coverage ] && bundle exec codeclimate-test-reporter'
|
7
10
|
rvm:
|
8
11
|
- 2.0
|
9
12
|
- 2.1
|
10
13
|
- 2.2
|
11
|
-
-
|
14
|
+
- 2.3.1
|
15
|
+
- rbx-3
|
16
|
+
- jruby-9.1.5.0
|
12
17
|
- ruby-head
|
13
18
|
- jruby-head
|
14
19
|
env:
|
15
20
|
global:
|
16
21
|
- JRUBY_OPTS='--dev -J-Xmx1024M'
|
22
|
+
- COVERAGE='true'
|
17
23
|
matrix:
|
18
24
|
allow_failures:
|
19
25
|
- rvm: ruby-head
|
20
26
|
- rvm: jruby-head
|
21
|
-
include:
|
22
|
-
- rvm: jruby-9.0.0.0
|
23
|
-
before_install: rvm get master && rvm install jruby-9.0.0.0 && gem install bundler --no-ri --no-rdoc
|
24
27
|
notifications:
|
25
28
|
email: false
|
26
29
|
webhooks:
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## Unreleased
|
2
|
+
|
3
|
+
## Added
|
4
|
+
|
5
|
+
* `Dry::Container::Mixin#each` - provides a means of seeing what all is registered in the container ([jeremyf](https://github.com/jeremyf))
|
6
|
+
|
1
7
|
## v0.5.0
|
2
8
|
|
3
9
|
## Added
|
@@ -8,4 +14,4 @@
|
|
8
14
|
|
9
15
|
* `required_ruby_version` set to `>= 2.0.0` ([artofhuman](https://github.com/artofhuman))
|
10
16
|
|
11
|
-
[Compare v0.4.0...HEAD](https://github.com/dry-rb/dry-container/compare/v0.4.0...
|
17
|
+
[Compare v0.4.0...HEAD](https://github.com/dry-rb/dry-container/compare/v0.4.0...v0.5.0)
|
data/Gemfile
CHANGED
@@ -3,7 +3,10 @@ source 'https://rubygems.org'
|
|
3
3
|
gemspec
|
4
4
|
|
5
5
|
group :test do
|
6
|
-
|
6
|
+
platforms :mri do
|
7
|
+
gem 'codeclimate-test-reporter', require: false
|
8
|
+
gem 'simplecov', require: false
|
9
|
+
end
|
7
10
|
end
|
8
11
|
|
9
12
|
group :tools do
|
data/README.md
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
[![API Documentation Coverage](http://inch-ci.org/github/dry-rb/dry-container.svg)][inch]
|
14
14
|
|
15
15
|
|
16
|
-
A simple, configurable container implemented in Ruby
|
16
|
+
A simple, configurable container implemented in Ruby.
|
17
17
|
|
18
18
|
## Synopsis
|
19
19
|
|
@@ -29,6 +29,8 @@ parrot.call("Hello World")
|
|
29
29
|
# => nil
|
30
30
|
```
|
31
31
|
|
32
|
+
See [Dry::AutoInject Usage](https://github.com/dry-rb/dry-auto_inject#usage) for additional details.
|
33
|
+
|
32
34
|
### Detailed Example
|
33
35
|
|
34
36
|
```ruby
|
data/lib/dry/container/mixin.rb
CHANGED
@@ -48,20 +48,24 @@ module Dry
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
# @private
|
52
|
+
module Initializer
|
53
|
+
def initialize(*args, &block)
|
54
|
+
@_container = ::Concurrent::Hash.new
|
55
|
+
super
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
51
59
|
# @private
|
52
60
|
def self.included(base)
|
53
61
|
base.class_eval do
|
54
62
|
extend ::Dry::Configurable
|
63
|
+
prepend Initializer
|
55
64
|
|
56
65
|
setting :registry, ::Dry::Container::Registry.new
|
57
66
|
setting :resolver, ::Dry::Container::Resolver.new
|
58
67
|
setting :namespace_separator, '.'
|
59
68
|
|
60
|
-
def initialize(*args, &block)
|
61
|
-
@_container = ::Concurrent::Hash.new
|
62
|
-
super(*args, &block)
|
63
|
-
end
|
64
|
-
|
65
69
|
def config
|
66
70
|
self.class.config
|
67
71
|
end
|
@@ -179,6 +183,21 @@ module Dry
|
|
179
183
|
self
|
180
184
|
end
|
181
185
|
|
186
|
+
# Calls block once for each key/value pair in the container, passing the key and the registered item parameters.
|
187
|
+
#
|
188
|
+
# If no block is given, an enumerator is returned instead.
|
189
|
+
#
|
190
|
+
# @return [Enumerator]
|
191
|
+
#
|
192
|
+
# @api public
|
193
|
+
#
|
194
|
+
# @note In discussions with other developers, it was felt that being able to iterate over not just
|
195
|
+
# the registered keys, but to see what was registered would be very helpful. This is a step
|
196
|
+
# toward doing that.
|
197
|
+
def each(&block)
|
198
|
+
config.resolver.each(_container, &block)
|
199
|
+
end
|
200
|
+
|
182
201
|
# Evaluate block and register items in namespace
|
183
202
|
#
|
184
203
|
# @param [Mixed] namespace
|
@@ -59,6 +59,20 @@ module Dry
|
|
59
59
|
def each_key(container, &block)
|
60
60
|
container.each_key(&block)
|
61
61
|
end
|
62
|
+
|
63
|
+
# Calls block once for each key in container, passing the key and the registered item parameters.
|
64
|
+
#
|
65
|
+
# If no block is given, an enumerator is returned instead.
|
66
|
+
#
|
67
|
+
# @return Key, Value
|
68
|
+
#
|
69
|
+
# @api public
|
70
|
+
# @note In discussions with other developers, it was felt that being able to iterate over not just
|
71
|
+
# the registered keys, but to see what was registered would be very helpful. This is a step
|
72
|
+
# toward doing that.
|
73
|
+
def each(container, &block)
|
74
|
+
container.map { |key, value| [key, value.call] }.each(&block)
|
75
|
+
end
|
62
76
|
end
|
63
77
|
end
|
64
78
|
end
|
@@ -15,5 +15,18 @@ RSpec.describe Dry::Container::Mixin do
|
|
15
15
|
let(:container) { klass.new }
|
16
16
|
|
17
17
|
it_behaves_like 'a container'
|
18
|
+
|
19
|
+
context 'into a class with a custom .initialize method' do
|
20
|
+
let(:klass) do
|
21
|
+
Class.new do
|
22
|
+
include Dry::Container::Mixin
|
23
|
+
def initialize; end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'does not fail on missing member variable' do
|
28
|
+
expect { container.register :key, ->{} }.to_not raise_error
|
29
|
+
end
|
30
|
+
end
|
18
31
|
end
|
19
32
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,87 @@
|
|
1
|
-
|
1
|
+
if ENV['COVERAGE'] == 'true' && RUBY_ENGINE == 'ruby' && RUBY_VERSION == '2.3.1'
|
2
|
+
require 'simplecov'
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
4
|
+
SimpleCov.start do
|
5
|
+
add_filter '/spec/'
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
10
|
+
RSpec.configure do |config|
|
11
|
+
config.expect_with :rspec do |expectations|
|
12
|
+
# This option will default to `true` in RSpec 4. It makes the `description`
|
13
|
+
# and `failure_message` of custom matchers include text for helper methods
|
14
|
+
# defined using `chain`, e.g.:
|
15
|
+
# be_bigger_than(2).and_smaller_than(4).description
|
16
|
+
# # => "be bigger than 2 and smaller than 4"
|
17
|
+
# ...rather than:
|
18
|
+
# # => "be bigger than 2"
|
19
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
20
|
+
end
|
21
|
+
|
22
|
+
config.mock_with :rspec do |mocks|
|
23
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
24
|
+
# a real object. This is generally recommended, and will default to
|
25
|
+
# `true` in RSpec 4.
|
26
|
+
mocks.verify_partial_doubles = true
|
27
|
+
end
|
28
|
+
|
29
|
+
# This option will default to `:apply_to_host_groups` in RSpec 4 (and will
|
30
|
+
# have no way to turn it off -- the option exists only for backwards
|
31
|
+
# compatibility in RSpec 3). It causes shared context metadata to be
|
32
|
+
# inherited by the metadata hash of host groups and examples, rather than
|
33
|
+
# triggering implicit auto-inclusion in groups with matching metadata.
|
34
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
35
|
+
|
36
|
+
# This allows you to limit a spec run to individual examples or groups
|
37
|
+
# you care about by tagging them with `:focus` metadata. When nothing
|
38
|
+
# is tagged with `:focus`, all examples get run. RSpec also provides
|
39
|
+
# aliases for `it`, `describe`, and `context` that include `:focus`
|
40
|
+
# metadata: `fit`, `fdescribe` and `fcontext`, respectively.
|
41
|
+
config.filter_run_when_matching :focus
|
42
|
+
|
43
|
+
# Allows RSpec to persist some state between runs in order to support
|
44
|
+
# the `--only-failures` and `--next-failure` CLI options. We recommend
|
45
|
+
# you configure your source control system to ignore this file.
|
46
|
+
config.example_status_persistence_file_path = "spec/examples.txt"
|
47
|
+
|
48
|
+
# Limits the available syntax to the non-monkey patched syntax that is
|
49
|
+
# recommended. For more details, see:
|
50
|
+
# - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
|
51
|
+
# - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
52
|
+
# - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
|
53
|
+
config.disable_monkey_patching!
|
54
|
+
|
55
|
+
# This setting enables warnings. It's recommended, but in some cases may
|
56
|
+
# be too noisy due to issues in dependencies.
|
57
|
+
config.warnings = true
|
58
|
+
|
59
|
+
# Many RSpec users commonly either run the entire suite or an individual
|
60
|
+
# file, and it's useful to allow more verbose output when running an
|
61
|
+
# individual spec file.
|
62
|
+
if config.files_to_run.one?
|
63
|
+
# Use the documentation formatter for detailed output,
|
64
|
+
# unless a formatter has already been configured
|
65
|
+
# (e.g. via a command-line flag).
|
66
|
+
config.default_formatter = 'doc'
|
67
|
+
end
|
68
|
+
|
69
|
+
# Print the n slowest examples and example groups at the
|
70
|
+
# end of the spec run, to help surface which specs are running
|
71
|
+
# particularly slow.
|
72
|
+
config.profile_examples = 3
|
73
|
+
|
74
|
+
# Run specs in random order to surface order dependencies. If you find an
|
75
|
+
# order dependency and want to debug it, you can fix the order by providing
|
76
|
+
# the seed, which is printed after each run.
|
77
|
+
# --seed 1234
|
78
|
+
config.order = :random
|
79
|
+
|
80
|
+
# Seed global randomization in this process using the `--seed` CLI option.
|
81
|
+
# Setting this allows you to use `--seed` to deterministically reproduce
|
82
|
+
# test failures related to randomization by passing the same `--seed` value
|
83
|
+
# as the one that triggered the failure.
|
84
|
+
Kernel.srand config.seed
|
6
85
|
end
|
7
86
|
|
8
87
|
require 'dry/container'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
shared_examples 'a container' do
|
1
|
+
RSpec.shared_examples 'a container' do
|
2
2
|
describe 'configuration' do
|
3
3
|
describe 'registry' do
|
4
4
|
describe 'default' do
|
@@ -359,6 +359,30 @@ shared_examples 'a container' do
|
|
359
359
|
end
|
360
360
|
end
|
361
361
|
|
362
|
+
describe '#each' do
|
363
|
+
let(:keys) { [:key_1, :key_2] }
|
364
|
+
let(:expected_key_value_pairs) { [['key_1', 'value_for_key_1'], ['key_2', 'value_for_key_2']] }
|
365
|
+
let!(:yielded_key_value_pairs) { [] }
|
366
|
+
|
367
|
+
before do
|
368
|
+
keys.each do |key|
|
369
|
+
container.register(key) { "value_for_#{key}" }
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
subject! do
|
374
|
+
container.each { |key, value| yielded_key_value_pairs << [key, value] }
|
375
|
+
end
|
376
|
+
|
377
|
+
it 'yields stringified versions of all registered keys to the block' do
|
378
|
+
expect(yielded_key_value_pairs).to match_array(expected_key_value_pairs)
|
379
|
+
end
|
380
|
+
|
381
|
+
it 'returns the container' do
|
382
|
+
is_expected.to eq(expected_key_value_pairs)
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
362
386
|
describe 'namespace' do
|
363
387
|
context 'when block does not take arguments' do
|
364
388
|
before do
|
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.6.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-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|