dry-auto_inject 1.0.1 → 1.1.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 +10 -0
- data/README.md +3 -2
- data/dry-auto_inject.gemspec +10 -12
- data/lib/dry/auto_inject/builder.rb +3 -7
- data/lib/dry/auto_inject/dependency_map.rb +6 -10
- data/lib/dry/auto_inject/injector.rb +4 -10
- data/lib/dry/auto_inject/method_parameters.rb +9 -17
- data/lib/dry/auto_inject/strategies/args.rb +11 -8
- data/lib/dry/auto_inject/strategies/hash.rb +8 -6
- data/lib/dry/auto_inject/strategies.rb +2 -2
- data/lib/dry/auto_inject/version.rb +1 -1
- data/lib/dry/auto_inject.rb +3 -3
- metadata +10 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fe35e3cc69af3c8553b31c5687b46e86a26a51371390ee7f23e31eff74292c1
|
4
|
+
data.tar.gz: 61eaf8236d91026dd0b510ce5e5ca8f5cb68e5b9bd54781d5fcbb981cbd0d663
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e63f1dd733ffd29956d7a0d5d8e38137066ab6f84a625c68bb1d1953931863cac3bf775450ecc3b70e727b8cd5f896ef7569fc3414c711e85b6fb25a5936e11
|
7
|
+
data.tar.gz: 32539bb893f836435848a10a0a12646a7dadf8d0ceaf7c3269d7b2c1d5302f96f82032a192622134a6db487ae3bb5d981077dd515a64050bfb801ca4592bb1c9
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
<!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
|
2
2
|
|
3
|
+
## 1.1.0 2025-01-07
|
4
|
+
|
5
|
+
|
6
|
+
### Fixed
|
7
|
+
|
8
|
+
- Update minimal ruby version to 3.1 (@flash-gordon)
|
9
|
+
|
10
|
+
|
11
|
+
[Compare v1.0.1...v1.1.0](https://github.com/dry-rb/dry-auto_inject/compare/v1.0.1...v1.1.0)
|
12
|
+
|
3
13
|
## 1.0.1 2023-02-13
|
4
14
|
|
5
15
|
|
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
<!--- this file is synced from dry-rb/template-gem project -->
|
2
|
+
|
2
3
|
[gem]: https://rubygems.org/gems/dry-auto_inject
|
3
4
|
[actions]: https://github.com/dry-rb/dry-auto_inject/actions
|
4
5
|
|
5
|
-
# dry-auto_inject [][gem] [][gem] [][actions]
|
6
7
|
|
7
8
|
## Links
|
8
9
|
|
@@ -14,7 +15,7 @@
|
|
14
15
|
|
15
16
|
This library officially supports the following Ruby versions:
|
16
17
|
|
17
|
-
* MRI `>=
|
18
|
+
* MRI `>= 3.1`
|
18
19
|
* jruby `>= 9.4` (not tested on CI)
|
19
20
|
|
20
21
|
## License
|
data/dry-auto_inject.gemspec
CHANGED
@@ -16,23 +16,21 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.summary = "Container-agnostic automatic constructor injection"
|
17
17
|
spec.description = spec.summary
|
18
18
|
spec.homepage = "https://dry-rb.org/gems/dry-auto_inject"
|
19
|
-
spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-auto_inject.gemspec",
|
19
|
+
spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-auto_inject.gemspec",
|
20
|
+
"lib/**/*"]
|
20
21
|
spec.bindir = "bin"
|
21
22
|
spec.executables = []
|
22
23
|
spec.require_paths = ["lib"]
|
23
24
|
|
24
|
-
spec.metadata["allowed_push_host"]
|
25
|
-
spec.metadata["changelog_uri"]
|
26
|
-
spec.metadata["source_code_uri"]
|
27
|
-
spec.metadata["bug_tracker_uri"]
|
25
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
26
|
+
spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-auto_inject/blob/main/CHANGELOG.md"
|
27
|
+
spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-auto_inject"
|
28
|
+
spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-auto_inject/issues"
|
29
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
28
30
|
|
29
|
-
spec.required_ruby_version = ">=
|
31
|
+
spec.required_ruby_version = ">= 3.1"
|
30
32
|
|
31
33
|
# to update dependencies edit project.yml
|
32
|
-
spec.
|
33
|
-
spec.
|
34
|
-
|
35
|
-
spec.add_development_dependency "bundler"
|
36
|
-
spec.add_development_dependency "rake"
|
37
|
-
spec.add_development_dependency "rspec"
|
34
|
+
spec.add_dependency "dry-core", "~> 1.1"
|
35
|
+
spec.add_dependency "zeitwerk", "~> 2.6"
|
38
36
|
end
|
@@ -18,17 +18,13 @@ module Dry
|
|
18
18
|
end
|
19
19
|
|
20
20
|
# @api public
|
21
|
-
def [](*dependency_names)
|
22
|
-
default[*dependency_names]
|
23
|
-
end
|
21
|
+
def [](*dependency_names) = default[*dependency_names]
|
24
22
|
|
25
|
-
def respond_to_missing?(name,
|
26
|
-
strategies.key?(name)
|
27
|
-
end
|
23
|
+
def respond_to_missing?(name, _ = false) = strategies.key?(name)
|
28
24
|
|
29
25
|
private
|
30
26
|
|
31
|
-
def method_missing(name,
|
27
|
+
def method_missing(name, ...)
|
32
28
|
if strategies.key?(name)
|
33
29
|
Injector.new(container, strategies[name], builder: self)
|
34
30
|
else
|
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
module Dry
|
4
4
|
module AutoInject
|
5
|
-
DuplicateDependencyError = Class.new(StandardError)
|
6
|
-
DependencyNameInvalid = Class.new(StandardError)
|
5
|
+
DuplicateDependencyError = ::Class.new(::StandardError)
|
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]*)$/
|
9
9
|
|
10
10
|
class DependencyMap
|
11
11
|
def initialize(*dependencies)
|
12
12
|
@map = {}
|
13
13
|
|
14
14
|
dependencies = dependencies.dup
|
15
|
-
aliases = dependencies.last.is_a?(Hash) ? dependencies.pop : {}
|
15
|
+
aliases = dependencies.last.is_a?(::Hash) ? dependencies.pop : {}
|
16
16
|
|
17
17
|
dependencies.each do |identifier|
|
18
18
|
name = name_for(identifier)
|
@@ -24,17 +24,13 @@ module Dry
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def inspect
|
28
|
-
@map.inspect
|
29
|
-
end
|
27
|
+
def inspect = @map.inspect
|
30
28
|
|
31
29
|
def names
|
32
30
|
@names ||= @map.keys
|
33
31
|
end
|
34
32
|
|
35
|
-
def to_h
|
36
|
-
@map.dup
|
37
|
-
end
|
33
|
+
def to_h = @map.dup
|
38
34
|
alias_method :to_hash, :to_h
|
39
35
|
|
40
36
|
private
|
@@ -4,7 +4,7 @@ require "dry/auto_inject/strategies"
|
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module AutoInject
|
7
|
-
class Injector < BasicObject
|
7
|
+
class Injector < ::BasicObject
|
8
8
|
# @api private
|
9
9
|
attr_reader :container
|
10
10
|
|
@@ -23,19 +23,13 @@ module Dry
|
|
23
23
|
@builder = builder
|
24
24
|
end
|
25
25
|
|
26
|
-
def [](*dependency_names)
|
27
|
-
strategy.new(container, *dependency_names)
|
28
|
-
end
|
26
|
+
def [](*dependency_names) = strategy.new(container, *dependency_names)
|
29
27
|
|
30
|
-
def respond_to_missing?(name,
|
31
|
-
builder.respond_to?(name)
|
32
|
-
end
|
28
|
+
def respond_to_missing?(name, _ = false) = builder.respond_to?(name)
|
33
29
|
|
34
30
|
private
|
35
31
|
|
36
|
-
def method_missing(name,
|
37
|
-
builder.__send__(name)
|
38
|
-
end
|
32
|
+
def method_missing(name, ...) = builder.__send__(name)
|
39
33
|
end
|
40
34
|
end
|
41
35
|
end
|
@@ -14,7 +14,7 @@ module Dry
|
|
14
14
|
].freeze
|
15
15
|
|
16
16
|
def self.of(obj, name)
|
17
|
-
Enumerator.new do |y|
|
17
|
+
::Enumerator.new do |y|
|
18
18
|
begin
|
19
19
|
method = obj.instance_method(name)
|
20
20
|
rescue ::NameError # rubocop: disable Lint/SuppressedException
|
@@ -44,32 +44,24 @@ module Dry
|
|
44
44
|
def sequential_arguments?
|
45
45
|
return @sequential_arguments if defined? @sequential_arguments
|
46
46
|
|
47
|
-
@sequential_arguments = parameters.any?
|
47
|
+
@sequential_arguments = parameters.any? do |type, _|
|
48
48
|
type == :req || type == :opt
|
49
|
-
|
49
|
+
end
|
50
50
|
end
|
51
51
|
|
52
52
|
def keyword_names
|
53
|
-
@keyword_names ||= parameters.each_with_object(Set.new)
|
53
|
+
@keyword_names ||= parameters.each_with_object(::Set.new) do |(type, name), names|
|
54
54
|
names << name if type == :key || type == :keyreq
|
55
|
-
|
55
|
+
end
|
56
56
|
end
|
57
57
|
|
58
|
-
def keyword?(name)
|
59
|
-
keyword_names.include?(name)
|
60
|
-
end
|
58
|
+
def keyword?(name) = keyword_names.include?(name)
|
61
59
|
|
62
|
-
def empty?
|
63
|
-
parameters.empty?
|
64
|
-
end
|
60
|
+
def empty? = parameters.empty?
|
65
61
|
|
66
|
-
def length
|
67
|
-
parameters.length
|
68
|
-
end
|
62
|
+
def length = parameters.length
|
69
63
|
|
70
|
-
def pass_through?
|
71
|
-
PASS_THROUGH.include?(parameters)
|
72
|
-
end
|
64
|
+
def pass_through? = PASS_THROUGH.include?(parameters)
|
73
65
|
|
74
66
|
EMPTY = new([])
|
75
67
|
end
|
@@ -9,12 +9,14 @@ module Dry
|
|
9
9
|
|
10
10
|
def define_new
|
11
11
|
class_mod.class_exec(container, dependency_map) do |container, dependency_map|
|
12
|
+
deps_with_indices = dependency_map.to_h.values.map.with_index
|
13
|
+
|
12
14
|
define_method :new do |*args|
|
13
|
-
deps =
|
15
|
+
deps = deps_with_indices.map do |identifier, i|
|
14
16
|
args[i] || container[identifier]
|
15
|
-
|
17
|
+
end
|
16
18
|
|
17
|
-
super(*deps, *args
|
19
|
+
super(*deps, *args.drop(deps.size))
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -46,11 +48,12 @@ module Dry
|
|
46
48
|
end
|
47
49
|
|
48
50
|
def define_initialize_with_splat(super_parameters)
|
49
|
-
super_pass =
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
super_pass =
|
52
|
+
if super_parameters.splat?
|
53
|
+
"*args"
|
54
|
+
else
|
55
|
+
"*args.take(#{super_parameters.length})"
|
56
|
+
end
|
54
57
|
|
55
58
|
assignments = dependency_map.names.map.with_index do |name, idx|
|
56
59
|
"@#{name} = args[#{idx}]"
|
@@ -9,12 +9,14 @@ module Dry
|
|
9
9
|
|
10
10
|
def define_new
|
11
11
|
class_mod.class_exec(container, dependency_map) do |container, dependency_map|
|
12
|
+
deps_map = dependency_map.to_h
|
13
|
+
|
12
14
|
define_method :new do |options = {}|
|
13
|
-
deps =
|
14
|
-
|
15
|
-
|
15
|
+
deps = deps_map.transform_values do |identifier|
|
16
|
+
options[identifier] || container[identifier]
|
17
|
+
end
|
16
18
|
|
17
|
-
super(deps)
|
19
|
+
super({**deps, **options})
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -24,7 +26,7 @@ module Dry
|
|
24
26
|
super_pass = super_params.empty? ? "" : "options"
|
25
27
|
assignments = dependency_map.names.map do |name|
|
26
28
|
<<~RUBY
|
27
|
-
|
29
|
+
if options.key?(:#{name}) || !instance_variable_defined?(:'@#{name}')
|
28
30
|
@#{name} = options[:#{name}]
|
29
31
|
end
|
30
32
|
RUBY
|
@@ -33,7 +35,7 @@ module Dry
|
|
33
35
|
|
34
36
|
instance_mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
35
37
|
def initialize(options) # def initialize(options)
|
36
|
-
#
|
38
|
+
# if options.key?(:dep) || !instance_variable_defined?(:@dep)
|
37
39
|
#{body} # @dep = options[:dep]
|
38
40
|
# end
|
39
41
|
super(#{super_pass}) # super(options)
|
@@ -11,9 +11,9 @@ module Dry
|
|
11
11
|
register :default, strategy
|
12
12
|
end
|
13
13
|
|
14
|
-
register :args, proc { Args }
|
14
|
+
register :args, proc { Strategies::Args }
|
15
15
|
register :hash, proc { Strategies::Hash }
|
16
|
-
register_default :kwargs, proc { Kwargs }
|
16
|
+
register_default :kwargs, proc { Strategies::Kwargs }
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
data/lib/dry/auto_inject.rb
CHANGED
@@ -6,10 +6,10 @@ require "dry/core"
|
|
6
6
|
module Dry
|
7
7
|
module AutoInject
|
8
8
|
def self.loader
|
9
|
-
@loader ||= Zeitwerk::Loader.new.tap do |loader|
|
10
|
-
root = File.expand_path("..", __dir__)
|
9
|
+
@loader ||= ::Zeitwerk::Loader.new.tap do |loader|
|
10
|
+
root = ::File.expand_path("..", __dir__)
|
11
11
|
loader.tag = "dry-auto_inject"
|
12
|
-
loader.inflector = Zeitwerk::GemInflector.new("#{root}/dry-auto_inject.rb")
|
12
|
+
loader.inflector = ::Zeitwerk::GemInflector.new("#{root}/dry-auto_inject.rb")
|
13
13
|
loader.push_dir(root)
|
14
14
|
loader.ignore(
|
15
15
|
"#{root}/dry-auto_inject.rb",
|
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: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: zeitwerk
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,48 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.6'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bundler
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rake
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
41
|
description: Container-agnostic automatic constructor injection
|
84
42
|
email:
|
85
43
|
- piotr.solnica@gmail.com
|
@@ -111,7 +69,8 @@ metadata:
|
|
111
69
|
changelog_uri: https://github.com/dry-rb/dry-auto_inject/blob/main/CHANGELOG.md
|
112
70
|
source_code_uri: https://github.com/dry-rb/dry-auto_inject
|
113
71
|
bug_tracker_uri: https://github.com/dry-rb/dry-auto_inject/issues
|
114
|
-
|
72
|
+
rubygems_mfa_required: 'true'
|
73
|
+
post_install_message:
|
115
74
|
rdoc_options: []
|
116
75
|
require_paths:
|
117
76
|
- lib
|
@@ -119,15 +78,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
78
|
requirements:
|
120
79
|
- - ">="
|
121
80
|
- !ruby/object:Gem::Version
|
122
|
-
version:
|
81
|
+
version: '3.1'
|
123
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
83
|
requirements:
|
125
84
|
- - ">="
|
126
85
|
- !ruby/object:Gem::Version
|
127
86
|
version: '0'
|
128
87
|
requirements: []
|
129
|
-
rubygems_version: 3.3.
|
130
|
-
signing_key:
|
88
|
+
rubygems_version: 3.3.27
|
89
|
+
signing_key:
|
131
90
|
specification_version: 4
|
132
91
|
summary: Container-agnostic automatic constructor injection
|
133
92
|
test_files: []
|