abstract_graph 1.0.0

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 (59) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.rdoc +43 -0
  5. data/Rakefile +14 -0
  6. data/abstract_graph.gemspec +22 -0
  7. data/lib/abstract_graph.rb +10 -0
  8. data/lib/abstract_graph/composition.rb +11 -0
  9. data/lib/abstract_graph/composition/edge.rb +21 -0
  10. data/lib/abstract_graph/composition/edge/initialize.rb +18 -0
  11. data/lib/abstract_graph/composition/edge/is_coincident.rb +15 -0
  12. data/lib/abstract_graph/composition/uniquenamecollection.rb +21 -0
  13. data/lib/abstract_graph/composition/uniquenamecollection/add.rb +19 -0
  14. data/lib/abstract_graph/composition/uniquenamecollection/dup.rb +20 -0
  15. data/lib/abstract_graph/composition/uniquenamecollection/initialize.rb +14 -0
  16. data/lib/abstract_graph/composition/uniquenamecollection/link.rb +32 -0
  17. data/lib/abstract_graph/composition/uniquenamecollection/method_missing.rb +14 -0
  18. data/lib/abstract_graph/composition/vertex.rb +21 -0
  19. data/lib/abstract_graph/composition/vertex/delete.rb +12 -0
  20. data/lib/abstract_graph/composition/vertex/initialize.rb +14 -0
  21. data/lib/abstract_graph/graph.rb +25 -0
  22. data/lib/abstract_graph/graph/add_edge.rb +30 -0
  23. data/lib/abstract_graph/graph/add_vertex.rb +16 -0
  24. data/lib/abstract_graph/graph/delete_edge.rb +21 -0
  25. data/lib/abstract_graph/graph/delete_vertex.rb +21 -0
  26. data/lib/abstract_graph/graph/dup.rb +14 -0
  27. data/lib/abstract_graph/graph/has_edge.rb +13 -0
  28. data/lib/abstract_graph/graph/has_vertex.rb +13 -0
  29. data/lib/abstract_graph/graph/initialize.rb +16 -0
  30. data/lib/abstract_graph/version.rb +5 -0
  31. data/spec/abstract_graph/composition/edge/initialize_spec.rb +38 -0
  32. data/spec/abstract_graph/composition/edge/is_coincident_spec.rb +33 -0
  33. data/spec/abstract_graph/composition/edge/name_spec.rb +53 -0
  34. data/spec/abstract_graph/composition/edge/vertices_spec.rb +32 -0
  35. data/spec/abstract_graph/composition/edge_spec.rb +8 -0
  36. data/spec/abstract_graph/composition/uniquenamecollection/add_spec.rb +41 -0
  37. data/spec/abstract_graph/composition/uniquenamecollection/dup_spec.rb +29 -0
  38. data/spec/abstract_graph/composition/uniquenamecollection/initialize_spec.rb +21 -0
  39. data/spec/abstract_graph/composition/uniquenamecollection/link_spec.rb +67 -0
  40. data/spec/abstract_graph/composition/uniquenamecollection/method_missing_spec.rb +50 -0
  41. data/spec/abstract_graph/composition/uniquenamecollection_spec.rb +8 -0
  42. data/spec/abstract_graph/composition/vertex/delete_spec.rb +12 -0
  43. data/spec/abstract_graph/composition/vertex/initialize_spec.rb +45 -0
  44. data/spec/abstract_graph/composition/vertex/name_spec.rb +47 -0
  45. data/spec/abstract_graph/composition/vertex/value_spec.rb +46 -0
  46. data/spec/abstract_graph/composition/vertex_spec.rb +8 -0
  47. data/spec/abstract_graph/graph/add_edge_spec.rb +46 -0
  48. data/spec/abstract_graph/graph/add_vertex_spec.rb +29 -0
  49. data/spec/abstract_graph/graph/delete_edge_spec.rb +56 -0
  50. data/spec/abstract_graph/graph/delete_vertex_spec.rb +48 -0
  51. data/spec/abstract_graph/graph/dup_spec.rb +37 -0
  52. data/spec/abstract_graph/graph/has_edge_spec.rb +31 -0
  53. data/spec/abstract_graph/graph/has_vertex_spec.rb +27 -0
  54. data/spec/abstract_graph/graph/intialize_spec.rb +17 -0
  55. data/spec/abstract_graph/graph_spec.rb +6 -0
  56. data/spec/abstract_graph_spec.rb +7 -0
  57. data/spec/dummy_helper.rb +4 -0
  58. data/spec/spec_helper.rb +11 -0
  59. metadata +149 -0
@@ -0,0 +1,16 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # add a vertex named s to the graph
7
+ # p: String s represents the name of the wanted vertex
8
+ def add_vertex( s )
9
+ # create the vertex
10
+ vertex = Vertex.new s
11
+ @vertices.add vertex
12
+ self
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # delete an edge in a replicated graph
7
+ # p: String s represents the name of the edge
8
+ def delete_edge( s )
9
+ other = self.dup
10
+ other.delete_edge! s
11
+ end
12
+
13
+ # delete an edge in a current graph
14
+ # p: String s represents the name of the edge
15
+ def delete_edge!( s )
16
+ @edges.delete s
17
+ self
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # delete a vertex in a new graph
7
+ # p: String s represents the name of the vertex
8
+ def delete_vertex( s )
9
+ other = self.dup
10
+ other.delete_vertex! s
11
+ end
12
+
13
+ # delete a vertex in a current graph
14
+ # p: String s represents the name of the vertex
15
+ def delete_vertex!( s )
16
+ @vertices.delete s
17
+ self
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # does a deep copy of the graph
7
+ def dup
8
+ other = Graph.new
9
+ other.vertices = @vertices.dup
10
+ other
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # returns whether there exists a edge with name string
7
+ # p: String s represents name of edge
8
+ def has_edge?( s )
9
+ @edges.has_key? s || false
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # returns whether there exists a vertex with name string
7
+ # p: String s represents name of query vertex
8
+ def has_vertex?( s )
9
+ @vertices.has_key? s || false
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ # required in "abstract_graph/graph"
2
+
3
+ module AbstractGraph
4
+ class Graph
5
+
6
+ # public constructor
7
+ def initialize
8
+
9
+ @vertices = UniqueNameCollection.new
10
+ @edges = UniqueNameCollection.new
11
+ @vertices.link @edges
12
+
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ # required in "abstract_graph"
2
+
3
+ module AbstractGraph
4
+ VERSION = "1.0.0"
5
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe Edge do
6
+
7
+ before :all do
8
+ @v1 = Vertex.new "v1"
9
+ @v2 = Vertex.new "v2"
10
+ end
11
+
12
+ describe "#new(Vertex, Vertex)" do
13
+
14
+ before :each do
15
+ @edge = Edge.new( @v1, @v2 )
16
+ end
17
+
18
+ it "returns an object of class Edge" do
19
+ @edge.should be_an_instance_of(Edge)
20
+ end
21
+
22
+ end
23
+
24
+ describe "#new(String, Vertex, Vertex)" do
25
+
26
+ before :each do
27
+ @edge = Edge.new("e1", @v1, @v2)
28
+ end
29
+
30
+ it "allows vertices to be initiated with a string name" do
31
+ @edge.should_not be_nil
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe Edge do
6
+
7
+ before :all do
8
+ @v1 = Vertex.new "v1"
9
+ @v2 = Vertex.new "v2"
10
+ @v3 = Vertex.new "v3"
11
+ end
12
+
13
+ before :each do
14
+ @edge = Edge.new( "e1", @v1, @v2 )
15
+ end
16
+
17
+ describe "#is_coincident?(Edge)" do
18
+
19
+ it "returns true if it joins the same two vertices" do
20
+ edge2 = Edge.new( "e2", @v1, @v2 )
21
+ @edge.is_coincident?( edge2 ).should be_true
22
+ end
23
+
24
+ it "returns false if the two edges span >= 3 vertices" do
25
+ edge2 = Edge.new( "e2", @v1, @v3 )
26
+ @edge.is_coincident?( edge2 ).should be_false
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe Edge do
6
+
7
+ before :all do
8
+ @v1 = Vertex.new "v1"
9
+ @v2 = Vertex.new "v2"
10
+ end
11
+
12
+ describe "#name" do
13
+
14
+ before :each do
15
+ @arbitraryString = "arbitraryString"
16
+ @edge = Edge.new @arbitraryString, @v1, @v2
17
+ end
18
+
19
+ it "returns a String (Always)" do
20
+ @edge.name.should be_an_instance_of(String)
21
+ end
22
+
23
+ it "equals to the String in #new(String)" do
24
+ @edge.name.should eql(@arbitraryString)
25
+ end
26
+
27
+ it "equals to empty string if no string was passed in" do
28
+ edge1 = Edge.new @v1, @v2
29
+ edge1.name.should eql("")
30
+ end
31
+
32
+ end
33
+
34
+ describe "#name=" do
35
+
36
+ before :each do
37
+ @edge = Edge.new @v1, @v2
38
+ end
39
+
40
+ it "names the edge and retrieved by #name" do
41
+ @edge.name = "Hello World"
42
+ @edge.name.should eql("Hello World")
43
+ end
44
+
45
+ it "doesn't allow a non-String input" do
46
+ expect { @edge.name = 100 }.to raise_error
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe Edge do
6
+
7
+ before :all do
8
+ @v1 = Vertex.new "v1"
9
+ @v2 = Vertex.new "v2"
10
+ @edge = Edge.new( @v1, @v2 )
11
+ end
12
+
13
+ describe "#vertices" do
14
+
15
+ it "should be an enumerable" do
16
+ @edge.vertices.should be_an_instance_of(Array)
17
+ end
18
+
19
+ it "must be two vertices" do
20
+ @edge.vertices.should have(2).vertices
21
+ end
22
+
23
+ it "is the vertices passed from constructor" do
24
+ @edge.vertices.should include( @v1 )
25
+ @edge.vertices.should include( @v2 )
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe Edge do
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe UniqueNameCollection do
6
+
7
+ before(:each) do
8
+ @collection = UniqueNameCollection.new
9
+ @dummy = Dummy.new
10
+ @dummy.name = "DummyName"
11
+ end
12
+
13
+ describe "#add(Object)" do
14
+
15
+ it "tracks an object that has implemented #name" do
16
+ @collection.add @dummy
17
+ end
18
+
19
+ it "doesn't allow us to add the same object twice" do
20
+ @collection.add @dummy
21
+ expect { @collection.add @dummy }.to raise_error
22
+ end
23
+
24
+ it "doesn't allow two objects to have the same name" do
25
+ dummy2 = Dummy.new
26
+ dummy2.name = "DummyName"
27
+ @collection.add @dummy
28
+ expect { @collection.add dummy2 }.to raise_error
29
+ end
30
+
31
+ it "allows a same named object after deleting it" do
32
+ @collection.add @dummy
33
+ @collection.delete @dummy.name
34
+ expect { @collection.add @dummy }.to_not raise_error
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe UniqueNameCollection do
6
+
7
+ before :each do
8
+ @collection = UniqueNameCollection.new
9
+ end
10
+
11
+ describe "#dup" do
12
+
13
+ it "doesn't have the same id as the original" do
14
+ @collection.object_id.should_not == @collection.dup.object_id
15
+ end
16
+
17
+ it "creates a duplicate of every item in the collection" do
18
+ secondCollection = @collection.dup
19
+ dummy = Dummy.new
20
+ dummy.name = "Dummy"
21
+ @collection.add dummy
22
+ secondCollection.collection.size.should == 0
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe UniqueNameCollection do
6
+
7
+ before (:each) do
8
+ @collection = UniqueNameCollection.new
9
+ end
10
+
11
+ describe "#new" do
12
+
13
+ it "returns an object of class UniqueNameCollection" do
14
+ @collection.should be_an_instance_of(UniqueNameCollection)
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ describe UniqueNameCollection do
6
+
7
+ before :each do
8
+ @collection1 = UniqueNameCollection.new
9
+ @collection2 = UniqueNameCollection.new
10
+ @dummy = Dummy.new
11
+ @dummy.name = "DummyName"
12
+ @dummy2 = Dummy.new
13
+ @dummy2.name = "DummyName"
14
+ end
15
+
16
+ describe "#link(UniqueNameCollection)" do
17
+
18
+ it "doesn't allow first collection to add object of same name" do
19
+ @collection1.link @collection2
20
+ @collection2.add @dummy
21
+ expect { @collection1.add @dummy2 }.to raise_error
22
+ end
23
+
24
+ it "doesn't allow second collection to add object of same name" do
25
+ @collection1.link @collection2
26
+ @collection1.add @dummy
27
+ expect { @collection2.add @dummy2 }.to raise_error
28
+ end
29
+
30
+ it "doesn't allow second collection to re-add objects that already existed" do
31
+ @collection1.add @dummy
32
+ @collection1.link @collection2
33
+ expect { @collection2.add @dummy2 }.to raise_error
34
+ end
35
+
36
+ it "doesn't allow first collection to re-add objects that already existed" do
37
+ @collection2.add @dummy
38
+ @collection1.link @collection2
39
+ expect { @collection1.add @dummy2 }.to raise_error
40
+ end
41
+
42
+ it "returns nil if the intersection during link isn't nil" do
43
+ @collection1.add @dummy
44
+ @collection2.add @dummy2
45
+ @collection1.link(@collection2).should be_nil
46
+ end
47
+
48
+ it "allows a same object ofter deletion" do
49
+ @collection1.add @dummy
50
+ @collection1.link @collection2
51
+ @collection1.delete @dummy.name
52
+ expect { @collection2.add @dummy2 }.to_not raise_error
53
+ end
54
+
55
+ it "can link more than 2 collections together" do
56
+ collection3 = UniqueNameCollection.new
57
+ @collection1.link @collection2
58
+ @collection2.link collection3
59
+ @collection1.add @dummy
60
+ expect { collection3.add @dummy2 }.to raise_error
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+ end
67
+ end