mementus 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 +4 -4
- data/.travis.yml +6 -7
- data/lib/mementus/breadth_first_search.rb +28 -0
- data/lib/mementus/depth_first_search.rb +25 -0
- data/lib/mementus/node_proxy.rb +26 -0
- data/lib/mementus/version.rb +1 -1
- data/lib/mementus.rb +3 -0
- data/spec/node_proxy_spec.rb +15 -0
- data/spec/traversal_spec.rb +39 -0
- metadata +8 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4a89d482eebdd901269f7a93501a22883a3b084
|
4
|
+
data.tar.gz: 571323b9865fb729fc2a8b63e70d727a5108a90f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8182797b06e55efe935305ec6067007ae569adbf90ceac25aaf2b990a74495bf64597efd023f24be7d8f6e5ce8bfb59b77da8de666454a7f3f5fdb018c49c42d
|
7
|
+
data.tar.gz: 9151ad44dbcc2570de6e58d60e5e967de8c4ce1ae9441795a63f37ae8bac8ca64cbf1596a15d5a277635fd15b135ae08f3596e4253c5297dcedc63e502bec6da
|
data/.travis.yml
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Mementus
|
2
|
+
class BreadthFirstSearch
|
3
|
+
def initialize(graph, start)
|
4
|
+
@graph = graph
|
5
|
+
@start = start
|
6
|
+
@visited = { @start => true }
|
7
|
+
@queue = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def each(&block)
|
11
|
+
visit(NodeProxy.new(@start, graph), &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def visit(node, &block)
|
17
|
+
@queue << node.adjacent
|
18
|
+
|
19
|
+
while next_node = @queue.shift
|
20
|
+
next if @visited[next_node]
|
21
|
+
|
22
|
+
@visited[next_node] = true
|
23
|
+
block.call(next_node)
|
24
|
+
@queue << next_node.adjacent
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Mementus
|
2
|
+
class DepthFirstSearch
|
3
|
+
def initialize(graph, start)
|
4
|
+
@graph = graph
|
5
|
+
@start = start
|
6
|
+
@visited = { @start => true }
|
7
|
+
end
|
8
|
+
|
9
|
+
def each(&block)
|
10
|
+
visit(NodeProxy.new(@start, @graph), &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def visit(node, &block)
|
16
|
+
node.each_adjacent do |adjacent|
|
17
|
+
next if @visited[adjacent]
|
18
|
+
|
19
|
+
@visited[adjacent] = true
|
20
|
+
block.call(adjacent)
|
21
|
+
visit(NodeProxy.new(adjacent, @graph), &block)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Mementus
|
2
|
+
class NodeProxy
|
3
|
+
def initialize(node, graph)
|
4
|
+
@node = node
|
5
|
+
@graph = graph
|
6
|
+
end
|
7
|
+
|
8
|
+
def id
|
9
|
+
@node.id
|
10
|
+
end
|
11
|
+
|
12
|
+
def label
|
13
|
+
@node.label
|
14
|
+
end
|
15
|
+
|
16
|
+
def each_adjacent(&block)
|
17
|
+
@graph.each_adjacent(@node, &block)
|
18
|
+
end
|
19
|
+
|
20
|
+
def adjacent
|
21
|
+
each_adjacent.to_a.map do |node|
|
22
|
+
self.class.new(node, @graph)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/mementus/version.rb
CHANGED
data/lib/mementus.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mementus::NodeProxy do
|
4
|
+
specify '#new' do
|
5
|
+
graph = Mementus::Graph.new
|
6
|
+
node1 = Mementus::Node.new(1, :node)
|
7
|
+
node2 = Mementus::Node.new(2, :node)
|
8
|
+
node3 = Mementus::Node.new(3, :node)
|
9
|
+
graph.add_edge(Mementus::Edge.new(node1, node2))
|
10
|
+
graph.add_edge(Mementus::Edge.new(node1, node3))
|
11
|
+
|
12
|
+
node_proxy = Mementus::NodeProxy.new(node1, graph)
|
13
|
+
expect(node_proxy.adjacent.map { |node| node.id}).to eq([node2.id, node3.id])
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Basic graph traversals' do
|
4
|
+
let(:start) do
|
5
|
+
Mementus::Node.new(1, :node)
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:graph) do
|
9
|
+
graph = Mementus::Graph.new
|
10
|
+
graph.add_edge(Mementus::Edge.new(start, Mementus::Node.new(2, :node)))
|
11
|
+
graph.add_edge(Mementus::Edge.new(Mementus::Node.new(2, :node), Mementus::Node.new(3, :node)))
|
12
|
+
graph.add_edge(Mementus::Edge.new(Mementus::Node.new(2, :node), Mementus::Node.new(5, :node)))
|
13
|
+
graph.add_edge(Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(6, :node)))
|
14
|
+
graph.add_edge(Mementus::Edge.new(Mementus::Node.new(2, :node), Mementus::Node.new(7, :node)))
|
15
|
+
graph.add_edge(Mementus::Edge.new(Mementus::Node.new(7, :node), Mementus::Node.new(8, :node)))
|
16
|
+
graph.add_edge(Mementus::Edge.new(Mementus::Node.new(5, :node), Mementus::Node.new(9, :node)))
|
17
|
+
graph
|
18
|
+
end
|
19
|
+
|
20
|
+
specify 'DepthFirstSearch#each' do
|
21
|
+
traversal = Mementus::DepthFirstSearch.new(graph, start)
|
22
|
+
|
23
|
+
expected = [1,2,3,5,9,7,8,6]
|
24
|
+
index = 0
|
25
|
+
traversal.each do |node|
|
26
|
+
expect(node.id).to eq(expected[index + 1])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
specify 'BreadthFirstSearch#each' do
|
31
|
+
traversal = Mementus::DepthFirstSearch.new(graph, start)
|
32
|
+
|
33
|
+
expected = [1,2,6,3,5,7,9,8]
|
34
|
+
index = 0
|
35
|
+
traversal.each do |node|
|
36
|
+
expect(node.id).to eq(expected[index + 1])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mementus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- maetl
|
@@ -67,15 +67,20 @@ files:
|
|
67
67
|
- Rakefile
|
68
68
|
- lib/mementus.rb
|
69
69
|
- lib/mementus/adapter.rb
|
70
|
+
- lib/mementus/breadth_first_search.rb
|
71
|
+
- lib/mementus/depth_first_search.rb
|
70
72
|
- lib/mementus/edge.rb
|
71
73
|
- lib/mementus/graph.rb
|
72
74
|
- lib/mementus/model.rb
|
73
75
|
- lib/mementus/node.rb
|
76
|
+
- lib/mementus/node_proxy.rb
|
74
77
|
- lib/mementus/relation.rb
|
75
78
|
- lib/mementus/version.rb
|
76
79
|
- mementus.gemspec
|
77
80
|
- spec/graph_spec.rb
|
81
|
+
- spec/node_proxy_spec.rb
|
78
82
|
- spec/spec_helper.rb
|
83
|
+
- spec/traversal_spec.rb
|
79
84
|
homepage: https://github.com/maetl/mementus
|
80
85
|
licenses:
|
81
86
|
- MIT
|
@@ -102,5 +107,7 @@ specification_version: 4
|
|
102
107
|
summary: In-memory data model
|
103
108
|
test_files:
|
104
109
|
- spec/graph_spec.rb
|
110
|
+
- spec/node_proxy_spec.rb
|
105
111
|
- spec/spec_helper.rb
|
112
|
+
- spec/traversal_spec.rb
|
106
113
|
has_rdoc:
|