mini_record 0.3.6 → 0.3.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ea0ce6ed20bb680e42d5f368b217d35da8cc604f
4
- data.tar.gz: 8e8c428ebb7757f08d9cbe6a58eb26e298305668
3
+ metadata.gz: cf09f8afab0f2be41f0bd3e61a906d843430c58c
4
+ data.tar.gz: 6c7fbc8621bb0aef9f379854363ce4f4ca4e999f
5
5
  SHA512:
6
- metadata.gz: 3c1802bb520244e113e46d475c87af7424f1e295238a8cc931afc2357a5dc9a46c2903f44885fb2000b1538a3f4904a60c87d09d178faf34de2c959d88bdca74
7
- data.tar.gz: cd615e68bd67c671e49ba836a36a619a4cdd70d7c5c2fbbfbe532f62ec7fce382d9a24167fde115b791ceabd4970557548b06cb0ae8b82729188d11d6ffdaca9
6
+ metadata.gz: 5e1d29807ccff1ae65c3daf5dd8a3b5db185ff86bc7fef33196a084ea847bd516d6a76d5b03ee473d3de61500ff7191eb2ece88885051b005228e1fdf72aad5d
7
+ data.tar.gz: e9a376ad2b04e69f8ad98c9d38d0a713d8009380b86fce1baf47ec10f0a666fb130b22099b314f1b81bb66684f13433d49a1b1592480dd682251caa567852192
@@ -5,23 +5,38 @@ module MiniRecord
5
5
  end
6
6
 
7
7
  module ClassMethods
8
+ def init_table_definition(connection)
9
+ #connection.create_table(table_name) unless connection.table_exists?(table_name)
10
+
11
+ case ActiveRecord::ConnectionAdapters::TableDefinition.instance_method(:initialize).arity
12
+ when 1
13
+ # Rails 3.2 and earlier
14
+ ActiveRecord::ConnectionAdapters::TableDefinition.new(connection)
15
+ when 4
16
+ # Rails 4
17
+ ActiveRecord::ConnectionAdapters::TableDefinition.new(connection.native_database_types, table_name, false, {})
18
+ else
19
+ raise ArgumentError,
20
+ "Unsupported number of args for ActiveRecord::ConnectionAdapters::TableDefinition.new()"
21
+ end
22
+ end
8
23
 
9
24
  def schema_tables
10
25
  @@_schema_tables ||= []
11
26
  end
12
27
 
13
28
  def table_definition
14
- return superclass.table_definition unless superclass == ActiveRecord::Base
29
+ return superclass.table_definition unless (superclass == ActiveRecord::Base) || (superclass.respond_to?(:abstract_class?) && superclass.abstract_class?)
15
30
 
16
31
  @_table_definition ||= begin
17
- tb = ActiveRecord::ConnectionAdapters::TableDefinition.new(connection)
18
- tb.primary_key(primary_key)
19
- tb
20
- end
32
+ tb = init_table_definition(connection)
33
+ tb.primary_key(primary_key)
34
+ tb
35
+ end
21
36
  end
22
37
 
23
38
  def indexes
24
- return superclass.indexes unless superclass == ActiveRecord::Base
39
+ return superclass.indexes unless (superclass == ActiveRecord::Base) || (superclass.respond_to?(:abstract_class?) && superclass.abstract_class?)
25
40
 
26
41
  @_indexes ||= {}
27
42
  end
@@ -33,6 +48,16 @@ module MiniRecord
33
48
  end
34
49
  end
35
50
 
51
+ def get_sql_field_type(field)
52
+ if field.respond_to?(:sql_type)
53
+ # Rails 3.2 and earlier
54
+ field.sql_type.to_s.downcase
55
+ else
56
+ # Rails 4
57
+ connection.type_to_sql(field.type.to_sym, field.limit, field.precision, field.scale)
58
+ end
59
+ end
60
+
36
61
  def fields
37
62
  table_definition.columns.inject({}) do |hash, column|
38
63
  hash[column.name] = column
@@ -155,6 +180,7 @@ module MiniRecord
155
180
 
156
181
  def auto_upgrade!
157
182
  return unless connection?
183
+ return if respond_to?(:abstract_class?) && abstract_class?
158
184
 
159
185
  if self == ActiveRecord::Base
160
186
  descendants.each(&:auto_upgrade!)
@@ -166,7 +192,7 @@ module MiniRecord
166
192
  class << connection; attr_accessor :table_definition; end unless connection.respond_to?(:table_definition=)
167
193
  connection.table_definition = table_definition
168
194
  connection.create_table(table_name)
169
- connection.table_definition = ActiveRecord::ConnectionAdapters::TableDefinition.new(connection)
195
+ connection.table_definition = init_table_definition(connection)
170
196
  end
171
197
 
172
198
  # Add this to our schema tables
@@ -238,9 +264,12 @@ module MiniRecord
238
264
  new_attr = {}
239
265
 
240
266
  # First, check if the field type changed
241
- if fields[field].sql_type.to_s.downcase != fields_in_db[field].sql_type.to_s.downcase
242
- logger.debug "[MiniRecord] Detected schema change for #{table_name}.#{field}#type from " +
243
- "#{fields[field].sql_type.to_s.downcase.inspect} in #{fields_in_db[field].sql_type.to_s.downcase.inspect}" if logger
267
+ old_sql_type = get_sql_field_type(fields_in_db[field])
268
+ new_sql_type = get_sql_field_type(fields[field])
269
+
270
+ if old_sql_type != new_sql_type
271
+ logger.debug "[MiniRecord] Detected schema change for #{table_name}.#{field}#type " +
272
+ " from #{old_sql_type.inspect} to #{new_sql_type.inspect}" if logger
244
273
  changed = true
245
274
  end
246
275
 
@@ -254,12 +283,14 @@ module MiniRecord
254
283
 
255
284
  # Next, iterate through our extended attributes, looking for any differences
256
285
  # This catches stuff like :null, :precision, etc
286
+ # Ignore junk attributes that different versions of Rails include
257
287
  fields[field].each_pair do |att,value|
258
- next if att == :type or att == :base or att == :name # special cases
288
+ next unless [:name, :limit, :precision, :scale, :default, :null].include?(att)
259
289
  value = true if att == :null && value.nil?
260
- if value != fields_in_db[field].send(att)
261
- logger.debug "[MiniRecord] Detected schema change for #{table_name}.#{field}##{att} "+
262
- "from #{fields_in_db[field].send(att).inspect} in #{value.inspect}" if logger
290
+ old_value = fields_in_db[field].send(att)
291
+ if value != old_value
292
+ logger.debug "[MiniRecord] Detected schema change for #{table_name}.#{field}##{att} " +
293
+ "from #{old_value.inspect} to #{value.inspect}" if logger
263
294
  new_attr[att] = value
264
295
  changed = true
265
296
  end
@@ -1,3 +1,3 @@
1
1
  module MiniRecord
2
- VERSION = "0.3.6"
2
+ VERSION = "0.3.7"
3
3
  end
@@ -578,4 +578,44 @@ describe MiniRecord do
578
578
  assert_equal 2, Foo.db_fields[:currency].scale
579
579
  assert_equal 4, Foo.db_fields[:currency].limit
580
580
  end
581
+
582
+ it 'should ignore abstract classes' do
583
+ class Foo < ActiveRecord::Base
584
+ self.abstract_class = true
585
+ end
586
+
587
+ class Bar < Foo
588
+ end
589
+
590
+ Foo.auto_upgrade!
591
+ Bar.auto_upgrade!
592
+
593
+ tables = Foo.connection.tables
594
+
595
+ refute_includes tables, 'foos'
596
+ refute_includes tables, ''
597
+ assert_includes tables, 'bars'
598
+ end
599
+
600
+ it 'should prevent abstract table class to leak columns to other tables' do
601
+
602
+ class Base < ActiveRecord::Base
603
+ self.abstract_class = true
604
+ end
605
+
606
+ class User < Base
607
+ col :name
608
+ end
609
+
610
+ class Book < Base
611
+ col :title
612
+ col :author
613
+ end
614
+
615
+ User.auto_upgrade!
616
+ Book.auto_upgrade!
617
+
618
+ assert_equal ['id', 'name'], User.db_columns.sort
619
+ assert_equal ['author', 'id', 'title'], Book.db_columns.sort
620
+ end
581
621
  end
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.3.6
4
+ version: 0.3.7
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: 2013-07-29 00:00:00.000000000 Z
11
+ date: 2013-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -64,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
64
  version: '0'
65
65
  requirements: []
66
66
  rubyforge_project: mini_record
67
- rubygems_version: 2.0.3
67
+ rubygems_version: 2.1.2
68
68
  signing_key:
69
69
  specification_version: 4
70
70
  summary: MiniRecord is a micro gem that allow you to write schema inside your model