mementus 0.3.1 → 0.3.2

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: 5a5329b3dc6e0429a47324ea39971d0cd87320ea
4
- data.tar.gz: e4e2469c67e5368f014d7ef870bb9846c6b57521
3
+ metadata.gz: a0126b1888b05fb3dd49b14c39ba3cadfe20cbe2
4
+ data.tar.gz: a67cd6c07c156e995837918d0a9267c6230dd7a1
5
5
  SHA512:
6
- metadata.gz: 9c551118086f9c08fe6d60127c7f7bf8eb41a4ee2a0c9a0834dde157e05087316ae2189dffc5d2f16ab8f35273dab928a4fc65e4269dab5d25945c465aa725a2
7
- data.tar.gz: cac72cbf24feba518297dcf86e9a331a058920ec9d1bf15213f3fa294d4fb36ecffb4b4cabc2e66b0e5f22613b71907946be6f0f9103aa95c5c808e074b97f31
6
+ metadata.gz: 88b26e50130d2ebddf6d58ecff8d5925f237fddbe4b218e7b2270a53152c33092d1dd41ed03140d8c23eb2614c5506f1d0c1292654814b8ddc3fd589383e5345
7
+ data.tar.gz: 63630f975adab34a760e7127795eabe30b756e74bf84fa3cfc68280fc0c6c34a3ef4900e6b7da8c8bc25637e0e6d2e63661126d877a5eebfecd3adfde7aefc86
@@ -1,7 +1,7 @@
1
1
  module Mementus
2
2
  class GraphBuilder
3
3
  def initialize(is_directed)
4
- @structure = Structure.new(is_directed)
4
+ @structure = Structure::AdjacencyList.new(is_directed)
5
5
  end
6
6
 
7
7
  def add_node(node)
@@ -9,10 +9,6 @@ module Mementus
9
9
  @id
10
10
  end
11
11
 
12
- def label
13
- @node.label
14
- end
15
-
16
12
  def each_adjacent(&block)
17
13
  @graph.each_adjacent(@id, &block)
18
14
  end
@@ -0,0 +1,63 @@
1
+ module Mementus
2
+ class Processor
3
+ def initialize(graph, start_pipe)
4
+ @graph = graph
5
+ @pipeline = [start_pipe]
6
+ end
7
+
8
+ def append_next(pipe)
9
+ @pipeline << pipe
10
+ end
11
+
12
+ def process
13
+ output = nil
14
+ @pipeline.each do |pipe|
15
+ output = pipe.process(@graph, output)
16
+ end
17
+ output
18
+ end
19
+
20
+ def id
21
+ process.id
22
+ end
23
+
24
+ def one
25
+ output = process
26
+
27
+ if output.respond_to?(:each)
28
+ output.first
29
+ else
30
+ output
31
+ end
32
+ end
33
+
34
+ def all
35
+ process.to_a
36
+ end
37
+
38
+ def out
39
+ append_next(Pipes::Out.new)
40
+ self
41
+ end
42
+ end
43
+
44
+ module Pipes
45
+ class Node
46
+ def initialize(id)
47
+ @id = id
48
+ end
49
+
50
+ def process(graph, id)
51
+ graph.node(id || @id)
52
+ end
53
+ end
54
+
55
+ class Out
56
+ def process(graph, node)
57
+ graph.each_adjacent(node.id).map do |id|
58
+ Mementus::NodeProxy.new(id, graph)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,76 @@
1
+ module Mementus
2
+ module Structure
3
+ class AdjacencyList
4
+ def initialize(is_directed=true)
5
+ @index = {}
6
+ @is_directed = is_directed
7
+ end
8
+
9
+ def nodes_count
10
+ @index.size
11
+ end
12
+
13
+ def edges_count
14
+ c = 0
15
+ each_edge { c += 1 }
16
+ c
17
+ end
18
+
19
+ def directed?
20
+ @is_directed
21
+ end
22
+
23
+ def add_node(node)
24
+ @index[node.id] ||= Set.new
25
+ end
26
+
27
+ def add_edge(edge)
28
+ add_node(edge.from) unless has_node?(edge.from)
29
+ add_node(edge.to) unless has_node?(edge.to)
30
+
31
+ @index[edge.from.id].add(edge.to.id)
32
+ @index[edge.to.id].add(edge.from.id) unless directed?
33
+ end
34
+
35
+ def has_node?(node)
36
+ @index.key?(node.id)
37
+ end
38
+
39
+ def has_edge?(edge)
40
+ has_node?(edge.from) && @index[edge.from.id].include?(edge.to.id)
41
+ end
42
+
43
+ def node(id)
44
+ NodeProxy.new(id, self)
45
+ end
46
+
47
+ def nodes
48
+ @index.keys.map { |id| NodeProxy.new(id, self) }
49
+ end
50
+
51
+ def adjacent(id)
52
+ @index[id].to_a
53
+ end
54
+
55
+ def each_node(&blk)
56
+ nodes.each(&blk)
57
+ end
58
+
59
+ def each_adjacent(id, &blk)
60
+ @index[id].each(&blk)
61
+ end
62
+
63
+ def each_edge(&blk)
64
+ if directed?
65
+ each_node do |from|
66
+ each_adjacent(from.id) do |to|
67
+ yield Edge.new(from, to)
68
+ end
69
+ end
70
+ else
71
+ raise 'Edge traversal unsupported for undirected graphs'
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -1,3 +1,3 @@
1
1
  module Mementus
2
- VERSION = '0.3.1'.freeze
2
+ VERSION = '0.3.2'.freeze
3
3
  end
data/lib/mementus.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  require_relative 'mementus/graph'
2
- require_relative 'mementus/structure'
2
+ require_relative 'mementus/structure/adjacency_list'
3
3
  require_relative 'mementus/node'
4
4
  require_relative 'mementus/edge'
5
5
  require_relative 'mementus/node_proxy'
6
+ require_relative 'mementus/pipeline'
6
7
  require_relative 'mementus/depth_first_search'
7
8
  require_relative 'mementus/breadth_first_search'
8
9
  require_relative 'mementus/query/traversal'
@@ -14,4 +15,3 @@ require_relative 'mementus/graph_builder'
14
15
  require_relative 'mementus/node_builder'
15
16
  require_relative 'mementus/edge_builder'
16
17
  require_relative 'mementus/direction'
17
- require_relative 'mementus/pipeline'
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'pipeline api' do
4
+ let(:graph) do
5
+ Mementus::Graph.new do
6
+ create_node do |node|
7
+ node.id = 1
8
+ node.label = :passage
9
+ end
10
+
11
+ create_node do |node|
12
+ node.id = 2
13
+ node.label = :passage
14
+ end
15
+
16
+ create_edge do |edge|
17
+ edge.id = 3
18
+ edge.from = 1
19
+ edge.to = 2
20
+ edge.label = :choice
21
+ end
22
+ end
23
+ end
24
+
25
+ it 'starts a traversal from the given node' do
26
+ pipeline = graph.n(1)
27
+ expect(pipeline.id).to eq(1)
28
+ expect(pipeline.one.id).to eq(1)
29
+ end
30
+
31
+ it 'traverses to adjacent nodes' do
32
+ pipeline = graph.n(1).out
33
+ expect(pipeline.all.count).to eq(1)
34
+ expect(pipeline.all.first.id).to eq(2)
35
+ end
36
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Mementus::Structure do
4
4
  let(:structure) do
5
- Mementus::Structure.new
5
+ Mementus::Structure::AdjacencyList.new
6
6
  end
7
7
 
8
8
  specify '#new' do
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.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - maetl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-24 00:00:00.000000000 Z
11
+ date: 2016-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -77,16 +77,18 @@ files:
77
77
  - lib/mementus/node.rb
78
78
  - lib/mementus/node_builder.rb
79
79
  - lib/mementus/node_proxy.rb
80
+ - lib/mementus/pipeline.rb
80
81
  - lib/mementus/query/source.rb
81
82
  - lib/mementus/query/step.rb
82
83
  - lib/mementus/query/traversal.rb
83
- - lib/mementus/structure.rb
84
+ - lib/mementus/structure/adjacency_list.rb
84
85
  - lib/mementus/version.rb
85
86
  - mementus.gemspec
86
87
  - spec/direction_spec.rb
87
88
  - spec/graph_spec.rb
88
89
  - spec/integer_id_spec.rb
89
90
  - spec/node_proxy_spec.rb
91
+ - spec/pipeline_spec.rb
90
92
  - spec/query_spec.rb
91
93
  - spec/spec_helper.rb
92
94
  - spec/structure_spec.rb
@@ -120,6 +122,7 @@ test_files:
120
122
  - spec/graph_spec.rb
121
123
  - spec/integer_id_spec.rb
122
124
  - spec/node_proxy_spec.rb
125
+ - spec/pipeline_spec.rb
123
126
  - spec/query_spec.rb
124
127
  - spec/spec_helper.rb
125
128
  - spec/structure_spec.rb
@@ -1,74 +0,0 @@
1
- module Mementus
2
- class Structure
3
- def initialize(is_directed=true)
4
- @index = {}
5
- @is_directed = is_directed
6
- end
7
-
8
- def nodes_count
9
- @index.size
10
- end
11
-
12
- def edges_count
13
- c = 0
14
- each_edge { c += 1 }
15
- c
16
- end
17
-
18
- def directed?
19
- @is_directed
20
- end
21
-
22
- def add_node(node)
23
- @index[node.id] ||= Set.new
24
- end
25
-
26
- def add_edge(edge)
27
- add_node(edge.from) unless has_node?(edge.from)
28
- add_node(edge.to) unless has_node?(edge.to)
29
-
30
- @index[edge.from.id].add(edge.to.id)
31
- @index[edge.to.id].add(edge.from.id) unless directed?
32
- end
33
-
34
- def has_node?(node)
35
- @index.key?(node.id)
36
- end
37
-
38
- def has_edge?(edge)
39
- has_node?(edge.from) && @index[edge.from.id].include?(edge.to.id)
40
- end
41
-
42
- def node(id)
43
- NodeProxy.new(id, self)
44
- end
45
-
46
- def nodes
47
- @index.keys.map { |id| NodeProxy.new(id, self) }
48
- end
49
-
50
- def adjacent(id)
51
- @index[id].to_a
52
- end
53
-
54
- def each_node(&blk)
55
- nodes.each(&blk)
56
- end
57
-
58
- def each_adjacent(id, &blk)
59
- @index[id].each(&blk)
60
- end
61
-
62
- def each_edge(&blk)
63
- if directed?
64
- each_node do |from|
65
- each_adjacent(from.id) do |to|
66
- yield Edge.new(from, to)
67
- end
68
- end
69
- else
70
- raise 'Edge traversal unsupported for undirected graphs'
71
- end
72
- end
73
- end
74
- end