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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ed27745c387e4e0efed9720fed30792a3535e45
4
- data.tar.gz: 34ce7eccc734f7485125cf3568fb56f52cc0ffbc
3
+ metadata.gz: a4a89d482eebdd901269f7a93501a22883a3b084
4
+ data.tar.gz: 571323b9865fb729fc2a8b63e70d727a5108a90f
5
5
  SHA512:
6
- metadata.gz: 74239d3b58b80ec179dd5dfd7f7013ed42ec23e616f9050da61c1ce6f580aa1256d4ae4958b4280fa1030c9ccfa58638da89971bd44ef3ce0604f82fb2a1c8c5
7
- data.tar.gz: 68306108232cae430a41f3e51f7df7d14c272c0fa1bc1cc9e5e226bc237c1c00e1cd1c4457053138194bffe7eab15fada9ee1ca1fc32a9f2925ef7b20c6d78d1
6
+ metadata.gz: 8182797b06e55efe935305ec6067007ae569adbf90ceac25aaf2b990a74495bf64597efd023f24be7d8f6e5ce8bfb59b77da8de666454a7f3f5fdb018c49c42d
7
+ data.tar.gz: 9151ad44dbcc2570de6e58d60e5e967de8c4ce1ae9441795a63f37ae8bac8ca64cbf1596a15d5a277635fd15b135ae08f3596e4253c5297dcedc63e502bec6da
data/.travis.yml CHANGED
@@ -1,10 +1,9 @@
1
1
  language: ruby
2
-
3
- cache: bundler
4
-
5
2
  rvm:
6
3
  - 2.1
7
- - 2.0
8
- - 1.9.3
9
-
10
- script: bundle exec rspec
4
+ - 2.2
5
+ - rbx-2
6
+ - jruby-9
7
+ - jruby-head
8
+ before_install: gem install bundler -v 1.10.6
9
+ script: bundle exec rspec
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Mementus
2
- VERSION = "0.2.0"
2
+ VERSION = '0.2.1'.freeze
3
3
  end
data/lib/mementus.rb CHANGED
@@ -1,3 +1,6 @@
1
1
  require_relative 'mementus/graph'
2
2
  require_relative 'mementus/node'
3
3
  require_relative 'mementus/edge'
4
+ require_relative 'mementus/node_proxy'
5
+ require_relative 'mementus/depth_first_search'
6
+ require_relative 'mementus/breadth_first_search'
@@ -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.0
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: