schema_plus 0.4.1 → 1.0.0
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/.gitignore +3 -1
- data/.travis.yml +6 -9
- data/Gemfile +0 -4
- data/README.rdoc +168 -70
- data/Rakefile +58 -47
- data/gemfiles/rails-3.2/Gemfile.base +4 -0
- data/gemfiles/rails-3.2/Gemfile.mysql +4 -0
- data/gemfiles/rails-3.2/Gemfile.mysql2 +4 -0
- data/gemfiles/rails-3.2/Gemfile.postgresql +4 -0
- data/gemfiles/rails-3.2/Gemfile.sqlite3 +4 -0
- data/lib/schema_plus.rb +2 -0
- data/lib/schema_plus/active_record/column_options_handler.rb +73 -32
- data/lib/schema_plus/active_record/connection_adapters/abstract_adapter.rb +60 -31
- data/lib/schema_plus/active_record/connection_adapters/foreign_key_definition.rb +7 -2
- data/lib/schema_plus/active_record/connection_adapters/index_definition.rb +2 -1
- data/lib/schema_plus/active_record/connection_adapters/mysql_adapter.rb +19 -1
- data/lib/schema_plus/active_record/connection_adapters/postgresql_adapter.rb +68 -17
- data/lib/schema_plus/active_record/connection_adapters/sqlite3_adapter.rb +28 -3
- data/lib/schema_plus/active_record/connection_adapters/table_definition.rb +27 -1
- data/lib/schema_plus/active_record/db_default.rb +19 -0
- data/lib/schema_plus/active_record/foreign_keys.rb +40 -32
- data/lib/schema_plus/active_record/schema_dumper.rb +7 -3
- data/lib/schema_plus/version.rb +1 -1
- data/runspecs +5 -8
- data/schema_plus.gemspec +2 -5
- data/spec/column_definition_spec.rb +18 -1
- data/spec/column_spec.rb +39 -2
- data/spec/connection_spec.rb +1 -1
- data/spec/connections/mysql/connection.rb +1 -1
- data/spec/connections/mysql2/connection.rb +1 -1
- data/spec/connections/postgresql/connection.rb +1 -1
- data/spec/foreign_key_definition_spec.rb +0 -4
- data/spec/foreign_key_spec.rb +37 -13
- data/spec/index_definition_spec.rb +54 -2
- data/spec/index_spec.rb +59 -15
- data/spec/migration_spec.rb +336 -85
- data/spec/multiple_schemas_spec.rb +127 -0
- data/spec/schema_dumper_spec.rb +65 -25
- data/spec/schema_spec.rb +16 -18
- data/spec/spec_helper.rb +19 -18
- data/spec/support/matchers/reference.rb +7 -1
- data/spec/views_spec.rb +5 -2
- metadata +43 -54
- data/gemfiles/Gemfile.rails-2.3 +0 -6
- data/gemfiles/Gemfile.rails-2.3.lock +0 -65
- data/gemfiles/Gemfile.rails-3.0 +0 -5
- data/gemfiles/Gemfile.rails-3.0.lock +0 -113
- data/gemfiles/Gemfile.rails-3.1 +0 -5
- data/gemfiles/Gemfile.rails-3.1.lock +0 -123
- data/gemfiles/Gemfile.rails-3.2 +0 -5
- data/gemfiles/Gemfile.rails-3.2.lock +0 -121
- data/spec/models/comment.rb +0 -2
- data/spec/models/post.rb +0 -2
- data/spec/models/user.rb +0 -2
- data/spec/rails3_migration_spec.rb +0 -144
@@ -16,6 +16,30 @@ module SchemaPlus
|
|
16
16
|
|
17
17
|
# :enddoc:
|
18
18
|
|
19
|
+
def self.included(base)
|
20
|
+
base.class_eval do
|
21
|
+
alias_method_chain :indexes, :schema_plus
|
22
|
+
alias_method_chain :rename_table, :schema_plus
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def indexes_with_schema_plus(table_name, name = nil)
|
27
|
+
indexes = indexes_without_schema_plus(table_name, name)
|
28
|
+
exec_query("SELECT name, sql FROM sqlite_master WHERE type = 'index'").map do |row|
|
29
|
+
if (desc_columns = row['sql'].scan(/['"`]?(\w+)['"`]? DESC\b/).flatten).any?
|
30
|
+
index = indexes.detect{ |i| i.name == row['name'] }
|
31
|
+
index.orders = Hash[index.columns.map {|column| [column, desc_columns.include?(column) ? :desc : :asc]}]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
indexes
|
35
|
+
end
|
36
|
+
|
37
|
+
def rename_table_with_schema_plus(oldname, newname) #:nodoc:
|
38
|
+
rename_table_without_schema_plus(oldname, newname)
|
39
|
+
rename_indexes_and_foreign_keys(oldname, newname)
|
40
|
+
end
|
41
|
+
|
42
|
+
|
19
43
|
def add_foreign_key(table_name, column_names, references_table_name, references_column_names, options = {})
|
20
44
|
raise NotImplementedError, "Sqlite3 does not support altering a table to add foreign key constraints (table #{table_name.inspect} column #{column_names.inspect})"
|
21
45
|
end
|
@@ -54,7 +78,8 @@ module SchemaPlus
|
|
54
78
|
SQL
|
55
79
|
|
56
80
|
re = %r[
|
57
|
-
\
|
81
|
+
\b(CONSTRAINT\s+(\S+)\s+)?
|
82
|
+
FOREIGN\s+KEY\s* \(\s*[`"](.+?)[`"]\s*\)
|
58
83
|
\s*REFERENCES\s*[`"](.+?)[`"]\s*\((.+?)\)
|
59
84
|
(\s+ON\s+UPDATE\s+(.+?))?
|
60
85
|
(\s*ON\s+DELETE\s+(.+?))?
|
@@ -64,13 +89,13 @@ module SchemaPlus
|
|
64
89
|
foreign_keys = []
|
65
90
|
results.each do |row|
|
66
91
|
table_name = row["name"]
|
67
|
-
row["sql"].scan(re).each do |column_names, references_table_name, references_column_names, d1, on_update, d2, on_delete|
|
92
|
+
row["sql"].scan(re).each do |d0, name, column_names, references_table_name, references_column_names, d1, on_update, d2, on_delete|
|
68
93
|
column_names = column_names.gsub('`', '').split(', ')
|
69
94
|
|
70
95
|
references_column_names = references_column_names.gsub('`"', '').split(', ')
|
71
96
|
on_update = on_update ? on_update.downcase.gsub(' ', '_').to_sym : :no_action
|
72
97
|
on_delete = on_delete ? on_delete.downcase.gsub(' ', '_').to_sym : :no_action
|
73
|
-
foreign_keys << ForeignKeyDefinition.new(
|
98
|
+
foreign_keys << ForeignKeyDefinition.new(name,
|
74
99
|
table_name, column_names,
|
75
100
|
references_table_name, references_column_names,
|
76
101
|
on_update, on_delete)
|
@@ -44,7 +44,7 @@ module SchemaPlus::ActiveRecord::ConnectionAdapters
|
|
44
44
|
# end
|
45
45
|
#
|
46
46
|
# create_table :posts do |t| # Dryest
|
47
|
-
# t.integer :author_id, :
|
47
|
+
# t.integer :author_id, :foreign_key => true
|
48
48
|
# end
|
49
49
|
#
|
50
50
|
# <b>NOTE:</b> In the standard configuration, SchemaPlus automatically
|
@@ -144,5 +144,31 @@ module SchemaPlus::ActiveRecord::ConnectionAdapters
|
|
144
144
|
foreign_key(*args)
|
145
145
|
end
|
146
146
|
|
147
|
+
# This is a deliberately empty stub. The reason for it is that
|
148
|
+
# ColumnOptionsHandler is used for changes as well as for table
|
149
|
+
# definitions, and in the case of changes, previously existing foreign
|
150
|
+
# keys sometimes need to be removed. but in the case here, that of
|
151
|
+
# table definitions, the only reason a foreign key would exist is
|
152
|
+
# because we're redefining a table that already exists (via :force =>
|
153
|
+
# true). in which case the foreign key will get dropped when the
|
154
|
+
# drop_table gets emitted, so no need to do it immediately. (and for
|
155
|
+
# sqlite3, attempting to do it immediately would raise an error).
|
156
|
+
def remove_foreign_key(_, *args) #:nodoc:
|
157
|
+
end
|
158
|
+
|
159
|
+
# This is a deliberately empty stub. In fact, verifying that it won't
|
160
|
+
# ever be called. The reason for it is that ColumnOptionsHandler will
|
161
|
+
# remove a previous index when changing a column. But we don't do
|
162
|
+
# column changes within table definitions.
|
163
|
+
def remove_index(_, options) raise "InternalError: remove_index called in a table definition" ; end
|
164
|
+
|
165
|
+
# Determines if an indexes is queued to be created. Called from
|
166
|
+
# ColumnOptionsHandler as part of checking whether to auto-create an index
|
167
|
+
def index_exists?(_, column_name, options={})
|
168
|
+
@indexes.find{|index| index.table == self.name && index.columns == Array.wrap(column_name) && options.all?{|k, v| index.send(k) == v}}
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
|
147
173
|
end
|
148
174
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module SchemaPlus
|
4
|
+
module ActiveRecord
|
5
|
+
class DbDefault
|
6
|
+
include Singleton
|
7
|
+
def to_s
|
8
|
+
'DEFAULT'
|
9
|
+
end
|
10
|
+
def id
|
11
|
+
self
|
12
|
+
end
|
13
|
+
def quoted_id
|
14
|
+
self
|
15
|
+
end
|
16
|
+
end
|
17
|
+
DB_DEFAULT = DbDefault.instance
|
18
|
+
end
|
19
|
+
end
|
@@ -33,20 +33,35 @@ module SchemaPlus::ActiveRecord
|
|
33
33
|
#
|
34
34
|
# == Foreign Key Constraints
|
35
35
|
#
|
36
|
-
# The +:
|
37
|
-
#
|
36
|
+
# The +:foreign_key+ option controls creation of foreign key
|
37
|
+
# constraints. Specifying +true+ or an empty hash defines a foreign
|
38
|
+
# key with default values. In particular, the foreign table name
|
39
|
+
# defaults to the column name, with trailing +_id+ removed, pluralized;
|
40
|
+
# And the foreign column name defaults to +:id+
|
38
41
|
#
|
39
|
-
# add_column('widgets', 'color', :integer, :
|
42
|
+
# add_column('widgets', 'color', :integer, :foreign_key => true)
|
43
|
+
#
|
44
|
+
# is equivalent to
|
45
|
+
#
|
46
|
+
# add_column('widgets', 'color_id', :integer)
|
47
|
+
# add_foreign_key('widgets', 'color_id', 'colors', 'id')
|
48
|
+
#
|
49
|
+
# As a special case, if the column is named 'parent_id', SchemaPlus
|
50
|
+
# assumes it's a self reference, for a record that acts as a node of
|
51
|
+
# a tree. Thus, these are equivalent:
|
52
|
+
#
|
53
|
+
# add_column('sections', 'parent_id', :integer, :foreign_key => true)
|
40
54
|
#
|
41
55
|
# is equivalent to
|
42
56
|
#
|
43
|
-
# add_column('
|
44
|
-
# add_foreign_key('
|
57
|
+
# add_column('sections', 'parent_id', :integer)
|
58
|
+
# add_foreign_key('sections', 'parent_id', 'sections', 'id')
|
45
59
|
#
|
46
|
-
#
|
47
|
-
#
|
60
|
+
# A different foreign table name can be specified using
|
61
|
+
# <tt>:foreign_key => { :references => table_name }</tt>, and
|
62
|
+
# a different column name can also be specified using <tt>:foreign_key => { :references => [table_name,column_name] }</tt>
|
48
63
|
#
|
49
|
-
# Additional options +:on_update+ and +:on_delete+ can be
|
64
|
+
# Additional options +:on_update+ and +:on_delete+ can be specified,
|
50
65
|
# with values as described at ConnectionAdapters::ForeignKeyDefinition. For example:
|
51
66
|
#
|
52
67
|
# add_column('comments', 'post', :integer, :references => 'posts', :on_delete => :cascade)
|
@@ -54,34 +69,35 @@ module SchemaPlus::ActiveRecord
|
|
54
69
|
# Global default values for +:on_update+ and +:on_delete+ can be
|
55
70
|
# specified in SchemaPlus.steup via, e.g., <tt>config.foreign_keys.on_update = :cascade</tt>
|
56
71
|
#
|
72
|
+
# The constraint will have an automatic default name, but you can
|
73
|
+
# specify a constraint name using <tt>:foreign_key => { :name => "my_name" }</tt>
|
74
|
+
#
|
57
75
|
# == Automatic Foreign Key Constraints
|
58
76
|
#
|
59
77
|
# SchemaPlus supports the convention of naming foreign key columns
|
60
78
|
# with a suffix of +_id+. That is, if you define a column suffixed
|
61
|
-
# with +_id+, SchemaPlus assumes
|
62
|
-
#
|
63
|
-
# these are equivalent:
|
79
|
+
# with +_id+, SchemaPlus assumes that you want a foreign key constraint
|
80
|
+
# with default paramters. Thus, these two are equivalent:
|
64
81
|
#
|
65
82
|
# add_column('posts', 'author_id', :integer)
|
66
|
-
# add_column('posts', 'author_id', :integer, :
|
67
|
-
#
|
68
|
-
# As a special case, if the column is named 'parent_id', SchemaPlus
|
69
|
-
# assumes it's a self reference, for a record that acts as a node of
|
70
|
-
# a tree. Thus, these are equivalent:
|
71
|
-
#
|
72
|
-
# add_column('sections', 'parent_id', :integer)
|
73
|
-
# add_column('sections', 'parent_id', :integer, :references => 'sections')
|
74
|
-
#
|
75
|
-
# If the implicit +:references+ value isn't what you want (e.g., the
|
76
|
-
# table name isn't pluralized), you can explicitly specify
|
77
|
-
# +:references+ and it will override the implicit value.
|
83
|
+
# add_column('posts', 'author_id', :integer, :foreign_key => true)
|
78
84
|
#
|
79
85
|
# If you don't want a foreign key constraint to be created, specify
|
80
|
-
# <tt>:
|
86
|
+
# <tt>:foreign_key => false</tt>.
|
81
87
|
# To disable automatic foreign key constraint creation globally, set
|
82
88
|
# <tt>config.foreign_keys.auto_create = false</tt> in
|
83
89
|
# SchemaPlus.steup.
|
84
90
|
#
|
91
|
+
# == Shortcut options
|
92
|
+
#
|
93
|
+
# As a shortcut (and for backwards compatibility), the options
|
94
|
+
# +:references+, +:on_update+, and +:on_delete+ can provided to
|
95
|
+
# +add_column+ directly instead of within a +:foreign_key+ hash.
|
96
|
+
#
|
97
|
+
# The presence of option +:references+ implies the foreign
|
98
|
+
# key should be created, while <tt>:references => nil</tt> is a
|
99
|
+
# shortcut for <tt>:foreign_key => false</tt>
|
100
|
+
#
|
85
101
|
# == Automatic Foreign Key Indexes
|
86
102
|
#
|
87
103
|
# Since efficient use of foreign key constraints requires that the
|
@@ -112,16 +128,8 @@ module SchemaPlus::ActiveRecord
|
|
112
128
|
# Enhances ActiveRecord::Migration#change_column to support indexes and foreign keys same as add_column.
|
113
129
|
def change_column(table_name, column_name, type, options = {})
|
114
130
|
super
|
115
|
-
remove_foreign_key_if_exists(table_name, column_name)
|
116
131
|
schema_plus_handle_column_options(table_name, column_name, options)
|
117
132
|
end
|
118
133
|
|
119
|
-
protected
|
120
|
-
def remove_foreign_key_if_exists(table_name, column_name) #:nodoc:
|
121
|
-
foreign_keys = ActiveRecord::Base.connection.foreign_keys(table_name.to_s)
|
122
|
-
fk = foreign_keys.detect { |fk| fk.table_name == table_name.to_s && fk.column_names == Array(column_name).collect(&:to_s) }
|
123
|
-
remove_foreign_key(table_name, fk.name) if fk
|
124
|
-
end
|
125
|
-
|
126
134
|
end
|
127
135
|
end
|
@@ -64,7 +64,10 @@ module SchemaPlus
|
|
64
64
|
@inline_fks[table] = @connection.foreign_keys(table)
|
65
65
|
dependencies = @inline_fks[table].collect(&:references_table_name)
|
66
66
|
end
|
67
|
-
@
|
67
|
+
# select against @table_dumps keys to respect filtering based on
|
68
|
+
# SchemaDumper.ignore_tables (which was taken into account
|
69
|
+
# increate @table_dumps)
|
70
|
+
@dump_dependencies[table] = dependencies.sort.uniq.select {|name| @table_dumps.has_key? name}
|
68
71
|
end
|
69
72
|
|
70
73
|
# Normally we dump foreign key constraints inline in the table
|
@@ -101,7 +104,7 @@ module SchemaPlus
|
|
101
104
|
stream_string = stream.string
|
102
105
|
@connection.columns(table).each do |column|
|
103
106
|
if !column.default_expr.nil?
|
104
|
-
stream_string.gsub!("\"#{column.name}\"", "\"#{column.name}\", :default => { :expr =>
|
107
|
+
stream_string.gsub!("\"#{column.name}\"", "\"#{column.name}\", :default => { :expr => #{column.default_expr.inspect} }")
|
105
108
|
end
|
106
109
|
end
|
107
110
|
@table_dumps[table] = stream_string
|
@@ -123,6 +126,7 @@ module SchemaPlus
|
|
123
126
|
dump << ", :conditions => #{index.conditions.inspect}" unless index.conditions.blank?
|
124
127
|
index_lengths = index.lengths.compact if index.lengths.is_a?(Array)
|
125
128
|
dump << ", :length => #{Hash[*index.columns.zip(index.lengths).flatten].inspect}" if index_lengths.present?
|
129
|
+
dump << ", :order => {" + index.columns.map{|column| column.inspect + " => " + (index.orders[column] || :asc).inspect}.join(", ") + "}" if index.orders
|
126
130
|
else
|
127
131
|
dump << " :name => #{index.name.inspect}"
|
128
132
|
dump << ", :kind => \"#{index.kind}\"" unless index.kind.blank?
|
@@ -133,7 +137,7 @@ module SchemaPlus
|
|
133
137
|
end
|
134
138
|
|
135
139
|
def dump_foreign_keys(foreign_keys, opts={}) #:nodoc:
|
136
|
-
foreign_keys.collect{ |foreign_key| " " + foreign_key.to_dump(:inline => opts[:inline]) }.join
|
140
|
+
foreign_keys.collect{ |foreign_key| " " + foreign_key.to_dump(:inline => opts[:inline]) }.sort.join
|
137
141
|
end
|
138
142
|
end
|
139
143
|
end
|
data/lib/schema_plus/version.rb
CHANGED
data/runspecs
CHANGED
@@ -4,8 +4,8 @@ require 'optparse'
|
|
4
4
|
require 'ostruct'
|
5
5
|
require 'tempfile'
|
6
6
|
|
7
|
-
RUBY_VERSIONS = %W[1.
|
8
|
-
RAILS_VERSIONS = %W[
|
7
|
+
RUBY_VERSIONS = %W[1.9.2 1.9.3]
|
8
|
+
RAILS_VERSIONS = %W[3.2]
|
9
9
|
DB_ADAPTERS = %W[postgresql mysql mysql2 sqlite3]
|
10
10
|
|
11
11
|
o = OpenStruct.new
|
@@ -58,13 +58,9 @@ end.parse!
|
|
58
58
|
Combo = Struct.new(:ruby, :rails, :db_adapter)
|
59
59
|
|
60
60
|
|
61
|
-
if o.update or o.install
|
62
|
-
o.db_adapters = [nil]
|
63
|
-
end
|
64
|
-
|
65
61
|
combos = o.ruby_versions.product(o.rails_versions, o.db_adapters).map{|product| Combo.new(*product)}.select {|combo|
|
66
62
|
case
|
67
|
-
when combo.rails >= "3.2" && combo.ruby <= "1.8.7" then false
|
63
|
+
when combo.rails >= "3.2" && combo.ruby <= "1.8.7" then false # no longer happens, just keeping it as an example
|
68
64
|
else true
|
69
65
|
end
|
70
66
|
}
|
@@ -86,7 +82,7 @@ combos.each_with_index do |combo, n|
|
|
86
82
|
"bundle exec rake #{db_adapter}:spec"
|
87
83
|
end
|
88
84
|
|
89
|
-
command = %Q{BUNDLE_GEMFILE="#{File.join(GEMFILES_DIR, "
|
85
|
+
command = %Q{BUNDLE_GEMFILE="#{File.join(GEMFILES_DIR, "rails-#{rails}", "Gemfile.#{db_adapter}")}" rvm #{ruby} do #{cmd}}
|
90
86
|
|
91
87
|
puts "\n\n*** ruby version #{ruby} - rails version #{rails} - db adapter: #{db_adapter} [#{n+1} of #{combos.size}]\n\n#{command}"
|
92
88
|
|
@@ -99,3 +95,4 @@ combos.each_with_index do |combo, n|
|
|
99
95
|
end
|
100
96
|
end
|
101
97
|
puts errs.any? ? "\n*** #{errs.size} failures:\n\t#{errs.join("\n\t")}" : "\n*** #{combos.size > 1 ? 'all versions' : 'spec'} succeeded ***" unless o.dry_run
|
98
|
+
exit !errs.any?
|
data/schema_plus.gemspec
CHANGED
@@ -20,14 +20,11 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
21
|
s.require_paths = ["lib"]
|
22
22
|
|
23
|
-
s.add_dependency("rails")
|
23
|
+
s.add_dependency("rails", ">= 3.2")
|
24
24
|
s.add_dependency("valuable")
|
25
25
|
|
26
|
-
s.add_development_dependency("rake"
|
26
|
+
s.add_development_dependency("rake")
|
27
27
|
s.add_development_dependency("rspec")
|
28
|
-
s.add_development_dependency("pg")
|
29
|
-
s.add_development_dependency("mysql")
|
30
|
-
s.add_development_dependency("sqlite3")
|
31
28
|
s.add_development_dependency("simplecov")
|
32
29
|
s.add_development_dependency("simplecov-gem-adapter")
|
33
30
|
end
|
@@ -3,7 +3,24 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
|
4
4
|
describe "Column definition" do
|
5
5
|
before(:all) do
|
6
|
-
|
6
|
+
define_schema(:auto_create => false) do
|
7
|
+
create_table :users, :force => true do |t|
|
8
|
+
t.string :login
|
9
|
+
t.datetime :deleted_at
|
10
|
+
end
|
11
|
+
|
12
|
+
create_table :posts, :force => true do |t|
|
13
|
+
t.text :body
|
14
|
+
t.integer :user_id
|
15
|
+
t.integer :author_id
|
16
|
+
end
|
17
|
+
|
18
|
+
create_table :comments, :force => true do |t|
|
19
|
+
t.text :body
|
20
|
+
t.integer :post_id
|
21
|
+
t.foreign_key :post_id, :posts, :id
|
22
|
+
end
|
23
|
+
end
|
7
24
|
end
|
8
25
|
|
9
26
|
let(:connection) { ActiveRecord::Base.connection }
|
data/spec/column_spec.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
require 'models/user'
|
4
|
-
|
5
3
|
describe "Column" do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
class User < ::ActiveRecord::Base ; end
|
7
|
+
end
|
8
|
+
|
6
9
|
let(:migration) { ::ActiveRecord::Migration }
|
7
10
|
|
8
11
|
context "regarding indexes" do
|
@@ -82,6 +85,40 @@ describe "Column" do
|
|
82
85
|
|
83
86
|
end
|
84
87
|
|
88
|
+
context "using DB_DEFAULT" do
|
89
|
+
|
90
|
+
before(:each) do
|
91
|
+
create_table(User, :alpha => { :default => "gabba" }, :beta => {})
|
92
|
+
end
|
93
|
+
|
94
|
+
if SchemaPlusHelpers.sqlite3?
|
95
|
+
it "creating a record should raise an error" do
|
96
|
+
expect { User.create!(:alpha => ActiveRecord::DB_DEFAULT, :beta => "hello") }.to raise_error ActiveRecord::StatementInvalid
|
97
|
+
end
|
98
|
+
it "updating a record should raise an error" do
|
99
|
+
u = User.create!(:alpha => "hey", :beta => "hello")
|
100
|
+
expect { u.update_attributes(:alpha => ActiveRecord::DB_DEFAULT, :beta => "goodbye") }.to raise_error ActiveRecord::StatementInvalid
|
101
|
+
end
|
102
|
+
else
|
103
|
+
|
104
|
+
it "creating a record should respect default expression" do
|
105
|
+
User.create!(:alpha => ActiveRecord::DB_DEFAULT, :beta => "hello")
|
106
|
+
User.last.alpha.should == "gabba"
|
107
|
+
User.last.beta.should == "hello"
|
108
|
+
end
|
109
|
+
|
110
|
+
it "updating a record should respect default expression" do
|
111
|
+
u = User.create!(:alpha => "hey", :beta => "hello")
|
112
|
+
u.reload
|
113
|
+
u.alpha.should == "hey"
|
114
|
+
u.beta.should == "hello"
|
115
|
+
u.update_attributes(:alpha => ActiveRecord::DB_DEFAULT, :beta => "goodbye")
|
116
|
+
u.reload
|
117
|
+
u.alpha.should == "gabba"
|
118
|
+
u.beta.should == "goodbye"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
85
122
|
|
86
123
|
protected
|
87
124
|
|
data/spec/connection_spec.rb
CHANGED
@@ -6,7 +6,7 @@ ActiveRecord::Base.logger = Logger.new(File.open("mysql.log", "w"))
|
|
6
6
|
ActiveRecord::Base.configurations = {
|
7
7
|
'schema_plus' => {
|
8
8
|
:adapter => 'mysql',
|
9
|
-
:database => '
|
9
|
+
:database => 'schema_plus_test',
|
10
10
|
:username => ENV.fetch('MYSQL_DB_USER', 'schema_plus'),
|
11
11
|
:encoding => 'utf8',
|
12
12
|
:min_messages => 'warning'
|
@@ -6,7 +6,7 @@ ActiveRecord::Base.logger = Logger.new(File.open("mysql2.log", "w"))
|
|
6
6
|
ActiveRecord::Base.configurations = {
|
7
7
|
'schema_plus' => {
|
8
8
|
:adapter => 'mysql2',
|
9
|
-
:database => '
|
9
|
+
:database => 'schema_plus_test',
|
10
10
|
:username => ENV.fetch('MYSQL_DB_USER', 'schema_plus'),
|
11
11
|
:encoding => 'utf8',
|
12
12
|
:min_messages => 'warning'
|