mementus 0.3.1 → 0.3.2

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 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