schema_plus 1.5.2 → 1.5.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 020e3e1c91dcc48f913fa638609354eb5a79e38b
4
- data.tar.gz: f14c7627f58133d2f6471dadd5833b05e5ca5119
3
+ metadata.gz: 98695abbf9f44e746dda323f7312d0b206b74b33
4
+ data.tar.gz: f9402bff3980025c1f6a1b6e052f9ec1cf0f2bfe
5
5
  SHA512:
6
- metadata.gz: 81abbdb298150d9b7939c4099c25d1f61ffab212e1aa98a8cd65f5fee4eb9254d960d1463883c0401ff6f5219dfa90e9e4b179806d13237d6992f6e712c1807d
7
- data.tar.gz: e6dae4e417d11adc36730be4e6b7a4ca98dc03c664bc3a65408162db64f0406afb6cff0108b37ce35cb871356745650bf376a6fd52ccba2a34ba28ed65b94faf
6
+ metadata.gz: 1ac7c8fb9f854adb5bd455b19e93427829dffab2ceccbf59044116f1bdee8783acb5d98ede537a9af118e1d44a7872e306700e8ae9f4153c4d523ba7c4da4803
7
+ data.tar.gz: 521da3cda682a2ab9dc0126a093c3f6b21e5a49a19d7dded7662a5c7d8729671f9a71aa672e01150d4078cf2b076d20974a7a41e825a4616f7c5fae3386bcb72
data/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## Change Log
4
4
 
5
+ ### 1.5.3
6
+
7
+ * No longer limited to rails 4.1.1 (issue #159)
8
+ * Bug fix: multiple competing indexes created for `t.references... index: :unique` (issue #157)
9
+ * Now works with rspec 3 (thanks to [@robababa](https://github.com/robababa) (issue #160)
10
+ * Improvements to ./runspecs (thanks to [@robababa](https://github.com/robababa) (issue #162)
11
+
5
12
  ### 1.5.2
6
13
 
7
14
  * For now, pin to rspec 2.* and limit rails to 4.1.1 (issue #158)
data/README.md CHANGED
@@ -17,7 +17,7 @@ For added rails DRYness see also the gems
17
17
 
18
18
  SchemaPlus supports all combinations of:
19
19
 
20
- * Rails/ActiveRecord 3.2, 4.0, and 4.1 (currently 4.1.1)
20
+ * Rails/ActiveRecord 3.2, 4.0, and 4.1
21
21
  * PostgreSQL, MySQL (using mysql2 gem; mysql gem only supported with Rails
22
22
  3.2), or SQLite3 (using sqlite3 >= 3.7.7 which has foreign key support)
23
23
  * MRI Ruby 1.9.3, 2.0.0, or 2.1.0
@@ -1,3 +1,3 @@
1
1
  eval File.read File.expand_path('../../Gemfile.base', __FILE__)
2
2
 
3
- gem "rails", ">= 4.1.0.beta1", "<= 4.1.1"
3
+ gem "rails", ">= 4.1.0.beta1"
@@ -14,6 +14,7 @@ module SchemaPlus::ActiveRecord
14
14
 
15
15
  # create index if requested explicity or implicitly due to auto_index
16
16
  index = column_options[:index]
17
+ index = column_options[:_index] if column_options.include? :_index
17
18
  if index.nil? and fk_args && config.foreign_keys.auto_index?
18
19
  index = { :name => auto_index_name(table_name, column_name) }
19
20
  end
@@ -55,7 +55,7 @@ module SchemaPlus
55
55
  # The default as_jon includes all instance variables. but
56
56
  # @model can't be dumped (it contains circular references)
57
57
  def as_json(options=nil)
58
- instance_values.except "model"
58
+ instance_values.except "model", "adapter"
59
59
  end
60
60
  end
61
61
  end
@@ -11,6 +11,7 @@ module SchemaPlus::ActiveRecord::ConnectionAdapters
11
11
 
12
12
  def add_reference_with_schema_plus(table_name, ref_name, options = {}) #:nodoc:
13
13
  options[:references] = nil if options[:polymorphic]
14
+ options[:_index] = options.delete(:index) unless options[:polymorphic] # usurp index creation from AR
14
15
  add_reference_without_schema_plus(table_name, ref_name, options)
15
16
  end
16
17
 
@@ -109,6 +109,7 @@ module SchemaPlus::ActiveRecord::ConnectionAdapters
109
109
  def references_with_schema_plus(*args) #:nodoc:
110
110
  options = args.extract_options!
111
111
  options[:references] = nil if options[:polymorphic]
112
+ options[:_index] = options.delete(:index) unless options[:polymorphic] # usurp index creation from AR
112
113
  args << options
113
114
  references_without_schema_plus(*args)
114
115
  end
@@ -118,6 +119,7 @@ module SchemaPlus::ActiveRecord::ConnectionAdapters
118
119
  def belongs_to_with_schema_plus(*args) #:nodoc:
119
120
  options = args.extract_options!
120
121
  options[:references] = nil if options[:polymorphic]
122
+ options[:_index] = options.delete(:index) unless options[:polymorphic] # usurp index creation from AR
121
123
  args << options
122
124
  belongs_to_without_schema_plus(*args)
123
125
  end
@@ -1,3 +1,3 @@
1
1
  module SchemaPlus
2
- VERSION = "1.5.2"
2
+ VERSION = "1.5.3"
3
3
  end
data/runspecs CHANGED
@@ -89,8 +89,8 @@ else
89
89
  # rbenv, we already have various environment variables set up. need
90
90
  # strip those out so that the forked shell can run a diifferent ruby
91
91
  # version than the one we're in now.
92
- ENV['PATH'] = ENV['PATH'].split(':').reject{|dir| dir =~ %r{/rbenv/(?!shims)}}.join(':')
93
- ENV['GEM_PATH'] = ENV['GEM_PATH'].split(':').reject{|dir| dir =~ %r{/rbenv}}.join(':')
92
+ ENV['PATH'] = ENV['PATH'].split(':').reject{|dir| dir =~ %r{/\.?rbenv/(?!shims)}}.join(':')
93
+ ENV['GEM_PATH'] = ENV['GEM_PATH'].split(':').reject{|dir| dir =~ %r{/\.?rbenv}}.join(':') unless ENV['GEM_PATH'].nil?
94
94
  ENV['RBENV_DIR'] = nil
95
95
  ENV['RBENV_HOOK_PATH'] = nil
96
96
 
data/schema_plus.gemspec CHANGED
@@ -21,13 +21,13 @@ Gem::Specification.new do |s|
21
21
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
22
  s.require_paths = ["lib"]
23
23
 
24
- s.add_dependency("activerecord", ">= 3.2", "<= 4.1.1")
24
+ s.add_dependency("activerecord", ">= 3.2")
25
25
  s.add_dependency("valuable")
26
26
 
27
27
  s.add_development_dependency("rake")
28
- s.add_development_dependency("rspec", "< 2.99")
28
+ s.add_development_dependency("rspec", "~> 3.0.0")
29
29
  s.add_development_dependency("rdoc")
30
30
  s.add_development_dependency("simplecov")
31
- s.add_development_dependency("simplecov-gem-adapter")
31
+ s.add_development_dependency("simplecov-gem-profile")
32
32
  end
33
33
 
@@ -0,0 +1,156 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+
4
+ describe "Column definition" do
5
+ before(:each) do
6
+ define_schema(:auto_create => true) do
7
+ create_table :models, :force => true do |t|
8
+ end
9
+ end
10
+ class Model < ::ActiveRecord::Base ; end
11
+ end
12
+
13
+ subject {
14
+ Model.connection.execute("INSERT INTO models (dummy) values (1)")
15
+ Model.last.reload.test_column
16
+ }
17
+
18
+ context "text columns" do
19
+
20
+ before(:each) do
21
+ @nowish = /(#{Time.now.utc.to_s.sub(/:[^:]+$/, '')}|#{Time.now.to_s.sub(/:[^:]+$/,'')}).*/
22
+ end
23
+
24
+ context "just default passed" do
25
+ before(:each) do
26
+ define_test_column(:string, :default => "2011-12-11 00:00:00")
27
+ end
28
+
29
+ it "should use the normal default" do
30
+ is_expected.to eq "2011-12-11 00:00:00"
31
+ end
32
+ end
33
+
34
+ context "just default passed in hash" do
35
+ before(:each) do
36
+ define_test_column(:string, :default => { :value => "2011-12-11 00:00:00" })
37
+ end
38
+
39
+ it "should use the normal default" do
40
+ is_expected.to eq "2011-12-11 00:00:00"
41
+ end
42
+ end
43
+
44
+ context "default passed with no nulls" do
45
+ before(:each) do
46
+ define_test_column(:string, :default => "2011-12-11 00:00:00", null: false)
47
+ end
48
+
49
+ it "should use the normal default" do
50
+ is_expected.to eq "2011-12-11 00:00:00"
51
+ end
52
+ end
53
+
54
+ context "default passed in hash with no nulls" do
55
+ before(:each) do
56
+ define_test_column(:string, :default => { :value => "2011-12-11 00:00:00" }, null: false)
57
+ end
58
+
59
+ it "should use the normal default" do
60
+ is_expected.to eq "2011-12-11 00:00:00"
61
+ end
62
+ end
63
+
64
+ context "default function passed as :now" do
65
+ before(:each) do
66
+ begin
67
+ define_test_column(:string, :default => :now)
68
+ rescue ArgumentError => e
69
+ @raised_argument_error = e
70
+ end
71
+ end
72
+
73
+ if SchemaPlusHelpers.mysql?
74
+ it "should raise an error" do
75
+ expect(@raised_argument_error).to be_a ArgumentError
76
+ end
77
+ else
78
+ it "should use NOW() as the default" do
79
+ is_expected.to match @nowish
80
+ end
81
+ end
82
+ end
83
+
84
+ context "default function passed as now with no nulls" do
85
+ before(:each) do
86
+ begin
87
+ define_test_column(:string, :default => :now, null: false)
88
+ rescue ArgumentError => e
89
+ @raised_argument_error = e
90
+ end
91
+ end
92
+
93
+ if SchemaPlusHelpers.mysql?
94
+ it "should raise an error" do
95
+ expect(@raised_argument_error).to be_a ArgumentError
96
+ end
97
+ else
98
+ it "should use NOW() as the default" do
99
+ is_expected.to match @nowish
100
+ end
101
+ end
102
+ end
103
+
104
+ context "valid expr passed as default" do
105
+ if SchemaPlusHelpers.mysql?
106
+ it "raises an error" do
107
+ expect {
108
+ define_test_column(:string, :default => { :expr => "(replace('THIS IS A TEST', 'TEST', 'DOG'))" })
109
+ }.to raise_error ArgumentError
110
+ end
111
+ else
112
+ it "uses the expression" do
113
+ define_test_column(:string, :default => { :expr => "(replace('THIS IS A TEST', 'TEST', 'DOG'))" })
114
+ is_expected.to eq "THIS IS A DOG"
115
+ end
116
+ end
117
+ end
118
+
119
+ end
120
+
121
+ context "boolean column" do
122
+
123
+ context "passed as boolean false" do
124
+ before(:each) do
125
+ define_test_column :boolean, :default => false
126
+ end
127
+
128
+ it "should give the default as false" do
129
+ is_expected.to eq false
130
+ end
131
+ end
132
+
133
+ context "passed as boolean true" do
134
+ before(:each) do
135
+ define_test_column :boolean, :default => true
136
+ end
137
+
138
+ it "should give the default as true" do
139
+ is_expected.to eq true
140
+ end
141
+ end
142
+ end
143
+
144
+ private
145
+
146
+ def define_test_column(type, *args)
147
+ ActiveRecord::Migration.suppress_messages do
148
+ ActiveRecord::Migration.create_table Model.table_name, :force => true do |t|
149
+ t.send type, :test_column, *args
150
+ t.integer :dummy
151
+ end
152
+ end
153
+ Model.reset_column_information
154
+ @column = Model.columns.first()
155
+ end
156
+ end
data/spec/column_spec.rb CHANGED
@@ -14,7 +14,7 @@ describe "Column" do
14
14
  @login = User.columns.find{|column| column.name == "login"}
15
15
  end
16
16
  it "works properly" do
17
- JSON.parse(@login.to_json).should include("name" => "login", "type" => "string")
17
+ expect(JSON.parse(@login.to_json)).to include("name" => "login", "type" => "string")
18
18
  end
19
19
  end
20
20
 
@@ -28,12 +28,12 @@ describe "Column" do
28
28
  end
29
29
 
30
30
  it "should report not unique" do
31
- @login.should_not be_unique
31
+ expect(@login).not_to be_unique
32
32
  end
33
33
 
34
34
  it "should report nil unique scope" do
35
35
  create_table(User, :login => { :index => true})
36
- @login.unique_scope.should be_nil
36
+ expect(@login.unique_scope).to be_nil
37
37
  end
38
38
  end
39
39
 
@@ -44,11 +44,11 @@ describe "Column" do
44
44
  end
45
45
 
46
46
  it "should report unique" do
47
- @login.should be_unique
47
+ expect(@login).to be_unique
48
48
  end
49
49
 
50
50
  it "should report an empty unique scope" do
51
- @login.unique_scope.should == []
51
+ expect(@login.unique_scope).to eq([])
52
52
  end
53
53
  end
54
54
 
@@ -62,15 +62,15 @@ describe "Column" do
62
62
  end
63
63
 
64
64
  it "should report unique for each" do
65
- @first.should be_unique
66
- @middle.should be_unique
67
- @last.should be_unique
65
+ expect(@first).to be_unique
66
+ expect(@middle).to be_unique
67
+ expect(@last).to be_unique
68
68
  end
69
69
 
70
70
  it "should report unique scope for each" do
71
- @first.unique_scope.should =~ %W[middle last]
72
- @middle.unique_scope.should =~ %W[first last]
73
- @last.unique_scope.should =~ %W[first middle]
71
+ expect(@first.unique_scope).to match_array(%W[middle last])
72
+ expect(@middle.unique_scope).to match_array(%W[first last])
73
+ expect(@last.unique_scope).to match_array(%W[first middle])
74
74
  end
75
75
  end
76
76
 
@@ -80,17 +80,17 @@ describe "Column" do
80
80
 
81
81
  it "not required if the column can be null" do
82
82
  create_table(User, :login => { :null => true})
83
- User.columns.find{|column| column.name == "login"}.required_on.should be_nil
83
+ expect(User.columns.find{|column| column.name == "login"}.required_on).to be_nil
84
84
  end
85
85
 
86
86
  it "must have a value on :save if there's no default" do
87
87
  create_table(User, :login => { :null => false })
88
- User.columns.find{|column| column.name == "login"}.required_on.should == :save
88
+ expect(User.columns.find{|column| column.name == "login"}.required_on).to eq(:save)
89
89
  end
90
90
 
91
91
  it "must have a value on :update if there's default" do
92
92
  create_table(User, :login => { :null => false, :default => "foo" })
93
- User.columns.find{|column| column.name == "login"}.required_on.should == :update
93
+ expect(User.columns.find{|column| column.name == "login"}.required_on).to eq(:update)
94
94
  end
95
95
 
96
96
  end
@@ -113,19 +113,19 @@ describe "Column" do
113
113
 
114
114
  it "creating a record should respect default expression" do
115
115
  User.create!(:alpha => ActiveRecord::DB_DEFAULT, :beta => "hello")
116
- User.last.alpha.should == "gabba"
117
- User.last.beta.should == "hello"
116
+ expect(User.last.alpha).to eq("gabba")
117
+ expect(User.last.beta).to eq("hello")
118
118
  end
119
119
 
120
120
  it "updating a record should respect default expression" do
121
121
  u = User.create!(:alpha => "hey", :beta => "hello")
122
122
  u.reload
123
- u.alpha.should == "hey"
124
- u.beta.should == "hello"
123
+ expect(u.alpha).to eq("hey")
124
+ expect(u.beta).to eq("hello")
125
125
  u.update_attributes(:alpha => ActiveRecord::DB_DEFAULT, :beta => "goodbye")
126
126
  u.reload
127
- u.alpha.should == "gabba"
128
- u.beta.should == "goodbye"
127
+ expect(u.alpha).to eq("gabba")
128
+ expect(u.beta).to eq("goodbye")
129
129
  end
130
130
  end
131
131
  end
@@ -4,7 +4,7 @@ describe "Connection" do
4
4
 
5
5
  it "should re-open without failure" do
6
6
  expect {
7
- ActiveRecord::Base.establish_connection "schema_plus"
7
+ ActiveRecord::Base.establish_connection :schema_plus
8
8
  }.to_not raise_error
9
9
  end
10
10
  end
@@ -5,17 +5,17 @@ describe "Foreign Key definition" do
5
5
  let(:definition) { SchemaPlus::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new("posts_user_fkey", :posts, :user, :users, :id) }
6
6
 
7
7
  it "dumps to sql with quoted values" do
8
- definition.to_sql.should == %Q{CONSTRAINT posts_user_fkey FOREIGN KEY (#{quote_column_name('user')}) REFERENCES #{quote_table_name('users')} (#{quote_column_name('id')})}
8
+ expect(definition.to_sql).to eq(%Q{CONSTRAINT posts_user_fkey FOREIGN KEY (#{quote_column_name('user')}) REFERENCES #{quote_table_name('users')} (#{quote_column_name('id')})})
9
9
  end
10
10
 
11
11
  it "dumps to sql with deferrable values" do
12
12
  deferred_definition = SchemaPlus::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new("posts_user_fkey", :posts, :user, :users, :id, nil, nil, true)
13
- deferred_definition.to_sql.should == %Q{CONSTRAINT posts_user_fkey FOREIGN KEY (#{quote_column_name('user')}) REFERENCES #{quote_table_name('users')} (#{quote_column_name('id')}) DEFERRABLE}
13
+ expect(deferred_definition.to_sql).to eq(%Q{CONSTRAINT posts_user_fkey FOREIGN KEY (#{quote_column_name('user')}) REFERENCES #{quote_table_name('users')} (#{quote_column_name('id')}) DEFERRABLE})
14
14
  end
15
15
 
16
16
  it "dumps to sql with initially deferrable values" do
17
17
  initially_deferred_definition = SchemaPlus::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new("posts_user_fkey", :posts, :user, :users, :id, nil, nil, :initially_deferred)
18
- initially_deferred_definition.to_sql.should == %Q{CONSTRAINT posts_user_fkey FOREIGN KEY (#{quote_column_name('user')}) REFERENCES #{quote_table_name('users')} (#{quote_column_name('id')}) DEFERRABLE INITIALLY DEFERRED}
18
+ expect(initially_deferred_definition.to_sql).to eq(%Q{CONSTRAINT posts_user_fkey FOREIGN KEY (#{quote_column_name('user')}) REFERENCES #{quote_table_name('users')} (#{quote_column_name('id')}) DEFERRABLE INITIALLY DEFERRED})
19
19
  end
20
20
 
21
21
  def quote_table_name(table)
@@ -20,11 +20,11 @@ describe "Foreign Key" do
20
20
  end
21
21
 
22
22
  it "should report foreign key constraints" do
23
- Comment.foreign_keys.collect(&:column_names).flatten.should == [ "user_id" ]
23
+ expect(Comment.foreign_keys.collect(&:column_names).flatten).to eq([ "user_id" ])
24
24
  end
25
25
 
26
26
  it "should report reverse foreign key constraints" do
27
- User.reverse_foreign_keys.collect(&:column_names).flatten.should == [ "user_id" ]
27
+ expect(User.reverse_foreign_keys.collect(&:column_names).flatten).to eq([ "user_id" ])
28
28
  end
29
29
 
30
30
  end
@@ -32,7 +32,9 @@ describe "Foreign Key" do
32
32
  if ::ActiveRecord::VERSION::MAJOR.to_i >= 4
33
33
  context "with modifications to SQL generated by upstream visit_TableDefinition" do
34
34
  before(:each) do
35
- ActiveRecord::Base.connection.class.const_get(:SchemaCreation).any_instance.stub :visit_TableDefinition_without_schema_plus => "this is unexpected"
35
+ allow_any_instance_of(ActiveRecord::Base.connection.class.const_get(:SchemaCreation))
36
+ .to receive(:visit_TableDefinition_without_schema_plus)
37
+ .and_return('this is unexpected')
36
38
  end
37
39
 
38
40
  it "raises an exception when attempting to create a table" do
@@ -105,23 +107,23 @@ describe "Foreign Key" do
105
107
  end
106
108
 
107
109
  it "references users(id)" do
108
- Post.should reference(:users, :id).on(:author_id)
110
+ expect(Post).to reference(:users, :id).on(:author_id)
109
111
  end
110
112
 
111
113
  it "cascades on update" do
112
- Post.should reference(:users).on_update(:cascade)
114
+ expect(Post).to reference(:users).on_update(:cascade)
113
115
  end
114
116
 
115
117
  it "restricts on delete" do
116
- Post.should reference(:users).on_delete(:restrict)
118
+ expect(Post).to reference(:users).on_delete(:restrict)
117
119
  end
118
120
 
119
121
  it "is available in Post.foreign_keys" do
120
- Post.foreign_keys.collect(&:column_names).should include(%w[author_id])
122
+ expect(Post.foreign_keys.collect(&:column_names)).to include(%w[author_id])
121
123
  end
122
124
 
123
125
  it "is available in User.reverse_foreign_keys" do
124
- User.reverse_foreign_keys.collect(&:column_names).should include(%w[author_id])
126
+ expect(User.reverse_foreign_keys.collect(&:column_names)).to include(%w[author_id])
125
127
  end
126
128
 
127
129
  end
@@ -139,15 +141,15 @@ describe "Foreign Key" do
139
141
  end
140
142
 
141
143
  it "doesn't reference posts(id)" do
142
- Comment.should_not reference(:posts).on(:post_id)
144
+ expect(Comment).not_to reference(:posts).on(:post_id)
143
145
  end
144
146
 
145
147
  it "is no longer available in Post.foreign_keys" do
146
- Comment.foreign_keys.collect(&:column_names).should_not include(%w[post_id])
148
+ expect(Comment.foreign_keys.collect(&:column_names)).not_to include(%w[post_id])
147
149
  end
148
150
 
149
151
  it "is no longer available in User.reverse_foreign_keys" do
150
- Post.reverse_foreign_keys.collect(&:column_names).should_not include(%w[post_id])
152
+ expect(Post.reverse_foreign_keys.collect(&:column_names)).not_to include(%w[post_id])
151
153
  end
152
154
 
153
155
  end
@@ -158,7 +160,7 @@ describe "Foreign Key" do
158
160
 
159
161
  it "should remove foreign keys" do
160
162
  remove_foreign_key(:comments, foreign_key_name)
161
- Post.reverse_foreign_keys.collect { |fk| fk.column_names == %w[post_id] && fk.table_name == "comments" }.should be_empty
163
+ expect(Post.reverse_foreign_keys.collect { |fk| fk.column_names == %w[post_id] && fk.table_name == "comments" }).to be_empty
162
164
  end
163
165
 
164
166
  end