standalone_migrations 0.3.0 → 0.4.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.markdown +15 -10
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/lib/tasks/standalone_migrations.rb +119 -15
- data/spec/standalone_migrations_spec.rb +9 -3
- data/standalone_migrations.gemspec +15 -17
- metadata +5 -11
- data/.gitignore +0 -2
data/README.markdown
CHANGED
@@ -23,6 +23,12 @@ Add to `Rakefile` in your projects base directory:
|
|
23
23
|
|
24
24
|
Add database configuration to `db/config.yml` in your projects base directory e.g.:
|
25
25
|
development:
|
26
|
+
adapter: sqlite3
|
27
|
+
database: db/development.sqlite3
|
28
|
+
pool: 5
|
29
|
+
timeout: 5000
|
30
|
+
|
31
|
+
production:
|
26
32
|
adapter: mysql
|
27
33
|
encoding: utf8
|
28
34
|
reconnect: false
|
@@ -32,8 +38,11 @@ Add database configuration to `db/config.yml` in your projects base directory e.
|
|
32
38
|
password:
|
33
39
|
socket: /var/run/mysqld/mysqld.sock
|
34
40
|
|
35
|
-
test:
|
36
|
-
|
41
|
+
test: &test
|
42
|
+
adapter: sqlite3
|
43
|
+
database: db/test.sqlite3
|
44
|
+
pool: 5
|
45
|
+
timeout: 5000
|
37
46
|
|
38
47
|
### To create a new database migration:
|
39
48
|
|
@@ -62,18 +71,12 @@ If you're lazy and want to just execute raw SQL:
|
|
62
71
|
|
63
72
|
### To migrate a specific database (for example your "testing" database)
|
64
73
|
|
65
|
-
rake db:migrate
|
74
|
+
rake db:migrate DB=test
|
66
75
|
|
67
76
|
### To execute a specific up/down of one single migration
|
68
77
|
|
69
78
|
rake db:migrate:up VERSION=20081220234130
|
70
79
|
|
71
|
-
### To overwrite the default options
|
72
|
-
[Possible options](http://github.com/thuss/standalone-migrations/blob/master/tasks/standalone_migrations.rake)
|
73
|
-
MIGRATION_OPTIONS = {:config=>'database/config.yml', ... }
|
74
|
-
gem 'standalone_migrations'
|
75
|
-
require 'tasks/standalone_migrations'
|
76
|
-
|
77
80
|
Contributors
|
78
81
|
============
|
79
82
|
This work is based on [Lincoln Stoll's blog post](http://lstoll.net/2008/04/stand-alone-activerecord-migrations/) and [David Welton's post](http://journal.dedasys.com/2007/01/28/using-migrations-outside-of-rails).
|
@@ -81,4 +84,6 @@ This work is based on [Lincoln Stoll's blog post](http://lstoll.net/2008/04/stan
|
|
81
84
|
- [Todd Huss](http://gabrito.com/)
|
82
85
|
- [Michael Grosser](http://pragmatig.wordpress.com)
|
83
86
|
- [Eric Lindvall](http://bitmonkey.net)
|
84
|
-
- [Steve Hodgkiss](http://stevehodgkiss.com/)
|
87
|
+
- [Steve Hodgkiss](http://stevehodgkiss.com/)
|
88
|
+
- [Rich Meyers](https://github.com/richmeyers)
|
89
|
+
- [Wes Bailey](http://exposinggotchas.blogspot.com/)
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
task :default => :spec
|
2
|
-
require '
|
3
|
-
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
RSpec::Core::RakeTask.new {|t| t.rspec_opts = ['--color']}
|
4
4
|
|
5
5
|
# rake install -> install gem locally (for tests)
|
6
6
|
# rake release -> push to github and release to gemcutter
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
@@ -3,7 +3,7 @@ require 'rake/tasklib'
|
|
3
3
|
require 'logger'
|
4
4
|
|
5
5
|
class MigratorTasks < ::Rake::TaskLib
|
6
|
-
attr_accessor :name, :base, :vendor, :config, :schema, :env, :default_env, :verbose, :log_level
|
6
|
+
attr_accessor :name, :base, :vendor, :config, :schema, :env, :default_env, :verbose, :log_level, :logger
|
7
7
|
attr_reader :migrations
|
8
8
|
|
9
9
|
def initialize(name = :migrator)
|
@@ -36,10 +36,19 @@ class MigratorTasks < ::Rake::TaskLib
|
|
36
36
|
ENV[@env] ||= @default_env
|
37
37
|
|
38
38
|
require 'erb'
|
39
|
-
|
39
|
+
|
40
|
+
if @config.is_a?(Hash)
|
41
|
+
ActiveRecord::Base.configurations = @config
|
42
|
+
else
|
43
|
+
ActiveRecord::Base.configurations = YAML::load(ERB.new(IO.read(@config)).result)
|
44
|
+
end
|
40
45
|
ActiveRecord::Base.establish_connection(ENV[@env])
|
41
|
-
logger
|
42
|
-
|
46
|
+
if @logger
|
47
|
+
logger = @logger
|
48
|
+
else
|
49
|
+
logger = Logger.new($stderr)
|
50
|
+
logger.level = @log_level
|
51
|
+
end
|
43
52
|
ActiveRecord::Base.logger = logger
|
44
53
|
end
|
45
54
|
|
@@ -53,6 +62,52 @@ class MigratorTasks < ::Rake::TaskLib
|
|
53
62
|
Rake::Task["db:schema:dump"].execute
|
54
63
|
end
|
55
64
|
|
65
|
+
desc "Retrieves the current schema version number"
|
66
|
+
task :version => :ar_init do
|
67
|
+
puts "Current version: #{ActiveRecord::Migrator.current_version}"
|
68
|
+
end
|
69
|
+
|
70
|
+
def create_database config
|
71
|
+
options = {:charset => 'utf8', :collation => 'utf8_unicode_ci'}
|
72
|
+
|
73
|
+
create_db = lambda do |config|
|
74
|
+
ActiveRecord::Base.establish_connection config.merge('database' => nil)
|
75
|
+
ActiveRecord::Base.connection.create_database config['database'], options
|
76
|
+
ActiveRecord::Base.establish_connection config
|
77
|
+
end
|
78
|
+
|
79
|
+
begin
|
80
|
+
create_db.call config
|
81
|
+
rescue Mysql::Error => sqlerr
|
82
|
+
if sqlerr.errno == 1405
|
83
|
+
print "#{sqlerr.error}. \nPlease provide the root password for your mysql installation\n>"
|
84
|
+
root_password = $stdin.gets.strip
|
85
|
+
|
86
|
+
grant_statement = <<-SQL
|
87
|
+
GRANT ALL PRIVILEGES ON #{config['database']}.*
|
88
|
+
TO '#{config['username']}'@'localhost'
|
89
|
+
IDENTIFIED BY '#{config['password']}' WITH GRANT OPTION;
|
90
|
+
SQL
|
91
|
+
|
92
|
+
create_db.call config.merge('database' => nil, 'username' => 'root', 'password' => root_password)
|
93
|
+
else
|
94
|
+
$stderr.puts sqlerr.error
|
95
|
+
$stderr.puts "Couldn't create database for #{config.inspect}, charset: utf8, collation: utf8_unicode_ci"
|
96
|
+
$stderr.puts "(if you set the charset manually, make sure you have a matching collation)" if config['charset']
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
desc 'Create the database from config/database.yml for the current DATABASE_ENV'
|
102
|
+
task :create => :ar_init do
|
103
|
+
create_database ActiveRecord::Base.configurations[self.default_env]
|
104
|
+
end
|
105
|
+
|
106
|
+
desc 'Drops the database for the current DATABASE_ENV'
|
107
|
+
task :drop => :ar_init do
|
108
|
+
ActiveRecord::Base.connection.drop_database ActiveRecord::Base.configurations[self.default_env]['database']
|
109
|
+
end
|
110
|
+
|
56
111
|
namespace :migrate do
|
57
112
|
[:up, :down].each do |direction|
|
58
113
|
desc "Runs the '#{direction}' for a given migration VERSION."
|
@@ -98,9 +153,11 @@ class MigratorTasks < ::Rake::TaskLib
|
|
98
153
|
namespace :schema do
|
99
154
|
desc "Create schema.rb file that can be portably used against any DB supported by AR"
|
100
155
|
task :dump => :ar_init do
|
101
|
-
|
102
|
-
|
103
|
-
|
156
|
+
if schema_file = ENV['SCHEMA'] || @schema
|
157
|
+
require 'active_record/schema_dumper'
|
158
|
+
File.open(schema_file, "w") do |file|
|
159
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
160
|
+
end
|
104
161
|
end
|
105
162
|
end
|
106
163
|
|
@@ -154,6 +211,44 @@ class MigratorTasks < ::Rake::TaskLib
|
|
154
211
|
task :prepare => ['db:abort_if_pending_migrations', 'db:test:load']
|
155
212
|
end
|
156
213
|
|
214
|
+
desc 'generate a model=name field="field1:type field2:type"'
|
215
|
+
task :generate do
|
216
|
+
ts = Time.now.strftime '%Y%m%d%H%%M%S'
|
217
|
+
|
218
|
+
if ENV['model']
|
219
|
+
table_name = ENV['model']
|
220
|
+
else
|
221
|
+
print 'model name> '
|
222
|
+
table_name = $stdin.gets.strip
|
223
|
+
end
|
224
|
+
|
225
|
+
raise ArgumentError, 'must provide a name for the model to generate' if table_name.empty?
|
226
|
+
|
227
|
+
create_table_str = "create_table :#{table_name} do |t|"
|
228
|
+
|
229
|
+
fields = ENV['fields'] if ENV['fields']
|
230
|
+
|
231
|
+
columns = ENV.has_key?('fields') ? ENV['fields'].split.map {|v| "t.#{v.sub(/:/, ' :')}"}.join("\n#{' '*6}") : nil
|
232
|
+
|
233
|
+
create_table_str << "\n #{columns}" if columns
|
234
|
+
|
235
|
+
contents = <<-MIGRATION
|
236
|
+
class Create#{class_name table_name} < ActiveRecord::Migration
|
237
|
+
def self.up
|
238
|
+
#{create_table_str}
|
239
|
+
t.timestamps
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
def self.down
|
244
|
+
drop_table :#{table_name}
|
245
|
+
end
|
246
|
+
end
|
247
|
+
MIGRATION
|
248
|
+
|
249
|
+
create_file @migrations.first, file_name("create_#{table_name}"), contents
|
250
|
+
end
|
251
|
+
|
157
252
|
desc "Create a new migration"
|
158
253
|
task :new_migration do |t|
|
159
254
|
unless migration = ENV['name']
|
@@ -162,9 +257,8 @@ class MigratorTasks < ::Rake::TaskLib
|
|
162
257
|
abort
|
163
258
|
end
|
164
259
|
|
165
|
-
class_name = migration.split('_').map{|s| s.capitalize }.join
|
166
260
|
file_contents = <<eof
|
167
|
-
class #{class_name} < ActiveRecord::Migration
|
261
|
+
class #{class_name migration} < ActiveRecord::Migration
|
168
262
|
def self.up
|
169
263
|
end
|
170
264
|
|
@@ -173,14 +267,24 @@ class #{class_name} < ActiveRecord::Migration
|
|
173
267
|
end
|
174
268
|
end
|
175
269
|
eof
|
176
|
-
migration_path = @migrations.first
|
177
|
-
FileUtils.mkdir_p(migration_path) unless File.exist?(migration_path)
|
178
|
-
file_name = "#{migration_path}/#{Time.now.utc.strftime('%Y%m%d%H%M%S')}_#{migration}.rb"
|
179
270
|
|
180
|
-
|
271
|
+
create_file @migrations.first, file_name(migration), file_contents
|
181
272
|
|
182
|
-
puts "Created migration #{file_name}"
|
273
|
+
puts "Created migration #{file_name migration}"
|
183
274
|
end
|
184
275
|
end
|
185
276
|
end
|
186
|
-
|
277
|
+
|
278
|
+
def class_name str
|
279
|
+
str.split('_').map {|s| s.capitalize}.join
|
280
|
+
end
|
281
|
+
|
282
|
+
def create_file path, file, contents
|
283
|
+
FileUtils.mkdir_p path unless File.exists? path
|
284
|
+
File.open(file, 'w') {|f| f.write contents}
|
285
|
+
end
|
286
|
+
|
287
|
+
def file_name migration
|
288
|
+
File.join @migrations.first, "#{Time.now.utc.strftime '%Y%m%d%H%M%S'}_#{migration}.rb"
|
289
|
+
end
|
290
|
+
end
|
@@ -110,6 +110,12 @@ TXT
|
|
110
110
|
end
|
111
111
|
end
|
112
112
|
|
113
|
+
describe 'db:version' do
|
114
|
+
it "should start with a new database version" do
|
115
|
+
run("rake db:version").should =~ /Current version: 0/
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
113
119
|
describe 'db:migrate' do
|
114
120
|
context "single migration path" do
|
115
121
|
it "does nothing when no migrations are present" do
|
@@ -130,8 +136,8 @@ TXT
|
|
130
136
|
end
|
131
137
|
it "runs the migrator on each migration path" do
|
132
138
|
result = run("rake db:migrate")
|
133
|
-
result.should =~ /Migrating to CreateTests \(
|
134
|
-
result.should =~ /Migrating to CreateTests2 \(
|
139
|
+
result.should =~ /Migrating to CreateTests \(2010/
|
140
|
+
result.should =~ /Migrating to CreateTests2 \(2010/
|
135
141
|
end
|
136
142
|
end
|
137
143
|
end
|
@@ -265,4 +271,4 @@ TXT
|
|
265
271
|
run('rake db:test:purge').should =~ /SUCCESS/
|
266
272
|
end
|
267
273
|
end
|
268
|
-
end
|
274
|
+
end
|
@@ -1,36 +1,34 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{standalone_migrations}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Todd Huss", "Michael Grosser"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-02-16}
|
13
13
|
s.email = %q{thuss@gabrito.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"README.markdown"
|
16
16
|
]
|
17
17
|
s.files = [
|
18
|
-
".
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
"vendor/migration_helpers/lib/migration_helper.rb"
|
18
|
+
"README.markdown",
|
19
|
+
"Rakefile",
|
20
|
+
"VERSION",
|
21
|
+
"lib/tasks/standalone_migrations.rb",
|
22
|
+
"spec/standalone_migrations_spec.rb",
|
23
|
+
"standalone_migrations.gemspec",
|
24
|
+
"vendor/migration_helpers/MIT-LICENSE",
|
25
|
+
"vendor/migration_helpers/README.markdown",
|
26
|
+
"vendor/migration_helpers/init.rb",
|
27
|
+
"vendor/migration_helpers/lib/migration_helper.rb"
|
29
28
|
]
|
30
29
|
s.homepage = %q{http://github.com/thuss/standalone-migrations}
|
31
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
32
30
|
s.require_paths = ["lib"]
|
33
|
-
s.rubygems_version = %q{1.3.
|
31
|
+
s.rubygems_version = %q{1.3.7}
|
34
32
|
s.summary = %q{A thin wrapper to use Rails Migrations in non Rails projects}
|
35
33
|
s.test_files = [
|
36
34
|
"spec/standalone_migrations_spec.rb"
|
@@ -40,7 +38,7 @@ Gem::Specification.new do |s|
|
|
40
38
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
41
39
|
s.specification_version = 3
|
42
40
|
|
43
|
-
if Gem::Version.new(Gem::
|
41
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
42
|
s.add_runtime_dependency(%q<rake>, [">= 0"])
|
45
43
|
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
46
44
|
else
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: standalone_migrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 19
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
|
-
-
|
7
|
+
- 4
|
9
8
|
- 0
|
10
|
-
version: 0.
|
9
|
+
version: 0.4.0
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Todd Huss
|
@@ -16,7 +15,7 @@ autorequire:
|
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
17
|
|
19
|
-
date:
|
18
|
+
date: 2011-02-16 00:00:00 -08:00
|
20
19
|
default_executable:
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
@@ -27,7 +26,6 @@ dependencies:
|
|
27
26
|
requirements:
|
28
27
|
- - ">="
|
29
28
|
- !ruby/object:Gem::Version
|
30
|
-
hash: 3
|
31
29
|
segments:
|
32
30
|
- 0
|
33
31
|
version: "0"
|
@@ -41,7 +39,6 @@ dependencies:
|
|
41
39
|
requirements:
|
42
40
|
- - ">="
|
43
41
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 3
|
45
42
|
segments:
|
46
43
|
- 0
|
47
44
|
version: "0"
|
@@ -56,7 +53,6 @@ extensions: []
|
|
56
53
|
extra_rdoc_files:
|
57
54
|
- README.markdown
|
58
55
|
files:
|
59
|
-
- .gitignore
|
60
56
|
- README.markdown
|
61
57
|
- Rakefile
|
62
58
|
- VERSION
|
@@ -72,8 +68,8 @@ homepage: http://github.com/thuss/standalone-migrations
|
|
72
68
|
licenses: []
|
73
69
|
|
74
70
|
post_install_message:
|
75
|
-
rdoc_options:
|
76
|
-
|
71
|
+
rdoc_options: []
|
72
|
+
|
77
73
|
require_paths:
|
78
74
|
- lib
|
79
75
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -81,7 +77,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
81
77
|
requirements:
|
82
78
|
- - ">="
|
83
79
|
- !ruby/object:Gem::Version
|
84
|
-
hash: 3
|
85
80
|
segments:
|
86
81
|
- 0
|
87
82
|
version: "0"
|
@@ -90,7 +85,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
85
|
requirements:
|
91
86
|
- - ">="
|
92
87
|
- !ruby/object:Gem::Version
|
93
|
-
hash: 3
|
94
88
|
segments:
|
95
89
|
- 0
|
96
90
|
version: "0"
|
data/.gitignore
DELETED