red_grape 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -4,14 +4,14 @@
4
4
 
5
5
  ## Description:
6
6
 
7
- redGrape is an in-memory graph database written in ruby. I made this in order to learn how graph databases work so that please do not use this for any serious purpose.
7
+ redGrape is an in-memory graph database written in ruby. I made this application in order to learn how a graph database works so that please do not use this for any serious purpose.
8
8
 
9
9
  ## Features/Problems:
10
10
 
11
11
  * REPL
12
12
  * load GraphML
13
13
  * construct a graph programmatically
14
- * traverse nodes and edges
14
+ * traverse nodes and edges using a gremlin-like DSL
15
15
 
16
16
  ## Synopsis:
17
17
 
@@ -30,35 +30,35 @@ redGrape is an in-memory graph database written in ruby. I made this in order to
30
30
  oOOOo
31
31
  oOo
32
32
  -------- O --------
33
- ruby :001 > g = RedGrape.create_tinker_graph
33
+ irb(main):001:0> g = RedGrape.create_tinker_graph
34
34
  => redgrape[vertices:6 edges:6]
35
- ruby :002 > g.class
35
+ irb(main):002:0> g.class
36
36
  => RedGrape::Graph
37
- ruby :003 > g.V
37
+ irb(main):003:0> g.V
38
38
  => [v[1], v[2], v[3], v[4], v[5], v[6]]
39
- ruby :004 > g.V.name
39
+ irb(main):004:0> g.V.name
40
40
  => ["marko", "vadas", "lop", "josh", "ripple", "peter"]
41
- ruby :005 > g.E
41
+ irb(main):005:0> g.E
42
42
  => [e[7][1-knows->2], e[8][1-knows->4], e[9][1-created->3], e[10][4-created->5], e[11][4-created->3], e[12][6-created->3]]
43
- ruby :006 > v = g.v(1)
43
+ irb(main):006:0> v = g.v(1)
44
44
  => v[1]
45
- ruby :007 > "#{v.name} is #{v.age} years old."
45
+ irb(main):007:0> "#{v.name} is #{v.age} years old."
46
46
  => "marko is 29 years old."
47
- ruby :008 > v.out
47
+ irb(main):008:0> v.out
48
48
  => [v[2], v[4], v[3]]
49
- ruby :009 > v.out('knows')
49
+ irb(main):009:0> v.out('knows')
50
50
  => [v[2], v[4]]
51
- ruby :010 > v.outE
51
+ irb(main):010:0> v.outE
52
52
  => [e[7][1-knows->2], e[8][1-knows->4], e[9][1-created->3]]
53
- ruby :011 > v.outE('knows')
53
+ irb(main):011:0> v.outE('knows')
54
54
  => [e[7][1-knows->2], e[8][1-knows->4]]
55
- ruby :012 > v.outE.weight
55
+ irb(main):012:0> v.outE.weight
56
56
  => [0.5, 1.0, 0.4]
57
- ruby :013 > v.outE.has('weight', :lt, 1).inV
57
+ irb(main):013:0> v.outE.has('weight', :lt, 1).inV
58
58
  => [v[2], v[3]]
59
- ruby :014 > v.outE.filter{it.weight < 1}.inV
59
+ irb(main):014:0> v.outE.filter{it.weight < 1}.inV
60
60
  => [v[2], v[3]]
61
- ruby :015 > v.out('knows').filter{it.age > 30}.out('created').name
61
+ irb(main):015:0> v.out('knows').filter{it.age:0> 30}.out('created').name
62
62
  => ["ripple", "lop"]
63
63
 
64
64
  In REPL, the `take' method which invokes all pipes is automatically called.
@@ -83,18 +83,18 @@ In REPL, the `take' method which invokes all pipes is automatically called.
83
83
  oOOOo
84
84
  oOo
85
85
  -------- O --------
86
- ruby :001 > $store
86
+ irb(main):001:0> $store
87
87
  => #<RedGrape::GraphStore:0x007fb615137a90>
88
- ruby :002 > $store.graphs
88
+ irb(main):002:0> $store.graphs
89
89
  => [:tinker]
90
- ruby :003 > g = $store.graph :tinker
90
+ irb(main):003:0> g = $store.graph :tinker
91
91
  => redgrape[vertices:6 edges:6]
92
- ruby :004 > g.add_vertex 7
92
+ irb(main):004:0> g.add_vertex 7
93
93
  => redgrape[vertices:7 edges:6]
94
- ruby :005 > store.put_graph :tinker, g
94
+ irb(main):005:0> store.put_graph :tinker, g
95
95
  => redgrape[vertices:7 edges:6]
96
96
 
97
- Changes on a graph are not committed until the put_graph method called.
97
+ Changes on a graph are not committed until the put_graph method is called.
98
98
 
99
99
  ## Requirements:
100
100
 
@@ -14,6 +14,10 @@ module RedGrape
14
14
  @label = label
15
15
  end
16
16
 
17
+ def vertex(direction)
18
+ directed_value direction, @target, @source
19
+ end
20
+
17
21
  def connected?(v)
18
22
  id = v.is_a?(Vertex) ? v.id : v
19
23
  @source.id == id.to_s || @target.id == id.to_s
@@ -26,6 +26,10 @@ module RedGrape
26
26
  set_property k, v.default if v.has_default?
27
27
  end
28
28
  end
29
+
30
+ def property_keys
31
+ @property.keys
32
+ end
29
33
 
30
34
  # set property value with type checking if its definition exists
31
35
  def set_property(kid, v)
@@ -42,6 +46,18 @@ module RedGrape
42
46
  end
43
47
  end
44
48
 
49
+ def property(k=nil)
50
+ if k
51
+ self[k]
52
+ else
53
+ @property
54
+ end
55
+ end
56
+
57
+ def remove_property(k)
58
+ @property.delete k.to_s
59
+ end
60
+
45
61
  # set property value without type checking
46
62
  def []=(k, v)
47
63
  @property[k.to_s] = v
@@ -59,8 +75,36 @@ module RedGrape
59
75
  self.class == obj.class && self.id == obj.id
60
76
  end
61
77
 
78
+ def directed_value(direction, out_value, in_value, error=true)
79
+ case direction.to_s
80
+ when 'out'
81
+ if out_value.is_a? Proc
82
+ out_value.call
83
+ else
84
+ out_value
85
+ end
86
+ when 'in'
87
+ if in_value.is_a? Proc
88
+ in_value.call
89
+ else
90
+ in_value
91
+ end
92
+ else error
93
+ raise ArgumentError.new '"out" or "in"'
94
+ end
95
+ end
96
+
62
97
  def method_missing(name, *args, &block)
63
- self[name.to_s] or raise NoMethodError.new(name.to_s)
98
+ if name.to_s =~ /(.*)=$/
99
+ name = $1
100
+ if self[name]
101
+ self[name] = args.first
102
+ else
103
+ raise NoMethodError.new(name.to_s)
104
+ end
105
+ else
106
+ self[name.to_s] or raise NoMethodError.new(name.to_s)
107
+ end
64
108
  end
65
109
  end
66
110
  end
@@ -5,6 +5,9 @@ require 'red_grape/serializer/graphml_serializer'
5
5
 
6
6
  module RedGrape
7
7
  class Graph
8
+ include RedGrape::Pipe::V
9
+ include RedGrape::Pipe::E
10
+
8
11
  class << self
9
12
  def load(filename)
10
13
  self.new.load filename
@@ -107,20 +110,10 @@ module RedGrape
107
110
  items :vertex, *id
108
111
  end
109
112
 
110
- def v(*id)
111
- vertex(*id)._
112
- end
113
- alias V v
114
-
115
113
  def edge(*id)
116
114
  items :edge, *id
117
115
  end
118
116
 
119
- def e(*id)
120
- edge(*id)._
121
- end
122
- alias E e
123
-
124
117
  def add_vertex(id, v=nil)
125
118
  if v
126
119
  if v.is_a? Hash
@@ -221,6 +214,10 @@ module RedGrape
221
214
  false
222
215
  end
223
216
 
217
+ def shutdown
218
+ # do nothing
219
+ end
220
+
224
221
  def dup
225
222
  obj = self.class.new
226
223
  obj.instance_variable_set :@serializer, @serializer
@@ -11,17 +11,8 @@ module RedGrape
11
11
  class AsPipe < Pipe::Base
12
12
  def pass(obj, context)
13
13
  label = self.opts.first.to_s
14
- case self.prev
15
- when Pipe::Base
16
- # TODO: why??
17
- context.mark! label
18
- obj
19
- when Vertex, Array
20
- context.mark! label, obj
21
- obj.pass_through self.next, context
22
- else
23
- raise 'not yet'
24
- end
14
+ context.mark! label, obj
15
+ obj.pass_through self.next, context
25
16
  end
26
17
  end
27
18
  end
@@ -23,7 +23,7 @@ module RedGrape
23
23
  end
24
24
 
25
25
  def pipe_name
26
- self.class.name.split('::').last
26
+ self.class.name.split('::').last.sub(/Pipe$/, '')
27
27
  end
28
28
 
29
29
  def first?
@@ -0,0 +1,20 @@
1
+ require 'red_grape/pipe/base'
2
+
3
+ module RedGrape
4
+ module Pipe
5
+ module E
6
+ def e(*opts)
7
+ EPipe.new self, *opts
8
+ end
9
+ alias E e
10
+ end
11
+
12
+ class EPipe < Pipe::Base
13
+ def pass(obj, context)
14
+ edges = obj.edge(*self.opts)
15
+ pass_next context, obj, edges
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,19 @@
1
+ require 'red_grape/pipe/base'
2
+
3
+ module RedGrape
4
+ module Pipe
5
+ module V
6
+ def v(*opts)
7
+ VPipe.new self, *opts
8
+ end
9
+ alias V v
10
+ end
11
+
12
+ class VPipe < Pipe::Base
13
+ def pass(obj, context)
14
+ vertices = obj.vertex(*self.opts)
15
+ pass_next context, obj, vertices
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module RedGrape
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -18,6 +18,23 @@ module RedGrape
18
18
  @in_edges = []
19
19
  end
20
20
 
21
+ # Returns edges
22
+ # _direction_ :: :out or :in
23
+ # _labels_ :: labels
24
+ def edges(direction, *labels)
25
+ edges = directed_value direction, @out_edges, @in_edges
26
+ if labels.empty?
27
+ edges
28
+ else
29
+ edges.select {|e| labels.include? e.label}
30
+ end
31
+ end
32
+
33
+ def vertices(direction, *labels)
34
+ edges = edges direction, *labels
35
+ directed_value direction, proc{edges.map &:target}, proc{edges.map &:source}
36
+ end
37
+
21
38
  def add_out_edge(edge)
22
39
  @out_edges << edge
23
40
  end
data/lib/red_grape.rb CHANGED
@@ -22,6 +22,8 @@ require 'red_grape/pipe/retain_pipe'
22
22
  require 'red_grape/pipe/fill_pipe'
23
23
  require 'red_grape/pipe/group_count_pipe'
24
24
  require 'red_grape/pipe/cap_pipe'
25
+ require 'red_grape/pipe/v_pipe'
26
+ require 'red_grape/pipe/e_pipe'
25
27
  require 'red_grape/graph'
26
28
 
27
29
  module RedGrape
data/test/test_element.rb CHANGED
@@ -39,4 +39,28 @@ class ElementTest < Test::Unit::TestCase
39
39
  assert_nil desc[:name].default
40
40
  assert_equal 'male', desc[:sex].default
41
41
  end
42
+
43
+ def test_property_keys
44
+ v = RedGrape::Vertex.new nil, 1, name:'ando', lang:'ruby'
45
+ assert_equal %w(name lang).sort, v.property_keys.sort
46
+ assert_equal %w(name lang).sort, v.property.keys.sort
47
+ end
48
+
49
+ def test_remove_property
50
+ v = RedGrape::Vertex.new nil, 1, name:'ando', lang:'ruby'
51
+ assert_equal %w(name lang).sort, v.property_keys.sort
52
+ v.remove_property :name
53
+ assert_equal %w(lang).sort, v.property_keys.sort
54
+ end
55
+
56
+ def test_method_missing
57
+ v = RedGrape::Vertex.new nil, 1, name:'ando', lang:'ruby'
58
+ assert_equal 'ando', v.name
59
+ assert_equal 'ruby', v.lang
60
+ v.lang = 'javascript'
61
+ assert_equal 'javascript', v.lang
62
+ assert_raise(NoMethodError) do
63
+ v.unknow
64
+ end
65
+ end
42
66
  end
data/test/test_graph.rb CHANGED
@@ -81,18 +81,18 @@ class GraphTest < Test::Unit::TestCase
81
81
  def test_add_vertex
82
82
  g = RedGrape::Graph.new
83
83
  g.add_vertex id:1, val:'a'
84
- v1 = g.v(1)
84
+ v1 = g.vertex(1)
85
85
  assert_equal '1', v1.id
86
86
  assert_equal 'a', v1.val
87
87
 
88
88
  g.add_vertex '2', val:'b'
89
- v2 = g.v(2)
89
+ v2 = g.vertex(2)
90
90
  assert_equal '2', v2.id
91
91
  assert_equal 'b', v2.val
92
92
 
93
93
  v3 = RedGrape::Vertex.new nil, 3, val:'c'
94
94
  g.add_vertex '3', v3
95
- assert_equal v3, g.v(3)
95
+ assert_equal v3, g.vertex(3)
96
96
  assert_equal '3', v3.id
97
97
  assert_equal 'c', v3.val
98
98
 
@@ -118,11 +118,11 @@ class GraphTest < Test::Unit::TestCase
118
118
  assert !v3.in_edges.map(&:id).include?(e23.id)
119
119
 
120
120
  g = RedGrape.create_tinker_graph
121
- assert_equal 6, g.v.size
122
- assert_equal 6, g.e.size
121
+ assert_equal 6, g.vertex.size
122
+ assert_equal 6, g.edge.size
123
123
  g.remove_vertex 1
124
- assert_equal 5, g.v.size
125
- assert_equal 3, g.e.size
124
+ assert_equal 5, g.vertex.size
125
+ assert_equal 3, g.edge.size
126
126
  end
127
127
 
128
128
  def test_add_edge
@@ -166,19 +166,19 @@ class GraphTest < Test::Unit::TestCase
166
166
  g2 = g1.readonly
167
167
  assert !g1.readonly?
168
168
  assert g2.readonly?
169
- assert_equal 1, g2.v.size
169
+ assert_equal 1, g2.vertex.size
170
170
  assert_raise(NoMethodError) do
171
171
  g2.add_vertex 2
172
172
  end
173
173
  g1.add_vertex 2
174
- assert_equal 2, g1.v.size
175
- assert_equal 1, g2.v.size
174
+ assert_equal 2, g1.vertex.size
175
+ assert_equal 1, g2.vertex.size
176
176
 
177
177
  g1.readonly!
178
178
  assert g1.readonly?
179
179
  assert_raise(NoMethodError) do
180
180
  g1.add_vertex 3
181
181
  end
182
- assert_equal 2, g1.v.size
182
+ assert_equal 2, g1.vertex.size
183
183
  end
184
184
  end
@@ -9,7 +9,7 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
9
9
 
10
10
  def test_basic
11
11
  assert_equal '1',
12
- @graph.v(1).id
12
+ @graph.v(1).take.id
13
13
 
14
14
  assert_equal %w(2 3 4),
15
15
  @graph.v(1).out.take.map(&:id).sort
@@ -21,10 +21,10 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
21
21
  assert_equal 3,
22
22
  paths.size
23
23
 
24
- assert_equal [3, 3, 3],
24
+ assert_equal [4, 4, 4],
25
25
  paths.map(&:size)
26
26
 
27
- assert_equal %w[OutPipe PropertyPipe(name) PathsPipe],
27
+ assert_equal %w[V Out Property(name) Paths],
28
28
  @graph.v(1).out.name.paths.to_a
29
29
  end
30
30
 
@@ -41,7 +41,7 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
41
41
  assert_equal [5],
42
42
  @graph.v(1).out('knows').filter{it.age < 30}.name.transform{it.size}.take.sort
43
43
 
44
- assert_equal %w[OutPipe(knows) FilterPipe PropertyPipe(name) TransformPipe],
44
+ assert_equal %w[V Out(knows) Filter Property(name) Transform],
45
45
  @graph.v(1).out('knows').filter{it.age < 30}.name.transform{it.size}.to_a
46
46
  end
47
47
 
@@ -58,7 +58,7 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
58
58
  assert_equal %w(4 6),
59
59
  @graph.v(1).side_effect{@x = it}.out('created').in('created').filter{it != @x}.take.map(&:id).sort
60
60
 
61
- assert_equal %w(SideEffectPipe OutPipe(created) InPipe(created) FilterPipe),
61
+ assert_equal %w(V SideEffect Out(created) In(created) Filter),
62
62
  @graph.v(1).side_effect{@x = it}.out('created').in('created').filter{it != @x}.to_a
63
63
  end
64
64
 
@@ -78,10 +78,10 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
78
78
  assert_equal %w(2),
79
79
  @graph.v(1).out('knows').name.filter{it[0] == 'v'}.back(2).take.to_a.map(&:id)
80
80
 
81
- assert_equal %w(OutPipe(knows) PropertyPipe(name) FilterPipe BackPipe),
81
+ assert_equal %w(V Out(knows) Property(name) Filter Back),
82
82
  @graph.v(1).out('knows').name.filter{it[0] == 'v'}.back(2).to_a
83
83
 
84
- assert_equal %w(2 4),
84
+ assert_equal %w(2),
85
85
  @graph.v(1).out('knows').as('here').name.filter{it[0] == 'v'}.back('here').take.to_a.map(&:id)
86
86
  end
87
87
 
@@ -95,7 +95,7 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
95
95
  assert_equal %w(lop ripple),
96
96
  @graph.v(1).out.loop(1){loops < 3}.name.take.sort
97
97
 
98
- assert_equal %w(OutPipe LoopPipe PropertyPipe(name)),
98
+ assert_equal %w(V Out Loop Property(name)),
99
99
  @graph.v(1).out.loop(1){loops < 3}.name.to_a
100
100
  end
101
101
  end
@@ -22,7 +22,7 @@ class TraversalPatternsTest < Test::Unit::TestCase
22
22
 
23
23
  # https://github.com/tinkerpop/gremlin/wiki/Flow-Rank-Pattern
24
24
  def test_flow_rank_pattern
25
- assert_equal %w(3 5), @graph.V('lang', 'java').map(&:id).sort
25
+ assert_equal %w(3 5), @graph.V('lang', 'java').take.map(&:id).sort
26
26
  software = []
27
27
  @graph.V('lang', 'java').fill(software).take
28
28
  assert_equal %w(3 5), software.map(&:id).sort
@@ -39,27 +39,30 @@ class TraversalPatternsTest < Test::Unit::TestCase
39
39
 
40
40
  # https://github.com/tinkerpop/gremlin/wiki/Path-Pattern
41
41
  def test_path_pattern
42
- assert_equal %w(josh lop vadas), @graph.v(1).out.name.take.sort
42
+ v1 = @graph.vertex(1)
43
43
 
44
- path = @graph.v(1).out.name.path.take
44
+ assert_equal %w(josh lop vadas), v1.out.name.take.sort
45
+
46
+ path = v1.out.name.path.take
45
47
  assert_equal 3, path.size
46
48
  assert_equal 3, path.first.size
47
49
  assert_equal '[[v[1], v[2], "vadas"], [v[1], v[4], "josh"], [v[1], v[3], "lop"]]', path.to_s
48
50
 
49
- path = @graph.v(1).outE.inV.name.path.take
51
+ path = v1.outE.inV.name.path.take
50
52
  assert_equal '[[v[1], e[7][1-knows->2], v[2], "vadas"], [v[1], e[8][1-knows->4], v[4], "josh"], [v[1], e[9][1-created->3], v[3], "lop"]]', path.to_s
51
53
 
52
54
  assert_equal(
53
55
  [["marko", 0.5, "vadas"], ["marko", 1.0, "josh"], ["marko", 0.4, "lop"]].to_s,
54
- @graph.v(1).outE.inV.path(proc{it.name}, proc{it.weight}, proc{it.name}).take.to_s
56
+ v1.outE.inV.path(proc{it.name}, proc{it.weight}, proc{it.name}).take.to_s
55
57
  )
56
58
  end
57
59
 
58
60
  def test_loop_pattern
59
61
  g = RedGrape.load_graph 'data/graph-example-2.xml'
62
+ v89 = g.vertex 89
60
63
  assert_equal 36, g.v(89).outE.inV.path.take.size
61
64
 
62
- path = g.v(89).outE.inV.loop(2){it.loops < 3}.path.take.first
65
+ path = v89.outE.inV.loop(2){it.loops < 3}.path.take.first
63
66
  assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
64
67
  assert_equal RedGrape::Vertex, path[0].class
65
68
  assert_equal RedGrape::Edge, path[1].class
@@ -67,7 +70,7 @@ class TraversalPatternsTest < Test::Unit::TestCase
67
70
  assert_equal RedGrape::Edge, path[3].class
68
71
  assert_equal RedGrape::Vertex, path[4].class
69
72
 
70
- path = g.v(89).as('x').outE.inV.loop('x'){it.loops < 3}.path.take.first
73
+ path = v89.as('x').outE.inV.loop('x'){it.loops < 3}.path.take.first
71
74
  assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
72
75
  assert_equal RedGrape::Vertex, path[0].class
73
76
  assert_equal RedGrape::Edge, path[1].class
@@ -75,7 +78,7 @@ class TraversalPatternsTest < Test::Unit::TestCase
75
78
  assert_equal RedGrape::Edge, path[3].class
76
79
  assert_equal RedGrape::Vertex, path[4].class
77
80
 
78
- path = g.v(89).outE.inV.outE.inV.path.take.first
81
+ path = v89.outE.inV.outE.inV.path.take.first
79
82
  assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
80
83
  assert_equal RedGrape::Vertex, path[0].class
81
84
  assert_equal RedGrape::Edge, path[1].class
data/test/test_vertex.rb CHANGED
@@ -22,6 +22,22 @@ class VertexTest < Test::Unit::TestCase
22
22
  assert_raise(ArgumentError) {v.set_property :age, 'not integer'}
23
23
  end
24
24
 
25
+ def test_edges
26
+ g = RedGrape::Graph.create_tinker_graph
27
+ v = g.vertex(1)
28
+ assert_equal %w(7 8 9), v.edges(:out).map(&:id).sort
29
+ assert_equal %w(created), v.edges(:out, 'created').map(&:label)
30
+ assert_equal %w(knows knows), v.edges(:out, 'knows').map(&:label)
31
+ end
32
+
33
+ def test_vertices
34
+ g = RedGrape::Graph.create_tinker_graph
35
+ v = g.vertex(1)
36
+ assert_equal %w(2 3 4), v.vertices(:out).map(&:id).sort
37
+ assert_equal %w(lop), v.vertices(:out, 'created').map(&:name)
38
+ assert_equal %w(vadas josh), v.vertices(:out, 'knows').map(&:name)
39
+ end
40
+
25
41
  def test_method_missing
26
42
  g = RedGrape::Graph.new
27
43
  v = RedGrape::Vertex.new g, '12345'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: red_grape
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-09 00:00:00.000000000 Z
12
+ date: 2012-06-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
16
- requirement: &70169527487200 !ruby/object:Gem::Requirement
16
+ requirement: &70127387275840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70169527487200
24
+ version_requirements: *70127387275840
25
25
  description: RedGrape is an in-memory graph database written in ruby. I made this
26
26
  in order to learn how graph databases work so that please do not use this for any
27
27
  serious purpose.
@@ -58,6 +58,7 @@ files:
58
58
  - lib/red_grape/pipe/base.rb
59
59
  - lib/red_grape/pipe/cap_pipe.rb
60
60
  - lib/red_grape/pipe/context.rb
61
+ - lib/red_grape/pipe/e_pipe.rb
61
62
  - lib/red_grape/pipe/except_pipe.rb
62
63
  - lib/red_grape/pipe/fill_pipe.rb
63
64
  - lib/red_grape/pipe/filter_pipe.rb
@@ -74,6 +75,7 @@ files:
74
75
  - lib/red_grape/pipe/retain_pipe.rb
75
76
  - lib/red_grape/pipe/side_effect_pipe.rb
76
77
  - lib/red_grape/pipe/transform_pipe.rb
78
+ - lib/red_grape/pipe/v_pipe.rb
77
79
  - lib/red_grape/property_description.rb
78
80
  - lib/red_grape/serializer/graphml_serializer.rb
79
81
  - lib/red_grape/version.rb