redhillonrails_core 1.0.9.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +7 -0
- data/README.rdoc +31 -47
- data/lib/redhillonrails_core/active_record/base.rb +63 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/abstract_adapter.rb +75 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/column.rb +25 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/foreign_key_definition.rb +30 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/index_definition.rb +17 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/mysql_adapter.rb +78 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/mysql_column.rb +12 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/postgresql_adapter.rb +160 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/sqlite3_adapter.rb +111 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/table_definition.rb +31 -0
- data/lib/redhillonrails_core/active_record/schema.rb +27 -0
- data/lib/redhillonrails_core/active_record/schema_dumper.rb +70 -0
- data/lib/redhillonrails_core.rb +20 -26
- data/redhillonrails_core.gemspec +34 -40
- data/spec/connections/mysql/connection.rb +18 -0
- data/spec/connections/mysql2/connection.rb +18 -0
- data/spec/connections/postgresql/connection.rb +15 -0
- data/spec/connections/sqlite3/connection.rb +14 -0
- data/spec/foreign_key_spec.rb +100 -0
- data/spec/index_definition_spec.rb +145 -0
- data/spec/index_spec.rb +67 -0
- data/spec/models/comment.rb +5 -0
- data/spec/models/post.rb +6 -0
- data/spec/models/user.rb +5 -0
- data/spec/schema/schema.rb +21 -0
- data/spec/schema_dumper_spec.rb +117 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/reference.rb +66 -0
- metadata +32 -57
- data/.document +0 -5
- data/.gitignore +0 -23
- data/.rvmrc +0 -1
- data/Gemfile +0 -20
- data/Gemfile.lock +0 -50
- data/Rakefile +0 -76
- data/VERSION +0 -1
- data/examples/example_helper.rb +0 -44
- data/examples/postgresql_index_parser_example.rb +0 -198
- data/lib/red_hill_consulting/core/active_record/base.rb +0 -61
- data/lib/red_hill_consulting/core/active_record/connection_adapters/abstract_adapter.rb +0 -71
- data/lib/red_hill_consulting/core/active_record/connection_adapters/column.rb +0 -21
- data/lib/red_hill_consulting/core/active_record/connection_adapters/foreign_key_definition.rb +0 -26
- data/lib/red_hill_consulting/core/active_record/connection_adapters/index_definition.rb +0 -13
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql4_adapter.rb +0 -37
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql5_adapter.rb +0 -40
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_adapter.rb +0 -103
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_column.rb +0 -8
- data/lib/red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter.rb +0 -178
- data/lib/red_hill_consulting/core/active_record/connection_adapters/schema_statements.rb +0 -23
- data/lib/red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter.rb +0 -109
- data/lib/red_hill_consulting/core/active_record/connection_adapters/table_definition.rb +0 -27
- data/lib/red_hill_consulting/core/active_record/schema.rb +0 -25
- data/lib/red_hill_consulting/core/active_record/schema_dumper.rb +0 -66
- data/lib/red_hill_consulting/core/active_record.rb +0 -4
- data/lib/red_hill_consulting/core.rb +0 -4
- data/tasks/db/comments.rake +0 -9
@@ -0,0 +1,111 @@
|
|
1
|
+
module RedhillonrailsCore
|
2
|
+
module ActiveRecord
|
3
|
+
module ConnectionAdapters
|
4
|
+
module Sqlite3Adapter
|
5
|
+
def self.included(base)
|
6
|
+
base.class_eval do
|
7
|
+
alias_method_chain :tables, :redhillonrails_core
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def move_table(from, to, options = {}, &block) #:nodoc:
|
12
|
+
copy_table(from, to, options, &block)
|
13
|
+
drop_table(from, options)
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_foreign_key(from_table_name, from_column_names, to_table_name, to_column_names, options = {})
|
17
|
+
initialize_sqlite3_foreign_key_table
|
18
|
+
from_column_names = Array(from_column_names)
|
19
|
+
to_column_names = Array(to_column_names)
|
20
|
+
fk_name = options[:name] || ["fk", from_table_name, *to_column_names].join("_")
|
21
|
+
|
22
|
+
columns = %w(name from_table_name from_column_names to_table_name to_column_names)
|
23
|
+
values = [fk_name, from_table_name, from_column_names.join(","), to_table_name, to_column_names.join(",")]
|
24
|
+
|
25
|
+
quoted_values = values.map { |x| quote(x.to_s) }.join(",")
|
26
|
+
|
27
|
+
# TODO: support options
|
28
|
+
|
29
|
+
insert <<-SQL
|
30
|
+
INSERT INTO #{sqlite3_foreign_key_table}(#{quoted_columns(columns)})
|
31
|
+
VALUES (#{quoted_values})
|
32
|
+
SQL
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove_foreign_key(table_name, foreign_key_name, options = {})
|
36
|
+
return if options[:temporary] == true
|
37
|
+
initialize_sqlite3_foreign_key_table
|
38
|
+
|
39
|
+
rows_deleted = delete <<-SQL
|
40
|
+
DELETE FROM #{sqlite3_foreign_key_table}
|
41
|
+
WHERE #{quote_column_name("name")} = #{quote(foreign_key_name.to_s)}
|
42
|
+
AND #{quote_column_name("from_table_name")} = #{quote(table_name.to_s)}
|
43
|
+
SQL
|
44
|
+
|
45
|
+
if rows_deleted != 1
|
46
|
+
raise ActiveRecord::ActiveRecordError, "Foreign-key '#{foreign_key_name}' on table '#{table_name}' not found"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def tables_with_redhillonrails_core(name=nil)
|
51
|
+
tables_without_redhillonrails_core.reject{ |name| name == sqlite3_foreign_key_table }
|
52
|
+
end
|
53
|
+
|
54
|
+
def foreign_keys(table_name, name = nil)
|
55
|
+
load_foreign_keys("from_table_name", table_name, name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def reverse_foreign_keys(table_name, name = nil)
|
59
|
+
load_foreign_keys("to_table_name", table_name, name)
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def quoted_columns(columns)
|
65
|
+
columns.map { |x| quote_column_name(x) }.join(",")
|
66
|
+
end
|
67
|
+
|
68
|
+
def sqlite3_foreign_key_table
|
69
|
+
"sqlite3_foreign_keys"
|
70
|
+
end
|
71
|
+
|
72
|
+
def initialize_sqlite3_foreign_key_table
|
73
|
+
unless sqlite3_foreign_key_table_exists?
|
74
|
+
create_table(sqlite3_foreign_key_table, :id => false) do |t|
|
75
|
+
t.string "name", :null => false
|
76
|
+
t.string "from_table_name", :null => false
|
77
|
+
t.string "from_column_names", :null => false
|
78
|
+
t.string "to_table_name", :null => false
|
79
|
+
t.string "to_column_names", :null => false
|
80
|
+
end
|
81
|
+
add_index(sqlite3_foreign_key_table, "name", :unique => true)
|
82
|
+
add_index(sqlite3_foreign_key_table, "from_table_name", :unique => false)
|
83
|
+
add_index(sqlite3_foreign_key_table, "to_table_name", :unique => false)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def sqlite3_foreign_key_table_exists?
|
88
|
+
tables_without_redhillonrails_core.detect { |name| name == sqlite3_foreign_key_table }
|
89
|
+
end
|
90
|
+
|
91
|
+
def load_foreign_keys(discriminating_column, table_name, name = nil)
|
92
|
+
rows = select_all(<<-SQL, name)
|
93
|
+
SELECT *
|
94
|
+
FROM #{sqlite3_foreign_key_table}
|
95
|
+
WHERE #{quote_column_name(discriminating_column)} = #{quote(table_name.to_s)}
|
96
|
+
SQL
|
97
|
+
|
98
|
+
rows.map do |row|
|
99
|
+
ForeignKeyDefinition.new(
|
100
|
+
row["name"],
|
101
|
+
row["from_table_name"], row["from_column_names"].split(","),
|
102
|
+
row["to_table_name"], row["to_column_names"].split(",")
|
103
|
+
)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RedhillonrailsCore
|
2
|
+
module ActiveRecord
|
3
|
+
module ConnectionAdapters
|
4
|
+
module TableDefinition
|
5
|
+
def self.included(base)
|
6
|
+
base.class_eval do
|
7
|
+
attr_accessor :name
|
8
|
+
alias_method_chain :initialize, :redhillonrails_core
|
9
|
+
alias_method_chain :to_sql, :redhillonrails_core
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize_with_redhillonrails_core(*args)
|
14
|
+
initialize_without_redhillonrails_core(*args)
|
15
|
+
@foreign_keys = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def foreign_key(column_names, references_table_name, references_column_names, options = {})
|
19
|
+
@foreign_keys << ForeignKeyDefinition.new(options[:name], nil, column_names, ::ActiveRecord::Migrator.proper_table_name(references_table_name), references_column_names, options[:on_update], options[:on_delete], options[:deferrable])
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_sql_with_redhillonrails_core
|
24
|
+
sql = to_sql_without_redhillonrails_core
|
25
|
+
sql << ', ' << @foreign_keys * ', ' unless @foreign_keys.empty? || ::ActiveRecord::Schema.defining?
|
26
|
+
sql
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RedhillonrailsCore
|
2
|
+
module ActiveRecord
|
3
|
+
module Schema
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def self.extended(base)
|
10
|
+
class << base
|
11
|
+
attr_accessor :defining
|
12
|
+
alias :defining? :defining
|
13
|
+
|
14
|
+
alias_method_chain :define, :redhillonrails_core
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def define_with_redhillonrails_core(info={}, &block)
|
19
|
+
self.defining = true
|
20
|
+
define_without_redhillonrails_core(info, &block)
|
21
|
+
ensure
|
22
|
+
self.defining = false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module RedhillonrailsCore
|
2
|
+
module ActiveRecord
|
3
|
+
module SchemaDumper
|
4
|
+
def self.included(base)
|
5
|
+
base.class_eval do
|
6
|
+
private
|
7
|
+
alias_method_chain :tables, :redhillonrails_core
|
8
|
+
alias_method_chain :indexes, :redhillonrails_core
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def tables_with_redhillonrails_core(stream)
|
15
|
+
@foreign_keys = StringIO.new
|
16
|
+
begin
|
17
|
+
tables_without_redhillonrails_core(stream)
|
18
|
+
@foreign_keys.rewind
|
19
|
+
stream.print @foreign_keys.read
|
20
|
+
views(stream)
|
21
|
+
ensure
|
22
|
+
@foreign_keys = nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def indexes_with_redhillonrails_core(table, stream)
|
27
|
+
indexes = @connection.indexes(table)
|
28
|
+
indexes.each do |index|
|
29
|
+
unless index.columns.blank?
|
30
|
+
stream.print " add_index #{index.table.inspect}, #{index.columns.inspect}, :name => #{index.name.inspect}"
|
31
|
+
stream.print ", :unique => true" if index.unique
|
32
|
+
stream.print ", :kind => \"#{index.kind}\"" unless index.kind.blank?
|
33
|
+
stream.print ", :case_sensitive => false" unless index.case_sensitive?
|
34
|
+
stream.print ", :conditions => #{index.conditions.inspect}" unless index.conditions.blank?
|
35
|
+
else
|
36
|
+
stream.print " add_index #{index.table.inspect}"
|
37
|
+
stream.print ", :name => #{index.name.inspect}"
|
38
|
+
stream.print ", :kind => \"#{index.kind}\"" unless index.kind.blank?
|
39
|
+
stream.print ", :expression => #{index.expression.inspect}"
|
40
|
+
end
|
41
|
+
|
42
|
+
stream.puts
|
43
|
+
end
|
44
|
+
stream.puts unless indexes.empty?
|
45
|
+
|
46
|
+
foreign_keys(table, @foreign_keys)
|
47
|
+
end
|
48
|
+
|
49
|
+
def foreign_keys(table, stream)
|
50
|
+
foreign_keys = @connection.foreign_keys(table)
|
51
|
+
foreign_keys.each do |foreign_key|
|
52
|
+
stream.print " "
|
53
|
+
stream.print foreign_key.to_dump
|
54
|
+
stream.puts
|
55
|
+
end
|
56
|
+
stream.puts unless foreign_keys.empty?
|
57
|
+
end
|
58
|
+
|
59
|
+
def views(stream)
|
60
|
+
views = @connection.views
|
61
|
+
views.each do |view_name|
|
62
|
+
definition = @connection.view_definition(view_name)
|
63
|
+
stream.print " create_view #{view_name.inspect}, #{definition.inspect}"
|
64
|
+
stream.puts
|
65
|
+
end
|
66
|
+
stream.puts unless views.empty?
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/redhillonrails_core.rb
CHANGED
@@ -6,32 +6,26 @@ rescue
|
|
6
6
|
end
|
7
7
|
|
8
8
|
# TODO: only needed adapters should be required here
|
9
|
-
require '
|
10
|
-
require '
|
11
|
-
require '
|
12
|
-
require '
|
13
|
-
require '
|
14
|
-
require '
|
15
|
-
require '
|
16
|
-
require '
|
17
|
-
require '
|
18
|
-
require 'red_hill_consulting/core/active_record/connection_adapters/mysql_column'
|
19
|
-
require 'red_hill_consulting/core/active_record/connection_adapters/schema_statements'
|
20
|
-
require 'red_hill_consulting/core/active_record/connection_adapters/table_definition'
|
9
|
+
require 'redhillonrails_core/active_record/base'
|
10
|
+
require 'redhillonrails_core/active_record/schema'
|
11
|
+
require 'redhillonrails_core/active_record/schema_dumper'
|
12
|
+
require 'redhillonrails_core/active_record/connection_adapters/abstract_adapter'
|
13
|
+
require 'redhillonrails_core/active_record/connection_adapters/foreign_key_definition'
|
14
|
+
require 'redhillonrails_core/active_record/connection_adapters/column'
|
15
|
+
require 'redhillonrails_core/active_record/connection_adapters/index_definition'
|
16
|
+
require 'redhillonrails_core/active_record/connection_adapters/mysql_column'
|
17
|
+
require 'redhillonrails_core/active_record/connection_adapters/table_definition'
|
21
18
|
|
22
|
-
module
|
23
|
-
autoload :MysqlAdapter, '
|
24
|
-
autoload :
|
25
|
-
autoload :
|
26
|
-
autoload :PostgresqlAdapter, 'red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter'
|
27
|
-
autoload :Sqlite3Adapter, 'red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter'
|
19
|
+
module RedhillonrailsCore::ActiveRecord::ConnectionAdapters
|
20
|
+
autoload :MysqlAdapter, 'redhillonrails_core/active_record/connection_adapters/mysql_adapter'
|
21
|
+
autoload :PostgresqlAdapter, 'redhillonrails_core/active_record/connection_adapters/postgresql_adapter'
|
22
|
+
autoload :Sqlite3Adapter, 'redhillonrails_core/active_record/connection_adapters/sqlite3_adapter'
|
28
23
|
end
|
29
24
|
|
30
|
-
ActiveRecord::Base.send(:include,
|
31
|
-
ActiveRecord::Schema.send(:include,
|
32
|
-
ActiveRecord::SchemaDumper.send(:include,
|
33
|
-
ActiveRecord::ConnectionAdapters::IndexDefinition.send(:include,
|
34
|
-
ActiveRecord::ConnectionAdapters::TableDefinition.send(:include,
|
35
|
-
ActiveRecord::ConnectionAdapters::Column.send(:include,
|
36
|
-
ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:include,
|
37
|
-
ActiveRecord::ConnectionAdapters::SchemaStatements.send(:include, RedHillConsulting::Core::ActiveRecord::ConnectionAdapters::SchemaStatements)
|
25
|
+
ActiveRecord::Base.send(:include, RedhillonrailsCore::ActiveRecord::Base)
|
26
|
+
ActiveRecord::Schema.send(:include, RedhillonrailsCore::ActiveRecord::Schema)
|
27
|
+
ActiveRecord::SchemaDumper.send(:include, RedhillonrailsCore::ActiveRecord::SchemaDumper)
|
28
|
+
ActiveRecord::ConnectionAdapters::IndexDefinition.send(:include, RedhillonrailsCore::ActiveRecord::ConnectionAdapters::IndexDefinition)
|
29
|
+
ActiveRecord::ConnectionAdapters::TableDefinition.send(:include, RedhillonrailsCore::ActiveRecord::ConnectionAdapters::TableDefinition)
|
30
|
+
ActiveRecord::ConnectionAdapters::Column.send(:include, RedhillonrailsCore::ActiveRecord::ConnectionAdapters::Column)
|
31
|
+
ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:include, RedhillonrailsCore::ActiveRecord::ConnectionAdapters::AbstractAdapter)
|
data/redhillonrails_core.gemspec
CHANGED
@@ -5,75 +5,69 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{redhillonrails_core}
|
8
|
-
s.version = "1.0
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Micha\305\202 \305\201omnicki"]
|
12
|
-
s.date = %q{
|
13
|
-
s.description = %q{
|
12
|
+
s.date = %q{2011-01-09}
|
13
|
+
s.description = %q{Adds support in ActiveRecord for foreign_keys, complex indexes and other database-related stuff. Easily create foreign_keys, complex indexes and views.}
|
14
14
|
s.email = %q{michal.lomnicki@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"README.rdoc"
|
17
17
|
]
|
18
18
|
s.files = [
|
19
|
-
"
|
20
|
-
".gitignore",
|
21
|
-
".rvmrc",
|
22
|
-
"CHANGELOG",
|
23
|
-
"Gemfile",
|
24
|
-
"Gemfile.lock",
|
19
|
+
"CHANGELOG",
|
25
20
|
"MIT-LICENSE",
|
26
21
|
"README.rdoc",
|
27
|
-
"Rakefile",
|
28
|
-
"VERSION",
|
29
|
-
"examples/example_helper.rb",
|
30
|
-
"examples/postgresql_index_parser_example.rb",
|
31
22
|
"init.rb",
|
32
|
-
"lib/red_hill_consulting/core.rb",
|
33
|
-
"lib/red_hill_consulting/core/active_record.rb",
|
34
|
-
"lib/red_hill_consulting/core/active_record/base.rb",
|
35
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/abstract_adapter.rb",
|
36
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/column.rb",
|
37
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/foreign_key_definition.rb",
|
38
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/index_definition.rb",
|
39
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/mysql4_adapter.rb",
|
40
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/mysql5_adapter.rb",
|
41
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/mysql_adapter.rb",
|
42
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/mysql_column.rb",
|
43
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter.rb",
|
44
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/schema_statements.rb",
|
45
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter.rb",
|
46
|
-
"lib/red_hill_consulting/core/active_record/connection_adapters/table_definition.rb",
|
47
|
-
"lib/red_hill_consulting/core/active_record/schema.rb",
|
48
|
-
"lib/red_hill_consulting/core/active_record/schema_dumper.rb",
|
49
23
|
"lib/redhillonrails_core.rb",
|
50
|
-
"redhillonrails_core.
|
51
|
-
"
|
24
|
+
"lib/redhillonrails_core/active_record/base.rb",
|
25
|
+
"lib/redhillonrails_core/active_record/connection_adapters/abstract_adapter.rb",
|
26
|
+
"lib/redhillonrails_core/active_record/connection_adapters/column.rb",
|
27
|
+
"lib/redhillonrails_core/active_record/connection_adapters/foreign_key_definition.rb",
|
28
|
+
"lib/redhillonrails_core/active_record/connection_adapters/index_definition.rb",
|
29
|
+
"lib/redhillonrails_core/active_record/connection_adapters/mysql_adapter.rb",
|
30
|
+
"lib/redhillonrails_core/active_record/connection_adapters/mysql_column.rb",
|
31
|
+
"lib/redhillonrails_core/active_record/connection_adapters/postgresql_adapter.rb",
|
32
|
+
"lib/redhillonrails_core/active_record/connection_adapters/sqlite3_adapter.rb",
|
33
|
+
"lib/redhillonrails_core/active_record/connection_adapters/table_definition.rb",
|
34
|
+
"lib/redhillonrails_core/active_record/schema.rb",
|
35
|
+
"lib/redhillonrails_core/active_record/schema_dumper.rb",
|
36
|
+
"redhillonrails_core.gemspec"
|
52
37
|
]
|
53
38
|
s.homepage = %q{http://github.com/mlomnicki/redhillonrails_core}
|
54
39
|
s.rdoc_options = ["--charset=UTF-8"]
|
55
40
|
s.require_paths = ["lib"]
|
56
|
-
s.rubygems_version = %q{1.3.
|
57
|
-
s.summary = %q{
|
41
|
+
s.rubygems_version = %q{1.3.6}
|
42
|
+
s.summary = %q{Adds support in ActiveRecord for foreign_keys, complex indexes and other database-related stuff}
|
58
43
|
s.test_files = [
|
59
|
-
"
|
60
|
-
"
|
44
|
+
"spec/schema/schema.rb",
|
45
|
+
"spec/foreign_key_spec.rb",
|
46
|
+
"spec/schema_dumper_spec.rb",
|
47
|
+
"spec/connections/mysql2/connection.rb",
|
48
|
+
"spec/connections/postgresql/connection.rb",
|
49
|
+
"spec/connections/sqlite3/connection.rb",
|
50
|
+
"spec/connections/mysql/connection.rb",
|
51
|
+
"spec/support/reference.rb",
|
52
|
+
"spec/index_definition_spec.rb",
|
53
|
+
"spec/spec_helper.rb",
|
54
|
+
"spec/index_spec.rb",
|
55
|
+
"spec/models/user.rb",
|
56
|
+
"spec/models/post.rb",
|
57
|
+
"spec/models/comment.rb"
|
61
58
|
]
|
62
59
|
|
63
60
|
if s.respond_to? :specification_version then
|
64
61
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
65
62
|
s.specification_version = 3
|
66
63
|
|
67
|
-
if Gem::Version.new(Gem::
|
64
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
68
65
|
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
69
|
-
s.add_development_dependency(%q<micronaut>, [">= 0"])
|
70
66
|
else
|
71
67
|
s.add_dependency(%q<activerecord>, [">= 0"])
|
72
|
-
s.add_dependency(%q<micronaut>, [">= 0"])
|
73
68
|
end
|
74
69
|
else
|
75
70
|
s.add_dependency(%q<activerecord>, [">= 0"])
|
76
|
-
s.add_dependency(%q<micronaut>, [">= 0"])
|
77
71
|
end
|
78
72
|
end
|
79
73
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
print "Using MySQL\n"
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
ActiveRecord::Base.logger = Logger.new("debug.log")
|
5
|
+
|
6
|
+
ActiveRecord::Base.configurations = {
|
7
|
+
'redhillonrails' => {
|
8
|
+
:adapter => 'mysql',
|
9
|
+
:database => 'redhillonrails_core_test',
|
10
|
+
:username => 'redhillonrails',
|
11
|
+
:encoding => 'utf8',
|
12
|
+
:socket => '/var/run/mysqld/mysqld.sock',
|
13
|
+
:min_messages => 'warning'
|
14
|
+
}
|
15
|
+
|
16
|
+
}
|
17
|
+
|
18
|
+
ActiveRecord::Base.establish_connection 'redhillonrails'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
print "Using MySQL2\n"
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
ActiveRecord::Base.logger = Logger.new("debug.log")
|
5
|
+
|
6
|
+
ActiveRecord::Base.configurations = {
|
7
|
+
'redhillonrails' => {
|
8
|
+
:adapter => 'mysql2',
|
9
|
+
:database => 'redhillonrails_core_test',
|
10
|
+
:username => 'redhillonrails',
|
11
|
+
:encoding => 'utf8',
|
12
|
+
:socket => '/var/run/mysqld/mysqld.sock',
|
13
|
+
:min_messages => 'warning'
|
14
|
+
}
|
15
|
+
|
16
|
+
}
|
17
|
+
|
18
|
+
ActiveRecord::Base.establish_connection 'redhillonrails'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
print "Using PostgreSQL\n"
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
ActiveRecord::Base.logger = Logger.new("debug.log")
|
5
|
+
|
6
|
+
ActiveRecord::Base.configurations = {
|
7
|
+
'redhillonrails' => {
|
8
|
+
:adapter => 'postgresql',
|
9
|
+
:database => 'redhillonrails_core_test',
|
10
|
+
:min_messages => 'warning'
|
11
|
+
}
|
12
|
+
|
13
|
+
}
|
14
|
+
|
15
|
+
ActiveRecord::Base.establish_connection 'redhillonrails'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
print "Using SQLite3\n"
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
ActiveRecord::Base.logger = Logger.new("debug.log")
|
5
|
+
|
6
|
+
ActiveRecord::Base.configurations = {
|
7
|
+
'redhillonrails' => {
|
8
|
+
:adapter => 'sqlite3',
|
9
|
+
:database => File.expand_path(File.dirname(__FILE__) + 'redhillonrails_core.db')
|
10
|
+
}
|
11
|
+
|
12
|
+
}
|
13
|
+
|
14
|
+
ActiveRecord::Base.establish_connection 'redhillonrails'
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
require 'models/user'
|
4
|
+
require 'models/post'
|
5
|
+
require 'models/comment'
|
6
|
+
|
7
|
+
describe "Foreign Key" do
|
8
|
+
|
9
|
+
let(:migration) { ::ActiveRecord::Migration }
|
10
|
+
|
11
|
+
context "when is added", "posts(author_id)" do
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
add_foreign_key(:posts, :author_id, :users, :id, :on_update => :cascade, :on_delete => :restrict)
|
15
|
+
end
|
16
|
+
|
17
|
+
after(:each) do
|
18
|
+
fk = Post.foreign_keys.detect { |fk| fk.column_names == %w[author_id] }
|
19
|
+
remove_foreign_key(:posts, fk.name)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "references users(id)" do
|
23
|
+
Post.should reference(:users, :id).on(:author_id)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "cascades on update" do
|
27
|
+
Post.should reference(:users).on_update(:cascade)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "restricts on delete" do
|
31
|
+
Post.should reference(:users).on_delete(:restrict)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "is available in Post.foreign_keys" do
|
35
|
+
Post.foreign_keys.collect(&:column_names).should include(%w[author_id])
|
36
|
+
end
|
37
|
+
|
38
|
+
it "is available in User.reverse_foreign_keys" do
|
39
|
+
User.reverse_foreign_keys.collect(&:column_names).should include(%w[author_id])
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when is dropped", "comments(post_id)" do
|
45
|
+
|
46
|
+
let(:foreign_key_name) { Comment.foreign_keys.detect { |definition| definition.column_names == %w[post_id] }.name }
|
47
|
+
|
48
|
+
before(:each) do
|
49
|
+
remove_foreign_key(:comments, foreign_key_name)
|
50
|
+
end
|
51
|
+
|
52
|
+
after(:each) do
|
53
|
+
add_foreign_key(:comments, :post_id, :posts, :id)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "doesn't reference posts(id)" do
|
57
|
+
Comment.should_not reference(:posts).on(:post_id)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "is no longer available in Post.foreign_keys" do
|
61
|
+
Comment.foreign_keys.collect(&:column_names).should_not include(%w[post_id])
|
62
|
+
end
|
63
|
+
|
64
|
+
it "is no longer available in User.reverse_foreign_keys" do
|
65
|
+
Post.reverse_foreign_keys.collect(&:column_names).should_not include(%w[post_id])
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
context "when referencing column and column is removed" do
|
71
|
+
|
72
|
+
let(:foreign_key_name) { Comment.foreign_keys.detect { |definition| definition.column_names == %w[post_id] }.name }
|
73
|
+
|
74
|
+
it "should remove foreign keys" do
|
75
|
+
remove_foreign_key(:comments, foreign_key_name)
|
76
|
+
Post.reverse_foreign_keys.collect { |fk| fk.column_names == %w[post_id] && fk.table_name == "comments" }.should be_empty
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
protected
|
82
|
+
def add_foreign_key(*args)
|
83
|
+
migration.suppress_messages do
|
84
|
+
migration.add_foreign_key(*args)
|
85
|
+
end
|
86
|
+
User.reset_column_information
|
87
|
+
Post.reset_column_information
|
88
|
+
Comment.reset_column_information
|
89
|
+
end
|
90
|
+
|
91
|
+
def remove_foreign_key(*args)
|
92
|
+
migration.suppress_messages do
|
93
|
+
migration.remove_foreign_key(*args)
|
94
|
+
end
|
95
|
+
User.reset_column_information
|
96
|
+
Post.reset_column_information
|
97
|
+
Comment.reset_column_information
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|