mini_record 0.4.4 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +10 -3
- data/lib/mini_record/auto_schema.rb +68 -52
- data/lib/mini_record/version.rb +1 -1
- data/test/helper.rb +7 -5
- data/test/test_mini_record.rb +87 -49
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 784a891255be111d6c3d06375ee93264c7692dfe
|
4
|
+
data.tar.gz: 45ffe1d08143af8c90cbe2f3902765b234d99fb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1efebe1b000c99b4eaa89ff150a7d782ca2a94db3f03d8fe782fa53656b243dca7ff3c419a9a93e2ef90f9a58ed83835985ad727c1cc995eb7e3d17debca98ce
|
7
|
+
data.tar.gz: 5198ecfa9d0f2169ebfceecffdb625b72b2e274bbf8b06875dab5ed832284a3e630a7a6a59b7084b5ac69c85d41648e2f5af6dc99ea385cea93d49a1af820e25
|
data/Gemfile
CHANGED
@@ -3,11 +3,18 @@ source "http://rubygems.org"
|
|
3
3
|
# Specify your gem's dependencies in mini_record.gemspec
|
4
4
|
gem 'rake'
|
5
5
|
gem 'minitest'
|
6
|
+
|
7
|
+
# Test database adapters with "rake test DB=mysql2"
|
6
8
|
gem 'sqlite3'
|
7
|
-
gem 'mysql2'
|
8
|
-
gem 'mysql'
|
9
9
|
gem 'pg'
|
10
|
-
gem '
|
10
|
+
gem 'mysql'
|
11
|
+
gem 'mysql2'
|
12
|
+
|
13
|
+
# Uncomment to test older versions, then "bundle update"
|
14
|
+
# gem 'activerecord', '<= 3.2'
|
15
|
+
# gem 'activerecord', '~> 4.0.0'
|
16
|
+
# gem 'activerecord', '~> 4.1.0'
|
17
|
+
gem 'activerecord', '>= 4.2.0'
|
11
18
|
|
12
19
|
group :test do
|
13
20
|
gem 'foreigner', '>= 1.4.2'
|
@@ -3,7 +3,7 @@ module MiniRecord
|
|
3
3
|
def self.included(base)
|
4
4
|
base.extend(ClassMethods)
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
module ClassMethods
|
8
8
|
def init_table_definition(connection)
|
9
9
|
#connection.create_table(table_name) unless connection.table_exists?(table_name)
|
@@ -23,7 +23,7 @@ module MiniRecord
|
|
23
23
|
"Unsupported number of args for ActiveRecord::ConnectionAdapters::TableDefinition.new()"
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def schema_tables
|
28
28
|
@@_schema_tables ||= []
|
29
29
|
end
|
@@ -139,7 +139,7 @@ module MiniRecord
|
|
139
139
|
alias :col :field
|
140
140
|
|
141
141
|
def timestamps
|
142
|
-
field :created_at, :updated_at, :as => :datetime
|
142
|
+
field :created_at, :updated_at, :as => :datetime
|
143
143
|
end
|
144
144
|
|
145
145
|
def reset_table_definition!
|
@@ -178,9 +178,9 @@ module MiniRecord
|
|
178
178
|
end
|
179
179
|
|
180
180
|
def clear_tables!(dry_run = false)
|
181
|
-
return unless MiniRecord.configuration.destructive == true
|
181
|
+
return unless MiniRecord.configuration.destructive == true
|
182
182
|
(connection.tables - schema_tables).each do |name|
|
183
|
-
logger.debug "[MiniRecord] Dropping table #{name}"
|
183
|
+
logger.debug "[MiniRecord] Dropping table #{name}" if logger
|
184
184
|
unless dry_run
|
185
185
|
connection.drop_table(name)
|
186
186
|
schema_tables.delete(name)
|
@@ -196,12 +196,12 @@ module MiniRecord
|
|
196
196
|
|
197
197
|
# Remove foreign keys for indexes with :foreign=>false option
|
198
198
|
def remove_foreign_keys(dry_run)
|
199
|
-
return unless MiniRecord.configuration.destructive == true
|
199
|
+
return unless MiniRecord.configuration.destructive == true
|
200
200
|
indexes.each do |name, options|
|
201
201
|
if options[:foreign]==false
|
202
202
|
foreign_key = foreign_keys.detect { |fk| fk.options[:column] == options[:column].to_s }
|
203
203
|
if foreign_key
|
204
|
-
logger.debug "[MiniRecord] Removing Foreign Key #{foreign_key.options[:name]} on table #{table_name}"
|
204
|
+
logger.debug "[MiniRecord] Removing Foreign Key #{foreign_key.options[:name]} on table #{table_name}" if logger
|
205
205
|
connection.remove_foreign_key(table_name, :name => foreign_key.options[:name]) unless dry_run
|
206
206
|
foreign_keys.delete(foreign_key)
|
207
207
|
end
|
@@ -216,7 +216,7 @@ module MiniRecord
|
|
216
216
|
column = options[:column].to_s
|
217
217
|
unless foreign_keys.detect { |fk| fk[:options][:column] == column }
|
218
218
|
to_table = reflect_on_all_associations.detect { |a| a.foreign_key.to_s==column }.table_name
|
219
|
-
logger.debug "[MiniRecord] Adding Foreign Key on #{table_name} to #{to_table}"
|
219
|
+
logger.debug "[MiniRecord] Adding Foreign Key on #{table_name} to #{to_table}" if logger
|
220
220
|
connection.add_foreign_key(table_name, to_table, options) unless dry_run
|
221
221
|
foreign_keys << { :options=> { :column=>column } }
|
222
222
|
end
|
@@ -224,6 +224,51 @@ module MiniRecord
|
|
224
224
|
end
|
225
225
|
end
|
226
226
|
|
227
|
+
# Helper to determine if/how a field will change
|
228
|
+
def field_attr_changes(field_name)
|
229
|
+
field = field_name.to_s
|
230
|
+
changed = false # flag
|
231
|
+
new_attr = {}
|
232
|
+
|
233
|
+
# Next, iterate through our extended attributes, looking for any differences
|
234
|
+
# This catches stuff like :null, :precision, etc
|
235
|
+
# Ignore junk attributes that different versions of Rails include
|
236
|
+
[:name, :limit, :precision, :scale, :default, :null].each do |att|
|
237
|
+
value = fields[field][att]
|
238
|
+
value = true if att == :null && value.nil?
|
239
|
+
|
240
|
+
# Skip unspecified limit/precision/scale as DB will set them to defaults,
|
241
|
+
# and on subsequent runs, this will be erroneously detected as a change.
|
242
|
+
next if value.nil? and [:limit, :precision, :scale].include?(att)
|
243
|
+
|
244
|
+
old_value = fields_in_db[field].send(att)
|
245
|
+
# puts "#{field_name}[#{att}] = #{value.inspect} vs #{old_value.inspect}"
|
246
|
+
|
247
|
+
attr_changed = false
|
248
|
+
if att == :default
|
249
|
+
# Rails 4.2 changed behavior to pass DB values directly through, so we must re-map
|
250
|
+
if value.to_s =~ /^(false|f|0)$/i
|
251
|
+
attr_changed = true if old_value.to_s !~ /^(false|f|0)$/i
|
252
|
+
elsif value.to_s =~ /^(true|t|1)$/i
|
253
|
+
attr_changed = true if old_value.to_s !~ /^(true|t|1)$/i
|
254
|
+
elsif value.to_s != old_value.to_s
|
255
|
+
attr_changed = true
|
256
|
+
end
|
257
|
+
elsif value != old_value
|
258
|
+
attr_changed = true
|
259
|
+
end
|
260
|
+
|
261
|
+
if attr_changed
|
262
|
+
logger.debug "[MiniRecord] Detected schema change for #{table_name}.#{field}##{att} " +
|
263
|
+
"from #{old_value.inspect} to #{value.inspect}" if logger
|
264
|
+
new_attr[att] = value
|
265
|
+
changed ||= attr_changed
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
[new_attr, changed]
|
270
|
+
end
|
271
|
+
|
227
272
|
# dry-run
|
228
273
|
def auto_upgrade_dry
|
229
274
|
auto_upgrade!(true)
|
@@ -240,7 +285,7 @@ module MiniRecord
|
|
240
285
|
# If table doesn't exist, create it
|
241
286
|
unless connection.tables.include?(table_name)
|
242
287
|
class << connection; attr_accessor :table_definition; end unless connection.respond_to?(:table_definition=)
|
243
|
-
logger.debug "[MiniRecord] Creating Table #{table_name}"
|
288
|
+
logger.debug "[MiniRecord] Creating Table #{table_name}" if logger
|
244
289
|
unless dry_run
|
245
290
|
connection.table_definition = table_definition
|
246
291
|
connection.create_table(table_name, *create_table_options)
|
@@ -274,7 +319,7 @@ module MiniRecord
|
|
274
319
|
unless connection.tables.include?(table.to_s)
|
275
320
|
foreign_key = association.options[:foreign_key] || association.foreign_key
|
276
321
|
association_foreign_key = association.options[:association_foreign_key] || association.association_foreign_key
|
277
|
-
logger.debug "[MiniRecord] Creating Join Table #{table} with keys #{foreign_key} and #{association_foreign_key}"
|
322
|
+
logger.debug "[MiniRecord] Creating Join Table #{table} with keys #{foreign_key} and #{association_foreign_key}" if logger
|
278
323
|
unless dry_run
|
279
324
|
connection.create_table(table, :id => false) do |t|
|
280
325
|
t.integer foreign_key
|
@@ -283,7 +328,7 @@ module MiniRecord
|
|
283
328
|
end
|
284
329
|
index_name = connection.index_name(table, :column => [foreign_key, association_foreign_key])
|
285
330
|
index_name = index_name[0...connection.index_name_length] if index_name.length > connection.index_name_length
|
286
|
-
logger.debug "[MiniRecord] Creating Join Table Index #{index_name} (#{foreign_key}, #{association_foreign_key}) on #{table}"
|
331
|
+
logger.debug "[MiniRecord] Creating Join Table Index #{index_name} (#{foreign_key}, #{association_foreign_key}) on #{table}" if logger
|
287
332
|
connection.add_index table, [foreign_key, association_foreign_key], :name => index_name, :unique => true unless dry_run or suppressed_indexes[association.name]
|
288
333
|
end
|
289
334
|
# Add join table to our schema tables
|
@@ -300,77 +345,48 @@ module MiniRecord
|
|
300
345
|
|
301
346
|
# Group Destructive Actions
|
302
347
|
if MiniRecord.configuration.destructive == true and connection.tables.include?(table_name)
|
303
|
-
|
348
|
+
|
304
349
|
# Rename fields
|
305
350
|
rename_fields.each do |old_name, new_name|
|
306
351
|
old_column = fields_in_db[old_name.to_s]
|
307
352
|
new_column = fields_in_db[new_name.to_s]
|
308
353
|
if old_column && !new_column
|
309
|
-
logger.debug "[MiniRecord] Renaming column #{table_name}.#{old_column.name} to #{new_name}"
|
354
|
+
logger.debug "[MiniRecord] Renaming column #{table_name}.#{old_column.name} to #{new_name}" if logger
|
310
355
|
connection.rename_column(table_name, old_column.name, new_name) unless dry_run
|
311
356
|
end
|
312
357
|
end
|
313
|
-
|
358
|
+
|
314
359
|
# Remove fields from db no longer in schema
|
315
360
|
columns_to_delete = fields_in_db.keys - fields.keys & fields_in_db.keys
|
316
361
|
columns_to_delete.each do |field|
|
317
362
|
column = fields_in_db[field]
|
318
|
-
logger.debug "[MiniRecord] Removing column #{table_name}.#{column.name}"
|
363
|
+
logger.debug "[MiniRecord] Removing column #{table_name}.#{column.name}" if logger
|
319
364
|
connection.remove_column table_name, column.name unless dry_run
|
320
365
|
end
|
321
|
-
|
366
|
+
|
322
367
|
# Change attributes of existent columns
|
323
368
|
(fields.keys & fields_in_db.keys).each do |field|
|
324
369
|
if field != primary_key #ActiveRecord::Base.get_primary_key(table_name)
|
325
|
-
changed
|
326
|
-
new_attr = {}
|
327
|
-
|
328
|
-
# Special catch for precision/scale, since *both* must be specified together
|
329
|
-
# Always include them in the attr struct, but they'll only get applied if changed = true
|
330
|
-
new_attr[:precision] = fields[field][:precision]
|
331
|
-
new_attr[:scale] = fields[field][:scale]
|
332
|
-
|
333
|
-
# If we have precision this is also the limit
|
334
|
-
fields[field][:limit] ||= fields[field][:precision]
|
335
|
-
|
336
|
-
# Next, iterate through our extended attributes, looking for any differences
|
337
|
-
# This catches stuff like :null, :precision, etc
|
338
|
-
# Ignore junk attributes that different versions of Rails include
|
339
|
-
[:name, :limit, :precision, :scale, :default, :null].each do |att|
|
340
|
-
value = fields[field][att]
|
341
|
-
value = true if att == :null && value.nil?
|
342
|
-
|
343
|
-
# Skip unspecified limit/precision/scale as DB will set them to defaults,
|
344
|
-
# and on subsequent runs, this will be erroneously detected as a change.
|
345
|
-
next if value.nil? and [:limit, :precision, :scale].include?(att)
|
346
|
-
|
347
|
-
old_value = fields_in_db[field].send(att)
|
348
|
-
if value != old_value
|
349
|
-
logger.debug "[MiniRecord] Detected schema change for #{table_name}.#{field}##{att} " +
|
350
|
-
"from #{old_value.inspect} to #{value.inspect}" if logger
|
351
|
-
new_attr[att] = value
|
352
|
-
changed = true
|
353
|
-
end
|
354
|
-
end
|
370
|
+
new_attr, changed = field_attr_changes(field)
|
355
371
|
|
356
372
|
# Change the column if applicable
|
357
373
|
new_type = fields[field].type.to_sym
|
358
374
|
if changed
|
359
|
-
logger.debug "[MiniRecord] Changing column #{table_name}.#{field} to new type #{new_type}"
|
375
|
+
logger.debug "[MiniRecord] Changing column #{table_name}.#{field} to new type #{new_type}" if logger
|
360
376
|
connection.change_column table_name, field, new_type, new_attr unless dry_run
|
361
377
|
end
|
362
378
|
end
|
363
379
|
end
|
364
|
-
|
380
|
+
|
365
381
|
remove_foreign_keys(dry_run) if connection.respond_to?(:foreign_keys)
|
366
382
|
|
367
383
|
# Remove old index
|
368
384
|
index_names = indexes.collect{ |name, opts| (opts[:name] || name).to_s }
|
369
385
|
(indexes_in_db.keys - index_names).each do |name|
|
370
|
-
logger.debug "[MiniRecord] Removing index #{name} on #{table_name}"
|
386
|
+
logger.debug "[MiniRecord] Removing index #{name} on #{table_name}" if logger
|
371
387
|
connection.remove_index(table_name, :name => name) unless dry_run
|
372
388
|
end
|
373
|
-
|
389
|
+
|
374
390
|
end
|
375
391
|
|
376
392
|
if connection.tables.include?(table_name)
|
@@ -381,7 +397,7 @@ module MiniRecord
|
|
381
397
|
options = {:limit => column.limit, :precision => column.precision, :scale => column.scale}
|
382
398
|
options[:default] = column.default unless column.default.nil?
|
383
399
|
options[:null] = column.null unless column.null.nil?
|
384
|
-
logger.debug "[MiniRecord] Adding column #{table_name}.#{column.name}"
|
400
|
+
logger.debug "[MiniRecord] Adding column #{table_name}.#{column.name}" if logger
|
385
401
|
connection.add_column table_name, column.name, column.type.to_sym, options unless dry_run
|
386
402
|
end
|
387
403
|
end
|
@@ -391,7 +407,7 @@ module MiniRecord
|
|
391
407
|
options = options.dup
|
392
408
|
index_name = (options[:name] || name).to_s
|
393
409
|
unless connection.indexes(table_name).detect { |i| i.name == index_name }
|
394
|
-
logger.debug "[MiniRecord] Adding index #{index_name} #{options[:column].inspect} on #{table_name}"
|
410
|
+
logger.debug "[MiniRecord] Adding index #{index_name} #{options[:column].inspect} on #{table_name}" if logger
|
395
411
|
connection.add_index(table_name, options.delete(:column), options) unless dry_run
|
396
412
|
end
|
397
413
|
end
|
data/lib/mini_record/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rubygems' unless defined?(Gem)
|
2
2
|
require 'bundler/setup'
|
3
|
+
require 'logger'
|
3
4
|
require 'mini_record'
|
4
5
|
require 'minitest/autorun'
|
5
6
|
|
@@ -39,24 +40,25 @@ class ActiveRecord::Base
|
|
39
40
|
|
40
41
|
def auto_upgrade!(*args)
|
41
42
|
ActiveRecord::Base.logs = StringIO.new
|
42
|
-
ActiveRecord::Base.logger =
|
43
|
+
ActiveRecord::Base.logger = Logger.new(ActiveRecord::Base.logs)
|
43
44
|
silence_stream(STDERR) { super }
|
44
45
|
end
|
45
46
|
|
46
47
|
def auto_upgrade_dry
|
47
48
|
ActiveRecord::Base.logs = StringIO.new
|
48
|
-
ActiveRecord::Base.logger =
|
49
|
+
ActiveRecord::Base.logger = Logger.new(ActiveRecord::Base.logs)
|
49
50
|
silence_stream(STDERR) { super }
|
50
51
|
end
|
51
52
|
end
|
52
53
|
end # ActiveRecord::Base
|
53
54
|
|
54
|
-
# Setup
|
55
|
+
# Setup Adapter
|
56
|
+
puts "Testing with DB=#{ENV['DB'] || 'sqlite'}"
|
55
57
|
case ENV['DB']
|
56
58
|
when 'mysql'
|
57
|
-
ActiveRecord::Base.establish_connection(:adapter => 'mysql', :database => 'test', :
|
59
|
+
ActiveRecord::Base.establish_connection(:adapter => 'mysql', :database => 'test', :username => 'root')
|
58
60
|
when 'mysql2'
|
59
|
-
ActiveRecord::Base.establish_connection(:adapter => 'mysql2', :database => 'test', :
|
61
|
+
ActiveRecord::Base.establish_connection(:adapter => 'mysql2', :database => 'test', :username => 'root')
|
60
62
|
Bundler.require(:test) # require 'foreigner'
|
61
63
|
Foreigner.load
|
62
64
|
when 'pg', 'postgresql'
|
data/test/test_mini_record.rb
CHANGED
@@ -10,7 +10,7 @@ describe MiniRecord do
|
|
10
10
|
conn.tables.each { |table| silence_stream(STDERR) { conn.execute "DROP TABLE IF EXISTS #{table}" } }
|
11
11
|
end
|
12
12
|
|
13
|
-
ActiveRecord::Base.descendants.each { |klass| Object.send(:remove_const, klass.to_s) if Object.const_defined?(klass.to_s) }
|
13
|
+
ActiveRecord::Base.descendants.each { |klass| Object.send(:remove_const, klass.to_s) if Object.const_defined?(klass.name.to_s) }
|
14
14
|
ActiveSupport::DescendantsTracker.direct_descendants(ActiveRecord::Base).clear
|
15
15
|
end
|
16
16
|
|
@@ -141,7 +141,7 @@ describe MiniRecord do
|
|
141
141
|
assert_includes Foo.db_indexes, 'by_customer'
|
142
142
|
# Run auto_upgrade! again and ensure no statements issued.
|
143
143
|
Foo.auto_upgrade!
|
144
|
-
|
144
|
+
refute_match /schema\s+change/, Foo.queries
|
145
145
|
end
|
146
146
|
|
147
147
|
it 'does not add already defined composite indexes' do
|
@@ -156,7 +156,7 @@ describe MiniRecord do
|
|
156
156
|
assert_includes Foo.db_indexes, 'by_region_and_customer'
|
157
157
|
# Run auto_upgrade! again and ensure no statements issued.
|
158
158
|
Foo.auto_upgrade!
|
159
|
-
|
159
|
+
refute_match /schema\s+change/, Foo.queries
|
160
160
|
end
|
161
161
|
|
162
162
|
it 'supports indexes with symbols for names' do
|
@@ -169,7 +169,7 @@ describe MiniRecord do
|
|
169
169
|
assert_includes Foo.db_indexes, 'idx_for_some_field'
|
170
170
|
# Run auto_upgrade! again and ensure no statements issued.
|
171
171
|
Foo.auto_upgrade!
|
172
|
-
|
172
|
+
refute_match /schema\s+change/, Foo.queries
|
173
173
|
end
|
174
174
|
|
175
175
|
it 'works with STI' do
|
@@ -244,7 +244,7 @@ describe MiniRecord do
|
|
244
244
|
end
|
245
245
|
|
246
246
|
it 'allow custom query' do
|
247
|
-
skip unless conn.adapter_name =~ /mysql/i
|
247
|
+
skip "foreign key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
248
248
|
|
249
249
|
class Foo < ActiveRecord::Base
|
250
250
|
col :name, :as => "ENUM('foo','bar')"
|
@@ -253,7 +253,7 @@ describe MiniRecord do
|
|
253
253
|
assert_match /ENUM/, Foo.queries
|
254
254
|
|
255
255
|
Foo.auto_upgrade!
|
256
|
-
|
256
|
+
refute_match /schema\s+change/, Foo.queries
|
257
257
|
assert_equal %w[id name], Foo.db_columns
|
258
258
|
assert_equal %w[id name], Foo.schema_columns
|
259
259
|
|
@@ -282,6 +282,8 @@ describe MiniRecord do
|
|
282
282
|
end
|
283
283
|
|
284
284
|
it 'removes a column and index when relation is removed' do
|
285
|
+
skip "foreign key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
286
|
+
|
285
287
|
class Foo < ActiveRecord::Base
|
286
288
|
key :name
|
287
289
|
belongs_to :image, :polymorphic => true
|
@@ -304,7 +306,7 @@ describe MiniRecord do
|
|
304
306
|
refute_includes Foo.db_columns, 'image_id'
|
305
307
|
assert_empty Foo.db_indexes
|
306
308
|
end
|
307
|
-
|
309
|
+
|
308
310
|
it 'doesnt remove a column and index when relation is removed and destructive is false' do
|
309
311
|
MiniRecord.configuration.destructive = false
|
310
312
|
class Foo < ActiveRecord::Base
|
@@ -397,16 +399,17 @@ describe MiniRecord do
|
|
397
399
|
|
398
400
|
it 'should not override previous defined column relation' do
|
399
401
|
class Foo < ActiveRecord::Base
|
400
|
-
key :user, :as => :references, :null => false, :limit => 4
|
402
|
+
key :user, :as => :references, :null => false, :limit => 4, :default => 42
|
401
403
|
belongs_to :user
|
402
404
|
end
|
403
405
|
Foo.auto_upgrade!
|
404
406
|
assert_equal 4, Foo.db_fields[:user_id].limit
|
405
407
|
assert_equal false, Foo.db_fields[:user_id].null
|
408
|
+
assert_equal "42", Foo.db_fields[:user_id].default.to_s
|
406
409
|
end
|
407
410
|
|
408
411
|
it 'add/remove foreign key with :foreign option, when Foreigner gem used on mysql' do
|
409
|
-
skip unless conn.adapter_name =~ /mysql/i
|
412
|
+
skip "foreign key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
410
413
|
|
411
414
|
class Book < ActiveRecord::Base
|
412
415
|
belongs_to :publisher
|
@@ -428,10 +431,10 @@ describe MiniRecord do
|
|
428
431
|
|
429
432
|
assert_nil connection.foreign_keys(:books).detect {|fk| fk.options[:column] == 'publisher_id'}
|
430
433
|
end
|
431
|
-
|
434
|
+
|
432
435
|
it 'doesnt remove foreign key with :foreign option, when Foreigner gem used on mysql and destructive = false' do
|
433
436
|
MiniRecord.configuration.destructive = false
|
434
|
-
skip unless conn.adapter_name =~ /mysql/i
|
437
|
+
skip "foreign key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
435
438
|
|
436
439
|
class Book < ActiveRecord::Base
|
437
440
|
belongs_to :publisher
|
@@ -456,7 +459,7 @@ describe MiniRecord do
|
|
456
459
|
end
|
457
460
|
|
458
461
|
it 'add/remove named foreign key with :foreign option, when Foreigner gem used on mysql' do
|
459
|
-
skip unless conn.adapter_name =~ /mysql/i
|
462
|
+
skip "foreign key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
460
463
|
|
461
464
|
class Book < ActiveRecord::Base
|
462
465
|
belongs_to :publisher
|
@@ -479,10 +482,10 @@ describe MiniRecord do
|
|
479
482
|
assert_nil connection.foreign_keys(:books).detect {|fk| fk.options[:column] == 'publisher_id'}
|
480
483
|
Object.send(:remove_const, :Book)
|
481
484
|
end
|
482
|
-
|
485
|
+
|
483
486
|
it 'doesnt remove named foreign key with :foreign option, when Foreigner gem used on mysql and destructive = false' do
|
484
487
|
MiniRecord.configuration.destructive = false
|
485
|
-
skip unless conn.adapter_name =~ /mysql/i
|
488
|
+
skip "foreign key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
486
489
|
|
487
490
|
class Book < ActiveRecord::Base
|
488
491
|
belongs_to :publisher
|
@@ -508,7 +511,7 @@ describe MiniRecord do
|
|
508
511
|
end
|
509
512
|
|
510
513
|
it 'support :foreign option in the index with custom :foreign_key in the belong_to association' do
|
511
|
-
skip unless conn.adapter_name =~ /mysql/i
|
514
|
+
skip "foreign key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
512
515
|
|
513
516
|
class Book < ActiveRecord::Base
|
514
517
|
belongs_to :second_publisher, :foreign_key => 'second_publisher_id', :class_name => 'Publisher'
|
@@ -530,10 +533,10 @@ describe MiniRecord do
|
|
530
533
|
|
531
534
|
assert_nil connection.foreign_keys(:books).detect {|fk| fk.options[:column] == 'second_publisher_id'}
|
532
535
|
end
|
533
|
-
|
536
|
+
|
534
537
|
it 'support :foreign option in the index with custom :foreign_key in the belong_to association and wont remove if destructive = false' do
|
535
538
|
MiniRecord.configuration.destructive = false
|
536
|
-
skip unless conn.adapter_name =~ /mysql/i
|
539
|
+
skip "foreign key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
537
540
|
|
538
541
|
class Book < ActiveRecord::Base
|
539
542
|
belongs_to :second_publisher, :foreign_key => 'second_publisher_id', :class_name => 'Publisher'
|
@@ -579,6 +582,8 @@ describe MiniRecord do
|
|
579
582
|
|
580
583
|
describe 'relation #habtm' do
|
581
584
|
it 'creates a join table with indexes for has_and_belongs_to_many relations' do
|
585
|
+
skip "habtm key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
586
|
+
|
582
587
|
tables = Tool.connection.tables
|
583
588
|
assert_includes tables, 'purposes_tools'
|
584
589
|
|
@@ -592,19 +597,22 @@ describe MiniRecord do
|
|
592
597
|
end
|
593
598
|
|
594
599
|
it 'drops join table if has_and_belongs_to_many relation is deleted' do
|
600
|
+
skip "habtm key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
601
|
+
|
595
602
|
Tool.schema_tables.delete('purposes_tools')
|
596
603
|
refute_includes ActiveRecord::Base.schema_tables, 'purposes_tools'
|
597
604
|
|
598
605
|
ActiveRecord::Base.clear_tables!
|
599
606
|
refute_includes Tool.connection.tables, 'purposes_tools'
|
600
607
|
end
|
601
|
-
|
608
|
+
|
602
609
|
it 'keeps join table if has_and_belongs_to_many relation is deleted and destructive = false' do
|
603
610
|
MiniRecord.configuration.destructive = false
|
604
|
-
|
611
|
+
skip "habtm key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
612
|
+
|
605
613
|
tables = Tool.connection.tables
|
606
614
|
assert_includes tables, 'purposes_tools'
|
607
|
-
|
615
|
+
|
608
616
|
Tool.schema_tables.delete('purposes_tools')
|
609
617
|
refute_includes ActiveRecord::Base.schema_tables, 'purposes_tools'
|
610
618
|
|
@@ -613,6 +621,8 @@ describe MiniRecord do
|
|
613
621
|
end
|
614
622
|
|
615
623
|
it 'has_and_belongs_to_many with custom join_table and foreign keys' do
|
624
|
+
skip "habtm key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
625
|
+
|
616
626
|
class Foo < ActiveRecord::Base
|
617
627
|
has_and_belongs_to_many :watchers, :join_table => :watching, :foreign_key => :custom_foo_id, :association_foreign_key => :customer_id
|
618
628
|
end
|
@@ -626,6 +636,8 @@ describe MiniRecord do
|
|
626
636
|
end
|
627
637
|
|
628
638
|
it 'creates a join table with indexes with long indexes names' do
|
639
|
+
skip "habtm key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
640
|
+
|
629
641
|
class Foo < ActiveRecord::Base
|
630
642
|
has_and_belongs_to_many :people, :join_table => :long_people,
|
631
643
|
:foreign_key => :custom_long_long_long_long_id,
|
@@ -638,6 +650,8 @@ describe MiniRecord do
|
|
638
650
|
end
|
639
651
|
|
640
652
|
it 'creates a join table without an index when suppressed for has_and_belongs_to_many relations' do
|
653
|
+
skip "habtm key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
654
|
+
|
641
655
|
class Foo < ActiveRecord::Base
|
642
656
|
has_and_belongs_to_many :bars
|
643
657
|
suppress_index :bars
|
@@ -648,6 +662,8 @@ describe MiniRecord do
|
|
648
662
|
end
|
649
663
|
|
650
664
|
it 'adds unique index' do
|
665
|
+
skip "habtm key tests only for mysql" unless conn.adapter_name =~ /mysql/i
|
666
|
+
|
651
667
|
page = Page.create(:title => 'Foo')
|
652
668
|
photogallery = Photogallery.create(:title => 'Bar')
|
653
669
|
assert photogallery.valid?
|
@@ -698,19 +714,19 @@ describe MiniRecord do
|
|
698
714
|
case conn.adapter_name
|
699
715
|
when /sqlite/i
|
700
716
|
# In sqlite there is a difference between limit: 4 and limit: 11
|
701
|
-
assert_match '
|
702
|
-
assert_equal 4, Foo.db_fields[:number].limit
|
717
|
+
assert_match 'foos.number#limit', Foo.queries
|
703
718
|
assert_equal 4, Foo.schema_fields[:number].limit
|
719
|
+
assert_equal 4, Foo.db_fields[:number].limit
|
704
720
|
when /mysql/i
|
705
721
|
# In mysql according to this: http://goo.gl/bjZE7 limit: 4 is same of limit:11
|
706
|
-
|
707
|
-
assert_equal 4, Foo.db_fields[:number].limit
|
722
|
+
refute_match /schema\s+change/, Foo.queries
|
708
723
|
assert_equal 4, Foo.schema_fields[:number].limit
|
724
|
+
assert_equal 4, Foo.db_fields[:number].limit
|
709
725
|
when /postgres/i
|
710
726
|
# In postgres limit: 4 will be translated to nil
|
711
727
|
assert_match /ALTER COLUMN "number" TYPE integer$/, Foo.queries
|
712
|
-
assert_equal nil, Foo.db_fields[:number].limit
|
713
728
|
assert_equal 4, Foo.schema_fields[:number].limit
|
729
|
+
assert_equal nil, Foo.db_fields[:number].limit
|
714
730
|
end
|
715
731
|
|
716
732
|
# Change limit to string
|
@@ -719,7 +735,7 @@ describe MiniRecord do
|
|
719
735
|
refute_empty Foo.queries
|
720
736
|
assert_equal 255, Foo.db_fields[:string].limit
|
721
737
|
end
|
722
|
-
|
738
|
+
|
723
739
|
it 'should not change #limit if destructive = false' do
|
724
740
|
MiniRecord.configuration.destructive = false
|
725
741
|
class Foo < ActiveRecord::Base
|
@@ -739,12 +755,12 @@ describe MiniRecord do
|
|
739
755
|
case conn.adapter_name
|
740
756
|
when /sqlite/i
|
741
757
|
# In sqlite there is a difference between limit: 4 and limit: 11
|
742
|
-
assert_match Foo.queries, ""
|
758
|
+
assert_match Foo.queries, ""
|
743
759
|
assert_equal nil, Foo.db_fields[:number].limit
|
744
760
|
assert_equal 4, Foo.schema_fields[:number].limit
|
745
761
|
when /mysql/i
|
746
762
|
# In mysql according to this: http://goo.gl/bjZE7 limit: 4 is same of limit:11
|
747
|
-
|
763
|
+
refute_match /schema\s+change/, Foo.queries
|
748
764
|
assert_equal nil, Foo.db_fields[:number].limit
|
749
765
|
assert_equal 4, Foo.schema_fields[:number].limit
|
750
766
|
when /postgres/i
|
@@ -757,10 +773,42 @@ describe MiniRecord do
|
|
757
773
|
# Change limit to string
|
758
774
|
Foo.key :string, :limit => 255
|
759
775
|
Foo.auto_upgrade!
|
760
|
-
|
776
|
+
refute_match /schema\s+change/, Foo.queries
|
761
777
|
assert_equal 100, Foo.db_fields[:string].limit
|
762
778
|
end
|
763
779
|
|
780
|
+
it 'should handle integer defaults correctly' do
|
781
|
+
class Foo < ActiveRecord::Base
|
782
|
+
field :some_int, type: :integer, default: 33
|
783
|
+
field :some_bool, type: :boolean, default: false
|
784
|
+
field :some_bool2, type: :boolean, default: false
|
785
|
+
field :some_bool3, type: :boolean, default: true
|
786
|
+
auto_upgrade!
|
787
|
+
end
|
788
|
+
|
789
|
+
# Reopen class
|
790
|
+
class Foo < ActiveRecord::Base
|
791
|
+
field :some_int, type: :integer, default: 66
|
792
|
+
field :some_bool, type: :boolean, default: true
|
793
|
+
end
|
794
|
+
|
795
|
+
new_attr, changed = Foo.field_attr_changes(:some_int)
|
796
|
+
assert_equal 66, new_attr[:default]
|
797
|
+
assert_equal true, changed
|
798
|
+
|
799
|
+
new_attr, changed = Foo.field_attr_changes(:some_bool)
|
800
|
+
assert_equal true, changed
|
801
|
+
assert_equal true, new_attr[:default]
|
802
|
+
|
803
|
+
new_attr, changed = Foo.field_attr_changes(:some_bool2)
|
804
|
+
assert_equal false, changed
|
805
|
+
assert_empty new_attr
|
806
|
+
|
807
|
+
new_attr, changed = Foo.field_attr_changes(:some_bool3)
|
808
|
+
assert_equal false, changed
|
809
|
+
assert_empty new_attr
|
810
|
+
end
|
811
|
+
|
764
812
|
it 'should change #null' do
|
765
813
|
class Foo < ActiveRecord::Base
|
766
814
|
key :string
|
@@ -781,10 +829,10 @@ describe MiniRecord do
|
|
781
829
|
|
782
830
|
Foo.key :string, :null => false
|
783
831
|
Foo.auto_upgrade!
|
784
|
-
assert_match /
|
832
|
+
assert_match /foos.string#null/i, Foo.queries
|
785
833
|
refute Foo.db_fields[:string].null
|
786
834
|
end
|
787
|
-
|
835
|
+
|
788
836
|
it 'should not change #null if destructive = false' do
|
789
837
|
MiniRecord.configuration.destructive = false
|
790
838
|
class Foo < ActiveRecord::Base
|
@@ -817,19 +865,18 @@ describe MiniRecord do
|
|
817
865
|
Foo.auto_upgrade!
|
818
866
|
assert_equal 8, Foo.db_fields[:currency].precision
|
819
867
|
assert_equal 2, Foo.db_fields[:currency].scale
|
820
|
-
assert_equal 8, Foo.db_fields[:currency].limit
|
821
868
|
|
822
869
|
Foo.auto_upgrade!
|
823
|
-
|
870
|
+
new_attr, changed = Foo.field_attr_changes(:currency)
|
871
|
+
assert_equal false, changed
|
824
872
|
|
825
873
|
Foo.field :currency, :as => :decimal, :precision => 4, :scale => 2, :limit => 5
|
826
874
|
Foo.auto_upgrade!
|
827
|
-
assert_match /
|
875
|
+
assert_match /foos.currency#limit/i, Foo.queries
|
828
876
|
assert_equal 4, Foo.db_fields[:currency].precision
|
829
877
|
assert_equal 2, Foo.db_fields[:currency].scale
|
830
|
-
assert_equal 4, Foo.db_fields[:currency].limit
|
831
878
|
end
|
832
|
-
|
879
|
+
|
833
880
|
it 'should not change #scale #precision if destructive = false' do
|
834
881
|
MiniRecord.configuration.destructive = false
|
835
882
|
class Foo < ActiveRecord::Base
|
@@ -838,7 +885,6 @@ describe MiniRecord do
|
|
838
885
|
Foo.auto_upgrade!
|
839
886
|
assert_equal 8, Foo.db_fields[:currency].precision
|
840
887
|
assert_equal 2, Foo.db_fields[:currency].scale
|
841
|
-
assert_equal 8, Foo.db_fields[:currency].limit
|
842
888
|
|
843
889
|
Foo.auto_upgrade!
|
844
890
|
refute_match /alter/i, Foo.queries
|
@@ -848,7 +894,6 @@ describe MiniRecord do
|
|
848
894
|
assert_match "", Foo.queries
|
849
895
|
assert_equal 8, Foo.db_fields[:currency].precision
|
850
896
|
assert_equal 2, Foo.db_fields[:currency].scale
|
851
|
-
assert_equal 8, Foo.db_fields[:currency].limit
|
852
897
|
end
|
853
898
|
|
854
899
|
it 'should ignore abstract classes' do
|
@@ -897,7 +942,7 @@ describe MiniRecord do
|
|
897
942
|
end
|
898
943
|
Foo.auto_upgrade!
|
899
944
|
assert_match /CREATE TABLE/, Foo.queries
|
900
|
-
|
945
|
+
|
901
946
|
Foo.create :currency => 'USD'
|
902
947
|
|
903
948
|
Foo.rename_field :currency, :new_name => :currency_iso
|
@@ -905,14 +950,7 @@ describe MiniRecord do
|
|
905
950
|
|
906
951
|
Foo.auto_upgrade!
|
907
952
|
|
908
|
-
|
909
|
-
when /sqlite/i
|
910
|
-
assert_match /CREATE TEMPORARY TABLE "altered_foos"/i, Foo.queries
|
911
|
-
when /mysql/i
|
912
|
-
assert_match /ALTER TABLE `foos` CHANGE `currency` `currency_iso`/i, Foo.queries
|
913
|
-
when /postgres/i
|
914
|
-
assert_match /ALTER TABLE "foos" RENAME COLUMN "currency" TO "currency_iso"/, Foo.queries
|
915
|
-
end
|
953
|
+
assert_match /foos.currency to currency_iso/i, Foo.queries
|
916
954
|
|
917
955
|
foo = Foo.first
|
918
956
|
assert_equal 'USD', foo.currency_iso
|
@@ -921,7 +959,7 @@ describe MiniRecord do
|
|
921
959
|
assert_match '', Foo.queries
|
922
960
|
|
923
961
|
end
|
924
|
-
|
962
|
+
|
925
963
|
it 'should note rename a column specified by rename_field if destructive = false' do
|
926
964
|
MiniRecord.configuration.destructive = false
|
927
965
|
class Foo < ActiveRecord::Base
|
@@ -929,7 +967,7 @@ describe MiniRecord do
|
|
929
967
|
end
|
930
968
|
Foo.auto_upgrade!
|
931
969
|
assert_match /CREATE TABLE/, Foo.queries
|
932
|
-
|
970
|
+
|
933
971
|
Foo.create :currency => 'USD'
|
934
972
|
|
935
973
|
Foo.rename_field :currency, :new_name => :currency_iso
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Davide D'Agostino
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -74,3 +74,4 @@ test_files:
|
|
74
74
|
- test/helper.rb
|
75
75
|
- test/models.rb
|
76
76
|
- test/test_mini_record.rb
|
77
|
+
has_rdoc:
|