mementus 0.3.3 → 0.3.4
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.
- checksums.yaml +4 -4
- data/lib/mementus/edge.rb +20 -24
- data/lib/mementus/pipeline.rb +32 -0
- data/lib/mementus/version.rb +1 -1
- data/lib/mementus.rb +1 -0
- data/spec/edge_spec.rb +35 -0
- data/spec/pipeline_spec.rb +12 -0
- data/spec/structure_spec.rb +60 -31
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68a2c93ad9bdaedbd2d5ca511da4ac9f7d37e032
|
4
|
+
data.tar.gz: 4c91f58f3e77c009595759c4fc895f496bf2e8d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3f45b1dd11463fb0259b7c48d4024b0e4de41652acec66d0ea9e531474c26eedf221e4ea2985b8e6fbb6e45c654e3f3fe7bbb392402b25349ef4df204d38ec7
|
7
|
+
data.tar.gz: 822ede8244fb90e52fb8d489ab01b6822b9dadb2120911c1e26c184206405c574b75c1f53c6f84b62aac5d29e617e3024e68a9b86e81aa2bea290bbd0c16e7bf
|
data/lib/mementus/edge.rb
CHANGED
@@ -1,30 +1,20 @@
|
|
1
1
|
module Mementus
|
2
2
|
class Edge
|
3
|
-
attr_reader :from, :to, :label
|
3
|
+
attr_reader :from, :to, :label, :id
|
4
4
|
|
5
|
-
def initialize(from
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def from=(node, label=:node)
|
12
|
-
if node.is_a?(Node)
|
13
|
-
@from = node
|
14
|
-
else
|
15
|
-
@from = Node.new(node, label)
|
16
|
-
end
|
17
|
-
end
|
5
|
+
def initialize(from, to, label=:edge)
|
6
|
+
@from = if from.is_a?(Integer)
|
7
|
+
Node.new(from)
|
8
|
+
else
|
9
|
+
from
|
10
|
+
end
|
18
11
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
12
|
+
@to = if to.is_a?(Integer)
|
13
|
+
Node.new(to)
|
14
|
+
else
|
15
|
+
to
|
16
|
+
end
|
26
17
|
|
27
|
-
def label=(label)
|
28
18
|
@label = label
|
29
19
|
end
|
30
20
|
|
@@ -32,8 +22,14 @@ module Mementus
|
|
32
22
|
[@from, @to]
|
33
23
|
end
|
34
24
|
|
35
|
-
def
|
36
|
-
|
25
|
+
def ==(edge)
|
26
|
+
from.id == edge.from.id && to.id == edge.to.id && label == edge.label
|
27
|
+
end
|
28
|
+
|
29
|
+
alias :eql? :==
|
30
|
+
|
31
|
+
def hash
|
32
|
+
[from.id, to.id].hash
|
37
33
|
end
|
38
34
|
end
|
39
35
|
end
|
data/lib/mementus/pipeline.rb
CHANGED
@@ -40,10 +40,20 @@ module Mementus
|
|
40
40
|
self
|
41
41
|
end
|
42
42
|
|
43
|
+
def out_e
|
44
|
+
append_next(Pipes::OutgoingEdges.new)
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
43
48
|
def in
|
44
49
|
append_next(Pipes::Incoming.new)
|
45
50
|
self
|
46
51
|
end
|
52
|
+
|
53
|
+
def in_e
|
54
|
+
append_next(Pipes::IncomingEdges.new)
|
55
|
+
self
|
56
|
+
end
|
47
57
|
end
|
48
58
|
|
49
59
|
module Pipes
|
@@ -65,6 +75,14 @@ module Mementus
|
|
65
75
|
end
|
66
76
|
end
|
67
77
|
|
78
|
+
class OutgoingEdges
|
79
|
+
def process(graph, node)
|
80
|
+
graph.each_adjacent(node.id).map do |id|
|
81
|
+
Mementus::Edge.new(node, id)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
68
86
|
class Incoming
|
69
87
|
def process(graph, node)
|
70
88
|
incoming = []
|
@@ -78,5 +96,19 @@ module Mementus
|
|
78
96
|
incoming
|
79
97
|
end
|
80
98
|
end
|
99
|
+
|
100
|
+
class IncomingEdges
|
101
|
+
def process(graph, node)
|
102
|
+
incoming = []
|
103
|
+
|
104
|
+
graph.each_node do |n|
|
105
|
+
graph.each_adjacent(n.id) do |id|
|
106
|
+
incoming << Mementus::Edge.new(n.id, id)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
incoming
|
111
|
+
end
|
112
|
+
end
|
81
113
|
end
|
82
114
|
end
|
data/lib/mementus/version.rb
CHANGED
data/lib/mementus.rb
CHANGED
data/spec/edge_spec.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mementus::Edge do
|
4
|
+
it 'should initialize with integer ids' do
|
5
|
+
edge = Mementus::Edge.new(1, 2)
|
6
|
+
|
7
|
+
expect(edge.from).to be_a(Mementus::Node)
|
8
|
+
expect(edge.from.id).to eq(1)
|
9
|
+
expect(edge.to).to be_a(Mementus::Node)
|
10
|
+
expect(edge.to.id).to eq(2)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should initialize with node instances' do
|
14
|
+
edge = Mementus::Edge.new(Mementus::Node.new(1), Mementus::Node.new(2))
|
15
|
+
|
16
|
+
expect(edge.from).to be_a(Mementus::Node)
|
17
|
+
expect(edge.from.id).to eq(1)
|
18
|
+
expect(edge.to).to be_a(Mementus::Node)
|
19
|
+
expect(edge.to.id).to eq(2)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should initialize with label given' do
|
23
|
+
edge = Mementus::Edge.new(1, 2, :relationship)
|
24
|
+
|
25
|
+
expect(edge.label).to eq(:relationship)
|
26
|
+
end
|
27
|
+
|
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)
|
31
|
+
|
32
|
+
expect(edge1).to eq(edge2)
|
33
|
+
expect(edge1.hash).to eq(edge2.hash)
|
34
|
+
end
|
35
|
+
end
|
data/spec/pipeline_spec.rb
CHANGED
@@ -34,9 +34,21 @@ describe 'pipeline api' do
|
|
34
34
|
expect(pipeline.all.first.id).to eq(2)
|
35
35
|
end
|
36
36
|
|
37
|
+
it 'traverses to outgoing edges' do
|
38
|
+
pipeline = graph.n(1).out_e
|
39
|
+
expect(pipeline.all.count).to eq(1)
|
40
|
+
expect(pipeline.all.first.to.id).to eq(2)
|
41
|
+
end
|
42
|
+
|
37
43
|
it 'traverses to incoming nodes' do
|
38
44
|
pipeline = graph.n(2).in
|
39
45
|
expect(pipeline.all.count).to eq(1)
|
40
46
|
expect(pipeline.all.first.id).to eq(1)
|
41
47
|
end
|
48
|
+
|
49
|
+
it 'traverses to incoming edges' do
|
50
|
+
pipeline = graph.n(2).in_e
|
51
|
+
expect(pipeline.all.count).to eq(1)
|
52
|
+
expect(pipeline.all.first.from.id).to eq(1)
|
53
|
+
end
|
42
54
|
end
|
data/spec/structure_spec.rb
CHANGED
@@ -1,55 +1,84 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
shared_examples_for "a mutable graph data structure" do
|
4
|
+
describe '#new' do
|
5
|
+
it 'starts with empty node list' do
|
6
|
+
expect(structure.nodes_count).to eq(0)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'starts with empty edge list' do
|
10
|
+
expect(structure.edges_count).to eq(0)
|
11
|
+
end
|
6
12
|
end
|
7
13
|
|
8
|
-
|
9
|
-
|
10
|
-
|
14
|
+
describe '#add_node' do
|
15
|
+
it 'adds a node object to the graph' do
|
16
|
+
structure.add_node(Mementus::Node.new(1, :node))
|
17
|
+
|
18
|
+
expect(structure.nodes_count).to eq(1)
|
19
|
+
expect(structure.edges_count).to eq(0)
|
20
|
+
end
|
11
21
|
end
|
12
22
|
|
13
|
-
|
14
|
-
|
23
|
+
describe '#add_edge' do
|
24
|
+
it 'adds an edge object to the graph' do
|
25
|
+
structure.add_edge(Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(2, :node)))
|
15
26
|
|
16
|
-
|
17
|
-
|
27
|
+
expect(structure.nodes_count).to eq(2)
|
28
|
+
expect(structure.edges_count).to eq(1)
|
29
|
+
end
|
18
30
|
end
|
19
31
|
|
20
|
-
|
21
|
-
|
32
|
+
describe '#has_node?' do
|
33
|
+
it 'tests for the presence of a given node' do
|
34
|
+
node = Mementus::Node.new(1, :node)
|
35
|
+
structure.add_node(node)
|
22
36
|
|
23
|
-
|
24
|
-
|
37
|
+
expect(structure.has_node?(node)).to be true
|
38
|
+
end
|
25
39
|
end
|
26
40
|
|
27
|
-
|
28
|
-
|
29
|
-
|
41
|
+
describe '#has_edge?' do
|
42
|
+
it 'tests for the presence of a given edge' do
|
43
|
+
edge = Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(2, :node))
|
44
|
+
structure.add_edge(edge)
|
30
45
|
|
31
|
-
|
46
|
+
expect(structure.has_edge?(edge)).to be true
|
47
|
+
end
|
32
48
|
end
|
33
49
|
|
34
|
-
|
35
|
-
|
36
|
-
|
50
|
+
describe '#node(id)' do
|
51
|
+
it 'finds a node by id' do
|
52
|
+
edge = Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(2, :node))
|
53
|
+
structure.add_edge(edge)
|
37
54
|
|
38
|
-
|
55
|
+
expect(structure.node(1).id).to eq(edge.from.id)
|
56
|
+
end
|
39
57
|
end
|
40
58
|
|
41
|
-
|
42
|
-
|
43
|
-
|
59
|
+
describe '#nodes' do
|
60
|
+
it 'lists all nodes in the graph' do
|
61
|
+
edge = Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(2, :node))
|
62
|
+
structure.add_edge(edge)
|
63
|
+
|
64
|
+
expect(structure.nodes.first.id).to eq(edge.from.id)
|
65
|
+
expect(structure.nodes.last.id).to eq(edge.to.id)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
44
69
|
|
45
|
-
|
70
|
+
describe Mementus::Structure::AdjacencyList do
|
71
|
+
let(:structure) do
|
72
|
+
Mementus::Structure::AdjacencyList.new
|
46
73
|
end
|
47
74
|
|
48
|
-
|
49
|
-
|
50
|
-
structure.add_edge(edge)
|
75
|
+
it_behaves_like "a mutable graph data structure"
|
76
|
+
end
|
51
77
|
|
52
|
-
|
53
|
-
|
78
|
+
describe Mementus::Structure::IncidenceList do
|
79
|
+
let(:structure) do
|
80
|
+
Mementus::Structure::IncidenceList.new
|
54
81
|
end
|
82
|
+
|
83
|
+
it_behaves_like "a mutable graph data structure"
|
55
84
|
end
|
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.3.
|
4
|
+
version: 0.3.4
|
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-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- lib/mementus/version.rb
|
86
86
|
- mementus.gemspec
|
87
87
|
- spec/direction_spec.rb
|
88
|
+
- spec/edge_spec.rb
|
88
89
|
- spec/graph_spec.rb
|
89
90
|
- spec/integer_id_spec.rb
|
90
91
|
- spec/node_proxy_spec.rb
|
@@ -119,6 +120,7 @@ specification_version: 4
|
|
119
120
|
summary: Graph data structure toolkit for Ruby applications.
|
120
121
|
test_files:
|
121
122
|
- spec/direction_spec.rb
|
123
|
+
- spec/edge_spec.rb
|
122
124
|
- spec/graph_spec.rb
|
123
125
|
- spec/integer_id_spec.rb
|
124
126
|
- spec/node_proxy_spec.rb
|