dwilkie-foreigner 0.5.0 → 0.5.1
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/lib/foreigner/connection_adapters/sqlite3_adapter.rb +31 -32
- data/lib/foreigner.rb +17 -9
- data/test/helper.rb +4 -1
- data/test/mysql_adapter_test.rb +16 -14
- metadata +11 -4
|
@@ -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
|
+
|
data/test/mysql_adapter_test.rb
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|