graphshaper 0.1 → 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.
- data/bin/graphshaper +4 -3
- data/graphshaper.gemspec +1 -0
- data/lib/graphshaper/adapters/logging_adapter.rb +20 -0
- data/lib/graphshaper/undirected_graph.rb +14 -9
- data/lib/graphshaper/version.rb +1 -1
- data/lib/graphshaper.rb +1 -0
- data/spec/adapters/logging_adapter_spec.rb +32 -0
- data/spec/undirected_graph_spec.rb +27 -18
- metadata +21 -7
data/bin/graphshaper
CHANGED
@@ -10,11 +10,12 @@ else
|
|
10
10
|
number_of_vertices = ARGV[0].to_i
|
11
11
|
inner_vertices = 20
|
12
12
|
|
13
|
-
edge_output_file = File.new "edges.csv", "w"
|
14
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
|
15
16
|
|
16
17
|
start_time = Time.now
|
17
|
-
graph = Graphshaper::UndirectedGraph.without_orphans_with_order_of inner_vertices,
|
18
|
+
graph = Graphshaper::UndirectedGraph.without_orphans_with_order_of inner_vertices, adapters: [logger]
|
18
19
|
(number_of_vertices - inner_vertices).times do
|
19
20
|
graph.add_vertex do |preferential_attachment|
|
20
21
|
preferential_attachment > rand
|
@@ -34,4 +35,4 @@ else
|
|
34
35
|
else
|
35
36
|
puts "Generated in about #{ellapsed_time.round / 60} minutes and #{ellapsed_time.round % 60} seconds"
|
36
37
|
end
|
37
|
-
end
|
38
|
+
end
|
data/graphshaper.gemspec
CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Graphshaper::VERSION
|
17
17
|
|
18
|
+
gem.add_dependency "httparty", "~> 0.8.1"
|
18
19
|
gem.add_development_dependency "rake", "~> 0.9.2.2"
|
19
20
|
gem.add_development_dependency "rspec", "~> 2.9.0"
|
20
21
|
gem.add_development_dependency "yard", "~> 0.7.5"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Graphshaper
|
2
|
+
|
3
|
+
# A simple adapter for logging the created graph
|
4
|
+
class LoggingAdapter
|
5
|
+
def initialize(vertex_logger_file, edge_logger_file)
|
6
|
+
@vertex_logger_file = vertex_logger_file
|
7
|
+
@edge_logger_file = edge_logger_file
|
8
|
+
@vertex_logger_file << "vertex_id\n"
|
9
|
+
@edge_logger_file << "edge_id,from_id,to_id\n"
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_edge(edge_id, from_id, to_id)
|
13
|
+
@edge_logger_file << "#{edge_id},#{from_id},#{to_id}\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_vertex(vertex_id)
|
17
|
+
@vertex_logger_file << "#{vertex_id}\n"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -9,12 +9,10 @@ module Graphshaper
|
|
9
9
|
#
|
10
10
|
# @param [Integer] number_of_vertices The number of vertices that the generated graph should have
|
11
11
|
# @param [Hash] options_hash The options to create an undirected graph
|
12
|
-
# @option options_hash [
|
13
|
-
# @option options_hash [IO] ::vertex_creation_logger An IO object that should log every vertex creation in the graph (default: no logging)
|
12
|
+
# @option options_hash [Array<Object>] :adapters An array of adapters you want to use
|
14
13
|
def initialize(number_of_vertices, options_hash = {})
|
15
|
-
@
|
16
|
-
|
17
|
-
|
14
|
+
@adapters = options_hash[:adapters] if options_hash.has_key? :adapters
|
15
|
+
|
18
16
|
@vertex_degrees = []
|
19
17
|
@unconnected_vertices = Set.new
|
20
18
|
|
@@ -26,8 +24,7 @@ module Graphshaper
|
|
26
24
|
#
|
27
25
|
# @param [Integer] number_of_vertices The number of vertices that the generated graph should have
|
28
26
|
# @param [Hash] options_hash The options to create an undirected graph
|
29
|
-
# @option options_hash [
|
30
|
-
# @option options_hash [IO] ::vertex_creation_logger An IO object that should log every vertex creation in the graph (default: no logging)
|
27
|
+
# @option options_hash [Array<Object>] :adapters An array of adapters you want to use
|
31
28
|
# @return [UndirectedGraph] The generated graph.
|
32
29
|
def UndirectedGraph.without_orphans_with_order_of(number_of_vertices, options_hash = {})
|
33
30
|
graph = self.new number_of_vertices, options_hash
|
@@ -70,7 +67,11 @@ module Graphshaper
|
|
70
67
|
@vertex_degrees << 0
|
71
68
|
@unconnected_vertices << new_vertex_id
|
72
69
|
|
73
|
-
|
70
|
+
unless @adapters.nil?
|
71
|
+
@adapters.each do |adapter|
|
72
|
+
adapter.add_vertex new_vertex_id
|
73
|
+
end
|
74
|
+
end
|
74
75
|
|
75
76
|
if block_given?
|
76
77
|
each_vertex_with_preferential_attachment do |vertex_id, preferential_attachment|
|
@@ -98,7 +99,11 @@ module Graphshaper
|
|
98
99
|
@vertex_degrees[second_vertex_id] += 1
|
99
100
|
@edges << [first_vertex_id, second_vertex_id].sort
|
100
101
|
|
101
|
-
|
102
|
+
unless @adapters.nil?
|
103
|
+
@adapters.each do |adapter|
|
104
|
+
adapter.add_edge @edges.length - 1, first_vertex_id, second_vertex_id
|
105
|
+
end
|
106
|
+
end
|
102
107
|
end
|
103
108
|
end
|
104
109
|
|
data/lib/graphshaper/version.rb
CHANGED
data/lib/graphshaper.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Graphshaper::LoggingAdapter do
|
4
|
+
before :each do
|
5
|
+
@vertex_logger = double()
|
6
|
+
@vertex_logger.stub :<<
|
7
|
+
@edge_logger = double()
|
8
|
+
@edge_logger.stub :<<
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should write a header into the files" do
|
12
|
+
@vertex_logger.should_receive(:<<).with("vertex_id\n")
|
13
|
+
@edge_logger.should_receive(:<<).with("edge_id,from_id,to_id\n")
|
14
|
+
Graphshaper::LoggingAdapter.new @vertex_logger, @edge_logger
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "Initialized Logger" do
|
18
|
+
before :each do
|
19
|
+
@adapter = Graphshaper::LoggingAdapter.new @vertex_logger, @edge_logger
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should write edges to the logger at edge creation" do
|
23
|
+
@edge_logger.should_receive(:<<).with("0,1,3\n")
|
24
|
+
@adapter.add_edge 0,1,3
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should write vertices to the logger at vertex creation" do
|
28
|
+
@vertex_logger.should_receive(:<<).with("5\n")
|
29
|
+
@adapter.add_vertex 5
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require "spec_helper"
|
2
|
-
require "stringio" # for testing the logger
|
3
2
|
|
4
3
|
describe Graphshaper::UndirectedGraph do
|
5
4
|
it "should create a graph with a given number of vertices and no edges" do
|
@@ -8,23 +7,6 @@ describe Graphshaper::UndirectedGraph do
|
|
8
7
|
graph.size.should ==(0)
|
9
8
|
end
|
10
9
|
|
11
|
-
it "should create a graph with a logger for edge creation" do
|
12
|
-
edge_creation_logger = StringIO.new
|
13
|
-
graph = Graphshaper::UndirectedGraph.new 5, edge_creation_logger: edge_creation_logger
|
14
|
-
|
15
|
-
graph.add_edge 1,3
|
16
|
-
graph.add_edge 2,3
|
17
|
-
edge_creation_logger.string.should ==("1,3\n2,3\n")
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should create a graph with a logger for vertex creation" do
|
21
|
-
vertex_creation_logger = StringIO.new
|
22
|
-
graph = Graphshaper::UndirectedGraph.new 5, vertex_creation_logger: vertex_creation_logger
|
23
|
-
|
24
|
-
graph.add_vertex
|
25
|
-
vertex_creation_logger.string.should ==("0\n1\n2\n3\n4\n5\n")
|
26
|
-
end
|
27
|
-
|
28
10
|
describe "initialized graph" do
|
29
11
|
before :each do
|
30
12
|
@graph = Graphshaper::UndirectedGraph.new 5
|
@@ -167,4 +149,31 @@ describe Graphshaper::UndirectedGraph do
|
|
167
149
|
@graph.size.should ==(3)
|
168
150
|
end
|
169
151
|
end
|
152
|
+
|
153
|
+
describe "Adapter Support" do
|
154
|
+
before :each do
|
155
|
+
@adapter = double()
|
156
|
+
@adapter.stub :add_vertex
|
157
|
+
@adapter.stub :add_edge
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should tell the adapter about the inital vertices on creation" do
|
161
|
+
5.times do |vertex_id|
|
162
|
+
@adapter.should_receive(:add_vertex).with(vertex_id)
|
163
|
+
end
|
164
|
+
graph = Graphshaper::UndirectedGraph.new 5, adapters: [@adapter]
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should tell the adapter about later added vertices" do
|
168
|
+
graph = Graphshaper::UndirectedGraph.new 5, adapters: [@adapter]
|
169
|
+
@adapter.should_receive(:add_vertex).with(5)
|
170
|
+
graph.add_vertex
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should tell the adapter about later added edges" do
|
174
|
+
graph = Graphshaper::UndirectedGraph.new 5, adapters: [@adapter]
|
175
|
+
@adapter.should_receive(:add_edge).with(0, 1, 2)
|
176
|
+
graph.add_edge 1, 2
|
177
|
+
end
|
178
|
+
end
|
170
179
|
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.
|
4
|
+
version: '0.2'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,9 +11,20 @@ bindir: bin
|
|
11
11
|
cert_chain: []
|
12
12
|
date: 2012-04-04 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: httparty
|
16
|
+
requirement: &70304824409140 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.8.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70304824409140
|
14
25
|
- !ruby/object:Gem::Dependency
|
15
26
|
name: rake
|
16
|
-
requirement: &
|
27
|
+
requirement: &70304824408640 !ruby/object:Gem::Requirement
|
17
28
|
none: false
|
18
29
|
requirements:
|
19
30
|
- - ~>
|
@@ -21,10 +32,10 @@ dependencies:
|
|
21
32
|
version: 0.9.2.2
|
22
33
|
type: :development
|
23
34
|
prerelease: false
|
24
|
-
version_requirements: *
|
35
|
+
version_requirements: *70304824408640
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: rspec
|
27
|
-
requirement: &
|
38
|
+
requirement: &70304824408180 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ~>
|
@@ -32,10 +43,10 @@ dependencies:
|
|
32
43
|
version: 2.9.0
|
33
44
|
type: :development
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70304824408180
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: yard
|
38
|
-
requirement: &
|
49
|
+
requirement: &70304824407720 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ~>
|
@@ -43,7 +54,7 @@ dependencies:
|
|
43
54
|
version: 0.7.5
|
44
55
|
type: :development
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70304824407720
|
47
58
|
description: Generate realistic graphs
|
48
59
|
email:
|
49
60
|
- me@moonglum.net
|
@@ -61,8 +72,10 @@ files:
|
|
61
72
|
- bin/graphshaper
|
62
73
|
- graphshaper.gemspec
|
63
74
|
- lib/graphshaper.rb
|
75
|
+
- lib/graphshaper/adapters/logging_adapter.rb
|
64
76
|
- lib/graphshaper/undirected_graph.rb
|
65
77
|
- lib/graphshaper/version.rb
|
78
|
+
- spec/adapters/logging_adapter_spec.rb
|
66
79
|
- spec/spec_helper.rb
|
67
80
|
- spec/undirected_graph_spec.rb
|
68
81
|
homepage: http://github.com/moonglum/graphshaper
|
@@ -90,6 +103,7 @@ signing_key:
|
|
90
103
|
specification_version: 3
|
91
104
|
summary: Graphshaper can generate realistic, scale-free graphs of any size.
|
92
105
|
test_files:
|
106
|
+
- spec/adapters/logging_adapter_spec.rb
|
93
107
|
- spec/spec_helper.rb
|
94
108
|
- spec/undirected_graph_spec.rb
|
95
109
|
has_rdoc:
|