immigrant 0.1.4 → 0.1.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.
data/README.rdoc CHANGED
@@ -38,4 +38,4 @@ migration.
38
38
 
39
39
  == License
40
40
 
41
- Copyright (c) 2012 Jon Jensen, released under the MIT license
41
+ Copyright (c) 2013 Jon Jensen, released under the MIT license
data/lib/immigrant.rb CHANGED
@@ -40,7 +40,7 @@ module Immigrant
40
40
 
41
41
  def model_classes
42
42
  classes = []
43
- ActiveRecord::Base.send(:subclasses).each do |model|
43
+ ActiveRecord::Base.descendants.each do |model|
44
44
  classes << model.name.constantize
45
45
  end
46
46
  classes
@@ -101,18 +101,19 @@ module Immigrant
101
101
  reflection.klass.table_name, klass.table_name,
102
102
  :column => reflection.send(fk_method).to_s,
103
103
  :primary_key => klass.primary_key.to_s,
104
- :dependent => [:delete, :delete_all].include?(reflection.options[:dependent]) && reflection.options[:conditions].nil? ? :delete : nil
104
+ :dependent => [:delete, :delete_all].include?(reflection.options[:dependent]) && !qualified_reflection?(reflection, klass) ? :delete : nil
105
105
  )
106
106
  when :has_and_belongs_to_many
107
+ join_table = (reflection.respond_to?(:join_table) ? reflection.join_table : reflection.options[:join_table]).to_s
107
108
  [
108
109
  Foreigner::ConnectionAdapters::ForeignKeyDefinition.new(
109
- reflection.options[:join_table].to_s, klass.table_name,
110
+ join_table, klass.table_name,
110
111
  :column => reflection.send(fk_method).to_s,
111
112
  :primary_key => klass.primary_key.to_s,
112
113
  :dependent => nil
113
114
  ),
114
115
  Foreigner::ConnectionAdapters::ForeignKeyDefinition.new(
115
- reflection.options[:join_table].to_s, reflection.klass.table_name,
116
+ join_table, reflection.klass.table_name,
116
117
  :column => reflection.association_foreign_key.to_s,
117
118
  :primary_key => reflection.klass.primary_key.to_s,
118
119
  :dependent => nil
@@ -125,6 +126,25 @@ module Immigrant
125
126
  }.flatten
126
127
  end
127
128
 
129
+ def qualified_reflection?(reflection, klass)
130
+ if ActiveRecord::VERSION::STRING < '4.'
131
+ reflection.options[:conditions].present?
132
+ else
133
+ scope = reflection.scope
134
+ if scope.nil?
135
+ false
136
+ elsif scope.respond_to?(:options)
137
+ scope.options[:where].present?
138
+ else
139
+ klass.instance_exec(*([nil]*scope.arity), &scope).where_values.present?
140
+ end
141
+ end
142
+ rescue
143
+ # if there's an error evaluating the scope block or whatever, just
144
+ # err on the side of caution and assume there are conditions
145
+ true
146
+ end
147
+
128
148
  end
129
149
  end
130
150
 
data/test/helper.rb CHANGED
@@ -8,6 +8,7 @@ require 'active_record'
8
8
  require 'foreigner'
9
9
  class Foreigner::Adapter
10
10
  def self.configured_name; "dummy_adapter"; end
11
+ def self.load!; end
11
12
  end
12
13
  Foreigner.load
13
14
 
@@ -13,14 +13,31 @@ class ImmigrantTest < ActiveSupport::TestCase
13
13
  @connection ||= MockConnection.new
14
14
  end
15
15
  end
16
+
17
+ if ActiveRecord::VERSION::STRING >= '4.'
18
+ # support old 3.x syntax for the sake of concise tests
19
+ [:belongs_to, :has_one, :has_many, :has_and_belongs_to_many].each do |method|
20
+ instance_eval <<-CODE
21
+ def self.#{method}(assoc, options = {})
22
+ args = [assoc]
23
+ scope = options.extract!(:conditions, :order)
24
+ if scope
25
+ args.push lambda{ where(scope[:conditions]).order(scope[:order]) }
26
+ end
27
+ args.push options
28
+ super *args
29
+ end
30
+ CODE
31
+ end
32
+ end
16
33
  end
17
-
34
+
18
35
  class MockConnection
19
36
  def supports_primary_key? # AR <3.2
20
37
  true
21
38
  end
22
39
  def primary_key(table)
23
- table !~ /s_.*s\z/ ? 'id' : nil
40
+ table.to_s !~ /s_.*s\z/ ? 'id' : nil
24
41
  end
25
42
  end
26
43
 
@@ -32,16 +49,15 @@ class ImmigrantTest < ActiveSupport::TestCase
32
49
  subclasses.replace([])
33
50
  end
34
51
 
35
-
36
52
  # basic scenarios
37
-
53
+
38
54
  test 'belongs_to should generate a foreign key' do
39
55
  class Author < MockModel; end
40
56
  class Book < MockModel
41
57
  belongs_to :guy, :class_name => 'Author', :foreign_key => 'author_id'
42
58
  end
43
59
 
44
- keys = Immigrant.infer_keys([], [Author, Book]).first
60
+ keys = Immigrant.infer_keys([]).first
45
61
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
46
62
  assert_equal(
47
63
  [foreign_key_definition(
@@ -58,7 +74,7 @@ class ImmigrantTest < ActiveSupport::TestCase
58
74
  end
59
75
  class Book < MockModel; end
60
76
 
61
- keys = Immigrant.infer_keys([], [Author, Book]).first
77
+ keys = Immigrant.infer_keys([]).first
62
78
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
63
79
  assert_equal(
64
80
  [foreign_key_definition(
@@ -75,7 +91,7 @@ class ImmigrantTest < ActiveSupport::TestCase
75
91
  end
76
92
  class Book < MockModel; end
77
93
 
78
- keys = Immigrant.infer_keys([], [Author, Book]).first
94
+ keys = Immigrant.infer_keys([]).first
79
95
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
80
96
  assert_equal(
81
97
  [foreign_key_definition(
@@ -92,7 +108,7 @@ class ImmigrantTest < ActiveSupport::TestCase
92
108
  end
93
109
  class Book < MockModel; end
94
110
 
95
- keys = Immigrant.infer_keys([], [Author, Book]).first
111
+ keys = Immigrant.infer_keys([]).first
96
112
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
97
113
  assert_equal(
98
114
  [foreign_key_definition(
@@ -109,7 +125,7 @@ class ImmigrantTest < ActiveSupport::TestCase
109
125
  end
110
126
  class Book < MockModel; end
111
127
 
112
- keys = Immigrant.infer_keys([], [Author, Book]).first
128
+ keys = Immigrant.infer_keys([]).first
113
129
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
114
130
  assert_equal(
115
131
  [foreign_key_definition(
@@ -126,7 +142,7 @@ class ImmigrantTest < ActiveSupport::TestCase
126
142
  end
127
143
  class Fan < MockModel; end
128
144
 
129
- keys = Immigrant.infer_keys([], [Author, Fan]).first
145
+ keys = Immigrant.infer_keys([]).first
130
146
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
131
147
  assert_equal(
132
148
  [foreign_key_definition(
@@ -143,19 +159,19 @@ class ImmigrantTest < ActiveSupport::TestCase
143
159
 
144
160
  test 'has_and_belongs_to_many should respect the join_table' do
145
161
  class Author < MockModel
146
- has_and_belongs_to_many :fans, :join_table => :lol_wuts
162
+ has_and_belongs_to_many :fans, :join_table => :lols_wuts
147
163
  end
148
164
  class Fan < MockModel; end
149
165
 
150
- keys = Immigrant.infer_keys([], [Author, Fan]).first
166
+ keys = Immigrant.infer_keys([]).first
151
167
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
152
168
  assert_equal(
153
169
  [foreign_key_definition(
154
- 'lol_wuts', 'authors',
170
+ 'lols_wuts', 'authors',
155
171
  :column => 'author_id', :primary_key => 'id', :dependent => nil
156
172
  ),
157
173
  foreign_key_definition(
158
- 'lol_wuts', 'fans',
174
+ 'lols_wuts', 'fans',
159
175
  :column => 'fan_id', :primary_key => 'id', :dependent => nil
160
176
  )],
161
177
  keys
@@ -171,7 +187,7 @@ class ImmigrantTest < ActiveSupport::TestCase
171
187
  class Book < MockModel; end
172
188
  class Article < MockModel; end
173
189
 
174
- keys = Immigrant.infer_keys([], [Article, Author, Book]).first
190
+ keys = Immigrant.infer_keys([]).first
175
191
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
176
192
  assert_equal(
177
193
  [foreign_key_definition(
@@ -188,7 +204,7 @@ class ImmigrantTest < ActiveSupport::TestCase
188
204
 
189
205
 
190
206
  # (no) duplication
191
-
207
+
192
208
  test 'STI should not generate duplicate foreign keys' do
193
209
  class Company < MockModel; end
194
210
  class Employee < MockModel
@@ -197,7 +213,7 @@ class ImmigrantTest < ActiveSupport::TestCase
197
213
  class Manager < Employee; end
198
214
 
199
215
  assert(Manager.reflections.present?)
200
- keys = Immigrant.infer_keys([], [Company, Employee, Manager]).first
216
+ keys = Immigrant.infer_keys([]).first
201
217
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
202
218
  assert_equal(
203
219
  [foreign_key_definition(
@@ -216,7 +232,7 @@ class ImmigrantTest < ActiveSupport::TestCase
216
232
  belongs_to :author
217
233
  end
218
234
 
219
- keys = Immigrant.infer_keys([], [Author, Book]).first
235
+ keys = Immigrant.infer_keys([]).first
220
236
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
221
237
  assert_equal(
222
238
  [foreign_key_definition(
@@ -235,7 +251,7 @@ class ImmigrantTest < ActiveSupport::TestCase
235
251
  end
236
252
  class Book < MockModel; end
237
253
 
238
- keys = Immigrant.infer_keys([], [Author, Book]).first
254
+ keys = Immigrant.infer_keys([]).first
239
255
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
240
256
  assert_equal(
241
257
  [foreign_key_definition(
@@ -270,23 +286,25 @@ class ImmigrantTest < ActiveSupport::TestCase
270
286
  class Book < MockModel; end
271
287
  class Article < MockModel; end
272
288
 
273
- keys = Immigrant.infer_keys(database_keys, [Article, Author, Book]).first
289
+ keys = Immigrant.infer_keys(database_keys).first
274
290
  assert_equal([], keys)
275
291
  end
276
292
 
277
- test 'finder_sql associations should not generate foreign keys' do
278
- class Author < MockModel
279
- has_many :books, :finder_sql => <<-SQL
280
- SELECT *
281
- FROM books
282
- WHERE author_id = \#{id}
283
- ORDER BY RANDOM() LIMIT 5'
284
- SQL
285
- end
286
- class Book < MockModel; end
293
+ if ActiveRecord::VERSION::STRING < '4.'
294
+ test 'finder_sql associations should not generate foreign keys' do
295
+ class Author < MockModel
296
+ has_many :books, :finder_sql => <<-SQL
297
+ SELECT *
298
+ FROM books
299
+ WHERE author_id = \#{id}
300
+ ORDER BY RANDOM() LIMIT 5'
301
+ SQL
302
+ end
303
+ class Book < MockModel; end
287
304
 
288
- keys = Immigrant.infer_keys([], [Author, Book]).first
289
- assert_equal([], keys)
305
+ keys = Immigrant.infer_keys([]).first
306
+ assert_equal([], keys)
307
+ end
290
308
  end
291
309
 
292
310
  test 'polymorphic associations should not generate foreign keys' do
@@ -300,7 +318,7 @@ class ImmigrantTest < ActiveSupport::TestCase
300
318
  has_many :properties, :as => :owner
301
319
  end
302
320
 
303
- keys = Immigrant.infer_keys([], [Corporation, Person, Property]).first
321
+ keys = Immigrant.infer_keys([]).first
304
322
  assert_equal([], keys)
305
323
  end
306
324
 
@@ -318,7 +336,7 @@ class ImmigrantTest < ActiveSupport::TestCase
318
336
  has_many :authors, :through => :authors_fans
319
337
  end
320
338
 
321
- keys = Immigrant.infer_keys([], [Author, AuthorsFan, Fan]).first
339
+ keys = Immigrant.infer_keys([]).first
322
340
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
323
341
  assert_equal(
324
342
  [foreign_key_definition(
@@ -340,7 +358,7 @@ class ImmigrantTest < ActiveSupport::TestCase
340
358
  belongs_to :invalid
341
359
  end
342
360
 
343
- keys = Immigrant.infer_keys([], [Author, Book]).first
361
+ keys = Immigrant.infer_keys([]).first
344
362
  assert_nothing_raised { keys.map { |key| key.to_ruby(:add) } }
345
363
  assert_equal(
346
364
  [foreign_key_definition(
metadata CHANGED
@@ -1,63 +1,56 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: immigrant
3
- version: !ruby/object:Gem::Version
4
- hash: 19
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.5
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 4
10
- version: 0.1.4
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Jon Jensen
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-12-13 00:00:00 -07:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2013-08-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: activerecord
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 7
30
- segments:
31
- - 3
32
- - 0
33
- version: "3.0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '3.0'
34
22
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: foreigner
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: foreigner
32
+ requirement: !ruby/object:Gem::Requirement
40
33
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 29
45
- segments:
46
- - 1
47
- - 2
48
- - 1
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
49
37
  version: 1.2.1
50
38
  type: :runtime
51
- version_requirements: *id002
52
- description: Adds a generator for creating a foreign key migration based on your current model associations
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.2.1
46
+ description: Adds a generator for creating a foreign key migration based on your current
47
+ model associations
53
48
  email: jenseng@gmail.com
54
49
  executables: []
55
-
56
50
  extensions: []
57
-
58
- extra_rdoc_files:
51
+ extra_rdoc_files:
59
52
  - README.rdoc
60
- files:
53
+ files:
61
54
  - LICENSE.txt
62
55
  - Rakefile
63
56
  - README.rdoc
@@ -71,43 +64,29 @@ files:
71
64
  - lib/immigrant.rb
72
65
  - test/helper.rb
73
66
  - test/immigrant_test.rb
74
- has_rdoc: true
75
67
  homepage: http://github.com/jenseng/immigrant
76
68
  licenses: []
77
-
78
69
  post_install_message:
79
70
  rdoc_options: []
80
-
81
- require_paths:
71
+ require_paths:
82
72
  - lib
83
- required_ruby_version: !ruby/object:Gem::Requirement
73
+ required_ruby_version: !ruby/object:Gem::Requirement
84
74
  none: false
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- hash: 57
89
- segments:
90
- - 1
91
- - 8
92
- - 7
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
93
78
  version: 1.8.7
94
- required_rubygems_version: !ruby/object:Gem::Requirement
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
80
  none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- hash: 17
100
- segments:
101
- - 1
102
- - 3
103
- - 5
81
+ requirements:
82
+ - - ! '>='
83
+ - !ruby/object:Gem::Version
104
84
  version: 1.3.5
105
85
  requirements: []
106
-
107
86
  rubyforge_project:
108
- rubygems_version: 1.6.2
87
+ rubygems_version: 1.8.25
109
88
  signing_key:
110
89
  specification_version: 3
111
90
  summary: Migration generator for Foreigner
112
91
  test_files: []
113
-
92
+ has_rdoc: