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.
@@ -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