polyamorous 1.2.0 → 1.3.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
2
  SHA1:
3
- metadata.gz: a754ac3545728f4de5d4d5e4f75687991f7b41ca
4
- data.tar.gz: c2a55008f158f99fd534e66b2306e045271edf1d
3
+ metadata.gz: 974ca93cd847897179ae0ad4d5a2628bd65a8444
4
+ data.tar.gz: 7183fb57fe8068011d9add6efd750d9386c87342
5
5
  SHA512:
6
- metadata.gz: 1ae3f57016adf1c30563485ae3ae7155aa3e95c880241231e346930de0ab16e1a75082d79563ba2850f2f2513ab7f7a92dd78a5d14e88c19e0aebaf551cdf422
7
- data.tar.gz: e0f9296bbbe67e09691d67e5d70b4a0809e71db9ae9a79fcd6bfed483834cf9dae15bf733ed22f645009a7cca66d4f4f79a7fd6aef3952a28fd75d4259e41f06
6
+ metadata.gz: 1e8ddde2bf2c992b252712c63c96cac958a59289887650ac6c611481f77a4b7f5f69e7375f010afddb065dbfc955bbefe91b4dc397404978ccb6f10cff278a82
7
+ data.tar.gz: d193721ba969fd2ff9f08bf227be4a7d9192cb303fa7b3c51c37d762fe363c01f6b7b89d1b08c714cfbd69afec97a8c16f715b0347181ca87734e61fdfdb0da0
data/.travis.yml CHANGED
@@ -6,7 +6,7 @@ before_install:
6
6
  - travis_retry gem install bundler
7
7
 
8
8
  rvm:
9
- - 2.2.1
9
+ - 2.2.3
10
10
  - 2.1
11
11
  - 2.0
12
12
  - 1.9
@@ -38,11 +38,11 @@ env:
38
38
 
39
39
  matrix:
40
40
  include:
41
- - rvm: 2.2.1
41
+ - rvm: 2.2.3
42
42
  env: RAILS=master DB=sqlite3
43
- - rvm: 2.2.1
43
+ - rvm: 2.2.3
44
44
  env: RAILS=master DB=mysql
45
- - rvm: 2.2.1
45
+ - rvm: 2.2.3
46
46
  env: RAILS=master DB=postgres
47
47
  allow_failures:
48
48
  - env: RAILS=master DB=sqlite3
data/README.md CHANGED
@@ -4,15 +4,23 @@
4
4
  (https://travis-ci.org/activerecord-hackery/polyamorous)
5
5
  [![Gem Version](https://badge.fury.io/rb/polyamorous.svg)]
6
6
  (http://badge.fury.io/rb/polyamorous)
7
+ [![Code Climate](https://codeclimate.com/github/activerecord-hackery/polyamorous/badges/gpa.svg)]
8
+ (https://codeclimate.com/github/activerecord-hackery/polyamorous)
7
9
 
8
- Polyamorous is an extraction from MetaSearch 1.1.x, Ransack, and Squeel by
10
+ Polyamorous is an extraction of shared code from the
11
+ [Active Record Hackery](https://github.com/activerecord-hackery) gems
12
+ [Ransack](https://github.com/activerecord-hackery/ransack),
13
+ [Squeel](https://github.com/activerecord-hackery/squeel) and
14
+ [MetaSearch](https://github.com/activerecord-hackery/meta_search) by
9
15
  [Ernie Miller](http://twitter.com/erniemiller) and maintained by
10
16
  [Ryan Bigg](http://twitter.com/ryanbigg),
11
17
  [Xiang Li](http://bigxiang.github.io),
12
- [Jon Atack](http://twitter.com/jonatack) and a great group of
18
+ [Jon Atack](http://twitter.com/jonatack) and a great little group of
13
19
  [contributors]
14
20
  (https://github.com/activerecord-hackery/polyamorous/graphs/contributors).
15
21
 
16
- ## Copyright
22
+ It is an internal library for extending various versions of Active Record with
23
+ polymorphism. There is no public API, so it's ":nodoc:". Move along. Nothing to
24
+ see here.
17
25
 
18
26
  Copyright © 2011-2015 [Ernie Miller](http://twitter.com/erniemiller)
data/lib/polyamorous.rb CHANGED
@@ -25,15 +25,8 @@ if defined?(::ActiveRecord)
25
25
  require 'polyamorous/join'
26
26
  require 'polyamorous/swapping_reflection_class'
27
27
 
28
- ar_version =
29
- case ::ActiveRecord::VERSION::STRING[0,3]
30
- when '4.2', '5.0'
31
- '4.2'
32
- when '4.1'
33
- '4.1'
34
- else
35
- '3_and_4.0'
36
- end
28
+ ar_version = ::ActiveRecord::VERSION::STRING[0,3]
29
+ ar_version = '3_and_4.0' if ar_version < '4.1'
37
30
 
38
31
  method, ruby_version =
39
32
  if RUBY_VERSION >= '2.0' && ar_version >= '4.1'
@@ -1,4 +1,4 @@
1
1
  # active_record_4.1_ruby_1.9/join_dependency.rb
2
2
  require 'polyamorous/activerecord_4.2_ruby_2/join_dependency'
3
3
  require 'polyamorous/activerecord_4.2_ruby_1.9/join_dependency'
4
- require 'polyamorous/activerecord_4.1_ruby_2/make_joins'
4
+ require 'polyamorous/activerecord_4.1_ruby_2/make_polyamorous_inner_joins'
@@ -1,2 +1,2 @@
1
1
  # active_record_4.1_ruby_2/join_association.rb
2
- require 'polyamorous/activerecord_4.2_ruby_2/join_association'
2
+ require 'polyamorous/activerecord_5.0_ruby_2/join_association'
@@ -1,3 +1,3 @@
1
1
  # active_record_4.1_ruby_2/join_dependency.rb
2
2
  require 'polyamorous/activerecord_4.2_ruby_2/join_dependency'
3
- require 'polyamorous/activerecord_4.1_ruby_2/make_joins'
3
+ require 'polyamorous/activerecord_4.1_ruby_2/make_polyamorous_inner_joins'
@@ -1,11 +1,13 @@
1
1
  module Polyamorous
2
2
  module JoinDependencyExtensions
3
3
  # Replaces ActiveRecord::Associations::JoinDependency#make_inner_joins
4
- def make_joins(parent, child)
4
+ def make_polyamorous_inner_joins(parent, child)
5
5
  make_constraints(
6
6
  parent, child, child.tables, child.join_type || Arel::Nodes::InnerJoin
7
7
  )
8
- .concat child.children.flat_map { |c| make_inner_joins(child, c) }
8
+ .concat child.children.flat_map { |c|
9
+ make_polyamorous_inner_joins(child, c)
10
+ }
9
11
  end
10
12
  end
11
13
  end
@@ -25,21 +25,12 @@ module Polyamorous
25
25
  if name.is_a? Join
26
26
  reflection = find_reflection base_klass, name.name
27
27
  reflection.check_validity!
28
- if reflection.polymorphic?
29
- JoinAssociation.new(
30
- reflection,
31
- build(right, name.klass || base_klass),
32
- name.klass,
33
- name.type
34
- )
28
+ klass = if reflection.polymorphic?
29
+ name.klass || base_klass
35
30
  else
36
- JoinAssociation.new(
37
- reflection,
38
- build(right, reflection.klass),
39
- name.klass,
40
- name.type
41
- )
31
+ reflection.klass
42
32
  end
33
+ JoinAssociation.new(reflection, build(right, klass), name.klass, name.type)
43
34
  else
44
35
  reflection = find_reflection base_klass, name
45
36
  reflection.check_validity!
@@ -52,10 +43,10 @@ module Polyamorous
52
43
  end
53
44
 
54
45
  # Replaces ActiveRecord::Associations::JoinDependency#join_constraints
55
- # to call #make_joins instead of #make_inner_joins.
46
+ # to call #make_polyamorous_inner_joins instead of #make_inner_joins.
56
47
  def join_constraints_with_polymorphism(outer_joins)
57
48
  joins = join_root.children.flat_map { |child|
58
- make_joins(join_root, child)
49
+ make_polyamorous_inner_joins join_root, child
59
50
  }
60
51
  joins.concat outer_joins.flat_map { |oj|
61
52
  if join_root.match? oj.join_root
@@ -71,20 +62,8 @@ module Polyamorous
71
62
  module ClassMethods
72
63
  # Replaces ActiveRecord::Associations::JoinDependency#self.walk_tree
73
64
  def walk_tree_with_polymorphism(associations, hash)
74
- case associations
75
- when TreeNode
65
+ if TreeNode === associations
76
66
  associations.add_to_tree(hash)
77
- when Hash
78
- associations.each do |k, v|
79
- cache =
80
- case k
81
- when TreeNode
82
- k.add_to_tree(hash)
83
- else
84
- hash[k] ||= {}
85
- end
86
- walk_tree(v, cache)
87
- end
88
67
  else
89
68
  walk_tree_without_polymorphism(associations, hash)
90
69
  end
@@ -1,37 +1,2 @@
1
1
  # active_record_4.2_ruby_2/join_association.rb
2
- module Polyamorous
3
- module JoinAssociationExtensions
4
- include SwappingReflectionClass
5
- def self.prepended(base)
6
- base.class_eval { attr_reader :join_type }
7
- end
8
-
9
- def initialize(reflection, children, polymorphic_class = nil,
10
- join_type = Arel::Nodes::InnerJoin)
11
- @join_type = join_type
12
- if polymorphic_class && ::ActiveRecord::Base > polymorphic_class
13
- swapping_reflection_klass(reflection, polymorphic_class) do |reflection|
14
- super(reflection, children)
15
- self.reflection.options[:polymorphic] = true
16
- end
17
- else
18
- super(reflection, children)
19
- end
20
- end
21
-
22
- # Reference https://github.com/rails/rails/commit/9b15db51b78028bfecdb85595624de4b838adbd1
23
- # NOTE Not sure we still need it?
24
- def ==(other)
25
- base_klass == other.base_klass
26
- end
27
-
28
- def build_constraint(klass, table, key, foreign_table, foreign_key)
29
- if reflection.polymorphic?
30
- super(klass, table, key, foreign_table, foreign_key)
31
- .and(foreign_table[reflection.foreign_type].eq(reflection.klass.name))
32
- else
33
- super(klass, table, key, foreign_table, foreign_key)
34
- end
35
- end
36
- end
37
- end
2
+ require 'polyamorous/activerecord_5.0_ruby_2/join_association'
@@ -1,61 +1,14 @@
1
1
  # active_record_4.2_ruby_2/join_dependency.rb
2
+ require 'polyamorous/activerecord_5.0_ruby_2/join_dependency'
3
+
2
4
  module Polyamorous
3
5
  module JoinDependencyExtensions
4
- # Replaces ActiveRecord::Associations::JoinDependency#build
5
- def build(associations, base_klass)
6
- associations.map do |name, right|
7
- if name.is_a? Join
8
- reflection = find_reflection base_klass, name.name
9
- reflection.check_validity!
10
- if reflection.polymorphic?
11
- JoinAssociation.new(
12
- reflection,
13
- build(right, name.klass || base_klass),
14
- name.klass,
15
- name.type
16
- )
17
- else
18
- JoinAssociation.new(
19
- reflection,
20
- build(right, reflection.klass),
21
- name.klass,
22
- name.type
23
- )
24
- end
25
- else
26
- reflection = find_reflection base_klass, name
27
- reflection.check_validity!
28
- if reflection.polymorphic?
29
- raise ActiveRecord::EagerLoadPolymorphicError.new(reflection)
30
- end
31
- JoinAssociation.new reflection, build(right, reflection.klass)
32
- end
33
- end
34
- end
35
-
36
- def find_join_association_respecting_polymorphism(reflection, parent, klass)
37
- if association = parent.children.find { |j| j.reflection == reflection }
38
- unless reflection.polymorphic?
39
- association
40
- else
41
- association if association.base_klass == klass
42
- end
43
- end
44
- end
45
-
46
- def build_join_association_respecting_polymorphism(reflection, parent, klass)
47
- if reflection.polymorphic? && klass
48
- JoinAssociation.new(reflection, self, klass)
49
- else
50
- JoinAssociation.new(reflection, self)
51
- end
52
- end
53
-
54
6
  # Replaces ActiveRecord::Associations::JoinDependency#join_constraints
55
- # to call #make_joins instead of #make_inner_joins.
7
+ # to call #make_polyamorous_inner_joins instead of #make_inner_joins.
8
+ #
56
9
  def join_constraints(outer_joins)
57
10
  joins = join_root.children.flat_map { |child|
58
- make_joins(join_root, child)
11
+ make_polyamorous_inner_joins join_root, child
59
12
  }
60
13
  joins.concat outer_joins.flat_map { |oj|
61
14
  if join_root.match? oj.join_root
@@ -67,39 +20,5 @@ module Polyamorous
67
20
  end
68
21
  }
69
22
  end
70
-
71
- # Replaces ActiveRecord::Associations::JoinDependency#make_inner_joins
72
- def make_joins(parent, child)
73
- [
74
- make_constraints(
75
- parent, child, child.tables, child.join_type || Arel::Nodes::InnerJoin
76
- )
77
- ] + child.children.flat_map { |c| make_inner_joins(child, c) }
78
- end
79
-
80
- private :make_joins
81
-
82
- module ClassMethods
83
- # Prepended before ActiveRecord::Associations::JoinDependency#self.walk_tree
84
- def walk_tree(associations, hash)
85
- case associations
86
- when TreeNode
87
- associations.add_to_tree(hash)
88
- when Hash
89
- associations.each do |k, v|
90
- cache =
91
- case k
92
- when TreeNode
93
- k.add_to_tree(hash)
94
- else
95
- hash[k] ||= {}
96
- end
97
- walk_tree(v, cache)
98
- end
99
- else
100
- super(associations, hash)
101
- end
102
- end
103
- end
104
23
  end
105
24
  end
@@ -0,0 +1,38 @@
1
+ # active_record_5.0_ruby_2/join_association.rb
2
+
3
+ module Polyamorous
4
+ module JoinAssociationExtensions
5
+ include SwappingReflectionClass
6
+ def self.prepended(base)
7
+ base.class_eval { attr_reader :join_type }
8
+ end
9
+
10
+ def initialize(reflection, children, polymorphic_class = nil,
11
+ join_type = Arel::Nodes::InnerJoin)
12
+ @join_type = join_type
13
+ if polymorphic_class && ::ActiveRecord::Base > polymorphic_class
14
+ swapping_reflection_klass(reflection, polymorphic_class) do |reflection|
15
+ super(reflection, children)
16
+ self.reflection.options[:polymorphic] = true
17
+ end
18
+ else
19
+ super(reflection, children)
20
+ end
21
+ end
22
+
23
+ # Reference: https://github.com/rails/rails/commit/9b15db5
24
+ # NOTE: Not sure we still need it?
25
+ def ==(other)
26
+ base_klass == other.base_klass
27
+ end
28
+
29
+ def build_constraint(klass, table, key, foreign_table, foreign_key)
30
+ if reflection.polymorphic?
31
+ super(klass, table, key, foreign_table, foreign_key)
32
+ .and(foreign_table[reflection.foreign_type].eq(reflection.klass.name))
33
+ else
34
+ super(klass, table, key, foreign_table, foreign_key)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,116 @@
1
+ # active_record_5.0_ruby_2/join_dependency.rb
2
+
3
+ module Polyamorous
4
+ module JoinDependencyExtensions
5
+
6
+ # Replaces ActiveRecord::Associations::JoinDependency#build.
7
+ #
8
+ def build(associations, base_klass)
9
+ associations.map do |name, right|
10
+ if name.is_a? Join
11
+ reflection = find_reflection base_klass, name.name
12
+ reflection.check_validity!
13
+ klass = if reflection.polymorphic?
14
+ name.klass || base_klass
15
+ else
16
+ reflection.klass
17
+ end
18
+ JoinAssociation.new(reflection, build(right, klass), name.klass, name.type)
19
+ else
20
+ reflection = find_reflection base_klass, name
21
+ reflection.check_validity!
22
+ if reflection.polymorphic?
23
+ raise ActiveRecord::EagerLoadPolymorphicError.new(reflection)
24
+ end
25
+ JoinAssociation.new reflection, build(right, reflection.klass)
26
+ end
27
+ end
28
+ end
29
+
30
+ def find_join_association_respecting_polymorphism(reflection, parent, klass)
31
+ if association = parent.children.find { |j| j.reflection == reflection }
32
+ unless reflection.polymorphic?
33
+ association
34
+ else
35
+ association if association.base_klass == klass
36
+ end
37
+ end
38
+ end
39
+
40
+ def build_join_association_respecting_polymorphism(reflection, parent, klass)
41
+ if reflection.polymorphic? && klass
42
+ JoinAssociation.new(reflection, self, klass)
43
+ else
44
+ JoinAssociation.new(reflection, self)
45
+ end
46
+ end
47
+
48
+ # Replaces ActiveRecord::Associations::JoinDependency#join_constraints.
49
+ #
50
+ # This internal method was changed in Rails 5.0 by commit
51
+ # https://github.com/rails/rails/commit/e038975 which added
52
+ # left_outer_joins (see #make_polyamorous_left_outer_joins below) and added
53
+ # passing an additional argument, `join_type`, to #join_constraints.
54
+ #
55
+ def join_constraints(outer_joins, join_type)
56
+ joins = join_root.children.flat_map { |child|
57
+ if join_type == Arel::Nodes::OuterJoin
58
+ make_polyamorous_left_outer_joins join_root, child
59
+ else
60
+ make_polyamorous_inner_joins join_root, child
61
+ end
62
+ }
63
+
64
+ joins.concat outer_joins.flat_map { |oj|
65
+ if join_root.match? oj.join_root
66
+ walk(join_root, oj.join_root)
67
+ else
68
+ oj.join_root.children.flat_map { |child|
69
+ make_outer_joins(oj.join_root, child)
70
+ }
71
+ end
72
+ }
73
+ end
74
+
75
+ # Replaces ActiveRecord::Associations::JoinDependency#make_left_outer_joins,
76
+ # a new method that was added in Rails 5.0 with the following commit:
77
+ # https://github.com/rails/rails/commit/e038975
78
+ #
79
+ def make_polyamorous_left_outer_joins(parent, child)
80
+ tables = child.tables
81
+ join_type = child.join_type || Arel::Nodes::OuterJoin
82
+ info = make_constraints parent, child, tables, join_type
83
+
84
+ [info] + child.children.flat_map { |c|
85
+ make_polyamorous_left_outer_joins(child, c)
86
+ }
87
+ end
88
+
89
+ # Replaces ActiveRecord::Associations::JoinDependency#make_inner_joins.
90
+ #
91
+ def make_polyamorous_inner_joins(parent, child)
92
+ tables = child.tables
93
+ join_type = child.join_type || Arel::Nodes::InnerJoin
94
+ info = make_constraints parent, child, tables, join_type
95
+
96
+ [info] + child.children.flat_map { |c|
97
+ make_polyamorous_inner_joins(child, c)
98
+ }
99
+ end
100
+
101
+ private :make_polyamorous_inner_joins, :make_polyamorous_left_outer_joins
102
+
103
+ module ClassMethods
104
+ # Prepended before ActiveRecord::Associations::JoinDependency#walk_tree.
105
+ #
106
+ def walk_tree(associations, hash)
107
+ if TreeNode === associations
108
+ associations.add_to_tree(hash)
109
+ else
110
+ super(associations, hash)
111
+ end
112
+ end
113
+ end
114
+
115
+ end
116
+ end
@@ -1,3 +1,3 @@
1
1
  module Polyamorous
2
- VERSION = '1.2.0'
2
+ VERSION = '1.3.0'
3
3
  end
@@ -2,10 +2,53 @@ require 'spec_helper'
2
2
 
3
3
  module Polyamorous
4
4
  describe JoinAssociation do
5
- if ActiveRecord::VERSION::STRING >= '4.1'
6
- include_examples 'Join Association on ActiveRecord 4.1'
7
- else
8
- include_examples 'Join Association on ActiveRecord 3 and 4.0'
5
+
6
+ join_base, join_association_args, polymorphic =
7
+ if ActiveRecord::VERSION::STRING >= '4.1'
8
+ [:join_root, 'parent.children', 'reflection.options[:polymorphic]']
9
+ else
10
+ [:join_base, 'join_dependency, parent', 'options[:polymorphic]']
11
+ end
12
+
13
+ let(:join_dependency) { new_join_dependency Note, {} }
14
+ let(:reflection) { Note.reflect_on_association(:notable) }
15
+ let(:parent) { join_dependency.send(join_base) }
16
+ let(:join_association) {
17
+ eval("new_join_association(reflection, #{join_association_args}, Article)")
18
+ }
19
+
20
+ subject {
21
+ join_dependency.build_join_association_respecting_polymorphism(
22
+ reflection, parent, Person
23
+ )
24
+ }
25
+
26
+ it 'respects polymorphism on equality test' do
27
+ expect(subject).to eq(
28
+ join_dependency.build_join_association_respecting_polymorphism(
29
+ reflection, parent, Person
30
+ )
31
+ )
32
+ expect(subject).not_to eq(
33
+ join_dependency.build_join_association_respecting_polymorphism(
34
+ reflection, parent, Article
35
+ )
36
+ )
37
+ end
38
+
39
+ it 'leaves the orginal reflection intact for thread safety' do
40
+ reflection.instance_variable_set(:@klass, Article)
41
+ join_association
42
+ .swapping_reflection_klass(reflection, Person) do |new_reflection|
43
+ expect(new_reflection.options).not_to equal reflection.options
44
+ expect(new_reflection.options).not_to have_key(:polymorphic)
45
+ expect(new_reflection.klass).to eq(Person)
46
+ expect(reflection.klass).to eq(Article)
47
+ end
48
+ end
49
+
50
+ it 'sets the polmorphic option to true after initializing' do
51
+ expect(join_association.instance_eval(polymorphic)).to be_true
9
52
  end
10
53
  end
11
54
  end
@@ -2,10 +2,85 @@ require 'spec_helper'
2
2
 
3
3
  module Polyamorous
4
4
  describe JoinDependency do
5
- if ActiveRecord::VERSION::STRING >= '4.1'
6
- include_examples 'Join Dependency on ActiveRecord 4.1'
7
- else
8
- include_examples 'Join Dependency on ActiveRecord 3 and 4.0'
5
+
6
+ method, join_associations, join_base =
7
+ if ActiveRecord::VERSION::STRING >= '4.1'
8
+ [:instance_eval, 'join_root.drop(1)', :join_root]
9
+ else
10
+ [:send, 'join_associations', :join_base]
11
+ end
12
+
13
+ context 'with symbol joins' do
14
+ subject { new_join_dependency Person, :articles => :comments }
15
+
16
+ specify { expect(subject.send(method, join_associations).size)
17
+ .to eq 2 }
18
+ specify { expect(subject.send(method, join_associations).map(&:join_type))
19
+ .to be_all { Polyamorous::InnerJoin } }
20
+ end
21
+
22
+ context 'with has_many :through association' do
23
+ subject { new_join_dependency Person, :authored_article_comments }
24
+
25
+ specify { expect(subject.send(method, join_associations).size)
26
+ .to eq 1 }
27
+ specify { expect(subject.send(method, join_associations).first.table_name)
28
+ .to eq 'comments' }
29
+ end
30
+
31
+ context 'with outer join' do
32
+ subject { new_join_dependency Person, new_join(:articles, :outer) }
33
+
34
+ specify { expect(subject.send(method, join_associations).size)
35
+ .to eq 1 }
36
+ specify { expect(subject.send(method, join_associations).first.join_type)
37
+ .to eq Polyamorous::OuterJoin }
38
+ end
39
+
40
+ context 'with nested outer joins' do
41
+ subject { new_join_dependency Person,
42
+ new_join(:articles, :outer) => new_join(:comments, :outer) }
43
+
44
+ specify { expect(subject.send(method, join_associations).size)
45
+ .to eq 2 }
46
+ specify { expect(subject.send(method, join_associations).map(&:join_type))
47
+ .to eq [Polyamorous::OuterJoin, Polyamorous::OuterJoin] }
48
+ specify { expect(subject.send(method, join_associations).map(&:join_type))
49
+ .to be_all { Polyamorous::OuterJoin } }
50
+ end
51
+
52
+ context 'with polymorphic belongs_to join' do
53
+ subject { new_join_dependency Note, new_join(:notable, :inner, Person) }
54
+
55
+ specify { expect(subject.send(method, join_associations).size)
56
+ .to eq 1 }
57
+ specify { expect(subject.send(method, join_associations).first.join_type)
58
+ .to eq Polyamorous::InnerJoin }
59
+ specify { expect(subject.send(method, join_associations).first.table_name)
60
+ .to eq 'people' }
61
+
62
+ it 'finds a join association respecting polymorphism' do
63
+ parent = subject.send(join_base)
64
+ reflection = Note.reflect_on_association(:notable)
65
+
66
+ expect(subject.find_join_association_respecting_polymorphism(
67
+ reflection, parent, Person))
68
+ .to eq subject.send(method, join_associations).first
69
+ end
70
+ end
71
+
72
+ context 'with polymorphic belongs_to join and nested symbol join' do
73
+ subject { new_join_dependency Note,
74
+ new_join(:notable, :inner, Person) => :comments }
75
+
76
+ specify { expect(subject.send(method, join_associations).size)
77
+ .to eq 2 }
78
+ specify { expect(subject.send(method, join_associations).map(&:join_type))
79
+ .to be_all { Polyamorous::InnerJoin } }
80
+ specify { expect(subject.send(method, join_associations).first.table_name)
81
+ .to eq 'people' }
82
+ specify { expect(subject.send(method, join_associations)[1].table_name)
83
+ .to eq 'comments' }
9
84
  end
10
85
  end
11
86
  end
@@ -7,7 +7,7 @@ module Polyamorous
7
7
  expect(join).to be_kind_of(TreeNode)
8
8
  end
9
9
 
10
- it 'can be add to a tree' do
10
+ it 'can be added to a tree' do
11
11
  join = new_join(:articles, :outer)
12
12
 
13
13
  tree_hash = {}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyamorous
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ernie Miller
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-04-05 00:00:00.000000000 Z
14
+ date: 2015-12-09 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activerecord
@@ -108,11 +108,13 @@ files:
108
108
  - lib/polyamorous/activerecord_4.1_ruby_1.9/join_dependency.rb
109
109
  - lib/polyamorous/activerecord_4.1_ruby_2/join_association.rb
110
110
  - lib/polyamorous/activerecord_4.1_ruby_2/join_dependency.rb
111
- - lib/polyamorous/activerecord_4.1_ruby_2/make_joins.rb
111
+ - lib/polyamorous/activerecord_4.1_ruby_2/make_polyamorous_inner_joins.rb
112
112
  - lib/polyamorous/activerecord_4.2_ruby_1.9/join_association.rb
113
113
  - lib/polyamorous/activerecord_4.2_ruby_1.9/join_dependency.rb
114
114
  - lib/polyamorous/activerecord_4.2_ruby_2/join_association.rb
115
115
  - lib/polyamorous/activerecord_4.2_ruby_2/join_dependency.rb
116
+ - lib/polyamorous/activerecord_5.0_ruby_2/join_association.rb
117
+ - lib/polyamorous/activerecord_5.0_ruby_2/join_dependency.rb
116
118
  - lib/polyamorous/join.rb
117
119
  - lib/polyamorous/swapping_reflection_class.rb
118
120
  - lib/polyamorous/tree_node.rb
@@ -129,10 +131,6 @@ files:
129
131
  - spec/polyamorous/join_spec.rb
130
132
  - spec/spec_helper.rb
131
133
  - spec/support/schema.rb
132
- - spec/support/shared_examples/join_association_3_and_4.0.rb
133
- - spec/support/shared_examples/join_association_4.1.rb
134
- - spec/support/shared_examples/join_dependency_3_and_4.0.rb
135
- - spec/support/shared_examples/join_dependency_4.1.rb
136
134
  homepage: https://github.com/activerecord-hackery/polyamorous
137
135
  licenses:
138
136
  - MIT
@@ -153,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
151
  version: '0'
154
152
  requirements: []
155
153
  rubyforge_project: polyamorous
156
- rubygems_version: 2.4.6
154
+ rubygems_version: 2.5.0
157
155
  signing_key:
158
156
  specification_version: 4
159
157
  summary: Loves/is loved by polymorphic belongs_to associations, Ransack, Squeel, MetaSearch...
@@ -169,7 +167,3 @@ test_files:
169
167
  - spec/polyamorous/join_spec.rb
170
168
  - spec/spec_helper.rb
171
169
  - spec/support/schema.rb
172
- - spec/support/shared_examples/join_association_3_and_4.0.rb
173
- - spec/support/shared_examples/join_association_4.1.rb
174
- - spec/support/shared_examples/join_dependency_3_and_4.0.rb
175
- - spec/support/shared_examples/join_dependency_4.1.rb
@@ -1,42 +0,0 @@
1
- shared_examples 'Join Association on ActiveRecord 3 and 4.0' do
2
- let(:join_dependency) { new_join_dependency Note, {} }
3
- let(:reflection) { Note.reflect_on_association(:notable) }
4
- let(:parent) { join_dependency.join_base }
5
- let(:join_association) {
6
- new_join_association(reflection, join_dependency, parent, Article)
7
- }
8
-
9
- subject {
10
- join_dependency.build_join_association_respecting_polymorphism(
11
- reflection, parent, Person
12
- )
13
- }
14
-
15
- it 'respects polymorphism on equality test' do
16
- expect(subject).to eq(
17
- join_dependency.build_join_association_respecting_polymorphism(
18
- reflection, parent, Person
19
- )
20
- )
21
- expect(subject).not_to eq(
22
- join_dependency.build_join_association_respecting_polymorphism(
23
- reflection, parent, Article
24
- )
25
- )
26
- end
27
-
28
- it 'leaves the orginal reflection intact for thread safety' do
29
- reflection.instance_variable_set(:@klass, Article)
30
- join_association
31
- .swapping_reflection_klass(reflection, Person) do |new_reflection|
32
- expect(new_reflection.options).not_to equal reflection.options
33
- expect(new_reflection.options).not_to have_key(:polymorphic)
34
- expect(new_reflection.klass).to eq(Person)
35
- expect(reflection.klass).to eq(Article)
36
- end
37
- end
38
-
39
- it 'sets the polmorphic option to true after initializing' do
40
- expect(join_association.options[:polymorphic]).to be_true
41
- end
42
- end
@@ -1,42 +0,0 @@
1
- shared_examples 'Join Association on ActiveRecord 4.1' do
2
- let(:join_dependency) { new_join_dependency Note, {} }
3
- let(:reflection) { Note.reflect_on_association(:notable) }
4
- let(:parent) { join_dependency.join_root }
5
- let(:join_association) {
6
- new_join_association(reflection, parent.children, Article)
7
- }
8
-
9
- subject {
10
- join_dependency.build_join_association_respecting_polymorphism(
11
- reflection, parent, Person
12
- )
13
- }
14
-
15
- it 'respects polymorphism on equality test' do
16
- expect(subject).to eq(
17
- join_dependency.build_join_association_respecting_polymorphism(
18
- reflection, parent, Person
19
- )
20
- )
21
- expect(subject).not_to eq(
22
- join_dependency.build_join_association_respecting_polymorphism(
23
- reflection, parent, Article
24
- )
25
- )
26
- end
27
-
28
- it 'leaves the orginal reflection intact for thread safety' do
29
- reflection.instance_variable_set(:@klass, Article)
30
- join_association
31
- .swapping_reflection_klass(reflection, Person) do |new_reflection|
32
- expect(new_reflection.options).not_to equal reflection.options
33
- expect(new_reflection.options).not_to have_key(:polymorphic)
34
- expect(new_reflection.klass).to eq(Person)
35
- expect(reflection.klass).to eq(Article)
36
- end
37
- end
38
-
39
- it 'sets the polmorphic option to true after initializing' do
40
- expect(join_association.reflection.options[:polymorphic]).to be_true
41
- end
42
- end
@@ -1,65 +0,0 @@
1
- shared_examples "Join Dependency on ActiveRecord 3 and 4.0" do
2
- context 'with symbol joins' do
3
- subject { new_join_dependency Person, :articles => :comments }
4
-
5
- specify { expect(subject.join_associations.size).to eq(2) }
6
- specify { expect(subject.join_associations)
7
- .to be_all { |a| a.join_type == Polyamorous::InnerJoin } }
8
- end
9
-
10
- context 'with has_many :through association' do
11
- subject { new_join_dependency Person, :authored_article_comments }
12
-
13
- specify { expect(subject.join_associations.size).to eq(1) }
14
- specify { expect(subject.join_associations.first.table_name)
15
- .to eq 'comments' }
16
- end
17
-
18
- context 'with outer join' do
19
- subject { new_join_dependency Person, new_join(:articles, :outer) }
20
-
21
- specify { expect(subject.join_associations.size).to eq(1) }
22
- specify { expect(subject.join_associations)
23
- .to be_all { |a| a.join_type == Polyamorous::OuterJoin } }
24
- end
25
-
26
- context 'with nested outer joins' do
27
- subject { new_join_dependency Person,
28
- new_join(:articles, :outer) => new_join(:comments, :outer) }
29
-
30
- specify { expect(subject.join_associations.size).to eq(2) }
31
- specify { expect(subject.join_associations)
32
- .to be_all { |a| a.join_type == Polyamorous::OuterJoin } }
33
- end
34
-
35
- context 'with polymorphic belongs_to join' do
36
- subject { new_join_dependency Note, new_join(:notable, :inner, Person) }
37
-
38
- specify { expect(subject.join_associations.size).to eq(1) }
39
- specify { expect(subject.join_associations)
40
- .to be_all { |a| a.join_type == Polyamorous::InnerJoin } }
41
- specify { expect(subject.join_associations.first.table_name)
42
- .to eq 'people' }
43
-
44
- it 'finds a join association respecting polymorphism' do
45
- parent = subject.join_base
46
- reflection = Note.reflect_on_association(:notable)
47
- expect(subject.find_join_association_respecting_polymorphism(
48
- reflection, parent, Person
49
- )).to eq subject.join_associations.first
50
- end
51
- end
52
-
53
- context 'with polymorphic belongs_to join and nested symbol join' do
54
- subject { new_join_dependency Note,
55
- new_join(:notable, :inner, Person) => :comments }
56
-
57
- specify { expect(subject.join_associations.size).to eq(2) }
58
- specify { expect(subject.join_associations)
59
- .to be_all { |a| a.join_type == Polyamorous::InnerJoin } }
60
- specify { expect(subject.join_associations.first.table_name)
61
- .to eq 'people' }
62
- specify { expect(subject.join_associations[1].table_name)
63
- .to eq 'comments' }
64
- end
65
- end
@@ -1,65 +0,0 @@
1
- shared_examples "Join Dependency on ActiveRecord 4.1" do
2
- context 'with symbol joins' do
3
- subject { new_join_dependency Person, :articles => :comments }
4
-
5
- specify { expect(subject.join_root.drop(1).size).to eq(2) }
6
- specify { expect(subject.join_root.drop(1).map(&:join_type))
7
- .to be_all { Polyamorous::InnerJoin } }
8
- end
9
-
10
- context 'with has_many :through association' do
11
- subject { new_join_dependency Person, :authored_article_comments }
12
-
13
- specify { expect(subject.join_root.drop(1).size).to eq(1) }
14
- specify { expect(subject.join_root.drop(1).first.table_name)
15
- .to eq 'comments' }
16
- end
17
-
18
- context 'with outer join' do
19
- subject { new_join_dependency Person, new_join(:articles, :outer) }
20
-
21
- specify { expect(subject.join_root.drop(1).size).to eq(1) }
22
- specify { expect(subject.join_root.drop(1).first.join_type)
23
- .to eq Polyamorous::OuterJoin }
24
- end
25
-
26
- context 'with nested outer joins' do
27
- subject { new_join_dependency Person,
28
- new_join(:articles, :outer) => new_join(:comments, :outer) }
29
-
30
- specify { expect(subject.join_root.drop(1).size).to eq(2) }
31
- specify { expect(subject.join_root.drop(1).map(&:join_type))
32
- .to be_all { Polyamorous::OuterJoin } }
33
- end
34
-
35
- context 'with polymorphic belongs_to join' do
36
- subject { new_join_dependency Note, new_join(:notable, :inner, Person) }
37
-
38
- specify { expect(subject.join_root.drop(1).size).to eq(1) }
39
- specify { expect(subject.join_root.drop(1).first.join_type)
40
- .to eq Polyamorous::InnerJoin }
41
- specify { expect(subject.join_root.drop(1).first.table_name)
42
- .to eq 'people' }
43
-
44
- it 'finds a join association respecting polymorphism' do
45
- parent = subject.join_root
46
- reflection = Note.reflect_on_association(:notable)
47
- expect(subject.find_join_association_respecting_polymorphism(
48
- reflection, parent, Person
49
- )).to eq subject.join_root.drop(1).first
50
- end
51
- end
52
-
53
- context 'with polymorphic belongs_to join and nested symbol join' do
54
- subject { new_join_dependency Note,
55
- new_join(:notable, :inner, Person) => :comments }
56
-
57
- specify { expect(subject.join_root.drop(1).size).to eq(2) }
58
- specify { expect(subject.join_root.drop(1).map(&:join_type))
59
- .to be_all { Polyamorous::InnerJoin } }
60
- specify { expect(subject.join_root.drop(1).first.table_name)
61
- .to eq 'people' }
62
- specify { expect(subject.join_root.drop(1)[1].table_name)
63
- .to eq 'comments' }
64
- end
65
- end