positioning 0.1.1 → 0.1.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 +12 -2
- data/Gemfile +5 -0
- data/lib/positioning/mechanisms.rb +23 -21
- data/lib/positioning/version.rb +1 -1
- data/lib/positioning.rb +5 -0
- data/positioning.gemspec +1 -1
- metadata +3 -4
- data/Gemfile.lock +0 -109
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20e2658aa131e9c641fc3b5bdd2f685d64af56d56a53abb0eef4a25f12b4f293
|
4
|
+
data.tar.gz: 61d5b5e9afb5ad0d037ccb2a14185dfe0fca705cb0850f89e436d1e371608d9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51c9fa527fea19618a9b5362cc81cce367dfa15039328a3085598fd1c5ea8e2f6b8bcf92b650c82d83fb0e221ef307b893580a4172fb0f3c94200a8cdb1579c4
|
7
|
+
data.tar.gz: 8ca5d909229d1c2d8f1712c5ca21275ac75f733de7bf799c7c3d8777f609116efa6127b7a657d09e6a5396769c5451a8a44218941e15d836abaa3b99e954bef3
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,19 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
-
## [0.1.
|
3
|
+
## [0.1.3] - 2024-03-04
|
4
|
+
|
5
|
+
- Internal refactoring of Mechanisms for clarity
|
6
|
+
- Additional unit testing of Mechanisms
|
7
|
+
- Added additional Ruby and Rails versions to the Github Actions matrix
|
8
|
+
|
9
|
+
## [0.1.2] - 2024-02-29
|
10
|
+
|
11
|
+
- Fix a bug related to the scope changing with an explicitly set position value that is the same as the original position.
|
12
|
+
|
13
|
+
## [0.1.1] - 2024-02-25
|
4
14
|
|
5
15
|
- Fix issues with STI based models
|
6
16
|
|
7
|
-
## [0.1.0] - 2024-02-
|
17
|
+
## [0.1.0] - 2024-02-24
|
8
18
|
|
9
19
|
- Initial release
|
data/Gemfile
CHANGED
@@ -20,29 +20,16 @@ module Positioning
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def update_position
|
23
|
-
|
24
|
-
# to nil so that the item gets placed at the end of the list.
|
25
|
-
self.position = nil if positioning_scope_changed? && !position_changed?
|
23
|
+
clear_position if positioning_scope_changed? && !position_changed?
|
26
24
|
|
27
25
|
solidify_position
|
28
26
|
|
29
|
-
# The update strategy is to temporarily set our position to 0, then shift everything out of the way of
|
30
|
-
# our new desired position before finalising it.
|
31
27
|
if positioning_scope_changed? || position_changed?
|
32
|
-
|
33
|
-
|
34
|
-
position_was = record_scope.pick(@column)
|
35
|
-
record_scope.update_all "#{@column}": 0
|
28
|
+
move_out_of_the_way
|
36
29
|
|
37
30
|
if positioning_scope_changed?
|
38
|
-
positioning_scope_was = base_class.where record_scope.first.slice(*positioning_columns)
|
39
|
-
|
40
31
|
contract(positioning_scope_was, position_was..)
|
41
32
|
expand(positioning_scope, position..)
|
42
|
-
|
43
|
-
# If the position integer was set to the same as its prior value but the scope has changed then
|
44
|
-
# we need to tell Rails that it has changed so that it gets updated from the temporary 0 value.
|
45
|
-
position_will_change!
|
46
33
|
elsif position_was > position
|
47
34
|
expand(positioning_scope, position..position_was)
|
48
35
|
else
|
@@ -69,6 +56,10 @@ module Positioning
|
|
69
56
|
@positioned.send primary_key_column
|
70
57
|
end
|
71
58
|
|
59
|
+
def record_scope
|
60
|
+
base_class.where("#{primary_key_column}": primary_key)
|
61
|
+
end
|
62
|
+
|
72
63
|
def position
|
73
64
|
@positioned.send @column
|
74
65
|
end
|
@@ -77,12 +68,21 @@ module Positioning
|
|
77
68
|
@positioned.send :"#{@column}=", position
|
78
69
|
end
|
79
70
|
|
71
|
+
def clear_position
|
72
|
+
self.position = nil
|
73
|
+
end
|
74
|
+
|
80
75
|
def position_changed?
|
81
76
|
@positioned.send :"#{@column}_changed?"
|
82
77
|
end
|
83
78
|
|
84
|
-
def
|
85
|
-
@
|
79
|
+
def position_was
|
80
|
+
@position_was ||= record_scope.pick(@column)
|
81
|
+
end
|
82
|
+
|
83
|
+
def move_out_of_the_way
|
84
|
+
position_was # Memoize the original position before changing it
|
85
|
+
record_scope.update_all "#{@column}": 0
|
86
86
|
end
|
87
87
|
|
88
88
|
def expand(scope, range)
|
@@ -126,8 +126,6 @@ module Positioning
|
|
126
126
|
raise Error.new, "relative `#{@column}` record must be in the same scope"
|
127
127
|
end
|
128
128
|
|
129
|
-
position_was = base_class.where("#{primary_key_column}": primary_key).pick(@column)
|
130
|
-
|
131
129
|
solidified_position = relative_record_scope.pick(@column)
|
132
130
|
solidified_position += 1 if relative_position == :after
|
133
131
|
solidified_position -= 1 if in_positioning_scope? && position_was < solidified_position
|
@@ -151,11 +149,15 @@ module Positioning
|
|
151
149
|
end
|
152
150
|
|
153
151
|
def positioning_scope
|
154
|
-
base_class.where
|
152
|
+
base_class.where @positioned.slice(*positioning_columns)
|
153
|
+
end
|
154
|
+
|
155
|
+
def positioning_scope_was
|
156
|
+
base_class.where record_scope.first.slice(*positioning_columns)
|
155
157
|
end
|
156
158
|
|
157
159
|
def in_positioning_scope?
|
158
|
-
@positioned.persisted? && positioning_scope.
|
160
|
+
@positioned.persisted? && positioning_scope.where("#{primary_key_column}": primary_key).exists?
|
159
161
|
end
|
160
162
|
|
161
163
|
def positioning_scope_changed?
|
data/lib/positioning/version.rb
CHANGED
data/lib/positioning.rb
CHANGED
@@ -34,6 +34,11 @@ module Positioning
|
|
34
34
|
define_method(:"prior_#{column}") { Mechanisms.new(self, column).prior }
|
35
35
|
define_method(:"subsequent_#{column}") { Mechanisms.new(self, column).subsequent }
|
36
36
|
|
37
|
+
redefine_method(:"#{column}=") do |position|
|
38
|
+
send :"#{column}_will_change!"
|
39
|
+
super(position)
|
40
|
+
end
|
41
|
+
|
37
42
|
before_create { Mechanisms.new(self, column).create_position }
|
38
43
|
before_update { Mechanisms.new(self, column).update_position }
|
39
44
|
after_destroy { Mechanisms.new(self, column).destroy_position }
|
data/positioning.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
|
14
14
|
spec.metadata["homepage_uri"] = spec.homepage
|
15
15
|
spec.metadata["source_code_uri"] = "https://github.com/brendon/positioning"
|
16
|
-
spec.metadata["changelog_uri"] = "https://github.com/brendon/positioning/CHANGELOG.md"
|
16
|
+
spec.metadata["changelog_uri"] = "https://github.com/brendon/positioning/blob/main/CHANGELOG.md"
|
17
17
|
|
18
18
|
# Specify which files should be added to the gem when it is released.
|
19
19
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
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.1.
|
4
|
+
version: 0.1.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-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -118,7 +118,6 @@ files:
|
|
118
118
|
- ".standard.yml"
|
119
119
|
- CHANGELOG.md
|
120
120
|
- Gemfile
|
121
|
-
- Gemfile.lock
|
122
121
|
- LICENSE.txt
|
123
122
|
- README.md
|
124
123
|
- Rakefile
|
@@ -133,7 +132,7 @@ licenses:
|
|
133
132
|
metadata:
|
134
133
|
homepage_uri: https://github.com/brendon/positioning
|
135
134
|
source_code_uri: https://github.com/brendon/positioning
|
136
|
-
changelog_uri: https://github.com/brendon/positioning/CHANGELOG.md
|
135
|
+
changelog_uri: https://github.com/brendon/positioning/blob/main/CHANGELOG.md
|
137
136
|
post_install_message:
|
138
137
|
rdoc_options: []
|
139
138
|
require_paths:
|
data/Gemfile.lock
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
positioning (0.1.1)
|
5
|
-
activerecord (>= 6.1)
|
6
|
-
activesupport (>= 6.1)
|
7
|
-
|
8
|
-
GEM
|
9
|
-
remote: https://rubygems.org/
|
10
|
-
specs:
|
11
|
-
activemodel (7.1.3)
|
12
|
-
activesupport (= 7.1.3)
|
13
|
-
activerecord (7.1.3)
|
14
|
-
activemodel (= 7.1.3)
|
15
|
-
activesupport (= 7.1.3)
|
16
|
-
timeout (>= 0.4.0)
|
17
|
-
activesupport (7.1.3)
|
18
|
-
base64
|
19
|
-
bigdecimal
|
20
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
21
|
-
connection_pool (>= 2.2.5)
|
22
|
-
drb
|
23
|
-
i18n (>= 1.6, < 2)
|
24
|
-
minitest (>= 5.1)
|
25
|
-
mutex_m
|
26
|
-
tzinfo (~> 2.0)
|
27
|
-
ast (2.4.2)
|
28
|
-
base64 (0.2.0)
|
29
|
-
bigdecimal (3.1.6)
|
30
|
-
concurrent-ruby (1.2.3)
|
31
|
-
connection_pool (2.4.1)
|
32
|
-
drb (2.2.0)
|
33
|
-
ruby2_keywords
|
34
|
-
i18n (1.14.1)
|
35
|
-
concurrent-ruby (~> 1.0)
|
36
|
-
json (2.7.1)
|
37
|
-
language_server-protocol (3.17.0.3)
|
38
|
-
lint_roller (1.1.0)
|
39
|
-
minitest (5.22.1)
|
40
|
-
minitest-hooks (1.5.1)
|
41
|
-
minitest (> 5.3)
|
42
|
-
mocha (2.1.0)
|
43
|
-
ruby2_keywords (>= 0.0.5)
|
44
|
-
mutex_m (0.2.0)
|
45
|
-
mysql2 (0.5.6)
|
46
|
-
parallel (1.24.0)
|
47
|
-
parser (3.3.0.5)
|
48
|
-
ast (~> 2.4.1)
|
49
|
-
racc
|
50
|
-
pg (1.5.5)
|
51
|
-
racc (1.7.3)
|
52
|
-
rainbow (3.1.1)
|
53
|
-
rake (13.1.0)
|
54
|
-
regexp_parser (2.9.0)
|
55
|
-
rexml (3.2.6)
|
56
|
-
rubocop (1.59.0)
|
57
|
-
json (~> 2.3)
|
58
|
-
language_server-protocol (>= 3.17.0)
|
59
|
-
parallel (~> 1.10)
|
60
|
-
parser (>= 3.2.2.4)
|
61
|
-
rainbow (>= 2.2.2, < 4.0)
|
62
|
-
regexp_parser (>= 1.8, < 3.0)
|
63
|
-
rexml (>= 3.2.5, < 4.0)
|
64
|
-
rubocop-ast (>= 1.30.0, < 2.0)
|
65
|
-
ruby-progressbar (~> 1.7)
|
66
|
-
unicode-display_width (>= 2.4.0, < 3.0)
|
67
|
-
rubocop-ast (1.30.0)
|
68
|
-
parser (>= 3.2.1.0)
|
69
|
-
rubocop-performance (1.20.2)
|
70
|
-
rubocop (>= 1.48.1, < 2.0)
|
71
|
-
rubocop-ast (>= 1.30.0, < 2.0)
|
72
|
-
ruby-progressbar (1.13.0)
|
73
|
-
ruby2_keywords (0.0.5)
|
74
|
-
sqlite3 (1.7.2-arm64-darwin)
|
75
|
-
sqlite3 (1.7.2-x86_64-linux)
|
76
|
-
standard (1.33.0)
|
77
|
-
language_server-protocol (~> 3.17.0.2)
|
78
|
-
lint_roller (~> 1.0)
|
79
|
-
rubocop (~> 1.59.0)
|
80
|
-
standard-custom (~> 1.0.0)
|
81
|
-
standard-performance (~> 1.3)
|
82
|
-
standard-custom (1.0.2)
|
83
|
-
lint_roller (~> 1.0)
|
84
|
-
rubocop (~> 1.50)
|
85
|
-
standard-performance (1.3.1)
|
86
|
-
lint_roller (~> 1.1)
|
87
|
-
rubocop-performance (~> 1.20.2)
|
88
|
-
timeout (0.4.1)
|
89
|
-
tzinfo (2.0.6)
|
90
|
-
concurrent-ruby (~> 1.0)
|
91
|
-
unicode-display_width (2.5.0)
|
92
|
-
|
93
|
-
PLATFORMS
|
94
|
-
arm64-darwin-21
|
95
|
-
x86_64-linux
|
96
|
-
|
97
|
-
DEPENDENCIES
|
98
|
-
minitest (~> 5.0)
|
99
|
-
minitest-hooks (~> 1.5.1)
|
100
|
-
mocha (~> 2.1.0)
|
101
|
-
mysql2 (~> 0.5.6)
|
102
|
-
pg (~> 1.5.5)
|
103
|
-
positioning!
|
104
|
-
rake (~> 13.0)
|
105
|
-
sqlite3 (~> 1.7.2)
|
106
|
-
standard (~> 1.3)
|
107
|
-
|
108
|
-
BUNDLED WITH
|
109
|
-
2.3.8
|