mini_record 0.3.6 → 0.3.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mini_record/auto_schema.rb +45 -14
- data/lib/mini_record/version.rb +1 -1
- data/test/test_mini_record.rb +40 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf09f8afab0f2be41f0bd3e61a906d843430c58c
|
4
|
+
data.tar.gz: 6c7fbc8621bb0aef9f379854363ce4f4ca4e999f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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 =
|
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
|
-
|
242
|
-
|
243
|
-
|
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
|
288
|
+
next unless [:name, :limit, :precision, :scale, :default, :null].include?(att)
|
259
289
|
value = true if att == :null && value.nil?
|
260
|
-
|
261
|
-
|
262
|
-
|
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
|
data/lib/mini_record/version.rb
CHANGED
data/test/test_mini_record.rb
CHANGED
@@ -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.
|
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-
|
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.
|
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
|