dm-migrations 1.1.0 → 1.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +8 -8
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/dm-migrations.gemspec +23 -43
- data/examples/Rakefile +144 -0
- data/examples/sample_migration.rb +1 -1
- data/lib/dm-migrations/adapters/dm-do-adapter.rb +4 -4
- data/lib/dm-migrations/adapters/dm-mysql-adapter.rb +18 -4
- data/lib/dm-migrations/adapters/dm-oracle-adapter.rb +4 -4
- data/lib/dm-migrations/adapters/dm-postgres-adapter.rb +3 -3
- data/lib/dm-migrations/adapters/dm-sqlite-adapter.rb +1 -1
- data/lib/dm-migrations/adapters/dm-sqlserver-adapter.rb +10 -10
- data/lib/dm-migrations/auto_migration.rb +4 -2
- data/lib/dm-migrations/sql/mysql.rb +6 -2
- data/lib/dm-migrations/sql/postgres.rb +2 -2
- data/lib/dm-migrations/sql/sqlite.rb +1 -1
- data/lib/dm-migrations/sql/table_creator.rb +1 -1
- data/lib/dm-migrations/sql/table_modifier.rb +4 -0
- data/spec/integration/auto_migration_spec.rb +1 -1
- data/spec/integration/migration_spec.rb +13 -0
- data/spec/integration/sql_spec.rb +60 -0
- metadata +66 -48
data/Gemfile
CHANGED
@@ -5,26 +5,26 @@ source 'http://rubygems.org'
|
|
5
5
|
SOURCE = ENV.fetch('SOURCE', :git).to_sym
|
6
6
|
REPO_POSTFIX = SOURCE == :path ? '' : '.git'
|
7
7
|
DATAMAPPER = SOURCE == :path ? Pathname(__FILE__).dirname.parent : 'http://github.com/datamapper'
|
8
|
-
DM_VERSION = '~> 1.
|
9
|
-
DO_VERSION = '~> 0.10.
|
8
|
+
DM_VERSION = '~> 1.2.0.rc1'
|
9
|
+
DO_VERSION = '~> 0.10.6'
|
10
10
|
DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
|
11
11
|
|
12
12
|
gem 'dm-core', DM_VERSION, SOURCE => "#{DATAMAPPER}/dm-core#{REPO_POSTFIX}"
|
13
13
|
|
14
14
|
group :development do
|
15
15
|
|
16
|
-
gem 'jeweler', '~> 1.
|
17
|
-
gem 'rake', '~> 0.
|
18
|
-
gem 'rspec', '~> 1.3.
|
16
|
+
gem 'jeweler', '~> 1.6.4'
|
17
|
+
gem 'rake', '~> 0.9.2'
|
18
|
+
gem 'rspec', '~> 1.3.2'
|
19
19
|
|
20
20
|
end
|
21
21
|
|
22
22
|
platforms :mri_18 do
|
23
23
|
group :quality do
|
24
24
|
|
25
|
-
gem 'rcov', '~> 0.9.
|
26
|
-
gem 'yard', '~> 0.
|
27
|
-
gem 'yardstick', '~> 0.
|
25
|
+
gem 'rcov', '~> 0.9.10'
|
26
|
+
gem 'yard', '~> 0.7.2'
|
27
|
+
gem 'yardstick', '~> 0.4'
|
28
28
|
|
29
29
|
end
|
30
30
|
end
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
|
4
4
|
begin
|
5
|
-
gem 'jeweler', '~> 1.
|
5
|
+
gem 'jeweler', '~> 1.6.4'
|
6
6
|
require 'jeweler'
|
7
7
|
|
8
8
|
Jeweler::Tasks.new do |gem|
|
@@ -21,5 +21,5 @@ begin
|
|
21
21
|
|
22
22
|
FileList['tasks/**/*.rake'].each { |task| import task }
|
23
23
|
rescue LoadError
|
24
|
-
puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler -v 1.
|
24
|
+
puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler -v 1.6.4'
|
25
25
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0.rc1
|
data/dm-migrations.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "1.
|
7
|
+
s.name = "dm-migrations"
|
8
|
+
s.version = "1.2.0.rc1"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Paul Sadauskas"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = "2011-09-09"
|
13
|
+
s.description = "DataMapper plugin for writing and speccing migrations"
|
14
|
+
s.email = "psadauskas [a] gmail [d] com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
17
|
"README.rdoc"
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
"db/migrations/2_add_dob_to_people.rb",
|
27
27
|
"db/migrations/config.rb",
|
28
28
|
"dm-migrations.gemspec",
|
29
|
+
"examples/Rakefile",
|
29
30
|
"examples/sample_migration.rb",
|
30
31
|
"examples/sample_migration_spec.rb",
|
31
32
|
"lib/dm-migrations.rb",
|
@@ -73,52 +74,31 @@ Gem::Specification.new do |s|
|
|
73
74
|
"tasks/yard.rake",
|
74
75
|
"tasks/yardstick.rake"
|
75
76
|
]
|
76
|
-
s.homepage =
|
77
|
+
s.homepage = "http://github.com/datamapper/dm-migrations"
|
77
78
|
s.require_paths = ["lib"]
|
78
|
-
s.rubyforge_project =
|
79
|
-
s.rubygems_version =
|
80
|
-
s.summary =
|
81
|
-
s.test_files = [
|
82
|
-
"examples/sample_migration.rb",
|
83
|
-
"examples/sample_migration_spec.rb",
|
84
|
-
"spec/integration/auto_migration_spec.rb",
|
85
|
-
"spec/integration/auto_upgrade_spec.rb",
|
86
|
-
"spec/integration/migration_runner_spec.rb",
|
87
|
-
"spec/integration/migration_spec.rb",
|
88
|
-
"spec/integration/sql_spec.rb",
|
89
|
-
"spec/isolated/require_after_setup_spec.rb",
|
90
|
-
"spec/isolated/require_before_setup_spec.rb",
|
91
|
-
"spec/isolated/require_spec.rb",
|
92
|
-
"spec/spec_helper.rb",
|
93
|
-
"spec/unit/migration_spec.rb",
|
94
|
-
"spec/unit/sql/column_spec.rb",
|
95
|
-
"spec/unit/sql/postgres_spec.rb",
|
96
|
-
"spec/unit/sql/sqlite_extensions_spec.rb",
|
97
|
-
"spec/unit/sql/table_creator_spec.rb",
|
98
|
-
"spec/unit/sql/table_modifier_spec.rb",
|
99
|
-
"spec/unit/sql/table_spec.rb",
|
100
|
-
"spec/unit/sql_spec.rb"
|
101
|
-
]
|
79
|
+
s.rubyforge_project = "datamapper"
|
80
|
+
s.rubygems_version = "1.8.10"
|
81
|
+
s.summary = "DataMapper plugin for writing and speccing migrations"
|
102
82
|
|
103
83
|
if s.respond_to? :specification_version then
|
104
84
|
s.specification_version = 3
|
105
85
|
|
106
86
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
107
|
-
s.add_runtime_dependency(%q<dm-core>, ["~> 1.
|
108
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.
|
109
|
-
s.add_development_dependency(%q<rake>, ["~> 0.
|
110
|
-
s.add_development_dependency(%q<rspec>, ["~> 1.3.
|
87
|
+
s.add_runtime_dependency(%q<dm-core>, ["~> 1.2.0.rc1"])
|
88
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
89
|
+
s.add_development_dependency(%q<rake>, ["~> 0.9.2"])
|
90
|
+
s.add_development_dependency(%q<rspec>, ["~> 1.3.2"])
|
111
91
|
else
|
112
|
-
s.add_dependency(%q<dm-core>, ["~> 1.
|
113
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
114
|
-
s.add_dependency(%q<rake>, ["~> 0.
|
115
|
-
s.add_dependency(%q<rspec>, ["~> 1.3.
|
92
|
+
s.add_dependency(%q<dm-core>, ["~> 1.2.0.rc1"])
|
93
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
94
|
+
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
95
|
+
s.add_dependency(%q<rspec>, ["~> 1.3.2"])
|
116
96
|
end
|
117
97
|
else
|
118
|
-
s.add_dependency(%q<dm-core>, ["~> 1.
|
119
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
120
|
-
s.add_dependency(%q<rake>, ["~> 0.
|
121
|
-
s.add_dependency(%q<rspec>, ["~> 1.3.
|
98
|
+
s.add_dependency(%q<dm-core>, ["~> 1.2.0.rc1"])
|
99
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
100
|
+
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
101
|
+
s.add_dependency(%q<rspec>, ["~> 1.3.2"])
|
122
102
|
end
|
123
103
|
end
|
124
104
|
|
data/examples/Rakefile
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
# Sample tasks using dm-migrations
|
2
|
+
# Roughly following Rails conventions, and mostly based on Padrino's dm:* tasks
|
3
|
+
#
|
4
|
+
# Cf. https://github.com/padrino/padrino-framework/blob/master/padrino-gen/lib/padrino-gen/padrino-tasks/datamapper.rb
|
5
|
+
# https://github.com/datamapper/dm-rails/blob/master/lib/dm-rails/railties/database.rake
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'rake'
|
9
|
+
|
10
|
+
# replace this with however your app configures DataMapper repositor(ies)
|
11
|
+
task :environment do
|
12
|
+
require File.expand_path('boot', File.dirname(__FILE__))
|
13
|
+
end
|
14
|
+
|
15
|
+
namespace :db do
|
16
|
+
|
17
|
+
namespace :auto do
|
18
|
+
|
19
|
+
desc "Perform auto-migration (reset your db data)"
|
20
|
+
task :migrate => :environment do |t, _|
|
21
|
+
puts "=> Auto-migrating"
|
22
|
+
::DataMapper.auto_migrate!
|
23
|
+
puts "<= #{t.name} done"
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Perform non destructive auto-migration"
|
27
|
+
task :upgrade => :environment do
|
28
|
+
puts "=> Auto-upgrading"
|
29
|
+
::DataMapper.auto_upgrade!
|
30
|
+
puts "<= #{t.name} done"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "Run all pending migrations, or up to specified migration"
|
36
|
+
task :migrate, [:version] => :load_migrations do |t, args|
|
37
|
+
if vers = args[:version] || ENV['VERSION']
|
38
|
+
puts "=> Migrating up to version #{vers}"
|
39
|
+
migrate_up!(vers)
|
40
|
+
else
|
41
|
+
puts "=> Migrating up"
|
42
|
+
migrate_up!
|
43
|
+
end
|
44
|
+
puts "<= #{t.name} done"
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "Rollback down to specified migration, or rollback last STEP=x migrations (default 1)"
|
48
|
+
task :rollback, [:version] => :load_migrations do |t, args|
|
49
|
+
if vers = args[:version] || ENV['VERSION']
|
50
|
+
puts "=> Rolling back down to migration #{vers}"
|
51
|
+
migrate_down!(vers)
|
52
|
+
else
|
53
|
+
step = ENV['STEP'].to_i || 1
|
54
|
+
applied = migrations.delete_if {|m| m.needs_up?}.sort # note this is N queries as currently implemented
|
55
|
+
target = applied[-1 * step] || applied[0]
|
56
|
+
if target
|
57
|
+
puts "=> Rolling back #{step} step(s)"
|
58
|
+
migrate_down!(target.position - 1)
|
59
|
+
else
|
60
|
+
warn "No migrations to rollback: #{step} step(s)"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
puts "<= #{t.name} done"
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "List migrations descending, showing which have been applied"
|
67
|
+
task :migrations => :load_migrations do
|
68
|
+
puts migrations.sort.reverse.map {|m| "#{m.position} #{m.name} #{m.needs_up? ? '' : 'APPLIED'}"}
|
69
|
+
end
|
70
|
+
|
71
|
+
task :load_migrations => :environment do
|
72
|
+
require 'dm-migrations/migration_runner'
|
73
|
+
FileList['db/migrate/*.rb'].each do |migration|
|
74
|
+
load migration
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
desc "Create the database"
|
80
|
+
task :create, [:repository] => :environment do |t, args|
|
81
|
+
repo = args[:repository] || ENV['REPOSITORY'] || :default
|
82
|
+
config = DataMapper.repository(repo).adapter.options.symbolize_keys
|
83
|
+
user, password, host = config[:user], config[:password], config[:host]
|
84
|
+
database = config[:database] || config[:path].sub(/\//, "")
|
85
|
+
charset = config[:charset] || ENV['CHARSET'] || 'utf8'
|
86
|
+
collation = config[:collation] || ENV['COLLATION'] || 'utf8_unicode_ci'
|
87
|
+
puts "=> Creating database '#{database}'"
|
88
|
+
|
89
|
+
case config[:adapter]
|
90
|
+
when 'postgres'
|
91
|
+
system("createdb", "-E", charset, "-h", host, "-U", user, database)
|
92
|
+
when 'mysql'
|
93
|
+
query = [
|
94
|
+
"mysql", "--user=#{user}", (password.blank? ? '' : "--password=#{password}"), (%w[127.0.0.1 localhost].include?(host) ? '-e' : "--host=#{host} -e"),
|
95
|
+
"CREATE DATABASE #{database} DEFAULT CHARACTER SET #{charset} DEFAULT COLLATE #{collation}".inspect
|
96
|
+
]
|
97
|
+
system(query.compact.join(" "))
|
98
|
+
when 'sqlite3'
|
99
|
+
DataMapper.setup(DataMapper.repository.name, config)
|
100
|
+
else
|
101
|
+
raise "Adapter #{config[:adapter]} not supported for creating databases yet."
|
102
|
+
end
|
103
|
+
puts "<= #{t.name} done"
|
104
|
+
end
|
105
|
+
|
106
|
+
desc "Drop the database"
|
107
|
+
task :drop, [:repository] => :environment do |t, args|
|
108
|
+
repo = args[:repository] || ENV['REPOSITORY'] || :default
|
109
|
+
config = DataMapper.repository(repo).adapter.options.symbolize_keys
|
110
|
+
user, password, host = config[:user], config[:password], config[:host]
|
111
|
+
database = config[:database] || config[:path].sub(/\//, "")
|
112
|
+
puts "=> Dropping database '#{database}'"
|
113
|
+
case config[:adapter]
|
114
|
+
when 'postgres'
|
115
|
+
system("dropdb", "-h", host, "-U", user, database)
|
116
|
+
when 'mysql'
|
117
|
+
query = [
|
118
|
+
"mysql", "--user=#{user}", (password.blank? ? '' : "--password=#{password}"), (%w[127.0.0.1 localhost].include?(host) ? '-e' : "--host=#{host} -e"),
|
119
|
+
"DROP DATABASE IF EXISTS #{database}".inspect
|
120
|
+
]
|
121
|
+
system(query.compact.join(" "))
|
122
|
+
when 'sqlite3'
|
123
|
+
File.delete(config[:path]) if File.exist?(config[:path])
|
124
|
+
else
|
125
|
+
raise "Adapter #{config[:adapter]} not supported for dropping databases yet."
|
126
|
+
end
|
127
|
+
puts "<= #{t.name} done"
|
128
|
+
end
|
129
|
+
|
130
|
+
desc 'Load the seed data from db/seeds.rb'
|
131
|
+
task :seed => :environment do |t, _|
|
132
|
+
puts "=> Loading seed data"
|
133
|
+
seed_file = File.expand_path('db/seeds.rb', File.dirname(__FILE__))
|
134
|
+
load(seed_file) if File.exist?(seed_file)
|
135
|
+
puts "<= #{t.name} done"
|
136
|
+
end
|
137
|
+
|
138
|
+
desc "Drop the database, migrate from scratch and initialize with the seed data"
|
139
|
+
task :reset => [:drop, :setup]
|
140
|
+
|
141
|
+
desc "Create the database, migrate and initialize with the seed data"
|
142
|
+
task :setup => [:create, :migrate, :seed]
|
143
|
+
|
144
|
+
end
|
@@ -269,11 +269,11 @@ module DataMapper
|
|
269
269
|
#
|
270
270
|
# @api private
|
271
271
|
def type_map
|
272
|
-
length = Property::String
|
273
|
-
precision = Property::Numeric
|
274
|
-
scale = Property::Decimal
|
272
|
+
length = Property::String.length
|
273
|
+
precision = Property::Numeric.precision
|
274
|
+
scale = Property::Decimal.scale
|
275
275
|
|
276
|
-
|
276
|
+
{
|
277
277
|
Property::Binary => { :primitive => 'BLOB' },
|
278
278
|
Object => { :primitive => 'TEXT' },
|
279
279
|
Integer => { :primitive => 'INTEGER' },
|
@@ -31,7 +31,14 @@ module DataMapper
|
|
31
31
|
module SQL #:nodoc:
|
32
32
|
# private ## This cannot be private for current migrations
|
33
33
|
|
34
|
-
|
34
|
+
# Allows for specification of the default storage engine to use when creating tables via
|
35
|
+
# migrations. Defaults to DEFAULT_ENGINE.
|
36
|
+
#
|
37
|
+
# adapter = DataMapper.setup(:default, 'mysql://localhost/foo')
|
38
|
+
# adapter.storage_engine = 'MyISAM'
|
39
|
+
#
|
40
|
+
# @api public
|
41
|
+
attr_accessor :storage_engine
|
35
42
|
|
36
43
|
# @api private
|
37
44
|
def supports_serial?
|
@@ -51,7 +58,7 @@ module DataMapper
|
|
51
58
|
|
52
59
|
# @api private
|
53
60
|
def create_table_statement(connection, model, properties)
|
54
|
-
"#{super} ENGINE = #{
|
61
|
+
"#{super} ENGINE = #{storage_engine} CHARACTER SET #{character_set} COLLATE #{collation}"
|
55
62
|
end
|
56
63
|
|
57
64
|
# @api private
|
@@ -84,6 +91,13 @@ module DataMapper
|
|
84
91
|
statement
|
85
92
|
end
|
86
93
|
|
94
|
+
# @api private
|
95
|
+
def storage_engine
|
96
|
+
# Don't pull the default engine via show_variable for backwards compat where it was hard
|
97
|
+
# coded to InnoDB
|
98
|
+
@storage_engine ||= DEFAULT_ENGINE
|
99
|
+
end
|
100
|
+
|
87
101
|
# @api private
|
88
102
|
def character_set
|
89
103
|
@character_set ||= show_variable('character_set_connection') || DEFAULT_CHARACTER_SET
|
@@ -97,7 +111,7 @@ module DataMapper
|
|
97
111
|
# @api private
|
98
112
|
def show_variable(name)
|
99
113
|
result = select('SHOW VARIABLES LIKE ?', name).first
|
100
|
-
result ? result.
|
114
|
+
result ? result.value.freeze : nil
|
101
115
|
end
|
102
116
|
|
103
117
|
private
|
@@ -273,7 +287,7 @@ module DataMapper
|
|
273
287
|
#
|
274
288
|
# @api private
|
275
289
|
def type_map
|
276
|
-
|
290
|
+
super.merge(
|
277
291
|
DateTime => { :primitive => 'DATETIME' },
|
278
292
|
Time => { :primitive => 'DATETIME' }
|
279
293
|
).freeze
|
@@ -278,11 +278,11 @@ module DataMapper
|
|
278
278
|
#
|
279
279
|
# @api private
|
280
280
|
def type_map
|
281
|
-
length = Property::String
|
282
|
-
precision = Property::Numeric
|
283
|
-
scale = Property::Decimal
|
281
|
+
length = Property::String.length
|
282
|
+
precision = Property::Numeric.precision
|
283
|
+
scale = Property::Decimal.scale
|
284
284
|
|
285
|
-
|
285
|
+
{
|
286
286
|
Integer => { :primitive => 'NUMBER', :precision => precision, :scale => 0 },
|
287
287
|
String => { :primitive => 'VARCHAR2', :length => length },
|
288
288
|
Class => { :primitive => 'VARCHAR2', :length => length },
|
@@ -143,10 +143,10 @@ module DataMapper
|
|
143
143
|
#
|
144
144
|
# @api private
|
145
145
|
def type_map
|
146
|
-
precision = Property::Numeric
|
147
|
-
scale = Property::Decimal
|
146
|
+
precision = Property::Numeric.precision
|
147
|
+
scale = Property::Decimal.scale
|
148
148
|
|
149
|
-
|
149
|
+
super.merge(
|
150
150
|
Property::Binary => { :primitive => 'BYTEA' },
|
151
151
|
BigDecimal => { :primitive => 'NUMERIC', :precision => precision, :scale => scale },
|
152
152
|
Float => { :primitive => 'DOUBLE PRECISION' }
|
@@ -158,16 +158,16 @@ module DataMapper
|
|
158
158
|
#
|
159
159
|
# @api private
|
160
160
|
def type_map
|
161
|
-
length = Property::String
|
162
|
-
precision = Property::Numeric
|
163
|
-
scale = Property::Decimal
|
164
|
-
|
165
|
-
|
166
|
-
DateTime => { :primitive => 'DATETIME'
|
167
|
-
Date => { :primitive => 'SMALLDATETIME'
|
168
|
-
Time => { :primitive => 'SMALLDATETIME'
|
169
|
-
TrueClass => { :primitive => 'BIT',
|
170
|
-
Property::Text => { :primitive => 'NVARCHAR', :length => 'max'
|
161
|
+
length = Property::String.length
|
162
|
+
precision = Property::Numeric.precision
|
163
|
+
scale = Property::Decimal.scale
|
164
|
+
|
165
|
+
super.merge(
|
166
|
+
DateTime => { :primitive => 'DATETIME' },
|
167
|
+
Date => { :primitive => 'SMALLDATETIME' },
|
168
|
+
Time => { :primitive => 'SMALLDATETIME' },
|
169
|
+
TrueClass => { :primitive => 'BIT', },
|
170
|
+
Property::Text => { :primitive => 'NVARCHAR', :length => 'max' }
|
171
171
|
).freeze
|
172
172
|
end
|
173
173
|
end
|
@@ -41,8 +41,10 @@ module DataMapper
|
|
41
41
|
|
42
42
|
# @api private
|
43
43
|
def repository_execute(method, repository_name)
|
44
|
-
DataMapper::Model.descendants
|
45
|
-
|
44
|
+
models = DataMapper::Model.descendants
|
45
|
+
models = models.select { |m| m.default_repository_name == repository_name } if repository_name
|
46
|
+
models.each do |model|
|
47
|
+
model.send(method, model.default_repository_name)
|
46
48
|
end
|
47
49
|
end
|
48
50
|
end
|
@@ -21,8 +21,12 @@ module SQL
|
|
21
21
|
true
|
22
22
|
end
|
23
23
|
|
24
|
-
def table_options
|
25
|
-
|
24
|
+
def table_options(opts)
|
25
|
+
opt_engine = opts[:storage_engine] || storage_engine
|
26
|
+
opt_char_set = opts[:character_set] || character_set
|
27
|
+
opt_collation = opts[:collation] || collation
|
28
|
+
|
29
|
+
" ENGINE = #{opt_engine} CHARACTER SET #{opt_char_set} COLLATE #{opt_collation}"
|
26
30
|
end
|
27
31
|
|
28
32
|
def property_schema_statement(connection, schema)
|
@@ -32,12 +32,12 @@ module SQL
|
|
32
32
|
statement
|
33
33
|
end
|
34
34
|
|
35
|
-
def table_options
|
35
|
+
def table_options(opts)
|
36
36
|
''
|
37
37
|
end
|
38
38
|
|
39
39
|
def change_column_type_statement(name, column)
|
40
|
-
"ALTER TABLE #{quote_name(name)} ALTER COLUMN #{
|
40
|
+
"ALTER TABLE #{quote_name(name)} ALTER COLUMN #{column.to_sql}"
|
41
41
|
end
|
42
42
|
|
43
43
|
class Table < SQL::Table
|
@@ -26,7 +26,7 @@ module SQL
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def to_sql
|
29
|
-
"CREATE TABLE #{quoted_table_name} (#{@columns.map{ |c| c.to_sql }.join(', ')})#{@adapter.table_options}"
|
29
|
+
"CREATE TABLE #{quoted_table_name} (#{@columns.map{ |c| c.to_sql }.join(', ')})#{@adapter.table_options(@opts)}"
|
30
30
|
end
|
31
31
|
|
32
32
|
# A helper for using the native NOW() SQL function in a default
|
@@ -368,7 +368,7 @@ describe DataMapper::Migrations do
|
|
368
368
|
[ :min, :max ].each do |key|
|
369
369
|
next unless value = options[key]
|
370
370
|
it "should allow the #{key} value #{value} to be stored" do
|
371
|
-
pending_if "#{value} causes problem with JRuby 1.
|
371
|
+
pending_if "#{value} causes problem with the JRuby < 1.6 parser", RUBY_PLATFORM =~ /java/ && JRUBY_VERSION < '1.6' && value == -9223372036854775808 do
|
372
372
|
lambda {
|
373
373
|
resource = @model.create(@property => value)
|
374
374
|
@model.first(@property => value).should eql(resource)
|
@@ -14,6 +14,14 @@ describe "A Migration" do
|
|
14
14
|
@migration = DataMapper::Migration.new(1, :create_people_table, :verbose => false) { }
|
15
15
|
end
|
16
16
|
|
17
|
+
before do
|
18
|
+
$stderr, @original = StringIO.new, $stderr
|
19
|
+
end
|
20
|
+
|
21
|
+
after do
|
22
|
+
$stderr = @original
|
23
|
+
end
|
24
|
+
|
17
25
|
it "should have a postition attribute" do
|
18
26
|
@migration.should respond_to(:position)
|
19
27
|
|
@@ -42,6 +50,11 @@ describe "A Migration" do
|
|
42
50
|
m.instance_variable_get(:@repository).should == :legacy
|
43
51
|
end
|
44
52
|
|
53
|
+
it "warns when :database is used" do
|
54
|
+
m = DataMapper::Migration.new(2, :create_legacy_table, :database => :legacy) {}
|
55
|
+
$stderr.string.chomp.should == 'Using the :database option with migrations is deprecated, use :repository instead'
|
56
|
+
end
|
57
|
+
|
45
58
|
it "should have a verbose option" do
|
46
59
|
m = DataMapper::Migration.new(2, :create_dogs_table, :verbose => false) {}
|
47
60
|
m.instance_variable_get(:@verbose).should == false
|
@@ -70,6 +70,34 @@ describe "SQL generation" do
|
|
70
70
|
#can't get an exact == comparison here because character set and collation may differ per connection
|
71
71
|
@creator.to_sql.should match(/^CREATE TABLE `people` \(`id` SERIAL PRIMARY KEY, `name` VARCHAR\(50\) NOT NULL, `long_string` VARCHAR\(200\)\) ENGINE = InnoDB CHARACTER SET \w+ COLLATE \w+\z/)
|
72
72
|
end
|
73
|
+
|
74
|
+
it "should allow for custom table creation options for MySQL" do
|
75
|
+
opts = {
|
76
|
+
:storage_engine => 'MyISAM',
|
77
|
+
:character_set => 'big5',
|
78
|
+
:collation => 'big5_chinese_ci',
|
79
|
+
}
|
80
|
+
|
81
|
+
creator = DataMapper::Migration::TableCreator.new(@adapter, :people, opts) do
|
82
|
+
column :id, DataMapper::Property::Serial
|
83
|
+
end
|
84
|
+
|
85
|
+
creator.to_sql.should match(/^CREATE TABLE `people` \(`id` SERIAL PRIMARY KEY\) ENGINE = MyISAM CHARACTER SET big5 COLLATE big5_chinese_ci\z/)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should respect default storage engine types specified by the MySQL adapter" do
|
89
|
+
adapter = DataMapper::Spec.adapter
|
90
|
+
adapter.extend(SQL::Mysql)
|
91
|
+
|
92
|
+
adapter.storage_engine = 'MyISAM'
|
93
|
+
|
94
|
+
creator = DataMapper::Migration::TableCreator.new(adapter, :people) do
|
95
|
+
column :id, DataMapper::Property::Serial
|
96
|
+
end
|
97
|
+
|
98
|
+
creator.to_sql.should match(/^CREATE TABLE `people` \(`id` SERIAL PRIMARY KEY\) ENGINE = MyISAM CHARACTER SET \w+ COLLATE \w+\z/)
|
99
|
+
end
|
100
|
+
|
73
101
|
when :postgres
|
74
102
|
it "should output a CREATE TABLE statement when sent #to_sql" do
|
75
103
|
@creator.to_sql.should == %q{CREATE TABLE "people" ("id" SERIAL PRIMARY KEY, "name" VARCHAR(50) NOT NULL, "long_string" VARCHAR(200))}
|
@@ -79,17 +107,49 @@ describe "SQL generation" do
|
|
79
107
|
@creator.to_sql.should == %q{CREATE TABLE "people" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" VARCHAR(50) NOT NULL, "long_string" VARCHAR(200))}
|
80
108
|
end
|
81
109
|
end
|
110
|
+
|
111
|
+
context 'when the default string length is modified' do
|
112
|
+
before do
|
113
|
+
@original = DataMapper::Property::String.length
|
114
|
+
DataMapper::Property::String.length(255)
|
115
|
+
|
116
|
+
@creator = DataMapper::Migration::TableCreator.new(@adapter, :people) do
|
117
|
+
column :string, String
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
after do
|
122
|
+
DataMapper::Property::String.length(@original)
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'uses the new length for the character column' do
|
126
|
+
@creator.to_sql.should match(/CHAR\(255\)/)
|
127
|
+
end
|
128
|
+
end
|
82
129
|
end
|
83
130
|
|
84
131
|
describe DataMapper::Migration, "#modify_table helper" do
|
85
132
|
before do
|
86
133
|
@migration = DataMapper::Migration.new(1, :create_people_table, :verbose => false) { }
|
134
|
+
|
87
135
|
end
|
88
136
|
|
89
137
|
it "should have a #modify_table helper" do
|
90
138
|
@migration.should respond_to(:modify_table)
|
91
139
|
end
|
92
140
|
|
141
|
+
case DataMapper::Spec.adapter_name.to_sym
|
142
|
+
when :postgres
|
143
|
+
before do
|
144
|
+
@modifier = DataMapper::Migration::TableModifier.new(@adapter, :people) do
|
145
|
+
change_column :name, 'VARCHAR(200)'
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should alter the column" do
|
150
|
+
@modifier.to_sql.should == %q{ALTER TABLE "people" ALTER COLUMN "name" VARCHAR(200)}
|
151
|
+
end
|
152
|
+
end
|
93
153
|
end
|
94
154
|
|
95
155
|
describe DataMapper::Migration, "other helpers" do
|
metadata
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-migrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
hash: 15424023
|
5
|
+
prerelease: 6
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
- rc
|
11
|
+
- 1
|
12
|
+
version: 1.2.0.rc1
|
6
13
|
platform: ruby
|
7
14
|
authors:
|
8
15
|
- Paul Sadauskas
|
@@ -10,53 +17,74 @@ autorequire:
|
|
10
17
|
bindir: bin
|
11
18
|
cert_chain: []
|
12
19
|
|
13
|
-
date: 2011-
|
14
|
-
default_executable:
|
20
|
+
date: 2011-09-09 00:00:00 Z
|
15
21
|
dependencies:
|
16
22
|
- !ruby/object:Gem::Dependency
|
17
|
-
|
18
|
-
|
23
|
+
type: :runtime
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
19
25
|
none: false
|
20
26
|
requirements:
|
21
27
|
- - ~>
|
22
28
|
- !ruby/object:Gem::Version
|
23
|
-
|
24
|
-
|
29
|
+
hash: 15424023
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 2
|
33
|
+
- 0
|
34
|
+
- rc
|
35
|
+
- 1
|
36
|
+
version: 1.2.0.rc1
|
25
37
|
prerelease: false
|
26
|
-
|
38
|
+
requirement: *id001
|
39
|
+
name: dm-core
|
27
40
|
- !ruby/object:Gem::Dependency
|
28
|
-
|
29
|
-
|
41
|
+
type: :development
|
42
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
30
43
|
none: false
|
31
44
|
requirements:
|
32
45
|
- - ~>
|
33
46
|
- !ruby/object:Gem::Version
|
34
|
-
|
35
|
-
|
47
|
+
hash: 7
|
48
|
+
segments:
|
49
|
+
- 1
|
50
|
+
- 6
|
51
|
+
- 4
|
52
|
+
version: 1.6.4
|
36
53
|
prerelease: false
|
37
|
-
|
54
|
+
requirement: *id002
|
55
|
+
name: jeweler
|
38
56
|
- !ruby/object:Gem::Dependency
|
39
|
-
|
40
|
-
|
57
|
+
type: :development
|
58
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
41
59
|
none: false
|
42
60
|
requirements:
|
43
61
|
- - ~>
|
44
62
|
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
|
63
|
+
hash: 63
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
- 9
|
67
|
+
- 2
|
68
|
+
version: 0.9.2
|
47
69
|
prerelease: false
|
48
|
-
|
70
|
+
requirement: *id003
|
71
|
+
name: rake
|
49
72
|
- !ruby/object:Gem::Dependency
|
50
|
-
|
51
|
-
|
73
|
+
type: :development
|
74
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
52
75
|
none: false
|
53
76
|
requirements:
|
54
77
|
- - ~>
|
55
78
|
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
|
79
|
+
hash: 31
|
80
|
+
segments:
|
81
|
+
- 1
|
82
|
+
- 3
|
83
|
+
- 2
|
84
|
+
version: 1.3.2
|
58
85
|
prerelease: false
|
59
|
-
|
86
|
+
requirement: *id004
|
87
|
+
name: rspec
|
60
88
|
description: DataMapper plugin for writing and speccing migrations
|
61
89
|
email: psadauskas [a] gmail [d] com
|
62
90
|
executables: []
|
@@ -76,6 +104,7 @@ files:
|
|
76
104
|
- db/migrations/2_add_dob_to_people.rb
|
77
105
|
- db/migrations/config.rb
|
78
106
|
- dm-migrations.gemspec
|
107
|
+
- examples/Rakefile
|
79
108
|
- examples/sample_migration.rb
|
80
109
|
- examples/sample_migration_spec.rb
|
81
110
|
- lib/dm-migrations.rb
|
@@ -122,7 +151,6 @@ files:
|
|
122
151
|
- tasks/spec.rake
|
123
152
|
- tasks/yard.rake
|
124
153
|
- tasks/yardstick.rake
|
125
|
-
has_rdoc: true
|
126
154
|
homepage: http://github.com/datamapper/dm-migrations
|
127
155
|
licenses: []
|
128
156
|
|
@@ -136,37 +164,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
136
164
|
requirements:
|
137
165
|
- - ">="
|
138
166
|
- !ruby/object:Gem::Version
|
167
|
+
hash: 3
|
168
|
+
segments:
|
169
|
+
- 0
|
139
170
|
version: "0"
|
140
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
172
|
none: false
|
142
173
|
requirements:
|
143
|
-
- - "
|
174
|
+
- - ">"
|
144
175
|
- !ruby/object:Gem::Version
|
145
|
-
|
176
|
+
hash: 25
|
177
|
+
segments:
|
178
|
+
- 1
|
179
|
+
- 3
|
180
|
+
- 1
|
181
|
+
version: 1.3.1
|
146
182
|
requirements: []
|
147
183
|
|
148
184
|
rubyforge_project: datamapper
|
149
|
-
rubygems_version: 1.
|
185
|
+
rubygems_version: 1.8.10
|
150
186
|
signing_key:
|
151
187
|
specification_version: 3
|
152
188
|
summary: DataMapper plugin for writing and speccing migrations
|
153
|
-
test_files:
|
154
|
-
|
155
|
-
- examples/sample_migration_spec.rb
|
156
|
-
- spec/integration/auto_migration_spec.rb
|
157
|
-
- spec/integration/auto_upgrade_spec.rb
|
158
|
-
- spec/integration/migration_runner_spec.rb
|
159
|
-
- spec/integration/migration_spec.rb
|
160
|
-
- spec/integration/sql_spec.rb
|
161
|
-
- spec/isolated/require_after_setup_spec.rb
|
162
|
-
- spec/isolated/require_before_setup_spec.rb
|
163
|
-
- spec/isolated/require_spec.rb
|
164
|
-
- spec/spec_helper.rb
|
165
|
-
- spec/unit/migration_spec.rb
|
166
|
-
- spec/unit/sql/column_spec.rb
|
167
|
-
- spec/unit/sql/postgres_spec.rb
|
168
|
-
- spec/unit/sql/sqlite_extensions_spec.rb
|
169
|
-
- spec/unit/sql/table_creator_spec.rb
|
170
|
-
- spec/unit/sql/table_modifier_spec.rb
|
171
|
-
- spec/unit/sql/table_spec.rb
|
172
|
-
- spec/unit/sql_spec.rb
|
189
|
+
test_files: []
|
190
|
+
|