dry-auto_inject 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5c8a5ebc379dd91da33ab5b74b37b8b5233ce496
4
- data.tar.gz: 530f763d2a088affcfba27591b4b414b0005b1e5
3
+ metadata.gz: e19494845c22047aae417893bf936a829356f39d
4
+ data.tar.gz: 7bc7e22907061ae09efbad0003a161b00c9b6210
5
5
  SHA512:
6
- metadata.gz: fb55775c7a465d2f796e56421c6098abef986ea5c177b18851e4ba2cce6111bbdf8dad8fd873d52072e674901e7fcaeac23a304cae5cd6198e0581f7c5d32c6a
7
- data.tar.gz: 0c9c3d0012f2978420fa74fd536eed7c77cdf0d579d85a28afb05d79399f02d31e770b31718679babe16befc8c1a3de22df0635bda5ef495f2475b12c69e0378
6
+ metadata.gz: eee0b597419ae7d17edcbfa400f21af26bd8f2c736e055ab121596cc8b59845f0d77bb02f7a542f7df4251a28535e57fb870f87bcfafffba5ff72537b03c66e4
7
+ data.tar.gz: f50518d06a4fd563824f09523513dc4b19f5fe63900941ce6ac42aff72551054df6bf0daee2556ea3bd3985a4ee863c6891ea7be88d5b4e588732afd0a7f6873
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
- --format documentation
2
1
  --color
3
- -r ./spec/spec_helper.rb
2
+ --require spec_helper
data/.travis.yml CHANGED
@@ -5,9 +5,9 @@ bundler_args: --without console
5
5
  script:
6
6
  - bundle exec rake spec
7
7
  rvm:
8
- - 2.0
9
8
  - 2.1
10
9
  - 2.2
10
+ - 2.3.1
11
11
  - rbx
12
12
  - ruby-head
13
13
  - jruby-head
@@ -19,6 +19,9 @@ matrix:
19
19
  - rvm: rbx
20
20
  - rvm: ruby-head
21
21
  - rvm: jruby-head
22
+ addons:
23
+ code_climate:
24
+ repo_token: 029b5aa100b82b6710e285597b7eabe760357b5dd1f626514371356055378d8c
22
25
  notifications:
23
26
  email: false
24
27
  webhooks:
data/CHANGELOG.md CHANGED
@@ -1,4 +1,35 @@
1
- # v.0.3.0, 2016-06-02
1
+ # 0.4.0 / 2016-07-26
2
+
3
+ ### Added
4
+
5
+ - Support for strategy chaining, which is helpful in opting for alternatives to an application's normal strategy (timriley in [#25](https://github.com/dry-rb/dry-auto_inject/pull/25))
6
+
7
+ ```ruby
8
+ # Define the application's injector with a non-default
9
+ MyInject = Dry::AutoInject(MyContainer).hash
10
+
11
+ # Opt for a different strategy in a particular class
12
+ class MyClass
13
+ include MyInject.args["foo"]
14
+ end
15
+
16
+ # You can chain as long as you want (silly example to demonstrate the flexibility)
17
+ class OtherClass
18
+ include MyInject.args.hash.kwargs.args["foo"]
19
+ end
20
+ ```
21
+
22
+ ### Changed
23
+
24
+ - Use a `BasicObject`-based environment for the injector builder API instead of the previous `define_singleton_method`-based approach, which had negative performance characteristics (timriley in [#26](https://github.com/dry-rb/dry-auto_inject/pull/26))
25
+
26
+ ### Fixed
27
+
28
+ - Fixed issue with kwargs injectors used at multiple points in a class inheritance heirarchy (flash-gordon in [#27](https://github.com/dry-rb/dry-auto_inject/pull/27))
29
+
30
+ [Compare v0.3.0...v0.4.0](https://github.com/dryrb/dry-auto_inject/compare/v0.3.0...v0.4.0)
31
+
32
+ # 0.3.0, 2016-06-02
2
33
 
3
34
  ### Added
4
35
 
@@ -7,7 +38,7 @@
7
38
  These strategies can be accessed via methods on the main builder object:
8
39
 
9
40
  ```ruby
10
- MyInject = Dry::AutoInect(my_container)
41
+ MyInject = Dry::AutoInject(my_container)
11
42
 
12
43
  class MyClass
13
44
  include MyInject.hash["my_dep"]
@@ -59,7 +90,7 @@
59
90
  These aliases enable you to specify your own name for dependencies, both for their local readers and their keys in the kwargs- and hash-based initializers. Specify aliases by passing a hash of names:
60
91
 
61
92
  ```ruby
62
- MyInject = Dry::AutoInect(my_container)
93
+ MyInject = Dry::AutoInject(my_container)
63
94
 
64
95
  class MyClass
65
96
  include MyInject[my_dep: "some_other.dep"]
@@ -84,6 +115,8 @@
84
115
  * `kwargs` is the new default injection strategy
85
116
  * Rubinius support is not available for the `kwargs` strategy (see [#18](https://github.com/dry-rb/dry-auto_inject/issues/18))
86
117
 
118
+ [Compare v0.2.0...v0.3.0](https://github.com/dryrb/dry-auto_inject/compare/v0.2.0...v0.3.0)
119
+
87
120
  # v0.2.0 2016-02-09
88
121
 
89
122
  ### Added
data/Gemfile CHANGED
@@ -3,6 +3,10 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in dry-container.gemspec
4
4
  gemspec
5
5
 
6
+ group :test do
7
+ gem "codeclimate-test-reporter", require: nil
8
+ end
9
+
6
10
  group :tools do
7
11
  gem 'byebug', platforms: :mri
8
12
  gem 'pry'
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2015-2016 Piotr Solnica
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -8,6 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Dry::AutoInject::VERSION.dup
9
9
  spec.authors = ['Piotr Solnica']
10
10
  spec.email = ['piotr.solnica@gmail.com']
11
+ spec.license = 'MIT'
11
12
 
12
13
  spec.summary = 'Container-agnostic automatic constructor injection'
13
14
  spec.homepage = 'https://github.com/dryrb/dry-auto_inject'
@@ -17,7 +18,7 @@ Gem::Specification.new do |spec|
17
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
19
  spec.require_paths = ['lib']
19
20
 
20
- spec.required_ruby_version = '>= 2.0.0'
21
+ spec.required_ruby_version = '>= 2.1.0'
21
22
 
22
23
  spec.add_runtime_dependency 'dry-container', '~> 0.3.4'
23
24
 
@@ -3,7 +3,7 @@ require 'dry/auto_inject/injector'
3
3
 
4
4
  module Dry
5
5
  module AutoInject
6
- class Builder
6
+ class Builder < BasicObject
7
7
  # @api private
8
8
  attr_reader :container
9
9
 
@@ -13,19 +13,26 @@ module Dry
13
13
  def initialize(container, options = {})
14
14
  @container = container
15
15
  @strategies = options.fetch(:strategies) { Strategies }
16
-
17
- strategies.keys.each do |strategy_name|
18
- define_singleton_method(strategy_name) do
19
- strategy = strategies[strategy_name]
20
- Injector.new(container, strategy)
21
- end
22
- end
23
16
  end
24
17
 
25
18
  # @api public
26
19
  def [](*dependency_names)
27
20
  default[*dependency_names]
28
21
  end
22
+
23
+ def respond_to?(name, include_private = false)
24
+ Builder.public_instance_methods.include?(name) || strategies.key?(name)
25
+ end
26
+
27
+ private
28
+
29
+ def method_missing(name, *args, &block)
30
+ if strategies.key?(name)
31
+ Injector.new(container, strategies[name], builder: self)
32
+ else
33
+ super
34
+ end
35
+ end
29
36
  end
30
37
  end
31
38
  end
@@ -2,7 +2,7 @@ require 'dry/auto_inject/strategies'
2
2
 
3
3
  module Dry
4
4
  module AutoInject
5
- class Injector
5
+ class Injector < BasicObject
6
6
  # @api private
7
7
  attr_reader :container
8
8
 
@@ -10,14 +10,28 @@ module Dry
10
10
  attr_reader :strategy
11
11
 
12
12
  # @api private
13
- def initialize(container, strategy)
13
+ attr_reader :builder
14
+
15
+ # @api private
16
+ def initialize(container, strategy, builder:)
14
17
  @container = container
15
18
  @strategy = strategy
19
+ @builder = builder
16
20
  end
17
21
 
18
22
  def [](*dependency_names)
19
23
  strategy.new(container, *dependency_names)
20
24
  end
25
+
26
+ def respond_to?(name, include_private = false)
27
+ Injector.instance_methods.include?(name) || builder.respond_to?(name)
28
+ end
29
+
30
+ private
31
+
32
+ def method_missing(name, *args, &block)
33
+ builder.__send__(name)
34
+ end
21
35
  end
22
36
  end
23
37
  end
@@ -49,7 +49,11 @@ module Dry
49
49
 
50
50
  # Pass through any non-dependency args if the super method accepts `**args`
51
51
  if super_method.parameters.any? { |type, _| type == :keyrest }
52
- super_params += ', **args'
52
+ if super_params.empty?
53
+ super_params = '**args'
54
+ else
55
+ super_params += ', **args'
56
+ end
53
57
  end
54
58
 
55
59
  instance_mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module AutoInject
3
- VERSION = '0.3.0'.freeze
3
+ VERSION = '0.4.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-auto_inject
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-01 00:00:00.000000000 Z
11
+ date: 2016-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-container
@@ -80,6 +80,7 @@ files:
80
80
  - ".travis.yml"
81
81
  - CHANGELOG.md
82
82
  - Gemfile
83
+ - LICENSE
83
84
  - README.md
84
85
  - Rakefile
85
86
  - bin/console
@@ -98,7 +99,8 @@ files:
98
99
  - lib/dry/auto_inject/version.rb
99
100
  - rakelib/rubocop.rake
100
101
  homepage: https://github.com/dryrb/dry-auto_inject
101
- licenses: []
102
+ licenses:
103
+ - MIT
102
104
  metadata: {}
103
105
  post_install_message:
104
106
  rdoc_options: []
@@ -108,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
110
  requirements:
109
111
  - - ">="
110
112
  - !ruby/object:Gem::Version
111
- version: 2.0.0
113
+ version: 2.1.0
112
114
  required_rubygems_version: !ruby/object:Gem::Requirement
113
115
  requirements:
114
116
  - - ">="