red_grape 0.0.1 → 0.0.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.
Files changed (45) hide show
  1. data/Manifest.txt +25 -10
  2. data/README.txt +54 -5
  3. data/bin/redgrape +77 -0
  4. data/data/graph-example-2.xml +26380 -0
  5. data/lib/ext/array_ext.rb +41 -0
  6. data/lib/ext/object_ext.rb +16 -0
  7. data/lib/red_grape/edge.rb +4 -17
  8. data/lib/red_grape/{propertied_object.rb → element.rb} +26 -4
  9. data/lib/red_grape/graph.rb +75 -73
  10. data/lib/red_grape/path_group.rb +5 -9
  11. data/lib/red_grape/pipe/aggregate_pipe.rb +13 -0
  12. data/lib/red_grape/pipe/as_pipe.rb +3 -10
  13. data/lib/red_grape/pipe/back_pipe.rb +1 -8
  14. data/lib/red_grape/pipe/base.rb +51 -6
  15. data/lib/red_grape/pipe/cap_pipe.rb +16 -0
  16. data/lib/red_grape/pipe/context.rb +64 -3
  17. data/lib/red_grape/pipe/except_pipe.rb +15 -0
  18. data/lib/red_grape/pipe/fill_pipe.rb +19 -0
  19. data/lib/red_grape/pipe/filter_pipe.rb +1 -7
  20. data/lib/red_grape/pipe/group_count_pipe.rb +17 -0
  21. data/lib/red_grape/pipe/has_pipe.rb +24 -0
  22. data/lib/red_grape/pipe/if_then_else_pipe.rb +1 -7
  23. data/lib/red_grape/pipe/in_pipe.rb +12 -15
  24. data/lib/red_grape/pipe/in_v_pipe.rb +12 -0
  25. data/lib/red_grape/pipe/loop_pipe.rb +16 -25
  26. data/lib/red_grape/pipe/out_e_pipe.rb +25 -0
  27. data/lib/red_grape/pipe/out_pipe.rb +6 -15
  28. data/lib/red_grape/pipe/paths_pipe.rb +21 -9
  29. data/lib/red_grape/pipe/property_pipe.rb +2 -11
  30. data/lib/red_grape/pipe/retain_pipe.rb +16 -0
  31. data/lib/red_grape/pipe/transform_pipe.rb +3 -11
  32. data/lib/red_grape/property_description.rb +6 -0
  33. data/lib/red_grape/serializer/graphml_serializer.rb +73 -0
  34. data/lib/red_grape/vertex.rb +7 -20
  35. data/lib/red_grape.rb +15 -6
  36. data/test/{test_propertied_object.rb → test_element.rb} +5 -5
  37. data/test/test_graph.rb +10 -19
  38. data/test/test_on_the_nature_of_pipes.rb +13 -13
  39. data/test/test_pipe.rb +16 -0
  40. data/test/test_pipe_base.rb +17 -0
  41. data/test/test_traversal_patterns.rb +69 -0
  42. metadata +38 -22
  43. data/bin/red_grape +0 -3
  44. data/lib/red_grape/vertex_group.rb +0 -72
  45. data/test/test_red_grape.rb +0 -8
@@ -9,10 +9,10 @@ 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).id
13
13
 
14
14
  assert_equal %w(2 3 4),
15
- @graph.v(1).out.take.map(&:_id).sort
15
+ @graph.v(1).out.take.map(&:id).sort
16
16
 
17
17
  assert_equal %w(josh lop vadas),
18
18
  @graph.v(1).out.name.take.sort
@@ -30,12 +30,12 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
30
30
 
31
31
  def test_filter
32
32
  assert_equal %w(2 4),
33
- @graph.v(1).out('knows').take.map(&:_id).sort
33
+ @graph.v(1).out('knows').take.map(&:id).sort
34
34
 
35
- assert_equal %W(2),
36
- @graph.v(1).out('knows').filter{it.age < 30}.take.map(&:_id).sort
35
+ assert_equal %w(2),
36
+ @graph.v(1).out('knows').filter{it.age < 30}.take.map(&:id).sort
37
37
 
38
- assert_equal %W(vadas),
38
+ assert_equal %w(vadas),
39
39
  @graph.v(1).out('knows').filter{it.age < 30}.name.take.sort
40
40
 
41
41
  assert_equal [5],
@@ -50,13 +50,13 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
50
50
  @graph.v(1).side_effect{@x = it}.take.name
51
51
 
52
52
  assert_equal %w(3),
53
- @graph.v(1).side_effect{@x = it}.out('created').take.map(&:_id).sort
53
+ @graph.v(1).side_effect{@x = it}.out('created').take.map(&:id).sort
54
54
 
55
55
  assert_equal %w(1 4 6),
56
- @graph.v(1).side_effect{@x = it}.out('created').in('created').take.map(&:_id).sort
56
+ @graph.v(1).side_effect{@x = it}.out('created').in('created').take.map(&:id).sort
57
57
 
58
58
  assert_equal %w(4 6),
59
- @graph.v(1).side_effect{@x = it}.out('created').in('created').filter{it != @x}.take.map(&:_id).sort
59
+ @graph.v(1).side_effect{@x = it}.out('created').in('created').filter{it != @x}.take.map(&:id).sort
60
60
 
61
61
  assert_equal %w(SideEffectPipe OutPipe(created) InPipe(created) FilterPipe),
62
62
  @graph.v(1).side_effect{@x = it}.out('created').in('created').filter{it != @x}.to_a
@@ -76,21 +76,21 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
76
76
  @graph.v(1).out('knows').name.filter{it[0] == 'v'}.take.to_a
77
77
 
78
78
  assert_equal %w(2),
79
- @graph.v(1).out('knows').name.filter{it[0] == 'v'}.back(2).take.to_a.map(&:_id)
79
+ @graph.v(1).out('knows').name.filter{it[0] == 'v'}.back(2).take.to_a.map(&:id)
80
80
 
81
81
  assert_equal %w(OutPipe(knows) PropertyPipe(name) FilterPipe BackPipe),
82
82
  @graph.v(1).out('knows').name.filter{it[0] == 'v'}.back(2).to_a
83
83
 
84
84
  assert_equal %w(2 4),
85
- @graph.v(1).out('knows').as('here').name.filter{it[0] == 'v'}.back('here').take.to_a.map(&:_id)
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
 
88
88
  def test_loop
89
89
  assert_equal %w(3 5),
90
- @graph.v(1).out.out.take.to_a.map(&:_id).sort
90
+ @graph.v(1).out.out.take.to_a.map(&:id).sort
91
91
 
92
92
  assert_equal %w(3 5),
93
- @graph.v(1).out.loop(1){loops < 3}.take.to_a.map(&:_id).sort
93
+ @graph.v(1).out.loop(1){loops < 3}.take.to_a.map(&:id).sort
94
94
 
95
95
  assert_equal %w(lop ripple),
96
96
  @graph.v(1).out.loop(1){loops < 3}.name.take.sort
data/test/test_pipe.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'test/unit'
2
+ require 'red_grape'
3
+
4
+ class PipeTest < Test::Unit::TestCase
5
+ def setup
6
+ @graph = RedGrape.load_graph 'data/graph-example-1.xml'
7
+ end
8
+
9
+ def test_set_auto_take
10
+ assert !RedGrape::Pipe.auto_take
11
+ RedGrape::Pipe.set_auto_take
12
+ assert RedGrape::Pipe.auto_take
13
+ RedGrape::Pipe.set_auto_take false
14
+ assert !RedGrape::Pipe.auto_take
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ require 'test/unit'
2
+ require 'red_grape'
3
+
4
+ class PipeBaseTest < Test::Unit::TestCase
5
+ def setup
6
+ @graph = RedGrape.load_graph 'data/graph-example-1.xml'
7
+ end
8
+
9
+ def test_to_s
10
+ assert !RedGrape::Pipe.auto_take
11
+ assert(@graph.v(1).out.name.to_s =~ /#<RedGrape::Pipe::PropertyPipe:0x.*>/)
12
+ RedGrape::Pipe.set_auto_take
13
+ assert_equal %w(vadas josh lop).to_s, @graph.v(1).out.name.to_s
14
+ RedGrape::Pipe.set_auto_take false
15
+ end
16
+ end
17
+
@@ -14,5 +14,74 @@ class TraversalPatternsTest < Test::Unit::TestCase
14
14
 
15
15
  # https://github.com/tinkerpop/gremlin/wiki/Except-Retain-Pattern
16
16
  def test_except_retain_pattern
17
+ assert_equal %w(2 3 4), @graph.v(1).out.take.map(&:id).sort
18
+ assert_equal %w(3 5), @graph.v(1).out.out.take.map(&:id).sort
19
+ assert_equal %w(5), @graph.v(1).out.aggregate(:x).out.except(:x).take.map(&:id).sort
20
+ assert_equal %w(3), @graph.v(1).out.aggregate(:x).out.retain(:x).take.map(&:id).sort
21
+ end
22
+
23
+ # https://github.com/tinkerpop/gremlin/wiki/Flow-Rank-Pattern
24
+ def test_flow_rank_pattern
25
+ assert_equal %w(3 5), @graph.V('lang', 'java').map(&:id).sort
26
+ software = []
27
+ @graph.V('lang', 'java').fill(software).take
28
+ assert_equal %w(3 5), software.map(&:id).sort
29
+ assert_equal %w(marko josh peter josh), software._.in('created').name.take
30
+ assert_equal(
31
+ {'marko' => 1, 'josh' => 2, 'peter' => 1},
32
+ software._.in('created').name.groupCount.cap.take
33
+ )
34
+
35
+ m = {}
36
+ assert_equal %w(marko josh peter josh), software._.in('created').name.groupCount(m).take
37
+ assert_equal({'marko' => 1, 'josh' => 2, 'peter' => 1}, m)
38
+ end
39
+
40
+ # https://github.com/tinkerpop/gremlin/wiki/Path-Pattern
41
+ def test_path_pattern
42
+ assert_equal %w(josh lop vadas), @graph.v(1).out.name.take.sort
43
+
44
+ path = @graph.v(1).out.name.path.take
45
+ assert_equal 3, path.size
46
+ assert_equal 3, path.first.size
47
+ assert_equal '[[v[1], v[2], "vadas"], [v[1], v[4], "josh"], [v[1], v[3], "lop"]]', path.to_s
48
+
49
+ path = @graph.v(1).outE.inV.name.path.take
50
+ 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
+
52
+ assert_equal(
53
+ [["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
55
+ )
56
+ end
57
+
58
+ def test_loop_pattern
59
+ g = RedGrape.load_graph 'data/graph-example-2.xml'
60
+ assert_equal 36, g.v(89).outE.inV.path.take.size
61
+
62
+ #path = g.v(89).outE.inV.loop(2){it.loops < 3}.path.take #TODO: it.
63
+ path = g.v(89).outE.inV.loop(2){loops < 3}.path.take.first
64
+ assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
65
+ assert_equal RedGrape::Vertex, path[0].class
66
+ assert_equal RedGrape::Edge, path[1].class
67
+ assert_equal RedGrape::Vertex, path[2].class
68
+ assert_equal RedGrape::Edge, path[3].class
69
+ assert_equal RedGrape::Vertex, path[4].class
70
+
71
+ path = g.v(89).as('x').outE.inV.loop('x'){loops < 3}.path.take.first
72
+ assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
73
+ assert_equal RedGrape::Vertex, path[0].class
74
+ assert_equal RedGrape::Edge, path[1].class
75
+ assert_equal RedGrape::Vertex, path[2].class
76
+ assert_equal RedGrape::Edge, path[3].class
77
+ assert_equal RedGrape::Vertex, path[4].class
78
+
79
+ path = g.v(89).outE.inV.outE.inV.path.take.first
80
+ assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
81
+ assert_equal RedGrape::Vertex, path[0].class
82
+ assert_equal RedGrape::Edge, path[1].class
83
+ assert_equal RedGrape::Vertex, path[2].class
84
+ assert_equal RedGrape::Edge, path[3].class
85
+ assert_equal RedGrape::Vertex, path[4].class
17
86
  end
18
87
  end
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.1
4
+ version: 0.0.2
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-05-19 00:00:00.000000000 Z
12
+ date: 2012-06-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdoc
16
- requirement: &70266408089740 !ruby/object:Gem::Requirement
16
+ requirement: &70172128259100 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.10'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70266408089740
24
+ version_requirements: *70172128259100
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: hoe
27
- requirement: &70266408089300 !ruby/object:Gem::Requirement
27
+ requirement: &70172128258660 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,50 +32,65 @@ dependencies:
32
32
  version: '3.0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70266408089300
36
- description: RedGrape is an in-memory graph database written in ruby.
35
+ version_requirements: *70172128258660
36
+ description: RedGrape is an in-memory graph database written in ruby. I made this
37
+ in order to learn how graph databases work so that please do not use this for serious
38
+ purposes.
37
39
  email:
38
40
  - andyjpn@gmail.com
39
41
  executables:
40
- - red_grape
42
+ - redgrape
41
43
  extensions: []
42
44
  extra_rdoc_files:
43
- - History.txt
44
45
  - Manifest.txt
45
46
  - README.txt
47
+ - History.txt
46
48
  files:
47
49
  - .autotest
48
- - History.txt
49
50
  - Manifest.txt
50
- - README.txt
51
51
  - Rakefile
52
- - bin/red_grape
52
+ - README.txt
53
+ - History.txt
54
+ - bin/redgrape
53
55
  - data/graph-example-1.xml
56
+ - data/graph-example-2.xml
57
+ - lib/ext/array_ext.rb
58
+ - lib/ext/object_ext.rb
59
+ - lib/red_grape.rb
60
+ - lib/red_grape/vertex.rb
54
61
  - lib/red_grape/edge.rb
62
+ - lib/red_grape/element.rb
55
63
  - lib/red_grape/graph.rb
56
64
  - lib/red_grape/path_group.rb
65
+ - lib/red_grape/pipe/aggregate_pipe.rb
57
66
  - lib/red_grape/pipe/as_pipe.rb
58
67
  - lib/red_grape/pipe/back_pipe.rb
59
68
  - lib/red_grape/pipe/base.rb
69
+ - lib/red_grape/pipe/cap_pipe.rb
60
70
  - lib/red_grape/pipe/context.rb
71
+ - lib/red_grape/pipe/except_pipe.rb
72
+ - lib/red_grape/pipe/fill_pipe.rb
61
73
  - lib/red_grape/pipe/filter_pipe.rb
74
+ - lib/red_grape/pipe/group_count_pipe.rb
75
+ - lib/red_grape/pipe/has_pipe.rb
62
76
  - lib/red_grape/pipe/if_then_else_pipe.rb
63
77
  - lib/red_grape/pipe/in_pipe.rb
78
+ - lib/red_grape/pipe/in_v_pipe.rb
64
79
  - lib/red_grape/pipe/loop_pipe.rb
80
+ - lib/red_grape/pipe/out_e_pipe.rb
65
81
  - lib/red_grape/pipe/out_pipe.rb
66
82
  - lib/red_grape/pipe/paths_pipe.rb
67
83
  - lib/red_grape/pipe/property_pipe.rb
84
+ - lib/red_grape/pipe/retain_pipe.rb
68
85
  - lib/red_grape/pipe/side_effect_pipe.rb
69
86
  - lib/red_grape/pipe/transform_pipe.rb
70
- - lib/red_grape/propertied_object.rb
71
87
  - lib/red_grape/property_description.rb
72
- - lib/red_grape/vertex.rb
73
- - lib/red_grape/vertex_group.rb
74
- - lib/red_grape.rb
75
- - test/test_on_the_nature_of_pipes.rb
76
- - test/test_red_grape.rb
88
+ - lib/red_grape/serializer/graphml_serializer.rb
89
+ - test/test_element.rb
77
90
  - test/test_graph.rb
78
- - test/test_propertied_object.rb
91
+ - test/test_on_the_nature_of_pipes.rb
92
+ - test/test_pipe.rb
93
+ - test/test_pipe_base.rb
79
94
  - test/test_traversal_patterns.rb
80
95
  - test/test_vertex.rb
81
96
  - .gemtest
@@ -104,11 +119,12 @@ rubyforge_project: red_grape
104
119
  rubygems_version: 1.8.10
105
120
  signing_key:
106
121
  specification_version: 3
107
- summary: RedGrape is an in-memory graph database written in ruby.
122
+ summary: RedGrape is an in-memory graph database written in ruby
108
123
  test_files:
124
+ - test/test_element.rb
109
125
  - test/test_graph.rb
110
126
  - test/test_on_the_nature_of_pipes.rb
111
- - test/test_propertied_object.rb
112
- - test/test_red_grape.rb
127
+ - test/test_pipe.rb
128
+ - test/test_pipe_base.rb
113
129
  - test/test_traversal_patterns.rb
114
130
  - test/test_vertex.rb
data/bin/red_grape DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- abort "you need to write me"
@@ -1,72 +0,0 @@
1
- require 'red_grape/vertex'
2
-
3
- #TODO delegate to array
4
- module RedGrape
5
- class VertexGroup < Vertex
6
- def initialize(group=[])
7
- @group = group
8
- end
9
-
10
- def _group
11
- @group
12
- end
13
-
14
- def pass_through(pipe, context)
15
- @group.map! do |v|
16
- pipe.pass v, context
17
- end
18
- @group.reject! do |v|
19
- v.nil? or (v.respond_to?(:empty?) and v.empty?) # TODO
20
- end
21
- @group.map! do |v|
22
- v.is_a?(self.class) ? v._group : v
23
- end
24
- #@group.flatten!
25
- flatten_group!
26
- @group.all? {|e| e.is_a? self.class} ? self : @group
27
- end
28
-
29
- def flatten_group
30
- ret = []
31
- @group.each do |v|
32
- case v
33
- when Array
34
- ret += v.flatten
35
- when self.class
36
- ret += v._group.flatten_group
37
- else
38
- ret << v
39
- end
40
- end
41
- ret
42
- end
43
-
44
- def flatten_group!
45
- @group = flatten_group
46
- end
47
-
48
- def size
49
- @group.size
50
- end
51
-
52
- def map(&block)
53
- @group.map(&block)
54
- end
55
-
56
- def sort(&block)
57
- @group.sort
58
- end
59
-
60
- def empty?
61
- @group.empty?
62
- end
63
-
64
- def to_a
65
- @group.dup.map{|e| e.is_a?(self.class) ? e.to_a : e}
66
- end
67
-
68
- def to_s
69
- "[#{@group.map(&:to_s).join ', '}]"
70
- end
71
- end
72
- end
@@ -1,8 +0,0 @@
1
- require "test/unit"
2
- require "red_grape"
3
-
4
- class TestRedGrape < Test::Unit::TestCase
5
- def test_sanity
6
- #flunk "write tests or I will kneecap you"
7
- end
8
- end