mack-active_record 0.5.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/README +3 -0
- data/lib/helpers/orm_helpers.rb +77 -0
- data/lib/mack-active_record.rb +23 -0
- data/lib/mack-active_record_tasks.rb +3 -0
- data/lib/migration_generator/migration_generator.rb +41 -0
- data/lib/migration_generator/templates/db/migrations/%=@migration_name%.rb.template +31 -0
- data/lib/model_generator/manifest.yml +11 -0
- data/lib/model_generator/model_generator.rb +46 -0
- data/lib/model_generator/templates/model.rb.template +3 -0
- data/lib/model_generator/templates/test.rb.template +9 -0
- data/lib/scaffold_generator/manifest.yml +24 -0
- data/lib/scaffold_generator/scaffold_generator.rb +41 -0
- data/lib/scaffold_generator/templates/app/controllers/controller.rb.template +50 -0
- data/lib/scaffold_generator/templates/app/views/edit.html.erb.template +19 -0
- data/lib/scaffold_generator/templates/app/views/index.html.erb.template +41 -0
- data/lib/scaffold_generator/templates/app/views/new.html.erb.template +19 -0
- data/lib/scaffold_generator/templates/app/views/show.html.erb.template +12 -0
- data/lib/scaffold_generator/templates/test.rb.template +9 -0
- data/lib/tasks/db_create_drop_tasks.rake +70 -0
- data/lib/tasks/db_migration_tasks.rake +86 -0
- data/test/database.yml +3 -0
- data/test/fixtures/add_users_migration.rb.fixture +9 -0
- data/test/fixtures/album.rb.fixture +3 -0
- data/test/fixtures/album_unit_test.rb.fixture +9 -0
- data/test/fixtures/create_users_migration.rb.fixture +12 -0
- data/test/fixtures/routes.rb.fixture +3 -0
- data/test/fixtures/zoo.rb.fixture +3 -0
- data/test/fixtures/zoo_no_cols/edit.html.erb.fixture +11 -0
- data/test/fixtures/zoo_no_cols/index.html.erb.fixture +20 -0
- data/test/fixtures/zoo_no_cols/new.html.erb.fixture +11 -0
- data/test/fixtures/zoo_no_cols/show.html.erb.fixture +6 -0
- data/test/fixtures/zoo_with_cols/edit.html.erb.fixture +19 -0
- data/test/fixtures/zoo_with_cols/index.html.erb.fixture +26 -0
- data/test/fixtures/zoo_with_cols/new.html.erb.fixture +19 -0
- data/test/fixtures/zoo_with_cols/show.html.erb.fixture +22 -0
- data/test/fixtures/zoo_with_cols/zoos_controller.rb.fixture +50 -0
- data/test/generators/migration_generator_test.rb +71 -0
- data/test/generators/model_generator_test.rb +37 -0
- data/test/generators/scaffold_generator_test.rb +61 -0
- data/test/lib/user.rb +3 -0
- data/test/tasks/db_migration_tasks_test.rb +57 -0
- data/test/test_helper.rb +77 -0
- metadata +116 -0
data/README
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
class ActiveRecord::Base # :nodoc:
|
2
|
+
def business_display_name
|
3
|
+
self.class.name#.titlecase
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
module Mack
|
8
|
+
module ViewHelpers
|
9
|
+
module OrmHelpers
|
10
|
+
DEFAULT_PARTIAL = %{
|
11
|
+
<div>
|
12
|
+
<div class="errorExplanation" id="errorExplanation">
|
13
|
+
<h2><%= pluralize_word(errors.size, "error") %> occured.</h2>
|
14
|
+
<ul>
|
15
|
+
<% for error in errors %>
|
16
|
+
<li><%= error %></li>
|
17
|
+
<% end %>
|
18
|
+
</ul>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
}
|
22
|
+
|
23
|
+
def error_messages_for(object_names = [], view_partial = nil)
|
24
|
+
object_names = [object_names]
|
25
|
+
object_names.flatten!
|
26
|
+
app_errors = []
|
27
|
+
object_names.each do |name|
|
28
|
+
object = instance_variable_get("@#{name}")
|
29
|
+
if object
|
30
|
+
object.errors.each do |key, value|
|
31
|
+
key = key.to_s
|
32
|
+
if value.is_a?(Array)
|
33
|
+
value.each do |v|
|
34
|
+
if v.match(/^\^/)
|
35
|
+
app_errors << v[1..v.length]
|
36
|
+
else
|
37
|
+
if key.class == String and key == "base"
|
38
|
+
app_errors << "#{v}"
|
39
|
+
else
|
40
|
+
app_errors << "#{object.business_display_name} #{key.underscore.split('_').join(' ')} #{v}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
else
|
45
|
+
if value.match(/^\^/)
|
46
|
+
app_errors << value[1..value.length]
|
47
|
+
else
|
48
|
+
if key.class == String and key == "base"
|
49
|
+
app_errors << "#{value}"
|
50
|
+
else
|
51
|
+
app_errors << "#{object.business_display_name} #{key.underscore.split('_').join(' ')} #{value}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
File.join(Mack::Configuration.views_directory, "application", "_error_messages.html.erb")
|
59
|
+
unless app_errors.empty?
|
60
|
+
if view_partial.nil?
|
61
|
+
if File.exist?(File.join(Mack::Configuration.views_directory, "application", "_error_messages.html.erb"))
|
62
|
+
render :partial => "application/error_messages", :locals => {:errors => app_errors}
|
63
|
+
else
|
64
|
+
render :text => DEFAULT_PARTIAL, :locals => {:errors => app_errors}
|
65
|
+
end
|
66
|
+
else
|
67
|
+
render :partial => view_partial, :locals => {:errors => app_errors}
|
68
|
+
end
|
69
|
+
else
|
70
|
+
""
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# self.include_safely_into(Mack::ViewBinder)
|
75
|
+
end # OrmHelpers
|
76
|
+
end # ViewHelpers
|
77
|
+
end # Mack
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'genosaurus'
|
3
|
+
require 'erubis'
|
4
|
+
begin
|
5
|
+
require 'mack-orm_common'
|
6
|
+
rescue Exception => e
|
7
|
+
puts e
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'activerecord'
|
11
|
+
|
12
|
+
dbs = Mack::Configuration.database_configurations
|
13
|
+
|
14
|
+
unless dbs.nil?
|
15
|
+
ActiveRecord::Base.establish_connection(dbs[Mack::Configuration.env])
|
16
|
+
class SchemaInfo < ActiveRecord::Base # :nodoc:
|
17
|
+
set_table_name 'schema_info'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
[:helpers, :migration_generator, :model_generator, :scaffold_generator].each do |folder|
|
21
|
+
Dir.glob(File.join(File.dirname(__FILE__), folder.to_s, "**/*.rb")).each {|f| require f}
|
22
|
+
end
|
23
|
+
# Dir.glob(File.join(File.dirname(__FILE__), "tasks", "**/*.rake")).each {|f| load f}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# This will generate a migration for your application.
|
2
|
+
#
|
3
|
+
# Example without columns:
|
4
|
+
# rake generate:migration name=create_users
|
5
|
+
#
|
6
|
+
# db/migrations/<number>_create_users.rb:
|
7
|
+
# class CreateUsers < ActiveRecord::Migration
|
8
|
+
# self.up
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# self.down
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# Example with columns:
|
16
|
+
# rake generate:migration name=create_users cols=username:string,email_address:string,created_at:datetime,updated_at:datetime
|
17
|
+
#
|
18
|
+
# db/migrations/<number>_create_users.rb:
|
19
|
+
# class CreateUsers < ActiveRecord::Migration
|
20
|
+
# self.up
|
21
|
+
# create_table :users do |t|
|
22
|
+
# t.column :username, :string
|
23
|
+
# t.column :email_address, :string
|
24
|
+
# t.column :created_at, :datetime
|
25
|
+
# t.column :updated_at, :datetime
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# self.down
|
29
|
+
# drop_table :users
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
class MigrationGenerator < Genosaurus
|
33
|
+
|
34
|
+
require_param :name
|
35
|
+
|
36
|
+
def setup
|
37
|
+
@table_name = param(:name).underscore.plural.gsub("create_", "")
|
38
|
+
@migration_name = "#{next_migration_number}_#{param(:name).underscore}"
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class <%= param(:name).camelcase %> < ActiveRecord::Migration
|
2
|
+
|
3
|
+
def self.up
|
4
|
+
<%
|
5
|
+
unless columns.empty?
|
6
|
+
-%>
|
7
|
+
create_table :<%= @table_name %> do |t|
|
8
|
+
<%
|
9
|
+
for column in columns
|
10
|
+
-%>
|
11
|
+
t.column :<%= column.column_name %>, :<%= column.column_type %>
|
12
|
+
<%
|
13
|
+
end
|
14
|
+
-%>
|
15
|
+
end
|
16
|
+
<%
|
17
|
+
end
|
18
|
+
-%>
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.down
|
22
|
+
<%
|
23
|
+
unless columns.empty?
|
24
|
+
-%>
|
25
|
+
drop_table :<%= @table_name %>
|
26
|
+
<%
|
27
|
+
end
|
28
|
+
-%>
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
models_directory:
|
2
|
+
type: directory
|
3
|
+
output_path: <%= File.join("app", "models") %>
|
4
|
+
model_template:
|
5
|
+
type: file
|
6
|
+
template_path: <%= File.join(templates_directory_path, "model.rb.template") %>
|
7
|
+
output_path: <%= File.join("app", "models", "#{param(:name).singular.underscore}.rb") %>
|
8
|
+
test_template:
|
9
|
+
type: file
|
10
|
+
template_path: <%= File.join(templates_directory_path, "test.rb.template") %>
|
11
|
+
output_path: <%= File.join("test", "unit", "#{param(:name).singular.underscore}_test.rb") %>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# This will generate an ORM 'model' for your application based on the specified ORM you're using.
|
2
|
+
#
|
3
|
+
# Example without columns:
|
4
|
+
# rake generate:model name=user
|
5
|
+
#
|
6
|
+
# app/models/user.rb:
|
7
|
+
# class User < ActiveRecord::Base
|
8
|
+
# end
|
9
|
+
# db/migrations/<number>_create_users.rb:
|
10
|
+
# class CreateUsers < ActiveRecord::Migration
|
11
|
+
# self.up
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# self.down
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# Example with columns:
|
19
|
+
# rake generate:model name=user cols=username:string,email_address:string,created_at:datetime,updated_at:datetime
|
20
|
+
#
|
21
|
+
# app/models/user.rb:
|
22
|
+
# class User < ActiveRecord::Base
|
23
|
+
# end
|
24
|
+
# db/migrations/<number>_create_users.rb:
|
25
|
+
# class CreateUsers < ActiveRecord::Migration
|
26
|
+
# self.up
|
27
|
+
# create_table :users do |t|
|
28
|
+
# t.column :username, :string
|
29
|
+
# t.column :email_address, :string
|
30
|
+
# t.column :created_at, :datetime
|
31
|
+
# t.column :updated_at, :datetime
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# self.down
|
35
|
+
# drop_table :users
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
class ModelGenerator < Genosaurus
|
39
|
+
|
40
|
+
require_param :name
|
41
|
+
|
42
|
+
def after_generate
|
43
|
+
MigrationGenerator.run(@options.merge({"name" => "create_#{param(:name).plural}"}))
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
controller_template:
|
2
|
+
type: file
|
3
|
+
template_path: <%= File.join(templates_directory_path, "app", "controllers", "controller.rb.template") %>
|
4
|
+
output_path: <%= File.join("app", "controllers", "#{@name_plural}_controller.rb") %>
|
5
|
+
edit_template:
|
6
|
+
type: file
|
7
|
+
template_path: <%= File.join(templates_directory_path, "app", "views", "edit.html.erb.template") %>
|
8
|
+
output_path: <%= File.join("app", "views", @name_plural, "edit.html.erb") %>
|
9
|
+
index_template:
|
10
|
+
type: file
|
11
|
+
template_path: <%= File.join(templates_directory_path, "app", "views", "index.html.erb.template") %>
|
12
|
+
output_path: <%= File.join("app", "views", @name_plural, "index.html.erb") %>
|
13
|
+
new_template:
|
14
|
+
type: file
|
15
|
+
template_path: <%= File.join(templates_directory_path, "app", "views", "new.html.erb.template") %>
|
16
|
+
output_path: <%= File.join("app", "views", @name_plural, "new.html.erb") %>
|
17
|
+
show_template:
|
18
|
+
type: file
|
19
|
+
template_path: <%= File.join(templates_directory_path, "app", "views", "show.html.erb.template") %>
|
20
|
+
output_path: <%= File.join("app", "views", @name_plural, "show.html.erb") %>
|
21
|
+
functional_teat_template:
|
22
|
+
type: file
|
23
|
+
template_path: <%= File.join(templates_directory_path, "test.rb.template") %>
|
24
|
+
output_path: <%= File.join("test", "functional", "#{@name_plural}_controller_test.rb") %>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Generates scaffold for Mack applications.
|
2
|
+
#
|
3
|
+
# Example:
|
4
|
+
# rake generate:scaffold name=post
|
5
|
+
class ScaffoldGenerator < Genosaurus
|
6
|
+
|
7
|
+
require_param :name
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@name_singular = param(:name).singular.underscore
|
11
|
+
@name_plural = param(:name).plural.underscore
|
12
|
+
@name_singular_camel = @name_singular.camelcase
|
13
|
+
@name_plural_camel = @name_plural.camelcase
|
14
|
+
end
|
15
|
+
|
16
|
+
def after_generate
|
17
|
+
ModelGenerator.run(@options)
|
18
|
+
update_routes_file
|
19
|
+
end
|
20
|
+
|
21
|
+
def update_routes_file
|
22
|
+
# update routes.rb
|
23
|
+
routes = File.join(Mack::Configuration.config_directory, "routes.rb")
|
24
|
+
rf = File.open(routes).read
|
25
|
+
unless rf.match(".resource :#{@name_plural}")
|
26
|
+
puts "Updating routes.rb"
|
27
|
+
nrf = ""
|
28
|
+
rf.each do |line|
|
29
|
+
if line.match("Mack::Routes.build")
|
30
|
+
x = line.match(/\|(.+)\|/).captures
|
31
|
+
line << "\n #{x}.resource :#{@name_plural} # Added by rake generate:scaffold name=#{param(:name)}\n"
|
32
|
+
end
|
33
|
+
nrf << line
|
34
|
+
end
|
35
|
+
File.open(routes, "w") do |f|
|
36
|
+
f.puts nrf
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class <%= @name_plural_camel %>Controller < Mack::Controller::Base
|
2
|
+
|
3
|
+
# GET /<%= @name_plural %>
|
4
|
+
def index
|
5
|
+
@<%= @name_plural %> = <%= @name_singular_camel %>.find(:all)
|
6
|
+
end
|
7
|
+
|
8
|
+
# GET /<%= @name_plural %>/1
|
9
|
+
def show
|
10
|
+
@<%= @name_singular %> = <%= @name_singular_camel %>.find(params(:id))
|
11
|
+
end
|
12
|
+
|
13
|
+
# GET /<%= @name_plural %>/new
|
14
|
+
def new
|
15
|
+
@<%= @name_singular %> = <%= @name_singular_camel %>.new
|
16
|
+
end
|
17
|
+
|
18
|
+
# GET /<%= @name_plural %>/1/edit
|
19
|
+
def edit
|
20
|
+
@<%= @name_singular %> = <%= @name_singular_camel %>.find(params(:id))
|
21
|
+
end
|
22
|
+
|
23
|
+
# POST /<%= @name_plural %>
|
24
|
+
def create
|
25
|
+
@<%= @name_singular %> = <%= @name_singular_camel %>.new(params(:<%= @name_singular %>))
|
26
|
+
if @<%= @name_singular %>.save
|
27
|
+
redirect_to(<%= @name_plural %>_show_url(:id => @<%= @name_singular %>.id))
|
28
|
+
else
|
29
|
+
render(:action => "new")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# PUT /<%= @name_plural %>/1
|
34
|
+
def update
|
35
|
+
@<%= @name_singular %> = <%= @name_singular_camel %>.find(params(:id))
|
36
|
+
if @<%= @name_singular %>.update_attributes(params(:<%= @name_singular %>))
|
37
|
+
redirect_to(<%= @name_plural %>_show_url(:id => @<%= @name_singular %>.id))
|
38
|
+
else
|
39
|
+
render(:action => "edit")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# DELETE /<%= @name_plural %>/1
|
44
|
+
def delete
|
45
|
+
@<%= @name_singular %> = <%= @name_singular_camel %>.find(params(:id))
|
46
|
+
@<%= @name_singular %>.destroy
|
47
|
+
redirect_to(<%= @name_plural %>_index_url)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<h1>Edit <%= @name_singular_camel %></h1>
|
2
|
+
|
3
|
+
<%%= error_messages_for :<%= @name_singular %> %>
|
4
|
+
|
5
|
+
<%% form(<%= @name_singular %>s_update_url(:id => @<%= @name_singular %>.id), :class => "edit_<%= @name_singular %>", :id => "edit_<%= @name_singular %>", :method => :put) do %>
|
6
|
+
<% for column in columns -%>
|
7
|
+
<% unless column.column_name == "created_at" || column.column_name == "updated_at" -%>
|
8
|
+
<p>
|
9
|
+
<b><%= column.column_name.singular.camelcase %></b><br />
|
10
|
+
<%= column.form_field %>
|
11
|
+
</p>
|
12
|
+
<% end -%>
|
13
|
+
<% end -%>
|
14
|
+
<p>
|
15
|
+
<input id="<%= @name_singular %>_submit" name="commit" type="submit" value="Update" />
|
16
|
+
</p>
|
17
|
+
<%% end %>
|
18
|
+
|
19
|
+
<%%= link_to("Back", <%= @name_singular %>s_index_url) %>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<h1>Listing <%= @name_plural_camel %></h1>
|
2
|
+
|
3
|
+
<table>
|
4
|
+
<tr>
|
5
|
+
<%
|
6
|
+
unless columns.empty?
|
7
|
+
columns.each do |col|
|
8
|
+
-%>
|
9
|
+
<th><%= col.column_name.camelcase %></th>
|
10
|
+
<%
|
11
|
+
end
|
12
|
+
else
|
13
|
+
-%>
|
14
|
+
<th> </th>
|
15
|
+
<%
|
16
|
+
end
|
17
|
+
-%>
|
18
|
+
</tr>
|
19
|
+
|
20
|
+
<%% for <%= @name_singular %> in @<%= @name_plural %> %>
|
21
|
+
<tr>
|
22
|
+
<%
|
23
|
+
unless columns.empty?
|
24
|
+
columns.each do |col| -%>
|
25
|
+
<td><%%= <%= @name_singular %>.<%= col.column_name %> %></td>
|
26
|
+
<%
|
27
|
+
end
|
28
|
+
else
|
29
|
+
-%>
|
30
|
+
<td> </td>
|
31
|
+
<% end -%>
|
32
|
+
<td><%%= link_to("Show", <%= @name_plural %>_show_url(:id => <%= @name_singular %>.id)) %></td>
|
33
|
+
<td><%%= link_to("Edit", <%= @name_plural %>_edit_url(:id => <%= @name_singular %>.id)) %></td>
|
34
|
+
<td><%%= link_to("Delete", <%= @name_plural %>_delete_url(:id => <%= @name_singular %>.id), :method => :delete, :confirm => "Are you sure?") %></td>
|
35
|
+
</tr>
|
36
|
+
<%% end %>
|
37
|
+
</table>
|
38
|
+
|
39
|
+
<br />
|
40
|
+
|
41
|
+
<%%= link_to("New <%= @name_singular_camel %>", <%= @name_plural %>_new_url) %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<h1>New <%= @name_singular_camel %></h1>
|
2
|
+
|
3
|
+
<%%= error_messages_for :<%= @name_singular %> %>
|
4
|
+
|
5
|
+
<%% form(<%= @name_singular %>s_create_url, :class => "new_<%= @name_singular %>", :id => "new_<%= @name_singular %>") do %>
|
6
|
+
<% for column in columns -%>
|
7
|
+
<% unless column.column_name == "created_at" || column.column_name == "updated_at" -%>
|
8
|
+
<p>
|
9
|
+
<b><%= column.column_name.singular.camelcase %></b><br />
|
10
|
+
<%= column.form_field %>
|
11
|
+
</p>
|
12
|
+
<% end -%>
|
13
|
+
<% end -%>
|
14
|
+
<p>
|
15
|
+
<input id="<%= @name_singular %>_submit" name="commit" type="submit" value="Create" />
|
16
|
+
</p>
|
17
|
+
<%% end %>
|
18
|
+
|
19
|
+
<%%= link_to("Back", <%= @name_singular %>s_index_url) %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<p>
|
2
|
+
<h1><%= @name_singular_camel %></h1>
|
3
|
+
</p>
|
4
|
+
<% for column in columns -%>
|
5
|
+
<p>
|
6
|
+
<b><%= column.column_name.singular.camelcase %></b><br />
|
7
|
+
<%%= @<%= @name_singular %>.<%= column.column_name %> %>
|
8
|
+
</p>
|
9
|
+
<% end -%>
|
10
|
+
|
11
|
+
<%%= link_to("Edit", <%= @name_plural %>_edit_url(:id => @<%= @name_singular %>.id)) %> |
|
12
|
+
<%%= link_to("Back", <%= @name_plural %>_index_url) %>
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'rake'
|
2
|
+
namespace :db do
|
3
|
+
|
4
|
+
desc "Create the database for your environment."
|
5
|
+
task :create => :environment do
|
6
|
+
drop_create_database
|
7
|
+
end
|
8
|
+
|
9
|
+
namespace :create do
|
10
|
+
|
11
|
+
desc "Creates your Full environment. Does NOT create your production database!"
|
12
|
+
task :all => :environment do
|
13
|
+
drop_create_database("development")
|
14
|
+
drop_create_database("test")
|
15
|
+
ActiveRecord::Base.establish_connection(Mack::Configuration.database_configurations["development"])
|
16
|
+
Rake::Task["db:migrate"].invoke
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def drop_create_database(env = Mack::Configuration.env)
|
25
|
+
abcs = Mack::Configuration.database_configurations
|
26
|
+
db_settings = abcs[env]
|
27
|
+
case db_settings["adapter"]
|
28
|
+
when "mysql"
|
29
|
+
ActiveRecord::Base.establish_connection(
|
30
|
+
:adapter => "mysql",
|
31
|
+
:host => "localhost",
|
32
|
+
:database => "mysql",
|
33
|
+
:username => ENV["DB_USERNAME"] || "root",
|
34
|
+
:password => ENV["DB_PASSWORD"] || ""
|
35
|
+
)
|
36
|
+
puts "Dropping (MySQL): #{db_settings["database"]}"
|
37
|
+
ActiveRecord::Base.connection.execute "DROP DATABASE IF EXISTS `#{db_settings["database"]}`"
|
38
|
+
|
39
|
+
if db_settings["collation"]
|
40
|
+
puts "Dropping (MySQL): #{db_settings["database"]}"
|
41
|
+
ActiveRecord::Base.connection.execute "CREATE DATABASE `#{db_settings["database"]}` DEFAULT CHARACTER SET `#{db_settings["charset"] || 'utf8'}` COLLATE `#{db_settings["collation"]}`"
|
42
|
+
else
|
43
|
+
puts "Creating (MySQL): #{db_settings["database"]}"
|
44
|
+
ActiveRecord::Base.connection.execute "CREATE DATABASE `#{db_settings["database"]}` DEFAULT CHARACTER SET `#{db_settings["charset"] || 'utf8'}`"
|
45
|
+
end
|
46
|
+
when "postgresql"
|
47
|
+
ENV['PGHOST'] = db_settings["host"] if db_settings["host"]
|
48
|
+
ENV['PGPORT'] = db_settings["port"].to_s if db_settings["port"]
|
49
|
+
ENV['PGPASSWORD'] = db_settings["password"].to_s if db_settings["password"]
|
50
|
+
enc_option = "-E #{db_settings["encoding"]}" if db_settings["encoding"]
|
51
|
+
|
52
|
+
ActiveRecord::Base.clear_active_connections!
|
53
|
+
begin
|
54
|
+
puts "Dropping (PostgreSQL): #{db_settings["database"]}"
|
55
|
+
`dropdb -U "#{db_settings["username"]}" #{db_settings["database"]}`
|
56
|
+
rescue Exception => e
|
57
|
+
end
|
58
|
+
|
59
|
+
begin
|
60
|
+
puts "Creating (PostgreSQL): #{db_settings["database"]}"
|
61
|
+
`createdb #{enc_option} -U "#{db_settings["username"]}" #{db_settings["database"]}`
|
62
|
+
rescue Exception => e
|
63
|
+
end
|
64
|
+
when 'sqlite3'
|
65
|
+
ActiveRecord::Base.clear_active_connections!
|
66
|
+
FileUtils.rm_rf(db_settings["database"])
|
67
|
+
else
|
68
|
+
raise "Task not supported by '#{db_settings["adapter"]}'"
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'rake'
|
2
|
+
namespace :db do
|
3
|
+
|
4
|
+
desc "Migrate the database through scripts in db/migrations"
|
5
|
+
task :migrate => "db:schema:create" do
|
6
|
+
migration_files.each do |migration|
|
7
|
+
require migration
|
8
|
+
migration = File.basename(migration, ".rb")
|
9
|
+
m_number = migration_number(migration)
|
10
|
+
if m_number > @schema_info.version
|
11
|
+
migration_name(migration).camelcase.constantize.up
|
12
|
+
@schema_info.version += 1
|
13
|
+
@schema_info.save
|
14
|
+
end
|
15
|
+
end # each
|
16
|
+
end # migrate
|
17
|
+
|
18
|
+
desc "Rolls the schema back to the previous version. Specify the number of steps with STEP=n"
|
19
|
+
task :rollback => ["db:schema:create", "db:abort_if_pending_migrations"] do
|
20
|
+
migrations = migration_files.reverse
|
21
|
+
(ENV["STEP"] || 1).to_i.times do |step|
|
22
|
+
migration = migrations[step]
|
23
|
+
require migration
|
24
|
+
migration = File.basename(migration, ".rb")
|
25
|
+
m_number = migration_number(migration)
|
26
|
+
if m_number == @schema_info.version
|
27
|
+
migration_name(migration).camelcase.constantize.down
|
28
|
+
@schema_info.version -= 1
|
29
|
+
@schema_info.save
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end # rollback
|
34
|
+
|
35
|
+
desc "Raises an error if there are pending migrations"
|
36
|
+
task :abort_if_pending_migrations do
|
37
|
+
migrations = migration_files.reverse
|
38
|
+
return if migrations.empty?
|
39
|
+
migration = migrations.first
|
40
|
+
migration = File.basename(migration, ".rb")
|
41
|
+
m_number = migration_number(migration)
|
42
|
+
if m_number > @schema_info.version
|
43
|
+
raise Mack::Errors::UnrunMigrations.new(m_number - @schema_info.version)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "Displays the current schema version of your database"
|
48
|
+
task :version => "db:schema:create" do
|
49
|
+
puts "\nYour database is currently at version: #{@schema_info.version}\n"
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
namespace :schema do
|
54
|
+
|
55
|
+
task :create => "mack:environment" do
|
56
|
+
require 'active_record/migration'
|
57
|
+
class CreateSchemaInfo < ActiveRecord::Migration # :nodoc:
|
58
|
+
def self.up
|
59
|
+
create_table :schema_info do |t|
|
60
|
+
t.column :version, :integer, :default => 0
|
61
|
+
end
|
62
|
+
end # up
|
63
|
+
end # CreateSchemaInfo
|
64
|
+
unless SchemaInfo.table_exists?
|
65
|
+
CreateSchemaInfo.up
|
66
|
+
SchemaInfo.create(:version => 0)
|
67
|
+
end
|
68
|
+
@schema_info = SchemaInfo.find(:first)
|
69
|
+
end # create
|
70
|
+
|
71
|
+
end # schema
|
72
|
+
|
73
|
+
|
74
|
+
def migration_files
|
75
|
+
Dir.glob(File.join(Mack::Configuration.root, "db", "migrations", "*.rb"))
|
76
|
+
end
|
77
|
+
|
78
|
+
def migration_number(migration)
|
79
|
+
migration.match(/(^\d+)/).captures.last.to_i
|
80
|
+
end
|
81
|
+
|
82
|
+
def migration_name(migration)
|
83
|
+
migration.match(/^\d+_(.+)/).captures.last
|
84
|
+
end
|
85
|
+
|
86
|
+
end # db
|
data/test/database.yml
ADDED