mementus 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/lib/mementus/breadth_first_search.rb +5 -5
- data/lib/mementus/depth_first_search.rb +5 -5
- data/lib/mementus/edge.rb +13 -12
- data/lib/mementus/edge_builder.rb +6 -23
- data/lib/mementus/element_builder.rb +5 -0
- data/lib/mementus/graph.rb +4 -0
- data/lib/mementus/graph_builder.rb +21 -13
- data/lib/mementus/node.rb +1 -1
- data/lib/mementus/node_builder.rb +3 -12
- data/lib/mementus/node_proxy.rb +13 -7
- data/lib/mementus/pipeline.rb +9 -11
- data/lib/mementus/query/step.rb +3 -2
- data/lib/mementus/structure/adjacency_list.rb +7 -7
- data/lib/mementus/structure/incidence_list.rb +15 -11
- data/lib/mementus/version.rb +1 -1
- data/lib/mementus.rb +19 -18
- data/spec/edge_spec.rb +5 -5
- data/spec/graph_spec.rb +34 -15
- data/spec/node_proxy_spec.rb +5 -8
- data/spec/node_spec.rb +16 -0
- data/spec/query_spec.rb +1 -1
- data/spec/spec_helper.rb +20 -0
- data/spec/structure_spec.rb +13 -13
- data/spec/traversal_spec.rb +7 -7
- metadata +5 -3
- data/Rakefile +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 419399d50dad3b0243a7756f259e99f64bec6da5
|
4
|
+
data.tar.gz: 12a25815a2bb6fd8beebdfd1d9aaf696f1ee5e03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a8c602c0b356d31062eac51d63fc4e93b1740abc417baed0824018d04f75308ac12fdfb47953689bce86bfa8600a62675036d7e15a7107a4e3d3ae287125b85
|
7
|
+
data.tar.gz: b68d9dd85cf13935e41006c8814242243d1b3701672037a79e831433b011ac2b6a3861b1b13dc959c8a1a560349e01967d58ac8c727b0ded0cf3c2d1d5694e96
|
data/Gemfile
CHANGED
@@ -16,12 +16,12 @@ module Mementus
|
|
16
16
|
def visit(id, &block)
|
17
17
|
@queue.concat(@graph.adjacent(id))
|
18
18
|
|
19
|
-
while
|
20
|
-
next if @visited[
|
19
|
+
while next_node = @queue.shift
|
20
|
+
next if @visited[next_node]
|
21
21
|
|
22
|
-
@visited[
|
23
|
-
block.call(
|
24
|
-
@queue.concat(@graph.adjacent(
|
22
|
+
@visited[next_node] = true
|
23
|
+
block.call(next_node)
|
24
|
+
@queue.concat(@graph.adjacent(next_node.id))
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -13,12 +13,12 @@ module Mementus
|
|
13
13
|
private
|
14
14
|
|
15
15
|
def visit(id, &block)
|
16
|
-
@graph.each_adjacent(id) do |
|
17
|
-
next if @visited[
|
16
|
+
@graph.each_adjacent(id) do |adj_node|
|
17
|
+
next if @visited[adj_node.id]
|
18
18
|
|
19
|
-
@visited[
|
20
|
-
block.call(
|
21
|
-
visit(
|
19
|
+
@visited[adj_node.id] = true
|
20
|
+
block.call(adj_node)
|
21
|
+
visit(adj_node.id, &block)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
data/lib/mementus/edge.rb
CHANGED
@@ -2,20 +2,21 @@ module Mementus
|
|
2
2
|
class Edge
|
3
3
|
attr_reader :from, :to, :label, :id
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
|
7
|
-
|
8
|
-
else
|
9
|
-
from
|
10
|
-
end
|
5
|
+
def initialize(id: nil, from:, to:, label: :edge)
|
6
|
+
@id = id
|
7
|
+
@label = label
|
11
8
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
@from = if from.is_a?(Integer)
|
10
|
+
Node.new(id: from)
|
11
|
+
else
|
12
|
+
from
|
13
|
+
end
|
17
14
|
|
18
|
-
@
|
15
|
+
@to = if to.is_a?(Integer)
|
16
|
+
Node.new(id: to)
|
17
|
+
else
|
18
|
+
to
|
19
|
+
end
|
19
20
|
end
|
20
21
|
|
21
22
|
def nodes
|
@@ -1,23 +1,14 @@
|
|
1
1
|
module Mementus
|
2
2
|
class EdgeBuilder
|
3
|
-
|
3
|
+
include ElementBuilder
|
4
4
|
|
5
|
-
|
6
|
-
@from = from
|
7
|
-
@to = to
|
8
|
-
@label = label
|
9
|
-
@id = id
|
10
|
-
end
|
11
|
-
|
12
|
-
def id=(id)
|
13
|
-
@id = id
|
14
|
-
end
|
5
|
+
attr_reader :from, :to
|
15
6
|
|
16
7
|
def from=(node, label=:node)
|
17
8
|
if node.is_a?(Node)
|
18
9
|
@from = node
|
19
10
|
else
|
20
|
-
@from = Node.new(node, label)
|
11
|
+
@from = Node.new(id: node, label: label)
|
21
12
|
end
|
22
13
|
end
|
23
14
|
|
@@ -25,20 +16,12 @@ module Mementus
|
|
25
16
|
if node.is_a?(Node)
|
26
17
|
@to = node
|
27
18
|
else
|
28
|
-
@to = Node.new(node, label)
|
19
|
+
@to = Node.new(id: node, label: label)
|
29
20
|
end
|
30
21
|
end
|
31
22
|
|
32
|
-
def
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
def nodes
|
37
|
-
[@from, @to]
|
38
|
-
end
|
39
|
-
|
40
|
-
def other(node)
|
41
|
-
@from == node ? @to : @from
|
23
|
+
def to_edge
|
24
|
+
Edge.new(id: id, from: from, to: to, label: label)
|
42
25
|
end
|
43
26
|
end
|
44
27
|
end
|
data/lib/mementus/graph.rb
CHANGED
@@ -6,26 +6,34 @@ module Mementus
|
|
6
6
|
@edge_ids = IntegerId.new
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
@structure.
|
9
|
+
def set_node(node)
|
10
|
+
@structure.set_node(node)
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
edge
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
def set_edge(edge)
|
14
|
+
@structure.set_edge(edge)
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_node(id: nil, label: nil)
|
18
|
+
@structure.set_node(Node.new(id: id, label: label))
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_edge(id: nil, from: nil, to: nil, label: nil)
|
22
|
+
@structure.set_edge(Edge.new(id: id, from: from, to: to, label: label))
|
18
23
|
end
|
19
24
|
|
20
25
|
def create_node(&block)
|
21
|
-
|
22
|
-
yield
|
23
|
-
|
24
|
-
|
26
|
+
builder = NodeBuilder.new
|
27
|
+
yield builder
|
28
|
+
builder.id = @node_ids.next_id unless builder.id
|
29
|
+
set_node(builder.to_node)
|
25
30
|
end
|
26
31
|
|
27
|
-
def
|
28
|
-
|
32
|
+
def create_edge(&block)
|
33
|
+
builder = EdgeBuilder.new
|
34
|
+
yield builder
|
35
|
+
builder.id = @edge_ids.next_id unless builder.id
|
36
|
+
set_edge(builder.to_edge)
|
29
37
|
end
|
30
38
|
|
31
39
|
def graph
|
data/lib/mementus/node.rb
CHANGED
@@ -1,18 +1,9 @@
|
|
1
1
|
module Mementus
|
2
2
|
class NodeBuilder
|
3
|
-
|
3
|
+
include ElementBuilder
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
@label = label
|
8
|
-
end
|
9
|
-
|
10
|
-
def id=(id)
|
11
|
-
@id = id
|
12
|
-
end
|
13
|
-
|
14
|
-
def label=(label)
|
15
|
-
@label = label
|
5
|
+
def to_node
|
6
|
+
Node.new(id: id, label: label)
|
16
7
|
end
|
17
8
|
end
|
18
9
|
end
|
data/lib/mementus/node_proxy.rb
CHANGED
@@ -1,22 +1,28 @@
|
|
1
1
|
module Mementus
|
2
2
|
class NodeProxy
|
3
|
-
def initialize(
|
4
|
-
@
|
3
|
+
def initialize(node, graph)
|
4
|
+
@node = node
|
5
5
|
@graph = graph
|
6
6
|
end
|
7
7
|
|
8
8
|
def id
|
9
|
-
@id
|
9
|
+
@node.id
|
10
|
+
end
|
11
|
+
|
12
|
+
def label
|
13
|
+
@node.label
|
14
|
+
end
|
15
|
+
|
16
|
+
def outgoing
|
17
|
+
|
10
18
|
end
|
11
19
|
|
12
20
|
def each_adjacent(&block)
|
13
|
-
@graph.each_adjacent(@id, &block)
|
21
|
+
@graph.each_adjacent(@node.id, &block)
|
14
22
|
end
|
15
23
|
|
16
24
|
def adjacent
|
17
|
-
|
18
|
-
self.class.new(node, @graph)
|
19
|
-
end
|
25
|
+
@graph.adjacent(@node.id)
|
20
26
|
end
|
21
27
|
end
|
22
28
|
end
|
data/lib/mementus/pipeline.rb
CHANGED
@@ -69,10 +69,8 @@ module Mementus
|
|
69
69
|
|
70
70
|
class Outgoing
|
71
71
|
def process(graph, source)
|
72
|
-
if source.respond_to?(:
|
73
|
-
|
74
|
-
Mementus::NodeProxy.new(id, graph)
|
75
|
-
end
|
72
|
+
if source.respond_to?(:adjacent)
|
73
|
+
source.adjacent
|
76
74
|
else
|
77
75
|
source.inject([]) do |result, node|
|
78
76
|
result.concat(node.adjacent)
|
@@ -84,7 +82,7 @@ module Mementus
|
|
84
82
|
class OutgoingEdges
|
85
83
|
def process(graph, node)
|
86
84
|
graph.each_adjacent(node.id).map do |id|
|
87
|
-
Mementus::Edge.new(node, id)
|
85
|
+
Mementus::Edge.new(from: node, to: id)
|
88
86
|
end
|
89
87
|
end
|
90
88
|
end
|
@@ -93,9 +91,9 @@ module Mementus
|
|
93
91
|
def process(graph, node)
|
94
92
|
incoming = []
|
95
93
|
|
96
|
-
graph.each_node do |
|
97
|
-
graph.each_adjacent(
|
98
|
-
incoming <<
|
94
|
+
graph.each_node do |graph_node|
|
95
|
+
graph.each_adjacent(graph_node.id) do |adj_node|
|
96
|
+
incoming << graph_node if adj_node.id == node.id
|
99
97
|
end
|
100
98
|
end
|
101
99
|
|
@@ -108,9 +106,9 @@ module Mementus
|
|
108
106
|
ids = source.respond_to?(:id) ? [source.id] : source.map(&:id)
|
109
107
|
incoming = []
|
110
108
|
|
111
|
-
graph.each_node do |
|
112
|
-
graph.each_adjacent(
|
113
|
-
incoming << Mementus::Edge.new(
|
109
|
+
graph.each_node do |graph_node|
|
110
|
+
graph.each_adjacent(graph_node.id) do |adj_node|
|
111
|
+
incoming << Mementus::Edge.new(from: graph_node, to: adj_node) if ids.include?(adj_node.id)
|
114
112
|
end
|
115
113
|
end
|
116
114
|
|
data/lib/mementus/query/step.rb
CHANGED
@@ -20,13 +20,13 @@ module Mementus
|
|
20
20
|
@is_directed
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def set_node(node)
|
24
24
|
@index[node.id] ||= Set.new
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
27
|
+
def set_edge(edge)
|
28
|
+
set_node(edge.from) unless has_node?(edge.from)
|
29
|
+
set_node(edge.to) unless has_node?(edge.to)
|
30
30
|
|
31
31
|
@index[edge.from.id].add(edge.to.id)
|
32
32
|
@index[edge.to.id].add(edge.from.id) unless directed?
|
@@ -41,11 +41,11 @@ module Mementus
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def node(id)
|
44
|
-
NodeProxy.new(id, self)
|
44
|
+
NodeProxy.new(Node.new(id: id), self)
|
45
45
|
end
|
46
46
|
|
47
47
|
def nodes
|
48
|
-
@index.keys.map { |id| NodeProxy.new(id, self) }
|
48
|
+
@index.keys.map { |id| NodeProxy.new(Node.new(id: id), self) }
|
49
49
|
end
|
50
50
|
|
51
51
|
def adjacent(id)
|
@@ -64,7 +64,7 @@ module Mementus
|
|
64
64
|
if directed?
|
65
65
|
each_node do |from|
|
66
66
|
each_adjacent(from.id) do |to|
|
67
|
-
yield Edge.new(from, to)
|
67
|
+
yield Edge.new(from: from, to: to)
|
68
68
|
end
|
69
69
|
end
|
70
70
|
else
|
@@ -26,26 +26,30 @@ module Mementus
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def has_edge?(edge)
|
29
|
-
@edges.key?(
|
29
|
+
@edges.key?(edge.id)
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
33
|
-
@nodes[node.id] = node
|
32
|
+
def set_node(node)
|
33
|
+
@nodes[node.id] = NodeProxy.new(node, self)
|
34
34
|
@outgoing[node.id] ||= []
|
35
35
|
@incoming[node.id] ||= []
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
39
|
-
|
40
|
-
|
38
|
+
def set_edge(edge)
|
39
|
+
set_node(edge.from) unless has_node?(edge.from)
|
40
|
+
set_node(edge.to) unless has_node?(edge.to)
|
41
41
|
|
42
|
-
@edges[
|
42
|
+
@edges[edge.id] = edge
|
43
43
|
@outgoing[edge.from.id] << edge.to.id
|
44
44
|
@incoming[edge.to.id] << edge.from.id
|
45
45
|
end
|
46
46
|
|
47
|
+
def edge(id)
|
48
|
+
@edges[id]
|
49
|
+
end
|
50
|
+
|
47
51
|
def node(id)
|
48
|
-
|
52
|
+
@nodes[id]
|
49
53
|
end
|
50
54
|
|
51
55
|
def each_node(&block)
|
@@ -53,15 +57,15 @@ module Mementus
|
|
53
57
|
end
|
54
58
|
|
55
59
|
def nodes
|
56
|
-
@nodes.
|
60
|
+
@nodes.values
|
57
61
|
end
|
58
62
|
|
59
63
|
def adjacent(id)
|
60
|
-
@outgoing[id]
|
64
|
+
@nodes.values_at(*@outgoing[id])
|
61
65
|
end
|
62
66
|
|
63
67
|
def each_adjacent(id, &blk)
|
64
|
-
|
68
|
+
adjacent(id).each(&blk)
|
65
69
|
end
|
66
70
|
end
|
67
71
|
end
|
data/lib/mementus/version.rb
CHANGED
data/lib/mementus.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
1
|
+
require 'mementus/graph'
|
2
|
+
require 'mementus/structure/adjacency_list'
|
3
|
+
require 'mementus/structure/incidence_list'
|
4
|
+
require 'mementus/node'
|
5
|
+
require 'mementus/edge'
|
6
|
+
require 'mementus/node_proxy'
|
7
|
+
require 'mementus/pipeline'
|
8
|
+
require 'mementus/depth_first_search'
|
9
|
+
require 'mementus/breadth_first_search'
|
10
|
+
require 'mementus/query/traversal'
|
11
|
+
require 'mementus/query/source'
|
12
|
+
require 'mementus/query/step'
|
13
|
+
require 'mementus/query/traversal'
|
14
|
+
require 'mementus/integer_id'
|
15
|
+
require 'mementus/element_builder'
|
16
|
+
require 'mementus/graph_builder'
|
17
|
+
require 'mementus/node_builder'
|
18
|
+
require 'mementus/edge_builder'
|
19
|
+
require 'mementus/direction'
|
data/spec/edge_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Mementus::Edge do
|
4
4
|
it 'should initialize with integer ids' do
|
5
|
-
edge = Mementus::Edge.new(1, 2)
|
5
|
+
edge = Mementus::Edge.new(from: 1, to: 2)
|
6
6
|
|
7
7
|
expect(edge.from).to be_a(Mementus::Node)
|
8
8
|
expect(edge.from.id).to eq(1)
|
@@ -11,7 +11,7 @@ describe Mementus::Edge do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'should initialize with node instances' do
|
14
|
-
edge = Mementus::Edge.new(Mementus::Node.new(1), Mementus::Node.new(2))
|
14
|
+
edge = Mementus::Edge.new(from: Mementus::Node.new(id: 1), to: Mementus::Node.new(id: 2))
|
15
15
|
|
16
16
|
expect(edge.from).to be_a(Mementus::Node)
|
17
17
|
expect(edge.from.id).to eq(1)
|
@@ -20,14 +20,14 @@ describe Mementus::Edge do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'should initialize with label given' do
|
23
|
-
edge = Mementus::Edge.new(1, 2, :relationship)
|
23
|
+
edge = Mementus::Edge.new(from: 1, to: 2, label: :relationship)
|
24
24
|
|
25
25
|
expect(edge.label).to eq(:relationship)
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'should test equality based on value' do
|
29
|
-
edge1 = Mementus::Edge.new(1, 2, :relationship)
|
30
|
-
edge2 = Mementus::Edge.new(1, 2, :relationship)
|
29
|
+
edge1 = Mementus::Edge.new(from: 1, to: 2, label: :relationship)
|
30
|
+
edge2 = Mementus::Edge.new(from: 1, to: 2, label: :relationship)
|
31
31
|
|
32
32
|
expect(edge1).to eq(edge2)
|
33
33
|
expect(edge1.hash).to eq(edge2.hash)
|
data/spec/graph_spec.rb
CHANGED
@@ -8,13 +8,23 @@ describe Mementus::Graph do
|
|
8
8
|
expect(graph.edges_count).to eq(0)
|
9
9
|
end
|
10
10
|
|
11
|
+
specify '#set_node' do
|
12
|
+
graph = Mementus::Graph.new do
|
13
|
+
set_node(node_1)
|
14
|
+
end
|
15
|
+
|
16
|
+
expect(graph.nodes_count).to eq(1)
|
17
|
+
expect(graph.edges_count).to eq(0)
|
18
|
+
end
|
19
|
+
|
11
20
|
specify '#add_node' do
|
12
21
|
graph = Mementus::Graph.new do
|
13
|
-
add_node(
|
22
|
+
add_node(id: 1)
|
14
23
|
end
|
15
24
|
|
16
25
|
expect(graph.nodes_count).to eq(1)
|
17
26
|
expect(graph.edges_count).to eq(0)
|
27
|
+
expect(graph.node(1).id).to eq(1)
|
18
28
|
end
|
19
29
|
|
20
30
|
specify '#create_node' do
|
@@ -27,12 +37,23 @@ describe Mementus::Graph do
|
|
27
37
|
|
28
38
|
expect(graph.nodes_count).to eq(1)
|
29
39
|
expect(graph.edges_count).to eq(0)
|
40
|
+
expect(graph.node(20).id).to eq(20)
|
41
|
+
end
|
42
|
+
|
43
|
+
specify '#set_edge' do
|
44
|
+
graph = Mementus::Graph.new do
|
45
|
+
set_edge(edge_1_2)
|
46
|
+
end
|
47
|
+
|
48
|
+
expect(graph.nodes_count).to eq(2)
|
49
|
+
expect(graph.edges_count).to eq(1)
|
30
50
|
expect(graph.node(1).id).to eq(1)
|
51
|
+
expect(graph.node(2).id).to eq(2)
|
31
52
|
end
|
32
53
|
|
33
54
|
specify '#add_edge' do
|
34
55
|
graph = Mementus::Graph.new do
|
35
|
-
add_edge(
|
56
|
+
add_edge(id: 3, from: 1, to: 2)
|
36
57
|
end
|
37
58
|
|
38
59
|
expect(graph.nodes_count).to eq(2)
|
@@ -44,6 +65,7 @@ describe Mementus::Graph do
|
|
44
65
|
specify '#create_edge' do
|
45
66
|
graph = Mementus::Graph.new do
|
46
67
|
create_edge do |edge|
|
68
|
+
edge.id = 123
|
47
69
|
edge.label = :relationship
|
48
70
|
edge.from = "A"
|
49
71
|
edge.to = "B"
|
@@ -52,42 +74,39 @@ describe Mementus::Graph do
|
|
52
74
|
|
53
75
|
expect(graph.nodes_count).to eq(2)
|
54
76
|
expect(graph.edges_count).to eq(1)
|
77
|
+
expect(graph.edge(123).id).to eq(123)
|
55
78
|
end
|
56
79
|
|
57
80
|
specify '#has_node?' do
|
58
|
-
node = Mementus::Node.new(1, :node)
|
59
81
|
graph = Mementus::Graph.new do
|
60
|
-
|
82
|
+
set_node(node_1)
|
61
83
|
end
|
62
84
|
|
63
|
-
expect(graph.has_node?(
|
85
|
+
expect(graph.has_node?(node_1)).to be true
|
64
86
|
end
|
65
87
|
|
66
88
|
specify '#has_edge?' do
|
67
|
-
edge = Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(2, :node))
|
68
89
|
graph = Mementus::Graph.new do
|
69
|
-
|
90
|
+
set_edge(edge_1_2)
|
70
91
|
end
|
71
92
|
|
72
|
-
expect(graph.has_edge?(
|
93
|
+
expect(graph.has_edge?(edge_1_2)).to be true
|
73
94
|
end
|
74
95
|
|
75
96
|
specify '#node(id)' do
|
76
|
-
edge = Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(2, :node))
|
77
97
|
graph = Mementus::Graph.new do
|
78
|
-
|
98
|
+
set_edge(edge_1_2)
|
79
99
|
end
|
80
100
|
|
81
|
-
expect(graph.node(1).id).to eq(
|
101
|
+
expect(graph.node(1).id).to eq(edge_1_2.from.id)
|
82
102
|
end
|
83
103
|
|
84
104
|
specify '#nodes(filter)' do
|
85
|
-
edge = Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(2, :node))
|
86
105
|
graph = Mementus::Graph.new do
|
87
|
-
|
106
|
+
set_edge(edge_1_2)
|
88
107
|
end
|
89
108
|
|
90
|
-
expect(graph.nodes.first.id).to eq(
|
91
|
-
expect(graph.nodes.last.id).to eq(
|
109
|
+
expect(graph.nodes.first.id).to eq(edge_1_2.from.id)
|
110
|
+
expect(graph.nodes.last.id).to eq(edge_1_2.to.id)
|
92
111
|
end
|
93
112
|
end
|
data/spec/node_proxy_spec.rb
CHANGED
@@ -1,16 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Mementus::NodeProxy do
|
4
|
-
specify '#
|
5
|
-
node1 = Mementus::Node.new(1, :node)
|
6
|
-
node2 = Mementus::Node.new(2, :node)
|
7
|
-
node3 = Mementus::Node.new(3, :node)
|
4
|
+
specify '#adjacent' do
|
8
5
|
graph = Mementus::Graph.new do
|
9
|
-
|
10
|
-
|
6
|
+
set_edge(edge_1_2)
|
7
|
+
set_edge(edge_1_3)
|
11
8
|
end
|
12
9
|
|
13
|
-
node_proxy = Mementus::NodeProxy.new(
|
14
|
-
expect(node_proxy.adjacent.map { |node| node.id}).to eq([
|
10
|
+
node_proxy = Mementus::NodeProxy.new(node_1, graph)
|
11
|
+
expect(node_proxy.adjacent.map { |node| node.id }).to eq([node_2.id, node_3.id])
|
15
12
|
end
|
16
13
|
end
|
data/spec/node_spec.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mementus::Node do
|
4
|
+
it 'should initialize with id' do
|
5
|
+
node = Mementus::Node.new(id: 22)
|
6
|
+
|
7
|
+
expect(node.id).to eq(22)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should initialize with id and label' do
|
11
|
+
node = Mementus::Node.new(id: 22, label: :vertex)
|
12
|
+
|
13
|
+
expect(node.id).to eq(22)
|
14
|
+
expect(node.label).to eq(:vertex)
|
15
|
+
end
|
16
|
+
end
|
data/spec/query_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Mementus::Query do
|
4
4
|
let(:graph) do
|
5
5
|
Mementus::Graph.new do
|
6
|
-
|
6
|
+
set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 1),to: Mementus::Node.new(id: 2)))
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,23 @@
|
|
1
1
|
require 'rspec'
|
2
2
|
require 'mementus'
|
3
3
|
require 'mementus/library'
|
4
|
+
|
5
|
+
def node_1
|
6
|
+
Mementus::Node.new(id: 1)
|
7
|
+
end
|
8
|
+
|
9
|
+
def node_2
|
10
|
+
Mementus::Node.new(id: 2)
|
11
|
+
end
|
12
|
+
|
13
|
+
def node_3
|
14
|
+
Mementus::Node.new(id: 2)
|
15
|
+
end
|
16
|
+
|
17
|
+
def edge_1_2
|
18
|
+
Mementus::Edge.new(from: node_1, to: node_2)
|
19
|
+
end
|
20
|
+
|
21
|
+
def edge_1_3
|
22
|
+
Mementus::Edge.new(from: node_1, to: node_3)
|
23
|
+
end
|
data/spec/structure_spec.rb
CHANGED
@@ -11,18 +11,18 @@ shared_examples_for "a mutable graph data structure" do
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
describe '#
|
15
|
-
it '
|
16
|
-
structure.
|
14
|
+
describe '#set_node' do
|
15
|
+
it 'assigns a node object to the graph' do
|
16
|
+
structure.set_node(Mementus::Node.new(id: 1))
|
17
17
|
|
18
18
|
expect(structure.nodes_count).to eq(1)
|
19
19
|
expect(structure.edges_count).to eq(0)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
describe '#
|
23
|
+
describe '#set_edge' do
|
24
24
|
it 'adds an edge object to the graph' do
|
25
|
-
structure.
|
25
|
+
structure.set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 1), to: Mementus::Node.new(id: 2)))
|
26
26
|
|
27
27
|
expect(structure.nodes_count).to eq(2)
|
28
28
|
expect(structure.edges_count).to eq(1)
|
@@ -31,8 +31,8 @@ shared_examples_for "a mutable graph data structure" do
|
|
31
31
|
|
32
32
|
describe '#has_node?' do
|
33
33
|
it 'tests for the presence of a given node' do
|
34
|
-
node = Mementus::Node.new(1
|
35
|
-
structure.
|
34
|
+
node = Mementus::Node.new(id: 1)
|
35
|
+
structure.set_node(node)
|
36
36
|
|
37
37
|
expect(structure.has_node?(node)).to be true
|
38
38
|
end
|
@@ -40,8 +40,8 @@ shared_examples_for "a mutable graph data structure" do
|
|
40
40
|
|
41
41
|
describe '#has_edge?' do
|
42
42
|
it 'tests for the presence of a given edge' do
|
43
|
-
edge = Mementus::Edge.new(Mementus::Node.new(1, :
|
44
|
-
structure.
|
43
|
+
edge = Mementus::Edge.new(from: Mementus::Node.new(id: 1), to: Mementus::Node.new(id: 2))
|
44
|
+
structure.set_edge(edge)
|
45
45
|
|
46
46
|
expect(structure.has_edge?(edge)).to be true
|
47
47
|
end
|
@@ -49,8 +49,8 @@ shared_examples_for "a mutable graph data structure" do
|
|
49
49
|
|
50
50
|
describe '#node(id)' do
|
51
51
|
it 'finds a node by id' do
|
52
|
-
edge = Mementus::Edge.new(Mementus::Node.new(1, :
|
53
|
-
structure.
|
52
|
+
edge = Mementus::Edge.new(from: Mementus::Node.new(id: 1), to: Mementus::Node.new(id: 2))
|
53
|
+
structure.set_edge(edge)
|
54
54
|
|
55
55
|
expect(structure.node(1).id).to eq(edge.from.id)
|
56
56
|
end
|
@@ -58,8 +58,8 @@ shared_examples_for "a mutable graph data structure" do
|
|
58
58
|
|
59
59
|
describe '#nodes' do
|
60
60
|
it 'lists all nodes in the graph' do
|
61
|
-
edge = Mementus::Edge.new(Mementus::Node.new(1, :
|
62
|
-
structure.
|
61
|
+
edge = Mementus::Edge.new(from: Mementus::Node.new(id: 1), to: Mementus::Node.new(id: 2))
|
62
|
+
structure.set_edge(edge)
|
63
63
|
|
64
64
|
expect(structure.nodes.first.id).to eq(edge.from.id)
|
65
65
|
expect(structure.nodes.last.id).to eq(edge.to.id)
|
data/spec/traversal_spec.rb
CHANGED
@@ -3,13 +3,13 @@ require 'spec_helper'
|
|
3
3
|
describe 'Basic graph traversals' do
|
4
4
|
let(:graph) do
|
5
5
|
Mementus::Graph.new do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 1), to: Mementus::Node.new(id: 2)))
|
7
|
+
set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 2), to: Mementus::Node.new(id: 3)))
|
8
|
+
set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 2), to: Mementus::Node.new(id: 5)))
|
9
|
+
set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 1), to: Mementus::Node.new(id: 6)))
|
10
|
+
set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 2), to: Mementus::Node.new(id: 7)))
|
11
|
+
set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 7), to: Mementus::Node.new(id: 8)))
|
12
|
+
set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 5), to: Mementus::Node.new(id: 9)))
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mementus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- maetl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -64,13 +64,13 @@ files:
|
|
64
64
|
- Gemfile
|
65
65
|
- LICENSE.txt
|
66
66
|
- README.md
|
67
|
-
- Rakefile
|
68
67
|
- lib/mementus.rb
|
69
68
|
- lib/mementus/breadth_first_search.rb
|
70
69
|
- lib/mementus/depth_first_search.rb
|
71
70
|
- lib/mementus/direction.rb
|
72
71
|
- lib/mementus/edge.rb
|
73
72
|
- lib/mementus/edge_builder.rb
|
73
|
+
- lib/mementus/element_builder.rb
|
74
74
|
- lib/mementus/graph.rb
|
75
75
|
- lib/mementus/graph_builder.rb
|
76
76
|
- lib/mementus/integer_id.rb
|
@@ -93,6 +93,7 @@ files:
|
|
93
93
|
- spec/herschel_spec.rb
|
94
94
|
- spec/integer_id_spec.rb
|
95
95
|
- spec/node_proxy_spec.rb
|
96
|
+
- spec/node_spec.rb
|
96
97
|
- spec/pipeline_spec.rb
|
97
98
|
- spec/query_spec.rb
|
98
99
|
- spec/spec_helper.rb
|
@@ -129,6 +130,7 @@ test_files:
|
|
129
130
|
- spec/herschel_spec.rb
|
130
131
|
- spec/integer_id_spec.rb
|
131
132
|
- spec/node_proxy_spec.rb
|
133
|
+
- spec/node_spec.rb
|
132
134
|
- spec/pipeline_spec.rb
|
133
135
|
- spec/query_spec.rb
|
134
136
|
- spec/spec_helper.rb
|
data/Rakefile
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require "bundler/gem_tasks"
|