mini_record 0.4.4 → 0.4.5
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.
- 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:
|