acts_as_list 0.7.4 → 0.7.5

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,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ODI0OTU2NzgzMmY0MmI3YjMyMDk2ZDg5YWJjNjkxZDE4ZjViODliYQ==
5
- data.tar.gz: !binary |-
6
- OThlMWNiYjU3MGRmMGQzNjA5NzQ1MDk1MzdiYTg1MGFjODJlNDJmYQ==
2
+ SHA1:
3
+ metadata.gz: c73ad553a7510872487e1d9bf560277e02ba3159
4
+ data.tar.gz: cc8e55f14d3c25aa21b1e2c239077e48a789c338
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ZDMzOWRkNzQ2ZjNmZGRlM2QxYzJkN2VjYzM2MGY1Yzk4MjE1MmZiOWQyZjY1
10
- NmY4Y2FjY2U4YjczNjliZjFmYzYwYmMzYTNlNTA2MjU4NmVlODFmMzg1NGY0
11
- OWNkN2Y4MGU2ZTM4YjM2YjY0MTZkNjcwMjk0NmQ1YzBkMmNjYjE=
12
- data.tar.gz: !binary |-
13
- Mzg4NGQwNmY2NjdjN2MxZWIzYWE4MWNiOTlkMTc5NGM5NTRiMzRmY2MwNDVh
14
- ODI2YTVhZmUwMzE1OTAwNzA1OWZjMjc3ZGNhZmI1Y2ZmNmU4NmYzNGQ3ZTc1
15
- OGUyZDE0NjZkZTVjNmQxZTJhOWUyNjdhOWIwMjJiMTg2YzA2NWI=
6
+ metadata.gz: 4ff90570f627ca4911a842a95e06c0570db69ed3ea2d908eaef1339dea143dbafb17e70d53009dddcb3fcf1ab2a12afe2fe5ceea0c71cd62ca3b1b337b18f947
7
+ data.tar.gz: e2c8a70ecaaea9b85437feb857a82cb5073eace0a50474fc914461bd19fd7113f27c866591dc291cbabf17342d2c2a98c75d8fd4eaf3d247a98c8eb6a19db968
@@ -9,9 +9,24 @@ rvm:
9
9
  - 1.9.3
10
10
  - 2.0.0
11
11
  - 2.1.0
12
+ - 2.2.2
12
13
  - jruby-19mode
13
14
  - rbx-2
14
15
  gemfile:
15
16
  - gemfiles/rails_3_2.gemfile
16
17
  - gemfiles/rails_4_1.gemfile
17
18
  - gemfiles/rails_4_2.gemfile
19
+ - gemfiles/rails_5_0.gemfile
20
+ matrix:
21
+ exclude:
22
+ - rvm: 1.9.3
23
+ gemfile: gemfiles/rails_5_0.gemfile
24
+ - rvm: 2.0.0
25
+ gemfile: gemfiles/rails_5_0.gemfile
26
+ - rvm: 2.1.0
27
+ gemfile: gemfiles/rails_5_0.gemfile
28
+ - rvm: jruby-19mode
29
+ gemfile: gemfiles/rails_5_0.gemfile
30
+ - rvm: rbx-2
31
+ gemfile: gemfiles/rails_5_0.gemfile
32
+
data/Appraisals CHANGED
@@ -9,3 +9,7 @@ end
9
9
  appraise "rails-4-2" do
10
10
  gem "activerecord", "~> 4.2.1"
11
11
  end
12
+
13
+ appraise "rails-5-0" do
14
+ gem "activerecord", "~> 5.0.0.rc2"
15
+ end
@@ -1,7 +1,29 @@
1
1
  # Change Log
2
2
 
3
+ ## [Unreleased](https://github.com/swanandp/acts_as_list/tree/HEAD)
4
+
5
+ [Full Changelog](https://github.com/swanandp/acts_as_list/compare/v0.7.4...HEAD)
6
+
7
+ **Closed issues:**
8
+
9
+ - Undefined instance variable @scope\_changed since 0.7.3 [\#199](https://github.com/swanandp/acts_as_list/issues/199)
10
+
11
+ ## [v0.7.4](https://github.com/swanandp/acts_as_list/tree/v0.7.4) (2016-04-15)
12
+ [Full Changelog](https://github.com/swanandp/acts_as_list/compare/v0.7.3...v0.7.4)
13
+
14
+ **Closed issues:**
15
+
16
+ - Releasing a new gem version [\#196](https://github.com/swanandp/acts_as_list/issues/196)
17
+
18
+ **Merged pull requests:**
19
+
20
+ - Fix scope changed [\#200](https://github.com/swanandp/acts_as_list/pull/200) ([brendon](https://github.com/brendon))
21
+
3
22
  ## [v0.7.3](https://github.com/swanandp/acts_as_list/tree/v0.7.3) (2016-04-14)
4
- [Full Changelog](https://github.com/swanandp/acts_as_list/compare/0.7.1...v0.7.3)
23
+ [Full Changelog](https://github.com/swanandp/acts_as_list/compare/v0.7.2...v0.7.3)
24
+
25
+ ## [v0.7.2](https://github.com/swanandp/acts_as_list/tree/v0.7.2) (2016-04-01)
26
+ [Full Changelog](https://github.com/swanandp/acts_as_list/compare/0.7.2...v0.7.2)
5
27
 
6
28
  **Closed issues:**
7
29
 
@@ -238,4 +260,4 @@
238
260
 
239
261
 
240
262
 
241
- \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
263
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
@@ -0,0 +1,23 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "sqlite3", :platforms => [:ruby]
6
+ gem "activerecord-jdbcsqlite3-adapter", :platforms => [:jruby]
7
+ gem "rake"
8
+ gem "appraisal"
9
+ gem "github_changelog_generator", "1.9.0"
10
+ gem "activerecord", "~> 5.0.0.beta3"
11
+
12
+ group :test do
13
+ gem "minitest", "~> 5.0"
14
+ gem "test_after_commit", "~> 0.4.2"
15
+ end
16
+
17
+ platforms :rbx do
18
+ gem "rubysl", "~> 2.0"
19
+ gem "rubinius-developer_tools"
20
+ gem "rubysl-test-unit"
21
+ end
22
+
23
+ gemspec :path => "../"
@@ -74,9 +74,9 @@ module ActiveRecord
74
74
  )
75
75
  end
76
76
 
77
- class_eval <<-EOV, __FILE__, __LINE__ + 1
78
- include ::ActiveRecord::Acts::List::InstanceMethods
77
+ quoted_position_column = connection.quote_column_name(configuration[:column])
79
78
 
79
+ class_eval <<-EOV, __FILE__, __LINE__ + 1
80
80
  def acts_as_list_top
81
81
  #{configuration[:top_of_list]}.to_i
82
82
  end
@@ -111,23 +111,46 @@ module ActiveRecord
111
111
  attr_accessible :#{configuration[:column]}
112
112
  end
113
113
 
114
- before_validation :check_top_position
115
-
116
- before_destroy :reload_position
117
- after_destroy :decrement_positions_on_lower_items
118
-
119
- before_update :check_scope
120
- after_update :update_positions
114
+ scope :in_list, lambda { where(%q{#{quoted_table_name}.#{quoted_position_column} IS NOT NULL}) }
115
+
116
+ def self.decrement_all
117
+ update_all_with_touch %q(#{quoted_position_column} = (#{quoted_table_name}.#{quoted_position_column} - 1))
118
+ end
119
+
120
+ def self.increment_all
121
+ update_all_with_touch %q(#{quoted_position_column} = (#{quoted_table_name}.#{quoted_position_column} + 1))
122
+ end
123
+
124
+ def self.update_all_with_touch(updates)
125
+ record = new
126
+ attrs = record.send(:timestamp_attributes_for_update_in_model)
127
+ now = record.send(:current_time_from_proper_timezone)
121
128
 
122
- after_commit 'remove_instance_variable(:@scope_changed) if defined?(@scope_changed)'
129
+ query = attrs.map { |attr| %(\#{connection.quote_column_name(attr)} = :now) }
130
+ query.push updates
131
+ query = query.join(", ")
123
132
 
124
- scope :in_list, lambda { where("#{table_name}.#{configuration[:column]} IS NOT NULL") }
133
+ update_all([query, now: now])
134
+ end
125
135
  EOV
126
136
 
137
+ attr_reader :position_changed
138
+
139
+ before_validation :check_top_position
140
+
141
+ before_destroy :lock!
142
+ after_destroy :decrement_positions_on_lower_items
143
+
144
+ before_update :check_scope
145
+ after_update :update_positions
146
+
147
+ after_commit :clear_scope_changed
148
+
127
149
  if configuration[:add_new_at].present?
128
- self.send :before_create, :"add_to_list_#{configuration[:add_new_at]}"
150
+ before_create "add_to_list_#{configuration[:add_new_at]}".to_sym
129
151
  end
130
152
 
153
+ include ::ActiveRecord::Acts::List::InstanceMethods
131
154
  end
132
155
  end
133
156
 
@@ -232,10 +255,10 @@ module ActiveRecord
232
255
  limit ||= acts_as_list_list.count
233
256
  position_value = send(position_column)
234
257
  acts_as_list_list.
235
- where("#{position_column} < ?", position_value).
236
- where("#{position_column} >= ?", position_value - limit).
258
+ where("#{quoted_table_name}.#{quoted_position_column} < ?", position_value).
259
+ where("#{quoted_table_name}.#{quoted_position_column} >= ?", position_value - limit).
237
260
  limit(limit).
238
- order("#{acts_as_list_class.table_name}.#{position_column} ASC")
261
+ order("#{quoted_table_name}.#{quoted_position_column} ASC")
239
262
  end
240
263
 
241
264
  # Return the next lower item in the list.
@@ -250,10 +273,10 @@ module ActiveRecord
250
273
  limit ||= acts_as_list_list.count
251
274
  position_value = send(position_column)
252
275
  acts_as_list_list.
253
- where("#{position_column} > ?", position_value).
254
- where("#{position_column} <= ?", position_value + limit).
276
+ where("#{quoted_table_name}.#{quoted_position_column} > ?", position_value).
277
+ where("#{quoted_table_name}.#{quoted_position_column} <= ?", position_value + limit).
255
278
  limit(limit).
256
- order("#{acts_as_list_class.table_name}.#{position_column} ASC")
279
+ order("#{quoted_table_name}.#{quoted_position_column} ASC")
257
280
  end
258
281
 
259
282
  # Test if this record is in a list
@@ -298,7 +321,7 @@ module ActiveRecord
298
321
  # A poorly named method. It will insert the item at the desired position if the position
299
322
  # has been set manually using position=, not necessarily the bottom of the list
300
323
  def add_to_list_bottom
301
- if not_in_list? || internal_scope_changed? && !@position_changed || default_position?
324
+ if not_in_list? || internal_scope_changed? && !position_changed || default_position?
302
325
  self[position_column] = bottom_position_in_list.to_i + 1
303
326
  else
304
327
  increment_positions_on_lower_items(self[position_column], id)
@@ -323,12 +346,11 @@ module ActiveRecord
323
346
 
324
347
  # Returns the bottom item
325
348
  def bottom_item(except = nil)
326
- conditions = scope_condition
327
349
  conditions = except ? "#{self.class.primary_key} != #{self.class.connection.quote(except.id)}" : {}
328
350
  acts_as_list_list.in_list.where(
329
351
  conditions
330
352
  ).order(
331
- "#{acts_as_list_class.table_name}.#{position_column} DESC"
353
+ "#{quoted_table_name}.#{quoted_position_column} DESC"
332
354
  ).first
333
355
  end
334
356
 
@@ -344,50 +366,32 @@ module ActiveRecord
344
366
 
345
367
  # This has the effect of moving all the higher items up one.
346
368
  def decrement_positions_on_higher_items(position)
347
- acts_as_list_list.where(
348
- "#{position_column} <= #{position}"
349
- ).update_all(
350
- "#{position_column} = (#{position_column} - 1)"
351
- )
369
+ acts_as_list_list.where("#{quoted_position_column} <= #{position}").decrement_all
352
370
  end
353
371
 
354
372
  # This has the effect of moving all the lower items up one.
355
373
  def decrement_positions_on_lower_items(position=nil)
356
374
  return unless in_list?
357
375
  position ||= send(position_column).to_i
358
- acts_as_list_list.where(
359
- "#{position_column} > #{position}"
360
- ).update_all(
361
- "#{position_column} = (#{position_column} - 1)"
362
- )
376
+ acts_as_list_list.where("#{quoted_position_column} > #{position}").decrement_all
363
377
  end
364
378
 
365
379
  # This has the effect of moving all the higher items down one.
366
380
  def increment_positions_on_higher_items
367
381
  return unless in_list?
368
- acts_as_list_list.where(
369
- "#{position_column} < #{send(position_column).to_i}"
370
- ).update_all(
371
- "#{position_column} = (#{position_column} + 1)"
372
- )
382
+ acts_as_list_list.where("#{quoted_position_column} < #{send(position_column).to_i}").increment_all
373
383
  end
374
384
 
375
385
  # This has the effect of moving all the lower items down one.
376
386
  def increment_positions_on_lower_items(position, avoid_id = nil)
377
387
  avoid_id_condition = avoid_id ? " AND #{self.class.primary_key} != #{self.class.connection.quote(avoid_id)}" : ''
378
388
 
379
- acts_as_list_list.where(
380
- "#{position_column} >= #{position}#{avoid_id_condition}"
381
- ).update_all(
382
- "#{position_column} = (#{position_column} + 1)"
383
- )
389
+ acts_as_list_list.where("#{quoted_position_column} >= #{position}#{avoid_id_condition}").increment_all
384
390
  end
385
391
 
386
392
  # Increments position (<tt>position_column</tt>) of all items in the list.
387
393
  def increment_positions_on_all_items
388
- acts_as_list_list.update_all(
389
- "#{position_column} = (#{position_column} + 1)"
390
- )
394
+ acts_as_list_list.increment_all
391
395
  end
392
396
 
393
397
  # Reorders intermediate items to support moving an item from old_position to new_position.
@@ -401,24 +405,20 @@ module ActiveRecord
401
405
  # e.g., if moving an item from 2 to 5,
402
406
  # move [3, 4, 5] to [2, 3, 4]
403
407
  acts_as_list_list.where(
404
- "#{position_column} > #{old_position}"
408
+ "#{quoted_position_column} > #{old_position}"
405
409
  ).where(
406
- "#{position_column} <= #{new_position}#{avoid_id_condition}"
407
- ).update_all(
408
- "#{position_column} = (#{position_column} - 1)"
409
- )
410
+ "#{quoted_position_column} <= #{new_position}#{avoid_id_condition}"
411
+ ).decrement_all
410
412
  else
411
413
  # Increment position of intermediate items
412
414
  #
413
415
  # e.g., if moving an item from 5 to 2,
414
416
  # move [2, 3, 4] to [3, 4, 5]
415
417
  acts_as_list_list.where(
416
- "#{position_column} >= #{new_position}"
418
+ "#{quoted_position_column} >= #{new_position}"
417
419
  ).where(
418
- "#{position_column} < #{old_position}#{avoid_id_condition}"
419
- ).update_all(
420
- "#{position_column} = (#{position_column} + 1)"
421
- )
420
+ "#{quoted_position_column} < #{old_position}#{avoid_id_condition}"
421
+ ).increment_all
422
422
  end
423
423
  end
424
424
 
@@ -448,39 +448,33 @@ module ActiveRecord
448
448
  new_position = send(position_column).to_i
449
449
 
450
450
  return unless acts_as_list_list.where(
451
- "#{position_column} = #{new_position}"
451
+ "#{quoted_position_column} = #{new_position}"
452
452
  ).count > 1
453
453
  shuffle_positions_on_intermediate_items old_position, new_position, id
454
454
  end
455
455
 
456
456
  def internal_scope_changed?
457
457
  return @scope_changed if defined?(@scope_changed)
458
-
458
+
459
459
  @scope_changed = scope_changed?
460
460
  end
461
461
 
462
- # Temporarily swap changes attributes with current attributes
463
- def swap_changed_attributes
464
- @changed_attributes.each do |k, _|
465
- if self.class.column_names.include? k
466
- @changed_attributes[k], self[k] = self[k], @changed_attributes[k]
467
- end
468
- end
462
+ def clear_scope_changed
463
+ remove_instance_variable(:@scope_changed) if defined?(@scope_changed)
469
464
  end
470
465
 
471
466
  def check_scope
472
467
  if internal_scope_changed?
473
- swap_changed_attributes
468
+ cached_changes = changes
469
+
470
+ cached_changes.each { |attribute, values| self[attribute] = values[0] }
474
471
  send('decrement_positions_on_lower_items') if lower_item
475
- swap_changed_attributes
472
+ cached_changes.each { |attribute, values| self[attribute] = values[1] }
473
+
476
474
  send("add_to_list_#{add_new_at}")
477
475
  end
478
476
  end
479
477
 
480
- def reload_position
481
- self.reload
482
- end
483
-
484
478
  # This check is skipped if the position is currently the default position from the table
485
479
  # as modifying the default position on creation is handled elsewhere
486
480
  def check_top_position
@@ -488,6 +482,16 @@ module ActiveRecord
488
482
  self[position_column] = acts_as_list_top
489
483
  end
490
484
  end
485
+
486
+ # When using raw column name it must be quoted otherwise it can raise syntax errors with SQL keywords (e.g. order)
487
+ def quoted_position_column
488
+ @_quoted_position_column ||= self.class.connection.quote_column_name(position_column)
489
+ end
490
+
491
+ # Used in order clauses
492
+ def quoted_table_name
493
+ @_quoted_table_name ||= acts_as_list_class.quoted_table_name
494
+ end
491
495
  end
492
496
  end
493
497
  end
@@ -1,7 +1,7 @@
1
1
  module ActiveRecord
2
2
  module Acts
3
3
  module List
4
- VERSION = '0.7.4'
4
+ VERSION = '0.7.5'
5
5
  end
6
6
  end
7
7
  end
@@ -12,9 +12,9 @@ require "minitest/autorun"
12
12
  require "#{File.dirname(__FILE__)}/../init"
13
13
 
14
14
  if defined?(ActiveRecord::VERSION) &&
15
- ActiveRecord::VERSION::MAJOR > 4 ||
16
- (ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR >= 2)
15
+ ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR >= 2
17
16
 
17
+ # Was removed in Rails 5 and is effectively true.
18
18
  ActiveRecord::Base.raise_in_transactional_callbacks = true
19
19
  end
20
20
 
@@ -6,4 +6,5 @@ module Shared
6
6
  autoload :ArrayScopeList, 'shared_array_scope_list'
7
7
  autoload :TopAddition, 'shared_top_addition'
8
8
  autoload :NoAddition, 'shared_no_addition'
9
+ autoload :Quoting, 'shared_quoting'
9
10
  end
@@ -142,7 +142,7 @@ module Shared
142
142
 
143
143
  def test_update_position_when_scope_changes
144
144
  assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
145
- parent = ListMixin.create(parent_id: 6)
145
+ ListMixin.create(parent_id: 6)
146
146
 
147
147
  ListMixin.where(id: 2).first.move_within_scope(6)
148
148
 
@@ -246,5 +246,11 @@ module Shared
246
246
 
247
247
  assert_equal [5, 1, 6, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
248
248
  end
249
+
250
+ def test_non_persisted_records_dont_get_lock_called
251
+ new = ListMixin.new(parent_id: 5)
252
+
253
+ new.destroy
254
+ end
249
255
  end
250
256
  end
@@ -0,0 +1,21 @@
1
+ module Shared
2
+ module Quoting
3
+
4
+ def setup
5
+ 3.times { |counter| QuotedList.create! order: counter }
6
+ end
7
+
8
+ def test_create
9
+ assert_equal QuotedList.in_list.size, 3
10
+ end
11
+
12
+ # This test execute raw queries involving table name
13
+ def test_moving
14
+ item = QuotedList.first
15
+ item.higher_items
16
+ item.lower_items
17
+ item.send :bottom_item # Part of private api
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,64 @@
1
+ require 'helper'
2
+
3
+ ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
4
+ ActiveRecord::Schema.verbose = false
5
+
6
+ class Section < ActiveRecord::Base
7
+ has_many :items
8
+ acts_as_list
9
+
10
+ scope :visible, -> { where(visible: true) }
11
+ end
12
+
13
+ class Item < ActiveRecord::Base
14
+ belongs_to :section
15
+ acts_as_list scope: :section
16
+
17
+ scope :visible, -> { where(visible: true).joins(:section).merge(Section.visible) }
18
+ end
19
+
20
+ class JoinedTestCase < Minitest::Test
21
+ def setup
22
+ ActiveRecord::Base.connection.create_table :sections do |t|
23
+ t.column :position, :integer
24
+ t.column :visible, :boolean, default: true
25
+ end
26
+
27
+ ActiveRecord::Base.connection.create_table :items do |t|
28
+ t.column :position, :integer
29
+ t.column :section_id, :integer
30
+ t.column :visible, :boolean, default: true
31
+ end
32
+
33
+ ActiveRecord::Base.connection.schema_cache.clear!
34
+ [Section, Item].each(&:reset_column_information)
35
+ super
36
+ end
37
+
38
+ def teardown
39
+ ActiveRecord::Base.connection.tables.each do |table|
40
+ ActiveRecord::Base.connection.drop_table(table)
41
+ end
42
+ super
43
+ end
44
+ end
45
+
46
+ # joining the relation returned by `#higher_items` or `#lower_items` to another table
47
+ # previously could result in ambiguous column names in the query
48
+ class TestHigherLowerItems < JoinedTestCase
49
+ def test_higher_items
50
+ section = Section.create
51
+ item1 = Item.create section: section
52
+ item2 = Item.create section: section
53
+ item3 = Item.create section: section
54
+ assert_equal item3.higher_items.visible, [item1, item2]
55
+ end
56
+
57
+ def test_lower_items
58
+ section = Section.create
59
+ item1 = Item.create section: section
60
+ item2 = Item.create section: section
61
+ item3 = Item.create section: section
62
+ assert_equal item1.lower_items.visible, [item2, item3]
63
+ end
64
+ end
@@ -16,9 +16,14 @@ def setup_db(position_options = {})
16
16
  t.column :state, :integer
17
17
  end
18
18
 
19
+ # This table is used to test table names and column names quoting
20
+ ActiveRecord::Base.connection.create_table 'table-name' do |t|
21
+ t.column :order, :integer
22
+ end
23
+
19
24
  mixins = [ Mixin, ListMixin, ListMixinSub1, ListMixinSub2, ListWithStringScopeMixin,
20
25
  ArrayScopeListMixin, ZeroBasedMixin, DefaultScopedMixin,
21
- DefaultScopedWhereMixin, TopAdditionMixin, NoAdditionMixin ]
26
+ DefaultScopedWhereMixin, TopAdditionMixin, NoAdditionMixin, QuotedList ]
22
27
 
23
28
  mixins << EnumArrayScopeListMixin if rails_4
24
29
 
@@ -42,7 +47,13 @@ def rails_4
42
47
  end
43
48
 
44
49
  def teardown_db
45
- ActiveRecord::Base.connection.tables.each do |table|
50
+ if ActiveRecord::VERSION::MAJOR >= 5
51
+ tables = ActiveRecord::Base.connection.data_sources
52
+ else
53
+ tables = ActiveRecord::Base.connection.tables
54
+ end
55
+
56
+ tables.each do |table|
46
57
  ActiveRecord::Base.connection.drop_table(table)
47
58
  end
48
59
  end
@@ -149,6 +160,11 @@ end
149
160
  class TheBaseSubclass < TheBaseClass
150
161
  end
151
162
 
163
+ class QuotedList < ActiveRecord::Base
164
+ self.table_name = 'table-name'
165
+ acts_as_list column: :order
166
+ end
167
+
152
168
  class ActsAsListTestCase < Minitest::Test
153
169
  # No default test required as this class is abstract.
154
170
  # Need for test/unit.
@@ -243,6 +259,15 @@ class ArrayScopeListTestWithDefault < ActsAsListTestCase
243
259
  end
244
260
  end
245
261
 
262
+ class QuotingTestList < ActsAsListTestCase
263
+ include Shared::Quoting
264
+
265
+ def setup
266
+ setup_db_with_default
267
+ super
268
+ end
269
+ end
270
+
246
271
  class DefaultScopedTest < ActsAsListTestCase
247
272
  def setup
248
273
  setup_db
@@ -603,3 +628,66 @@ class MultipleListsArrayScopeTest < ActsAsListTestCase
603
628
  assert_equal [1], ArrayScopeListMixin.where(:parent_id => 4, :parent_type => 'anything').order(:pos).map(&:pos)
604
629
  end
605
630
  end
631
+
632
+ class TouchTest < ActsAsListTestCase
633
+ def setup
634
+ setup_db
635
+ 4.times { ListMixin.create! updated_at: yesterday }
636
+ end
637
+
638
+ def now
639
+ Time.now.utc
640
+ end
641
+
642
+ def yesterday
643
+ 1.day.ago
644
+ end
645
+
646
+ def updated_ats
647
+ ListMixin.pluck(:updated_at)
648
+ end
649
+
650
+ def test_moving_item_lower_touches_self_and_lower_item
651
+ ListMixin.first.move_lower
652
+ updated_ats[0..1].each do |updated_at|
653
+ assert_in_delta updated_at, now, 1.second
654
+ end
655
+ updated_ats[2..3].each do |updated_at|
656
+ assert_in_delta updated_at, yesterday, 1.second
657
+ end
658
+ end
659
+
660
+ def test_moving_item_higher_touches_self_and_higher_item
661
+ ListMixin.all.second.move_higher
662
+ updated_ats[0..1].each do |updated_at|
663
+ assert_in_delta updated_at, now, 1.second
664
+ end
665
+ updated_ats[2..3].each do |updated_at|
666
+ assert_in_delta updated_at, yesterday, 1.second
667
+ end
668
+ end
669
+
670
+ def test_moving_item_to_bottom_touches_all_other_items
671
+ ListMixin.first.move_to_bottom
672
+ updated_ats.each do |updated_at|
673
+ assert_in_delta updated_at, now, 1.second
674
+ end
675
+ end
676
+
677
+ def test_moving_item_to_top_touches_all_other_items
678
+ ListMixin.last.move_to_top
679
+ updated_ats.each do |updated_at|
680
+ assert_in_delta updated_at, now, 1.second
681
+ end
682
+ end
683
+
684
+ def test_removing_item_touches_all_lower_items
685
+ ListMixin.all.third.remove_from_list
686
+ updated_ats[0..1].each do |updated_at|
687
+ assert_in_delta updated_at, yesterday, 1.second
688
+ end
689
+ updated_ats[2..2].each do |updated_at|
690
+ assert_in_delta updated_at, now, 1.second
691
+ end
692
+ end
693
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_list
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.4
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
@@ -10,34 +10,34 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-04-15 00:00:00.000000000 Z
13
+ date: 2016-06-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - ! '>='
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - ! '>='
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '3.0'
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: bundler
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - ! '>='
33
+ - - ">="
34
34
  - !ruby/object:Gem::Version
35
35
  version: 1.0.0
36
36
  type: :development
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - ! '>='
40
+ - - ">="
41
41
  - !ruby/object:Gem::Version
42
42
  version: 1.0.0
43
43
  description: This "acts_as" extension provides the capabilities for sorting and reordering
@@ -49,9 +49,9 @@ executables: []
49
49
  extensions: []
50
50
  extra_rdoc_files: []
51
51
  files:
52
- - .gemtest
53
- - .gitignore
54
- - .travis.yml
52
+ - ".gemtest"
53
+ - ".gitignore"
54
+ - ".travis.yml"
55
55
  - Appraisals
56
56
  - CHANGELOG.md
57
57
  - Gemfile
@@ -62,6 +62,7 @@ files:
62
62
  - gemfiles/rails_3_2.gemfile
63
63
  - gemfiles/rails_4_1.gemfile
64
64
  - gemfiles/rails_4_2.gemfile
65
+ - gemfiles/rails_5_0.gemfile
65
66
  - init.rb
66
67
  - lib/acts_as_list.rb
67
68
  - lib/acts_as_list/active_record/acts/list.rb
@@ -72,8 +73,10 @@ files:
72
73
  - test/shared_list.rb
73
74
  - test/shared_list_sub.rb
74
75
  - test/shared_no_addition.rb
76
+ - test/shared_quoting.rb
75
77
  - test/shared_top_addition.rb
76
78
  - test/shared_zero_based.rb
79
+ - test/test_joined_list.rb
77
80
  - test/test_list.rb
78
81
  homepage: http://github.com/swanandp/acts_as_list
79
82
  licenses:
@@ -85,12 +88,12 @@ require_paths:
85
88
  - lib
86
89
  required_ruby_version: !ruby/object:Gem::Requirement
87
90
  requirements:
88
- - - ! '>='
91
+ - - ">="
89
92
  - !ruby/object:Gem::Version
90
93
  version: 1.9.2
91
94
  required_rubygems_version: !ruby/object:Gem::Requirement
92
95
  requirements:
93
- - - ! '>='
96
+ - - ">="
94
97
  - !ruby/object:Gem::Version
95
98
  version: '0'
96
99
  requirements: []
@@ -107,6 +110,8 @@ test_files:
107
110
  - test/shared_list.rb
108
111
  - test/shared_list_sub.rb
109
112
  - test/shared_no_addition.rb
113
+ - test/shared_quoting.rb
110
114
  - test/shared_top_addition.rb
111
115
  - test/shared_zero_based.rb
116
+ - test/test_joined_list.rb
112
117
  - test/test_list.rb