ruby-erd 0.0.1
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/lib/ruby-erd.rb +8 -0
- data/lib/ruby-erd/erd_builder.rb +115 -0
- data/lib/ruby-erd/erd_entity.rb +25 -0
- metadata +64 -0
data/lib/ruby-erd.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
class ERDBuilder
|
2
|
+
|
3
|
+
attr_accessor :default_node_background_color
|
4
|
+
attr_reader :name
|
5
|
+
|
6
|
+
def add_entity(name)
|
7
|
+
ERDEntity.new.tap do |entity|
|
8
|
+
entity.build(graph: graph, name: name)
|
9
|
+
entity.background_color = node_background_color
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def associate(entity, other_entity, attributes)
|
14
|
+
case other_entity
|
15
|
+
when Array
|
16
|
+
diagram.add_edges(entity.node, other_entity.collect(&:node), edge_attributes_for(attributes))
|
17
|
+
else
|
18
|
+
diagram.add_edges(entity.node, other_entity.node, edge_attributes_for(attributes))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def begin_system(name)
|
23
|
+
@name = name
|
24
|
+
|
25
|
+
# Initialize these objects
|
26
|
+
graph
|
27
|
+
end
|
28
|
+
|
29
|
+
# Public: Returns the current diagram, or a new instance if there is none.
|
30
|
+
#
|
31
|
+
# For a list of available attributes, see:
|
32
|
+
# * https://github.com/glejeune/Ruby-Graphviz/blob/master/lib/graphviz/constants.rb
|
33
|
+
# * http://www.graphviz.org/content/attrs
|
34
|
+
#
|
35
|
+
# Ruby-Graphviz overrides []= on GraphViz objects so to set an attribute, treat
|
36
|
+
# the GraphViz object like a hash.
|
37
|
+
#
|
38
|
+
# Example: diagram[attribute] = value
|
39
|
+
#
|
40
|
+
# Returns a GraphViz instance
|
41
|
+
def diagram
|
42
|
+
@diagram ||= GraphViz.digraph(name) do |diagram|
|
43
|
+
# Prevent node overlap
|
44
|
+
# http://www.graphviz.org/content/attrs#doverlap
|
45
|
+
diagram[:overlap] = 'false'
|
46
|
+
|
47
|
+
# Draw straight lines between nodes
|
48
|
+
# http://www.graphviz.org/content/attrs#dsplines
|
49
|
+
diagram[:splines] = 'true'
|
50
|
+
|
51
|
+
# Contents of the diagram's label
|
52
|
+
# http://www.graphviz.org/content/attrs#dlabel
|
53
|
+
diagram[:label] = name
|
54
|
+
|
55
|
+
# Label location: Display the title at the top 't' of the diagram
|
56
|
+
# http://www.graphviz.org/content/attrs#dlabelloc
|
57
|
+
diagram[:labelloc] = "t"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def export_as_png
|
62
|
+
diagram.output(png: "#{name}.png")
|
63
|
+
end
|
64
|
+
|
65
|
+
def graph
|
66
|
+
@graph ||= diagram.add_graph(name).tap do |graph|
|
67
|
+
graph[:overlap] = 'false'
|
68
|
+
graph[:splines] = 'true'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def join(entity, other_entity, label="joins")
|
73
|
+
join_table = add_entity("#{entity.name}#{other_entity.name}")
|
74
|
+
join_table.background_color = '#5182FF'
|
75
|
+
|
76
|
+
associate(entity, join_table, {association: :one_to_many, name: label})
|
77
|
+
associate(join_table, other_entity, {association: :many_to_one, name: ""})
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def edge_attributes_for(attributes)
|
83
|
+
case attributes[:association]
|
84
|
+
when :one_to_one
|
85
|
+
arrowhead = 'odot'
|
86
|
+
arrowtail = 'odot'
|
87
|
+
when :one_to_many
|
88
|
+
arrowhead = 'crow'
|
89
|
+
arrowtail = 'odot'
|
90
|
+
when :many_to_one
|
91
|
+
arrowhead = 'odot'
|
92
|
+
arrowtail = 'crow'
|
93
|
+
when :many_to_many
|
94
|
+
arrowhead = 'crow'
|
95
|
+
arrowtail = 'crow'
|
96
|
+
else
|
97
|
+
arrowhead = 'odot'
|
98
|
+
arrowtail = 'odot'
|
99
|
+
end
|
100
|
+
|
101
|
+
label = attributes[:name] || "Label"
|
102
|
+
|
103
|
+
{
|
104
|
+
arrowhead: arrowhead,
|
105
|
+
arrowtail: arrowtail,
|
106
|
+
dir: 'both',
|
107
|
+
label: label
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
def node_background_color
|
112
|
+
default_node_background_color || '#51CEFF'
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class ERDEntity
|
2
|
+
|
3
|
+
attr_reader :name, :node
|
4
|
+
|
5
|
+
def attributes=(attributes)
|
6
|
+
attributes_as_string = attributes.collect do |key, value|
|
7
|
+
"#{key} :#{value}"
|
8
|
+
end.join('\l')
|
9
|
+
|
10
|
+
@node.label = "{#{name}| #{attributes_as_string}}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def background_color=(color)
|
14
|
+
@node.color = color
|
15
|
+
@node.style = :filled
|
16
|
+
end
|
17
|
+
|
18
|
+
def build(attributes)
|
19
|
+
@graph = attributes[:graph]
|
20
|
+
@name = attributes[:name]
|
21
|
+
# Returns a GraphViz::Node
|
22
|
+
@node = @graph.add_nodes(name, shape: 'record')
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-erd
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jordan Maguire
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-09-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: ruby-graphviz
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: description
|
31
|
+
email:
|
32
|
+
- jmaguire@thefrontiergroup.com.au
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- lib/ruby-erd/erd_builder.rb
|
38
|
+
- lib/ruby-erd/erd_entity.rb
|
39
|
+
- lib/ruby-erd.rb
|
40
|
+
homepage: https://github.com/jordanmaguire/ruby-erd
|
41
|
+
licenses: []
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 1.8.25
|
61
|
+
signing_key:
|
62
|
+
specification_version: 3
|
63
|
+
summary: summary
|
64
|
+
test_files: []
|