order_query 0.3.3 → 0.3.4

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: 2139f5b59c57d0163c85a86b23b79a3e6fd00a28
4
- data.tar.gz: e879b1b335c61133b122c014e49b01acb83c907d
3
+ metadata.gz: 5665c0c52a581228b9afdc57825cd1cfbec7dcae
4
+ data.tar.gz: a125032c1dfef35a5dfb251c0b4fb4d4f326c1d6
5
5
  SHA512:
6
- metadata.gz: a8c33923361af77ea70eaf89eed9486122ff82e70ebcb8dae13d8ee273155e0075a0207e59a7dc276a9d335548830b6a768db1575cc657e2d64c3ad58cbade63
7
- data.tar.gz: a42483806ef779802cf97467ebd53fa95e2e97639ce709e51564320ae184e09274a6aaa001f5c7a4414897e4c6918816d5b680466fd6b784c2384bc288167272
6
+ metadata.gz: 4a5e1c93db80ef5b81da56f2e551f283ac86c3502df3caf73b0f75f717c4a5cb42e7e31dcc9223eb2b05f565db05f57b613b85c5b6da04629708e1eba657d7b3
7
+ data.tar.gz: 94809f7775c4634d6f933095cc4671957d0c9fc17b7b7036adbf4c1d6c89b7c4ae9a45dace66c88cc0c42ae0610ff9f335ab7bf7721c4908c34da8aa5a7f8c5c
data/CHANGES.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## 0.3.4
2
+
3
+ * The `before` and `after` methods now accept a boolean argument that indicates
4
+ whether the relation should exclude the given point or not.
5
+ By default the given point is excluded, if you want to include it,
6
+ use `before(false)` / `after(false)`.
7
+
8
+ ## 0.3.3
9
+
10
+ * Now compatible with Rails 5 beta 1.
11
+
1
12
  ## 0.3.2
2
13
 
3
14
  * Optimization: do not wrap top-level disjunctive in `AND` when the column has an enumerated order. [Read more](https://github.com/glebm/order_query/issues/3#issuecomment-54764638).
data/MIT-LICENSE CHANGED
@@ -1,4 +1,6 @@
1
- Copyright 2014 Gleb Mazovetskiy
1
+ Copyright (c) 2014-2017 Gleb Mazovetskiy
2
+
3
+ MIT License
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
4
6
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -11,7 +11,7 @@ This gem finds the next or previous record(s) relative to the current one effici
11
11
  Add to Gemfile:
12
12
 
13
13
  ```ruby
14
- gem 'order_query', '~> 0.3.3'
14
+ gem 'order_query', '~> 0.3.4'
15
15
  ```
16
16
 
17
17
  ## Usage
@@ -66,6 +66,11 @@ p.next #=> #<Post>
66
66
  p.position #=> 5
67
67
  ```
68
68
 
69
+ The `before` and `after` methods also accept a boolean argument that indicates
70
+ whether the relation should exclude the given point or not.
71
+ By default the given point is excluded, if you want to include it,
72
+ use `before(false)` / `after(false)`.
73
+
69
74
  Looping to the first / last record is enabled for `next` / `previous` by default. Pass `false` to disable:
70
75
 
71
76
  ```ruby
data/Rakefile CHANGED
@@ -13,27 +13,28 @@ desc 'Test all Gemfiles from spec/*.gemfile'
13
13
  task :test_all_gemfiles do
14
14
  require 'pty'
15
15
  require 'shellwords'
16
- cmd = 'bundle --quiet && bundle exec rake --trace'
16
+ cmd = 'bundle install --quiet && bundle exec rake --trace'
17
17
  statuses = Dir.glob('./spec/gemfiles/*{[!.lock]}').map do |gemfile|
18
- env = {'BUNDLE_GEMFILE' => gemfile}
19
- cmd_with_env = " (#{env.map { |k, v| "export #{k}=#{Shellwords.escape v}" } * ' '}; #{cmd})"
20
- $stderr.puts "Testing\n#{cmd_with_env}"
21
- PTY.spawn(env, cmd) do |r, _w, pid|
22
- begin
23
- r.each_line { |l| puts l }
24
- rescue Errno::EIO
25
- # Errno:EIO error means that the process has finished giving output.
26
- ensure
27
- ::Process.wait pid
18
+ Bundler.with_clean_env do
19
+ env = {'BUNDLE_GEMFILE' => gemfile}
20
+ $stderr.puts "Testing #{File.basename(gemfile)}:\n export #{env.map { |k, v| "#{k}=#{Shellwords.escape v}" } * ' '}; #{cmd}"
21
+ PTY.spawn(env, cmd) do |r, _w, pid|
22
+ begin
23
+ r.each_line { |l| puts l }
24
+ rescue Errno::EIO
25
+ # Errno:EIO error means that the process has finished giving output.
26
+ ensure
27
+ ::Process.wait pid
28
+ end
28
29
  end
30
+ [$? && $?.exitstatus == 0, gemfile]
29
31
  end
30
- [$? && $?.exitstatus == 0, cmd_with_env]
31
32
  end
32
- failed_cmds = statuses.reject(&:first).map { |(_status, cmd_with_env)| cmd_with_env }
33
- if failed_cmds.empty?
34
- $stderr.puts '✓ Tests pass with all gemfiles'
33
+ failed_gemfiles = statuses.reject(&:first).map { |(_status, gemfile)| gemfile }
34
+ if failed_gemfiles.empty?
35
+ $stderr.puts "✓ Tests pass with all #{statuses.size} gemfiles"
35
36
  else
36
- $stderr.puts "❌ FAILING (#{failed_cmds.size} / #{statuses.size})\n#{failed_cmds * "\n"}"
37
+ $stderr.puts "❌ FAILING (#{failed_gemfiles.size} / #{statuses.size})\n#{failed_gemfiles * "\n"}"
37
38
  exit 1
38
39
  end
39
40
  end
@@ -31,20 +31,23 @@ module OrderQuery
31
31
  space.count - after.count
32
32
  end
33
33
 
34
+ # @param [true, false] strict choose if the given scope should include or not the record, default not to include it (strict true)
34
35
  # @return [ActiveRecord::Relation]
35
- def after
36
- side :after
36
+ def after(strict = true)
37
+ side :after, strict
37
38
  end
38
39
 
40
+ # @param [true, false] strict choose if the given scope should include or not the record, default not to include it (strict true)
39
41
  # @return [ActiveRecord::Relation]
40
- def before
41
- side :before
42
+ def before(strict = true)
43
+ side :before, strict
42
44
  end
43
45
 
44
46
  # @param [:before, :after] side
47
+ # @param [true, false] strict choose if the given scope should include or not the record, default not to include it (strict true)
45
48
  # @return [ActiveRecord::Relation]
46
- def side(side)
47
- query, query_args = @where_sql.build(side)
49
+ def side(side, strict = true)
50
+ query, query_args = @where_sql.build(side, strict)
48
51
  scope = if side == :after
49
52
  space.scope
50
53
  else
@@ -19,10 +19,11 @@ module OrderQuery
19
19
  # invoice < 3 OR
20
20
  # invoices = 3 AND (
21
21
  # ... ))
22
- def build(side)
22
+ def build(side, strict = true)
23
23
  # generate pairs of terms such as sales < 5, sales = 5
24
- terms = @columns.map { |col|
25
- [where_side(col, side, true), where_tie(col)].reject { |x| x == WHERE_IDENTITY }
24
+ terms = @columns.map.with_index { |col, i|
25
+ be_strict = (i != @columns.size - 1) ? true : strict
26
+ [where_side(col, side, be_strict), where_tie(col)].reject { |x| x == WHERE_IDENTITY }
26
27
  }
27
28
  # group pairwise with OR, and nest with AND
28
29
  query = foldr_terms terms.map { |pair| join_terms 'OR'.freeze, *pair }, 'AND'.freeze
@@ -1,3 +1,3 @@
1
1
  module OrderQuery
2
- VERSION = '0.3.3'
2
+ VERSION = '0.3.4'
3
3
  end
@@ -2,8 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '../../'
4
4
 
5
- gem 'activerecord', '~> 4.0'
6
- gem 'activesupport', '~> 4.0'
5
+ gem 'activerecord', '~> 4.2.9'
6
+ gem 'activesupport', '~> 4.2.9'
7
7
 
8
8
  eval_gemfile './shared.gemfile'
9
9
 
@@ -2,7 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '../../'
4
4
 
5
- gem 'activerecord', '= 5.0.0.beta1'
6
- gem 'activesupport', '= 5.0.0.beta1'
5
+ gem 'activerecord', '~> 5.0.5'
6
+ gem 'activesupport', '~> 5.0.5'
7
7
 
8
8
  eval_gemfile './shared.gemfile'
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '../../'
4
+
5
+ gem 'activerecord', '~> 5.1.3'
6
+ gem 'activesupport', '~> 5.1.3'
7
+
8
+ eval_gemfile './shared.gemfile'
@@ -61,7 +61,7 @@ describe 'OrderQuery' do
61
61
  wrap_top_level_or wrap_top_level_or
62
62
 
63
63
  context 'Issue test model' do
64
- t = Time.now
64
+ t = Time.now
65
65
  datasets = [
66
66
  [
67
67
  ['high', 5, 0, t, true],
@@ -226,7 +226,7 @@ describe 'OrderQuery' do
226
226
  }
227
227
 
228
228
  it 'Point' do
229
- post = create_post
229
+ post = create_post
230
230
  point = OrderQuery::Point.new(post, space)
231
231
  expect(point.inspect).to(
232
232
  eq %Q(#<OrderQuery::Point @record=#<Post id: #{post.id}, pinned: false, published_at: #{post.attribute_for_inspect(:published_at)}> @space=#<OrderQuery::Space @columns=[(pinned [true, false] desc), (id unique asc)] @base_scope=Post(id: integer, pinned: boolean, published_at: datetime)>>)
@@ -275,6 +275,42 @@ describe 'OrderQuery' do
275
275
  end
276
276
  end
277
277
 
278
+ context 'after/before no strict' do
279
+ context 'by middle attribute in search order' do
280
+ let!(:base) { Post.create! pinned: true, published_at: Time.now }
281
+ let!(:older) { Post.create! pinned: true, published_at: Time.now + 1.hour }
282
+ let!(:younger) { Post.create! pinned: true, published_at: Time.now - 1.hour }
283
+
284
+ it 'includes first element' do
285
+ point = Post.order_list_at(base)
286
+
287
+ expect(point.after.count).to eq 1
288
+ expect(point.after.to_a).to eq [younger]
289
+
290
+ expect(point.after(false).count).to eq 2
291
+ expect(point.after(false).to_a).to eq [base, younger]
292
+ expect(point.before(false).to_a).to eq [base, older]
293
+ end
294
+ end
295
+
296
+ context 'by last attribute in search order' do
297
+ let!(:base) { Post.create! pinned: true, published_at: Time.new(2016, 5, 1, 5, 4, 3), id: 6 }
298
+ let!(:previous) { Post.create! pinned: true, published_at: Time.new(2016, 5, 1, 5, 4, 3), id: 4 }
299
+ let!(:next_one) { Post.create! pinned: true, published_at: Time.new(2016, 5, 1, 5, 4, 3), id: 9 }
300
+
301
+ it 'includes first element' do
302
+ point = Post.order_list_at(base)
303
+
304
+ expect(point.after.count).to eq 1
305
+ expect(point.after.to_a).to eq [previous]
306
+
307
+ expect(point.after(false).count).to eq 2
308
+ expect(point.after(false).to_a).to eq [base, previous]
309
+ expect(point.before(false).to_a).to eq [base, next_one]
310
+ end
311
+ end
312
+ end
313
+
278
314
  before do
279
315
  Post.delete_all
280
316
  end
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,8 @@
1
- # -*- encoding : utf-8 -*-
2
1
  # Configure Rails Environment
3
2
  ENV['RAILS_ENV'] = ENV['RACK_ENV'] = 'test'
4
- if ENV['TRAVIS'] && !(defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx')
5
- require 'codeclimate-test-reporter'
6
- CodeClimate::TestReporter.start
3
+ if ENV['COVERAGE'] && !%w[rbx jruby].include?(RUBY_ENGINE)
4
+ require 'simplecov'
5
+ SimpleCov.command_name 'RSpec'
7
6
  end
8
7
  require 'order_query'
9
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: order_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gleb Mazovetskiy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-05 00:00:00.000000000 Z
11
+ date: 2017-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -78,6 +78,20 @@ dependencies:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
80
  version: '10.2'
81
+ - !ruby/object:Gem::Dependency
82
+ name: simplecov
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
81
95
  description: Find next / previous Active Record(s) in one efficient query
82
96
  email: glex.spb@gmail.com
83
97
  executables: []
@@ -98,10 +112,9 @@ files:
98
112
  - lib/order_query/sql/order_by.rb
99
113
  - lib/order_query/sql/where.rb
100
114
  - lib/order_query/version.rb
101
- - spec/gemfiles/rails_4.gemfile
102
- - spec/gemfiles/rails_4.gemfile.lock
103
- - spec/gemfiles/rails_5.gemfile
104
- - spec/gemfiles/rails_5.gemfile.lock
115
+ - spec/gemfiles/rails_4_2.gemfile
116
+ - spec/gemfiles/rails_5_0.gemfile
117
+ - spec/gemfiles/rails_5_1.gemfile
105
118
  - spec/order_query_spec.rb
106
119
  - spec/spec_helper.rb
107
120
  homepage: https://github.com/glebm/order_query
@@ -125,14 +138,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
138
  version: '0'
126
139
  requirements: []
127
140
  rubyforge_project:
128
- rubygems_version: 2.5.1
141
+ rubygems_version: 2.6.12
129
142
  signing_key:
130
143
  specification_version: 4
131
144
  summary: Find next / previous Active Record(s) in one query
132
145
  test_files:
133
- - spec/gemfiles/rails_4.gemfile
134
- - spec/gemfiles/rails_4.gemfile.lock
135
- - spec/gemfiles/rails_5.gemfile
136
- - spec/gemfiles/rails_5.gemfile.lock
137
146
  - spec/order_query_spec.rb
138
147
  - spec/spec_helper.rb
148
+ - spec/gemfiles/rails_5_1.gemfile
149
+ - spec/gemfiles/rails_4_2.gemfile
150
+ - spec/gemfiles/rails_5_0.gemfile
@@ -1,73 +0,0 @@
1
- PATH
2
- remote: ../../
3
- specs:
4
- order_query (0.3.2)
5
- activerecord (>= 4.0, < 6.0)
6
- activesupport (>= 4.0, < 6.0)
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- activemodel (4.2.5)
12
- activesupport (= 4.2.5)
13
- builder (~> 3.1)
14
- activerecord (4.2.5)
15
- activemodel (= 4.2.5)
16
- activesupport (= 4.2.5)
17
- arel (~> 6.0)
18
- activesupport (4.2.5)
19
- i18n (~> 0.7)
20
- json (~> 1.7, >= 1.7.7)
21
- minitest (~> 5.1)
22
- thread_safe (~> 0.3, >= 0.3.4)
23
- tzinfo (~> 1.1)
24
- arel (6.0.3)
25
- builder (3.2.2)
26
- byebug (8.2.1)
27
- codeclimate-test-reporter (0.4.8)
28
- simplecov (>= 0.7.1, < 1.0.0)
29
- diff-lcs (1.2.5)
30
- docile (1.1.5)
31
- i18n (0.7.0)
32
- json (1.8.3)
33
- minitest (5.8.3)
34
- rake (10.4.2)
35
- rspec (3.4.0)
36
- rspec-core (~> 3.4.0)
37
- rspec-expectations (~> 3.4.0)
38
- rspec-mocks (~> 3.4.0)
39
- rspec-core (3.4.1)
40
- rspec-support (~> 3.4.0)
41
- rspec-expectations (3.4.0)
42
- diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.4.0)
44
- rspec-mocks (3.4.0)
45
- diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.4.0)
47
- rspec-support (3.4.1)
48
- simplecov (0.11.1)
49
- docile (~> 1.1.0)
50
- json (~> 1.8)
51
- simplecov-html (~> 0.10.0)
52
- simplecov-html (0.10.0)
53
- sqlite3 (1.3.11)
54
- thread_safe (0.3.5)
55
- tzinfo (1.2.2)
56
- thread_safe (~> 0.1)
57
-
58
- PLATFORMS
59
- ruby
60
-
61
- DEPENDENCIES
62
- activerecord (~> 4.0)
63
- activerecord-jdbcsqlite3-adapter
64
- activesupport (~> 4.0)
65
- byebug
66
- codeclimate-test-reporter
67
- order_query!
68
- rake (~> 10.2)
69
- rspec (~> 3.4)
70
- sqlite3 (>= 1.3.11)
71
-
72
- BUNDLED WITH
73
- 1.11.2
@@ -1,76 +0,0 @@
1
- PATH
2
- remote: ../../
3
- specs:
4
- order_query (0.3.2)
5
- activerecord (>= 4.0, < 6.0)
6
- activesupport (>= 4.0, < 6.0)
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- activemodel (5.0.0.beta1)
12
- activesupport (= 5.0.0.beta1)
13
- builder (~> 3.1)
14
- activerecord (5.0.0.beta1)
15
- activemodel (= 5.0.0.beta1)
16
- activesupport (= 5.0.0.beta1)
17
- arel (~> 7.0)
18
- activesupport (5.0.0.beta1)
19
- concurrent-ruby (~> 1.0)
20
- i18n (~> 0.7)
21
- json (~> 1.7, >= 1.7.7)
22
- method_source
23
- minitest (~> 5.1)
24
- tzinfo (~> 1.1)
25
- arel (7.0.0)
26
- builder (3.2.2)
27
- byebug (8.2.1)
28
- codeclimate-test-reporter (0.4.8)
29
- simplecov (>= 0.7.1, < 1.0.0)
30
- concurrent-ruby (1.0.0)
31
- diff-lcs (1.2.5)
32
- docile (1.1.5)
33
- i18n (0.7.0)
34
- json (1.8.3)
35
- method_source (0.8.2)
36
- minitest (5.8.3)
37
- rake (10.4.2)
38
- rspec (3.4.0)
39
- rspec-core (~> 3.4.0)
40
- rspec-expectations (~> 3.4.0)
41
- rspec-mocks (~> 3.4.0)
42
- rspec-core (3.4.1)
43
- rspec-support (~> 3.4.0)
44
- rspec-expectations (3.4.0)
45
- diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.4.0)
47
- rspec-mocks (3.4.0)
48
- diff-lcs (>= 1.2.0, < 2.0)
49
- rspec-support (~> 3.4.0)
50
- rspec-support (3.4.1)
51
- simplecov (0.11.1)
52
- docile (~> 1.1.0)
53
- json (~> 1.8)
54
- simplecov-html (~> 0.10.0)
55
- simplecov-html (0.10.0)
56
- sqlite3 (1.3.11)
57
- thread_safe (0.3.5)
58
- tzinfo (1.2.2)
59
- thread_safe (~> 0.1)
60
-
61
- PLATFORMS
62
- ruby
63
-
64
- DEPENDENCIES
65
- activerecord (= 5.0.0.beta1)
66
- activerecord-jdbcsqlite3-adapter
67
- activesupport (= 5.0.0.beta1)
68
- byebug
69
- codeclimate-test-reporter
70
- order_query!
71
- rake (~> 10.2)
72
- rspec (~> 3.4)
73
- sqlite3 (>= 1.3.11)
74
-
75
- BUNDLED WITH
76
- 1.11.2