baby_squeel 1.4.0.beta1 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -2
- data/ISSUE_TEMPLATE.md +1 -1
- data/README.md +1 -1
- data/baby_squeel.gemspec +0 -1
- data/lib/baby_squeel/active_record/calculations.rb +0 -13
- data/lib/baby_squeel/active_record/query_methods.rb +2 -8
- data/lib/baby_squeel/association.rb +7 -13
- data/lib/baby_squeel/calculation.rb +0 -6
- data/lib/baby_squeel/errors.rb +0 -10
- data/lib/baby_squeel/join_dependency.rb +71 -7
- data/lib/baby_squeel/version.rb +1 -1
- metadata +4 -19
- data/lib/baby_squeel/pluck.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1c744d9857aadfec2192c82fef09f2fb3f1c67765852da080bfcf3a1f5aba72
|
4
|
+
data.tar.gz: d3dfb10bcf6496c530f29a87146a53039c925cc3dc86fe9cfbced8eb8d0afd6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 211d541b43c1117bf46f79f220c34fbe5959fbc3597440ccfc3b4565fe087192d23342d365f757bda6ed5f03ba80cfbe2b03eea6e40955489f53e5f5813bb688
|
7
|
+
data.tar.gz: 431218e9d183f1507095036417af43b3d80b2189bb0c9abab5dc9e99c995f44cd79a0965b249ae468442ce3fa7436c8b86db2258efa6531a5ed80d00f16495ee
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
-
|
3
|
+
## [1.4.1] - 2021-06-17
|
4
|
+
## Fixed
|
5
|
+
- Fixed a bug related to checking the Active Record version.
|
6
|
+
|
7
|
+
## [1.4.0] - 2021-06-17
|
8
|
+
## Fixed
|
9
|
+
- Fix table alias when joining a polymorphic table twice (#108)
|
10
|
+
- Removed internal class `BabySqueel::Pluck`. You can still use `plucking`. For example, `Post.joining { author }.plucking { author.name }`
|
11
|
+
- Removed old code from Active Record < 5.2
|
12
|
+
- Removed dependency `join_dependency`
|
13
|
+
|
14
|
+
## [1.4.0.beta1] - 2021-04-21
|
15
|
+
## Fixed
|
16
|
+
- Add Support for activerecord '>= 5.2.3'
|
17
|
+
- Drop Support for Active Record versions that have reached EOL (activerecord < 5.2)
|
18
|
+
- Use polyamorous from ransack '~> 2.3'
|
4
19
|
|
5
20
|
## [1.3.1] - 2018-05-15
|
6
21
|
## Fixed
|
@@ -139,7 +154,10 @@ Nothing to see here.
|
|
139
154
|
### Added
|
140
155
|
- Initial support for selects, orders, wheres, and joins.
|
141
156
|
|
142
|
-
[Unreleased]: https://github.com/rzane/baby_squeel/compare/v1.
|
157
|
+
[Unreleased]: https://github.com/rzane/baby_squeel/compare/v1.4.1...HEAD
|
158
|
+
[1.4.1]: https://github.com/rzane/baby_squeel/compare/v1.4.0...v1.4.1
|
159
|
+
[1.4.0]: https://github.com/rzane/baby_squeel/compare/v1.4.0.beta1...v1.4.0
|
160
|
+
[1.4.0.beta1]: https://github.com/rzane/baby_squeel/compare/v1.3.1...v1.4.0.beta1
|
143
161
|
[1.3.1]: https://github.com/rzane/baby_squeel/compare/v1.3.0...v1.3.1
|
144
162
|
[1.3.0]: https://github.com/rzane/baby_squeel/compare/v1.2.1...v1.3.0
|
145
163
|
[1.2.1]: https://github.com/rzane/baby_squeel/compare/v1.2.0...v1.2.1
|
data/ISSUE_TEMPLATE.md
CHANGED
@@ -11,7 +11,7 @@ require 'minitest/autorun'
|
|
11
11
|
|
12
12
|
gemfile true do
|
13
13
|
source 'https://rubygems.org'
|
14
|
-
gem 'activerecord', '~> 5.
|
14
|
+
gem 'activerecord', '~> 5.2.0' # which Active Record version?
|
15
15
|
gem 'sqlite3'
|
16
16
|
gem 'baby_squeel', github: 'rzane/baby_squeel'
|
17
17
|
end
|
data/README.md
CHANGED
@@ -329,7 +329,7 @@ Check out the [migration guide](https://github.com/rzane/baby_squeel/wiki/Migrat
|
|
329
329
|
|
330
330
|
## Development
|
331
331
|
|
332
|
-
1. Pick an Active Record version to develop against, then export it: `export AR=
|
332
|
+
1. Pick an Active Record version to develop against, then export it: `export AR=5.2.0`.
|
333
333
|
2. Run `bin/setup` to install dependencies.
|
334
334
|
3. Run `rake` to run the specs.
|
335
335
|
|
data/baby_squeel.gemspec
CHANGED
@@ -21,7 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.add_dependency 'activerecord', '~> 5.2'
|
23
23
|
spec.add_dependency 'ransack', '~> 2.3'
|
24
|
-
spec.add_dependency 'join_dependency', '~> 0.1.4'
|
25
24
|
|
26
25
|
spec.add_development_dependency 'bundler', '~> 2'
|
27
26
|
spec.add_development_dependency 'rake', '~> 13.0'
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'baby_squeel/calculation'
|
2
|
-
require 'baby_squeel/pluck'
|
3
2
|
|
4
3
|
module BabySqueel
|
5
4
|
module ActiveRecord
|
6
5
|
module Calculations
|
7
6
|
def plucking(&block)
|
8
7
|
nodes = Array.wrap(DSL.evaluate(self, &block))
|
9
|
-
nodes = nodes.map { |node| Pluck.decorate(node) }
|
10
8
|
pluck(*nodes)
|
11
9
|
end
|
12
10
|
|
@@ -40,17 +38,6 @@ module BabySqueel
|
|
40
38
|
super
|
41
39
|
end
|
42
40
|
end
|
43
|
-
|
44
|
-
if ::ActiveRecord::VERSION::MAJOR < 5
|
45
|
-
# @override
|
46
|
-
def type_for(field)
|
47
|
-
if field.kind_of? Calculation
|
48
|
-
field
|
49
|
-
else
|
50
|
-
super
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
41
|
end
|
55
42
|
end
|
56
43
|
end
|
@@ -40,14 +40,8 @@ module BabySqueel
|
|
40
40
|
# Active Record will call `group_by` on the `joins`. The
|
41
41
|
# Injector has a custom `group_by` method that handles
|
42
42
|
# BabySqueel::Join nodes.
|
43
|
-
|
44
|
-
|
45
|
-
super manager, BabySqueel::JoinDependency::Injector.new(joins), aliases
|
46
|
-
end
|
47
|
-
else
|
48
|
-
def build_joins(manager, joins)
|
49
|
-
super manager, BabySqueel::JoinDependency::Injector.new(joins)
|
50
|
-
end
|
43
|
+
def build_joins(manager, joins, aliases)
|
44
|
+
super manager, BabySqueel::JoinDependency::Injector.new(joins), aliases
|
51
45
|
end
|
52
46
|
end
|
53
47
|
end
|
@@ -96,19 +96,13 @@ module BabySqueel
|
|
96
96
|
|
97
97
|
private
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
raise AssociationComparisonError.new(_reflection.name, other)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
else
|
110
|
-
def build_where_clause(_)
|
111
|
-
raise AssociationComparisonNotSupportedError.new(_reflection.name)
|
99
|
+
def build_where_clause(other)
|
100
|
+
if valid_where_clause?(other)
|
101
|
+
relation = @parent._scope.all
|
102
|
+
factory = relation.send(:where_clause_factory)
|
103
|
+
factory.build({ _reflection.name => other }, [])
|
104
|
+
else
|
105
|
+
raise AssociationComparisonError.new(_reflection.name, other)
|
112
106
|
end
|
113
107
|
end
|
114
108
|
|
@@ -6,12 +6,6 @@ module BabySqueel
|
|
6
6
|
@node = node
|
7
7
|
end
|
8
8
|
|
9
|
-
# This is only used in 4.2. We're just pretending to be
|
10
|
-
# a database column to fake the casting here.
|
11
|
-
def type_cast_from_database(value)
|
12
|
-
value
|
13
|
-
end
|
14
|
-
|
15
9
|
# In Active Record 5, we don't *need* this class to make
|
16
10
|
# calculations work. They happily accept arel. However,
|
17
11
|
# when grouping with a calculation, there's a really,
|
data/lib/baby_squeel/errors.rb
CHANGED
@@ -62,14 +62,4 @@ module BabySqueel
|
|
62
62
|
super "You can't compare association '#{name}' to #{other}."
|
63
63
|
end
|
64
64
|
end
|
65
|
-
|
66
|
-
class AssociationComparisonNotSupportedError < StandardError # :nodoc:
|
67
|
-
MESSAGE =
|
68
|
-
"Querying association '%{name}' with '==' and '!=' " \
|
69
|
-
"is only supported for ActiveRecord >=5."
|
70
|
-
|
71
|
-
def initialize(name)
|
72
|
-
super format(MESSAGE, name: name)
|
73
|
-
end
|
74
|
-
end
|
75
65
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'join_dependency'
|
2
|
-
|
3
1
|
module BabySqueel
|
4
2
|
module JoinDependency
|
5
3
|
# This class allows BabySqueel to slip custom
|
@@ -26,9 +24,7 @@ module BabySqueel
|
|
26
24
|
attr_reader :join_dependency
|
27
25
|
|
28
26
|
def initialize(relation)
|
29
|
-
@join_dependency =
|
30
|
-
:association_join if join.kind_of? BabySqueel::Join
|
31
|
-
end
|
27
|
+
@join_dependency = build(relation, collect_joins(relation))
|
32
28
|
end
|
33
29
|
|
34
30
|
# Find the alias of a BabySqueel::Association, by passing
|
@@ -38,7 +34,7 @@ module BabySqueel
|
|
38
34
|
# If we tell join_dependency to construct its tables, Active Record
|
39
35
|
# handles building the correct aliases and attaching them to its
|
40
36
|
# JoinDepenencies.
|
41
|
-
if
|
37
|
+
if at_least?("5.2.3")
|
42
38
|
join_dependency.send(:construct_tables!, join_dependency.send(:join_root))
|
43
39
|
end
|
44
40
|
|
@@ -48,17 +44,85 @@ module BabySqueel
|
|
48
44
|
|
49
45
|
private
|
50
46
|
|
47
|
+
Associations = ::ActiveRecord::Associations
|
48
|
+
|
51
49
|
def find_join_association(associations)
|
52
50
|
current = join_dependency.send(:join_root)
|
53
51
|
|
54
52
|
associations.each do |association|
|
55
53
|
name = association._reflection.name
|
56
|
-
current = current.children.find { |c| c.reflection.name == name }
|
54
|
+
current = current.children.find { |c| c.reflection.name == name && klass_equal?(association, c) }
|
57
55
|
break if current.nil?
|
58
56
|
end
|
59
57
|
|
60
58
|
current
|
61
59
|
end
|
60
|
+
|
61
|
+
# If association is not polymorphic return true.
|
62
|
+
# If association is polymorphic compare the association polymorphic class with the join association base_klass
|
63
|
+
def klass_equal?(assoc, join_association)
|
64
|
+
return true unless assoc._reflection.polymorphic?
|
65
|
+
|
66
|
+
assoc._polymorphic_klass == join_association.base_klass
|
67
|
+
end
|
68
|
+
|
69
|
+
def collect_joins(relation)
|
70
|
+
joins = []
|
71
|
+
joins += relation.joins_values
|
72
|
+
joins += relation.left_outer_joins_values if at_least?("5")
|
73
|
+
|
74
|
+
buckets = joins.group_by do |join|
|
75
|
+
case join
|
76
|
+
when String
|
77
|
+
:string_join
|
78
|
+
when Hash, Symbol, Array
|
79
|
+
:association_join
|
80
|
+
when Associations::JoinDependency
|
81
|
+
:stashed_join
|
82
|
+
when Arel::Nodes::Join
|
83
|
+
:join_node
|
84
|
+
when BabySqueel::Join
|
85
|
+
:association_join
|
86
|
+
else
|
87
|
+
raise("unknown class: %s" % join.class.name)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def build(relation, buckets)
|
93
|
+
buckets.default = []
|
94
|
+
association_joins = buckets[:association_join]
|
95
|
+
stashed_association_joins = buckets[:stashed_join]
|
96
|
+
join_nodes = buckets[:join_node].uniq
|
97
|
+
string_joins = buckets[:string_join].map(&:strip).uniq
|
98
|
+
|
99
|
+
joins = string_joins.map do |join|
|
100
|
+
relation.table.create_string_join(Arel.sql(join)) unless join.blank?
|
101
|
+
end.compact
|
102
|
+
|
103
|
+
join_list = join_nodes + joins
|
104
|
+
|
105
|
+
alias_tracker = Associations::AliasTracker.create(relation.klass.connection, relation.table.name, join_list)
|
106
|
+
if exactly?("5.2.0")
|
107
|
+
join_dependency = Associations::JoinDependency.new(relation.klass, relation.table, association_joins, alias_tracker)
|
108
|
+
else
|
109
|
+
join_dependency = Associations::JoinDependency.new(relation.klass, relation.table, association_joins)
|
110
|
+
join_dependency.instance_variable_set(:@alias_tracker, alias_tracker)
|
111
|
+
end
|
112
|
+
join_nodes.each do |join|
|
113
|
+
join_dependency.send(:alias_tracker).aliases[join.left.name.downcase] = 1
|
114
|
+
end
|
115
|
+
|
116
|
+
join_dependency
|
117
|
+
end
|
118
|
+
|
119
|
+
def exactly?(version)
|
120
|
+
::ActiveRecord.gem_version == Gem::Version.new(version)
|
121
|
+
end
|
122
|
+
|
123
|
+
def at_least?(version)
|
124
|
+
::ActiveRecord.gem_version >= Gem::Version.new(version)
|
125
|
+
end
|
62
126
|
end
|
63
127
|
end
|
64
128
|
end
|
data/lib/baby_squeel/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: baby_squeel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ray Zane
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.3'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: join_dependency
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.1.4
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.1.4
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: bundler
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -140,7 +126,6 @@ files:
|
|
140
126
|
- lib/baby_squeel/nodes/node.rb
|
141
127
|
- lib/baby_squeel/nodes/proxy.rb
|
142
128
|
- lib/baby_squeel/operators.rb
|
143
|
-
- lib/baby_squeel/pluck.rb
|
144
129
|
- lib/baby_squeel/relation.rb
|
145
130
|
- lib/baby_squeel/resolver.rb
|
146
131
|
- lib/baby_squeel/table.rb
|
@@ -160,9 +145,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
160
145
|
version: '0'
|
161
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
147
|
requirements:
|
163
|
-
- - "
|
148
|
+
- - ">="
|
164
149
|
- !ruby/object:Gem::Version
|
165
|
-
version:
|
150
|
+
version: '0'
|
166
151
|
requirements: []
|
167
152
|
rubygems_version: 3.0.3
|
168
153
|
signing_key:
|
data/lib/baby_squeel/pluck.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module BabySqueel
|
2
|
-
class Pluck # :nodoc:
|
3
|
-
# In Active Record 4.2, #pluck chokes when you give it
|
4
|
-
# Arel. It calls #to_s on whatever you pass in. So the
|
5
|
-
# hacky solution is to wrap the node in a class that
|
6
|
-
# returns the node when you call #to_s. Then, it works!
|
7
|
-
#
|
8
|
-
# In Active Record 5, #pluck accepts Arel, so we won't
|
9
|
-
# bother to use this there.
|
10
|
-
|
11
|
-
if ::ActiveRecord::VERSION::MAJOR >= 5
|
12
|
-
def self.decorate(node); node; end
|
13
|
-
else
|
14
|
-
def self.decorate(node); new(node); end
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize(node)
|
18
|
-
@node = node
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_s
|
22
|
-
@node
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|