dm-migrations 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +18 -19
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/dm-migrations.gemspec +6 -5
- data/lib/dm-migrations/adapters/dm-do-adapter.rb +7 -6
- data/lib/dm-migrations/adapters/dm-oracle-adapter.rb +5 -0
- data/lib/dm-migrations/auto_migration.rb +1 -1
- data/lib/dm-migrations/exceptions/duplicate_migration.rb +6 -0
- data/lib/dm-migrations/migration.rb +120 -35
- data/lib/dm-migrations/sql/table_creator.rb +5 -0
- data/spec/integration/auto_migration_spec.rb +56 -13
- data/spec/integration/migration_spec.rb +14 -8
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/migration_spec.rb +34 -25
- data/tasks/local_gemfile.rake +5 -7
- metadata +6 -10
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -71,14 +71,14 @@
|
|
71
71
|
source 'http://rubygems.org'
|
72
72
|
|
73
73
|
DATAMAPPER = 'git://github.com/datamapper'
|
74
|
-
DM_VERSION = '~> 1.0.
|
74
|
+
DM_VERSION = '~> 1.0.1'
|
75
75
|
|
76
76
|
group :runtime do # Runtime dependencies (as in the gemspec)
|
77
77
|
|
78
78
|
if ENV['EXTLIB']
|
79
|
-
gem 'extlib', '~> 0.9.15',
|
79
|
+
gem 'extlib', '~> 0.9.15', :git => "#{DATAMAPPER}/extlib.git"
|
80
80
|
else
|
81
|
-
gem 'activesupport', '~> 3.0.0
|
81
|
+
gem 'activesupport', '~> 3.0.0', :git => 'git://github.com/rails/rails.git', :branch => '3-0-stable', :require => nil
|
82
82
|
end
|
83
83
|
|
84
84
|
gem 'dm-core', DM_VERSION, :git => "#{DATAMAPPER}/dm-core.git"
|
@@ -88,7 +88,7 @@ end
|
|
88
88
|
group(:development) do # Development dependencies (as in the gemspec)
|
89
89
|
|
90
90
|
gem 'rake', '~> 0.8.7'
|
91
|
-
gem 'rspec', '~> 1.3'
|
91
|
+
gem 'rspec', '~> 1.3', :git => 'git://github.com/snusnu/rspec', :branch => 'heckle_fix_plus_gemfile'
|
92
92
|
gem 'jeweler', '~> 1.4'
|
93
93
|
|
94
94
|
end
|
@@ -107,32 +107,31 @@ end
|
|
107
107
|
group :datamapper do # We need this because we want to pin these dependencies to their git master sources
|
108
108
|
|
109
109
|
adapters = ENV['ADAPTER'] || ENV['ADAPTERS']
|
110
|
-
adapters = adapters.to_s.
|
110
|
+
adapters = adapters.to_s.tr(',', ' ').split.uniq - %w[ in_memory ]
|
111
111
|
|
112
|
-
|
112
|
+
DO_VERSION = '~> 0.10.2'
|
113
|
+
DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
|
113
114
|
|
114
|
-
|
115
|
-
|
115
|
+
if (do_adapters = DM_DO_ADAPTERS & adapters).any?
|
116
|
+
options = {}
|
117
|
+
options[:git] = "#{DATAMAPPER}/do.git" if ENV['DO_GIT'] == 'true'
|
116
118
|
|
117
|
-
gem 'data_objects', DO_VERSION,
|
119
|
+
gem 'data_objects', DO_VERSION, options.dup
|
118
120
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
gem "do_#{adapter}", DO_VERSION, :git => "#{DATAMAPPER}/do.git"
|
123
|
-
end
|
121
|
+
do_adapters.each do |adapter|
|
122
|
+
adapter = 'sqlite3' if adapter == 'sqlite'
|
123
|
+
gem "do_#{adapter}", DO_VERSION, options.dup
|
124
124
|
end
|
125
125
|
|
126
126
|
gem 'dm-do-adapter', DM_VERSION, :git => "#{DATAMAPPER}/dm-do-adapter.git"
|
127
|
+
end
|
127
128
|
|
128
|
-
|
129
|
-
|
130
|
-
end
|
131
|
-
|
129
|
+
adapters.each do |adapter|
|
130
|
+
gem "dm-#{adapter}-adapter", DM_VERSION, :git => "#{DATAMAPPER}/dm-#{adapter}-adapter.git"
|
132
131
|
end
|
133
132
|
|
134
133
|
plugins = ENV['PLUGINS'] || ENV['PLUGIN']
|
135
|
-
plugins =
|
134
|
+
plugins = plugins.to_s.tr(',', ' ').split.uniq
|
136
135
|
|
137
136
|
plugins.each do |plugin|
|
138
137
|
gem plugin, DM_VERSION, :git => "#{DATAMAPPER}/#{plugin}.git"
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.1
|
data/dm-migrations.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dm-migrations}
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Paul Sadauskas"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-09-07}
|
13
13
|
s.description = %q{DataMapper plugin for writing and speccing migrations}
|
14
14
|
s.email = %q{psadauskas [a] gmail [d] com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
|
|
38
38
|
"lib/dm-migrations/adapters/dm-sqlserver-adapter.rb",
|
39
39
|
"lib/dm-migrations/adapters/dm-yaml-adapter.rb",
|
40
40
|
"lib/dm-migrations/auto_migration.rb",
|
41
|
+
"lib/dm-migrations/exceptions/duplicate_migration.rb",
|
41
42
|
"lib/dm-migrations/migration.rb",
|
42
43
|
"lib/dm-migrations/migration_runner.rb",
|
43
44
|
"lib/dm-migrations/sql.rb",
|
@@ -107,14 +108,14 @@ Gem::Specification.new do |s|
|
|
107
108
|
s.specification_version = 3
|
108
109
|
|
109
110
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
110
|
-
s.add_runtime_dependency(%q<dm-core>, ["~> 1.0.
|
111
|
+
s.add_runtime_dependency(%q<dm-core>, ["~> 1.0.1"])
|
111
112
|
s.add_development_dependency(%q<rspec>, ["~> 1.3"])
|
112
113
|
else
|
113
|
-
s.add_dependency(%q<dm-core>, ["~> 1.0.
|
114
|
+
s.add_dependency(%q<dm-core>, ["~> 1.0.1"])
|
114
115
|
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
115
116
|
end
|
116
117
|
else
|
117
|
-
s.add_dependency(%q<dm-core>, ["~> 1.0.
|
118
|
+
s.add_dependency(%q<dm-core>, ["~> 1.0.1"])
|
118
119
|
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
119
120
|
end
|
120
121
|
end
|
@@ -126,7 +126,7 @@ module DataMapper
|
|
126
126
|
|
127
127
|
# @api private
|
128
128
|
def alter_table_add_column_statement(connection, table_name, schema_hash)
|
129
|
-
"ALTER TABLE #{quote_name(table_name)}
|
129
|
+
"ALTER TABLE #{quote_name(table_name)} #{add_column_statement} #{property_schema_statement(connection, schema_hash)}"
|
130
130
|
end
|
131
131
|
|
132
132
|
# @api private
|
@@ -204,11 +204,7 @@ module DataMapper
|
|
204
204
|
# remove the default if the property does not allow nil
|
205
205
|
schema.delete(:default) unless schema[:allow_nil]
|
206
206
|
else
|
207
|
-
schema[:default] =
|
208
|
-
type.dump(default, property)
|
209
|
-
else
|
210
|
-
default
|
211
|
-
end
|
207
|
+
schema[:default] = property.dump(default)
|
212
208
|
end
|
213
209
|
|
214
210
|
schema
|
@@ -243,6 +239,11 @@ module DataMapper
|
|
243
239
|
def unique_indexes(model)
|
244
240
|
model.properties(name).unique_indexes
|
245
241
|
end
|
242
|
+
|
243
|
+
# @api private
|
244
|
+
def add_column_statement
|
245
|
+
'ADD COLUMN'
|
246
|
+
end
|
246
247
|
end # module SQL
|
247
248
|
|
248
249
|
include SQL
|
@@ -187,7 +187,7 @@ module DataMapper
|
|
187
187
|
end
|
188
188
|
DataMapper::Model.append_extensions(Model)
|
189
189
|
Adapters::AbstractAdapter.descendants.each do |adapter_class|
|
190
|
-
Adapters.include_migration_api(
|
190
|
+
Adapters.include_migration_api(DataMapper::Inflector.demodulize(adapter_class.name))
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
@@ -1,40 +1,84 @@
|
|
1
|
-
require '
|
2
|
-
|
1
|
+
require 'dm-migrations/exceptions/duplicate_migration'
|
3
2
|
require 'dm-migrations/sql'
|
4
3
|
|
5
|
-
|
6
|
-
class DuplicateMigrationNameError < StandardError
|
7
|
-
def initialize(migration)
|
8
|
-
super("Duplicate Migration Name: '#{migration.name}', version: #{migration.position}")
|
9
|
-
end
|
10
|
-
end
|
4
|
+
require 'benchmark'
|
11
5
|
|
6
|
+
module DataMapper
|
12
7
|
class Migration
|
13
8
|
include SQL
|
14
9
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
10
|
+
# The position or version the migration belongs to
|
11
|
+
attr_reader :position
|
12
|
+
|
13
|
+
# The name of the migration
|
14
|
+
attr_reader :name
|
15
|
+
|
16
|
+
# The repository the migration operates on
|
17
|
+
attr_reader :repository
|
18
|
+
|
19
|
+
#
|
20
|
+
# Creates a new migration.
|
21
|
+
#
|
22
|
+
# @param [Symbol, String, Integer] position
|
23
|
+
# The position or version the migration belongs to.
|
24
|
+
#
|
25
|
+
# @param [Symbol] name
|
26
|
+
# The name of the migration.
|
27
|
+
#
|
28
|
+
# @param [Hash] options
|
29
|
+
# Additional options for the migration.
|
30
|
+
#
|
31
|
+
# @option options [Boolean] :verbose (true)
|
32
|
+
# Enables or disables verbose output.
|
33
|
+
#
|
34
|
+
# @option options [Symbol] :repository (:default)
|
35
|
+
# The DataMapper repository the migration will operate on.
|
36
|
+
#
|
37
|
+
def initialize(position, name, options = {}, &block)
|
38
|
+
@position = position
|
39
|
+
@name = name
|
40
|
+
@options = options
|
41
|
+
@verbose = options.fetch(:verbose, true)
|
42
|
+
@up_action = nil
|
43
|
+
@down_action = nil
|
44
|
+
|
45
|
+
@repository = if options.key?(:database)
|
46
|
+
warn 'Using the :database option with migrations is deprecated, use :repository instead'
|
47
|
+
options[:database]
|
28
48
|
else
|
29
|
-
|
49
|
+
options.fetch(:repository, :default)
|
30
50
|
end
|
31
51
|
|
32
|
-
|
52
|
+
instance_eval(&block)
|
53
|
+
end
|
33
54
|
|
34
|
-
|
35
|
-
|
55
|
+
#
|
56
|
+
# The repository the migration will operate on.
|
57
|
+
#
|
58
|
+
# @return [Symbol, nil]
|
59
|
+
# The name of the DataMapper repository the migration will run against.
|
60
|
+
#
|
61
|
+
# @deprecated Use {#repository} instead.
|
62
|
+
#
|
63
|
+
# @since 1.0.1.
|
64
|
+
#
|
65
|
+
def database
|
66
|
+
warn "Using the DataMapper::Migration#database method is deprecated, use #repository instead"
|
67
|
+
@repository
|
68
|
+
end
|
36
69
|
|
37
|
-
|
70
|
+
#
|
71
|
+
# The adapter the migration will use.
|
72
|
+
#
|
73
|
+
# @return [DataMapper::Adapter]
|
74
|
+
# The adapter the migration will operate on.
|
75
|
+
#
|
76
|
+
# @since 1.0.1
|
77
|
+
#
|
78
|
+
def adapter
|
79
|
+
setup! unless setup?
|
80
|
+
|
81
|
+
@adapter
|
38
82
|
end
|
39
83
|
|
40
84
|
# define the actions that should be performed on an up migration
|
@@ -50,50 +94,60 @@ module DataMapper
|
|
50
94
|
# perform the migration by running the code in the #up block
|
51
95
|
def perform_up
|
52
96
|
result = nil
|
97
|
+
|
53
98
|
if needs_up?
|
54
99
|
# TODO: fix this so it only does transactions for databases that support create/drop
|
55
100
|
# database.transaction.commit do
|
101
|
+
if @up_action
|
56
102
|
say_with_time "== Performing Up Migration ##{position}: #{name}", 0 do
|
57
103
|
result = @up_action.call
|
58
104
|
end
|
59
|
-
|
105
|
+
end
|
106
|
+
|
107
|
+
update_migration_info(:up)
|
60
108
|
# end
|
61
109
|
end
|
110
|
+
|
62
111
|
result
|
63
112
|
end
|
64
113
|
|
65
114
|
# un-do the migration by running the code in the #down block
|
66
115
|
def perform_down
|
67
116
|
result = nil
|
117
|
+
|
68
118
|
if needs_down?
|
69
119
|
# TODO: fix this so it only does transactions for databases that support create/drop
|
70
120
|
# database.transaction.commit do
|
121
|
+
if @down_action
|
71
122
|
say_with_time "== Performing Down Migration ##{position}: #{name}", 0 do
|
72
123
|
result = @down_action.call
|
73
124
|
end
|
74
|
-
|
125
|
+
end
|
126
|
+
|
127
|
+
update_migration_info(:down)
|
75
128
|
# end
|
76
129
|
end
|
130
|
+
|
77
131
|
result
|
78
132
|
end
|
79
133
|
|
80
134
|
# execute raw SQL
|
81
135
|
def execute(sql, *bind_values)
|
82
136
|
say_with_time(sql) do
|
83
|
-
|
137
|
+
adapter.execute(sql, *bind_values)
|
84
138
|
end
|
85
139
|
end
|
86
140
|
|
87
141
|
def create_table(table_name, opts = {}, &block)
|
88
|
-
execute TableCreator.new(
|
142
|
+
execute TableCreator.new(adapter, table_name, opts, &block).to_sql
|
89
143
|
end
|
90
144
|
|
91
145
|
def drop_table(table_name, opts = {})
|
92
|
-
execute "DROP TABLE #{
|
146
|
+
execute "DROP TABLE #{adapter.send(:quote_name, table_name.to_s)}"
|
93
147
|
end
|
94
148
|
|
95
149
|
def modify_table(table_name, opts = {}, &block)
|
96
|
-
TableModifier.new(
|
150
|
+
TableModifier.new(adapter, table_name, opts, &block).statements.each do |sql|
|
97
151
|
execute(sql)
|
98
152
|
end
|
99
153
|
end
|
@@ -177,7 +231,7 @@ module DataMapper
|
|
177
231
|
# Fetch the record for this migration out of the migration_info table
|
178
232
|
def migration_record
|
179
233
|
return [] unless migration_info_table_exists?
|
180
|
-
|
234
|
+
adapter.select("SELECT #{migration_name_column} FROM #{migration_info_table} WHERE #{migration_name_column} = #{quoted_name}")
|
181
235
|
end
|
182
236
|
|
183
237
|
# True if the migration needs to be run
|
@@ -204,12 +258,43 @@ module DataMapper
|
|
204
258
|
|
205
259
|
def quote_table_name(table_name)
|
206
260
|
# TODO: Fix this for 1.9 - can't use this hack to access a private method
|
207
|
-
|
261
|
+
adapter.send(:quote_name, table_name.to_s)
|
208
262
|
end
|
209
263
|
|
210
264
|
def quote_column_name(column_name)
|
211
265
|
# TODO: Fix this for 1.9 - can't use this hack to access a private method
|
212
|
-
|
266
|
+
adapter.send(:quote_name, column_name.to_s)
|
267
|
+
end
|
268
|
+
|
269
|
+
protected
|
270
|
+
|
271
|
+
#
|
272
|
+
# Determines whether the migration has been setup.
|
273
|
+
#
|
274
|
+
# @return [Boolean]
|
275
|
+
# Specifies whether the migration has been setup.
|
276
|
+
#
|
277
|
+
# @since 1.0.1
|
278
|
+
#
|
279
|
+
def setup?
|
280
|
+
!(@adapter.nil?)
|
281
|
+
end
|
282
|
+
|
283
|
+
#
|
284
|
+
# Sets up the migration.
|
285
|
+
#
|
286
|
+
# @since 1.0.1
|
287
|
+
#
|
288
|
+
def setup!
|
289
|
+
@adapter = DataMapper.repository(@repository).adapter
|
290
|
+
|
291
|
+
case @adapter.class.name
|
292
|
+
when /Sqlite/ then @adapter.extend(SQL::Sqlite)
|
293
|
+
when /Mysql/ then @adapter.extend(SQL::Mysql)
|
294
|
+
when /Postgres/ then @adapter.extend(SQL::Postgres)
|
295
|
+
else
|
296
|
+
raise(RuntimeError,"Unsupported Migration Adapter #{@adapter.class}",caller)
|
297
|
+
end
|
213
298
|
end
|
214
299
|
end
|
215
300
|
end
|
@@ -15,6 +15,17 @@ describe DataMapper::Migrations do
|
|
15
15
|
mod.logger = original
|
16
16
|
end
|
17
17
|
|
18
|
+
before :all do
|
19
|
+
class DataMapper::Property::NumericString < DataMapper::Property::String
|
20
|
+
default 0
|
21
|
+
|
22
|
+
def dump(value)
|
23
|
+
return if value.nil?
|
24
|
+
value.to_s
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
18
29
|
supported_by :mysql do
|
19
30
|
before :all do
|
20
31
|
module ::Blog
|
@@ -197,10 +208,12 @@ describe DataMapper::Migrations do
|
|
197
208
|
|
198
209
|
options.only(:min, :max).each do |key, value|
|
199
210
|
it "should allow the #{key} value #{value} to be stored" do
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
211
|
+
pending_if "#{value} causes problem with JRuby 1.5.2 parser", RUBY_ENGINE == 'jruby' && value == -9223372036854775808 do
|
212
|
+
lambda {
|
213
|
+
resource = @model.create(@property => value)
|
214
|
+
@model.first(@property => value).should eql(resource)
|
215
|
+
}.should_not raise_error
|
216
|
+
end
|
204
217
|
end
|
205
218
|
end
|
206
219
|
end
|
@@ -230,7 +243,7 @@ describe DataMapper::Migrations do
|
|
230
243
|
|
231
244
|
describe "with a length of #{length}" do
|
232
245
|
before :all do
|
233
|
-
@property = @model.property(:body, DataMapper::
|
246
|
+
@property = @model.property(:body, DataMapper::Property::Text, options)
|
234
247
|
|
235
248
|
@response = capture_log(DataObjects::Mysql) { @model.auto_migrate! }
|
236
249
|
end
|
@@ -277,6 +290,19 @@ describe DataMapper::Migrations do
|
|
277
290
|
end
|
278
291
|
end
|
279
292
|
end
|
293
|
+
|
294
|
+
describe 'NumericString property' do
|
295
|
+
before :all do
|
296
|
+
@model.property(:id, DataMapper::Property::Serial)
|
297
|
+
@model.property(:number, DataMapper::Property::NumericString)
|
298
|
+
|
299
|
+
@response = capture_log(DataObjects::Mysql) { @model.auto_migrate! }
|
300
|
+
end
|
301
|
+
|
302
|
+
it "should create a VARCHAR(50) column with a default of '0'" do
|
303
|
+
@output.last.should =~ %r{\ACREATE TABLE `blog_articles` \(`id` INT\(10\) UNSIGNED NOT NULL AUTO_INCREMENT, `number` VARCHAR\(50\) DEFAULT '0', PRIMARY KEY\(`id`\)\) ENGINE = InnoDB CHARACTER SET [a-z\d]+ COLLATE (?:[a-z\d](?:_?[a-z\d]+)*)\z}
|
304
|
+
end
|
305
|
+
end
|
280
306
|
end
|
281
307
|
end
|
282
308
|
|
@@ -340,10 +366,12 @@ describe DataMapper::Migrations do
|
|
340
366
|
|
341
367
|
options.only(:min, :max).each do |key, value|
|
342
368
|
it "should allow the #{key} value #{value} to be stored" do
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
369
|
+
pending_if "#{value} causes problem with JRuby 1.5.2 parser", RUBY_ENGINE == 'jruby' && value == -9223372036854775808 do
|
370
|
+
lambda {
|
371
|
+
resource = @model.create(@property => value)
|
372
|
+
@model.first(@property => value).should eql(resource)
|
373
|
+
}.should_not raise_error
|
374
|
+
end
|
347
375
|
end
|
348
376
|
end
|
349
377
|
end
|
@@ -420,6 +448,19 @@ describe DataMapper::Migrations do
|
|
420
448
|
end
|
421
449
|
end
|
422
450
|
end
|
451
|
+
|
452
|
+
describe 'NumericString property' do
|
453
|
+
before :all do
|
454
|
+
@model.property(:id, DataMapper::Property::Serial)
|
455
|
+
@model.property(:number, DataMapper::Property::NumericString)
|
456
|
+
|
457
|
+
@response = capture_log(DataObjects::Postgres) { @model.auto_migrate! }
|
458
|
+
end
|
459
|
+
|
460
|
+
it "should create a VARCHAR(50) column with a default of '0'" do
|
461
|
+
@output[-2].should == "CREATE TABLE \"blog_articles\" (\"id\" SERIAL NOT NULL, \"number\" VARCHAR(50) DEFAULT '0', PRIMARY KEY(\"id\"))"
|
462
|
+
end
|
463
|
+
end
|
423
464
|
end
|
424
465
|
end
|
425
466
|
|
@@ -487,10 +528,12 @@ describe DataMapper::Migrations do
|
|
487
528
|
|
488
529
|
options.only(:min, :max).each do |key, value|
|
489
530
|
it "should allow the #{key} value #{value} to be stored" do
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
531
|
+
pending_if "#{value} causes problem with JRuby 1.5.2 parser", RUBY_ENGINE == 'jruby' && value == -9223372036854775808 do
|
532
|
+
lambda {
|
533
|
+
resource = @model.create(@property => value)
|
534
|
+
@model.first(@property => value).should eql(resource)
|
535
|
+
}.should_not raise_error
|
536
|
+
end
|
494
537
|
end
|
495
538
|
end
|
496
539
|
end
|
@@ -16,24 +16,30 @@ describe "A Migration" do
|
|
16
16
|
|
17
17
|
it "should have a postition attribute" do
|
18
18
|
@migration.should respond_to(:position)
|
19
|
-
|
19
|
+
|
20
20
|
@migration.position.should == 1
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should have a name attribute" do
|
24
24
|
@migration.should respond_to(:name)
|
25
|
-
|
25
|
+
|
26
26
|
@migration.name.should == :create_people_table
|
27
27
|
end
|
28
28
|
|
29
|
-
it "should have a :
|
30
|
-
|
31
|
-
|
32
|
-
m.instance_variable_get(:@
|
29
|
+
it "should have a :repository option" do
|
30
|
+
m = DataMapper::Migration.new(2, :create_dogs_table, :repository => :alternate) {}
|
31
|
+
|
32
|
+
m.instance_variable_get(:@repository).should == :alternate
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should use the default repository by default" do
|
36
|
+
@migration.instance_variable_get(:@repository).should == :default
|
33
37
|
end
|
34
38
|
|
35
|
-
it "should
|
36
|
-
|
39
|
+
it "should still support a :database option" do
|
40
|
+
m = DataMapper::Migration.new(2, :create_legacy_table, :database => :legacy) {}
|
41
|
+
|
42
|
+
m.instance_variable_get(:@repository).should == :legacy
|
37
43
|
end
|
38
44
|
|
39
45
|
it "should have a verbose option" do
|
data/spec/spec_helper.rb
CHANGED
@@ -4,10 +4,12 @@ require 'dm-migrations/migration_runner'
|
|
4
4
|
require 'dm-core/spec/setup'
|
5
5
|
require 'dm-core/spec/lib/adapter_helpers'
|
6
6
|
require 'dm-core/spec/lib/spec_helper'
|
7
|
+
require 'dm-core/spec/lib/pending_helpers'
|
7
8
|
|
8
9
|
Spec::Runner.configure do |config|
|
9
10
|
|
10
11
|
config.extend(DataMapper::Spec::Adapters::Helpers)
|
12
|
+
config.include(DataMapper::Spec::PendingHelpers)
|
11
13
|
|
12
14
|
config.after :all do
|
13
15
|
DataMapper::Spec.cleanup_models
|
data/spec/unit/migration_spec.rb
CHANGED
@@ -29,31 +29,16 @@ describe 'Migration' do
|
|
29
29
|
@m.instance_variable_get(:@options).should == {}
|
30
30
|
end
|
31
31
|
|
32
|
-
it 'should set @
|
33
|
-
DataMapper.
|
34
|
-
DataMapper::Migration.new(1, :do_nothing, {}) {}
|
35
|
-
end
|
32
|
+
it 'should set @repository from the default repository if no :repository option is given' do
|
33
|
+
m = DataMapper::Migration.new(1, :do_nothing, {}) {}
|
36
34
|
|
37
|
-
|
38
|
-
DataMapper.should_receive(:repository).with(:foobar).and_return(@repo)
|
39
|
-
DataMapper::Migration.new(1, :do_nothing, :database => :foobar) {}
|
35
|
+
m.instance_variable_get(:@repository).should == :default
|
40
36
|
end
|
41
37
|
|
42
|
-
it 'should
|
43
|
-
|
44
|
-
DataMapper::Migration.new(1, :do_nothing, {}) {}
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'should extend the adapter with the right module' do
|
48
|
-
@adapter.should_receive(:extend).with(SQL.const_get(DataMapper::Spec.adapter_name.capitalize))
|
49
|
-
DataMapper::Migration.new(1, :do_nothing, {}) {}
|
50
|
-
end
|
38
|
+
it 'should set @repository to the specified :repository option' do
|
39
|
+
m = DataMapper::Migration.new(1, :do_nothing, :repository => :foobar) {}
|
51
40
|
|
52
|
-
|
53
|
-
@adapter.should_receive(:class).any_number_of_times.and_return("InvalidAdapter")
|
54
|
-
lambda {
|
55
|
-
DataMapper::Migration.new(1, :do_nothing, {}) {}
|
56
|
-
}.should raise_error
|
41
|
+
m.instance_variable_get(:@repository).should == :foobar
|
57
42
|
end
|
58
43
|
|
59
44
|
it 'should set @verbose from the options hash' do
|
@@ -65,12 +50,12 @@ describe 'Migration' do
|
|
65
50
|
@m.instance_variable_get(:@verbose).should be(true)
|
66
51
|
end
|
67
52
|
|
68
|
-
it 'should set the @up_action to
|
69
|
-
@m.instance_variable_get(:@up_action).should
|
53
|
+
it 'should set the @up_action to nil' do
|
54
|
+
@m.instance_variable_get(:@up_action).should be_nil
|
70
55
|
end
|
71
56
|
|
72
|
-
it 'should set the @down_action to
|
73
|
-
@m.instance_variable_get(:@down_action).should
|
57
|
+
it 'should set the @down_action to nil' do
|
58
|
+
@m.instance_variable_get(:@down_action).should be_nil
|
74
59
|
end
|
75
60
|
|
76
61
|
it 'should evaluate the given block'
|
@@ -89,6 +74,30 @@ describe 'Migration' do
|
|
89
74
|
@m.instance_variable_get(:@down_action).should == action
|
90
75
|
end
|
91
76
|
|
77
|
+
describe 'adapter' do
|
78
|
+
before(:each) do
|
79
|
+
@m.instance_variable_set(:@adapter, nil)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should determine the class of the adapter to be extended' do
|
83
|
+
@adapter.should_receive(:class).and_return(DataMapper::Spec.adapter.class)
|
84
|
+
|
85
|
+
@m.adapter
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should extend the adapter with the right module' do
|
89
|
+
@adapter.should_receive(:extend).with(SQL.const_get(DataMapper::Spec.adapter_name.capitalize))
|
90
|
+
|
91
|
+
@m.adapter
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should raise "Unsupported adapter" on an unknown adapter' do
|
95
|
+
@adapter.should_receive(:class).any_number_of_times.and_return("InvalidAdapter")
|
96
|
+
|
97
|
+
lambda { @m.adapter }.should raise_error
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
92
101
|
describe 'perform_up' do
|
93
102
|
before do
|
94
103
|
@up_action = mock('proc', :call => true)
|
data/tasks/local_gemfile.rake
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
desc "Support bundling from local source code (allows BUNDLE_GEMFILE=Gemfile.local bundle foo)"
|
2
2
|
task :local_gemfile do |t|
|
3
3
|
|
4
|
-
root
|
5
|
-
datamapper
|
6
|
-
|
7
|
-
source_regex = /DATAMAPPER = 'git:\/\/github.com\/datamapper'/
|
8
|
-
gem_source_regex = /:git => \"#\{DATAMAPPER\}\/(.+?)(?:\.git)?\"/
|
4
|
+
root = Pathname(__FILE__).dirname.parent
|
5
|
+
datamapper = root.parent
|
9
6
|
|
10
7
|
root.join('Gemfile.local').open('w') do |f|
|
11
8
|
root.join('Gemfile').open.each do |line|
|
12
|
-
line.sub!(
|
13
|
-
line.sub!(
|
9
|
+
line.sub!(/DATAMAPPER = 'git:\/\/github.com\/datamapper'/, "DATAMAPPER = '#{datamapper}'")
|
10
|
+
line.sub!(/:git => \"#\{DATAMAPPER\}\/(.+?)(?:\.git)?\"/, ':path => "#{DATAMAPPER}/\1"')
|
11
|
+
line.sub!(/do_options\[:git\] = \"#\{DATAMAPPER\}\/(.+?)(?:\.git)?\"/, 'do_options[:path] = "#{DATAMAPPER}/\1"')
|
14
12
|
f.puts line
|
15
13
|
end
|
16
14
|
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-migrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 23
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 1
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
8
|
+
- 1
|
9
|
+
version: 1.0.1
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Paul Sadauskas
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2010-
|
17
|
+
date: 2010-09-07 00:00:00 -07:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,12 +25,11 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ~>
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 23
|
30
28
|
segments:
|
31
29
|
- 1
|
32
30
|
- 0
|
33
|
-
-
|
34
|
-
version: 1.0.
|
31
|
+
- 1
|
32
|
+
version: 1.0.1
|
35
33
|
type: :runtime
|
36
34
|
version_requirements: *id001
|
37
35
|
- !ruby/object:Gem::Dependency
|
@@ -42,7 +40,6 @@ dependencies:
|
|
42
40
|
requirements:
|
43
41
|
- - ~>
|
44
42
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 9
|
46
43
|
segments:
|
47
44
|
- 1
|
48
45
|
- 3
|
@@ -80,6 +77,7 @@ files:
|
|
80
77
|
- lib/dm-migrations/adapters/dm-sqlserver-adapter.rb
|
81
78
|
- lib/dm-migrations/adapters/dm-yaml-adapter.rb
|
82
79
|
- lib/dm-migrations/auto_migration.rb
|
80
|
+
- lib/dm-migrations/exceptions/duplicate_migration.rb
|
83
81
|
- lib/dm-migrations/migration.rb
|
84
82
|
- lib/dm-migrations/migration_runner.rb
|
85
83
|
- lib/dm-migrations/sql.rb
|
@@ -130,7 +128,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
128
|
requirements:
|
131
129
|
- - ">="
|
132
130
|
- !ruby/object:Gem::Version
|
133
|
-
hash: 3
|
134
131
|
segments:
|
135
132
|
- 0
|
136
133
|
version: "0"
|
@@ -139,7 +136,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
136
|
requirements:
|
140
137
|
- - ">="
|
141
138
|
- !ruby/object:Gem::Version
|
142
|
-
hash: 3
|
143
139
|
segments:
|
144
140
|
- 0
|
145
141
|
version: "0"
|