dwilkie-foreigner 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,6 +2,37 @@ require 'foreigner/connection_adapters/sql_2003'
2
2
 
3
3
  module Foreigner
4
4
  module ConnectionAdapters
5
+ module SQLite3Adapter
6
+ include Foreigner::ConnectionAdapters::Sql2003
7
+
8
+ def foreign_keys(table_name)
9
+ foreign_keys = []
10
+ create_table_info = select_value %{
11
+ SELECT sql
12
+ FROM sqlite_master
13
+ WHERE sql LIKE '%FOREIGN KEY%'
14
+ AND name = '#{table_name}'
15
+ }
16
+ unless create_table_info.nil?
17
+ fk_columns = create_table_info.scan(/FOREIGN KEY\s*\(\"([^\"]+)\"\)/)
18
+ fk_tables = create_table_info.scan(/REFERENCES\s*\"([^\"]+)\"/)
19
+ fk_references = create_table_info.scan(/REFERENCES[^\,]+/)
20
+ if fk_columns.size == fk_tables.size && fk_references.size == fk_columns.size
21
+ fk_columns.each_with_index do |fk_column, index|
22
+ if fk_references[index] =~ /ON DELETE CASCADE/
23
+ fk_references[index] = :delete
24
+ elsif fk_references[index] =~ /ON DELETE SET NULL/
25
+ fk_references[index] = :nullify
26
+ else
27
+ fk_references[index] = nil
28
+ end
29
+ foreign_keys << ForeignKeyDefinition.new(table_name, fk_tables[index][0], :column => fk_column[0], :dependent => fk_references[index])
30
+ end
31
+ end
32
+ end
33
+ foreign_keys
34
+ end
35
+ end
5
36
  module TableDefinition
6
37
  class ForeignKey < Struct.new(:base, :to_table, :options)
7
38
 
@@ -59,38 +90,6 @@ module Foreigner
59
90
  end
60
91
  end
61
92
  end
62
-
63
- module SQLite3Adapter
64
- include Foreigner::ConnectionAdapters::Sql2003
65
-
66
- def foreign_keys(table_name)
67
- foreign_keys = []
68
- create_table_info = select_value %{
69
- SELECT sql
70
- FROM sqlite_master
71
- WHERE sql LIKE '%FOREIGN KEY%'
72
- AND name = '#{table_name}'
73
- }
74
- unless create_table_info.nil?
75
- fk_columns = create_table_info.scan(/FOREIGN KEY\s*\(\"([^\"]+)\"\)/)
76
- fk_tables = create_table_info.scan(/REFERENCES\s*\"([^\"]+)\"/)
77
- fk_references = create_table_info.scan(/REFERENCES[^\,]+/)
78
- if fk_columns.size == fk_tables.size && fk_references.size == fk_columns.size
79
- fk_columns.each_with_index do |fk_column, index|
80
- if fk_references[index] =~ /ON DELETE CASCADE/
81
- fk_references[index] = :delete
82
- elsif fk_references[index] =~ /ON DELETE SET NULL/
83
- fk_references[index] = :nullify
84
- else
85
- fk_references[index] = nil
86
- end
87
- foreign_keys << ForeignKeyDefinition.new(table_name, fk_tables[index][0], :column => fk_column[0], :dependent => fk_references[index])
88
- end
89
- end
90
- end
91
- foreign_keys
92
- end
93
- end
94
93
  end
95
94
  end
96
95
 
data/lib/foreigner.rb CHANGED
@@ -3,6 +3,23 @@ require 'foreigner/connection_adapters/abstract/schema_definitions'
3
3
  require 'foreigner/connection_adapters/sql_2003'
4
4
  require 'foreigner/schema_dumper'
5
5
 
6
+ module Foreigner
7
+ mattr_accessor :adapters
8
+ self.adapters = {}
9
+
10
+ class << self
11
+ def register(adapter_name, file_name)
12
+ adapters[adapter_name] = file_name
13
+ end
14
+
15
+ def load_adapter!(adapter_name)
16
+ if adapters.key?(adapter_name)
17
+ require adapters[adapter_name]
18
+ end
19
+ end
20
+ end
21
+ end
22
+
6
23
  module ActiveRecord
7
24
  module ConnectionAdapters
8
25
  include Foreigner::ConnectionAdapters::SchemaStatements
@@ -12,14 +29,5 @@ module ActiveRecord
12
29
  SchemaDumper.class_eval do
13
30
  include Foreigner::SchemaDumper
14
31
  end
15
-
16
- Base.class_eval do
17
- if %w(sqlite3).include? connection_pool.spec.config[:adapter].downcase
18
- require "foreigner/connection_adapters/#{connection_pool.spec.config[:adapter].downcase}_adapter"
19
- end
20
- if %w(mysql postgresql).include? connection_pool.spec.config[:adapter].downcase
21
- require "foreigner/connection_adapters/#{connection_pool.spec.config[:adapter].downcase}_adapter"
22
- end
23
- end
24
32
  end
25
33
 
data/test/helper.rb CHANGED
@@ -1,8 +1,11 @@
1
+ ENV["RAILS_ENV"] = "test"
1
2
  require 'test/unit'
2
3
  require 'rubygems'
3
4
  require 'active_support'
4
5
  require 'active_support/test_case'
5
6
  require 'active_record'
6
7
  require 'active_record/test_case'
8
+ require 'active_record/connection_adapters/sqlite3_adapter'
7
9
  require 'active_record/connection_adapters/mysql_adapter'
8
- require 'foreigner'
10
+ require 'foreigner'
11
+
@@ -1,7 +1,8 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
+ require "foreigner/connection_adapters/mysql_adapter"
2
3
 
3
4
  class MysqlAdapterTest < ActiveRecord::TestCase
4
- include Foreigner::MysqlAdapter
5
+ include Foreigner::ConnectionAdapters::MysqlAdapter
5
6
 
6
7
  def test_add_without_options
7
8
  assert_equal(
@@ -9,28 +10,28 @@ class MysqlAdapterTest < ActiveRecord::TestCase
9
10
  add_foreign_key(:employees, :companies)
10
11
  )
11
12
  end
12
-
13
+
13
14
  def test_add_with_name
14
15
  assert_equal(
15
16
  "ALTER TABLE `employees` ADD CONSTRAINT `favorite_company_fk` FOREIGN KEY (`company_id`) REFERENCES `companies`(id)",
16
17
  add_foreign_key(:employees, :companies, :name => 'favorite_company_fk')
17
18
  )
18
19
  end
19
-
20
+
20
21
  def test_add_with_column
21
22
  assert_equal(
22
23
  "ALTER TABLE `employees` ADD CONSTRAINT `employees_last_employer_id_fk` FOREIGN KEY (`last_employer_id`) REFERENCES `companies`(id)",
23
24
  add_foreign_key(:employees, :companies, :column => 'last_employer_id')
24
- )
25
+ )
25
26
  end
26
-
27
+
27
28
  def test_add_with_column_and_name
28
29
  assert_equal(
29
30
  "ALTER TABLE `employees` ADD CONSTRAINT `favorite_company_fk` FOREIGN KEY (`last_employer_id`) REFERENCES `companies`(id)",
30
31
  add_foreign_key(:employees, :companies, :column => 'last_employer_id', :name => 'favorite_company_fk')
31
32
  )
32
33
  end
33
-
34
+
34
35
  def test_add_with_delete_dependency
35
36
  assert_equal(
36
37
  "ALTER TABLE `employees` ADD CONSTRAINT `employees_company_id_fk` FOREIGN KEY (`company_id`) REFERENCES `companies`(id) " +
@@ -38,7 +39,7 @@ class MysqlAdapterTest < ActiveRecord::TestCase
38
39
  add_foreign_key(:employees, :companies, :dependent => :delete)
39
40
  )
40
41
  end
41
-
42
+
42
43
  def test_add_with_nullify_dependency
43
44
  assert_equal(
44
45
  "ALTER TABLE `employees` ADD CONSTRAINT `employees_company_id_fk` FOREIGN KEY (`company_id`) REFERENCES `companies`(id) " +
@@ -46,38 +47,39 @@ class MysqlAdapterTest < ActiveRecord::TestCase
46
47
  add_foreign_key(:employees, :companies, :dependent => :nullify)
47
48
  )
48
49
  end
49
-
50
+
50
51
  def test_remove_by_table
51
52
  assert_equal(
52
53
  "ALTER TABLE `suppliers` DROP FOREIGN KEY `suppliers_company_id_fk`",
53
54
  remove_foreign_key(:suppliers, :companies)
54
55
  )
55
56
  end
56
-
57
+
57
58
  def test_remove_by_name
58
59
  assert_equal(
59
60
  "ALTER TABLE `suppliers` DROP FOREIGN KEY `belongs_to_supplier`",
60
61
  remove_foreign_key(:suppliers, :name => "belongs_to_supplier")
61
62
  )
62
63
  end
63
-
64
+
64
65
  def test_remove_by_column
65
66
  assert_equal(
66
67
  "ALTER TABLE `suppliers` DROP FOREIGN KEY `suppliers_ship_to_id_fk`",
67
68
  remove_foreign_key(:suppliers, :column => "ship_to_id")
68
69
  )
69
70
  end
70
-
71
+
71
72
  private
72
73
  def execute(sql, name = nil)
73
74
  sql
74
75
  end
75
-
76
+
76
77
  def quote_column_name(name)
77
78
  "`#{name}`"
78
79
  end
79
-
80
+
80
81
  def quote_table_name(name)
81
82
  quote_column_name(name).gsub('.', '`.`')
82
83
  end
83
- end
84
+ end
85
+
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dwilkie-foreigner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 5
8
+ - 1
9
+ version: 0.5.1
5
10
  platform: ruby
6
11
  authors:
7
12
  - David Wilkie
@@ -50,18 +55,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
50
55
  requirements:
51
56
  - - ">="
52
57
  - !ruby/object:Gem::Version
58
+ segments:
59
+ - 0
53
60
  version: "0"
54
- version:
55
61
  required_rubygems_version: !ruby/object:Gem::Requirement
56
62
  requirements:
57
63
  - - ">="
58
64
  - !ruby/object:Gem::Version
65
+ segments:
66
+ - 0
59
67
  version: "0"
60
- version:
61
68
  requirements: []
62
69
 
63
70
  rubyforge_project: foreigner
64
- rubygems_version: 1.3.5
71
+ rubygems_version: 1.3.6
65
72
  signing_key:
66
73
  specification_version: 1
67
74
  summary: Foreign keys for Rails migrations with limited SQLite support