positioning 0.2.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9a6be17ba30233c2d789bbc32055280262feee10c5cef80badc42f18b829f13
4
- data.tar.gz: 68e477089f16ad23111bc8e5e39f43f8c2bcac389b04ee5855d0729d1a50771f
3
+ metadata.gz: a486284bed84d9458dfc46093bf97d94f56e808de40843bffbc5cdacde4606b3
4
+ data.tar.gz: f31839ad358b3db74b55596dda9c77ce32a8a661923dc257962ac36deb7520c7
5
5
  SHA512:
6
- metadata.gz: 6cce0ad940005e740b64c858250e425307578aa37697f35258f886acdb9de31954db04bc73589dd0931cc6665b1f5e5ddf0439f195ea0caa6010a66eed1f882d
7
- data.tar.gz: 9f9a8587420495b693b340bd8108328116fb2414b7879ab90be3e8e2b2740346730fff4e5434c3bb951aead42d739c23fcb409d62843eea6bf73318b96e4724e
6
+ metadata.gz: 54a7ea806656b3cab3b32846dfb365b9107389d83ac37fed41b145a3daa82917ce27c2f7765713e6440d6571d4b735d9a958713e65c61879244378b9c6f1511e
7
+ data.tar.gz: 85af57db02799e96fddb74f9a14debaa1a0e0d2ff06144f41c50be9d5bd9c66d103fbd1cefc86a9c0e9061e3f172c37015eee078440b418da055bd4c67075c97
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.3] - 2024-07-06
4
+
5
+ - Advisory Lock can now be optionally turned off via `advisory_lock: false` on your `positioned` call. See the README for more details. Advisory Lock remains on by default. Thanks @joaomarcos96!
6
+
7
+ ## [0.2.2] - 2024-05-17
8
+
9
+ - When destroying a positioned item, first move it out of the way (position = 0) then contract the scope. Do this before destruction. Moving the item out of the way memoizes its original position to cope with the case where multiple items are destroyed with `destroy_all` as they'll have their position column cached. Thanks @james-reading for the report.
10
+
3
11
  ## [0.2.1] - 2024-04-08
4
12
 
5
13
  - Fetch the adapter_name from #connection_db_config (@tijn)
@@ -12,7 +20,7 @@
12
20
 
13
21
  ## [0.1.7] - 2024-03-06
14
22
 
15
- - Seperated the Concern that is included into ActiveRecord::Base into its own submodule so that Mechanisms isn't also included.
23
+ - Separated the Concern that is included into ActiveRecord::Base into its own submodule so that Mechanisms isn't also included.
16
24
  - Added the RelativePosition Struct and documentation to make it easier to supply relative positions via form helpers.
17
25
 
18
26
  ## [0.1.6] - 2024-03-05
data/README.md CHANGED
@@ -66,6 +66,10 @@ positioned on: :type
66
66
  belongs_to :list
67
67
  belongs_to :category
68
68
  positioned on: [:list, :category, :enabled]
69
+
70
+ # If you do not want to use Advisory Lock, you can disable it entirely by passing the 'advisory_lock' flag as false
71
+ belongs_to :list
72
+ positioned on: :list, advisory_lock: false
69
73
  ```
70
74
 
71
75
  ### Manipulating Positioning
@@ -243,6 +247,33 @@ https://github.com/brendon/positioning/blob/main/lib/positioning/advisory_lock.r
243
247
 
244
248
  If you have any concerns or improvements please file a GitHub issue.
245
249
 
250
+ ### Opting out of Advisory Lock
251
+
252
+ There are cases where Advisory Lock may be unwanted or unnecessary, for instance, if you already lock the parent record in **every** operation that will touch the database on the positioned item, **everywhere** in your application.
253
+
254
+ Example of such scenario in your application:
255
+
256
+ ```ruby
257
+ list = List.create(name: "List")
258
+
259
+ list.with_lock do
260
+ item_a = list.items.create(name: "Item A")
261
+ item_b = list.items.create(name: "Item B")
262
+ item_c = list.items.create(name: "Item C")
263
+
264
+ item_c.update(position: {before: item_a})
265
+
266
+ item_a.destroy
267
+ end
268
+ ```
269
+
270
+ Therefore, making sure you already have another mechanism to avoid race conditions, you can opt out of Advisory Lock by setting `advisory_lock` to `false` when declaring positioning:
271
+
272
+ ```ruby
273
+ belongs_to :list
274
+ positioned on: :list, advisory_lock: false
275
+ ```
276
+
246
277
  ## Development
247
278
 
248
279
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -39,7 +39,10 @@ module Positioning
39
39
  end
40
40
 
41
41
  def destroy_position
42
- contract(positioning_scope, (position + 1)..) unless destroyed_via_positioning_scope?
42
+ unless destroyed_via_positioning_scope?
43
+ move_out_of_the_way
44
+ contract(positioning_scope, (position_was + 1)..)
45
+ end
43
46
  end
44
47
 
45
48
  private
@@ -1,3 +1,3 @@
1
1
  module Positioning
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.3"
3
3
  end
data/lib/positioning.rb CHANGED
@@ -18,7 +18,7 @@ module Positioning
18
18
  @positioning_columns ||= {}
19
19
  end
20
20
 
21
- def positioned(on: [], column: :position)
21
+ def positioned(on: [], column: :position, advisory_lock: true)
22
22
  unless base_class?
23
23
  raise Error.new "can't be called on an abstract class or STI subclass."
24
24
  end
@@ -43,18 +43,22 @@ module Positioning
43
43
  super(position)
44
44
  end
45
45
 
46
- advisory_lock = AdvisoryLock.new(base_class, column)
46
+ if advisory_lock
47
+ advisory_lock_callback = AdvisoryLock.new(base_class, column)
47
48
 
48
- before_create advisory_lock
49
- before_update advisory_lock
50
- before_destroy advisory_lock
49
+ before_create advisory_lock_callback
50
+ before_update advisory_lock_callback
51
+ before_destroy advisory_lock_callback
52
+ end
51
53
 
52
54
  before_create { Mechanisms.new(self, column).create_position }
53
55
  before_update { Mechanisms.new(self, column).update_position }
54
- after_destroy { Mechanisms.new(self, column).destroy_position }
56
+ before_destroy { Mechanisms.new(self, column).destroy_position }
55
57
 
56
- after_commit advisory_lock
57
- after_rollback advisory_lock
58
+ if advisory_lock
59
+ after_commit advisory_lock_callback
60
+ after_rollback advisory_lock_callback
61
+ end
58
62
  end
59
63
  end
60
64
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: positioning
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brendon Muir
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-08 00:00:00.000000000 Z
11
+ date: 2024-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport