dry-auto_inject 0.7.0 → 0.9.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 +78 -27
- data/LICENSE +1 -1
- data/README.md +15 -43
- data/dry-auto_inject.gemspec +25 -17
- data/lib/dry/auto_inject/builder.rb +8 -5
- data/lib/dry/auto_inject/dependency_map.rb +7 -2
- data/lib/dry/auto_inject/injector.rb +6 -4
- data/lib/dry/auto_inject/method_parameters.rb +19 -39
- data/lib/dry/auto_inject/strategies/args.rb +22 -15
- data/lib/dry/auto_inject/strategies/constructor.rb +5 -3
- data/lib/dry/auto_inject/strategies/hash.rb +17 -7
- data/lib/dry/auto_inject/strategies/kwargs.rb +13 -12
- data/lib/dry/auto_inject/strategies.rb +4 -4
- data/lib/dry/auto_inject/version.rb +1 -1
- data/lib/dry/auto_inject.rb +1 -1
- data/lib/dry-auto_inject.rb +1 -1
- metadata +16 -34
- data/.codeclimate.yml +0 -12
- data/.github/ISSUE_TEMPLATE/----please-don-t-ask-for-support-via-issues.md +0 -10
- data/.github/ISSUE_TEMPLATE/---bug-report.md +0 -30
- data/.github/ISSUE_TEMPLATE/---feature-request.md +0 -18
- data/.github/workflows/ci.yml +0 -76
- data/.github/workflows/docsite.yml +0 -34
- data/.github/workflows/sync_configs.yml +0 -34
- data/.gitignore +0 -10
- data/.rspec +0 -4
- data/.rubocop.yml +0 -95
- data/.rubocop_todo.yml +0 -6
- data/CODE_OF_CONDUCT.md +0 -13
- data/CONTRIBUTING.md +0 -29
- data/Gemfile +0 -17
- data/Rakefile +0 -14
- data/bin/console +0 -11
- data/bin/setup +0 -7
- data/docsite/source/basic-usage.html.md +0 -104
- data/docsite/source/how-does-it-work.html.md +0 -45
- data/docsite/source/index.html.md +0 -53
- data/docsite/source/injection-strategies.html.md +0 -94
- data/rakelib/rubocop.rake +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbf423b57383e30d33060a0d0566ca2c9d9c451289f38132974325e5d7cdc2b8
|
4
|
+
data.tar.gz: a35a4d23402b9b5a1b47de1c953c0e089e646334c1ffffcaa4c320539d8eeecd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 561d57d6c0aae98c94a6c6121dcd47601178fe37ce3c6077d87f28b85f4da7113112a66efba4c091f50dcbc1983212d2212abacf175845a212064cdbe340a389
|
7
|
+
data.tar.gz: 942e8def2974a6d131180ab66e1895ff2104ba960372513edea233598bb65ca52c612f359fcd33a43f698593aad288aa9012b75e29072c8d35e0a3af0bde87ae
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,36 @@
|
|
1
|
-
|
1
|
+
<!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
|
2
|
+
|
3
|
+
## 0.9.0 2022-01-26
|
4
|
+
|
5
|
+
|
6
|
+
### Changed
|
7
|
+
|
8
|
+
- [BREAKING] Support for ... was changed, now constructors with such signature are not considered
|
9
|
+
as pass-through because they can forward arguments to another method (flash-gordon in [#78](https://github.com/dry-rb/dry-auto_inject/pull/78))
|
10
|
+
|
11
|
+
- [BREAKING] Support for 2.6 was dropped
|
12
|
+
|
13
|
+
[Compare v0.8.0...v0.9.0](https://github.com/dry-rb/dry-auto_inject/compare/v0.8.0...v0.9.0)
|
14
|
+
|
15
|
+
## 0.8.0 2021-06-06
|
16
|
+
|
17
|
+
|
18
|
+
### Added
|
19
|
+
|
20
|
+
- Support For `...` passthrough-args (@ytaben)
|
21
|
+
|
22
|
+
### Fixed
|
23
|
+
|
24
|
+
- Constructors with kwargs strategy properly forward blocks to super (mintyfresh in [#68](https://github.com/dry-rb/dry-auto_inject/pull/68))
|
25
|
+
|
26
|
+
### Changed
|
27
|
+
|
28
|
+
- [BREAKING] Support for 2.4 and 2.5 was dropped
|
29
|
+
|
30
|
+
[Compare v0.7.0...v0.8.0](https://github.com/dry-rb/dry-auto_inject/compare/v0.7.0...v0.8.0)
|
31
|
+
|
32
|
+
## 0.7.0 2019-12-28
|
33
|
+
|
2
34
|
|
3
35
|
### Fixed
|
4
36
|
|
@@ -10,19 +42,18 @@
|
|
10
42
|
|
11
43
|
[Compare v0.6.1...v0.7.0](https://github.com/dry-rb/dry-auto_inject/compare/v0.6.1...v0.7.0)
|
12
44
|
|
13
|
-
|
45
|
+
## 0.6.1 2019-04-16
|
46
|
+
|
14
47
|
|
15
48
|
### Fixed
|
16
49
|
|
17
50
|
- Allow explicit injection of falsey values (timriley in [#58](https://github.com/dry-rb/dry-auto_inject/pull/58))
|
18
51
|
|
19
|
-
[Compare v0.6.0...v0.6.1](https://github.com/dry-rb/dry-auto_inject/compare/v0.6.0...v0.6.1)
|
20
52
|
|
21
|
-
|
53
|
+
[Compare v0.6.0...v0.6.1](https://github.com/dry-rb/dry-auto_inject/compare/v0.6.0...v0.6.1)
|
22
54
|
|
23
|
-
|
55
|
+
## 0.6.0 2018-11-29
|
24
56
|
|
25
|
-
- [BREAKING] 0.6.0 supports Ruby 2.3 and above. If you're on 2.3 keep in mind its EOL is scheduled at the end of March, 2019
|
26
57
|
|
27
58
|
### Added
|
28
59
|
|
@@ -32,9 +63,14 @@
|
|
32
63
|
|
33
64
|
- A couple of regressions were fixed along the way, see [#46](https://github.com/dry-rb/dry-auto_inject/issues/46) and [#49](https://github.com/dry-rb/dry-auto_inject/issues/49) (flash-gordon + timriley in [#48](https://github.com/dry-rb/dry-auto_inject/pull/48))
|
34
65
|
|
66
|
+
### Changed
|
67
|
+
|
68
|
+
- [BREAKING] 0.6.0 supports Ruby 2.3 and above. If you're on 2.3 keep in mind its EOL is scheduled at the end of March, 2019
|
69
|
+
|
35
70
|
[Compare v0.5.0...v0.6.0](https://github.com/dry-rb/dry-auto_inject/compare/v0.5.0...v0.6.0)
|
36
71
|
|
37
|
-
|
72
|
+
## 0.5.0 2018-11-09
|
73
|
+
|
38
74
|
|
39
75
|
### Changed
|
40
76
|
|
@@ -72,7 +108,8 @@
|
|
72
108
|
|
73
109
|
[Compare v0.4.6...v0.5.0](https://github.com/dry-rb/dry-auto_inject/compare/v0.4.6...v0.5.0)
|
74
110
|
|
75
|
-
|
111
|
+
## 0.4.6 2018-03-27
|
112
|
+
|
76
113
|
|
77
114
|
### Changed
|
78
115
|
|
@@ -80,37 +117,48 @@
|
|
80
117
|
|
81
118
|
[Compare v0.4.5...v0.4.6](https://github.com/dry-rb/dry-auto_inject/compare/v0.4.5...v0.4.6)
|
82
119
|
|
83
|
-
|
120
|
+
## 0.4.5 2018-01-02
|
121
|
+
|
84
122
|
|
85
123
|
### Added
|
86
124
|
|
87
125
|
- Improved handling of kwargs being passed to #initialize’s super method (timriley)
|
88
126
|
|
127
|
+
|
89
128
|
[Compare v0.4.4...v0.4.5](https://github.com/dry-rb/dry-auto_inject/compare/v0.4.4...v0.4.5)
|
90
129
|
|
91
|
-
|
130
|
+
## 0.4.4 2017-09-14
|
131
|
+
|
92
132
|
|
93
133
|
### Added
|
94
134
|
|
95
135
|
- Determine name for dependencies by splitting identifiers on any invalid local variable name characters (e.g. "/", "?", "!"), instead of splitting on dots only (raventid in [#39](https://github.com/dry-rb/dry-auto_inject/pull/39))
|
96
136
|
|
97
|
-
|
137
|
+
|
138
|
+
[Compare v0.4.3...v0.4.4](https://github.com/dry-rb/dry-auto_inject/compare/v0.4.3...v0.4.4)
|
139
|
+
|
140
|
+
## 0.4.3 2017-05-27
|
141
|
+
|
98
142
|
|
99
143
|
### Added
|
100
144
|
|
101
145
|
- Push sequential arguments along with keywords in the kwargs strategy (hbda + vladra in [#32](https://github.com/dry-rb/dry-auto_inject/pull/32))
|
102
146
|
|
147
|
+
|
103
148
|
[Compare v0.4.2...v0.4.3](https://github.com/dry-rb/dry-auto_inject/compare/v0.4.2...v0.4.3)
|
104
149
|
|
105
|
-
|
150
|
+
## 0.4.2 2016-10-10
|
151
|
+
|
106
152
|
|
107
153
|
### Fixed
|
108
154
|
|
109
155
|
- Fixed issue where injectors for different containers could not be used on different classes in an inheritance hierarchy (timriley in [#31](https://github.com/dry-rb/dry-auto_inject/pull/31))
|
110
156
|
|
157
|
+
|
111
158
|
[Compare v0.4.1...v0.4.2](https://github.com/dry-rb/dry-auto_inject/compare/v0.4.1...v0.4.2)
|
112
159
|
|
113
|
-
|
160
|
+
## 0.4.1 2016-08-14
|
161
|
+
|
114
162
|
|
115
163
|
### Changed
|
116
164
|
|
@@ -118,7 +166,8 @@
|
|
118
166
|
|
119
167
|
[Compare v0.4.0...v0.4.1](https://github.com/dry-rb/dry-auto_inject/compare/v0.4.0...v0.4.1)
|
120
168
|
|
121
|
-
|
169
|
+
## 0.4.0 2016-07-26
|
170
|
+
|
122
171
|
|
123
172
|
### Added
|
124
173
|
|
@@ -139,17 +188,18 @@
|
|
139
188
|
end
|
140
189
|
```
|
141
190
|
|
191
|
+
### Fixed
|
192
|
+
|
193
|
+
- 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))
|
194
|
+
|
142
195
|
### Changed
|
143
196
|
|
144
197
|
- 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))
|
145
198
|
|
146
|
-
|
147
|
-
|
148
|
-
- 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))
|
199
|
+
[Compare v0.3.0,...v0.4.0](https://github.com/dry-rb/dry-auto_inject/compare/v0.3.0,...v0.4.0)
|
149
200
|
|
150
|
-
|
201
|
+
## 0.3.0, 2016-06-02
|
151
202
|
|
152
|
-
# 0.3.0, 2016-06-02
|
153
203
|
|
154
204
|
### Added
|
155
205
|
|
@@ -164,7 +214,6 @@
|
|
164
214
|
include MyInject.hash["my_dep"]
|
165
215
|
end
|
166
216
|
```
|
167
|
-
|
168
217
|
- Support for user-provided injection strategies
|
169
218
|
|
170
219
|
All injection strategies are now held in their own `Dry::AutoInject::Strategies` container. You can add register your own strategies to this container, or choose to provide a strategies container of your own:
|
@@ -206,7 +255,6 @@
|
|
206
255
|
include MyInject.custom["my_dep"]
|
207
256
|
end
|
208
257
|
```
|
209
|
-
|
210
258
|
- User-specified aliases for dependencies
|
211
259
|
|
212
260
|
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:
|
@@ -229,7 +277,6 @@
|
|
229
277
|
```ruby
|
230
278
|
include MyInject["some_dep", another_dep: "some_other.dep"]
|
231
279
|
```
|
232
|
-
|
233
280
|
- Inspect the `super` method of the including class’s `#initialize` and send it arguments that will match its own arguments list/arity. This allows auto_inject to be used more easily in existing class inheritance heirarchies.
|
234
281
|
|
235
282
|
### Changed
|
@@ -237,21 +284,25 @@
|
|
237
284
|
- `kwargs` is the new default injection strategy
|
238
285
|
- Rubinius support is not available for the `kwargs` strategy (see [#18](https://github.com/dry-rb/dry-auto_inject/issues/18))
|
239
286
|
|
240
|
-
[Compare v0.2.0...v0.3.0](https://github.com/dry-rb/dry-auto_inject/compare/v0.2.0...v0.3.0)
|
287
|
+
[Compare v0.2.0...v0.3.0,](https://github.com/dry-rb/dry-auto_inject/compare/v0.2.0...v0.3.0,)
|
288
|
+
|
289
|
+
## 0.2.0 2016-02-09
|
241
290
|
|
242
|
-
# v0.2.0 2016-02-09
|
243
291
|
|
244
292
|
### Added
|
245
293
|
|
246
294
|
- Support for hashes as constructor arguments via `Import.hash` interface (solnic)
|
247
295
|
|
296
|
+
|
248
297
|
[Compare v0.1.0...v0.2.0](https://github.com/dry-rb/dry-auto_inject/compare/v0.1.0...v0.2.0)
|
249
298
|
|
250
|
-
|
299
|
+
## 0.1.0 2015-11-12
|
251
300
|
|
252
301
|
Changed interface from `Dry::AutoInject.new { container(some_container) }` to
|
253
|
-
`Dry::AutoInject(some_container)`.
|
254
302
|
|
255
|
-
|
303
|
+
|
304
|
+
[Compare v0.0.1...v0.1.0](https://github.com/dry-rb/dry-auto_inject/compare/v0.0.1...v0.1.0)
|
305
|
+
|
306
|
+
## 0.0.1 2015-08-20
|
256
307
|
|
257
308
|
First public release \o/
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,58 +1,30 @@
|
|
1
|
+
<!--- this file is synced from dry-rb/template-gem project -->
|
1
2
|
[gem]: https://rubygems.org/gems/dry-auto_inject
|
2
|
-
[
|
3
|
-
[
|
4
|
-
[coveralls]: https://coveralls.io/r/dry-rb/dry-auto_inject
|
5
|
-
[inchpages]: http://inch-ci.org/github/dry-rb/dry-auto_inject
|
3
|
+
[actions]: https://github.com/dry-rb/dry-auto_inject/actions
|
4
|
+
[codacy]: https://www.codacy.com/gh/dry-rb/dry-auto_inject
|
6
5
|
[chat]: https://dry-rb.zulipchat.com
|
6
|
+
[inchpages]: http://inch-ci.org/github/dry-rb/dry-auto_inject
|
7
7
|
|
8
8
|
# dry-auto_inject [][chat]
|
9
9
|
|
10
10
|
[][gem]
|
11
|
-
[][actions]
|
12
|
+
[][codacy]
|
13
|
+
[][codacy]
|
14
14
|
[][inchpages]
|
15
|
-

|
16
|
-
|
17
|
-
A simple extension which allows you to automatically inject dependencies to your
|
18
|
-
object constructors from a configured container.
|
19
|
-
|
20
|
-
It does 3 things:
|
21
|
-
|
22
|
-
- Defines a constructor which accepts dependencies
|
23
|
-
- Defines attribute readers for dependencies
|
24
|
-
- Injects dependencies automatically to the constructor with overridden `.new`
|
25
|
-
|
26
|
-
## Installation
|
27
|
-
|
28
|
-
Add this line to your application's Gemfile:
|
29
|
-
|
30
|
-
```ruby
|
31
|
-
gem 'dry-auto_inject'
|
32
|
-
```
|
33
|
-
|
34
|
-
And then execute:
|
35
|
-
|
36
|
-
```sh
|
37
|
-
$ bundle
|
38
|
-
```
|
39
|
-
|
40
|
-
Or install it yourself as:
|
41
|
-
|
42
|
-
```sh
|
43
|
-
$ gem install dry-auto_inject
|
44
|
-
```
|
45
15
|
|
46
16
|
## Links
|
47
17
|
|
48
|
-
|
18
|
+
* [User documentation](https://dry-rb.org/gems/dry-auto_inject)
|
19
|
+
* [API documentation](http://rubydoc.info/gems/dry-auto_inject)
|
49
20
|
|
50
|
-
##
|
21
|
+
## Supported Ruby versions
|
51
22
|
|
52
|
-
|
23
|
+
This library officially supports the following Ruby versions:
|
53
24
|
|
54
|
-
|
25
|
+
* MRI `>= 2.7.0`
|
26
|
+
* jruby `>= 9.3` (postponed until 2.7 is supported)
|
55
27
|
|
56
|
-
##
|
28
|
+
## License
|
57
29
|
|
58
|
-
|
30
|
+
See `LICENSE` file.
|
data/dry-auto_inject.gemspec
CHANGED
@@ -1,29 +1,37 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
# this file is synced from dry-rb/template-gem project
|
4
|
+
|
5
|
+
lib = File.expand_path("lib", __dir__)
|
4
6
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
7
|
+
require "dry/auto_inject/version"
|
6
8
|
|
7
9
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name =
|
10
|
+
spec.name = "dry-auto_inject"
|
11
|
+
spec.authors = ["Piotr Solnica"]
|
12
|
+
spec.email = ["piotr.solnica@gmail.com"]
|
13
|
+
spec.license = "MIT"
|
9
14
|
spec.version = Dry::AutoInject::VERSION.dup
|
10
|
-
spec.authors = ['Piotr Solnica']
|
11
|
-
spec.email = ['piotr.solnica@gmail.com']
|
12
|
-
spec.license = 'MIT'
|
13
15
|
|
14
|
-
spec.summary =
|
15
|
-
spec.
|
16
|
+
spec.summary = "Container-agnostic automatic constructor injection"
|
17
|
+
spec.description = spec.summary
|
18
|
+
spec.homepage = "https://dry-rb.org/gems/dry-auto_inject"
|
19
|
+
spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-auto_inject.gemspec", "lib/**/*"]
|
20
|
+
spec.bindir = "bin"
|
21
|
+
spec.executables = []
|
22
|
+
spec.require_paths = ["lib"]
|
16
23
|
|
17
|
-
spec.
|
18
|
-
spec.
|
19
|
-
spec.
|
20
|
-
spec.
|
24
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
25
|
+
spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-auto_inject/blob/master/CHANGELOG.md"
|
26
|
+
spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-auto_inject"
|
27
|
+
spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-auto_inject/issues"
|
21
28
|
|
22
|
-
spec.required_ruby_version =
|
29
|
+
spec.required_ruby_version = ">= 2.7.0"
|
23
30
|
|
24
|
-
|
31
|
+
# to update dependencies edit project.yml
|
32
|
+
spec.add_runtime_dependency "dry-container", ">= 0.3.4"
|
25
33
|
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
34
|
+
spec.add_development_dependency "bundler"
|
35
|
+
spec.add_development_dependency "rake"
|
36
|
+
spec.add_development_dependency "rspec"
|
29
37
|
end
|
@@ -1,17 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "dry/auto_inject/strategies"
|
4
|
+
require "dry/auto_inject/injector"
|
5
5
|
|
6
6
|
module Dry
|
7
7
|
module AutoInject
|
8
|
-
class Builder
|
8
|
+
class Builder
|
9
9
|
# @api private
|
10
10
|
attr_reader :container
|
11
11
|
|
12
12
|
# @api private
|
13
13
|
attr_reader :strategies
|
14
14
|
|
15
|
+
# This clashes with the hash strategy
|
16
|
+
undef hash
|
17
|
+
|
15
18
|
def initialize(container, options = {})
|
16
19
|
@container = container
|
17
20
|
@strategies = options.fetch(:strategies) { Strategies }
|
@@ -22,8 +25,8 @@ module Dry
|
|
22
25
|
default[*dependency_names]
|
23
26
|
end
|
24
27
|
|
25
|
-
def
|
26
|
-
|
28
|
+
def respond_to_missing?(name, _include_private = false)
|
29
|
+
strategies.key?(name)
|
27
30
|
end
|
28
31
|
|
29
32
|
private
|
@@ -5,7 +5,7 @@ module Dry
|
|
5
5
|
DuplicateDependencyError = Class.new(StandardError)
|
6
6
|
DependencyNameInvalid = Class.new(StandardError)
|
7
7
|
|
8
|
-
VALID_NAME = /([a-z_][a-zA-Z_0-9]*)
|
8
|
+
VALID_NAME = /([a-z_][a-zA-Z_0-9]*)$/.freeze
|
9
9
|
|
10
10
|
class DependencyMap
|
11
11
|
def initialize(*dependencies)
|
@@ -41,13 +41,18 @@ module Dry
|
|
41
41
|
|
42
42
|
def name_for(identifier)
|
43
43
|
matched = VALID_NAME.match(identifier.to_s)
|
44
|
-
|
44
|
+
unless matched
|
45
|
+
raise DependencyNameInvalid,
|
46
|
+
"name +#{identifier}+ is not a valid Ruby identifier"
|
47
|
+
end
|
48
|
+
|
45
49
|
matched[0]
|
46
50
|
end
|
47
51
|
|
48
52
|
def add_dependency(name, identifier)
|
49
53
|
name = name.to_sym
|
50
54
|
raise DuplicateDependencyError, "name +#{name}+ is already used" if @map.key?(name)
|
55
|
+
|
51
56
|
@map[name] = identifier
|
52
57
|
end
|
53
58
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/auto_inject/strategies"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module AutoInject
|
@@ -14,6 +14,8 @@ module Dry
|
|
14
14
|
# @api private
|
15
15
|
attr_reader :builder
|
16
16
|
|
17
|
+
define_method(:respond_to?, ::Kernel.instance_method(:respond_to?))
|
18
|
+
|
17
19
|
# @api private
|
18
20
|
def initialize(container, strategy, builder:)
|
19
21
|
@container = container
|
@@ -25,13 +27,13 @@ module Dry
|
|
25
27
|
strategy.new(container, *dependency_names)
|
26
28
|
end
|
27
29
|
|
28
|
-
def
|
29
|
-
|
30
|
+
def respond_to_missing?(name, _include_private = false)
|
31
|
+
builder.respond_to?(name)
|
30
32
|
end
|
31
33
|
|
32
34
|
private
|
33
35
|
|
34
|
-
def method_missing(name, *
|
36
|
+
def method_missing(name, *_args)
|
35
37
|
builder.__send__(name)
|
36
38
|
end
|
37
39
|
end
|
@@ -1,47 +1,25 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "set"
|
2
4
|
|
3
5
|
module Dry
|
4
6
|
module AutoInject
|
5
7
|
# @api private
|
6
8
|
class MethodParameters
|
7
|
-
PASS_THROUGH = [[
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
rescue NameError
|
15
|
-
end
|
16
|
-
|
17
|
-
loop do
|
18
|
-
break if method.nil?
|
19
|
-
|
20
|
-
y << MethodParameters.new(method.parameters)
|
21
|
-
method = method.super_method
|
22
|
-
end
|
9
|
+
PASS_THROUGH = [[%i[rest]], [%i[rest], %i[keyrest]]].freeze
|
10
|
+
|
11
|
+
def self.of(obj, name)
|
12
|
+
Enumerator.new do |y|
|
13
|
+
begin
|
14
|
+
method = obj.instance_method(name)
|
15
|
+
rescue ::NameError # rubocop: disable Lint/SuppressedException
|
23
16
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
loop do
|
32
|
-
klass = ancestors.shift
|
33
|
-
break if klass.nil?
|
34
|
-
|
35
|
-
begin
|
36
|
-
method = klass.instance_method(name)
|
37
|
-
|
38
|
-
next unless method.owner.equal?(klass)
|
39
|
-
rescue NameError
|
40
|
-
next
|
41
|
-
end
|
42
|
-
|
43
|
-
y << MethodParameters.new(method.parameters)
|
44
|
-
end
|
17
|
+
|
18
|
+
loop do
|
19
|
+
break if method.nil?
|
20
|
+
|
21
|
+
y << MethodParameters.new(method.parameters)
|
22
|
+
method = method.super_method
|
45
23
|
end
|
46
24
|
end
|
47
25
|
end
|
@@ -54,11 +32,13 @@ module Dry
|
|
54
32
|
|
55
33
|
def splat?
|
56
34
|
return @splat if defined? @splat
|
35
|
+
|
57
36
|
@splat = parameters.any? { |type, _| type == :rest }
|
58
37
|
end
|
59
38
|
|
60
39
|
def sequential_arguments?
|
61
40
|
return @sequential_arguments if defined? @sequential_arguments
|
41
|
+
|
62
42
|
@sequential_arguments = parameters.any? { |type, _|
|
63
43
|
type == :req || type == :opt
|
64
44
|
}
|
@@ -83,7 +63,7 @@ module Dry
|
|
83
63
|
end
|
84
64
|
|
85
65
|
def pass_through?
|
86
|
-
|
66
|
+
PASS_THROUGH.include?(parameters)
|
87
67
|
end
|
88
68
|
|
89
69
|
EMPTY = new([])
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "dry/auto_inject/strategies/constructor"
|
4
|
+
require "dry/auto_inject/method_parameters"
|
5
5
|
|
6
6
|
module Dry
|
7
7
|
module AutoInject
|
@@ -17,7 +17,7 @@ module Dry
|
|
17
17
|
args[i] || container[identifier]
|
18
18
|
}
|
19
19
|
|
20
|
-
super(*deps, *args[deps.size
|
20
|
+
super(*deps, *args[deps.size..])
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -36,28 +36,35 @@ module Dry
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def define_initialize_with_params
|
39
|
-
initialize_args = dependency_map.names.join(
|
39
|
+
initialize_args = dependency_map.names.join(", ")
|
40
|
+
|
41
|
+
assignment = dependency_map.names.map { "@#{_1} = #{_1}" }.join("\n")
|
40
42
|
|
41
43
|
instance_mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
42
|
-
def initialize(#{initialize_args})
|
43
|
-
#{
|
44
|
-
super()
|
45
|
-
end
|
44
|
+
def initialize(#{initialize_args}) # def initialize(dep)
|
45
|
+
#{assignment} # @dep = dep
|
46
|
+
super() # super()
|
47
|
+
end # end
|
46
48
|
RUBY
|
47
49
|
end
|
48
50
|
|
49
51
|
def define_initialize_with_splat(super_parameters)
|
50
52
|
super_pass = if super_parameters.splat?
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
"*args"
|
54
|
+
else
|
55
|
+
"*args.take(#{super_parameters.length})"
|
56
|
+
end
|
57
|
+
|
58
|
+
assignments = dependency_map.names.map.with_index do |name, idx|
|
59
|
+
"@#{name} = args[#{idx}]"
|
54
60
|
end
|
61
|
+
body = assignments.join("\n")
|
55
62
|
|
56
63
|
instance_mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
57
|
-
def initialize(*args)
|
58
|
-
#{
|
59
|
-
super(#{super_pass})
|
60
|
-
end
|
64
|
+
def initialize(*args) # def initialize(*args)
|
65
|
+
#{body} # @dep = args[0]
|
66
|
+
super(#{super_pass}) # super(*args)
|
67
|
+
end # end
|
61
68
|
RUBY
|
62
69
|
end
|
63
70
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/auto_inject/dependency_map"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module AutoInject
|
@@ -15,6 +15,7 @@ module Dry
|
|
15
15
|
attr_reader :class_mod
|
16
16
|
|
17
17
|
def initialize(container, *dependency_names)
|
18
|
+
super()
|
18
19
|
@container = container
|
19
20
|
@dependency_map = DependencyMap.new(*dependency_names)
|
20
21
|
@instance_mod = InstanceMethods.new
|
@@ -37,8 +38,9 @@ module Dry
|
|
37
38
|
private
|
38
39
|
|
39
40
|
def define_readers
|
41
|
+
readers = dependency_map.names.map { ":#{_1}" }
|
40
42
|
instance_mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
41
|
-
attr_reader #{
|
43
|
+
attr_reader #{readers.join(", ")} # attr_reader :dep1, :dep2
|
42
44
|
RUBY
|
43
45
|
self
|
44
46
|
end
|
@@ -47,7 +49,7 @@ module Dry
|
|
47
49
|
raise NotImplementedError, "must be implemented by a subclass"
|
48
50
|
end
|
49
51
|
|
50
|
-
def define_initialize(
|
52
|
+
def define_initialize(_klass)
|
51
53
|
raise NotImplementedError, "must be implemented by a subclass"
|
52
54
|
end
|
53
55
|
end
|