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 +4 -4
- data/CHANGELOG.md +9 -1
- data/README.md +31 -0
- data/lib/positioning/mechanisms.rb +4 -1
- data/lib/positioning/version.rb +1 -1
- data/lib/positioning.rb +12 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a486284bed84d9458dfc46093bf97d94f56e808de40843bffbc5cdacde4606b3
|
4
|
+
data.tar.gz: f31839ad358b3db74b55596dda9c77ce32a8a661923dc257962ac36deb7520c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
-
|
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
|
-
|
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
|
data/lib/positioning/version.rb
CHANGED
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
|
46
|
+
if advisory_lock
|
47
|
+
advisory_lock_callback = AdvisoryLock.new(base_class, column)
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
56
|
+
before_destroy { Mechanisms.new(self, column).destroy_position }
|
55
57
|
|
56
|
-
|
57
|
-
|
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.
|
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-
|
11
|
+
date: 2024-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|