polymorpheus 3.1.1 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e181e9294980f79aa4b50efdd7edb588de1c390a
4
- data.tar.gz: 317c3f2e0da8513874d57955042e547a2077c3bb
2
+ SHA256:
3
+ metadata.gz: 60273820617c2e5ef7e4eab45965a2729ae9ecb3e8ba05357cf9c0ae432d36be
4
+ data.tar.gz: 156743a57b80836a20280d0bdef6bd4e3f895e79cbf93aac60b986fe5deb4bac
5
5
  SHA512:
6
- metadata.gz: b5ccb72b1c3a0ed0d247b67a5c2dbf71b04a46d6947c64b71e16a4212960acc60cf1b8771e8768b04967c1a8b64df9238aa7102febf67c5fe95ce36facbd0f3c
7
- data.tar.gz: 5ef3e30327eaab0914ea2731cf3d5699ea1f058320ebfc2ada4704e8e4b497db556d112dcca7f8a694efb8cc74b7b1bf7d3f7307ed35ceb532e89acc2ccbe8ae
6
+ metadata.gz: 5bb967919da9877c1129879492445d4972aff408399c0c6da01804cc4848382e9565b1cf32aa72c63101cf791ef331e5382cededa0a146e0d439a828f34fade2
7
+ data.tar.gz: cb3b1f649f7317ef555b78b6932a5385c8f78ba7e8b5bbdb3d37a552a4b4c20dce0ef72fd1deb410745744885020766e674acd50a1826989b720fe99abe71e65
data/README.md CHANGED
@@ -1,4 +1,3 @@
1
- [![Build Status](https://travis-ci.org/wegowise/polymorpheus.png?branch=master)](https://travis-ci.org/wegowise/polymorpheus)
2
1
  [![Code Climate](https://codeclimate.com/github/wegowise/polymorpheus.png)](https://codeclimate.com/github/wegowise/polymorpheus)
3
2
 
4
3
  # Polymorpheus
@@ -10,15 +9,6 @@ no setup**
10
9
  If you are using Bundler, you can add the gem to your Gemfile:
11
10
 
12
11
  ```ruby
13
- # with Rails >= 4.2
14
- gem 'polymorpheus'
15
- ```
16
-
17
- Or:
18
-
19
- ```ruby
20
- # with Rails < 4.2
21
- gem 'foreigner'
22
12
  gem 'polymorpheus'
23
13
  ```
24
14
 
@@ -142,8 +132,6 @@ Now let's review what we've done.
142
132
 
143
133
  * Currently the gem only supports MySQL. Please feel free to fork and submit a
144
134
  (well-tested) pull request if you want to add Postgres support.
145
- * This gem is tested and has been tested for Rails 2.3.8, 3.0.x, 3.1.x, 3.2.x,
146
- and 4.0.0
147
135
  * For Rails 3.1+, you'll still need to use `up` and `down` methods in your
148
136
  migrations.
149
137
 
@@ -214,8 +202,8 @@ pic.polymorpheus.query_condition
214
202
  ## Credits and License
215
203
 
216
204
  * This gem was written by [Barun Singh](https://github.com/barunio)
217
- * It uses the [Foreigner gem](https://github.com/matthuhiggins/foreigner) under
218
- the hood for Rails < 4.2.
205
+ * Older, unsupported versions of this gem use [Foreigner gem](https://github.com/matthuhiggins/foreigner)
206
+ under the hood for Rails < 4.2.
219
207
 
220
208
  polymorpheus is Copyright © 2011-2015 Barun Singh and [WegoWise](
221
209
  http://wegowise.com). It is free software, and may be redistributed under the
@@ -15,7 +15,11 @@ module Polymorpheus
15
15
  end
16
16
 
17
17
  def configured_adapter
18
- ActiveRecord::Base.connection_pool.spec.config[:adapter]
18
+ if ActiveRecord::Base.respond_to?(:connection_db_config)
19
+ ActiveRecord::Base.connection_db_config.adapter # ActiveRecord >= 6.1
20
+ else
21
+ ActiveRecord::Base.connection_pool.spec.config[:adapter]
22
+ end
19
23
  end
20
24
  end
21
25
 
@@ -21,7 +21,7 @@ module Polymorpheus
21
21
 
22
22
  # Set belongs_to associations
23
23
  builder.associations.each do |association|
24
- belongs_to association.name.to_sym, association.options
24
+ belongs_to association.name.to_sym, **association.options
25
25
  end
26
26
 
27
27
  # Exposed interface for introspection
@@ -25,7 +25,7 @@ module Polymorpheus
25
25
  relation
26
26
  end
27
27
 
28
- has_many association, conditions, options
28
+ has_many association, conditions, **options
29
29
  end
30
30
  end
31
31
  end
@@ -74,7 +74,7 @@ module Polymorpheus
74
74
  :name => "#{table}_#{col_name}_fk",
75
75
  :primary_key => (ref_col || 'id' )
76
76
  }.merge(generate_constraints(options))
77
- add_foreign_key(table, ref_table, fk_options)
77
+ add_foreign_key(table, ref_table, **fk_options)
78
78
  end
79
79
  end
80
80
 
@@ -208,8 +208,3 @@ end
208
208
  rescue
209
209
  end
210
210
  end
211
-
212
- if ::Polymorpheus.require_foreigner?
213
- require 'foreigner/connection_adapters/mysql2_adapter'
214
- require 'polymorpheus/mysql_adapter/foreigner_constraints'
215
- end
@@ -1,3 +1,3 @@
1
1
  module Polymorpheus
2
- VERSION = '3.1.1'
2
+ VERSION = '3.4.0'
3
3
  end
data/lib/polymorpheus.rb CHANGED
@@ -8,12 +8,7 @@ module Polymorpheus
8
8
  module Interface
9
9
  autoload :BelongsToPolymorphic, 'polymorpheus/interface/belongs_to_polymorphic'
10
10
  autoload :ValidatesPolymorph, 'polymorpheus/interface/validates_polymorph'
11
-
12
- if ActiveRecord::VERSION::MAJOR >= 4
13
- autoload :HasManyAsPolymorph, 'polymorpheus/interface/rails4/has_many_as_polymorph'
14
- else
15
- autoload :HasManyAsPolymorph, 'polymorpheus/interface/rails3/has_many_as_polymorph'
16
- end
11
+ autoload :HasManyAsPolymorph, 'polymorpheus/interface/has_many_as_polymorph'
17
12
  end
18
13
 
19
14
  class InterfaceBuilder
@@ -23,16 +18,8 @@ module Polymorpheus
23
18
  module ConnectionAdapters
24
19
  autoload :SchemaStatements, 'polymorpheus/schema_statements'
25
20
  end
26
-
27
- def self.require_foreigner?
28
- ActiveRecord::VERSION::MAJOR < 5 &&
29
- !(::ActiveRecord::VERSION::MAJOR >= 4 &&
30
- ::ActiveRecord::VERSION::MINOR >= 2)
31
- end
32
21
  end
33
22
 
34
- require 'foreigner' if ::Polymorpheus.require_foreigner?
35
-
36
23
  Polymorpheus::Adapter.register 'mysql2', 'polymorpheus/mysql_adapter'
37
24
  Polymorpheus::Adapter.register 'postgresql', 'polymorpheus/postgresql_adapter'
38
25
 
data/polymorpheus.gemspec CHANGED
@@ -12,13 +12,14 @@ Gem::Specification.new do |s|
12
12
  s.summary = "Provides a database-friendly method for polymorphic relationships"
13
13
  s.description = "Provides a database-friendly method for polymorphic relationships"
14
14
 
15
+ s.required_ruby_version = ">= 2.6"
15
16
  s.required_rubygems_version = ">= 1.3.6"
16
17
  s.files = Dir.glob(%w[{lib,spec}/**/*.rb [A-Z]*.{txt,rdoc,md} *.gemspec]) + %w{Rakefile}
17
18
  s.extra_rdoc_files = ["README.md", "LICENSE.txt"]
18
19
  s.license = 'MIT'
19
20
 
20
- s.add_dependency('activerecord', '>= 3.2', '< 5.2')
21
+ s.add_dependency('activerecord', '>= 5.2', '< 7.1')
21
22
 
22
- s.add_development_dependency('rake', '~> 10.4.2')
23
- s.add_development_dependency('rspec', '~> 2.14.0')
23
+ s.add_development_dependency('rake', '~> 12.3.3')
24
+ s.add_development_dependency('rspec', '~> 3.9.0')
24
25
  end
@@ -15,9 +15,12 @@ describe Polymorpheus::Interface::BelongsToPolymorphic do
15
15
  create_table :villains
16
16
  end
17
17
 
18
- specify { StoryArc::POLYMORPHEUS_ASSOCIATIONS.should == %w[hero villain] }
19
- specify { Superpower::POLYMORPHEUS_ASSOCIATIONS.should == %w[superhero
20
- supervillain] }
18
+ specify do
19
+ expect(StoryArc::POLYMORPHEUS_ASSOCIATIONS).to eq(%w[hero villain])
20
+ end
21
+ specify do
22
+ expect(Superpower::POLYMORPHEUS_ASSOCIATIONS).to eq(%w[superhero supervillain])
23
+ end
21
24
 
22
25
  describe "setter methods for ActiveRecord objects" do
23
26
  let(:story_arc) { StoryArc.new(attributes) }
@@ -25,37 +28,38 @@ describe Polymorpheus::Interface::BelongsToPolymorphic do
25
28
 
26
29
  it "sets the correct attribute value for the setter" do
27
30
  story_arc.character = hero
28
- story_arc.hero_id.should == hero.id
29
- story_arc.villain_id.should == nil
31
+ expect(story_arc.hero_id).to eq(hero.id)
32
+ expect(story_arc.villain_id).to eq(nil)
30
33
  end
31
34
 
32
35
  it "sets competing associations to nil" do
33
36
  story_arc.character = hero
34
- story_arc.hero_id.should == hero.id
37
+ expect(story_arc.hero_id).to eq(hero.id)
35
38
  story_arc.character = villain
36
- story_arc.villain_id.should == villain.id
37
- story_arc.hero_id.should == nil
39
+ expect(story_arc.villain_id).to eq(villain.id)
40
+ expect(story_arc.hero_id).to eq(nil)
38
41
  end
39
42
 
40
43
  it "throws an error if the assigned object isn't a valid type" do
41
44
  create_table :trees
42
45
 
43
46
  tree = Tree.create!
44
- expect { story_arc.character = tree }
45
- .to raise_error(Polymorpheus::Interface::InvalidTypeError,
46
- "Invalid type. Must be one of {hero, villain}")
47
+ expect { story_arc.character = tree }.to raise_error(
48
+ Polymorpheus::Interface::InvalidTypeError,
49
+ "Invalid type. Must be one of {hero, villain}"
50
+ )
47
51
  end
48
52
 
49
53
  it "does not throw an error if the assigned object is a subclass of a
50
54
  valid type" do
51
55
  expect { story_arc.character = superhero }.not_to raise_error
52
- story_arc.hero_id.should == superhero.id
56
+ expect(story_arc.hero_id).to eq(superhero.id)
53
57
  end
54
58
 
55
59
  it "does not throw an error if the assigned object is a descendant of a
56
60
  valid type" do
57
61
  expect { story_arc.character = alien_demigod }.not_to raise_error
58
- story_arc.hero_id.should == alien_demigod.id
62
+ expect(story_arc.hero_id).to eq(alien_demigod.id)
59
63
  end
60
64
  end
61
65
 
@@ -79,12 +83,12 @@ describe Polymorpheus::Interface::BelongsToPolymorphic do
79
83
 
80
84
  it "works if the assigned object is of the specified class" do
81
85
  expect { superpower.wielder = superhero }.not_to raise_error
82
- superpower.superhero_id.should == superhero.id
86
+ expect(superpower.superhero_id).to eq(superhero.id)
83
87
  end
84
88
 
85
89
  it "works if the assigned object is an instance of a child class" do
86
90
  expect { superpower.wielder = alien_demigod }.not_to raise_error
87
- superpower.superhero_id.should == alien_demigod.id
91
+ expect(superpower.superhero_id).to eq(alien_demigod.id)
88
92
  end
89
93
  end
90
94
 
@@ -94,42 +98,52 @@ describe Polymorpheus::Interface::BelongsToPolymorphic do
94
98
  context 'when there is no relationship defined' do
95
99
  let(:story_arc) { StoryArc.new }
96
100
 
97
- its(:associations) { should match_associations(:hero, :villain) }
98
- its(:active_association) { should == nil }
99
- its(:query_condition) { should == nil }
101
+ specify do
102
+ expect(interface.associations).to match_associations(:hero, :villain)
103
+ end
104
+ specify { expect(interface.active_association).to eq nil }
105
+ specify { expect(interface.query_condition).to eq nil }
100
106
  end
101
107
 
102
108
  context 'when there is are multiple relationships defined' do
103
109
  let(:story_arc) { StoryArc.new(hero_id: hero.id, villain_id: villain.id) }
104
110
 
105
- its(:associations) { should match_associations(:hero, :villain) }
106
- its(:active_association) { should == nil }
107
- its(:query_condition) { should == nil }
111
+ specify do
112
+ expect(interface.associations).to match_associations(:hero, :villain)
113
+ end
114
+ specify { expect(interface.active_association).to eq nil }
115
+ specify { expect(interface.query_condition).to eq nil }
108
116
  end
109
117
 
110
118
  context 'when there is one relationship defined through the id value' do
111
119
  let(:story_arc) { StoryArc.new(hero_id: hero.id) }
112
120
 
113
- its(:associations) { should match_associations(:hero, :villain) }
114
- its(:active_association) { be_association(:hero) }
115
- its(:query_condition) { should == { 'hero_id' => hero.id } }
121
+ specify do
122
+ expect(interface.associations).to match_associations(:hero, :villain)
123
+ end
124
+ specify { expect(interface.active_association).to be_association(:hero) }
125
+ specify { expect(interface.query_condition).to eq('hero_id' => hero.id) }
116
126
  end
117
127
 
118
128
  context 'when there is one relationship defined through the setter' do
119
129
  let(:story_arc) { StoryArc.new(character: hero) }
120
130
 
121
- its(:associations) { should match_associations(:hero, :villain) }
122
- its(:active_association) { be_association(:hero) }
123
- its(:query_condition) { should == { 'hero_id' => hero.id } }
131
+ specify do
132
+ expect(interface.associations).to match_associations(:hero, :villain)
133
+ end
134
+ specify { expect(interface.active_association).to be_association(:hero) }
135
+ specify { expect(interface.query_condition).to eq('hero_id' => hero.id) }
124
136
  end
125
137
 
126
138
  context 'when there is one association, to a new record' do
127
139
  let(:new_hero) { Hero.new }
128
140
  let(:story_arc) { StoryArc.new(character: new_hero) }
129
141
 
130
- its(:associations) { should match_associations(:hero, :villain) }
131
- its(:active_association) { be_association(:hero) }
132
- its(:query_condition) { should == nil }
142
+ specify do
143
+ expect(interface.associations).to match_associations(:hero, :villain)
144
+ end
145
+ specify { expect(interface.active_association).to be_association(:hero) }
146
+ specify { expect(interface.query_condition).to eq nil }
133
147
  end
134
148
  end
135
149
  end
@@ -16,54 +16,71 @@ describe Polymorpheus::Interface::HasManyAsPolymorph do
16
16
 
17
17
  it 'sets conditions on association to ensure we retrieve correct result' do
18
18
  hero = Hero.create!
19
- hero.story_arcs.to_sql
20
- .should match_sql(%{SELECT `story_arcs`.* FROM `story_arcs`
21
- WHERE `story_arcs`.`hero_id` = #{hero.id}
22
- AND `story_arcs`.`villain_id` IS NULL})
19
+ expect(hero.story_arcs.to_sql).to match_sql <<-EOS
20
+ SELECT `story_arcs`.* FROM `story_arcs`
21
+ WHERE `story_arcs`.`hero_id` = #{hero.id}
22
+ AND `story_arcs`.`villain_id` IS NULL
23
+ EOS
23
24
  end
24
25
 
25
26
  it 'supports existing conditions on the association' do
26
27
  villain = Villain.create!
27
- villain.story_arcs.to_sql
28
- .should match_sql(%{SELECT `story_arcs`.* FROM `story_arcs`
29
- WHERE `story_arcs`.`villain_id` = #{villain.id}
30
- AND `story_arcs`.`hero_id` IS NULL
31
- ORDER BY id DESC})
28
+ expect(villain.story_arcs.to_sql).to match_sql <<-EOS
29
+ SELECT `story_arcs`.* FROM `story_arcs`
30
+ WHERE `story_arcs`.`villain_id` = #{villain.id}
31
+ AND `story_arcs`.`hero_id` IS NULL
32
+ ORDER BY id DESC
33
+ EOS
32
34
  end
33
35
 
34
36
  it 'returns the correct result when used with new records' do
35
37
  villain = Villain.create!
36
38
  story_arc = StoryArc.create!(villain: villain, issue_id: 10)
37
- Hero.new.story_arcs.where(issue_id: 10).should == []
39
+ expect(Hero.new.story_arcs.where(issue_id: 10)).to eq([])
38
40
  end
39
41
 
40
42
  it 'sets conditions on associations with enough specificity that they work
41
43
  in conjunction with has_many :through relationships' do
42
44
  hero = Hero.create!
43
- hero.battles.to_sql
44
- .should match_sql(%{SELECT `battles`.* FROM `battles`
45
- INNER JOIN `story_arcs`
46
- ON `battles`.`id` = `story_arcs`.`battle_id`
47
- WHERE `story_arcs`.`hero_id` = #{hero.id}
48
- AND `story_arcs`.`villain_id` IS NULL})
45
+ expect(hero.battles.to_sql).to match_sql <<-EOS
46
+ SELECT `battles`.* FROM `battles`
47
+ INNER JOIN `story_arcs`
48
+ ON `battles`.`id` = `story_arcs`.`battle_id`
49
+ WHERE `story_arcs`.`hero_id` = #{hero.id}
50
+ AND `story_arcs`.`villain_id` IS NULL
51
+ EOS
49
52
  end
50
53
 
51
54
  it 'uses the correct association table name when used in conjunction with a
52
55
  join condition' do
53
56
  battle = Battle.create!
54
- battle.heros.to_sql
55
- .should match_sql(%{SELECT `heros`.* FROM `heros`
56
- INNER JOIN `story_arcs`
57
- ON `heros`.`id` = `story_arcs`.`hero_id`
58
- WHERE `story_arcs`.`battle_id` = #{battle.id}})
57
+ expect(battle.heros.to_sql).to match_sql <<-EOS
58
+ SELECT `heros`.* FROM `heros`
59
+ INNER JOIN `story_arcs`
60
+ ON `heros`.`id` = `story_arcs`.`hero_id`
61
+ WHERE `story_arcs`.`battle_id` = #{battle.id}
62
+ EOS
59
63
 
60
- battle.heros.joins(:story_arcs).to_sql
61
- .should match_sql(%{SELECT `heros`.* FROM `heros`
62
- INNER JOIN `story_arcs` `story_arcs_heros`
63
- ON `story_arcs_heros`.`hero_id` = `heros`.`id`
64
- AND `story_arcs_heros`.`villain_id` IS NULL
65
- INNER JOIN `story_arcs`
66
- ON `heros`.`id` = `story_arcs`.`hero_id`
67
- WHERE `story_arcs`.`battle_id` = #{battle.id}})
64
+ if ActiveRecord::VERSION::MAJOR >= 6
65
+ expect(battle.heros.joins(:story_arcs).to_sql).to match_sql <<-EOS
66
+ SELECT `heros`.* FROM `heros`
67
+ INNER JOIN `story_arcs`
68
+ ON `heros`.`id` = `story_arcs`.`hero_id`
69
+ INNER JOIN `story_arcs` `story_arcs_heros`
70
+ ON `story_arcs_heros`.`villain_id` IS NULL
71
+ AND `story_arcs_heros`.`hero_id` = `heros`.`id`
72
+ WHERE `story_arcs`.`battle_id` = #{battle.id}
73
+ EOS
74
+ else
75
+ expect(battle.heros.joins(:story_arcs).to_sql).to match_sql <<-EOS
76
+ SELECT `heros`.* FROM `heros`
77
+ INNER JOIN `story_arcs` `story_arcs_heros`
78
+ ON `story_arcs_heros`.`hero_id` = `heros`.`id`
79
+ AND `story_arcs_heros`.`villain_id` IS NULL
80
+ INNER JOIN `story_arcs`
81
+ ON `heros`.`id` = `story_arcs`.`hero_id`
82
+ WHERE `story_arcs`.`battle_id` = #{battle.id}
83
+ EOS
84
+ end
68
85
  end
69
86
  end
@@ -13,23 +13,25 @@ describe Polymorpheus::Interface::ValidatesPolymorph do
13
13
  create_table(:villains)
14
14
  end
15
15
 
16
- specify { StoryArc.new(character: hero).valid?.should == true }
17
- specify { StoryArc.new(character: villain).valid?.should == true }
18
- specify { StoryArc.new(hero_id: hero.id).valid?.should == true }
19
- specify { StoryArc.new(hero: hero).valid?.should == true }
20
- specify { StoryArc.new(hero: Hero.new).valid?.should == true }
16
+ specify { expect(StoryArc.new(character: hero).valid?).to eq(true) }
17
+ specify { expect(StoryArc.new(character: villain).valid?).to eq(true) }
18
+ specify { expect(StoryArc.new(hero_id: hero.id).valid?).to eq(true) }
19
+ specify { expect(StoryArc.new(hero: hero).valid?).to eq(true) }
20
+ specify { expect(StoryArc.new(hero: Hero.new).valid?).to eq(true) }
21
21
 
22
22
  it 'is invalid if no association is specified' do
23
23
  story_arc = StoryArc.new
24
- story_arc.valid?.should == false
25
- story_arc.errors[:base].should ==
24
+ expect(story_arc.valid?).to eq(false)
25
+ expect(story_arc.errors[:base]).to eq(
26
26
  ["You must specify exactly one of the following: {hero, villain}"]
27
+ )
27
28
  end
28
29
 
29
30
  it 'is invalid if multiple associations are specified' do
30
31
  story_arc = StoryArc.new(hero_id: hero.id, villain_id: villain.id)
31
- story_arc.valid?.should == false
32
- story_arc.errors[:base].should ==
32
+ expect(story_arc.valid?).to eq(false)
33
+ expect(story_arc.errors[:base]).to eq(
33
34
  ["You must specify exactly one of the following: {hero, villain}"]
35
+ )
34
36
  end
35
37
  end
@@ -7,10 +7,10 @@ describe Polymorpheus::Interface do
7
7
  create_table :books
8
8
  create_table :binders
9
9
 
10
- Drawing.new.association(:book).reflection.inverse_of.should == nil
11
- Drawing.new.association(:binder).reflection.inverse_of.should == nil
12
- Book.new.association(:drawings).reflection.inverse_of.should == nil
13
- Binder.new.association(:drawings).reflection.inverse_of.should == nil
10
+ expect(Drawing.new.association(:book).reflection.inverse_of).to eq(nil)
11
+ expect(Drawing.new.association(:binder).reflection.inverse_of).to eq(nil)
12
+ expect(Book.new.association(:drawings).reflection.inverse_of).to eq(nil)
13
+ expect(Binder.new.association(:drawings).reflection.inverse_of).to eq(nil)
14
14
  end
15
15
 
16
16
  it 'with options' do
@@ -18,10 +18,10 @@ describe Polymorpheus::Interface do
18
18
  create_table :web_pages
19
19
  create_table :printed_works
20
20
 
21
- Picture.new.association(:web_page).reflection.inverse_of.name.should == :pictures
22
- Picture.new.association(:printed_work).reflection.inverse_of.name.should == :pictures
23
- WebPage.new.association(:pictures).reflection.inverse_of.name.should == :web_page
24
- PrintedWork.new.association(:pictures).reflection.inverse_of.name.should == :printed_work
21
+ expect(Picture.new.association(:web_page).reflection.inverse_of.name).to eq(:pictures)
22
+ expect(Picture.new.association(:printed_work).reflection.inverse_of.name).to eq(:pictures)
23
+ expect(WebPage.new.association(:pictures).reflection.inverse_of.name).to eq(:web_page)
24
+ expect(PrintedWork.new.association(:pictures).reflection.inverse_of.name).to eq(:printed_work)
25
25
  end
26
26
  end
27
27
  end
@@ -30,10 +30,10 @@ describe Polymorpheus::SchemaDumper do
30
30
  end
31
31
 
32
32
  specify "the schema statement is part of the dump" do
33
- subject.index(schema_statement).should be_a(Integer)
33
+ expect(subject.index(schema_statement)).to be_a(Integer)
34
34
  end
35
35
 
36
36
  specify "there is exactly one instance of the schema statement" do
37
- subject.index(schema_statement).should == subject.rindex(schema_statement)
37
+ expect(subject.index(schema_statement)).to eq(subject.rindex(schema_statement))
38
38
  end
39
39
  end
data/spec/spec_helper.rb CHANGED
@@ -2,13 +2,14 @@ require 'active_record'
2
2
  require 'polymorpheus'
3
3
  require 'stringio'
4
4
 
5
- require 'support/active_record/connection_adapters/abstract_mysql_adapter'
6
-
7
- ActiveRecord::Base.establish_connection({
5
+ ActiveRecord::Base.establish_connection(
8
6
  adapter: 'mysql2',
9
- username: 'travis',
10
- database: 'polymorpheus_test'
11
- })
7
+ database: ENV.fetch('DB_NAME', 'polymorpheus_test'),
8
+ host: ENV.fetch('DB_HOST', '127.0.0.1'),
9
+ password: ENV.fetch('DB_PASSWORD', ''),
10
+ port: ENV.fetch('DB_PORT', '3306'),
11
+ username: ENV.fetch('DB_USERNAME', 'root')
12
+ )
12
13
 
13
14
  Dir[File.dirname(__FILE__) + '/support/*.rb'].sort.each { |path| require path }
14
15
 
@@ -27,7 +28,7 @@ RSpec.configure do |config|
27
28
  config.include SqlTestHelpers
28
29
 
29
30
  config.after do
30
- data_sources.each do |table|
31
+ ActiveRecord::Base.connection.tables.each do |table|
31
32
  ActiveRecord::Base.connection.drop_table(table)
32
33
  end
33
34
  end
@@ -3,14 +3,6 @@ module ConnectionHelpers
3
3
  connection.add_polymorphic_constraints(*args)
4
4
  end
5
5
 
6
- def data_sources
7
- if ActiveRecord::VERSION::MAJOR >= 5
8
- ActiveRecord::Base.connection.data_sources
9
- else
10
- ActiveRecord::Base.connection.tables
11
- end
12
- end
13
-
14
6
  def remove_polymorphic_constraints(*args)
15
7
  connection.remove_polymorphic_constraints(*args)
16
8
  end
@@ -1,31 +1,31 @@
1
1
  RSpec::Matchers.define :be_association do |association_name|
2
2
  match do |actual|
3
- actual.should be_instance_of(Polymorpheus::InterfaceBuilder::Association)
4
- actual.name.should == association_name.to_s
3
+ expect(actual).to be_instance_of Polymorpheus::InterfaceBuilder::Association
4
+ expect(actual.name).to eq association_name.to_s
5
5
  end
6
6
  end
7
7
 
8
8
  RSpec::Matchers.define :match_associations do |*association_names|
9
9
  match do |actual|
10
- actual.length.should == association_names.length
10
+ expect(actual.length).to eq association_names.length
11
11
  actual.each_with_index do |item, ind|
12
- item.should be_association(association_names[ind])
12
+ expect(item).to be_association(association_names[ind])
13
13
  end
14
14
  end
15
15
  end
16
16
 
17
17
  RSpec::Matchers.define :match_sql do |expected|
18
18
  match do |actual|
19
- format(expected).should == format(actual)
19
+ expect(format(expected)).to eq format(actual)
20
20
  end
21
21
 
22
- failure_message_for_should do |actual|
22
+ failure_message do |actual|
23
23
  "expected the following SQL statements to match:
24
24
  #{format(actual)}
25
25
  #{format(expected)}"
26
26
  end
27
27
 
28
28
  def format(sql)
29
- sql.gsub(/\s+/, ' ')
29
+ sql.squish
30
30
  end
31
31
  end
@@ -2,7 +2,7 @@ module SchemaHelpers
2
2
  def create_table(name, options = {})
3
3
  options.merge!(force: true)
4
4
  ActiveRecord::Schema.define do
5
- create_table(name, options) do |t|
5
+ create_table(name, **options) do |t|
6
6
  yield(t) if block_given?
7
7
  end
8
8
  end
@@ -0,0 +1,17 @@
1
+ module Polymorpheus
2
+ class SqlQuerySubscriber
3
+ attr_reader :sql_statements
4
+
5
+ def initialize
6
+ @sql_statements = []
7
+ end
8
+
9
+ def call(_name, _start, _finish, _id, payload)
10
+ sql_statements << payload[:sql]
11
+ end
12
+
13
+ def clear_sql_history
14
+ @sql_statements.clear
15
+ end
16
+ end
17
+ end
@@ -2,22 +2,16 @@ module SqlTestHelpers
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
5
- before(:all) do
6
- class << ActiveRecord::Base.connection
7
- include Polymorpheus::SqlLogger
8
- alias_method :original_execute, :execute
9
- alias_method :execute, :log_sql_statements
10
- end
5
+ before do
6
+ ActiveSupport::Notifications.subscribe('sql.active_record', sql_logger)
11
7
  end
12
8
 
13
- after(:all) do
14
- class << ActiveRecord::Base.connection
15
- alias_method :execute, :original_execute
16
- end
9
+ after do
10
+ ActiveSupport::Notifications.unsubscribe(sql_logger)
17
11
  end
18
12
 
19
13
  let(:connection) { ActiveRecord::Base.connection }
20
- let(:sql) { connection.sql_statements }
14
+ let(:sql_logger) { Polymorpheus::SqlQuerySubscriber.new }
21
15
 
22
16
  def clean_sql(sql_string)
23
17
  sql_string
@@ -31,11 +25,15 @@ module SqlTestHelpers
31
25
  end
32
26
 
33
27
  def clear_sql_history
34
- connection.clear_sql_history
28
+ sql_logger.clear_sql_history
35
29
  end
36
30
 
37
31
  def should_execute_sql(expected)
38
- expect(clean_sql(sql.join("\n"))).to include(clean_sql(expected.squish))
32
+ expect(clean_sql(sql.join("\n"))).to include(clean_sql(expected))
33
+ end
34
+
35
+ def sql
36
+ sql_logger.sql_statements
39
37
  end
40
38
  end
41
39
  end
data/spec/trigger_spec.rb CHANGED
@@ -19,27 +19,39 @@ describe Polymorpheus::Trigger do
19
19
  let(:collation_connection) { "utf8_general_ci" }
20
20
  let(:db_collation) { "utf8_unicode_ci" }
21
21
 
22
- subject do
23
- described_class.new([name, event, table, statement, timing, created,
24
- sql_mode, definer, charset, collation_connection,
25
- db_collation])
22
+ let(:trigger) do
23
+ described_class.new(
24
+ [
25
+ name,
26
+ event,
27
+ table,
28
+ statement,
29
+ timing,
30
+ created,
31
+ sql_mode,
32
+ definer,
33
+ charset,
34
+ collation_connection,
35
+ db_collation
36
+ ]
37
+ )
26
38
  end
27
39
 
28
- its(:name) { should == name }
29
- its(:event) { should == event }
30
- its(:table) { should == table }
31
- its(:statement) { should == statement }
32
- its(:timing) { should == timing }
33
- its(:created) { should == created }
34
- its(:sql_mode) { should == sql_mode }
35
- its(:definer) { should == definer }
36
- its(:charset) { should == charset }
37
- its(:collation_connection) { should == collation_connection }
38
- its(:db_collation) { should == db_collation }
40
+ specify { expect(trigger.name).to eq name }
41
+ specify { expect(trigger.event).to eq event }
42
+ specify { expect(trigger.table).to eq table }
43
+ specify { expect(trigger.statement).to eq statement }
44
+ specify { expect(trigger.timing).to eq timing }
45
+ specify { expect(trigger.created).to eq created }
46
+ specify { expect(trigger.sql_mode).to eq sql_mode }
47
+ specify { expect(trigger.definer).to eq definer }
48
+ specify { expect(trigger.charset).to eq charset }
49
+ specify { expect(trigger.collation_connection).to eq collation_connection }
50
+ specify { expect(trigger.db_collation).to eq db_collation }
39
51
 
40
- its(:columns) { should == %w{dog_id kitty_id} }
52
+ specify { expect(trigger.columns).to eq %w[dog_id kitty_id] }
41
53
 
42
- its(:schema_statement) do
43
- should == %{ add_polymorphic_triggers(:pets, ["dog_id", "kitty_id"])}
54
+ specify do
55
+ expect(trigger.schema_statement).to eq %{ add_polymorphic_triggers(:pets, ["dog_id", "kitty_id"])}
44
56
  end
45
57
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polymorpheus
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Barun Singh
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-16 00:00:00.000000000 Z
11
+ date: 2022-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,48 +16,48 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.2'
19
+ version: '5.2'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '5.2'
22
+ version: '7.1'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '3.2'
29
+ version: '5.2'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '5.2'
32
+ version: '7.1'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rake
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 10.4.2
39
+ version: 12.3.3
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 10.4.2
46
+ version: 12.3.3
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 2.14.0
53
+ version: 3.9.0
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 2.14.0
60
+ version: 3.9.0
61
61
  description: Provides a database-friendly method for polymorphic relationships
62
62
  email: bsingh@wegowise.com
63
63
  executables: []
@@ -73,13 +73,11 @@ files:
73
73
  - lib/polymorpheus/adapter.rb
74
74
  - lib/polymorpheus/interface.rb
75
75
  - lib/polymorpheus/interface/belongs_to_polymorphic.rb
76
- - lib/polymorpheus/interface/rails3/has_many_as_polymorph.rb
77
- - lib/polymorpheus/interface/rails4/has_many_as_polymorph.rb
76
+ - lib/polymorpheus/interface/has_many_as_polymorph.rb
78
77
  - lib/polymorpheus/interface/validates_polymorph.rb
79
78
  - lib/polymorpheus/interface_builder.rb
80
79
  - lib/polymorpheus/interface_builder/association.rb
81
80
  - lib/polymorpheus/mysql_adapter.rb
82
- - lib/polymorpheus/mysql_adapter/foreigner_constraints.rb
83
81
  - lib/polymorpheus/postgresql_adapter.rb
84
82
  - lib/polymorpheus/railtie.rb
85
83
  - lib/polymorpheus/schema_dumper.rb
@@ -94,19 +92,18 @@ files:
94
92
  - spec/mysql2_adapter_spec.rb
95
93
  - spec/schema_dumper_spec.rb
96
94
  - spec/spec_helper.rb
97
- - spec/support/active_record/connection_adapters/abstract_mysql_adapter.rb
98
95
  - spec/support/class_defs.rb
99
96
  - spec/support/connection_helpers.rb
100
97
  - spec/support/custom_matchers.rb
101
98
  - spec/support/schema_helpers.rb
102
- - spec/support/sql_logger.rb
99
+ - spec/support/sql_query_subscriber.rb
103
100
  - spec/support/sql_test_helpers.rb
104
101
  - spec/trigger_spec.rb
105
102
  homepage: http://github.com/wegowise/polymorpheus
106
103
  licenses:
107
104
  - MIT
108
105
  metadata: {}
109
- post_install_message:
106
+ post_install_message:
110
107
  rdoc_options: []
111
108
  require_paths:
112
109
  - lib
@@ -114,16 +111,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
114
111
  requirements:
115
112
  - - ">="
116
113
  - !ruby/object:Gem::Version
117
- version: '0'
114
+ version: '2.6'
118
115
  required_rubygems_version: !ruby/object:Gem::Requirement
119
116
  requirements:
120
117
  - - ">="
121
118
  - !ruby/object:Gem::Version
122
119
  version: 1.3.6
123
120
  requirements: []
124
- rubyforge_project:
125
- rubygems_version: 2.6.12
126
- signing_key:
121
+ rubygems_version: 3.3.6
122
+ signing_key:
127
123
  specification_version: 4
128
124
  summary: Provides a database-friendly method for polymorphic relationships
129
125
  test_files: []
@@ -1,29 +0,0 @@
1
- module Polymorpheus
2
- module Interface
3
- module HasManyAsPolymorph
4
- def has_many_as_polymorph(association, options = {})
5
- options.symbolize_keys!
6
- fkey = name.foreign_key
7
-
8
- class_name = options[:class_name] || association.to_s.classify
9
-
10
- options[:conditions] = proc do
11
- keys = class_name.constantize
12
- .const_get('POLYMORPHEUS_ASSOCIATIONS')
13
- .map(&:foreign_key)
14
- keys.delete(fkey)
15
-
16
- nil_columns = keys.reduce({}) { |hash, key| hash.merge!(key => nil) }
17
-
18
- if self.is_a?(ActiveRecord::Associations::JoinDependency::JoinAssociation)
19
- { aliased_table_name => nil_columns }
20
- else
21
- { association => nil_columns }
22
- end
23
- end
24
-
25
- has_many association, options
26
- end
27
- end
28
- end
29
- end
@@ -1,30 +0,0 @@
1
- module Polymorpheus
2
- module ConnectionAdapters
3
- module MysqlAdapter
4
- def generate_constraints(options)
5
- constraints = []
6
-
7
- ['delete', 'update'].each do |event|
8
- option = "on_#{event}".to_sym
9
- next unless options.has_key?(option) &&
10
- options[option].respond_to?(:to_sym)
11
-
12
- action = case options[option].to_sym
13
- when :nullify then 'SET NULL'
14
- when :cascade then 'CASCADE'
15
- when :restrict then 'RESTRICT'
16
- else
17
- fail ArgumentError, <<-EOS
18
- '#{options[option]}' is not supported for :on_update or :on_delete.
19
- Supported values are: :nullify, :cascade, :restrict
20
- EOS
21
- end
22
-
23
- constraints << "ON #{event.upcase} #{action}"
24
- end
25
-
26
- { :options => constraints.join(' ') }
27
- end
28
- end
29
- end
30
- end
@@ -1,9 +0,0 @@
1
- # Patch support for MySQL 5.7+ onto ActiveRecord < 4.1.
2
- if ActiveRecord::VERSION::MAJOR < 4 ||
3
- (ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR < 1)
4
-
5
- require 'active_record/connection_adapters/abstract_mysql_adapter'
6
- class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
7
- NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
8
- end
9
- end
@@ -1,30 +0,0 @@
1
- module Polymorpheus
2
- module SqlLogger
3
-
4
- def sql_statements
5
- @sql_statements ||= []
6
- end
7
-
8
- def clear_sql_history
9
- @sql_statements = nil
10
- end
11
-
12
- def stub_sql(statement, response)
13
- @stubbed ||= {}
14
- @stubbed[statement] = response
15
- end
16
-
17
- private
18
-
19
- def log_sql_statements(sql, name = nil)
20
- if @stubbed && @stubbed.has_key?(sql)
21
- @stubbed[sql]
22
- else
23
- sql_statements << sql
24
- original_execute(sql, name)
25
- end
26
- end
27
-
28
- end
29
- end
30
-