db_discovery_generator 0.1.0
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/CHANGELOG +0 -0
- data/README +3 -0
- data/USAGE +19 -0
- data/db_discovery_generator.rb +110 -0
- data/templates/fixtures.yml +5 -0
- data/templates/migration.rb +11 -0
- data/templates/model.rb +20 -0
- data/templates/unit_test.rb +10 -0
- data/version.rb +9 -0
- metadata +62 -0
data/CHANGELOG
ADDED
File without changes
|
data/README
ADDED
data/USAGE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Description:
|
2
|
+
The db_discovery generator creates stub for a new models based on
|
3
|
+
information discovered from DB.
|
4
|
+
|
5
|
+
The generator creates a model classes in app/models, a test suites
|
6
|
+
in test/unit, test fixtures in test/fixtures/singular_name.yml,
|
7
|
+
and a migrations in db/migrate.
|
8
|
+
|
9
|
+
Example:
|
10
|
+
./script/generate db_discovery --no-fields
|
11
|
+
|
12
|
+
This will create an discovered models:
|
13
|
+
Model: app/models/<table name>.rb
|
14
|
+
Test: test/unit/<table name>_test.rb
|
15
|
+
Fixtures: test/fixtures/<table name>s.yml
|
16
|
+
Migration: db/migrate/XXX_add_<table name>s.rb
|
17
|
+
|
18
|
+
If --no-fields is provided then table's available field
|
19
|
+
definitions will be skipped
|
@@ -0,0 +1,110 @@
|
|
1
|
+
class DbDiscoveryGenerator < Rails::Generator::Base
|
2
|
+
default_options :skip_migration => false
|
3
|
+
|
4
|
+
def initialize(runtime_args, runtime_options = {})
|
5
|
+
super
|
6
|
+
if options[:help] then
|
7
|
+
usage
|
8
|
+
exit
|
9
|
+
end
|
10
|
+
@no_fields = options['no_fields']
|
11
|
+
end
|
12
|
+
|
13
|
+
def manifest
|
14
|
+
record do |m|
|
15
|
+
m.directory 'app/models'
|
16
|
+
|
17
|
+
generate_models.each do
|
18
|
+
|table, model|
|
19
|
+
m.template 'model.rb',
|
20
|
+
"app/models/#{table.singularize.underscore}.rb",
|
21
|
+
:assigns => {
|
22
|
+
:table_name => table.singularize.underscore.camelize,
|
23
|
+
:model => model,
|
24
|
+
:no_fields => @no_fields
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
def add_options!(opt)
|
32
|
+
opt.separator ''
|
33
|
+
opt.separator 'Options:'
|
34
|
+
opt.on("--no-fields",
|
35
|
+
"Don't show a list of available fields") { |v| options[:no_fields] = v }
|
36
|
+
opt.on("-h","--help",
|
37
|
+
"Show this help message") { |v| options[:help] = v }
|
38
|
+
end
|
39
|
+
|
40
|
+
def mysql_primary_key (table_name, name = nil)#:nodoc:
|
41
|
+
sql = "SHOW FIELDS FROM #{table_name}"
|
42
|
+
pk = []
|
43
|
+
@connection.execute(sql, name).each do
|
44
|
+
|field|
|
45
|
+
pk << field[0] if field[3] == 'PRI'
|
46
|
+
end
|
47
|
+
if pk.length > 1 then
|
48
|
+
''
|
49
|
+
else
|
50
|
+
pk[0]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def generate_models
|
56
|
+
@connection = ActiveRecord::Base.connection
|
57
|
+
models = {}
|
58
|
+
|
59
|
+
@connection.tables.each do
|
60
|
+
| table |
|
61
|
+
# Model class, unit test, and fixtures.
|
62
|
+
|
63
|
+
if table =~ /[A-Z]/ then
|
64
|
+
set_table_name = " self.table_name = %( #{@connection.quote_column_name(table)} )"
|
65
|
+
else
|
66
|
+
set_table_name = " self.table_name = \"#{table}\""
|
67
|
+
end
|
68
|
+
|
69
|
+
columns = @connection.columns(@connection.quote_column_name(table))
|
70
|
+
adapterName = @connection.adapter_name
|
71
|
+
pk = ''
|
72
|
+
case adapterName
|
73
|
+
when 'PostgreSQL' then
|
74
|
+
pk, seq = @connection.pk_and_sequence_for(@connection.quote_column_name(table))
|
75
|
+
pk ||= ''
|
76
|
+
when 'MySQL' then
|
77
|
+
pk = mysql_primary_key(@connection.quote_column_name(table))
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
models[table] = {
|
82
|
+
:table => table,
|
83
|
+
:columns => columns,
|
84
|
+
:primary_key => pk,
|
85
|
+
:table_name => set_table_name
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
models.each do
|
90
|
+
|table, model|
|
91
|
+
model[:columns].each do
|
92
|
+
|c|
|
93
|
+
next if c.name.nil?
|
94
|
+
next if model[:primary_key] && c.name == model[:primary_key]
|
95
|
+
next if c.name !~ /^(.+)(?:_id|ID)$/
|
96
|
+
master = $1
|
97
|
+
master_model = models[master.pluralize] || models[master]
|
98
|
+
if master_model then
|
99
|
+
model[:belongs_to] = [] if model[:belongs_to].nil?
|
100
|
+
model[:belongs_to] << master.singularize.underscore
|
101
|
+
# TODO: Distinguish between has_one and has_many
|
102
|
+
# TODO: HABTM - hint (relation)_(relation)
|
103
|
+
master_model[:has_many] = [] if master_model[:has_many].nil?
|
104
|
+
master_model[:has_many] << table.pluralize.underscore
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
models
|
109
|
+
end
|
110
|
+
end
|
data/templates/model.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
class <%= model[:table].camelize %> < ActiveRecord::Base
|
2
|
+
<%= model[:table_name] %>
|
3
|
+
self.primary_key = "<%= model[:primary_key] %>"
|
4
|
+
|
5
|
+
<% model[:belongs_to].each do |b_t| -%>
|
6
|
+
belongs_to :<%= b_t %>
|
7
|
+
<% end if model[:belongs_to] -%>
|
8
|
+
|
9
|
+
<% model[:has_many].each do |h_m| -%>
|
10
|
+
has_many :<%= h_m %>
|
11
|
+
<% end if model[:has_many] -%>
|
12
|
+
|
13
|
+
<% if no_fields.nil? then -%>
|
14
|
+
# Fields information, just FYI.
|
15
|
+
#
|
16
|
+
<% model[:columns].each do |c| -%>
|
17
|
+
# Field: <%= c.name =~ /[A-Z]/ ? ActiveRecord::Base.connection.quote_column_name(c.name) : c.name %> <%= ', SQL Definition:' + c.sql_type if c.respond_to?('sql_type') %>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
end
|
data/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.0
|
3
|
+
specification_version: 1
|
4
|
+
name: db_discovery_generator
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2006-10-14 00:00:00 -04:00
|
8
|
+
summary: db_discovery generator allows you to create the DB models with associations from existing DB
|
9
|
+
require_paths:
|
10
|
+
- ''
|
11
|
+
email: db_discovery@deeptown.org
|
12
|
+
homepage: http://db-discovery.rubyforge.org
|
13
|
+
rubyforge_project:
|
14
|
+
description: db_discovery generator allows you to create the DB models with associations from existing DB
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: false
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
-
|
22
|
+
- ">"
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.0.0
|
25
|
+
version:
|
26
|
+
platform: ruby
|
27
|
+
signing_key:
|
28
|
+
cert_chain:
|
29
|
+
post_install_message:
|
30
|
+
authors:
|
31
|
+
- Sergey Kuznetsov
|
32
|
+
files:
|
33
|
+
- version.rb
|
34
|
+
- db_discovery_generator.rb
|
35
|
+
- templates
|
36
|
+
- USAGE
|
37
|
+
- CHANGELOG
|
38
|
+
- README
|
39
|
+
- templates/fixtures.yml
|
40
|
+
- templates/migration.rb
|
41
|
+
- templates/model.rb
|
42
|
+
- templates/unit_test.rb
|
43
|
+
test_files: []
|
44
|
+
rdoc_options:
|
45
|
+
- "--quiet"
|
46
|
+
- "--title"
|
47
|
+
- db_discovery documentation
|
48
|
+
- "--opname"
|
49
|
+
- index.html
|
50
|
+
- "--line-numbers"
|
51
|
+
- "--main"
|
52
|
+
- README
|
53
|
+
- "--inline-source"
|
54
|
+
- "--exclude"
|
55
|
+
- "^(examples|extras)/"
|
56
|
+
extra_rdoc_files:
|
57
|
+
- README
|
58
|
+
- CHANGELOG
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
requirements: []
|
62
|
+
dependencies: []
|