sinject 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4af2aa3adf1d05d2aa82f6d0a1e7b84472ec5636
4
- data.tar.gz: a8b340a1a844345f333a797d75dfd13b8b3422f7
3
+ metadata.gz: 84ae556b8e2fd2b90c6a6098c655a72133e3190c
4
+ data.tar.gz: d6994c60f60a5dad2d1cb7179c166c1255301585
5
5
  SHA512:
6
- metadata.gz: ec9d058bdcd92b89f70b836f785ae44ac78ca753398d585f89447664d535fc3332bcb0c8559bc49601035cb3abc2ca99739510f17c0fa41f7e3ca027706e23e2
7
- data.tar.gz: 8476d4e97aa02e22ffd58a9aecd97ae09093308dde230831e9268099391b3445c68e582ed912df605956155e2d38aead4a4a86e0637d0eef332425c849bddd3f
6
+ metadata.gz: bc23325620a024329a2acb4c49fe97fbed19e647353e943da931cb7c9ed900175ccfcd4dc2ced889a1366a35237f696933e3c401247693b841435be9c491ea7b
7
+ data.tar.gz: 1e8ba21b96980fbd99b62a18f59cb28b6c9f0549301a8882b09255262ec0ccdbc89a1b30e8d652748fd8c659883dd49cdd89dbb6789403ca99c4df056118bcb5
data/README.md CHANGED
@@ -43,9 +43,8 @@ Dependencies can be registered with the container in 2 modes:
43
43
 
44
44
  The registration mode can be set by specifying **true** or **false** to the *'single_instance'* argument of the containers register method.
45
45
 
46
- Dependencies that require custom initialization can be registered with an initialization block to creates the dependency, this allows you more control over how the dependency is create:
46
+ Dependencies that require custom initialization can be registered with an initialization block to handle creation of the dependency, this allows you more control over how the dependency is created:
47
47
 
48
- #register your dependencies
49
48
  container.register(:cache_store, RedisCacheStore, true) do
50
49
  instance = RedisCacheStore.new
51
50
  instance.host = 'http://localhost'
@@ -53,17 +52,16 @@ Dependencies that require custom initialization can be registered with an initia
53
52
  instance
54
53
  end
55
54
 
56
- Dependencies with a custom initialization block must return an object of the registered dependency class name, if an unexpected instance is returned then Sinject will raise a `DependencyInitializeException`.
55
+ Dependencies with a custom initialization block must return an object of the registered dependency class type, if an unexpected instance is returned then Sinject will raise a `DependencyInitializeException`.
57
56
 
58
57
  **Dependency Contracts**
59
58
 
60
- Dependency contracts can be defined and used to validate registered dependencies are valid for the task they are being registered for.
59
+ Dependency contracts can be defined to validate registered dependencies are valid for the task they are being registered for.
61
60
 
62
- To create a dependency contract you simply create a new class with empty methods for each of the methods that the dependency needs to respond to in order to fulfill it's role:
61
+ To create a dependency contract you need to create a new class with empty methods for each of the methods that the dependency needs to respond to in order to fulfill it's role:
63
62
 
64
- #initialize the container
65
63
  class LoggerContract
66
- def write
64
+ def write(message)
67
65
  end
68
66
  end
69
67
 
@@ -72,7 +70,11 @@ Then when registering a dependency for the role the contract is written for, you
72
70
  #register the dependency
73
71
  container.register(:logger, FileLogger, false, LoggerContract)
74
72
 
75
- Sinject will then validate that the registered dependency meets the requirements specified within the contract. If a dependency does not meet the contract requirements then a `DependencyContractException` is raised.
73
+ Sinject will then validate that the registered dependency meets the requirements specified within the contract. If a dependency does not meet the contract requirements then 1 of the following exceptions will be raised:
74
+
75
+ - `DependencyContractMissingMethodsException` is raised when 1 or more methods from the contract could not be found on the dependency.
76
+ - `DependencyContractInvalidParametersException` is raised when the parameters of a contract method do not match the parameters found on a dependency method.
77
+
76
78
 
77
79
  **Assigning dependencies**
78
80
 
data/lib/sinject.rb CHANGED
@@ -41,11 +41,8 @@ class SinjectContainer
41
41
 
42
42
  #check if a contract has been specified
43
43
  if contract_class_name != nil
44
- #check if any contract methods are mising
45
- missing_methods = validate_contract(dependency_class_name, contract_class_name)
46
- if !missing_methods.empty?
47
- raise DependencyContractException.new(missing_methods)
48
- end
44
+ #validate the dependency class against the contract
45
+ validate_contract(dependency_class_name, contract_class_name)
49
46
  end
50
47
 
51
48
  item = ContainerItem.new
@@ -91,12 +88,33 @@ class SinjectContainer
91
88
  private
92
89
 
93
90
  def validate_contract(dependency_class, contract_class)
91
+
94
92
  #get the methods defined for the contract
95
93
  contract_methods = (contract_class.instance_methods - Object.instance_methods)
96
94
  #get the methods defined for the dependency
97
95
  dependency_methods = (dependency_class.instance_methods - Object.instance_methods)
98
96
  #calculate any methods specified in the contract that are not specified in the dependency
99
- contract_methods - dependency_methods
97
+ missing_methods = contract_methods - dependency_methods
98
+
99
+ if !missing_methods.empty?
100
+ raise DependencyContractMissingMethodsException.new(missing_methods)
101
+ end
102
+
103
+ #loop through each contract method
104
+ contract_methods.each do |method|
105
+
106
+ #get the contract method parameters
107
+ cmp = contract_class.instance_method(method).parameters
108
+ #get teh dependency method parameters
109
+ dmp = dependency_class.instance_method(method).parameters
110
+
111
+ #check if the parameters match for both methods
112
+ if cmp != dmp
113
+ raise DependencyContractInvalidParametersException.new(method, cmp)
114
+ end
115
+
116
+ end
117
+
100
118
  end
101
119
 
102
120
  def create_instance(item)
@@ -153,7 +171,7 @@ class Class
153
171
  end
154
172
  end
155
173
 
156
- class DependencyContractException < StandardError
174
+ class DependencyContractMissingMethodsException < StandardError
157
175
  def initialize(methods)
158
176
  @methods = methods
159
177
  end
@@ -164,6 +182,18 @@ class DependencyContractException < StandardError
164
182
  end
165
183
  end
166
184
 
185
+ class DependencyContractInvalidParametersException < StandardError
186
+ def initialize(method, parameters)
187
+ @method = method
188
+ @parameters = parameters
189
+ end
190
+
191
+ def to_s
192
+ parameter_names = @parameters.join(', ')
193
+ "The method signature of method: '#{@method}' does not match the contract parameters: '#{parameter_names}'"
194
+ end
195
+ end
196
+
167
197
  class DependencyInitializeException < StandardError
168
198
 
169
199
  def initialize(expected_type)
@@ -1,3 +1,3 @@
1
1
  module Sinject
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinject
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - vaughan britton