arel-helpers 2.8.0 → 2.11.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
  SHA256:
3
- metadata.gz: e692ef35ca5dfd967971eeb47c87ef93b6ca21c142e03ecb29b608c1e8e533e0
4
- data.tar.gz: 719115c3d5f7a9c86d89d6bc720e390906eac6a9d5b60d29c19bebe751aa8c5b
3
+ metadata.gz: b15a810e483ddccf300cec2e2926a44b05be707e557fa7f89d432fa6542ddc72
4
+ data.tar.gz: 8acaece31ba468798d127deab33ac06c8569b71d51e0a813902f398a5f3efbcc
5
5
  SHA512:
6
- metadata.gz: 946f6a173a8a3da761ad79b9a416cc7b7871ba0ce879ecd0cb32b2348199c65109df1f7ebee1ec438bdf3cf443d840282935e97d56eed009ac54a31b79cb9d83
7
- data.tar.gz: 346d3fcbe5be8208734ca9a35f47870531524d008f8e67d307912eb3582d134b2b51c5a721ff31b5488efb519ade8c6c7830db509aa38450280e764147974527
6
+ metadata.gz: 265f9cd3e9cbc2d8e3b4c4aa6cb4d2b3cbab4ab8cba267a7088ec56da4cc038271da0ca51d3e2d2d3923cf04d04fc4c8ee79fda0cd571f2b59561677b8dba6d2
7
+ data.tar.gz: 60de9c7c46e7d1ed33f8d5ac9466613075e8ab1fd0b9a3335a1f88c6ccc19b64a388297c151578fb23d090c58847151a01c4af5a3365702941fb607c9f0512c5
data/Gemfile CHANGED
@@ -1,16 +1,2 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec
4
-
5
- group :development, :test do
6
- gem 'pry-byebug'
7
-
8
- # lock to 10.0 until rspec is upgraded
9
- gem 'rake', '~> 10.0'
10
- end
11
-
12
- group :test do
13
- gem 'rspec', '~> 2.11.0'
14
- gem 'rr', '~> 1.0.4'
15
- gem 'sqlite3'
16
- end
1
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile-rails-6.0.x', __FILE__)
2
+ Bundler.load
data/README.md CHANGED
@@ -155,7 +155,7 @@ class PostQueryBuilder < ArelHelpers::QueryBuilder
155
155
  def with_comments_by(usernames)
156
156
  reflect(
157
157
  query
158
- .joins(:comments => :author)
158
+ .joins(comments: :author)
159
159
  .where(author[:username].in(usernames))
160
160
  )
161
161
  end
@@ -187,6 +187,32 @@ PostQueryBuilder.new
187
187
  .since_yesterday
188
188
  ```
189
189
 
190
+ #### Conditional reflections
191
+
192
+ If you have parts of a query that should only be added under certain conditions you can return `reflect(query)` from your method. E.g:
193
+
194
+ ```ruby
195
+ def with_comments_by(usernames)
196
+ if usernames
197
+ reflect(
198
+ query.where(post[:title].matches("%#{title}%"))
199
+ )
200
+ else
201
+ reflect(query)
202
+ end
203
+ end
204
+ ```
205
+
206
+ This can become repetitive, and as an alternative you can choose to prepend `not_nil` to your method definition:
207
+
208
+ ```ruby
209
+ class PostQueryBuilder < ArelHelpers::QueryBuilder
210
+ not_nil def with_comments_by(usernames)
211
+ reflect(query.where(post[:title].matches("%#{title}%"))) if usernames
212
+ end
213
+ end
214
+ ```
215
+
190
216
  ## Requirements
191
217
 
192
218
  Requires ActiveRecord >= 3.1.0, < 6, tested against Ruby 2.2.4. Depends on SQLite for testing purposes.
@@ -11,13 +11,12 @@ Gem::Specification.new do |s|
11
11
  s.description = s.summary = "Useful tools to help construct database queries with ActiveRecord and Arel."
12
12
 
13
13
  s.platform = Gem::Platform::RUBY
14
- s.has_rdoc = true
15
14
 
16
- if ENV["AR"]
17
- s.add_dependency 'activerecord', ENV["AR"]
18
- else
19
- s.add_dependency 'activerecord', '>= 3.1.0', '< 6'
20
- end
15
+ s.add_dependency 'activerecord', '>= 3.1.0', '< 7'
16
+
17
+ s.add_development_dependency 'rake', '~> 10.0'
18
+ s.add_development_dependency 'rspec', '~> 2.11'
19
+ s.add_development_dependency 'rr', '~> 1.0'
21
20
 
22
21
  s.require_path = 'lib'
23
22
  s.files = Dir["{lib,spec}/**/*", "Gemfile", "History.txt", "README.md", "Rakefile", "arel-helpers.gemspec"]
@@ -18,7 +18,9 @@ module ArelHelpers
18
18
  # This method encapsulates that functionality and yields an intermediate object for chaining.
19
19
  # It also allows you to use an outer join instead of the default inner via the join_type arg.
20
20
  def join_association(table, association, join_type = Arel::Nodes::InnerJoin, options = {}, &block)
21
- if version >= '5.2.1'
21
+ if version >= '6.0.0'
22
+ join_association_6_0_0(table, association, join_type, options, &block)
23
+ elsif version >= '5.2.1'
22
24
  join_association_5_2_1(table, association, join_type, options, &block)
23
25
  elsif version >= '5.2.0'
24
26
  join_association_5_2(table, association, join_type, options, &block)
@@ -217,6 +219,35 @@ module ArelHelpers
217
219
  end
218
220
  end
219
221
 
222
+ def join_association_6_0_0(table, association, join_type, options = {})
223
+ aliases = options.fetch(:aliases, [])
224
+ associations = association.is_a?(Array) ? association : [association]
225
+
226
+ alias_tracker = ActiveRecord::Associations::AliasTracker.create(
227
+ table.connection, table.name, {}
228
+ )
229
+
230
+ join_dependency = ActiveRecord::Associations::JoinDependency.new(
231
+ table, table.arel_table, associations, join_type
232
+ )
233
+
234
+ constraints = join_dependency.join_constraints([], alias_tracker)
235
+
236
+ constraints.map do |join|
237
+ right = if block_given?
238
+ yield join.left.name.to_sym, join.right
239
+ else
240
+ join.right
241
+ end
242
+
243
+ if found_alias = find_alias(join.left.name, aliases)
244
+ join.left.table_alias = found_alias.name
245
+ end
246
+
247
+ join_type.new(join.left, right)
248
+ end
249
+ end
250
+
220
251
  private
221
252
 
222
253
  def to_sql(node, table, binds)
@@ -16,6 +16,21 @@ module ArelHelpers
16
16
 
17
17
  def_delegators :@query, *TERMINAL_METHODS
18
18
 
19
+ def self.not_nil(name)
20
+ mod = Module.new do
21
+ define_method(name) do |*args|
22
+ if (value = super(*args))
23
+ value
24
+ else
25
+ reflect(query)
26
+ end
27
+ end
28
+ end
29
+
30
+ prepend mod
31
+ name
32
+ end
33
+
19
34
  def initialize(query)
20
35
  @query = query
21
36
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module ArelHelpers
4
- VERSION = '2.8.0'
4
+ VERSION = '2.11.0'
5
5
  end
@@ -1,6 +1,10 @@
1
1
  # encoding: UTF-8
2
2
 
3
- SuperClass = ActiveRecord::VERSION::MAJOR >= 5 && ActiveRecord::VERSION::MINOR >= 1 ? ActiveRecord::Migration[5.1] : ActiveRecord::Migration
3
+ SuperClass = if ActiveRecord::VERSION::MAJOR >= 5
4
+ ActiveRecord::Migration["#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}".to_f]
5
+ else
6
+ ActiveRecord::Migration
7
+ end
4
8
 
5
9
  class CreatePostsTable < SuperClass
6
10
  def change
@@ -13,6 +13,10 @@ class TestQueryBuilder < ArelHelpers::QueryBuilder
13
13
  def noop
14
14
  reflect(query)
15
15
  end
16
+
17
+ not_nil def optional(skip:)
18
+ reflect(query.where(title: "BarBar")) unless skip
19
+ end
16
20
  end
17
21
 
18
22
  describe ArelHelpers::QueryBuilder do
@@ -57,4 +61,14 @@ describe ArelHelpers::QueryBuilder do
57
61
  builder.public_send(method)
58
62
  end
59
63
  end
64
+
65
+ it "returns reflect on existing query if method returns a falsy value" do
66
+ builder.optional(skip: true).to_sql.strip.should == 'SELECT "posts".* FROM "posts"'
67
+ end
68
+
69
+ it "returns reflect on new query for default chainable method if value is truthy" do
70
+ builder.optional(skip: false).to_sql.strip.gsub(/\s+/, " ").should == %Q{
71
+ SELECT \"posts\".* FROM \"posts\" WHERE \"posts\".\"title\" = 'BarBar'
72
+ }.strip
73
+ end
60
74
  end
@@ -5,7 +5,6 @@ $:.push(File.dirname(__FILE__))
5
5
  require 'rspec'
6
6
  require 'arel-helpers'
7
7
  require 'fileutils'
8
- require 'pry-byebug'
9
8
 
10
9
  require 'env'
11
10
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arel-helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.0
4
+ version: 2.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Dutro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-16 00:00:00.000000000 Z
11
+ date: 2019-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 3.1.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '6'
22
+ version: '7'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,49 @@ dependencies:
29
29
  version: 3.1.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '6'
32
+ version: '7'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '10.0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '10.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.11'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.11'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rr
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.0'
33
75
  description: Useful tools to help construct database queries with ActiveRecord and
34
76
  Arel.
35
77
  email:
@@ -76,8 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
118
  - !ruby/object:Gem::Version
77
119
  version: '0'
78
120
  requirements: []
79
- rubyforge_project:
80
- rubygems_version: 2.7.6
121
+ rubygems_version: 3.0.4
81
122
  signing_key:
82
123
  specification_version: 4
83
124
  summary: Useful tools to help construct database queries with ActiveRecord and Arel.