sequel-schema-dot-generator 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
data/README.md
CHANGED
@@ -36,3 +36,10 @@ Or install it yourself as:
|
|
36
36
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
37
37
|
4. Push to the branch (`git push origin my-new-feature`)
|
38
38
|
5. Create new Pull Request
|
39
|
+
|
40
|
+
## Changelog
|
41
|
+
|
42
|
+
### 0.0.2
|
43
|
+
- optional colored association edges to distinguish them in big intersections (`params[:colored_associations]`)
|
44
|
+
- multiple foreign table support
|
45
|
+
- columns has written types in diagram
|
@@ -2,6 +2,7 @@ require 'sequel/schema/dot/generator/version'
|
|
2
2
|
require 'erb'
|
3
3
|
require 'logger'
|
4
4
|
require 'sequel'
|
5
|
+
require 'active_support/inflector'
|
5
6
|
|
6
7
|
module Sequel
|
7
8
|
module Schema
|
@@ -9,9 +10,10 @@ module Sequel
|
|
9
10
|
# Module for generating Sequel schema structure into Dot language format
|
10
11
|
module Generator
|
11
12
|
class Generator
|
12
|
-
@db
|
13
|
-
@dot_template_path
|
13
|
+
@db = nil
|
14
|
+
@dot_template_path = nil
|
14
15
|
@logger = nil
|
16
|
+
@colored_associations = nil
|
15
17
|
|
16
18
|
# @todo Consider write the params as block
|
17
19
|
#
|
@@ -19,39 +21,85 @@ module Sequel
|
|
19
21
|
# :db [Sequel::Database] required From this one will be generated the diagram
|
20
22
|
# :logger [Logger] optional Will be used for logging
|
21
23
|
# :dot_template_path [String] optional Template is supposed to be ERB template. Will be used as template for resulting Dot file
|
24
|
+
# :colored_associations [Boolean] optional Whether lines representing associations will be draw in color (=False)
|
22
25
|
#
|
23
26
|
def initialize params
|
24
27
|
check_params params
|
25
28
|
|
26
29
|
@db = params[:db]
|
27
30
|
@logger = params[:logger] || Logger.new(STDERR)
|
28
|
-
@dot_template_path
|
31
|
+
@dot_template_path = params[:dot_template_path] || File.join(File.dirname(__FILE__), 'generator/diagram.dot.erb')
|
32
|
+
@colored_associations = params[:colored_associations]
|
29
33
|
end
|
30
34
|
|
31
35
|
# @return [String] Content which can be passed to dot parsing tool
|
32
36
|
def generate
|
33
37
|
relations = []
|
34
38
|
tables = []
|
35
|
-
|
39
|
+
|
36
40
|
@db.tables.each do |table_name|
|
37
41
|
next if table_name == :schema_info
|
38
|
-
tables << [table_name, @db
|
42
|
+
tables << [table_name, @db.schema(table_name)]
|
39
43
|
|
40
44
|
# foreign keys by <table>_id name format
|
41
45
|
# @todo Read it from model
|
42
|
-
@db[table_name].columns.each do |column_name|
|
43
|
-
next unless column_name =~ /_id$/
|
46
|
+
@db[table_name].columns.select{|cn|cn=~/_id$/}.each do |column_name|
|
44
47
|
foreign_column = column_name.to_s
|
45
|
-
foreign_table = foreign_column.gsub(/_id$/, '')
|
48
|
+
foreign_table = existing_table_name foreign_column.gsub(/_id$/, '')
|
46
49
|
relations << [foreign_table, 'id', table_name, foreign_column]
|
47
50
|
end
|
48
51
|
end
|
49
52
|
|
53
|
+
if @colored_associations
|
54
|
+
edge_colors = random_color_set relations.count
|
55
|
+
else
|
56
|
+
edge_colors = Array.new relations.count, '000000'
|
57
|
+
end
|
58
|
+
|
50
59
|
ERB.new( File.read(@dot_template_path),nil,'>' ).result(binding)
|
51
60
|
end
|
52
61
|
|
53
62
|
private
|
54
63
|
|
64
|
+
# @param [String] name
|
65
|
+
#
|
66
|
+
# @return [String] form of name param in which it is name of existing table
|
67
|
+
def existing_table_name name
|
68
|
+
tables = @db.tables.map(&:to_s)
|
69
|
+
table_name = name if tables.include? name
|
70
|
+
table_name ||= name.pluralize if tables.include? name.pluralize
|
71
|
+
table_name ||= name.singularize if tables.include? name.singularize
|
72
|
+
table_name ||= 'association_table_not_found'
|
73
|
+
|
74
|
+
table_name
|
75
|
+
end
|
76
|
+
|
77
|
+
# @param [Integer] number of colors we want to generate
|
78
|
+
#
|
79
|
+
# @return [Array] of random and unique colors
|
80
|
+
def random_color_set number
|
81
|
+
raise 'Number of colors must be greater than 0' if number < 1
|
82
|
+
colors = []
|
83
|
+
(1..number).each do
|
84
|
+
colors << random_unique_hex_color(colors)
|
85
|
+
end
|
86
|
+
|
87
|
+
colors
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
# @param [Array] existing colors which should be avoided
|
92
|
+
#
|
93
|
+
# @return [String] Random color which is not presented in existing param
|
94
|
+
def random_unique_hex_color existing
|
95
|
+
color = '%06x' % (rand * 0xffffff)
|
96
|
+
if existing.include?(color)
|
97
|
+
random_unique_hex_color existing
|
98
|
+
else
|
99
|
+
color
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
55
103
|
# Checks if all parameters for new Object are alright
|
56
104
|
def check_params params
|
57
105
|
unless params[:db].is_a?Sequel::Database
|
@@ -63,6 +111,9 @@ module Sequel
|
|
63
111
|
unless params[:logger].nil? || params[:logger].is_a?(Logger)
|
64
112
|
raise 'Logger is supposed to be... Logger, know. %s given'%params[:logger].inspect
|
65
113
|
end
|
114
|
+
unless params[:colored_associations].nil? || !!params[:colored_associations] == params[:colored_associations]
|
115
|
+
raise 'Colored association is supposed to be boolean. %s given'%params[:colored_associations].inspect
|
116
|
+
end
|
66
117
|
end
|
67
118
|
end
|
68
119
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
digraph G {
|
2
2
|
node [shape=none,fontname="DejaVu Sans"];
|
3
|
-
<% tables.each do |table_name,
|
3
|
+
<% tables.each do |table_name, table_schema| %>
|
4
4
|
<%= table_name %> [label=<
|
5
5
|
<table border="0" cellborder="1" cellspacing="0" cellpadding="4">
|
6
6
|
<tr><td bgcolor="lightgrey" PORT="users"><b><%= table_name %></b></td></tr>
|
7
|
-
<%
|
8
|
-
<tr><td PORT="<%= column_name %>"><%= column_name
|
7
|
+
<% table_schema.each do |column_name, column_schema| %>
|
8
|
+
<tr><td PORT="<%= column_name %>"><%= column_name %><font color="gray">(<%= column_schema[:type] %>)</font></td></tr>
|
9
9
|
<% end %>
|
10
10
|
</table>
|
11
11
|
>]
|
12
12
|
<% end %>
|
13
13
|
|
14
|
-
<% relations.
|
15
|
-
<%= '"%s":"%s" -> "%s":"%s"'%[from_tab, from_col, to_tab, to_col] %>
|
14
|
+
<% relations.each_with_index do |(from_tab, from_col, to_tab, to_col), index| %>
|
15
|
+
<%= '"%s":"%s" -> "%s":"%s" [color="#%s"];'%[from_tab, from_col, to_tab, to_col, edge_colors[index]] %>
|
16
16
|
|
17
17
|
<% end %>
|
18
18
|
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel-schema-dot-generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -59,6 +59,22 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: active_support
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
62
78
|
description: This gem makes it easier to generate database schema overview image
|
63
79
|
email:
|
64
80
|
- development@rooland.cz
|
@@ -91,7 +107,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
107
|
version: '0'
|
92
108
|
segments:
|
93
109
|
- 0
|
94
|
-
hash:
|
110
|
+
hash: -3561675813469084963
|
95
111
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
112
|
none: false
|
97
113
|
requirements:
|
@@ -100,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
116
|
version: '0'
|
101
117
|
segments:
|
102
118
|
- 0
|
103
|
-
hash:
|
119
|
+
hash: -3561675813469084963
|
104
120
|
requirements: []
|
105
121
|
rubyforge_project:
|
106
122
|
rubygems_version: 1.8.25
|