sinject 1.0.2 → 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 +5 -5
- data/lib/sinject/container.rb +72 -56
- data/lib/sinject/dependency_group.rb +1 -8
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 811bf8beccc5b35e04e735fefc564aebcd551cd8f7514cdb4766b8a57776b7ba
|
4
|
+
data.tar.gz: 2b5c71e629c158779a657a533d247081c340c01cb1b748491ce5194dc8c4e14e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48e343a9ca5e54224f5b248e47600169c3212587aacd9f1fecadbf2d1f59f4a7343ab51adba893da1200e1349d1d54cad34030f3c7c445554fdf05e94e0acfdb
|
7
|
+
data.tar.gz: 44da113fef31cc4eeea74ae590592871bfecb733ec6ba96edd9b3ea934cd4ec0b9f8dc536ee790596ee1934c6244024c8c3908fad8f364f5464bb05e86905089
|
data/lib/sinject/container.rb
CHANGED
@@ -7,22 +7,25 @@ module Sinject
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def initialize(singleton=true)
|
10
|
-
@store =
|
11
|
-
if singleton
|
12
|
-
Sinject::Container.instance = self
|
13
|
-
end
|
10
|
+
@store = {}
|
11
|
+
Sinject::Container.instance = self if singleton
|
14
12
|
end
|
15
13
|
|
16
14
|
# Check if an object has been registered with the container.
|
17
15
|
#
|
18
16
|
# Example:
|
19
|
-
# >> Sinject::Container.instance.
|
17
|
+
# >> Sinject::Container.instance.registered? :object_key
|
20
18
|
# => true
|
21
19
|
#
|
22
20
|
# Arguments:
|
23
21
|
# key: (Symbol)
|
22
|
+
def registered?(key)
|
23
|
+
@store.has_key?(key)
|
24
|
+
end
|
25
|
+
# @deprecated: Use registered? method instead
|
24
26
|
def is_registered?(key)
|
25
|
-
|
27
|
+
puts "[#{self.class}] - #is_registered? method is deprecated please use #registered? instead."
|
28
|
+
registered?(key)
|
26
29
|
end
|
27
30
|
|
28
31
|
# Register an object with the container.
|
@@ -38,22 +41,15 @@ module Sinject
|
|
38
41
|
# class_name: (ClassName)
|
39
42
|
# single_instance: (Boolean)
|
40
43
|
def register(options = {}, &initialize_block)
|
44
|
+
raise Sinject::DependencyRegistrationKeyNotSpecifiedException.new unless options.has_key?(:key)
|
41
45
|
|
42
|
-
|
43
|
-
raise Sinject::DependencyRegistrationKeyNotSpecifiedException.new
|
44
|
-
end
|
45
|
-
|
46
|
-
if(!options.has_key?(:class))
|
47
|
-
raise Sinject::DependencyRegistrationClassNotSpecifiedException.new
|
48
|
-
end
|
46
|
+
raise Sinject::DependencyRegistrationClassNotSpecifiedException.new unless options.has_key?(:class)
|
49
47
|
|
50
48
|
key = options[:key]
|
51
49
|
dependency_class_name = options[:class]
|
52
50
|
|
53
|
-
#check if a dependency has already been registered for this key.
|
54
|
-
if
|
55
|
-
raise Sinject::DependencyRegistrationException.new(key)
|
56
|
-
end
|
51
|
+
# check if a dependency has already been registered for this key.
|
52
|
+
raise Sinject::DependencyRegistrationException.new(key) if registered?(key)
|
57
53
|
|
58
54
|
single_instance = false
|
59
55
|
contract_class_name = nil
|
@@ -66,11 +62,8 @@ module Sinject
|
|
66
62
|
contract_class_name = options[:contract]
|
67
63
|
end
|
68
64
|
|
69
|
-
#
|
70
|
-
|
71
|
-
#validate the dependency class against the contract
|
72
|
-
validate_contract(dependency_class_name, contract_class_name)
|
73
|
-
end
|
65
|
+
# Validate the dependency class against the contract if a contract has been specified
|
66
|
+
validate_contract(dependency_class_name, contract_class_name) unless contract_class_name.nil?
|
74
67
|
|
75
68
|
item = Sinject::ContainerItem.new
|
76
69
|
item.key = key
|
@@ -78,7 +71,8 @@ module Sinject
|
|
78
71
|
item.class_name = dependency_class_name
|
79
72
|
item.initialize_block = initialize_block
|
80
73
|
|
81
|
-
@store.
|
74
|
+
@store[item.key] = item
|
75
|
+
true
|
82
76
|
end
|
83
77
|
|
84
78
|
# Get an object from the container.
|
@@ -90,25 +84,24 @@ module Sinject
|
|
90
84
|
# Arguments:
|
91
85
|
# key: (Symbol)
|
92
86
|
def get(key)
|
93
|
-
#get the dependency from the container store for the specified key
|
94
|
-
|
95
|
-
if !
|
96
|
-
item
|
97
|
-
|
98
|
-
#check if the item has been registered as a single instance item.
|
87
|
+
# get the dependency from the container store for the specified key
|
88
|
+
item = @store[key]
|
89
|
+
if !item.nil?
|
90
|
+
# check if the item has been registered as a single instance item.
|
99
91
|
if item.single_instance == true
|
100
|
-
#check if the instance needs to be created
|
101
|
-
if item.instance
|
102
|
-
|
103
|
-
end
|
92
|
+
# check if the instance needs to be created
|
93
|
+
item.instance = create_instance(item) if item.instance.nil?
|
94
|
+
|
104
95
|
return item.instance
|
105
96
|
else
|
106
97
|
return create_instance(item)
|
107
98
|
end
|
108
99
|
else
|
109
|
-
#no dependency has been registered for the specified key,
|
100
|
+
# no dependency has been registered for the specified key,
|
101
|
+
# attempt to convert the key into a class name and initialize it.
|
110
102
|
class_name = "#{key}".split('_').collect(&:capitalize).join
|
111
|
-
puts "[
|
103
|
+
puts "[#{self.class}] - WARNING: No registered dependency could be found for key: #{key}. " \
|
104
|
+
"Attempting to load class: #{class_name}."
|
112
105
|
Object.const_get(class_name).new
|
113
106
|
end
|
114
107
|
end
|
@@ -116,7 +109,7 @@ module Sinject
|
|
116
109
|
def load_groups
|
117
110
|
Sinject::DependencyGroup.descendants.each do |g|
|
118
111
|
group = g.new
|
119
|
-
if group.is_valid?
|
112
|
+
if (group.respond_to?(:valid?) && group.valid?) || (group.respond_to?(:is_valid?) && group.is_valid?)
|
120
113
|
group.register(self)
|
121
114
|
end
|
122
115
|
end
|
@@ -125,46 +118,69 @@ module Sinject
|
|
125
118
|
private
|
126
119
|
|
127
120
|
def validate_contract(dependency_class, contract_class)
|
128
|
-
|
129
|
-
#get the methods defined for the contract
|
121
|
+
# get the methods defined for the contract
|
130
122
|
contract_methods = (contract_class.instance_methods - Object.instance_methods)
|
131
|
-
#get the methods defined for the dependency
|
123
|
+
# get the methods defined for the dependency
|
132
124
|
dependency_methods = (dependency_class.instance_methods - Object.instance_methods)
|
133
|
-
#calculate any methods specified in the contract that are not specified in the dependency
|
125
|
+
# calculate any methods specified in the contract that are not specified in the dependency
|
134
126
|
missing_methods = contract_methods - dependency_methods
|
135
127
|
|
136
128
|
if !missing_methods.empty?
|
137
129
|
raise Sinject::DependencyContractMissingMethodsException.new(missing_methods)
|
138
130
|
end
|
139
131
|
|
140
|
-
#loop through each contract method
|
132
|
+
# loop through each contract method
|
141
133
|
contract_methods.each do |method|
|
134
|
+
# get the contract method parameters
|
135
|
+
contract_params = contract_class.instance_method(method).parameters.map{ |p| { type: p[0], name: p[1] } }
|
142
136
|
|
143
|
-
#get the
|
144
|
-
|
145
|
-
#get teh dependency method parameters
|
146
|
-
dmp = dependency_class.instance_method(method).parameters
|
137
|
+
# get the dependency method parameters
|
138
|
+
dependency_params = dependency_class.instance_method(method).parameters.map{ |p| { type: p[0], name: p[1] } }
|
147
139
|
|
148
|
-
|
149
|
-
|
150
|
-
|
140
|
+
errors = []
|
141
|
+
|
142
|
+
contract_params.each do |cp|
|
143
|
+
dp = dependency_params.detect { |p| p[:name] == cp[:name] }
|
144
|
+
if dp.nil? || !match?(cp, dp)
|
145
|
+
errors << cp[:name]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
dependency_params.each do |dp|
|
150
|
+
cp = contract_params.detect { |p| p[:name] == dp[:name] }
|
151
|
+
if cp.nil?
|
152
|
+
errors << dp[:name]
|
153
|
+
end
|
151
154
|
end
|
152
155
|
|
156
|
+
# check if any parameter errors
|
157
|
+
if errors.length > 0
|
158
|
+
raise Sinject::DependencyContractInvalidParametersException.new(method, errors)
|
159
|
+
end
|
153
160
|
end
|
161
|
+
end
|
154
162
|
|
163
|
+
def match?(contract, dependency)
|
164
|
+
return true if contract[:type] == dependency[:type]
|
165
|
+
return true if contract[:type] == :req && dependency[:type] == :opt
|
166
|
+
return true if contract[:type] == :keyreq && dependency[:type] == :key
|
167
|
+
return false
|
155
168
|
end
|
156
169
|
|
157
|
-
|
170
|
+
# this method is called to get a standard param type for comparison purposes
|
171
|
+
def param_type(type)
|
172
|
+
return :arg if type == :opt || type == :req
|
173
|
+
return :key if type == :keyreq || type == :key
|
174
|
+
end
|
158
175
|
|
159
|
-
|
176
|
+
def create_instance(item)
|
177
|
+
# check if a custom initializer block has been specified
|
160
178
|
if item.initialize_block != nil
|
161
|
-
#call the block to create the dependency instance
|
179
|
+
# call the block to create the dependency instance
|
162
180
|
instance = item.initialize_block.call
|
163
181
|
|
164
|
-
#verify the block created the expected dependency type
|
165
|
-
|
166
|
-
raise Sinject::DependencyInitializeException.new(item.class_name)
|
167
|
-
end
|
182
|
+
# verify the block created the expected dependency type
|
183
|
+
raise Sinject::DependencyInitializeException.new(item.class_name) unless instance.is_a?(item.class_name)
|
168
184
|
else
|
169
185
|
instance = item.class_name.new
|
170
186
|
end
|
@@ -172,4 +188,4 @@ module Sinject
|
|
172
188
|
instance
|
173
189
|
end
|
174
190
|
end
|
175
|
-
end
|
191
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinject
|
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
|
- Sage One
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -87,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
87
|
version: '0'
|
88
88
|
requirements: []
|
89
89
|
rubyforge_project:
|
90
|
-
rubygems_version: 2.
|
90
|
+
rubygems_version: 2.7.6
|
91
91
|
signing_key:
|
92
92
|
specification_version: 4
|
93
93
|
summary: Simple Dependency Injection.
|