ranked-model 0.4.1 → 0.4.2

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: 0bc1cd219c463a32552a7f583dbb9f52c95a356b
4
- data.tar.gz: '0362078c1c550eb8da5e22fa2aa9c69864597f44'
3
+ metadata.gz: 5cfad22b2acf05bc3deda080d1bb11b96ade3c9d
4
+ data.tar.gz: cd2d02de24cf6465ee4211818beb6696ec41e616
5
5
  SHA512:
6
- metadata.gz: e347568a8c34e9ce8ced2ba819fc8e9f3b297c4dadefff56c8eb0c43cafa12e872e508f4140ded18aea30b7aaed704979b7d2c42030c56f244ce930a150d1125
7
- data.tar.gz: 3ebd264cd22bea1038055c36cf460c3e352b3cc4383bfdb3112134808341ee8b9d180782f21b48341003f15b3dbe199d704dfa0fea3cc5bacb396caf377cf8b1
6
+ metadata.gz: fd1dbb2069c730aeda634d15cc4cd5a5fa0be8def4cca8db3b6bb320e40ef97f29f88bac16f2ba12720a1287cbb06ae3188e7862f5586599757fc2c56f6d3e6e
7
+ data.tar.gz: b5f0896c2a4979b3f8d157bc20f3ee1bc7846ea6ef2ffb3432b50d5696e0852f803026bea3d0177c8db22b949c3d8c89022582b4c79da84c8ff8fc4a2611d3a6
@@ -14,25 +14,34 @@ rvm:
14
14
  - 2.4.4
15
15
  - 2.5.1
16
16
  - jruby-9.1.17.0
17
- - rbx-3.100
17
+ - rbx-3.107
18
18
  env:
19
19
  - DB=sqlite
20
20
  - DB=mysql
21
21
  - DB=postgresql
22
22
  gemfile:
23
- - gemfiles/rails_3_2.gemfile
24
23
  - gemfiles/rails_4_1.gemfile
25
24
  - gemfiles/rails_4_2.gemfile
25
+ - gemfiles/rails_5_0.gemfile
26
+ - gemfiles/rails_5_1.gemfile
27
+ - gemfiles/rails_5_2.gemfile
26
28
  matrix:
27
29
  exclude:
28
- - rvm: 2.4.4
29
- gemfile: gemfiles/rails_3_2.gemfile
30
+ - rvm: 1.9.3
31
+ gemfile: gemfiles/rails_5_0.gemfile
32
+ - rvm: 1.9.3
33
+ gemfile: gemfiles/rails_5_1.gemfile
34
+ - rvm: 1.9.3
35
+ gemfile: gemfiles/rails_5_2.gemfile
36
+ - rvm: 2.1.10
37
+ gemfile: gemfiles/rails_5_0.gemfile
38
+ - rvm: 2.1.10
39
+ gemfile: gemfiles/rails_5_1.gemfile
40
+ - rvm: 2.1.10
41
+ gemfile: gemfiles/rails_5_2.gemfile
42
+ - rvm: jruby-9.1.17.0
43
+ gemfile: gemfiles/rails_5_2.gemfile
30
44
  - rvm: 2.4.4
31
45
  gemfile: gemfiles/rails_4_1.gemfile
32
- - rvm: 2.5.1
33
- gemfile: gemfiles/rails_3_2.gemfile
34
46
  - rvm: 2.5.1
35
47
  gemfile: gemfiles/rails_4_1.gemfile
36
- - env: DB=postgresql
37
- gemfile: gemfiles/rails_3_2.gemfile
38
-
data/Appraisals CHANGED
@@ -1,4 +1,4 @@
1
- appraise "rails-3-2" do
1
+ appraise "rails-4-1" do
2
2
  group :sqlite do
3
3
  gem "sqlite3", platform: :ruby
4
4
  gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.24", platform: :jruby
@@ -12,16 +12,16 @@ appraise "rails-3-2" do
12
12
  gem "activerecord-jdbcpostgresql-adapter", "~> 1.3.24", platform: :jruby
13
13
  end
14
14
 
15
- gem "activerecord", "~> 3.2.22.2"
15
+ gem "activerecord", "~> 4.1.16"
16
16
  end
17
17
 
18
- appraise "rails-4-1" do
18
+ appraise "rails-4-2" do
19
19
  group :sqlite do
20
20
  gem "sqlite3", platform: :ruby
21
21
  gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.24", platform: :jruby
22
22
  end
23
23
  group :mysql do
24
- gem "mysql2", "~> 0.3.21", platform: :ruby
24
+ gem "mysql2", "~> 0.4.10", platform: :ruby
25
25
  gem "activerecord-jdbcmysql-adapter", "~> 1.3.24", platform: :jruby
26
26
  end
27
27
  group :postgresql do
@@ -29,43 +29,53 @@ appraise "rails-4-1" do
29
29
  gem "activerecord-jdbcpostgresql-adapter", "~> 1.3.24", platform: :jruby
30
30
  end
31
31
 
32
- gem "activerecord", "~> 4.1.16"
32
+ gem "activerecord", "~> 4.2.10"
33
33
  end
34
34
 
35
- appraise "rails-4-2" do
35
+ appraise "rails-5-0" do
36
36
  group :sqlite do
37
37
  gem "sqlite3", platform: :ruby
38
- gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.24", platform: :jruby
38
+ gem "activerecord-jdbcsqlite3-adapter", "~> 50.1", platform: :jruby
39
39
  end
40
40
  group :mysql do
41
41
  gem "mysql2", "~> 0.4.10", platform: :ruby
42
- gem "activerecord-jdbcmysql-adapter", "~> 1.3.24", platform: :jruby
42
+ gem "activerecord-jdbcmysql-adapter", "~> 50.1", platform: :jruby
43
43
  end
44
44
  group :postgresql do
45
- gem "pg", "~> 0.18.0", platform: :ruby
46
- gem "activerecord-jdbcpostgresql-adapter", "~> 1.3.24", platform: :jruby
45
+ gem "pg", "~> 0.21.0", platform: :ruby
46
+ gem "activerecord-jdbcpostgresql-adapter", "~> 50.1", platform: :jruby
47
47
  end
48
48
 
49
- gem "activerecord", "~> 4.2.10"
49
+ gem "activerecord", "~> 5.0.7"
50
50
  end
51
51
 
52
- # appraise "rails-5-0" do
53
- # group :mysql do
54
- # gem "mysql2", "~> 0.4.10", platform: :ruby
55
- # end
56
- # gem "activerecord", "~> 5.0.6"
57
- # end
52
+ appraise "rails-5-1" do
53
+ group :sqlite do
54
+ gem "sqlite3", platform: :ruby
55
+ gem "activerecord-jdbcsqlite3-adapter", "~> 51.1", platform: :jruby
56
+ end
57
+ group :mysql do
58
+ gem "mysql2", "~> 0.4.10", platform: :ruby
59
+ gem "activerecord-jdbcmysql-adapter", "~> 51.1", platform: :jruby
60
+ end
61
+ group :postgresql do
62
+ gem "pg", "~> 0.21.0", platform: :ruby
63
+ gem "activerecord-jdbcpostgresql-adapter", "~> 51.1", platform: :jruby
64
+ end
65
+
66
+ gem "activerecord", "~> 5.1.6"
67
+ end
58
68
 
59
- # appraise "rails-5-1" do
60
- # group :mysql do
61
- # gem "mysql2", "~> 0.4.10", platform: :ruby
62
- # end
63
- # gem "activerecord", "~> 5.1.4"
64
- # end
69
+ appraise "rails-5-2" do
70
+ group :sqlite do
71
+ gem "sqlite3", platform: :ruby
72
+ end
73
+ group :mysql do
74
+ gem "mysql2", "~> 0.4.10", platform: :ruby
75
+ end
76
+ group :postgresql do
77
+ gem "pg", "~> 0.21.0", platform: :ruby
78
+ end
65
79
 
66
- # appraise "rails-5-2" do
67
- # group :mysql do
68
- # gem "mysql2", "~> 0.4.10", platform: :ruby
69
- # end
70
- # gem "activerecord", "~> 5.2.0.rc1"
71
- # end
80
+ gem "activerecord", "~> 5.2.0"
81
+ end
data/Gemfile CHANGED
@@ -2,6 +2,3 @@ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in ranked-model.gemspec
4
4
  gemspec
5
-
6
- gem 'rubysl', '~> 2.0', platform: :rbx
7
- gem 'rubinius-developer_tools', platform: :rbx
data/Readme.mkd CHANGED
@@ -1,11 +1,11 @@
1
- **ranked-model** is a modern row sorting library built for Rails 3 & 4. It uses ARel aggressively and is better optimized than most other libraries.
1
+ **ranked-model** is a modern row sorting library built for Rails 3, 4 and 5. It uses ARel aggressively and is better optimized than most other libraries.
2
2
 
3
3
  [![Build Status](https://travis-ci.org/mixonic/ranked-model.png)](https://travis-ci.org/mixonic/ranked-model)
4
4
 
5
5
  Installation
6
6
  ------------
7
7
 
8
- ranked-model passes specs with Rails 3.1, 3.2, 4.0, and 4.1-beta for MySQL, Postgres, and SQLite on Ruby 1.9.2, 1.9.3, 2.0, 2.1, jruby-19mode, and rubinius where Rails supports the platform. This is with the exception of Postgres before Rails 4.0 on all platforms, which is unsupported (I'd gladly accept a PR to fix this).
8
+ ranked-model passes specs with Rails 4.1, 4.2, 5.0, 5.1 and 5.2 for MySQL, Postgres, and SQLite on Ruby 1.9.3, 2.1 through 2.5, jruby-9.1.17.0, and rbx-3.107 where Rails supports the platform. This is with the exception of Postgres before Rails 4.0 on all platforms, which is unsupported by `ranked-model`. Note that the `pg` gem has pulled support for rbx (Rubinius) from version 1 onward.
9
9
 
10
10
  TL;DR, if you are using Rails 4 and up you are 100% good to go. Before Rails 4, be wary of Postgres.
11
11
 
@@ -55,6 +55,8 @@ implement a sorting UI, just update the resource by appending the column name wi
55
55
  @duck.update_attribute :row_order_position, 0 # or 1, 2, 37. :first, :last, :up and :down are also valid
56
56
  ```
57
57
 
58
+ **IMPORTANT: Note that you MUST append _position to the column name when setting a new position on an instance. This is a fake column that can take relative as well as absolute index-based values for position.**
59
+
58
60
  Position numbers begin at zero. A position number greater than the number of records acts the
59
61
  same as :last. :up and :down move the record up/down the ladder by one step.
60
62
 
@@ -80,16 +82,19 @@ class Duck < ActiveRecord::Base
80
82
 
81
83
  include RankedModel
82
84
 
83
- ranks :row_order, # Name this ranker, used with rank()
84
- :column => :sort_order # Override the default column, which defaults to the name
85
-
85
+ ranks :row_order, # Name this ranker, used with rank()
86
+ :column => :sort_order # Override the default column, which defaults to the name
87
+
86
88
  belongs_to :pond
87
89
  ranks :swimming_order,
88
- :with_same => :pond_id # Ducks belong_to Ponds, make the ranker scoped to one pond
89
-
90
+ :with_same => :pond_id # Ducks belong_to Ponds, make the ranker scoped to one pond
91
+
92
+ ranks :row_order,
93
+ :with_same => [:pond_id, :breed] # Lets rank them by breed
94
+
90
95
  scope :walking, where(:walking => true )
91
96
  ranks :walking_order,
92
- :scope => :walking # Narrow this ranker to a scope
97
+ :scope => :walking # Narrow this ranker to a scope
93
98
 
94
99
  end
95
100
  ```
@@ -178,10 +183,12 @@ Fork, clone, write a test, write some code, commit, push, send a pull request.
178
183
  The specs can be run with sqlite, postgres, and mysql:
179
184
 
180
185
  ```
181
- DB=postgresql bundle exec rake
186
+ bundle
187
+ appraisal install
188
+ DB=postgresql bundle exec appraisal rake
182
189
  ```
183
190
 
184
- Is no DB is specified, the tests run against sqlite.
191
+ If no DB is specified (`sqlite`, `mysql`, or `postgresql`), the tests run against sqlite.
185
192
 
186
193
  RankedModel is mostly the handiwork of Matthew Beale:
187
194
 
@@ -203,3 +210,4 @@ A hearty thanks to these contributors:
203
210
  * [jguyon](https://github.com/jguyon)
204
211
  * [pehrlich](https://github.com/pehrlich)
205
212
  * [petergoldstein](https://github.com/petergoldstein)
213
+ * [brendon](https://github.com/brendon)
@@ -2,9 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubysl", "~> 2.0", platform: :rbx
6
- gem "rubinius-developer_tools", platform: :rbx
7
- gem "activerecord", "~> 3.2.22.2"
5
+ gem "activerecord", "~> 3.2.22.5"
8
6
 
9
7
  group :sqlite do
10
8
  gem "sqlite3", platform: :ruby
@@ -2,8 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubysl", "~> 2.0", platform: :rbx
6
- gem "rubinius-developer_tools", platform: :rbx
7
5
  gem "activerecord", "~> 4.1.16"
8
6
 
9
7
  group :sqlite do
@@ -2,8 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubysl", "~> 2.0", platform: :rbx
6
- gem "rubinius-developer_tools", platform: :rbx
7
5
  gem "activerecord", "~> 4.2.10"
8
6
 
9
7
  group :sqlite do
@@ -0,0 +1,22 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 5.0.7"
6
+
7
+ group :sqlite do
8
+ gem "sqlite3", platform: :ruby
9
+ gem "activerecord-jdbcsqlite3-adapter", "~> 50.1", platform: :jruby
10
+ end
11
+
12
+ group :mysql do
13
+ gem "mysql2", "~> 0.4.10", platform: :ruby
14
+ gem "activerecord-jdbcmysql-adapter", "~> 50.1", platform: :jruby
15
+ end
16
+
17
+ group :postgresql do
18
+ gem "pg", "~> 0.21.0", platform: :ruby
19
+ gem "activerecord-jdbcpostgresql-adapter", "~> 50.1", platform: :jruby
20
+ end
21
+
22
+ gemspec path: "../"
@@ -0,0 +1,22 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 5.1.6"
6
+
7
+ group :sqlite do
8
+ gem "sqlite3", platform: :ruby
9
+ gem "activerecord-jdbcsqlite3-adapter", "~> 51.1", platform: :jruby
10
+ end
11
+
12
+ group :mysql do
13
+ gem "mysql2", "~> 0.4.10", platform: :ruby
14
+ gem "activerecord-jdbcmysql-adapter", "~> 51.1", platform: :jruby
15
+ end
16
+
17
+ group :postgresql do
18
+ gem "pg", "~> 0.21.0", platform: :ruby
19
+ gem "activerecord-jdbcpostgresql-adapter", "~> 51.1", platform: :jruby
20
+ end
21
+
22
+ gemspec path: "../"
@@ -0,0 +1,19 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 5.2.0"
6
+
7
+ group :sqlite do
8
+ gem "sqlite3", platform: :ruby
9
+ end
10
+
11
+ group :mysql do
12
+ gem "mysql2", "~> 0.4.10", platform: :ruby
13
+ end
14
+
15
+ group :postgresql do
16
+ gem "pg", "~> 0.21.0", platform: :ruby
17
+ end
18
+
19
+ gemspec path: "../"
@@ -40,7 +40,7 @@ module RankedModel
40
40
  end
41
41
  end
42
42
 
43
- private
43
+ private
44
44
 
45
45
  def ranks *args
46
46
  self.rankers ||= []
@@ -66,7 +66,7 @@ module RankedModel
66
66
  #
67
67
  instance_class.
68
68
  where(instance_class.primary_key => instance.id).
69
- update_all([%Q{#{ranker.column} = ?}, value])
69
+ update_all(ranker.column => value)
70
70
  end
71
71
 
72
72
  def position
@@ -89,6 +89,10 @@ module RankedModel
89
89
 
90
90
  private
91
91
 
92
+ def reset_cache
93
+ @finder, @current_order, @current_first, @current_last = nil
94
+ end
95
+
92
96
  def instance_class
93
97
  ranker.class_name.nil? ? instance.class : ranker.class_name.constantize
94
98
  end
@@ -114,31 +118,31 @@ module RankedModel
114
118
  case position
115
119
  when :first, 'first'
116
120
  if current_first && current_first.rank
117
- rank_at( ( ( RankedModel::MIN_RANK_VALUE - current_first.rank ).to_f / 2 ).ceil + current_first.rank)
121
+ rank_at_average current_first.rank, RankedModel::MIN_RANK_VALUE
118
122
  else
119
123
  position_at :middle
120
124
  end
121
125
  when :last, 'last'
122
126
  if current_last && current_last.rank
123
- rank_at( ( ( RankedModel::MAX_RANK_VALUE - current_last.rank ).to_f / 2 ).ceil + current_last.rank )
127
+ rank_at_average current_last.rank, RankedModel::MAX_RANK_VALUE
124
128
  else
125
129
  position_at :middle
126
130
  end
127
131
  when :middle, 'middle'
128
- rank_at( ( ( RankedModel::MAX_RANK_VALUE - RankedModel::MIN_RANK_VALUE ).to_f / 2 ).ceil + RankedModel::MIN_RANK_VALUE )
132
+ rank_at_average RankedModel::MIN_RANK_VALUE, RankedModel::MAX_RANK_VALUE
129
133
  when :down, 'down'
130
134
  neighbors = find_next_two(rank)
131
135
  if neighbors[:lower]
132
136
  min = neighbors[:lower].rank
133
137
  max = neighbors[:upper] ? neighbors[:upper].rank : RankedModel::MAX_RANK_VALUE
134
- rank_at( ( ( max - min ).to_f / 2 ).ceil + min )
138
+ rank_at_average min, max
135
139
  end
136
140
  when :up, 'up'
137
141
  neighbors = find_previous_two(rank)
138
142
  if neighbors[:upper]
139
143
  max = neighbors[:upper].rank
140
144
  min = neighbors[:lower] ? neighbors[:lower].rank : RankedModel::MIN_RANK_VALUE
141
- rank_at( ( ( max - min ).to_f / 2 ).ceil + min )
145
+ rank_at_average min, max
142
146
  end
143
147
  when String
144
148
  position_at position.to_i
@@ -148,7 +152,7 @@ module RankedModel
148
152
  neighbors = neighbors_at_position(position)
149
153
  min = ((neighbors[:lower] && neighbors[:lower].has_rank?) ? neighbors[:lower].rank : RankedModel::MIN_RANK_VALUE)
150
154
  max = ((neighbors[:upper] && neighbors[:upper].has_rank?) ? neighbors[:upper].rank : RankedModel::MAX_RANK_VALUE)
151
- rank_at( ( ( max - min ).to_f / 2 ).ceil + min )
155
+ rank_at_average min, max
152
156
  when NilClass
153
157
  if !rank
154
158
  position_at :last
@@ -156,12 +160,17 @@ module RankedModel
156
160
  end
157
161
  end
158
162
 
163
+ def rank_at_average(min, max)
164
+ if (max - min).between?(-1, 1) # No room at the inn...
165
+ rebalance_ranks
166
+ position_at position
167
+ else
168
+ rank_at( ( ( max - min ).to_f / 2 ).ceil + min )
169
+ end
170
+ end
171
+
159
172
  def assure_unique_position
160
173
  if ( new_record? || rank_changed? )
161
- unless rank
162
- rank_at( RankedModel::MAX_RANK_VALUE )
163
- end
164
-
165
174
  if (rank > RankedModel::MAX_RANK_VALUE) || current_at_rank(rank)
166
175
  rearrange_ranks
167
176
  end
@@ -170,22 +179,25 @@ module RankedModel
170
179
 
171
180
  def rearrange_ranks
172
181
  _scope = finder
173
- unless instance.id.nil?
174
- # Never update ourself, shift others around us.
175
- _scope = _scope.where( instance_class.arel_table[instance_class.primary_key].not_eq(instance.id) )
176
- end
182
+ escaped_column = ActiveRecord::Base.connection.quote_column_name ranker.column
183
+ # If there is room at the bottom of the list and we're added to the very top of the list...
177
184
  if current_first.rank && current_first.rank > RankedModel::MIN_RANK_VALUE && rank == RankedModel::MAX_RANK_VALUE
185
+ # ...then move everyone else down 1 to make room for us at the end
178
186
  _scope.
179
187
  where( instance_class.arel_table[ranker.column].lteq(rank) ).
180
- update_all( %Q{#{ranker.column} = #{ranker.column} - 1} )
188
+ update_all( "#{escaped_column} = #{escaped_column} - 1" )
189
+ # If there is room at the top of the list and we're added below the last value in the list...
181
190
  elsif current_last.rank && current_last.rank < (RankedModel::MAX_RANK_VALUE - 1) && rank < current_last.rank
191
+ # ...then move everyone else at or above our desired rank up 1 to make room for us
182
192
  _scope.
183
193
  where( instance_class.arel_table[ranker.column].gteq(rank) ).
184
- update_all( %Q{#{ranker.column} = #{ranker.column} + 1} )
194
+ update_all( "#{escaped_column} = #{escaped_column} + 1" )
195
+ # If there is room at the bottom of the list and we're added above the lowest value in the list...
185
196
  elsif current_first.rank && current_first.rank > RankedModel::MIN_RANK_VALUE && rank > current_first.rank
197
+ # ...then move everyone else below us down 1 and change our rank down 1 to avoid the collission
186
198
  _scope.
187
199
  where( instance_class.arel_table[ranker.column].lt(rank) ).
188
- update_all( %Q{#{ranker.column} = #{ranker.column} - 1} )
200
+ update_all( "#{escaped_column} = #{escaped_column} - 1" )
189
201
  rank_at( rank - 1 )
190
202
  else
191
203
  rebalance_ranks
@@ -193,67 +205,64 @@ module RankedModel
193
205
  end
194
206
 
195
207
  def rebalance_ranks
196
- total = current_order.size + 2
197
- has_set_self = false
198
- total.times do |index|
199
- next if index == 0 || index == total
200
- rank_value = ((((RankedModel::MAX_RANK_VALUE - RankedModel::MIN_RANK_VALUE).to_f / total) * index ).ceil + RankedModel::MIN_RANK_VALUE)
201
- index = index - 1
202
- if has_set_self
203
- index = index - 1
208
+ if rank
209
+ origin = current_order.index { |item| item.instance.id == instance.id }
210
+ destination = current_order.index { |item| rank <= item.rank }
211
+ destination -= 1 if origin < destination
212
+
213
+ current_order.insert destination, current_order.delete_at(origin)
214
+ end
215
+
216
+ gaps = current_order.size + 1
217
+ range = (RankedModel::MAX_RANK_VALUE - RankedModel::MIN_RANK_VALUE).to_f
218
+ gap_size = (range / gaps).ceil
219
+
220
+ current_order.each.with_index(1) do |item, position|
221
+ new_rank = (gap_size * position) + RankedModel::MIN_RANK_VALUE
222
+
223
+ if item.instance.id == instance.id
224
+ rank_at new_rank
204
225
  else
205
- if !current_order[index] ||
206
- ( !current_order[index].rank.nil? &&
207
- current_order[index].rank >= rank )
208
- rank_at rank_value
209
- has_set_self = true
210
- next
211
- end
226
+ item.update_rank! new_rank
212
227
  end
213
- current_order[index].update_rank! rank_value
214
228
  end
229
+
230
+ reset_cache
215
231
  end
216
232
 
217
233
  def finder(order = :asc)
218
234
  @finder ||= {}
219
235
  @finder[order] ||= begin
220
236
  _finder = instance_class
221
- columns = [instance_class.arel_table[instance_class.primary_key], instance_class.arel_table[ranker.column]]
237
+ columns = [instance_class.primary_key.to_sym, ranker.column]
238
+
222
239
  if ranker.scope
223
240
  _finder = _finder.send ranker.scope
224
241
  end
242
+
225
243
  case ranker.with_same
226
- when Symbol
227
- columns << instance_class.arel_table[ranker.with_same]
228
- _finder = _finder.where \
229
- instance_class.arel_table[ranker.with_same].eq(instance.attributes["#{ranker.with_same}"])
230
- when Array
231
- ranker.with_same.each {|c| columns.push instance_class.arel_table[c] }
232
- _finder = _finder.where(
233
- ranker.with_same[1..-1].inject(
234
- instance_class.arel_table[ranker.with_same.first].eq(
235
- instance.attributes["#{ranker.with_same.first}"]
236
- )
237
- ) {|scoper, attr|
238
- scoper.and(
239
- instance_class.arel_table[attr].eq(
240
- instance.attributes["#{attr}"]
241
- )
242
- )
243
- }
244
- )
245
- end
246
- if !new_record?
244
+ when Symbol
245
+ columns << ranker.with_same
247
246
  _finder = _finder.where \
248
- instance_class.arel_table[instance_class.primary_key].not_eq(instance.id)
247
+ ranker.with_same => instance.attributes[ranker.with_same.to_s]
248
+ when Array
249
+ ranker.with_same.each do |column|
250
+ columns << column
251
+ _finder = _finder.where column => instance.attributes[column.to_s]
252
+ end
249
253
  end
250
- _finder.order(instance_class.arel_table[ranker.column].send(order)).select(columns)
254
+
255
+ unless new_record?
256
+ _finder = _finder.where.not instance_class.primary_key.to_sym => instance.id
257
+ end
258
+
259
+ _finder.order(ranker.column.to_sym => order).select(columns)
251
260
  end
252
261
  end
253
262
 
254
263
  def current_order
255
264
  @current_order ||= begin
256
- finder.collect { |ordered_instance|
265
+ finder.unscope(where: instance_class.primary_key.to_sym).collect { |ordered_instance|
257
266
  RankedModel::Ranker::Mapper.new ranker, ordered_instance
258
267
  }
259
268
  end
@@ -1,3 +1,3 @@
1
1
  module RankedModel
2
- VERSION = "0.4.1"
2
+ VERSION = "0.4.2"
3
3
  end
@@ -13,14 +13,14 @@ Gem::Specification.new do |s|
13
13
  s.description = %q{ranked-model is a modern row sorting library built for Rails 3 & 4. It uses ARel aggressively and is better optimized than most other libraries.}
14
14
  s.license = 'MIT'
15
15
 
16
- s.add_dependency "activerecord", ">= 3.1.12"
17
- s.add_development_dependency "rspec", "~> 2.13.0"
18
- s.add_development_dependency "sqlite3", "~> 1.3.7"
19
- s.add_development_dependency "genspec", "~> 0.2.8"
20
- s.add_development_dependency "mocha", "~> 0.14.0"
21
- s.add_development_dependency "database_cleaner", "~> 1.2.0"
16
+ s.add_dependency "activerecord", ">= 4.1.16"
17
+ s.add_development_dependency "rspec", "~> 3"
18
+ s.add_development_dependency "rspec-its"
19
+ s.add_development_dependency "mocha"
20
+ s.add_development_dependency "database_cleaner", "~> 1.7.0"
22
21
  s.add_development_dependency "rake", "~> 10.1.0"
23
22
  s.add_development_dependency "appraisal"
23
+ s.add_development_dependency "pry"
24
24
 
25
25
  s.files = `git ls-files`.split("\n")
26
26
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -8,14 +8,14 @@ describe Duck do
8
8
 
9
9
  subject { @duck }
10
10
 
11
- it { subject.respond_to?(:row_position).should be_true }
12
- it { subject.respond_to?(:row_position=).should be_true }
13
- it { subject.respond_to?(:size_position).should be_true }
14
- it { subject.respond_to?(:size_position=).should be_true }
15
- it { subject.respond_to?(:age_position).should be_true }
16
- it { subject.respond_to?(:age_position=).should be_true }
17
- it { subject.respond_to?(:landing_order_position).should be_true }
18
- it { subject.respond_to?(:landing_order_position=).should be_true }
11
+ it { expect(subject).to respond_to(:row_position) }
12
+ it { expect(subject).to respond_to(:row_position=) }
13
+ it { expect(subject).to respond_to(:size_position) }
14
+ it { expect(subject).to respond_to(:size_position=) }
15
+ it { expect(subject).to respond_to(:age_position) }
16
+ it { expect(subject).to respond_to(:age_position=) }
17
+ it { expect(subject).to respond_to(:landing_order_position) }
18
+ it { expect(subject).to respond_to(:landing_order_position=) }
19
19
 
20
20
  end
21
21
 
@@ -148,9 +148,9 @@ describe Duck do
148
148
  it "doesn't change ranking" do
149
149
  # puts Duck.rank(:age).collect {|duck| "#{duck.name} #{duck.age}" }
150
150
  duck = Duck.rank(:age)[2]
151
- ->{
151
+ expect(->{
152
152
  duck.update_attribute :name, 'New Name'
153
- }.should_not change(duck.reload, :age)
153
+ }).to_not change(duck.reload, :age)
154
154
  # puts Duck.rank(:age).collect {|duck| "#{duck.name} #{duck.age}" }
155
155
  end
156
156
 
@@ -161,7 +161,7 @@ describe Duck do
161
161
  it "marks record as changed" do
162
162
  duck = Duck.rank(:age)[2]
163
163
  duck.age_position = 1
164
- duck.changed?.should be_true
164
+ expect(duck.changed?).to be true
165
165
  end
166
166
 
167
167
  end
@@ -172,7 +172,7 @@ describe Duck do
172
172
 
173
173
  it "doesnt set empty string" do
174
174
  subject.age_position = ''
175
- subject.age_position.should be_nil
175
+ expect(subject.age_position).to be_nil
176
176
  end
177
177
 
178
178
  end
@@ -198,9 +198,9 @@ describe Duck do
198
198
 
199
199
  subject { Duck.rank(:row).collect {|duck| duck.id } }
200
200
 
201
- it { subject[0..1].should == @ordered[0..1] }
201
+ it { expect(subject[0..1]).to eq(@ordered[0..1]) }
202
202
 
203
- it { subject[3..subject.length].should == @ordered[2..@ordered.length] }
203
+ it { expect(subject[3..subject.length]).to eq(@ordered[2..@ordered.length]) }
204
204
 
205
205
  }
206
206
 
@@ -233,7 +233,38 @@ describe Duck do
233
233
 
234
234
  subject { Duck.rank(:row).collect {|duck| duck.id } }
235
235
 
236
- it { subject[1..subject.length].should == @ordered }
236
+ it { expect(subject[1..subject.length]).to eq(@ordered) }
237
+
238
+ }
239
+
240
+ end
241
+
242
+ describe "second to last" do
243
+
244
+ before {
245
+ [:quacky, :feathers, :wingy, :webby, :waddly, :beaky].each_with_index do |name, i|
246
+ Duck.where(id: @ducks[name].id).update_all(row: RankedModel::MAX_RANK_VALUE - i)
247
+ @ducks[name].reload
248
+ end
249
+ }
250
+
251
+ context {
252
+
253
+ before { @ducks[:wingy].update_attribute :row_position, (@ducks.size - 2) }
254
+
255
+ subject { Duck.ranker(:row).with(Duck.new).current_at_position(@ducks.size - 2).instance }
256
+
257
+ its(:id) { should == @ducks[:wingy].id }
258
+
259
+ }
260
+
261
+ context {
262
+
263
+ before { @ducks[:wingy].update_attribute :row_position, :down }
264
+
265
+ subject { Duck.ranker(:row).with(Duck.new).current_at_position(@ducks.size - 2).instance }
266
+
267
+ its(:id) { should == @ducks[:wingy].id }
237
268
 
238
269
  }
239
270
 
@@ -274,7 +305,7 @@ describe Duck do
274
305
 
275
306
  subject { Duck.rank(:row).collect {|duck| duck.id } }
276
307
 
277
- it { subject[0..-2].should == @ordered }
308
+ it { expect(subject[0..-2]).to eq(@ordered) }
278
309
 
279
310
  }
280
311
 
@@ -315,7 +346,7 @@ describe Duck do
315
346
 
316
347
  subject { Duck.rank(:row).collect {|duck| duck.id } }
317
348
 
318
- it { subject[0..-2].should == @ordered }
349
+ it { expect(subject[0..-2]).to eq(@ordered) }
319
350
 
320
351
  }
321
352
 
@@ -356,7 +387,7 @@ describe Duck do
356
387
 
357
388
  subject { Duck.rank(:row).collect {|duck| duck.id } }
358
389
 
359
- it { subject[0..-2].should == @ordered }
390
+ it { expect(subject[0..-2]).to eq(@ordered) }
360
391
 
361
392
  }
362
393
 
@@ -383,9 +414,9 @@ describe Duck do
383
414
 
384
415
  subject { Duck.rank(:row).collect { |duck| duck.id } }
385
416
 
386
- it { subject[0..3].should == @ordered[0..3] }
417
+ it { expect(subject[0..3]).to eq(@ordered[0..3]) }
387
418
 
388
- it { subject[5..subject.length].should == @ordered[4..@ordered.length] }
419
+ it { expect(subject[5..subject.length]).to eq(@ordered[4..@ordered.length]) }
389
420
 
390
421
  }
391
422
 
@@ -410,7 +441,7 @@ describe Duck do
410
441
 
411
442
  subject { Duck.rank(:row).collect { |duck| duck.id } }
412
443
 
413
- it { subject[0..-2].should eq(@ordered) }
444
+ it { expect(subject[0..-2]).to eq(@ordered) }
414
445
 
415
446
  }
416
447
 
@@ -435,7 +466,7 @@ describe Duck do
435
466
 
436
467
  subject { Duck.rank(:row).collect { |duck| duck.id } }
437
468
 
438
- it { subject[0..-2].should eq(@ordered) }
469
+ it { expect(subject[0..-2]).to eq(@ordered) }
439
470
 
440
471
  }
441
472
 
@@ -464,9 +495,9 @@ describe Duck do
464
495
 
465
496
  subject { Duck.rank(:row).collect { |duck| duck.id } }
466
497
 
467
- it { subject[0..3].should == @ordered[0..3] }
498
+ it { expect(subject[0..3]).to eq(@ordered[0..3]) }
468
499
 
469
- it { subject[5..subject.length].should == @ordered[4..@ordered.length] }
500
+ it { expect(subject[5..subject.length]).to eq(@ordered[4..@ordered.length]) }
470
501
 
471
502
  }
472
503
 
@@ -491,7 +522,7 @@ describe Duck do
491
522
 
492
523
  subject { Duck.rank(:row).collect { |duck| duck.id } }
493
524
 
494
- it { subject[0..-2].should eq(@ordered) }
525
+ it { expect(subject[0..-2]).to eq(@ordered) }
495
526
 
496
527
  }
497
528
 
@@ -516,7 +547,7 @@ describe Duck do
516
547
 
517
548
  subject { Duck.rank(:row).collect { |duck| duck.id } }
518
549
 
519
- it { subject[0..-2].should eq(@ordered) }
550
+ it { expect(subject[0..-2]).to eq(@ordered) }
520
551
 
521
552
  }
522
553
 
@@ -545,9 +576,9 @@ describe Duck do
545
576
 
546
577
  subject { Duck.rank(:row).collect { |duck| duck.id } }
547
578
 
548
- it { subject[0..1].should == @ordered[0..1] }
579
+ it { expect(subject[0..1]).to eq(@ordered[0..1]) }
549
580
 
550
- it { subject[3..subject.length].should == @ordered[2..@ordered.length] }
581
+ it { expect(subject[3..subject.length]).to eq(@ordered[2..@ordered.length]) }
551
582
 
552
583
  }
553
584
 
@@ -572,7 +603,7 @@ describe Duck do
572
603
 
573
604
  subject { Duck.rank(:row).collect { |duck| duck.id } }
574
605
 
575
- it { subject[1..subject.length].should eq(@ordered) }
606
+ it { expect(subject[1..subject.length]).to eq(@ordered) }
576
607
 
577
608
  }
578
609
 
@@ -597,7 +628,7 @@ describe Duck do
597
628
 
598
629
  subject { Duck.rank(:row).collect { |duck| duck.id } }
599
630
 
600
- it { subject[1..subject.length].should eq(@ordered) }
631
+ it { expect(subject[1..subject.length]).to eq(@ordered) }
601
632
 
602
633
  }
603
634
 
@@ -655,9 +686,9 @@ describe Duck do
655
686
 
656
687
  subject { Duck.rank(:row).collect { |duck| duck.id } }
657
688
 
658
- it { subject[0..1].should == @ordered[0..1] }
689
+ it { expect(subject[0..1]).to eq(@ordered[0..1]) }
659
690
 
660
- it { subject[3..subject.length].should == @ordered[2..@ordered.length] }
691
+ it { expect(subject[3..subject.length]).to eq(@ordered[2..@ordered.length]) }
661
692
 
662
693
  }
663
694
 
@@ -682,7 +713,7 @@ describe Duck do
682
713
 
683
714
  subject { Duck.rank(:row).collect { |duck| duck.id } }
684
715
 
685
- it { subject[1..subject.length].should eq(@ordered) }
716
+ it { expect(subject[1..subject.length]).to eq(@ordered) }
686
717
 
687
718
  }
688
719
 
@@ -707,7 +738,7 @@ describe Duck do
707
738
 
708
739
  subject { Duck.rank(:row).collect { |duck| duck.id } }
709
740
 
710
- it { subject[1..subject.length].should eq(@ordered) }
741
+ it { expect(subject[1..subject.length]).to eq(@ordered) }
711
742
 
712
743
  }
713
744
 
@@ -792,7 +823,7 @@ describe Duck do
792
823
 
793
824
  subject { @untouchable_ranks.call }
794
825
 
795
- it { should == @previous_ranks }
826
+ it { is_expected.to eq(@previous_ranks) }
796
827
 
797
828
  end
798
829
 
@@ -9,6 +9,20 @@ describe Duck do
9
9
  end
10
10
  }
11
11
 
12
+ describe "a large number of records" do
13
+ before { @ducks = Duck.all }
14
+
15
+ describe "the last two ducks' rows' difference" do
16
+ subject { @ducks[-1].row - @ducks[-2].row }
17
+ it { is_expected.not_to be_between(-1, 1) }
18
+ end
19
+
20
+ describe "the second to last two ducks' rows' difference" do
21
+ subject { @ducks[-2].row - @ducks[-3].row }
22
+ it { is_expected.not_to be_between(-1, 1) }
23
+ end
24
+ end
25
+
12
26
  describe "setting and fetching by position" do
13
27
 
14
28
  describe '137' do
@@ -81,7 +95,7 @@ describe Duck do
81
95
 
82
96
  subject { Duck.rank(:row).collect {|d| d.id } }
83
97
 
84
- it { should == (@ordered[0..-2] + [@ordered[-1], @first.id, @second.id]) }
98
+ it { is_expected.to eq(@ordered[0..-2] + [@ordered[-1], @first.id, @second.id]) }
85
99
 
86
100
  }
87
101
 
@@ -103,12 +117,12 @@ describe Duck do
103
117
  context {
104
118
  subject { Duck.where(:pond => 'Pond 1').rank(:age).collect {|d| d.id } }
105
119
 
106
- it { should == (@ordered[0..-2] + [@ordered[-1], @duck_11.id, @duck_12.id]) }
120
+ it { is_expected.to eq(@ordered[0..-2] + [@ordered[-1], @duck_11.id, @duck_12.id]) }
107
121
  }
108
122
 
109
123
  context {
110
124
  subject { Duck.first.age }
111
- it { should == 0}
125
+ it { is_expected.to eq(0)}
112
126
  }
113
127
 
114
128
  end
@@ -127,7 +141,7 @@ describe Duck do
127
141
 
128
142
  subject { Duck.rank(:row).collect {|d| d.id } }
129
143
 
130
- it { should == ([@second.id, @first.id] + @ordered) }
144
+ it { is_expected.to eq([@second.id, @first.id] + @ordered) }
131
145
 
132
146
  }
133
147
 
@@ -136,21 +150,23 @@ describe Duck do
136
150
  describe "with no more gaps" do
137
151
 
138
152
  before {
139
- @first = Duck.first
140
- @second = Duck.where(:row => RankedModel::MAX_RANK_VALUE).first || Duck.offset(1).first
141
- @third = Duck.offset(2).first
142
- @fourth = Duck.offset(4).first
153
+ @first = Duck.rank(:row).first
154
+ @second = Duck.rank(:row).offset(1).first
155
+ @third = Duck.rank(:row).offset(2).first
156
+ @fourth = Duck.rank(:row).offset(4).first
157
+ @fifth = Duck.rank(:row).offset(5).first
143
158
  @lower = Duck.rank(:row).
144
- where(Duck.arel_table[:id].not_in([@first.id, @second.id, @third.id, @fourth.id])).
159
+ where(Duck.arel_table[:id].not_in([@first.id, @second.id, @third.id, @fourth.id, @fifth.id])).
145
160
  where(Duck.arel_table[:row].lt(RankedModel::MAX_RANK_VALUE / 2)).
146
161
  collect {|d| d.id }
147
162
  @upper = Duck.rank(:row).
148
- where(Duck.arel_table[:id].not_in([@first.id, @second.id, @third.id, @fourth.id])).
163
+ where(Duck.arel_table[:id].not_in([@first.id, @second.id, @third.id, @fourth.id, @fifth.id])).
149
164
  where(Duck.arel_table[:row].gteq(RankedModel::MAX_RANK_VALUE / 2)).
150
165
  collect {|d| d.id }
151
166
  @first.update_attribute :row, RankedModel::MIN_RANK_VALUE
152
167
  @second.update_attribute :row, RankedModel::MAX_RANK_VALUE
153
168
  @third.update_attribute :row, (RankedModel::MAX_RANK_VALUE / 2)
169
+ Duck.where(id: @fifth.id).update_all row: @third.row
154
170
  @fourth.update_attribute :row, @third.row
155
171
  }
156
172
 
@@ -158,7 +174,7 @@ describe Duck do
158
174
 
159
175
  subject { Duck.rank(:row).collect {|d| d.id } }
160
176
 
161
- it { should == ([@first.id] + @lower + [@fourth.id, @third.id] + @upper + [@second.id]) }
177
+ it { is_expected.to eq([@first.id] + @lower + [@fourth.id, @third.id, @fifth.id] + @upper + [@second.id]) }
162
178
 
163
179
  }
164
180
 
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Number do
4
+
5
+ before {
6
+ 200.times do |i|
7
+ Number.create :value => i
8
+ end
9
+ }
10
+
11
+ describe "a rearrangement with keyword column name" do
12
+
13
+ before {
14
+ @first = Number.first
15
+ @second = Number.offset(1).first
16
+ @ordered = Number.rank(:order).where(Number.arel_table[:id].not_in([@first.id, @second.id])).collect {|d| d.id }
17
+ @first.update_attribute :order, RankedModel::MAX_RANK_VALUE
18
+ @second.update_attribute :order, RankedModel::MAX_RANK_VALUE
19
+ }
20
+
21
+ context {
22
+
23
+ subject { Number.rank(:order).collect {|d| d.id } }
24
+
25
+ it { should == (@ordered[0..-2] + [@ordered[-1], @first.id, @second.id]) }
26
+
27
+ }
28
+
29
+ end
30
+
31
+ end
@@ -2,6 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe RankedModel do
4
4
 
5
- it { should define_constant(:VERSION) }
5
+ it { is_expected.to define_constant(:VERSION) }
6
6
 
7
7
  end
@@ -1,13 +1,18 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
+ require 'rspec/its'
3
4
 
4
5
  require 'ranked-model'
6
+ require 'pry'
5
7
 
6
8
  Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each {|f| require f}
7
9
 
8
10
  # After the DB connection is setup
9
11
  require 'database_cleaner'
10
12
 
13
+ # Uncomment this to see Active Record logging for tests
14
+ # ActiveRecord::Base.logger = Logger.new(STDOUT)
15
+
11
16
  RSpec.configure do |config|
12
17
  config.mock_with :mocha
13
18
 
@@ -43,7 +43,7 @@ describe Vehicle do
43
43
  describe "Vehicle" do
44
44
 
45
45
  it "should have one ranker object" do
46
- Vehicle.rankers.count.should == 1
46
+ expect(Vehicle.rankers.count).to eq(1)
47
47
  end
48
48
 
49
49
  subject { Vehicle.rankers.first }
@@ -57,7 +57,7 @@ describe Vehicle do
57
57
  describe "MotorBike" do
58
58
 
59
59
  it "should have one ranker object" do
60
- MotorBike.rankers.count.should == 1
60
+ expect(MotorBike.rankers.count).to eq(1)
61
61
  end
62
62
 
63
63
  subject { MotorBike.rankers.first }
@@ -56,6 +56,11 @@ ActiveRecord::Schema.define :version => 0 do
56
56
  t.string :city
57
57
  t.integer :score
58
58
  end
59
+
60
+ create_table :numbers, :force => true do |t|
61
+ t.float :value
62
+ t.integer :order
63
+ end
59
64
  end
60
65
 
61
66
  class Duck < ActiveRecord::Base
@@ -145,3 +150,8 @@ end
145
150
  class Player < ActiveRecord::Base
146
151
  # don't add rank yet, do it in the specs
147
152
  end
153
+
154
+ class Number < ActiveRecord::Base
155
+ include RankedModel
156
+ ranks :order
157
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ranked-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Beale
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-12 00:00:00.000000000 Z
11
+ date: 2018-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,100 +16,100 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.1.12
19
+ version: 4.1.16
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.1.12
26
+ version: 4.1.16
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.13.0
33
+ version: '3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.13.0
40
+ version: '3'
41
41
  - !ruby/object:Gem::Dependency
42
- name: sqlite3
42
+ name: rspec-its
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 1.3.7
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 1.3.7
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: genspec
56
+ name: mocha
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 0.2.8
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 0.2.8
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: mocha
70
+ name: database_cleaner
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.14.0
75
+ version: 1.7.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.14.0
82
+ version: 1.7.0
83
83
  - !ruby/object:Gem::Dependency
84
- name: database_cleaner
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 1.2.0
89
+ version: 10.1.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 1.2.0
96
+ version: 10.1.0
97
97
  - !ruby/object:Gem::Dependency
98
- name: rake
98
+ name: appraisal
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: 10.1.0
103
+ version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 10.1.0
110
+ version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: appraisal
112
+ name: pry
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -141,6 +141,9 @@ files:
141
141
  - gemfiles/rails_3_2.gemfile
142
142
  - gemfiles/rails_4_1.gemfile
143
143
  - gemfiles/rails_4_2.gemfile
144
+ - gemfiles/rails_5_0.gemfile
145
+ - gemfiles/rails_5_1.gemfile
146
+ - gemfiles/rails_5_2.gemfile
144
147
  - lib/ranked-model.rb
145
148
  - lib/ranked-model/railtie.rb
146
149
  - lib/ranked-model/ranker.rb
@@ -151,6 +154,7 @@ files:
151
154
  - spec/duck-model/lots_of_ducks_spec.rb
152
155
  - spec/duck-model/wrong_ducks_spec.rb
153
156
  - spec/ego-model/ego_spec.rb
157
+ - spec/number-model/number_spec.rb
154
158
  - spec/player-model/records_already_exist_spec.rb
155
159
  - spec/ranked-model/ranker_spec.rb
156
160
  - spec/ranked-model/version_spec.rb
@@ -180,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
184
  version: '0'
181
185
  requirements: []
182
186
  rubyforge_project:
183
- rubygems_version: 2.6.14
187
+ rubygems_version: 2.5.2.2
184
188
  signing_key:
185
189
  specification_version: 4
186
190
  summary: An acts_as_sortable replacement built for Rails 3 & 4
@@ -189,6 +193,7 @@ test_files:
189
193
  - spec/duck-model/lots_of_ducks_spec.rb
190
194
  - spec/duck-model/wrong_ducks_spec.rb
191
195
  - spec/ego-model/ego_spec.rb
196
+ - spec/number-model/number_spec.rb
192
197
  - spec/player-model/records_already_exist_spec.rb
193
198
  - spec/ranked-model/ranker_spec.rb
194
199
  - spec/ranked-model/version_spec.rb