positioning 0.2.1 → 0.2.3

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
  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