public
Description: Generic dependencies resolver in Ruby
Clone URL: git://github.com/samleb/dependencies_resolver.git
Lesser stack level
samleb (author)
Fri May 09 06:26:12 -0700 2008
commit  982850684ef3160ab47381aca10cd2b31f15e89a
tree    f7b1208eed5d03b46a7c15967b55e5829ccad1bb
parent  5d8cfb8e3ecedc271de011addce3cc41173d9746
...
15
16
17
18
19
20
21
22
23
 
 
 
24
25
 
26
27
28
29
30
31
32
33
34
35
 
 
 
 
 
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
 
 
 
50
51
...
15
16
17
 
 
18
 
 
 
19
20
21
22
 
23
24
25
26
27
 
 
 
 
 
 
28
29
30
31
32
33
34
 
 
 
 
 
 
 
 
 
 
 
 
35
36
37
38
39
40
0
@@ -15,37 +15,26 @@ class Dependencies
0
     @dependencies = dependencies.to_hash
0
   end
0
   
0
- attr_reader :dependencies
0
-
0
   def resolve(objects = nil)
0
- @stack, @build = [ ], [ ]
0
- concat_dependencies(objects || dependencies.keys)
0
- @build
0
+ @stack, @list = [], []
0
+ concat_dependencies(objects || @dependencies.keys)
0
+ @list
0
   end
0
-
0
+
0
 private
0
 
0
   def concat_dependencies(objects)
0
     objects.uniq.each do |object|
0
- next if @build.include?(object)
0
- ensure_no_circular_dependency!(object)
0
- object_dependencies = Array(dependencies[object])
0
- stacking(object) do
0
- concat_dependencies(object_dependencies)
0
- end
0
+ next if @list.include?(object)
0
+ raise_circular_dependency_error(object) if @stack.include?(object)
0
+ @stack << object
0
+ concat_dependencies(Array(@dependencies[object]))
0
+ @list << @stack.pop
0
     end
0
   end
0
-
0
- def stacking(object)
0
- @stack << object
0
- yield
0
- @build << @stack.pop
0
- end
0
-
0
- def ensure_no_circular_dependency!(object)
0
- if @stack.member?(object)
0
- raise CircularDependencyError,
0
- "Circular dependency on #{object.inspect}, dependencies stack : #{@stack.inspect}"
0
- end
0
+
0
+ def raise_circular_dependency_error(object)
0
+ raise CircularDependencyError,
0
+ "Circular dependency on #{object.inspect}, dependencies stack : #{@stack.inspect}"
0
   end
0
 end

Comments

    No one has commented yet.