foreigner 1.7.0 → 1.7.4

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: 7afaa93e891d1a95c671e0703a70c4fbae46eb84
4
- data.tar.gz: 8eb8278d682088f6b57aef3962abb224bc4b8727
3
+ metadata.gz: dd7dbe28f6138244683eb3608d4bac19560dda16
4
+ data.tar.gz: 584f38f853a0f97d15600e48f7f8b01b4bee182d
5
5
  SHA512:
6
- metadata.gz: 254c861fe2c7299e1157dc186f25e0649a4724095e6eebde0dcf94b223169f08e4ea3730d97cdca6d67308640138c3f2e92bf07b84d87c67b8a30490236e2133
7
- data.tar.gz: a6f39ca36faf91a20d61b76326c47b360891b98adbc3685c02be6d3f52ec070bc74006f84d3d261b0f472462de44e1dd465b2dd7ecea7780ecb6cdfd91fcf60b
6
+ metadata.gz: 4a61ab89633713aa621dc783ec6a9fa87764e307b2a579f342410a2cadd53013b7dbec3f9034298166cb3d035f866eb58959d312687eb57c1d891f624f306613
7
+ data.tar.gz: df79723061e8ffe3bc5e11f69728874740ccef05f87c55d6e6fbd870851d569c16b035c9a6287d02da6b08d8ebf647ec01c8e2f21cd1fe7932b4ec4afdfa7d78
@@ -26,13 +26,13 @@ module Foreigner
26
26
  fk_info.map do |row|
27
27
  options = {column: row['column'], name: row['name'], primary_key: row['primary_key']}
28
28
 
29
- if create_table_info =~ /CONSTRAINT #{quote_column_name(row['name'])} FOREIGN KEY .* REFERENCES .*\)( ON DELETE (CASCADE|SET NULL|RESTRICT))? ?(.*)$/
30
- options[:dependent] = case $2
29
+ if create_table_info =~ /CONSTRAINT #{quote_column_name(row['name'])} FOREIGN KEY .* REFERENCES .*\)(?: ON DELETE (CASCADE|SET NULL|RESTRICT))?(?: (.+?))?,?$/
30
+ options[:dependent] = case $1
31
31
  when 'CASCADE' then :delete
32
32
  when 'SET NULL' then :nullify
33
33
  when 'RESTRICT' then :restrict
34
34
  end
35
- options[:options] = $3 # e.g. ON UPDATE ...
35
+ options[:options] = $2 # e.g. ON UPDATE ...
36
36
  end
37
37
  ForeignKeyDefinition.new(table_name, row['to_table'], options)
38
38
  end
@@ -0,0 +1,13 @@
1
+ module Foreigner
2
+ module Helper
3
+ def self.active_record_version
4
+ if ::ActiveRecord.respond_to? :version
5
+ ActiveRecord.version
6
+ elsif ::ActiveRecord::VERSION::STRING
7
+ Gem::Version.new(::ActiveRecord::VERSION::STRING)
8
+ else
9
+ raise "Unknown ActiveRecord Version API"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -40,8 +40,17 @@ module Foreigner
40
40
  module_function :remove_prefix_and_suffix
41
41
  end
42
42
 
43
+ def requires_foreigner_load?
44
+ major, minor, patch = Foreigner::Helper.active_record_version.segments
45
+ major == 4 && minor == 1 && patch >= 9
46
+ end
47
+
43
48
  def tables_with_foreign_keys(stream)
44
49
  tables_without_foreign_keys(stream)
50
+ # Ensure Foreigner to be initialized before running foreign_keys.
51
+ # This is required since schema::load is not initializing the environment
52
+ # anymore in Rails 4.1.9 (https://github.com/rails/rails/commit/5d6bb89f)
53
+ stream.puts ' Foreigner.load' if requires_foreigner_load?
45
54
  @connection.tables.sort.each do |table|
46
55
  next if ['schema_migrations', ignore_tables].flatten.any? do |ignored|
47
56
  case ignored
data/lib/foreigner.rb CHANGED
@@ -33,4 +33,5 @@ Foreigner::Adapter.register 'jdbcpostgresql', 'foreigner/connection_adapters/pos
33
33
  Foreigner::Adapter.register 'sqlite3', 'foreigner/connection_adapters/noop_adapter'
34
34
 
35
35
  require 'foreigner/loader'
36
+ require 'foreigner/helper'
36
37
  require 'foreigner/railtie' if defined?(Rails)
@@ -9,6 +9,45 @@ class Foreigner::Mysql2AdapterTest < Foreigner::UnitTest
9
9
 
10
10
  setup do
11
11
  @adapter = Mysql2Adapter.new
12
+ @adapter.instance_variable_set(:@config, database: 'foo')
13
+ end
14
+
15
+ test 'foreign_keys parsing' do
16
+ @adapter.expects(:select_all).at_least_once.returns([
17
+ {'column' => 'foo_id', 'name' => 'foo_bar_foo_id_fk', 'primary_key' => 'id', 'to_table' => 'foo'}
18
+ ])
19
+
20
+ @adapter.expects(:select_one).returns('Create Table' => "CONSTRAINT `foo_bar_foo_id_fk` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`)\n")
21
+ assert_equal Foreigner::ConnectionAdapters::ForeignKeyDefinition.new('bar', 'foo', {column:"foo_id", name:"foo_bar_foo_id_fk", primary_key:"id", dependent:nil, options:nil}),
22
+ @adapter.foreign_keys('bar').first
23
+
24
+ @adapter.expects(:select_one).returns('Create Table' => "CONSTRAINT `foo_bar_foo_id_fk` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`),\n")
25
+ assert_equal Foreigner::ConnectionAdapters::ForeignKeyDefinition.new('bar', 'foo', {column:"foo_id", name:"foo_bar_foo_id_fk", primary_key:"id", dependent:nil, options:nil}),
26
+ @adapter.foreign_keys('bar').first
27
+
28
+ @adapter.expects(:select_one).returns('Create Table' => "CONSTRAINT `foo_bar_foo_id_fk` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`) ON DELETE CASCADE\n")
29
+ assert_equal Foreigner::ConnectionAdapters::ForeignKeyDefinition.new('bar', 'foo', {column:"foo_id", name:"foo_bar_foo_id_fk", primary_key:"id", dependent: :delete, options:nil}),
30
+ @adapter.foreign_keys('bar').first
31
+
32
+ @adapter.expects(:select_one).returns('Create Table' => "CONSTRAINT `foo_bar_foo_id_fk` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`) ON DELETE CASCADE,\n")
33
+ assert_equal Foreigner::ConnectionAdapters::ForeignKeyDefinition.new('bar', 'foo', {column:"foo_id", name:"foo_bar_foo_id_fk", primary_key:"id", dependent: :delete, options:nil}),
34
+ @adapter.foreign_keys('bar').first
35
+
36
+ @adapter.expects(:select_one).returns('Create Table' => "CONSTRAINT `foo_bar_foo_id_fk` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`) FOO BAR\n")
37
+ assert_equal Foreigner::ConnectionAdapters::ForeignKeyDefinition.new('bar', 'foo', {column:"foo_id", name:"foo_bar_foo_id_fk", primary_key:"id", dependent:nil, options:'FOO BAR'}),
38
+ @adapter.foreign_keys('bar').first
39
+
40
+ @adapter.expects(:select_one).returns('Create Table' => "CONSTRAINT `foo_bar_foo_id_fk` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`) FOO BAR,\n")
41
+ assert_equal Foreigner::ConnectionAdapters::ForeignKeyDefinition.new('bar', 'foo', {column:"foo_id", name:"foo_bar_foo_id_fk", primary_key:"id", dependent:nil, options:'FOO BAR'}),
42
+ @adapter.foreign_keys('bar').first
43
+
44
+ @adapter.expects(:select_one).returns('Create Table' => "CONSTRAINT `foo_bar_foo_id_fk` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`) ON DELETE CASCADE FOO BAR,\n")
45
+ assert_equal Foreigner::ConnectionAdapters::ForeignKeyDefinition.new('bar', 'foo', {column:"foo_id", name:"foo_bar_foo_id_fk", primary_key:"id", dependent: :delete, options:'FOO BAR'}),
46
+ @adapter.foreign_keys('bar').first
47
+
48
+ @adapter.expects(:select_one).returns('Create Table' => "CONSTRAINT `foo_bar_foo_id_fk` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`id`) ON DELETE CASCADE FOO BAR,\n")
49
+ assert_equal Foreigner::ConnectionAdapters::ForeignKeyDefinition.new('bar', 'foo', {column:"foo_id", name:"foo_bar_foo_id_fk", primary_key:"id", dependent: :delete, options:'FOO BAR'}),
50
+ @adapter.foreign_keys('bar').first
12
51
  end
13
52
 
14
53
  test 'remove_foreign_key_sql by table' do
@@ -31,4 +70,4 @@ class Foreigner::Mysql2AdapterTest < Foreigner::UnitTest
31
70
  @adapter.remove_foreign_key_sql(:suppliers, column: "ship_to_id")
32
71
  )
33
72
  end
34
- end
73
+ end
@@ -11,7 +11,7 @@ class Foreigner::SchemaDumperTest < Foreigner::UnitTest
11
11
  class MockSchemaDumper
12
12
  cattr_accessor :ignore_tables
13
13
 
14
- attr_accessor :processed_tables
14
+ attr_accessor :processed_tables, :stream
15
15
  def initialize
16
16
  @connection = MockConnection.new
17
17
  @processed_tables = []
@@ -21,6 +21,7 @@ class Foreigner::SchemaDumperTest < Foreigner::UnitTest
21
21
  end
22
22
 
23
23
  def foreign_keys(table, stream)
24
+ self.stream = stream
24
25
  processed_tables << table
25
26
  end
26
27
 
@@ -49,6 +50,15 @@ class Foreigner::SchemaDumperTest < Foreigner::UnitTest
49
50
  assert_equal ['bar'].to_set, dumper.processed_tables.to_set
50
51
  end
51
52
 
53
+ test '4.1.9 loading error' do
54
+ Foreigner::Helper.stubs(:active_record_version).returns Gem::Version.new("4.1.9")
55
+ MockSchemaDumper.ignore_tables = []
56
+ dumper = MockSchemaDumper.new
57
+ dumper.tables(StringIO.new)
58
+
59
+ assert_match(/Foreigner\.load/, dumper.stream.string)
60
+ end
61
+
52
62
  test 'removes table name suffix and prefix' do
53
63
  begin
54
64
  ActiveRecord::Base.table_name_prefix = 'pre_'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreigner
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Higgins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-29 00:00:00.000000000 Z
11
+ date: 2015-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -73,6 +73,7 @@ files:
73
73
  - lib/foreigner/connection_adapters/noop_adapter.rb
74
74
  - lib/foreigner/connection_adapters/postgresql_adapter.rb
75
75
  - lib/foreigner/connection_adapters/sql2003.rb
76
+ - lib/foreigner/helper.rb
76
77
  - lib/foreigner/loader.rb
77
78
  - lib/foreigner/migration/command_recorder.rb
78
79
  - lib/foreigner/railtie.rb
@@ -107,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
108
  version: 1.3.5
108
109
  requirements: []
109
110
  rubyforge_project: foreigner
110
- rubygems_version: 2.2.2
111
+ rubygems_version: 2.4.5
111
112
  signing_key:
112
113
  specification_version: 4
113
114
  summary: Foreign Keys for Rails