acts_as_silent_list 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,10 @@
1
+ = 1.1.0 - 2011-10-19
2
+
3
+ == Features
4
+
5
+ * adding private method to remove an item from a list without touching the other list elements.
6
+
7
+
1
8
  = 1.0.0 - Initial Release
2
9
 
3
10
  This gem is based on acts_as_list, while it tries to avoid triggering
@@ -5,9 +5,10 @@ module ActiveRecord
5
5
  base.extend(ClassMethods)
6
6
  end
7
7
 
8
- # This +acts_as+ extension provides the capabilities for sorting and reordering a number of objects in a list.
9
- # The class that has this specified needs to have a +position+ column defined as an integer on
10
- # the mapped database table.
8
+ # This +acts_as+ extension provides the capabilities for sorting and
9
+ # reordering a number of objects in a list. The class that has this
10
+ # specified needs to have a +position+ column defined as an integer on the
11
+ # mapped database table.
11
12
  #
12
13
  # Todo list example:
13
14
  #
@@ -25,13 +26,17 @@ module ActiveRecord
25
26
  module ClassMethods
26
27
  # Configuration options are:
27
28
  #
28
- # * +column+ - specifies the column name to use for keeping the position integer (default: +position+)
29
- # * +scope+ - restricts what is to be considered a list. Given a symbol, it'll attach <tt>_id</tt>
30
- # (if it hasn't already been added) and use that as the foreign key restriction. It's also possible
31
- # to give it an entire string that is interpolated if you need a tighter scope than just a foreign key.
32
- # Example: <tt>acts_as_silent_list :scope => 'todo_list_id = #{todo_list_id} AND completed = 0'</tt>
33
- # * +top_of_list+ - defines the integer used for the top of the list. Defaults to 1. Use 0 to make the collection
34
- # act more like an array in its indexing.
29
+ # * +column+ - specifies the column name to use for keeping the position
30
+ # integer (default: +position+)
31
+ # * +scope+ - restricts what is to be considered a list. Given a symbol,
32
+ # it'll attach <tt>_id</tt> (if it hasn't already been added) and use
33
+ # that as the foreign key restriction. It's also possible to give it
34
+ # an entire string that is interpolated if you need a tighter scope
35
+ # than just a foreign key. Example: <tt>acts_as_silent_list :scope =>
36
+ # 'todo_list_id = #{todo_list_id} AND completed = 0'</tt>
37
+ # * +top_of_list+ - defines the integer used for the top of the list.
38
+ # Defaults to 1. Use 0 to make the collection act more like an array
39
+ # in its indexing.
35
40
  def acts_as_silent_list(options = {})
36
41
  configuration = { :column => "position", :scope => "1 = 1", :top_of_list => 1}
37
42
  configuration.update(options) if options.is_a?(Hash)
@@ -85,12 +90,15 @@ module ActiveRecord
85
90
  end
86
91
  end
87
92
 
88
- # All the methods available to a record that has had <tt>acts_as_silent_list</tt> specified. Each method works
89
- # by assuming the object to be the item in the list, so <tt>chapter.move_lower</tt> would move that chapter
90
- # lower in the list of all chapters. Likewise, <tt>chapter.first?</tt> would return +true+ if that chapter is
91
- # the first in the list of all chapters.
93
+ # All the methods available to a record that has had
94
+ # <tt>acts_as_silent_list</tt> specified. Each method works by assuming
95
+ # the object to be the item in the list, so <tt>chapter.move_lower</tt>
96
+ # would move that chapter lower in the list of all chapters. Likewise,
97
+ # <tt>chapter.first?</tt> would return +true+ if that chapter is the first
98
+ # in the list of all chapters.
92
99
  module InstanceMethods
93
- # Insert the item at the given position (defaults to the top position of 1).
100
+ # Insert the item at the given position
101
+ # (defaults to the top position of 1).
94
102
  def insert_at(position = acts_as_silent_list_top)
95
103
  insert_at_position(position)
96
104
  end
@@ -115,8 +123,8 @@ module ActiveRecord
115
123
  end
116
124
  end
117
125
 
118
- # Move to the bottom of the list. If the item is already in the list, the items below it have their
119
- # position adjusted accordingly.
126
+ # Move to the bottom of the list. If the item is already in the list,
127
+ # the items below it have their position adjusted accordingly.
120
128
  def move_to_bottom
121
129
  return unless in_list?
122
130
  acts_as_silent_list_class.transaction do
@@ -125,8 +133,8 @@ module ActiveRecord
125
133
  end
126
134
  end
127
135
 
128
- # Move to the top of the list. If the item is already in the list, the items above it have their
129
- # position adjusted accordingly.
136
+ # Move to the top of the list. If the item is already in the list, the
137
+ # items above it have their position adjusted accordingly.
130
138
  def move_to_top
131
139
  return unless in_list?
132
140
  acts_as_silent_list_class.transaction do
@@ -139,17 +147,19 @@ module ActiveRecord
139
147
  def remove_from_list
140
148
  if in_list?
141
149
  decrement_positions_on_lower_items
142
- update_attribute_silently(position_column, nil)
150
+ assume_not_in_list
143
151
  end
144
152
  end
145
153
 
146
- # Increase the position of this item without adjusting the rest of the list.
154
+ # Increase the position of this item without adjusting the rest of the
155
+ # list.
147
156
  def increment_position
148
157
  return unless in_list?
149
158
  update_attribute_silently(position_column, self.send(position_column).to_i + 1)
150
159
  end
151
160
 
152
- # Decrease the position of this item without adjusting the rest of the list.
161
+ # Decrease the position of this item without adjusting the rest of the
162
+ # list.
153
163
  def decrement_position
154
164
  return unless in_list?
155
165
  update_attribute_silently(position_column, self.send(position_column).to_i - 1)
@@ -228,13 +238,16 @@ module ActiveRecord
228
238
  conditions = scope_condition
229
239
  conditions = "#{conditions} AND #{self.class.primary_key} != #{except.id}" if except
230
240
  acts_as_silent_list_class.unscoped do
231
- acts_as_silent_list_class.find(:first, :conditions => conditions, :order => "#{position_column} DESC")
241
+ acts_as_silent_list_class.find(:first,
242
+ :conditions => conditions,
243
+ :order => "#{position_column} DESC")
232
244
  end
233
245
  end
234
246
 
235
247
  # Forces item to assume the bottom position in the list.
236
248
  def assume_bottom_position
237
- update_attribute_silently(position_column, bottom_position_in_list(self).to_i + 1)
249
+ update_attribute_silently(position_column,
250
+ bottom_position_in_list(self).to_i + 1)
238
251
  end
239
252
 
240
253
  # Forces item to assume the top position in the list.
@@ -242,10 +255,16 @@ module ActiveRecord
242
255
  update_attribute_silently(position_column, acts_as_silent_list_top)
243
256
  end
244
257
 
258
+ # Force item to assume no position in the list.
259
+ def assume_not_in_list
260
+ update_attribute_silently(position_column, nil)
261
+ end
262
+
245
263
  # This has the effect of moving all the higher items up one.
246
264
  def decrement_positions_on_higher_items(position)
247
265
  acts_as_silent_list_class.update_all(
248
- "#{position_column} = (#{position_column} - 1)", "#{scope_condition} AND #{position_column} <= #{position}"
266
+ "#{position_column} = (#{position_column} - 1)",
267
+ "#{scope_condition} AND #{position_column} <= #{position}"
249
268
  )
250
269
  end
251
270
 
@@ -253,7 +272,8 @@ module ActiveRecord
253
272
  def decrement_positions_on_lower_items
254
273
  return unless in_list?
255
274
  acts_as_silent_list_class.update_all(
256
- "#{position_column} = (#{position_column} - 1)", "#{scope_condition} AND #{position_column} > #{send(position_column).to_i}"
275
+ "#{position_column} = (#{position_column} - 1)",
276
+ "#{scope_condition} AND #{position_column} > #{send(position_column).to_i}"
257
277
  )
258
278
  end
259
279
 
@@ -261,21 +281,25 @@ module ActiveRecord
261
281
  def increment_positions_on_higher_items
262
282
  return unless in_list?
263
283
  acts_as_silent_list_class.update_all(
264
- "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} < #{send(position_column).to_i}"
284
+ "#{position_column} = (#{position_column} + 1)",
285
+ "#{scope_condition} AND #{position_column} < #{send(position_column).to_i}"
265
286
  )
266
287
  end
267
288
 
268
289
  # This has the effect of moving all the lower items down one.
269
290
  def increment_positions_on_lower_items(position)
270
291
  acts_as_silent_list_class.update_all(
271
- "#{position_column} = (#{position_column} + 1)", "#{scope_condition} AND #{position_column} >= #{position}"
272
- )
292
+ "#{position_column} = (#{position_column} + 1)",
293
+ "#{scope_condition} AND #{position_column} >= #{position}"
294
+ )
273
295
  end
274
296
 
275
- # Increments position (<tt>position_column</tt>) of all items in the list.
297
+ # Increments position (<tt>position_column</tt>) of all items in the
298
+ # list.
276
299
  def increment_positions_on_all_items
277
300
  acts_as_silent_list_class.update_all(
278
- "#{position_column} = (#{position_column} + 1)", "#{scope_condition}"
301
+ "#{position_column} = (#{position_column} + 1)",
302
+ "#{scope_condition}"
279
303
  )
280
304
  end
281
305
 
@@ -285,7 +309,8 @@ module ActiveRecord
285
309
  update_attribute_silently(position_column, position)
286
310
  end
287
311
 
288
- # used by insert_at_position instead of remove_from_list, as postgresql raises error if position_column has non-null constraint
312
+ # used by insert_at_position instead of remove_from_list, as
313
+ # postgresql raises error if position_column has non-null constraint
289
314
  def store_at_0
290
315
  if in_list?
291
316
  decrement_positions_on_lower_items
@@ -1,7 +1,7 @@
1
1
  module ActiveRecord
2
2
  module Acts
3
3
  module SilentList
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_silent_list
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 1.0.0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - David Heinemeier Hansson
@@ -18,11 +18,10 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2011-10-10 00:00:00 +02:00
21
+ date: 2011-10-19 00:00:00 +02:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
25
- name: bundler
26
25
  prerelease: false
27
26
  requirement: &id001 !ruby/object:Gem::Requirement
28
27
  none: false
@@ -36,9 +35,9 @@ dependencies:
36
35
  - 0
37
36
  version: 1.0.0
38
37
  type: :development
38
+ name: bundler
39
39
  version_requirements: *id001
40
40
  - !ruby/object:Gem::Dependency
41
- name: activerecord
42
41
  prerelease: false
43
42
  requirement: &id002 !ruby/object:Gem::Requirement
44
43
  none: false
@@ -53,9 +52,9 @@ dependencies:
53
52
  - 7794
54
53
  version: 1.15.4.7794
55
54
  type: :development
55
+ name: activerecord
56
56
  version_requirements: *id002
57
57
  - !ruby/object:Gem::Dependency
58
- name: rake
59
58
  prerelease: false
60
59
  requirement: &id003 !ruby/object:Gem::Requirement
61
60
  none: false
@@ -67,9 +66,9 @@ dependencies:
67
66
  - 0
68
67
  version: "0"
69
68
  type: :development
69
+ name: rake
70
70
  version_requirements: *id003
71
71
  - !ruby/object:Gem::Dependency
72
- name: rdoc
73
72
  prerelease: false
74
73
  requirement: &id004 !ruby/object:Gem::Requirement
75
74
  none: false
@@ -81,9 +80,9 @@ dependencies:
81
80
  - 0
82
81
  version: "0"
83
82
  type: :development
83
+ name: rdoc
84
84
  version_requirements: *id004
85
85
  - !ruby/object:Gem::Dependency
86
- name: sqlite3
87
86
  prerelease: false
88
87
  requirement: &id005 !ruby/object:Gem::Requirement
89
88
  none: false
@@ -95,6 +94,7 @@ dependencies:
95
94
  - 0
96
95
  version: "0"
97
96
  type: :development
97
+ name: sqlite3
98
98
  version_requirements: *id005
99
99
  description: This "acts_as" extension is a clone of the well known acts_as_list, only it avoids triggering active record callbacks.
100
100
  email: