graphshaper 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ .DS_Store
1
2
  *.gem
2
3
  *.rbc
3
4
  .bundle
@@ -16,3 +17,4 @@ spec/reports
16
17
  test/tmp
17
18
  test/version_tmp
18
19
  tmp
20
+ generated_*
data/.travis.yml CHANGED
@@ -4,3 +4,4 @@ rvm:
4
4
  - 1.9.3
5
5
  - jruby-19mode
6
6
  - rbx-19mode
7
+ - ruby-head
data/bin/graphshaper CHANGED
@@ -3,6 +3,8 @@
3
3
  require 'graphshaper'
4
4
  require 'optparse'
5
5
 
6
+ start_time = Time.now
7
+
6
8
  options = {}
7
9
 
8
10
  optparse = OptionParser.new do |opts|
@@ -20,6 +22,10 @@ optparse = OptionParser.new do |opts|
20
22
  options[:dot] = dot
21
23
  end
22
24
 
25
+ opts.on("-s", "--sql", "Store the graph in sql format") do |sql|
26
+ options[:sql] = sql
27
+ end
28
+
23
29
  opts.on("-p", "--png", "Export the graph as a PNG (graphviz must be installed)") do |png|
24
30
  options[:dot] = png
25
31
  options[:png] = png
@@ -38,18 +44,28 @@ if ARGV.length == 0
38
44
  exit
39
45
  end
40
46
 
41
- number_of_vertices = ARGV.first.to_i
42
- inner_vertices = 20
43
-
47
+ # check for installed components: graphviz
48
+ if options[:png] and `which circo` == ""
49
+ puts "graphviz is not installed, can't export to png. Please install graphviz or run without --png option."
50
+ exit
51
+ end
52
+
53
+ # check for running component: AvocadoDB
54
+ if options[:avocado]
55
+ begin
56
+ HTTParty.get 'http://localhost:8529'
57
+ rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
58
+ puts "No AvocadoDB instance is running on port 8529. Please start AvocadoDB or run without --avocado option."
59
+ exit
60
+ end
61
+ end
62
+
44
63
  adapters = []
45
- open_files = []
46
64
 
47
65
  if options[:log]
48
- vertex_output_file = File.new "vertices.csv", "w"
49
- open_files << vertex_output_file
50
- edge_output_file = File.new "edges.csv", "w"
51
- open_files << edge_output_file
52
- adapters << Graphshaper::LoggingAdapter.new(vertex_output_file, edge_output_file)
66
+ generated_vertices_csv_file = File.new("generated_vertices.csv", "w")
67
+ generated_edges_csv_file = File.new("generated_edges.csv", "w")
68
+ adapters << Graphshaper::LoggingAdapter.new(generated_vertices_csv_file, generated_edges_csv_file)
53
69
  end
54
70
 
55
71
  if options[:avocado]
@@ -57,35 +73,44 @@ if options[:avocado]
57
73
  end
58
74
 
59
75
  if options[:dot]
60
- dot_output_file = File.new "generated_graph.dot", "w"
61
- open_files << dot_output_file
62
- dot_adapter = Graphshaper::DotAdapter.new(dot_output_file)
63
- adapters << dot_adapter
76
+ generated_graph_dot_file = File.new("generated_graph.dot", "w")
77
+ adapters << Graphshaper::DotAdapter.new(generated_graph_dot_file)
64
78
  end
65
79
 
66
- start_time = Time.now
80
+ if options[:sql]
81
+ generated_graph_sql_file = File.new("generated_graph.sql", "w")
82
+ generated_vertices_sql_file = File.new("generated_vertices.sql", "w")
83
+ generated_edges_sql_file = File.new("generated_edges.sql", "w")
84
+
85
+ adapters << Graphshaper::SqlAdapter.new(generated_graph_sql_file, generated_vertices_sql_file, generated_edges_sql_file)
86
+ end
87
+
88
+ inner_vertices = 20
89
+ outer_vertices = ARGV.first.to_i - inner_vertices
90
+
91
+ graph = Graphshaper::UndirectedGraph.new inner_vertices, adapters: adapters
67
92
 
68
- graph = Graphshaper::UndirectedGraph.without_orphans_with_order_of inner_vertices, adapters: adapters
69
- (number_of_vertices - inner_vertices).times do
93
+ graph.connect_all_vertices
94
+
95
+ outer_vertices.times do
70
96
  graph.add_vertex { |preferential_attachment| preferential_attachment > rand }
71
97
  end
72
98
 
73
- dot_adapter.close if options[:dot]
74
-
75
- ellapsed_time = Time.now - start_time
99
+ adapters.each { |adapter| adapter.close }
76
100
 
77
101
  print "#{graph.order} vertices and #{graph.size} edges generated"
78
102
 
79
103
  print " and saved into AvocadoDB" if options[:avocado]
80
104
  print " and logged" if options[:log]
81
105
  print " and generated as a dot" if options[:dot]
82
-
83
- open_files.each { |file| file.close }
106
+ print " and saved in sql format" if options[:sql]
84
107
 
85
108
  if options[:png]
86
109
  system('circo -Tpng generated_graph.dot -o generated_graph.png')
87
110
  end
88
111
 
112
+ ellapsed_time = Time.now - start_time
113
+
89
114
  if ellapsed_time < 2
90
115
  puts " in about one second"
91
116
  elsif ellapsed_time < 60
data/graphshaper.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
6
6
  gem.email = ["me@moonglum.net"]
7
7
  gem.description = %q{Generate realistic graphs}
8
8
  gem.summary = %q{Graphshaper can generate realistic, scale-free graphs of any size.}
9
- gem.homepage = "http://github.com/moonglum/graphshaper"
9
+ gem.homepage = "http://moonglum.github.com/graphshaper"
10
10
 
11
11
  gem.files = `git ls-files`.split($\)
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -19,4 +19,5 @@ Gem::Specification.new do |gem|
19
19
  gem.add_development_dependency "rake", "~> 0.9.2.2"
20
20
  gem.add_development_dependency "rspec", "~> 2.9.0"
21
21
  gem.add_development_dependency "yard", "~> 0.7.5"
22
+ gem.add_development_dependency "webmock", "~> 1.8.6"
22
23
  end
data/lib/graphshaper.rb CHANGED
@@ -3,6 +3,7 @@ require "graphshaper/undirected_graph"
3
3
  require "graphshaper/adapters/avocadodb_adapter"
4
4
  require "graphshaper/adapters/logging_adapter"
5
5
  require "graphshaper/adapters/dot_adapter"
6
+ require "graphshaper/adapters/sql_adapter"
6
7
 
7
8
  module Graphshaper
8
9
  end
@@ -16,7 +16,6 @@ module Graphshaper
16
16
  [@vertex_collection_name, @edge_collection_name].each { |collection| drop_and_create_collection collection}
17
17
  end
18
18
 
19
- # @return [String] id in the database
20
19
  def add_vertex(id)
21
20
  cmd = "/document?collection=#{@vertex_collection_name}"
22
21
  body = "{ \"id\" : \"#{id}\" }"
@@ -34,11 +33,15 @@ module Graphshaper
34
33
  @edge_matching[edge_id] = response.parsed_response["_id"]
35
34
  end
36
35
 
36
+ def close
37
+
38
+ end
39
+
37
40
  private
38
41
 
39
42
  def drop_and_create_collection(name)
40
- self.class.delete "/_api/collection/#{name}"
41
- self.class.post "/_api/collection", body: "{ \"name\" : \"#{name}\"}"
42
- end
43
+ self.class.delete "/_api/collection/#{name}"
44
+ self.class.post "/_api/collection", body: "{ \"name\" : \"#{name}\"}"
45
+ end
43
46
  end
44
47
  end
@@ -5,10 +5,6 @@ module Graphshaper
5
5
  @output_file << "digraph genereated_graph { \n rankdir=LR;\n node [shape = circle];\n edge [dir=none];\n"
6
6
  end
7
7
 
8
- def close
9
- @output_file << "}"
10
- end
11
-
12
8
  def add_edge(edge_id, in_id, out_id)
13
9
  @output_file << " #{in_id} -> #{out_id} [ label = \"#{edge_id}\" ];\n"
14
10
  end
@@ -16,5 +12,10 @@ module Graphshaper
16
12
  def add_vertex(vertex_id)
17
13
  @output_file << " #{vertex_id};\n"
18
14
  end
15
+
16
+ def close
17
+ @output_file << "}"
18
+ @output_file.close
19
+ end
19
20
  end
20
21
  end
@@ -16,5 +16,10 @@ module Graphshaper
16
16
  def add_vertex(vertex_id)
17
17
  @vertex_logger_file << "#{vertex_id}\n"
18
18
  end
19
+
20
+ def close
21
+ @vertex_logger_file.close
22
+ @edge_logger_file.close
23
+ end
19
24
  end
20
25
  end
@@ -0,0 +1,41 @@
1
+ module Graphshaper
2
+ class SqlAdapter
3
+ def initialize(schema_file, vertex_file, edge_file)
4
+ @schema_file = schema_file
5
+ @vertex_file = vertex_file
6
+ @edge_file = edge_file
7
+
8
+ File.readlines("templates/schema.sql").each do |schema_line|
9
+ @schema_file << schema_line
10
+ end
11
+
12
+ @vertex_file << "LOCK TABLES `vertices` WRITE;\n"
13
+ @vertex_file << "INSERT INTO `vertices` (`id`, `vertex_id`)\n"
14
+ @vertex_file << "VALUES\n\t"
15
+
16
+ @edge_file << "LOCK TABLES `edges` WRITE;\n"
17
+ @edge_file << "INSERT INTO `edges` (`id`, `edge_id`, `from_id`, `to_id`)\n"
18
+ @edge_file << "VALUES\n\t"
19
+
20
+ @first_vertex = true
21
+ @first_edge = true
22
+ end
23
+
24
+ def add_vertex(vertex_id)
25
+ @vertex_file << ",\n\t" unless @first_vertex
26
+ @vertex_file << "(#{vertex_id + 1},#{vertex_id})"
27
+ @first_vertex = false
28
+ end
29
+
30
+ def add_edge(edge_id, from_id, to_id)
31
+ @edge_file << ",\n\t" unless @first_edge
32
+ @edge_file << "(#{edge_id + 1},#{edge_id},#{from_id + 1},#{to_id + 1})"
33
+ @first_edge = false
34
+ end
35
+
36
+ def close
37
+ [@vertex_file, @edge_file].each { |file| file << ";\nUNLOCK TABLES;"}
38
+ [@schema_file, @vertex_file, @edge_file].each { |file| file.close }
39
+ end
40
+ end
41
+ end
@@ -20,25 +20,6 @@ module Graphshaper
20
20
  @edges = Set.new
21
21
  end
22
22
 
23
- # Create a graph with a given number of vertices. Then it adds random edges until the graph doesn't contain any orphans (vertices without edges).
24
- #
25
- # @param [Integer] number_of_vertices The number of vertices that the generated graph should have
26
- # @param [Hash] options_hash The options to create an undirected graph
27
- # @option options_hash [Array<Object>] :adapters An array of adapters you want to use
28
- # @return [UndirectedGraph] The generated graph.
29
- def UndirectedGraph.without_orphans_with_order_of(number_of_vertices, options_hash = {})
30
- graph = self.new number_of_vertices, options_hash
31
-
32
- while graph.number_of_orphans > 0
33
- vertex_orphan = graph.orphans.shuffle.first
34
- while vertex_orphan == (random_vertex = rand(graph.order)); end
35
-
36
- graph.add_edge vertex_orphan, random_vertex
37
- end
38
-
39
- return graph
40
- end
41
-
42
23
  # The number of vertices.
43
24
  #
44
25
  # @return [Integer] Number of vertices.
@@ -53,6 +34,16 @@ module Graphshaper
53
34
  @edges.length
54
35
  end
55
36
 
37
+ # Connect all orphans with existing nodes
38
+ def connect_all_vertices
39
+ while number_of_orphans > 0
40
+ vertex_orphan = orphans.shuffle.first
41
+ while vertex_orphan == (random_vertex = rand(order)); end
42
+
43
+ add_edge vertex_orphan, random_vertex
44
+ end
45
+ end
46
+
56
47
  # Add a new vertex to the graph.
57
48
  # If you call it with a block {|preferential_attachment| ... }, the block will be called for every existing vertex: An edge from the new vertex to this vertex will be created if and only if the block returns true.
58
49
  # @yield [preferential_attachment] The block that tests if the edge should be added.
@@ -1,3 +1,3 @@
1
1
  module Graphshaper
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+ require "graphshaper/adapters/avocadodb_adapter"
3
+
4
+ describe Graphshaper::AvocadoDbAdapter do
5
+ before :each do
6
+ stub_request(:delete, "http://localhost:8529/_api/collection/vertices").to_return(:status => 200, :body => "", :headers => {})
7
+ stub_request(:post, "http://localhost:8529/_api/collection").with(:body => "{ \"name\" : \"vertices\"}")
8
+ stub_request(:delete, "http://localhost:8529/_api/collection/edges").to_return(:status => 200, :body => "", :headers => {})
9
+ stub_request(:post, "http://localhost:8529/_api/collection").with(:body => "{ \"name\" : \"edges\"}")
10
+ stub_request(:post, "http://localhost:8529/document?collection=vertices")
11
+ .with(:body => "{ \"id\" : \"1\" }")
12
+ .to_return(:body => "{ \"_rev\": 26445614, \"_id\": \"73482/26445614\", \"error\": false }", :status => 200 )
13
+ stub_request(:post, "http://localhost:8529/document?collection=vertices")
14
+ .with(:body => "{ \"id\" : \"2\" }")
15
+ .to_return(:body => "{ \"_rev\": 26445614, \"_id\": \"73482/26445615\", \"error\": false }", :status => 200 )
16
+ stub_request(:post, "http://localhost:8529/edge?collection=edges&from=73482/26445614&to=73482/26445615")
17
+ .with(:body => "{ \"id\" : \"7\" }")
18
+ .to_return(:body => "{ \"_rev\": 9683012, \"_id\": \"7848004/9683012\", \"error\": false }", :status => 200)
19
+
20
+ @avocado_adapter = Graphshaper::AvocadoDbAdapter.new "vertices", "edges"
21
+ end
22
+
23
+ it "should drop the collections on startup" do
24
+ WebMock.should have_requested(:delete, "http://localhost:8529/_api/collection/vertices")
25
+ WebMock.should have_requested(:delete, "http://localhost:8529/_api/collection/edges")
26
+ end
27
+
28
+ it "should create the collections on startup" do
29
+ WebMock.should have_requested(:post, "http://localhost:8529/_api/collection").with(:body => "{ \"name\" : \"vertices\"}")
30
+ WebMock.should have_requested(:post, "http://localhost:8529/_api/collection").with(:body => "{ \"name\" : \"edges\"}")
31
+ end
32
+
33
+ it "should add a vertex" do
34
+ @avocado_adapter.add_vertex 1
35
+
36
+ WebMock.should have_requested(:post, "http://localhost:8529/document?collection=vertices").with(:body => "{ \"id\" : \"1\" }")
37
+ end
38
+
39
+ it "should add an edge with the correct vertex ids" do
40
+ @avocado_adapter.add_vertex 1
41
+ @avocado_adapter.add_vertex 2
42
+ @avocado_adapter.add_edge 7, 1, 2
43
+
44
+ WebMock.should have_requested(:post, "http://localhost:8529/edge?collection=edges&from=73482/26445614&to=73482/26445615").with(:body => "{ \"id\" : \"7\" }")
45
+ end
46
+ end
@@ -1,4 +1,5 @@
1
1
  require "spec_helper"
2
+ require "graphshaper/adapters/dot_adapter.rb"
2
3
 
3
4
  describe Graphshaper::DotAdapter do
4
5
  before :each do
@@ -18,6 +19,7 @@ describe Graphshaper::DotAdapter do
18
19
 
19
20
  it "should be closeable" do
20
21
  @output_file.should_receive(:<<).with("}")
22
+ @output_file.should_receive(:close)
21
23
  @dot_adapter.close
22
24
  end
23
25
 
@@ -1,4 +1,5 @@
1
1
  require "spec_helper"
2
+ require "graphshaper/adapters/logging_adapter"
2
3
 
3
4
  describe Graphshaper::LoggingAdapter do
4
5
  before :each do
@@ -0,0 +1,56 @@
1
+ require 'stringio'
2
+ require "spec_helper"
3
+ require "graphshaper/adapters/sql_adapter"
4
+
5
+ describe Graphshaper::SqlAdapter do
6
+ before :each do
7
+ @schema_file = StringIO.new
8
+ @vertex_file = StringIO.new
9
+ @edge_file = StringIO.new
10
+ end
11
+
12
+ describe "generated files" do
13
+ before :each do
14
+ @sql_adapter = Graphshaper::SqlAdapter.new @schema_file, @vertex_file, @edge_file
15
+ end
16
+
17
+ it "should write the schema to the file" do
18
+ schema_string = @schema_file.string
19
+
20
+ File.readlines("templates/schema.sql").each do |schema_line|
21
+ schema_string.should include(schema_line)
22
+ end
23
+ end
24
+
25
+ it "should write the vertices to the file" do
26
+ @sql_adapter.add_vertex(0)
27
+ @sql_adapter.add_vertex(1)
28
+ @sql_adapter.close
29
+
30
+ vertex_string = @vertex_file.string
31
+
32
+ vertex_string.should include(" (1,0),\n")
33
+ vertex_string.should include(" (2,1);\n")
34
+ end
35
+
36
+ it "should write the vertices to the file" do
37
+ @sql_adapter.add_edge(0,5,6)
38
+ @sql_adapter.add_edge(1,7,8)
39
+ @sql_adapter.close
40
+
41
+ edge_string = @edge_file.string
42
+
43
+ edge_string.should include(" (1,0,6,7),\n")
44
+ edge_string.should include(" (2,1,8,9);\n")
45
+ end
46
+ end
47
+
48
+ it "should close the three files" do
49
+ @schema_file.should_receive(:close)
50
+ @edge_file.should_receive(:close)
51
+ @vertex_file.should_receive(:close)
52
+
53
+ sql_adapter = Graphshaper::SqlAdapter.new @schema_file, @vertex_file, @edge_file
54
+ sql_adapter.close
55
+ end
56
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
3
 
4
- require 'graphshaper'
4
+ # For HTTP Testing
5
+ require 'webmock/rspec'
@@ -1,4 +1,5 @@
1
1
  require "spec_helper"
2
+ require "graphshaper/undirected_graph"
2
3
 
3
4
  describe Graphshaper::UndirectedGraph do
4
5
  it "should create a graph with a given number of vertices and no edges" do
@@ -68,19 +69,9 @@ describe Graphshaper::UndirectedGraph do
68
69
  @graph.add_edge 1,2
69
70
  @graph.degree_distribution.should ==[2,2,1]
70
71
  end
71
- end
72
-
73
- describe "random generated graph without orphans" do
74
- before :each do
75
- @graph = Graphshaper::UndirectedGraph.without_orphans_with_order_of 15
76
- end
77
-
78
- it "should have the correct order" do
79
- @graph.order.should ==(15)
80
- end
81
72
 
82
- it "should have no orphans" do
83
- @graph.number_of_orphans.should ==(0)
73
+ it "should be able to connect all vertices" do
74
+ expect { @graph.connect_all_vertices }.to change{ @graph.number_of_orphans }.by(-5)
84
75
  end
85
76
  end
86
77
 
@@ -0,0 +1,20 @@
1
+ DROP TABLE IF EXISTS `edges`;
2
+ DROP TABLE IF EXISTS `vertices`;
3
+
4
+ CREATE TABLE `vertices` (
5
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
6
+ `vertex_id` int(11) unsigned NOT NULL,
7
+ PRIMARY KEY (`id`)
8
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
9
+
10
+ CREATE TABLE `edges` (
11
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
12
+ `edge_id` int(11) unsigned NOT NULL,
13
+ `from_id` int(11) unsigned NOT NULL,
14
+ `to_id` int(11) unsigned NOT NULL,
15
+ PRIMARY KEY (`id`),
16
+ KEY `from_id` (`from_id`),
17
+ KEY `to_id` (`to_id`),
18
+ CONSTRAINT `edges_ibfk_2` FOREIGN KEY (`to_id`) REFERENCES `vertices` (`id`),
19
+ CONSTRAINT `edges_ibfk_1` FOREIGN KEY (`from_id`) REFERENCES `vertices` (`id`)
20
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphshaper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
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-04-04 00:00:00.000000000Z
12
+ date: 2012-04-10 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
16
- requirement: &70255428363860 !ruby/object:Gem::Requirement
16
+ requirement: &70105889221160 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.8.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70255428363860
24
+ version_requirements: *70105889221160
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &70255428363360 !ruby/object:Gem::Requirement
27
+ requirement: &70105889192700 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.9.2.2
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70255428363360
35
+ version_requirements: *70105889192700
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70255428362900 !ruby/object:Gem::Requirement
38
+ requirement: &70105889192240 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.9.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70255428362900
46
+ version_requirements: *70105889192240
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yard
49
- requirement: &70255428362440 !ruby/object:Gem::Requirement
49
+ requirement: &70105889191740 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,7 +54,18 @@ dependencies:
54
54
  version: 0.7.5
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70255428362440
57
+ version_requirements: *70105889191740
58
+ - !ruby/object:Gem::Dependency
59
+ name: webmock
60
+ requirement: &70105889191160 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 1.8.6
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70105889191160
58
69
  description: Generate realistic graphs
59
70
  email:
60
71
  - me@moonglum.net
@@ -75,13 +86,17 @@ files:
75
86
  - lib/graphshaper/adapters/avocadodb_adapter.rb
76
87
  - lib/graphshaper/adapters/dot_adapter.rb
77
88
  - lib/graphshaper/adapters/logging_adapter.rb
89
+ - lib/graphshaper/adapters/sql_adapter.rb
78
90
  - lib/graphshaper/undirected_graph.rb
79
91
  - lib/graphshaper/version.rb
92
+ - spec/adapters/avocadodb_adapter_spec.rb
80
93
  - spec/adapters/dot_adapter_spec.rb
81
94
  - spec/adapters/logging_adapter_spec.rb
95
+ - spec/adapters/sql_adapter_spec.rb
82
96
  - spec/spec_helper.rb
83
97
  - spec/undirected_graph_spec.rb
84
- homepage: http://github.com/moonglum/graphshaper
98
+ - templates/schema.sql
99
+ homepage: http://moonglum.github.com/graphshaper
85
100
  licenses: []
86
101
  post_install_message:
87
102
  rdoc_options: []
@@ -106,8 +121,10 @@ signing_key:
106
121
  specification_version: 3
107
122
  summary: Graphshaper can generate realistic, scale-free graphs of any size.
108
123
  test_files:
124
+ - spec/adapters/avocadodb_adapter_spec.rb
109
125
  - spec/adapters/dot_adapter_spec.rb
110
126
  - spec/adapters/logging_adapter_spec.rb
127
+ - spec/adapters/sql_adapter_spec.rb
111
128
  - spec/spec_helper.rb
112
129
  - spec/undirected_graph_spec.rb
113
130
  has_rdoc: