foreigner 0.9.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,33 +1,28 @@
1
1
  = Foreigner
2
2
 
3
- Rails does not come with methods to add foreign keys. Foreigner introduces a few
4
- methods to your migrations for adding and removing foreign key constraints.
3
+ Foreigner introduces a few methods to your migrations for adding and removing foreign key constraints. It also dumps foreign keys to schema.rb.
5
4
 
6
- Since each adapter implements the API, migrations using Foreigner will continue to
7
- work on databases that do not support foreign keys, such as sqlite3.
5
+ The following adapters are supported:
8
6
 
9
- == Installation
10
-
11
- In Rails 2, install as a gem by adding the following to config/environment.rb:
7
+ * mysql2
8
+ * postgres
9
+ * sqlite (foreign key methods are a no-op)
12
10
 
13
- config.gem 'foreigner'
11
+ == Installation
14
12
 
15
- In Rails 3, install as a gem by adding the following to your Gemfile:
13
+ Add the following to your Gemfile:
16
14
 
17
15
  gem 'foreigner'
18
16
 
19
- == API
17
+ == API Examples
20
18
 
21
- An adapter implementing the Foreigner API implements three methods.
22
- (Options are documented in connection_adapters/abstract/schema_definitions.rb):
19
+ Foreigner adds two methods to migrations.
23
20
 
24
- add_foreign_key(from_table, to_table, options)
25
- remove_foreign_key(from_table, options)
26
- foreign_keys(table_name)
21
+ * add_foreign_key(from_table, to_table, options)
22
+ * remove_foreign_key(from_table, options)
27
23
 
28
- == Example
24
+ (Options are documented in connection_adapters/abstract/schema_definitions.rb):
29
25
 
30
- The most common use of foreign keys is to reference a table that a model belongs to.
31
26
  For example, given the following model:
32
27
 
33
28
  class Comment < ActiveRecord::Base
@@ -54,9 +49,9 @@ A name can be specified for the foreign key constraint:
54
49
 
55
50
  add_foreign_key(:comments, :posts, :name => 'comment_article_foreign_key')
56
51
 
57
- == Change Table Shorthand
52
+ == Change Table Methods
58
53
 
59
- Foreigner adds extra behavior to change_table, which lets you define foreign keys using shorthand.
54
+ Foreigner adds extra methods to change_table.
60
55
 
61
56
  Add a missing foreign key to comments:
62
57
 
@@ -64,29 +59,12 @@ Add a missing foreign key to comments:
64
59
  t.foreign_key :posts, :dependent => :delete
65
60
  end
66
61
 
67
- t.foreign_key accepts the same options as add_foreign_key.
68
-
69
-
70
- == Additional t.references option
71
-
72
- Foreigner extends table.references with the :foreign_key option. Pass true, and the default
73
- foreign key options are used:
74
-
75
- change_table :comments do |t|
76
- t.references :post, :foreign_key => true
77
- end
78
-
79
- An options hash can also be passed. It accepts the same options as add_foreign_key:
80
-
62
+ Remove an unwanted foreign key:
63
+
81
64
  change_table :comments do |t|
82
- t.references :author, :foreign_key => {:dependent => :restrict}
65
+ t.remove_foreign_key :users
83
66
  end
84
67
 
85
- By default, t.references will not generate a foreign key.
86
-
87
- == schema.rb
88
-
89
- Similar to indexes, the foreign keys in your database are automatically dumped to schema.rb.
90
- This allows you to use foreign keys without switching to the :sql schema.
68
+ == License
91
69
 
92
- Copyright (c) 2009 Matthew Higgins, released under the MIT license
70
+ Copyright (c) 2011 Matthew Higgins, released under the MIT license
@@ -0,0 +1,22 @@
1
+ module Foreigner
2
+ class Adapter
3
+ class_attribute :registered
4
+ self.registered = {}
5
+
6
+ class << self
7
+ def register(adapter_name, file_name)
8
+ registered[adapter_name] = file_name
9
+ end
10
+
11
+ def load!
12
+ if registered.key?(configured_name)
13
+ require registered[configured_name]
14
+ end
15
+ end
16
+
17
+ def configured_name
18
+ ActiveRecord::Base.connection_pool.spec.config[:adapter]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -12,10 +12,10 @@ module Foreigner
12
12
  end
13
13
 
14
14
  module Table
15
- def self.included(base)
16
- base.class_eval do
17
- alias_method_chain :references, :foreign_keys
18
- end
15
+ extend ActiveSupport::Concern
16
+
17
+ included do
18
+ alias_method_chain :references, :foreign_keys
19
19
  end
20
20
 
21
21
  # Adds a new foreign key to the table. +to_table+ can be a single Symbol, or
@@ -38,37 +38,32 @@ module Foreigner
38
38
  #
39
39
  # ===== Examples
40
40
  # ====== Remove the suppliers_company_id_fk in the suppliers table.
41
- # t.remove_foreign_key :companies
41
+ # change_table :suppliers do |t|
42
+ # t.remove_foreign_key :companies
43
+ # end
42
44
  # ====== Remove the foreign key named accounts_branch_id_fk in the accounts table.
43
- # remove_foreign_key :column => :branch_id
45
+ # change_table :accounts do |t|
46
+ # t.remove_foreign_key :column => :branch_id
47
+ # end
44
48
  # ====== Remove the foreign key named party_foreign_key in the accounts table.
45
- # remove_index :name => :party_foreign_key
49
+ # change_table :accounts do |t|
50
+ # t.remove_index :name => :party_foreign_key
51
+ # end
46
52
  def remove_foreign_key(options = {})
47
53
  @base.remove_foreign_key(@table_name, options)
48
54
  end
49
55
 
50
- # Adds a :foreign_key option to Table.references.
51
- # If :foreign_key is true, a foreign key constraint is added to the table.
52
- # You can also specify a hash, which is passed as foreign key options.
53
- #
54
- # ===== Examples
55
- # ====== Add goat_id column and a foreign key to the goats table.
56
- # t.references(:goat, :foreign_key => true)
57
- # ====== Add goat_id column and a cascading foreign key to the goats table.
58
- # t.references(:goat, :foreign_key => {:dependent => :delete})
59
- #
60
- # Note: No foreign key is created if :polymorphic => true is used.
56
+ # Deprecated
61
57
  def references_with_foreign_keys(*args)
62
58
  options = args.extract_options!
63
- polymorphic = options[:polymorphic]
64
- fk_options = options.delete(:foreign_key)
65
59
 
66
- references_without_foreign_keys(*(args.dup << options))
67
-
68
- if fk_options && !polymorphic
69
- fk_options = {} if fk_options == true
70
- args.each { |to_table| foreign_key(to_table, fk_options) }
60
+ if fk_options = options.delete(:foreign_key)
61
+ p ActiveSupport::Deprecation.send(:deprecation_message, caller,
62
+ ":foreign_key in t.references is deprecated. " \
63
+ "Use t.foreign_key instead")
71
64
  end
65
+
66
+ references_without_foreign_keys(*(args.dup << options))
72
67
  end
73
68
  end
74
69
  end
@@ -1,16 +1,16 @@
1
1
  module Foreigner
2
2
  module ConnectionAdapters
3
- module MysqlAdapter
3
+ module Mysql2Adapter
4
4
  include Foreigner::ConnectionAdapters::Sql2003
5
5
 
6
- def remove_foreign_key(table, options)
6
+ def remove_foreign_key_sql(table, options)
7
7
  if Hash === options
8
8
  foreign_key_name = foreign_key_name(table, options[:column], options)
9
9
  else
10
10
  foreign_key_name = foreign_key_name(table, "#{options.to_s.singularize}_id")
11
11
  end
12
12
 
13
- execute "ALTER TABLE #{quote_table_name(table)} DROP FOREIGN KEY #{quote_column_name(foreign_key_name)}"
13
+ "DROP FOREIGN KEY #{quote_column_name(foreign_key_name)}"
14
14
  end
15
15
 
16
16
  def foreign_keys(table_name)
@@ -44,10 +44,10 @@ module Foreigner
44
44
  end
45
45
  end
46
46
 
47
- [:MysqlAdapter, :Mysql2Adapter, :JdbcAdapter].each do |adapter|
47
+ [:Mysql2Adapter, :JdbcAdapter].each do |adapter|
48
48
  begin
49
49
  ActiveRecord::ConnectionAdapters.const_get(adapter).class_eval do
50
- include Foreigner::ConnectionAdapters::MysqlAdapter
50
+ include Foreigner::ConnectionAdapters::Mysql2Adapter
51
51
  end
52
52
  rescue
53
53
  end
@@ -3,43 +3,25 @@ module Foreigner
3
3
  module PostgreSQLAdapter
4
4
  include Foreigner::ConnectionAdapters::Sql2003
5
5
 
6
- def remove_foreign_key(table, options)
7
- if Hash === options
8
- foreign_key_name = foreign_key_name(table, options[:column], options)
9
- else
10
- foreign_key_name = foreign_key_name(table, "#{options.to_s.singularize}_id")
11
- end
12
-
13
- execute "ALTER TABLE #{quote_table_name(table)} DROP CONSTRAINT #{quote_column_name(foreign_key_name)}"
14
- end
15
-
16
6
  def foreign_keys(table_name)
17
7
  fk_info = select_all %{
18
- SELECT tc.constraint_name as name
19
- ,ccu.table_name as to_table
20
- ,ccu.column_name as primary_key
21
- ,kcu.column_name as column
22
- ,rc.delete_rule as dependency
23
- FROM information_schema.table_constraints tc
24
- JOIN information_schema.key_column_usage kcu
25
- USING (constraint_catalog, constraint_schema, constraint_name)
26
- JOIN information_schema.referential_constraints rc
27
- USING (constraint_catalog, constraint_schema, constraint_name)
28
- JOIN information_schema.constraint_column_usage ccu
29
- USING (constraint_catalog, constraint_schema, constraint_name)
30
- WHERE tc.constraint_type = 'FOREIGN KEY'
31
- AND tc.constraint_catalog = '#{@config[:database]}'
32
- AND tc.table_name = '#{table_name}'
33
- AND tc.table_schema = ANY (current_schemas(false))
8
+ SELECT t2.relname AS to_table, a1.attname AS column, a2.attname AS primary_key, c.conname AS name, c.confdeltype AS dependency
9
+ FROM pg_constraint c
10
+ JOIN pg_class t1 ON c.conrelid = t1.oid
11
+ JOIN pg_class t2 ON c.confrelid = t2.oid
12
+ JOIN pg_attribute a1 ON a1.attnum = c.conkey[1] AND a1.attrelid = t1.oid
13
+ JOIN pg_attribute a2 ON a2.attnum = c.confkey[1] AND a2.attrelid = t2.oid
14
+ WHERE c.contype = 'f' AND t1.relname = '#{table_name}'
15
+ ORDER BY c.conname
34
16
  }
35
17
 
36
18
  fk_info.map do |row|
37
19
  options = {:column => row['column'], :name => row['name'], :primary_key => row['primary_key']}
38
20
 
39
21
  options[:dependent] = case row['dependency']
40
- when 'CASCADE' then :delete
41
- when 'SET NULL' then :nullify
42
- when 'RESTRICT' then :restrict
22
+ when 'c' then :delete
23
+ when 'n' then :nullify
24
+ when 'r' then :restrict
43
25
  end
44
26
 
45
27
  ForeignKeyDefinition.new(table_name, row['to_table'], options)
@@ -4,22 +4,40 @@ module Foreigner
4
4
  def supports_foreign_keys?
5
5
  true
6
6
  end
7
-
7
+
8
8
  def add_foreign_key(from_table, to_table, options = {})
9
+ sql = "ALTER TABLE #{quote_table_name(from_table)} #{add_foreign_key_sql(from_table, to_table, options)}"
10
+ execute(sql)
11
+ end
12
+
13
+ def add_foreign_key_sql(from_table, to_table, options = {})
9
14
  column = options[:column] || "#{to_table.to_s.singularize}_id"
10
15
  foreign_key_name = foreign_key_name(from_table, column, options)
11
16
  primary_key = options[:primary_key] || "id"
12
17
  dependency = dependency_sql(options[:dependent])
13
18
 
14
19
  sql =
15
- "ALTER TABLE #{quote_table_name(from_table)} " +
16
20
  "ADD CONSTRAINT #{quote_column_name(foreign_key_name)} " +
17
21
  "FOREIGN KEY (#{quote_column_name(column)}) " +
18
22
  "REFERENCES #{quote_table_name(ActiveRecord::Migrator.proper_table_name(to_table))}(#{primary_key})"
19
23
  sql << " #{dependency}" if dependency.present?
20
24
  sql << " #{options[:options]}" if options[:options]
21
-
22
- execute(sql)
25
+
26
+ sql
27
+ end
28
+
29
+ def remove_foreign_key(table, options)
30
+ execute "ALTER TABLE #{quote_table_name(table)} #{remove_foreign_key_sql(table, options)}"
31
+ end
32
+
33
+ def remove_foreign_key_sql(table, options)
34
+ if Hash === options
35
+ foreign_key_name = foreign_key_name(table, options[:column], options)
36
+ else
37
+ foreign_key_name = foreign_key_name(table, "#{options.to_s.singularize}_id")
38
+ end
39
+
40
+ "DROP CONSTRAINT #{quote_column_name(foreign_key_name)}"
23
41
  end
24
42
 
25
43
  private
@@ -0,0 +1,21 @@
1
+ module Foreigner
2
+ module Migration
3
+ module CommandRecorder
4
+ def add_foreign_key(*args)
5
+ record(:add_foreign_key, args)
6
+ end
7
+
8
+ def remove_foreign_key(*args)
9
+ record(:remove_foreign_key, args)
10
+ end
11
+
12
+ def invert_add_foreign_key(*args)
13
+ [:remove_foreign_key, *args]
14
+ end
15
+
16
+ def invert_remove_foreign_key(*args)
17
+ [:add_foreign_key, *args]
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ module Foreigner
2
+ class Railtie < Rails::Railtie
3
+ initializer 'foreigner.load_adapter' do
4
+ ActiveSupport.on_load :active_record do
5
+ ActiveRecord::ConnectionAdapters.module_eval do
6
+ include Foreigner::ConnectionAdapters::SchemaStatements
7
+ include Foreigner::ConnectionAdapters::SchemaDefinitions
8
+ end
9
+
10
+ ActiveRecord::SchemaDumper.class_eval do
11
+ include Foreigner::SchemaDumper
12
+ end
13
+
14
+ if defined?(ActiveRecord::Migration::CommandRecorder)
15
+ ActiveRecord::Migration::CommandRecorder.class_eval do
16
+ include Foreigner::Migration::CommandRecorder
17
+ end
18
+ end
19
+
20
+ Foreigner::Adapter.load!
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,9 +1,9 @@
1
1
  module Foreigner
2
2
  module SchemaDumper
3
- def self.included(base)
4
- base.class_eval do
5
- alias_method_chain :tables, :foreign_keys
6
- end
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ alias_method_chain :tables, :foreign_keys
7
7
  end
8
8
 
9
9
  def tables_with_foreign_keys(stream)
data/lib/foreigner.rb CHANGED
@@ -1,53 +1,24 @@
1
- require 'foreigner/connection_adapters/abstract/schema_statements'
2
- require 'foreigner/connection_adapters/abstract/schema_definitions'
3
- require 'foreigner/connection_adapters/sql_2003'
4
- require 'foreigner/schema_dumper'
5
-
6
1
  module Foreigner
7
- class << self
8
- def adapters
9
- @@adapters ||= {}
10
- end
11
-
12
- def register(adapter_name, file_name)
13
- adapters[adapter_name] = file_name
14
- end
15
-
16
- def load_adapter!
17
- ActiveRecord::ConnectionAdapters.module_eval do
18
- include Foreigner::ConnectionAdapters::SchemaStatements
19
- include Foreigner::ConnectionAdapters::SchemaDefinitions
20
- end
2
+ extend ActiveSupport::Autoload
3
+ autoload :Adapter
4
+ autoload :SchemaDumper
21
5
 
22
- ActiveRecord::SchemaDumper.class_eval do
23
- include Foreigner::SchemaDumper
24
- end
6
+ module ConnectionAdapters
7
+ extend ActiveSupport::Autoload
8
+ autoload :Sql2003
25
9
 
26
- if adapters.key?(configured_adapter)
27
- require adapters[configured_adapter]
28
- end
10
+ autoload_under 'abstract' do
11
+ autoload :SchemaDefinitions
12
+ autoload :SchemaStatements
29
13
  end
14
+ end
30
15
 
31
- def configured_adapter
32
- ActiveRecord::Base.connection_pool.spec.config[:adapter]
33
- end
16
+ module Migration
17
+ autoload :CommandRecorder, 'foreigner/migration/command_recorder'
34
18
  end
35
19
  end
36
20
 
37
- Foreigner.register 'mysql', 'foreigner/connection_adapters/mysql_adapter'
38
- Foreigner.register 'mysql2', 'foreigner/connection_adapters/mysql_adapter'
39
- Foreigner.register 'postgresql', 'foreigner/connection_adapters/postgresql_adapter'
21
+ Foreigner::Adapter.register 'mysql2', 'foreigner/connection_adapters/mysql2_adapter'
22
+ Foreigner::Adapter.register 'postgresql', 'foreigner/connection_adapters/postgresql_adapter'
40
23
 
41
- if defined?(Rails::Railtie)
42
- module Foreigner
43
- class Railtie < Rails::Railtie
44
- initializer 'foreigner.load_adapter' do
45
- ActiveSupport.on_load :active_record do
46
- Foreigner.load_adapter!
47
- end
48
- end
49
- end
50
- end
51
- else
52
- Foreigner.load_adapter!
53
- end
24
+ require 'foreigner/railtie'
data/test/helper.rb CHANGED
@@ -2,4 +2,37 @@ require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'rails/all'
4
4
 
5
- require 'foreigner'
5
+ require 'foreigner'
6
+
7
+ Foreigner::Adapter.registered.values.each do |file_name|
8
+ require file_name
9
+ end
10
+
11
+ module Foreigner
12
+ class UnitTest < ActiveSupport::TestCase
13
+ private
14
+ def execute(sql, name = nil)
15
+ sql
16
+ end
17
+
18
+ def quote_column_name(name)
19
+ "`#{name}`"
20
+ end
21
+
22
+ def quote_table_name(name)
23
+ quote_column_name(name).gsub('.', '`.`')
24
+ end
25
+ end
26
+
27
+ class IntegrationTest < ActiveSupport::TestCase
28
+ def with_migration(&blk)
29
+ migration = Class.new(ActiveRecord::Migration)
30
+
31
+ migration.singleton_class do
32
+ define_method(:up, &blk)
33
+ end
34
+
35
+ migration
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,26 @@
1
+ require 'helper'
2
+
3
+ class Mysql2AdapterTest < Foreigner::AdapterTest
4
+ include Foreigner::ConnectionAdapters::Mysql2Adapter
5
+
6
+ test 'remove_by_table' do
7
+ assert_equal(
8
+ "DROP FOREIGN KEY `suppliers_company_id_fk`",
9
+ remove_foreign_key_sql(:suppliers, :companies)
10
+ )
11
+ end
12
+
13
+ test 'remove_by_name' do
14
+ assert_equal(
15
+ "DROP FOREIGN KEY `belongs_to_supplier`",
16
+ remove_foreign_key_sql(:suppliers, :name => "belongs_to_supplier")
17
+ )
18
+ end
19
+
20
+ test 'remove_by_column' do
21
+ assert_equal(
22
+ "DROP FOREIGN KEY `suppliers_ship_to_id_fk`",
23
+ remove_foreign_key_sql(:suppliers, :column => "ship_to_id")
24
+ )
25
+ end
26
+ end
@@ -1,38 +1,37 @@
1
1
  require 'helper'
2
- require 'foreigner/connection_adapters/mysql_adapter'
3
2
 
4
- class MysqlAdapterTest < ActiveRecord::TestCase
5
- include Foreigner::ConnectionAdapters::MysqlAdapter
3
+ class Sql2003Test < Foreigner::AdapterTest
4
+ include Foreigner::ConnectionAdapters::Sql2003
6
5
 
7
- def test_add_without_options
6
+ test 'add_without_options' do
8
7
  assert_equal(
9
8
  "ALTER TABLE `employees` ADD CONSTRAINT `employees_company_id_fk` FOREIGN KEY (`company_id`) REFERENCES `companies`(id)",
10
9
  add_foreign_key(:employees, :companies)
11
10
  )
12
11
  end
13
12
 
14
- def test_add_with_name
13
+ test 'add_with_name' do
15
14
  assert_equal(
16
15
  "ALTER TABLE `employees` ADD CONSTRAINT `favorite_company_fk` FOREIGN KEY (`company_id`) REFERENCES `companies`(id)",
17
16
  add_foreign_key(:employees, :companies, :name => 'favorite_company_fk')
18
17
  )
19
18
  end
20
19
 
21
- def test_add_with_column
20
+ test 'add_with_column' do
22
21
  assert_equal(
23
22
  "ALTER TABLE `employees` ADD CONSTRAINT `employees_last_employer_id_fk` FOREIGN KEY (`last_employer_id`) REFERENCES `companies`(id)",
24
23
  add_foreign_key(:employees, :companies, :column => 'last_employer_id')
25
24
  )
26
25
  end
27
26
 
28
- def test_add_with_column_and_name
27
+ test 'add_with_column_and_name' do
29
28
  assert_equal(
30
29
  "ALTER TABLE `employees` ADD CONSTRAINT `favorite_company_fk` FOREIGN KEY (`last_employer_id`) REFERENCES `companies`(id)",
31
30
  add_foreign_key(:employees, :companies, :column => 'last_employer_id', :name => 'favorite_company_fk')
32
31
  )
33
32
  end
34
33
 
35
- def test_add_with_delete_dependency
34
+ test 'add_with_delete_dependency' do
36
35
  assert_equal(
37
36
  "ALTER TABLE `employees` ADD CONSTRAINT `employees_company_id_fk` FOREIGN KEY (`company_id`) REFERENCES `companies`(id) " +
38
37
  "ON DELETE CASCADE",
@@ -40,7 +39,7 @@ class MysqlAdapterTest < ActiveRecord::TestCase
40
39
  )
41
40
  end
42
41
 
43
- def test_add_with_nullify_dependency
42
+ test 'add_with_nullify_dependency' do
44
43
  assert_equal(
45
44
  "ALTER TABLE `employees` ADD CONSTRAINT `employees_company_id_fk` FOREIGN KEY (`company_id`) REFERENCES `companies`(id) " +
46
45
  "ON DELETE SET NULL",
@@ -48,7 +47,7 @@ class MysqlAdapterTest < ActiveRecord::TestCase
48
47
  )
49
48
  end
50
49
 
51
- def test_add_with_restrict_dependency
50
+ test 'add_with_restrict_dependency' do
52
51
  assert_equal(
53
52
  "ALTER TABLE `employees` ADD CONSTRAINT `employees_company_id_fk` FOREIGN KEY (`company_id`) REFERENCES `companies`(id) " +
54
53
  "ON DELETE RESTRICT",
@@ -56,7 +55,7 @@ class MysqlAdapterTest < ActiveRecord::TestCase
56
55
  )
57
56
  end
58
57
 
59
- def test_add_with_options
58
+ test 'add_with_options' do
60
59
  assert_equal(
61
60
  "ALTER TABLE `employees` ADD CONSTRAINT `employees_company_id_fk` FOREIGN KEY (`company_id`) REFERENCES `companies`(id) " +
62
61
  "on delete foo",
@@ -64,37 +63,24 @@ class MysqlAdapterTest < ActiveRecord::TestCase
64
63
  )
65
64
  end
66
65
 
67
- def test_remove_by_table
66
+ test 'remove_by_table' do
68
67
  assert_equal(
69
- "ALTER TABLE `suppliers` DROP FOREIGN KEY `suppliers_company_id_fk`",
68
+ "ALTER TABLE `suppliers` DROP CONSTRAINT `suppliers_company_id_fk`",
70
69
  remove_foreign_key(:suppliers, :companies)
71
70
  )
72
71
  end
73
72
 
74
- def test_remove_by_name
73
+ test 'remove_by_name' do
75
74
  assert_equal(
76
- "ALTER TABLE `suppliers` DROP FOREIGN KEY `belongs_to_supplier`",
75
+ "ALTER TABLE `suppliers` DROP CONSTRAINT `belongs_to_supplier`",
77
76
  remove_foreign_key(:suppliers, :name => "belongs_to_supplier")
78
77
  )
79
78
  end
80
79
 
81
- def test_remove_by_column
80
+ test 'remove_by_column' do
82
81
  assert_equal(
83
- "ALTER TABLE `suppliers` DROP FOREIGN KEY `suppliers_ship_to_id_fk`",
82
+ "ALTER TABLE `suppliers` DROP CONSTRAINT `suppliers_ship_to_id_fk`",
84
83
  remove_foreign_key(:suppliers, :column => "ship_to_id")
85
84
  )
86
85
  end
87
-
88
- private
89
- def execute(sql, name = nil)
90
- sql
91
- end
92
-
93
- def quote_column_name(name)
94
- "`#{name}`"
95
- end
96
-
97
- def quote_table_name(name)
98
- quote_column_name(name).gsub('.', '`.`')
99
- end
100
86
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: foreigner
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.9.2
5
+ version: 1.0.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Matthew Higgins
@@ -10,11 +10,21 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-12 00:00:00 -07:00
13
+ date: 2011-05-17 00:00:00 -07:00
14
14
  default_executable:
15
- dependencies: []
16
-
17
- description: Adds helpers to migrations and correctly dumps foreign keys to schema.rb
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: activerecord
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 3.0.0
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ description: Adds helpers to migrations and dumps foreign keys to schema.rb
18
28
  email: developer@matthewhiggins.com
19
29
  executables: []
20
30
 
@@ -26,15 +36,19 @@ files:
26
36
  - MIT-LICENSE
27
37
  - Rakefile
28
38
  - README.rdoc
39
+ - lib/foreigner/adapter.rb
29
40
  - lib/foreigner/connection_adapters/abstract/schema_definitions.rb
30
41
  - lib/foreigner/connection_adapters/abstract/schema_statements.rb
31
- - lib/foreigner/connection_adapters/mysql_adapter.rb
42
+ - lib/foreigner/connection_adapters/mysql2_adapter.rb
32
43
  - lib/foreigner/connection_adapters/postgresql_adapter.rb
33
- - lib/foreigner/connection_adapters/sql_2003.rb
44
+ - lib/foreigner/connection_adapters/sql2003.rb
45
+ - lib/foreigner/migration/command_recorder.rb
46
+ - lib/foreigner/railtie.rb
34
47
  - lib/foreigner/schema_dumper.rb
35
48
  - lib/foreigner.rb
36
49
  - test/helper.rb
37
- - test/mysql_adapter_test.rb
50
+ - test/mysql2_adapter_test.rb
51
+ - test/sql2003_test.rb
38
52
  has_rdoc: true
39
53
  homepage: http://github.com/matthuhiggins/foreigner
40
54
  licenses: []
@@ -49,7 +63,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
49
63
  requirements:
50
64
  - - ">="
51
65
  - !ruby/object:Gem::Version
52
- version: 1.8.6
66
+ version: 1.8.7
53
67
  required_rubygems_version: !ruby/object:Gem::Requirement
54
68
  none: false
55
69
  requirements:
@@ -59,9 +73,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
59
73
  requirements: []
60
74
 
61
75
  rubyforge_project: foreigner
62
- rubygems_version: 1.6.1
76
+ rubygems_version: 1.6.2
63
77
  signing_key:
64
78
  specification_version: 3
65
- summary: Foreign keys for Rails
79
+ summary: Foreign Keys for Rails
66
80
  test_files: []
67
81