mementus 0.5.1 → 0.5.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 +4 -4
- data/lib/mementus/graph.rb +5 -5
- data/lib/mementus/library/herschel_graph.rb +17 -17
- data/lib/mementus/library/story_graph.rb +45 -0
- data/lib/mementus/node.rb +1 -1
- data/lib/mementus/node_proxy.rb +12 -0
- data/lib/mementus/pipeline/filter.rb +9 -0
- data/lib/mementus/pipeline/pipe.rb +23 -0
- data/lib/mementus/pipeline/step.rb +127 -0
- data/lib/mementus/pipeline/transform.rb +9 -0
- data/lib/mementus/pipes/node.rb +4 -7
- data/lib/mementus/pipes/outgoing_edges.rb +2 -2
- data/lib/mementus/structure/incidence_list.rb +10 -0
- data/lib/mementus/version.rb +1 -1
- data/lib/mementus.rb +5 -4
- data/spec/node_proxy_spec.rb +10 -0
- data/spec/node_spec.rb +7 -1
- data/spec/pipeline/step_spec.rb +77 -0
- data/spec/pipeline_spec.rb +1 -1
- metadata +9 -7
- data/lib/mementus/query/source.rb +0 -13
- data/lib/mementus/query/step.rb +0 -14
- data/lib/mementus/query/traversal.rb +0 -25
- data/spec/query_spec.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea57a98cf767959744e32832bb22a99d7c24bca7
|
4
|
+
data.tar.gz: ab44885dd4005e78bc6638fc7bd2e82b4cc09df6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b82452696af8da7cd562a3e664689707bf0cb065d977ee33e1741845d9e1cc73fcb44d0d08d899eeb7de9362e9294b52c97274b524327d1b680be211c11d6c28
|
7
|
+
data.tar.gz: a52150325b2783d8e925010e8184329d219a6c15d0766ad3fa83e00a5b98f0776441013e527bdfd3f84804fdacaf304be9b53c148621e0adce85ad90a7a3f7b9
|
data/lib/mementus/graph.rb
CHANGED
@@ -10,10 +10,6 @@ module Mementus
|
|
10
10
|
@structure = builder.graph
|
11
11
|
end
|
12
12
|
|
13
|
-
def query
|
14
|
-
Query::Source.new(self)
|
15
|
-
end
|
16
|
-
|
17
13
|
def nodes_count
|
18
14
|
@structure.nodes_count
|
19
15
|
end
|
@@ -27,7 +23,7 @@ module Mementus
|
|
27
23
|
end
|
28
24
|
|
29
25
|
def n(id)
|
30
|
-
|
26
|
+
Pipeline::Step.new([node(id)], Pipeline::Pipe.new(self), self)
|
31
27
|
end
|
32
28
|
|
33
29
|
def has_node?(node)
|
@@ -54,6 +50,10 @@ module Mementus
|
|
54
50
|
@structure.adjacent(id)
|
55
51
|
end
|
56
52
|
|
53
|
+
def adjacent_edges(id)
|
54
|
+
@structure.adjacent_edges(id)
|
55
|
+
end
|
56
|
+
|
57
57
|
def each_node(&blk)
|
58
58
|
@structure.each_node(&blk)
|
59
59
|
end
|
@@ -1,22 +1,22 @@
|
|
1
|
-
# The Herschel graph is a bipartite undirected graph with 11 vertices and
|
2
|
-
# 18 edges, the smallest non-Hamiltonian polyhedral graph.
|
3
|
-
#
|
4
|
-
# __________(blue-1)__________
|
5
|
-
# / / \ \
|
6
|
-
# / / \ \
|
7
|
-
# / (red-1) (red-2) \
|
8
|
-
# / / \ / \ \
|
9
|
-
# / / \ / \ \
|
10
|
-
# (red-3)--(blue-2) (blue-3) (blue-4)---(red-4)
|
11
|
-
# \ \ / \ / /
|
12
|
-
# \ \ / \ / /
|
13
|
-
# \ (red-5) (red-6) /
|
14
|
-
# \ \ / /
|
15
|
-
# \ \ / /
|
16
|
-
# \_________(blue-5)_________/
|
17
|
-
#
|
18
1
|
module Mementus
|
19
2
|
module Library
|
3
|
+
# The Herschel graph is a bipartite undirected graph with 11 vertices and
|
4
|
+
# 18 edges, the smallest non-Hamiltonian polyhedral graph.
|
5
|
+
#
|
6
|
+
# __________(blue-1)__________
|
7
|
+
# / / \ \
|
8
|
+
# / / \ \
|
9
|
+
# / (red-1) (red-2) \
|
10
|
+
# / / \ / \ \
|
11
|
+
# / / \ / \ \
|
12
|
+
# (red-3)--(blue-2) (blue-3) (blue-4)---(red-4)
|
13
|
+
# \ \ / \ / /
|
14
|
+
# \ \ / \ / /
|
15
|
+
# \ (red-5) (red-6) /
|
16
|
+
# \ \ / /
|
17
|
+
# \ \ / /
|
18
|
+
# \_________(blue-5)_________/
|
19
|
+
#
|
20
20
|
class HerschelGraph < Graph
|
21
21
|
def self.instance
|
22
22
|
self.new do
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Mementus
|
2
|
+
module Library
|
3
|
+
# Demo of an interactive fiction story with passages represented as nodes
|
4
|
+
# and choices represented as edges.
|
5
|
+
class StoryGraph < Graph
|
6
|
+
def self.instance
|
7
|
+
self.new do
|
8
|
+
create_node do |node|
|
9
|
+
node.id = "start"
|
10
|
+
node.label = :passage
|
11
|
+
node.props[:text] = "The start of a story."
|
12
|
+
end
|
13
|
+
|
14
|
+
create_node do |node|
|
15
|
+
node.id = "happy-ending"
|
16
|
+
node.label = :passage
|
17
|
+
node.props[:text] = "A happy ending."
|
18
|
+
end
|
19
|
+
|
20
|
+
create_node do |node|
|
21
|
+
node.id = "tragic-ending"
|
22
|
+
node.label = :passage
|
23
|
+
node.props[:text] = "A tragic ending."
|
24
|
+
end
|
25
|
+
|
26
|
+
create_edge do |edge|
|
27
|
+
edge.id = "happy-choice"
|
28
|
+
edge.label = :choice
|
29
|
+
edge.from = "start"
|
30
|
+
edge.to = "happy-ending"
|
31
|
+
edge.props[:text] = "Choose wisely."
|
32
|
+
end
|
33
|
+
|
34
|
+
create_edge do |edge|
|
35
|
+
edge.id = "tragic-choice"
|
36
|
+
edge.label = :choice
|
37
|
+
edge.from = "start"
|
38
|
+
edge.to = "tragic-ending"
|
39
|
+
edge.props[:text] = "Choose poorly."
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/mementus/node.rb
CHANGED
data/lib/mementus/node_proxy.rb
CHANGED
@@ -17,6 +17,14 @@ module Mementus
|
|
17
17
|
@node[prop]
|
18
18
|
end
|
19
19
|
|
20
|
+
def props
|
21
|
+
@node.props
|
22
|
+
end
|
23
|
+
|
24
|
+
def out_e
|
25
|
+
Pipeline::Step.new(adjacent_edges, Pipeline::Pipe.new(@graph), @graph)
|
26
|
+
end
|
27
|
+
|
20
28
|
def each_adjacent(&block)
|
21
29
|
@graph.each_adjacent(@node.id, &block)
|
22
30
|
end
|
@@ -24,5 +32,9 @@ module Mementus
|
|
24
32
|
def adjacent
|
25
33
|
@graph.adjacent(@node.id)
|
26
34
|
end
|
35
|
+
|
36
|
+
def adjacent_edges
|
37
|
+
@graph.adjacent_edges(@node.id)
|
38
|
+
end
|
27
39
|
end
|
28
40
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Mementus
|
2
|
+
module Pipeline
|
3
|
+
# Base class for pipes to inherit from.
|
4
|
+
class Pipe
|
5
|
+
def initialize(graph)
|
6
|
+
@graph = graph
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :graph
|
10
|
+
private :graph
|
11
|
+
|
12
|
+
# Basic passthrough.
|
13
|
+
def process(element)
|
14
|
+
element
|
15
|
+
end
|
16
|
+
|
17
|
+
# Basic passthrough.
|
18
|
+
def call(element)
|
19
|
+
Fiber.yield(element)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module Mementus
|
2
|
+
module Pipeline
|
3
|
+
# Represents a step in a pipeline chain.
|
4
|
+
#
|
5
|
+
# New steps are constructed from a `source` enumerable (usually the previous
|
6
|
+
# step in the chain) and an optional `pipe` which provides the strategy
|
7
|
+
# for generating output values.
|
8
|
+
#
|
9
|
+
# Each step has an internal `Fiber` context which is used to yield control
|
10
|
+
# to the next step in the chain on each value in the iteration, rather than
|
11
|
+
# cycle through the entire list of values before forwarding control.
|
12
|
+
#
|
13
|
+
# This avoids the problem of iterating over a huge set of nodes and edges
|
14
|
+
# which are then discarded by a later step.
|
15
|
+
#
|
16
|
+
# The approach here is roughly similar to the way that Ruby chains together
|
17
|
+
# `Enumerator::Lazy` objects.
|
18
|
+
class Step
|
19
|
+
# Initialize a pipeline step from the given source.
|
20
|
+
#
|
21
|
+
# @param source [#each]
|
22
|
+
# @param pipe [Mementus::Pipeline::Pipe]
|
23
|
+
def initialize(source, pipe=nil, graph=nil)
|
24
|
+
@source = source
|
25
|
+
@pipe = pipe || Pipe.new(graph)
|
26
|
+
@graph = graph
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_reader :source, :pipe, :graph
|
30
|
+
private :source, :pipe, :graph
|
31
|
+
|
32
|
+
# Loop through each value in the sequence, yielding control to the next
|
33
|
+
# step if necessary.
|
34
|
+
#
|
35
|
+
# If a block is provided, it is called with the value. Otherwise, a lazy
|
36
|
+
# enumerator representing the wrapped source is returned.
|
37
|
+
def each
|
38
|
+
return to_enum unless block_given?
|
39
|
+
|
40
|
+
context = Fiber.new do
|
41
|
+
source.each do |element|
|
42
|
+
pipe.call(element)
|
43
|
+
end
|
44
|
+
|
45
|
+
raise StopIteration
|
46
|
+
end
|
47
|
+
|
48
|
+
loop do
|
49
|
+
yield context.resume
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Dereference ids from the source elements.
|
54
|
+
def id
|
55
|
+
ids = to_enum.map { |element| element.id }
|
56
|
+
return ids.first if ids.length == 1
|
57
|
+
ids
|
58
|
+
end
|
59
|
+
|
60
|
+
# Traverse to the outgoing nodes adjacent to the source elements.
|
61
|
+
def out
|
62
|
+
outgoing_nodes = source.inject([]) do |result, node|
|
63
|
+
result.concat(node.adjacent)
|
64
|
+
end
|
65
|
+
|
66
|
+
Step.new(outgoing_nodes)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Traverse to the incoming nodes pointing to the source elements.
|
70
|
+
def in
|
71
|
+
incoming_nodes = []
|
72
|
+
|
73
|
+
source.each do |node|
|
74
|
+
graph.each_node do |graph_node|
|
75
|
+
graph.each_adjacent(graph_node.id) do |adj_node|
|
76
|
+
incoming_nodes << graph_node if adj_node.id == node.id
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
Step.new(incoming_nodes)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Traverse to the outgoing edges from the source elements.
|
85
|
+
def out_e
|
86
|
+
outgoing_edges = []
|
87
|
+
|
88
|
+
source.each do |node|
|
89
|
+
outgoing_edges = graph.each_adjacent(node.id).map do |id|
|
90
|
+
Mementus::Edge.new(from: node, to: id)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
Step.new(outgoing_edges)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Traverse to the incoming edges pointing to the source elements.
|
98
|
+
def in_e
|
99
|
+
ids = source.map(&:id)
|
100
|
+
incoming_edges = []
|
101
|
+
|
102
|
+
graph.each_node do |graph_node|
|
103
|
+
graph.each_adjacent(graph_node.id) do |adj_node|
|
104
|
+
incoming_edges << Mementus::Edge.new(from: graph_node, to: adj_node) if ids.include?(adj_node.id)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
Step.new(incoming_edges)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns the first value in the sequence.
|
112
|
+
def first
|
113
|
+
to_enum.first
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns all values in the sequence
|
117
|
+
def all
|
118
|
+
to_enum.to_a
|
119
|
+
end
|
120
|
+
|
121
|
+
# Returns the given number of values from the sequence.
|
122
|
+
def take(num)
|
123
|
+
to_enum.take(num)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/lib/mementus/pipes/node.rb
CHANGED
@@ -4,6 +4,8 @@ module Mementus
|
|
4
4
|
def initialize(is_directed=true)
|
5
5
|
@outgoing = {}
|
6
6
|
@incoming = {}
|
7
|
+
@outgoing_e = {}
|
8
|
+
@incoming_e = {}
|
7
9
|
@nodes = {}
|
8
10
|
@edges = {}
|
9
11
|
@is_directed = is_directed
|
@@ -33,6 +35,8 @@ module Mementus
|
|
33
35
|
@nodes[node.id] = NodeProxy.new(node, self)
|
34
36
|
@outgoing[node.id] ||= []
|
35
37
|
@incoming[node.id] ||= []
|
38
|
+
@outgoing_e[node.id] ||= []
|
39
|
+
@incoming_e[node.id] ||= []
|
36
40
|
end
|
37
41
|
|
38
42
|
def set_edge(edge)
|
@@ -42,6 +46,8 @@ module Mementus
|
|
42
46
|
@edges[edge.id] = edge
|
43
47
|
@outgoing[edge.from.id] << edge.to.id
|
44
48
|
@incoming[edge.to.id] << edge.from.id
|
49
|
+
@outgoing_e[edge.from.id] << edge.id
|
50
|
+
@incoming_e[edge.to.id] << edge.id
|
45
51
|
end
|
46
52
|
|
47
53
|
def edge(id)
|
@@ -67,6 +73,10 @@ module Mementus
|
|
67
73
|
def each_adjacent(id, &blk)
|
68
74
|
adjacent(id).each(&blk)
|
69
75
|
end
|
76
|
+
|
77
|
+
def adjacent_edges(id)
|
78
|
+
@edges.values_at(*@outgoing_e[id])
|
79
|
+
end
|
70
80
|
end
|
71
81
|
end
|
72
82
|
end
|
data/lib/mementus/version.rb
CHANGED
data/lib/mementus.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'fiber'
|
1
2
|
require 'mementus/graph'
|
2
3
|
require 'mementus/structure/adjacency_list'
|
3
4
|
require 'mementus/structure/incidence_list'
|
@@ -5,6 +6,10 @@ require 'mementus/node'
|
|
5
6
|
require 'mementus/edge'
|
6
7
|
require 'mementus/node_proxy'
|
7
8
|
require 'mementus/processor'
|
9
|
+
require 'mementus/pipeline/pipe'
|
10
|
+
require 'mementus/pipeline/filter'
|
11
|
+
require 'mementus/pipeline/transform'
|
12
|
+
require 'mementus/pipeline/step'
|
8
13
|
require 'mementus/pipes/incoming_edges'
|
9
14
|
require 'mementus/pipes/incoming'
|
10
15
|
require 'mementus/pipes/node'
|
@@ -12,10 +17,6 @@ require 'mementus/pipes/outgoing_edges'
|
|
12
17
|
require 'mementus/pipes/outgoing'
|
13
18
|
require 'mementus/depth_first_search'
|
14
19
|
require 'mementus/breadth_first_search'
|
15
|
-
require 'mementus/query/traversal'
|
16
|
-
require 'mementus/query/source'
|
17
|
-
require 'mementus/query/step'
|
18
|
-
require 'mementus/query/traversal'
|
19
20
|
require 'mementus/integer_id'
|
20
21
|
require 'mementus/element_builder'
|
21
22
|
require 'mementus/graph_builder'
|
data/spec/node_proxy_spec.rb
CHANGED
@@ -10,4 +10,14 @@ describe Mementus::NodeProxy do
|
|
10
10
|
node_proxy = Mementus::NodeProxy.new(node_1, graph)
|
11
11
|
expect(node_proxy.adjacent.map { |node| node.id }).to eq([node_2.id, node_3.id])
|
12
12
|
end
|
13
|
+
|
14
|
+
specify '#adjacent_edges' do
|
15
|
+
graph = Mementus::Graph.new do
|
16
|
+
set_edge(edge_1_2)
|
17
|
+
set_edge(edge_1_3)
|
18
|
+
end
|
19
|
+
|
20
|
+
node_proxy = Mementus::NodeProxy.new(node_1, graph)
|
21
|
+
expect(node_proxy.adjacent_edges.map { |edge| edge.to.id }).to eq([node_2.id, node_3.id])
|
22
|
+
end
|
13
23
|
end
|
data/spec/node_spec.rb
CHANGED
@@ -26,12 +26,18 @@ describe Mementus::Node do
|
|
26
26
|
expect(node[:title]).to be_nil
|
27
27
|
end
|
28
28
|
|
29
|
-
it 'initializes with props
|
29
|
+
it 'initializes with props keys' do
|
30
30
|
node = Mementus::Node.new(props: { title: 'Vertex' })
|
31
31
|
|
32
32
|
expect(node[:title]).to eq('Vertex')
|
33
33
|
end
|
34
34
|
|
35
|
+
it 'initializes with props hash' do
|
36
|
+
node = Mementus::Node.new(props: { title: 'Vertex', count: 10 })
|
37
|
+
|
38
|
+
expect(node.props).to eq({ title: 'Vertex', count: 10 })
|
39
|
+
end
|
40
|
+
|
35
41
|
it 'does not allow mutation of props' do
|
36
42
|
node = Mementus::Node.new(props: { title: 'Vertex' })
|
37
43
|
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mementus::Pipeline::Step do
|
4
|
+
describe '#each' do
|
5
|
+
it 'iterates with an enumerator' do
|
6
|
+
enum = Mementus::Pipeline::Step.new([:a, :b, :c]).each
|
7
|
+
expect(enum.next).to eq(:a)
|
8
|
+
expect(enum.next).to eq(:b)
|
9
|
+
expect(enum.next).to eq(:c)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'iterates with a block' do
|
13
|
+
Mementus::Pipeline::Step.new([:a]).each do |value|
|
14
|
+
expect(value).to eq(:a)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'raises StopIteration when no more values can be yielded' do
|
19
|
+
enum = Mementus::Pipeline::Step.new([]).each
|
20
|
+
expect { enum.next }.to raise_error(StopIteration)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'creates an isolated iteration context with each enumerator' do
|
24
|
+
step = Mementus::Pipeline::Step.new([:a, :b, :c])
|
25
|
+
expect(step.to_enum.next).to eq(:a)
|
26
|
+
expect(step.to_enum.next).to eq(:a)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#first' do
|
31
|
+
it 'returns the first element in the source sequence' do
|
32
|
+
step = Mementus::Pipeline::Step.new([:a, :b, :c])
|
33
|
+
expect(step.first).to eq(:a)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#all' do
|
38
|
+
it 'returns all values in the source sequence' do
|
39
|
+
step = Mementus::Pipeline::Step.new([:a, :b, :c])
|
40
|
+
expect(step.all).to eq([:a, :b, :c])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#take' do
|
45
|
+
it 'returns the given number of values from the source sequence' do
|
46
|
+
step = Mementus::Pipeline::Step.new([:a, :b, :c])
|
47
|
+
expect(step.take(2)).to eq([:a, :b])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#new' do
|
52
|
+
it 'treats steps as enumerable sources to other steps' do
|
53
|
+
step = Mementus::Pipeline::Step.new(Mementus::Pipeline::Step.new([:a, :b, :c]))
|
54
|
+
expect(step.all).to eq([:a, :b, :c])
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'transforms output values based on the given pipe' do
|
58
|
+
transform = -> (value) { Fiber.yield(value.to_s.upcase) }
|
59
|
+
step = Mementus::Pipeline::Step.new([:a, :b, :c], transform)
|
60
|
+
expect(step.all).to eq(['A', 'B', 'C'])
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'filters output values based on the given pipe' do
|
64
|
+
filter = -> (value) { Fiber.yield(value) if value == :a }
|
65
|
+
step = Mementus::Pipeline::Step.new([:a, :b, :c], filter)
|
66
|
+
expect(step.all).to eq([:a])
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'transforms and filters output values based on the given pipes' do
|
70
|
+
filter = -> (value) { Fiber.yield(value) if value == :a }
|
71
|
+
transform = -> (value) { Fiber.yield(value.to_s.upcase) }
|
72
|
+
prev = Mementus::Pipeline::Step.new([:a, :b, :c], filter)
|
73
|
+
step = Mementus::Pipeline::Step.new(prev, transform)
|
74
|
+
expect(step.all).to eq(['A'])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/spec/pipeline_spec.rb
CHANGED
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.5.
|
4
|
+
version: 0.5.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-
|
11
|
+
date: 2016-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,18 +76,20 @@ files:
|
|
76
76
|
- lib/mementus/integer_id.rb
|
77
77
|
- lib/mementus/library.rb
|
78
78
|
- lib/mementus/library/herschel_graph.rb
|
79
|
+
- lib/mementus/library/story_graph.rb
|
79
80
|
- lib/mementus/node.rb
|
80
81
|
- lib/mementus/node_builder.rb
|
81
82
|
- lib/mementus/node_proxy.rb
|
83
|
+
- lib/mementus/pipeline/filter.rb
|
84
|
+
- lib/mementus/pipeline/pipe.rb
|
85
|
+
- lib/mementus/pipeline/step.rb
|
86
|
+
- lib/mementus/pipeline/transform.rb
|
82
87
|
- lib/mementus/pipes/incoming.rb
|
83
88
|
- lib/mementus/pipes/incoming_edges.rb
|
84
89
|
- lib/mementus/pipes/node.rb
|
85
90
|
- lib/mementus/pipes/outgoing.rb
|
86
91
|
- lib/mementus/pipes/outgoing_edges.rb
|
87
92
|
- lib/mementus/processor.rb
|
88
|
-
- lib/mementus/query/source.rb
|
89
|
-
- lib/mementus/query/step.rb
|
90
|
-
- lib/mementus/query/traversal.rb
|
91
93
|
- lib/mementus/structure/adjacency_list.rb
|
92
94
|
- lib/mementus/structure/incidence_list.rb
|
93
95
|
- lib/mementus/version.rb
|
@@ -99,8 +101,8 @@ files:
|
|
99
101
|
- spec/integer_id_spec.rb
|
100
102
|
- spec/node_proxy_spec.rb
|
101
103
|
- spec/node_spec.rb
|
104
|
+
- spec/pipeline/step_spec.rb
|
102
105
|
- spec/pipeline_spec.rb
|
103
|
-
- spec/query_spec.rb
|
104
106
|
- spec/spec_helper.rb
|
105
107
|
- spec/structure_spec.rb
|
106
108
|
- spec/traversal_spec.rb
|
@@ -136,8 +138,8 @@ test_files:
|
|
136
138
|
- spec/integer_id_spec.rb
|
137
139
|
- spec/node_proxy_spec.rb
|
138
140
|
- spec/node_spec.rb
|
141
|
+
- spec/pipeline/step_spec.rb
|
139
142
|
- spec/pipeline_spec.rb
|
140
|
-
- spec/query_spec.rb
|
141
143
|
- spec/spec_helper.rb
|
142
144
|
- spec/structure_spec.rb
|
143
145
|
- spec/traversal_spec.rb
|
data/lib/mementus/query/step.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Mementus
|
2
|
-
module Query
|
3
|
-
class Traversal
|
4
|
-
attr_reader :graph
|
5
|
-
|
6
|
-
def initialize(graph)
|
7
|
-
@graph = graph
|
8
|
-
@steps = []
|
9
|
-
end
|
10
|
-
|
11
|
-
def add_step(step)
|
12
|
-
@steps << step
|
13
|
-
self
|
14
|
-
end
|
15
|
-
|
16
|
-
def adjacent
|
17
|
-
@steps.last.to_node.adjacent
|
18
|
-
end
|
19
|
-
|
20
|
-
def id
|
21
|
-
@steps.last.to_node.id
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/query_spec.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Mementus::Query do
|
4
|
-
let(:graph) do
|
5
|
-
Mementus::Graph.new do
|
6
|
-
set_edge(Mementus::Edge.new(from: Mementus::Node.new(id: 1),to: Mementus::Node.new(id: 2)))
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
specify '#node' do
|
11
|
-
expect(graph.query.node(1).id).to eq(1)
|
12
|
-
end
|
13
|
-
|
14
|
-
specify '#node#adjacent' do
|
15
|
-
expect(graph.query.node(1).adjacent.first.id).to eq(2)
|
16
|
-
end
|
17
|
-
end
|