deep_end 0.0.4 → 0.0.5
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.
- data/lib/deep_end/version.rb +1 -1
- data/lib/deep_end.rb +40 -53
- data/spec/lib/deep_end_spec.rb +10 -9
- metadata +3 -2
data/lib/deep_end/version.rb
CHANGED
data/lib/deep_end.rb
CHANGED
@@ -5,12 +5,13 @@ module DeepEnd
|
|
5
5
|
# Errors
|
6
6
|
class SelfDependencyError < StandardError; end
|
7
7
|
class CircularDependencyError < StandardError; end
|
8
|
-
|
8
|
+
|
9
9
|
# Graph Node
|
10
10
|
class Node
|
11
11
|
|
12
12
|
attr_reader :key
|
13
13
|
attr_accessor :seen
|
14
|
+
alias_method :seen?, :seen
|
14
15
|
attr_reader :edges
|
15
16
|
|
16
17
|
def initialize(key)
|
@@ -20,18 +21,16 @@ module DeepEnd
|
|
20
21
|
|
21
22
|
def addEdge(node)
|
22
23
|
@edges << node
|
23
|
-
end
|
24
|
-
|
24
|
+
end
|
25
|
+
|
25
26
|
end
|
26
27
|
|
27
28
|
# Dependency Graph
|
28
29
|
class Graph
|
29
30
|
|
30
31
|
def resolved_dependencies
|
31
|
-
|
32
|
-
|
33
|
-
return a
|
34
|
-
end
|
32
|
+
@resolved.map{|node| node.key}
|
33
|
+
end
|
35
34
|
|
36
35
|
def initialize
|
37
36
|
reset
|
@@ -47,70 +46,58 @@ module DeepEnd
|
|
47
46
|
node.addEdge(node_for_key_or_new(dependency))
|
48
47
|
end
|
49
48
|
resolve_dependencies
|
50
|
-
return @resolved
|
51
49
|
end
|
52
50
|
|
53
51
|
# Return the graph to its virgin state
|
54
52
|
def reset
|
55
53
|
@resolved = []
|
56
|
-
@seen_this_pass
|
57
54
|
@nodes = []
|
58
55
|
end
|
59
56
|
|
60
57
|
protected
|
61
58
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
59
|
+
# Recurse through nodes
|
60
|
+
def resolve_dependencies
|
61
|
+
reset_seen
|
62
|
+
@resolved = []
|
63
|
+
@nodes.each do |node|
|
64
|
+
@seen_this_pass = []
|
65
|
+
resolve_dependency node unless node.seen?
|
70
66
|
end
|
67
|
+
@resolved
|
68
|
+
end
|
71
69
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
else
|
84
|
-
raise CircularDependencyError, "Circular reference detected: #{node.key.to_s} - #{edge.key.to_s}"
|
70
|
+
# Recurse through node edges
|
71
|
+
def resolve_dependency(node)
|
72
|
+
node.seen = true
|
73
|
+
@seen_this_pass << node
|
74
|
+
|
75
|
+
node.edges.each do |edge|
|
76
|
+
unless @resolved.include? edge
|
77
|
+
unless @seen_this_pass.include? edge
|
78
|
+
unless edge.seen?
|
79
|
+
resolve_dependency edge
|
85
80
|
end
|
81
|
+
else
|
82
|
+
raise CircularDependencyError, "Circular reference detected: #{node.key.to_s} - #{edge.key.to_s}"
|
86
83
|
end
|
87
84
|
end
|
88
|
-
@resolved << node
|
89
|
-
end
|
90
|
-
|
91
|
-
def key_exists(key)
|
92
|
-
return node_for_key(key).present?
|
93
85
|
end
|
86
|
+
@resolved << node
|
87
|
+
end
|
94
88
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
89
|
+
def node_for_key(key)
|
90
|
+
@nodes.each { |node| return node if node.key == key }
|
91
|
+
return
|
92
|
+
end
|
99
93
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
return existing_node
|
104
|
-
else
|
105
|
-
node = Node.new key
|
106
|
-
@nodes << node
|
107
|
-
return node
|
108
|
-
end
|
109
|
-
end
|
94
|
+
def node_for_key_or_new(key)
|
95
|
+
node_for_key(key) || (@nodes << Node.new(key)).last
|
96
|
+
end
|
110
97
|
|
111
|
-
|
112
|
-
|
113
|
-
|
98
|
+
def reset_seen
|
99
|
+
@nodes.each{ |node| node.seen = false}
|
100
|
+
end
|
114
101
|
|
115
102
|
end
|
116
|
-
end
|
103
|
+
end
|
data/spec/lib/deep_end_spec.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
module DeepEnd
|
4
|
-
|
4
|
+
|
5
5
|
describe Graph do
|
6
6
|
|
7
7
|
before(:each) do
|
8
8
|
@graph = Graph.new
|
9
9
|
end
|
10
10
|
|
11
|
-
context 'when first created' do
|
11
|
+
context 'when first created' do
|
12
12
|
it 'should have no resolved dependencies' do
|
13
13
|
@graph.resolved_dependencies.should be_empty
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
context 'when given dendencies' do
|
17
|
+
context 'when given dendencies' do
|
18
18
|
|
19
19
|
# Create dependencies
|
20
20
|
before(:each) do
|
@@ -61,34 +61,35 @@ module DeepEnd
|
|
61
61
|
|
62
62
|
it 'should raise a SelfDependencyError if an object is added as its own dependency' do
|
63
63
|
# Add dependencies
|
64
|
-
expect { @graph.add_dependency @dependency_a, [@dependency_a] }.to raise_error(SelfDependencyError)
|
64
|
+
expect { @graph.add_dependency @dependency_a, [@dependency_a] }.to raise_error(SelfDependencyError)
|
65
65
|
end
|
66
66
|
|
67
67
|
it 'should raise a CircularDependencyError if objects are added with direct circular dependencies' do
|
68
68
|
# Add dependencies
|
69
69
|
@graph.add_dependency @dependency_b, [@dependency_a]
|
70
|
-
expect { @graph.add_dependency @dependency_a, [@dependency_b] }.to raise_error(CircularDependencyError)
|
70
|
+
expect { @graph.add_dependency @dependency_a, [@dependency_b] }.to raise_error(CircularDependencyError)
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'should raise a CircularDependencyError if objects are added with indirect circular dependencies' do
|
74
74
|
# Add dependencies
|
75
75
|
@graph.add_dependency @dependency_b, [@dependency_c]
|
76
76
|
@graph.add_dependency @dependency_c, [@dependency_a]
|
77
|
-
expect { @graph.add_dependency @dependency_a, [@dependency_b] }.to raise_error(CircularDependencyError)
|
77
|
+
expect { @graph.add_dependency @dependency_a, [@dependency_b] }.to raise_error(CircularDependencyError)
|
78
78
|
end
|
79
79
|
|
80
|
-
context "when reset" do
|
80
|
+
context "when reset" do
|
81
81
|
|
82
82
|
it 'should have no resolved dependencies' do
|
83
83
|
# Add dependencies
|
84
84
|
@graph.add_dependency @dependency_c, [@dependency_b, @dependency_a]
|
85
85
|
@graph.add_dependency @dependency_b, [@dependency_a]
|
86
86
|
@graph.add_dependency @dependency_a
|
87
|
-
@graph.reset
|
87
|
+
@graph.reset
|
88
88
|
@graph.resolved_dependencies.length.should == 0
|
89
89
|
end
|
90
|
+
|
90
91
|
end
|
91
92
|
|
92
93
|
end
|
93
94
|
end
|
94
|
-
end
|
95
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deep_end
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07
|
12
|
+
date: 2013-09-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: log4r
|
@@ -105,3 +105,4 @@ summary: This gem processes a list of objects and their dependencies, ordering t
|
|
105
105
|
test_files:
|
106
106
|
- spec/lib/deep_end_spec.rb
|
107
107
|
- spec/spec_helper.rb
|
108
|
+
has_rdoc:
|