dry-auto_inject 0.7.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 +7 -0
- data/.codeclimate.yml +12 -0
- data/.github/ISSUE_TEMPLATE/----please-don-t-ask-for-support-via-issues.md +10 -0
- data/.github/ISSUE_TEMPLATE/---bug-report.md +30 -0
- data/.github/ISSUE_TEMPLATE/---feature-request.md +18 -0
- data/.github/workflows/ci.yml +76 -0
- data/.github/workflows/docsite.yml +34 -0
- data/.github/workflows/sync_configs.yml +34 -0
- data/.gitignore +10 -0
- data/.rspec +4 -0
- data/.rubocop.yml +95 -0
- data/.rubocop_todo.yml +6 -0
- data/CHANGELOG.md +257 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/CONTRIBUTING.md +29 -0
- data/Gemfile +17 -0
- data/LICENSE +20 -0
- data/README.md +58 -0
- data/Rakefile +14 -0
- data/bin/console +11 -0
- data/bin/setup +7 -0
- data/docsite/source/basic-usage.html.md +104 -0
- data/docsite/source/how-does-it-work.html.md +45 -0
- data/docsite/source/index.html.md +53 -0
- data/docsite/source/injection-strategies.html.md +94 -0
- data/dry-auto_inject.gemspec +29 -0
- data/lib/dry-auto_inject.rb +3 -0
- data/lib/dry/auto_inject.rb +46 -0
- data/lib/dry/auto_inject/builder.rb +40 -0
- data/lib/dry/auto_inject/dependency_map.rb +55 -0
- data/lib/dry/auto_inject/injector.rb +39 -0
- data/lib/dry/auto_inject/method_parameters.rb +92 -0
- data/lib/dry/auto_inject/strategies.rb +21 -0
- data/lib/dry/auto_inject/strategies/args.rb +68 -0
- data/lib/dry/auto_inject/strategies/constructor.rb +56 -0
- data/lib/dry/auto_inject/strategies/hash.rb +41 -0
- data/lib/dry/auto_inject/strategies/kwargs.rb +105 -0
- data/lib/dry/auto_inject/version.rb +7 -0
- data/rakelib/rubocop.rake +20 -0
- metadata +137 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'dry/auto_inject/strategies/constructor'
|
4
|
+
require 'dry/auto_inject/method_parameters'
|
5
|
+
|
6
|
+
module Dry
|
7
|
+
module AutoInject
|
8
|
+
class Strategies
|
9
|
+
# @api private
|
10
|
+
class Hash < Constructor
|
11
|
+
private
|
12
|
+
|
13
|
+
def define_new
|
14
|
+
class_mod.class_exec(container, dependency_map) do |container, dependency_map|
|
15
|
+
define_method :new do |options = {}|
|
16
|
+
deps = dependency_map.to_h.each_with_object({}) { |(name, identifier), obj|
|
17
|
+
obj[name] = options[name] || container[identifier]
|
18
|
+
}.merge(options)
|
19
|
+
|
20
|
+
super(deps)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def define_initialize(klass)
|
26
|
+
super_params = MethodParameters.of(klass, :initialize).first
|
27
|
+
super_pass = super_params.empty? ? '' : 'options'
|
28
|
+
|
29
|
+
instance_mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
30
|
+
def initialize(options)
|
31
|
+
#{dependency_map.names.map { |name| "@#{name} = options[:#{name}] unless !options.key?(#{name}) && instance_variable_defined?(:'@#{name}')" }.join("\n")}
|
32
|
+
super(#{super_pass})
|
33
|
+
end
|
34
|
+
RUBY
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
register :hash, Hash
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'dry/auto_inject/strategies/constructor'
|
4
|
+
require 'dry/auto_inject/method_parameters'
|
5
|
+
|
6
|
+
module Dry
|
7
|
+
module AutoInject
|
8
|
+
class Strategies
|
9
|
+
# @api private
|
10
|
+
class Kwargs < Constructor
|
11
|
+
private
|
12
|
+
|
13
|
+
def define_new
|
14
|
+
class_mod.class_exec(container, dependency_map) do |container, dependency_map|
|
15
|
+
map = dependency_map.to_h
|
16
|
+
|
17
|
+
define_method :new do |*args, **kwargs|
|
18
|
+
map.each do |name, identifier|
|
19
|
+
kwargs[name] = container[identifier] unless kwargs.key?(name)
|
20
|
+
end
|
21
|
+
|
22
|
+
super(*args, **kwargs)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def define_initialize(klass)
|
28
|
+
super_parameters = MethodParameters.of(klass, :initialize).each do |ps|
|
29
|
+
# Look upwards past `def foo(*)` methods until we get an explicit list of parameters
|
30
|
+
break ps unless ps.pass_through?
|
31
|
+
end
|
32
|
+
|
33
|
+
if super_parameters.splat? || super_parameters.sequential_arguments?
|
34
|
+
define_initialize_with_splat(super_parameters)
|
35
|
+
else
|
36
|
+
define_initialize_with_keywords(super_parameters)
|
37
|
+
end
|
38
|
+
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def define_initialize_with_keywords(super_parameters)
|
43
|
+
assign_dependencies = method(:assign_dependencies)
|
44
|
+
slice_kwargs = method(:slice_kwargs)
|
45
|
+
|
46
|
+
instance_mod.class_exec do
|
47
|
+
define_method :initialize do |**kwargs|
|
48
|
+
assign_dependencies.(kwargs, self)
|
49
|
+
|
50
|
+
super_kwargs = slice_kwargs.(kwargs, super_parameters)
|
51
|
+
|
52
|
+
if super_kwargs.any?
|
53
|
+
super(**super_kwargs)
|
54
|
+
else
|
55
|
+
super()
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def define_initialize_with_splat(super_parameters)
|
62
|
+
assign_dependencies = method(:assign_dependencies)
|
63
|
+
slice_kwargs = method(:slice_kwargs)
|
64
|
+
|
65
|
+
instance_mod.class_exec do
|
66
|
+
define_method :initialize do |*args, **kwargs|
|
67
|
+
assign_dependencies.(kwargs, self)
|
68
|
+
|
69
|
+
if super_parameters.splat?
|
70
|
+
super(*args, **kwargs)
|
71
|
+
else
|
72
|
+
super_kwargs = slice_kwargs.(kwargs, super_parameters)
|
73
|
+
|
74
|
+
if super_kwargs.any?
|
75
|
+
super(*args, **super_kwargs)
|
76
|
+
else
|
77
|
+
super(*args)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def assign_dependencies(kwargs, destination)
|
85
|
+
dependency_map.names.each do |name|
|
86
|
+
# Assign instance variables, but only if the ivar is not
|
87
|
+
# previously defined (this improves compatibility with objects
|
88
|
+
# initialized in unconventional ways)
|
89
|
+
if kwargs.key?(name) || !destination.instance_variable_defined?(:"@#{name}")
|
90
|
+
destination.instance_variable_set :"@#{name}", kwargs[name]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def slice_kwargs(kwargs, super_parameters)
|
96
|
+
kwargs.select do |key|
|
97
|
+
!dependency_map.names.include?(key) || super_parameters.keyword?(key)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
register_default :kwargs, Kwargs
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rubocop/rake_task'
|
5
|
+
|
6
|
+
Rake::Task[:default].enhance [:rubocop]
|
7
|
+
|
8
|
+
RuboCop::RakeTask.new do |task|
|
9
|
+
task.options << '--display-cop-names'
|
10
|
+
end
|
11
|
+
|
12
|
+
namespace :rubocop do
|
13
|
+
desc 'Generate a configuration file acting as a TODO list.'
|
14
|
+
task :auto_gen_config do
|
15
|
+
exec 'bundle exec rubocop --auto-gen-config'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
rescue LoadError
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dry-auto_inject
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Piotr Solnica
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-12-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dry-container
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.3.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.3.4
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
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: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.8'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.8'
|
69
|
+
description:
|
70
|
+
email:
|
71
|
+
- piotr.solnica@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".codeclimate.yml"
|
77
|
+
- ".github/ISSUE_TEMPLATE/----please-don-t-ask-for-support-via-issues.md"
|
78
|
+
- ".github/ISSUE_TEMPLATE/---bug-report.md"
|
79
|
+
- ".github/ISSUE_TEMPLATE/---feature-request.md"
|
80
|
+
- ".github/workflows/ci.yml"
|
81
|
+
- ".github/workflows/docsite.yml"
|
82
|
+
- ".github/workflows/sync_configs.yml"
|
83
|
+
- ".gitignore"
|
84
|
+
- ".rspec"
|
85
|
+
- ".rubocop.yml"
|
86
|
+
- ".rubocop_todo.yml"
|
87
|
+
- CHANGELOG.md
|
88
|
+
- CODE_OF_CONDUCT.md
|
89
|
+
- CONTRIBUTING.md
|
90
|
+
- Gemfile
|
91
|
+
- LICENSE
|
92
|
+
- README.md
|
93
|
+
- Rakefile
|
94
|
+
- bin/console
|
95
|
+
- bin/setup
|
96
|
+
- docsite/source/basic-usage.html.md
|
97
|
+
- docsite/source/how-does-it-work.html.md
|
98
|
+
- docsite/source/index.html.md
|
99
|
+
- docsite/source/injection-strategies.html.md
|
100
|
+
- dry-auto_inject.gemspec
|
101
|
+
- lib/dry-auto_inject.rb
|
102
|
+
- lib/dry/auto_inject.rb
|
103
|
+
- lib/dry/auto_inject/builder.rb
|
104
|
+
- lib/dry/auto_inject/dependency_map.rb
|
105
|
+
- lib/dry/auto_inject/injector.rb
|
106
|
+
- lib/dry/auto_inject/method_parameters.rb
|
107
|
+
- lib/dry/auto_inject/strategies.rb
|
108
|
+
- lib/dry/auto_inject/strategies/args.rb
|
109
|
+
- lib/dry/auto_inject/strategies/constructor.rb
|
110
|
+
- lib/dry/auto_inject/strategies/hash.rb
|
111
|
+
- lib/dry/auto_inject/strategies/kwargs.rb
|
112
|
+
- lib/dry/auto_inject/version.rb
|
113
|
+
- rakelib/rubocop.rake
|
114
|
+
homepage: https://github.com/dry-rb/dry-auto_inject
|
115
|
+
licenses:
|
116
|
+
- MIT
|
117
|
+
metadata: {}
|
118
|
+
post_install_message:
|
119
|
+
rdoc_options: []
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 2.4.0
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
requirements: []
|
133
|
+
rubygems_version: 3.1.2
|
134
|
+
signing_key:
|
135
|
+
specification_version: 4
|
136
|
+
summary: Container-agnostic automatic constructor injection
|
137
|
+
test_files: []
|