directed_graph 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aedb32953183318d27dea925e006475fd2617b96
4
- data.tar.gz: c933b6d715687f372a3f7b15c386ff546b159f33
3
+ metadata.gz: 072f04bf6d9b527c8b6754ddc0ba6bcc7ce78be8
4
+ data.tar.gz: 525dcb15965f21d4021f8e231a153bebbe318cfa
5
5
  SHA512:
6
- metadata.gz: 557088cc56ff7855be0bbc9cf3bd8e91bc0630cc9bb1a14d3be089fbddb477dcb7b51f81b5b2c84dc7ff2df400f6b1a19afc1f3eaea7d00fa6ad8094169e2f73
7
- data.tar.gz: 06ef0c31d0dea4da5bdbfe449a3b3d84749f1680dd3df6bfa559aecd51f1e1b28931aad3130887fb357aaf44e9b068212f1c0418d8c63292d72690279259e2c9
6
+ metadata.gz: ae7c9473a9d90281a79c1fa9edba73922b17dc8c3a1bcc8d9d31981bae2d02bf586a1bb3ba38aaf30b87c8a5cf8e865aecda94c492d8a1f10fc965b90a4169a8
7
+ data.tar.gz: 2bd210fc46ecf1865d0176de90abcba0775a5352830662b5e0596beb275aaf9718b50817c3f64fffef773bb01c060e16787e3a29c7582a2f38ebdabfb881b8b7
data/README.md CHANGED
@@ -53,6 +53,28 @@ The `@graph` object can be used to calculate the longest path between two vertic
53
53
  @graph.longest_path(@d, @a) # returns [] when the path doesn't exist
54
54
  ```
55
55
 
56
+ The `@graph` object can be used to generate a graphml file
57
+
58
+ ```ruby
59
+ require 'color-generator'
60
+
61
+ generator = ColorGenerator.new saturation: 0.3, lightness: 0.75
62
+
63
+ # Set the color and label of each vertex
64
+ #
65
+ @graph.vertices.each do |vertex|
66
+ color = generator.create_hex
67
+ label = vertex.name
68
+
69
+ vertex.data[:graphics] = {:fill=>["##{color}"], :label=>[label], :group=>color}
70
+ end
71
+
72
+ # Generate a graphml file
73
+ # Import this file into program like yEd to size nodes and layout graph
74
+ File.open("output.graphml", "w+") { |f| f.write(@graph.to_graphml())}
75
+ ```
76
+
77
+
56
78
  ## Installation
57
79
 
58
80
  Add this line to your application's Gemfile:
@@ -0,0 +1,58 @@
1
+ require 'minitest/autorun'
2
+ require 'color-generator'
3
+ require 'directed_graph' #This is an external gem
4
+
5
+ include DirectedGraph
6
+
7
+ class BugTest < Minitest::Test
8
+ def test_two()
9
+
10
+ # Create the Vertices
11
+ #
12
+ @root = Vertex.new(name: "root")
13
+ @a = Vertex.new(name: "a")
14
+ @b = Vertex.new(name: "b")
15
+ @c = Vertex.new(name: "c")
16
+ @d = Vertex.new(name: "d")
17
+ @e = Vertex.new(name: "e")
18
+
19
+ # Create the Edges
20
+ #
21
+ # The first argument is the origin_vertex
22
+ # and the second is the destination_vertex
23
+ @ra = Edge.new(origin_vertex: @root, destination_vertex: @a)
24
+ @ab = Edge.new(origin_vertex: @a, destination_vertex: @b)
25
+ @bc = Edge.new(origin_vertex: @b, destination_vertex: @c)
26
+ @bd = Edge.new(origin_vertex: @b, destination_vertex: @d)
27
+ @ae = Edge.new(origin_vertex: @a, destination_vertex: @e)
28
+ @de = Edge.new(origin_vertex: @d, destination_vertex: @e)
29
+
30
+ # Create the Graph
31
+ #
32
+ @edges = [@ra, @ab, @bc, @bd, @ae, @de]
33
+ @graph = Graph.new(@edges)
34
+
35
+ # Set the color of the vertexes
36
+ #
37
+ @generator = ColorGenerator.new saturation: 0.3, lightness: 0.75
38
+
39
+ @graph.vertices.each do |vertex|
40
+ label = vertex.name
41
+ color = @generator.create_hex
42
+
43
+ vertex.data[:graphics] = {:fill=>["##{color}"], :label=>[label], :group=>color}
44
+ end
45
+
46
+ # Generate a graphml file
47
+ # Import this file into program like yEd to size nodes and layout graph
48
+ #
49
+ filename = "example_graph"
50
+
51
+ txt = @graph.to_graphml()
52
+
53
+ File.open("#{filename}.graphml", "w+") { |f| f.write(txt)}
54
+ end
55
+ end
56
+
57
+
58
+
@@ -1,10 +1,12 @@
1
1
  require 'simple-graph'
2
+ require 'builder'
2
3
 
3
4
  require "directed_graph/version"
4
5
  require_relative "./directed_graph/job_runner.rb"
5
6
  require_relative "./directed_graph/vertex.rb"
6
7
  require_relative "./directed_graph/edge.rb"
7
8
  require_relative "./directed_graph/graph.rb"
9
+ require_relative "./directed_graph/graphml.rb"
8
10
 
9
11
  module DirectedGraph
10
12
  end
@@ -0,0 +1,78 @@
1
+ #require 'builder'
2
+
3
+ module DirectedGraph
4
+ class Graph
5
+
6
+ # Generate a string key from an array of identifiers
7
+ def compute_key(external_identifier)
8
+ x = [external_identifier].flatten
9
+ x.map! {|xx| xx.to_s}
10
+ x.join("_")
11
+ end
12
+
13
+ # Return graph as graphml text
14
+ def to_graphml()
15
+ builder = Builder::XmlMarkup.new(:indent => 1)
16
+ builder.instruct! :xml, :version => "1.0"
17
+
18
+ graphml_attribs = {
19
+ "xmlns" => "http://graphml.graphdrawing.org/xmlns",
20
+ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
21
+ "xmlns:y" => "http://www.yworks.com/xml/graphml",
22
+ "xmlns:yed" => "http://www.yworks.com/xml/yed/3",
23
+ "xsi:schemaLocation" => "http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd",
24
+ :directed => "1",
25
+ :label => "test"
26
+ }
27
+
28
+ builder.graphml(graphml_attribs) do
29
+
30
+ # Define key id's at top of graphml file
31
+ builder.key({:for=>"node", :id=>"d3", "yfiles.type"=>"nodegraphics"})
32
+
33
+ # Build Graph
34
+ #
35
+ builder.graph({:id=>"G"}) do
36
+
37
+ vertices.each do |vertex|
38
+
39
+ builder.node(:id => compute_key([vertex.name, vertex.object_id])) do
40
+
41
+ builder.data({:key=>"d3"}) do
42
+ builder.tag!("y:ShapeNode") do
43
+
44
+ graphics = vertex.data.fetch(:graphics, {})
45
+ graphics.fetch(:fill, []).each {|f| builder.tag! "y:Fill", {:color=>f, :transparent=>"false"}}
46
+ graphics.fetch(:shape,[]).each {|s| builder.tag! "y:Shape", {:type=>s}}
47
+ graphics.fetch(:geometry,[]).each {|s| builder.tag! "y:Geometry", s}
48
+ graphics.fetch(:label,[]).each {|l| builder.tag! "y:NodeLabel", l}
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ edges.each do |edge|
55
+ source = edge.origin_vertex
56
+ target = edge.destination_vertex
57
+
58
+ options = edge.data[:options]
59
+ label = ""
60
+
61
+ builder.edge(
62
+ :source => s = compute_key([source.name, source.object_id]),
63
+ :target => t = compute_key([target.name, target.object_id]),
64
+ :id => compute_key([source.name, target.name, edge.object_id]),
65
+ :label => "#{label}"
66
+ ) do
67
+ #edge[:attributes].each_pair { |k, v|
68
+ # id_str = compute_key([k,:edge_attr])
69
+ # builder.data(v.to_s, {:key=>@guid[id_str]})
70
+ #}
71
+ end
72
+ end
73
+ end
74
+ end
75
+ builder.target!
76
+ end
77
+ end
78
+ end
@@ -1,3 +1,3 @@
1
1
  module DirectedGraph
2
- VERSION = "0.6.0"
2
+ VERSION = "0.6.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: directed_graph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - MrPowers
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-01-05 00:00:00.000000000 Z
11
+ date: 2017-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -98,10 +98,12 @@ files:
98
98
  - bin/console
99
99
  - bin/setup
100
100
  - directed_graph.gemspec
101
+ - example/example.rb
101
102
  - example/simple_directed_graph.png
102
103
  - lib/directed_graph.rb
103
104
  - lib/directed_graph/edge.rb
104
105
  - lib/directed_graph/graph.rb
106
+ - lib/directed_graph/graphml.rb
105
107
  - lib/directed_graph/job_runner.rb
106
108
  - lib/directed_graph/version.rb
107
109
  - lib/directed_graph/vertex.rb