graphshaper 0.2.1 → 0.2.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.
- data/README.md +10 -2
- data/bin/graphshaper +83 -28
- data/lib/graphshaper/adapters/dot_adapter.rb +20 -0
- data/lib/graphshaper/version.rb +1 -1
- data/lib/graphshaper.rb +1 -0
- data/spec/adapters/dot_adapter_spec.rb +34 -0
- metadata +12 -9
data/README.md
CHANGED
@@ -20,9 +20,17 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
The commandline tool expects one argument: The number of vertices you want your generated graph to have. This
|
23
|
+
The commandline tool expects one argument: The number of vertices you want your generated graph to have. This is how to use it:
|
24
24
|
|
25
|
-
graphshaper
|
25
|
+
graphshaper [options] size
|
26
|
+
|
27
|
+
You can use the following options:
|
28
|
+
|
29
|
+
* `-a`, `--avocado`: Store the graph in a local AvocadoDB instance
|
30
|
+
* `-l`, `--log`: Store the graph in two CSV files for nodes and edges
|
31
|
+
* `-d`, `--dot`: Store the graph in the dot format
|
32
|
+
* `-p`, `--png`: Export the graph as a PNG (you need to install graphviz for that – circo is used for the layout)
|
33
|
+
* `--version`: Show version
|
26
34
|
|
27
35
|
You can also use the library in your Ruby Code. You can find the documentation [here](http://rubydoc.info/github/moonglum/graphshaper).
|
28
36
|
|
data/bin/graphshaper
CHANGED
@@ -1,40 +1,95 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'graphshaper'
|
4
|
+
require 'optparse'
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
else
|
10
|
-
number_of_vertices = ARGV[0].to_i
|
11
|
-
inner_vertices = 20
|
12
|
-
|
13
|
-
vertex_output_file = File.new "vertices.csv", "w"
|
14
|
-
edge_output_file = File.new "edges.csv", "w"
|
15
|
-
logger = Graphshaper::LoggingAdapter.new vertex_output_file, edge_output_file
|
6
|
+
options = {}
|
7
|
+
|
8
|
+
optparse = OptionParser.new do |opts|
|
9
|
+
opts.banner = "Usage: graphshaper [options] size"
|
16
10
|
|
17
|
-
|
11
|
+
opts.on("-a", "--avocado", "Store the graph in a local AvocadoDB instance") do |avocado|
|
12
|
+
options[:avocado] = avocado
|
13
|
+
end
|
18
14
|
|
19
|
-
|
20
|
-
|
21
|
-
(number_of_vertices - inner_vertices).times do
|
22
|
-
graph.add_vertex do |preferential_attachment|
|
23
|
-
preferential_attachment > rand
|
24
|
-
end
|
15
|
+
opts.on("-l", "--log", "Store the graph in two CSV files for nodes and edges") do |log|
|
16
|
+
options[:log] = log
|
25
17
|
end
|
26
|
-
end_time = Time.now
|
27
18
|
|
28
|
-
|
19
|
+
opts.on("-d", "--dot", "Store the graph in the dot format") do |dot|
|
20
|
+
options[:dot] = dot
|
21
|
+
end
|
29
22
|
|
30
|
-
|
31
|
-
|
23
|
+
opts.on("-p", "--png", "Export the graph as a PNG (graphviz must be installed)") do |png|
|
24
|
+
options[:dot] = png
|
25
|
+
options[:png] = png
|
26
|
+
end
|
32
27
|
|
33
|
-
|
34
|
-
puts
|
35
|
-
|
36
|
-
puts "Generated and saved in about #{ellapsed_time.round} seconds"
|
37
|
-
else
|
38
|
-
puts "Generated and saved in about #{ellapsed_time.round / 60} minutes and #{ellapsed_time.round % 60} seconds"
|
28
|
+
opts.on_tail("--version", "Show version") do
|
29
|
+
puts Graphshaper::VERSION
|
30
|
+
exit
|
39
31
|
end
|
32
|
+
|
33
|
+
opts.parse!
|
34
|
+
end
|
35
|
+
|
36
|
+
if ARGV.length == 0
|
37
|
+
puts "Please enter a size for your graph."
|
38
|
+
exit
|
39
|
+
end
|
40
|
+
|
41
|
+
number_of_vertices = ARGV.first.to_i
|
42
|
+
inner_vertices = 20
|
43
|
+
|
44
|
+
adapters = []
|
45
|
+
open_files = []
|
46
|
+
|
47
|
+
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)
|
40
53
|
end
|
54
|
+
|
55
|
+
if options[:avocado]
|
56
|
+
adapters << Graphshaper::AvocadoDbAdapter.new("vertices", "edges")
|
57
|
+
end
|
58
|
+
|
59
|
+
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
|
64
|
+
end
|
65
|
+
|
66
|
+
start_time = Time.now
|
67
|
+
|
68
|
+
graph = Graphshaper::UndirectedGraph.without_orphans_with_order_of inner_vertices, adapters: adapters
|
69
|
+
(number_of_vertices - inner_vertices).times do
|
70
|
+
graph.add_vertex { |preferential_attachment| preferential_attachment > rand }
|
71
|
+
end
|
72
|
+
|
73
|
+
dot_adapter.close if options[:dot]
|
74
|
+
|
75
|
+
ellapsed_time = Time.now - start_time
|
76
|
+
|
77
|
+
print "#{graph.order} vertices and #{graph.size} edges generated"
|
78
|
+
|
79
|
+
print " and saved into AvocadoDB" if options[:avocado]
|
80
|
+
print " and logged" if options[:log]
|
81
|
+
print " and generated as a dot" if options[:dot]
|
82
|
+
|
83
|
+
open_files.each { |file| file.close }
|
84
|
+
|
85
|
+
if options[:png]
|
86
|
+
system('circo -Tpng generated_graph.dot -o generated_graph.png')
|
87
|
+
end
|
88
|
+
|
89
|
+
if ellapsed_time < 2
|
90
|
+
puts " in about one second"
|
91
|
+
elsif ellapsed_time < 60
|
92
|
+
puts " in about #{ellapsed_time.round} seconds"
|
93
|
+
else
|
94
|
+
puts " in about #{ellapsed_time.round / 60} minutes and #{ellapsed_time.round % 60} seconds"
|
95
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Graphshaper
|
2
|
+
class DotAdapter
|
3
|
+
def initialize(output_file)
|
4
|
+
@output_file = output_file
|
5
|
+
@output_file << "digraph genereated_graph { \n rankdir=LR;\n node [shape = circle];\n edge [dir=none];\n"
|
6
|
+
end
|
7
|
+
|
8
|
+
def close
|
9
|
+
@output_file << "}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_edge(edge_id, in_id, out_id)
|
13
|
+
@output_file << " #{in_id} -> #{out_id} [ label = \"#{edge_id}\" ];\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_vertex(vertex_id)
|
17
|
+
@output_file << " #{vertex_id};\n"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/graphshaper/version.rb
CHANGED
data/lib/graphshaper.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Graphshaper::DotAdapter do
|
4
|
+
before :each do
|
5
|
+
@output_file = double()
|
6
|
+
@output_file.stub :<<
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should write a header into the file" do
|
10
|
+
@output_file.should_receive(:<<).with("digraph genereated_graph { \n rankdir=LR;\n node [shape = circle];\n edge [dir=none];\n")
|
11
|
+
Graphshaper::DotAdapter.new @output_file
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "initialized Dot Adapter" do
|
15
|
+
before :each do
|
16
|
+
@dot_adapter = Graphshaper::DotAdapter.new @output_file
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should be closeable" do
|
20
|
+
@output_file.should_receive(:<<).with("}")
|
21
|
+
@dot_adapter.close
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should write an edge in the correct format" do
|
25
|
+
@output_file.should_receive(:<<).with(" 1 -> 2 [ label = \"0\" ];\n")
|
26
|
+
@dot_adapter.add_edge(0,1,2)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should write a vertex in the correct format" do
|
30
|
+
@output_file.should_receive(:<<).with(" 15;\n")
|
31
|
+
@dot_adapter.add_vertex(15)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
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.
|
4
|
+
version: 0.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-04-04 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
16
|
-
requirement: &
|
16
|
+
requirement: &70255428363860 !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: *
|
24
|
+
version_requirements: *70255428363860
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &70255428363360 !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: *
|
35
|
+
version_requirements: *70255428363360
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &70255428362900 !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: *
|
46
|
+
version_requirements: *70255428362900
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: yard
|
49
|
-
requirement: &
|
49
|
+
requirement: &70255428362440 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: 0.7.5
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70255428362440
|
58
58
|
description: Generate realistic graphs
|
59
59
|
email:
|
60
60
|
- me@moonglum.net
|
@@ -73,9 +73,11 @@ files:
|
|
73
73
|
- graphshaper.gemspec
|
74
74
|
- lib/graphshaper.rb
|
75
75
|
- lib/graphshaper/adapters/avocadodb_adapter.rb
|
76
|
+
- lib/graphshaper/adapters/dot_adapter.rb
|
76
77
|
- lib/graphshaper/adapters/logging_adapter.rb
|
77
78
|
- lib/graphshaper/undirected_graph.rb
|
78
79
|
- lib/graphshaper/version.rb
|
80
|
+
- spec/adapters/dot_adapter_spec.rb
|
79
81
|
- spec/adapters/logging_adapter_spec.rb
|
80
82
|
- spec/spec_helper.rb
|
81
83
|
- spec/undirected_graph_spec.rb
|
@@ -104,6 +106,7 @@ signing_key:
|
|
104
106
|
specification_version: 3
|
105
107
|
summary: Graphshaper can generate realistic, scale-free graphs of any size.
|
106
108
|
test_files:
|
109
|
+
- spec/adapters/dot_adapter_spec.rb
|
107
110
|
- spec/adapters/logging_adapter_spec.rb
|
108
111
|
- spec/spec_helper.rb
|
109
112
|
- spec/undirected_graph_spec.rb
|