closure_tree 9.7.0 → 9.8.0
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 +15 -0
- data/README.md +0 -3
- data/closure_tree.gemspec +1 -1
- data/lib/closure_tree/hierarchy_maintenance.rb +3 -1
- data/lib/closure_tree/support.rb +13 -2
- data/lib/closure_tree/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 85721d6e16c245ba1eeb1d4a513464df79e33ec64cf91f6252084ac2c4d49d55
|
|
4
|
+
data.tar.gz: aafd7ee3e237653140f31e35d299ad3d9afc21006708c6e2425df7909222ae0b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 755dc5dedfca297b47841f9bebd4fdd2ca7cf84f57828850290c7981a764a127a2acbf65175e8ed0be583f2e6620112fdf37f0690b9e174c93e26ee8265d051b
|
|
7
|
+
data.tar.gz: 5369312577a8c88ea1430258340171772dd40c6efabe69d5eafdf304cea4f678865a982cc153a07bdfdc234edcf63f7607825758e265b5f9c4483dd781d6938c
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [9.8.0](https://github.com/ClosureTree/closure_tree/compare/closure_tree/v9.7.0...closure_tree/v9.8.0) (2026-08-05)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* require with_advisory_lock 7.6.0 ([27d9f5e](https://github.com/ClosureTree/closure_tree/commit/27d9f5e268afb266e53fddac21100bfc67ab1d83))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* batch find_by_large_path in groups of max_join_tables elements ([7e05aa1](https://github.com/ClosureTree/closure_tree/commit/7e05aa1cd1771278f920a3dce917da36db456c1f)), closes [#347](https://github.com/ClosureTree/closure_tree/issues/347)
|
|
14
|
+
* materialize transaction before taking transaction-level advisory lock ([a2ea522](https://github.com/ClosureTree/closure_tree/commit/a2ea5223ba69195add5f6361c6fa3af2a76d37b8))
|
|
15
|
+
* use model arel_table in cleanup! for Rails 8.2 compatibility ([f46abc7](https://github.com/ClosureTree/closure_tree/commit/f46abc7e540a3cc53ea17b7ffa2a9abd7724ecdd))
|
|
16
|
+
* use transaction-level advisory locks inside open transactions on PostgreSQL ([b4eb3df](https://github.com/ClosureTree/closure_tree/commit/b4eb3df89dd4f7a4151a7f6204842661b219b241))
|
|
17
|
+
|
|
3
18
|
## [9.7.0](https://github.com/ClosureTree/closure_tree/compare/closure_tree/v9.6.2...closure_tree/v9.7.0) (2026-05-06)
|
|
4
19
|
|
|
5
20
|
|
data/README.md
CHANGED
|
@@ -109,9 +109,6 @@ Note that closure_tree only supports ActiveRecord 7.2 and later, and has test co
|
|
|
109
109
|
|
|
110
110
|
If you're starting from scratch you don't need to call `rebuild!`.
|
|
111
111
|
|
|
112
|
-
NOTE: Run `rails g closure_tree:config` to create an initializer with extra
|
|
113
|
-
configurations. (Optional)
|
|
114
|
-
|
|
115
112
|
## Warning
|
|
116
113
|
|
|
117
114
|
As stated above, using multiple hierarchy gems (like `ancestry` or `nested set`) on the same model
|
data/closure_tree.gemspec
CHANGED
|
@@ -26,7 +26,7 @@ Gem::Specification.new do |gem|
|
|
|
26
26
|
gem.required_ruby_version = '>= 3.3.0'
|
|
27
27
|
|
|
28
28
|
gem.add_dependency 'activerecord', '>= 7.2.0'
|
|
29
|
-
gem.add_dependency 'with_advisory_lock', '>= 7.
|
|
29
|
+
gem.add_dependency 'with_advisory_lock', '>= 7.6.0'
|
|
30
30
|
gem.add_dependency 'zeitwerk', '~> 2.7'
|
|
31
31
|
|
|
32
32
|
gem.add_development_dependency 'database_cleaner'
|
|
@@ -140,7 +140,9 @@ module ClosureTree
|
|
|
140
140
|
|
|
141
141
|
%i[descendant_id ancestor_id].each do |foreign_key|
|
|
142
142
|
alias_name = "#{foreign_key.to_s.split('_').first}s"
|
|
143
|
-
|
|
143
|
+
# Rails 8.2 made Arel::Table.new keyword-only; the model's own arel_table
|
|
144
|
+
# is equivalent and works across all supported Rails versions.
|
|
145
|
+
alias_table = arel_table.alias(alias_name)
|
|
144
146
|
arel_join = hierarchy_table.join(alias_table, Arel::Nodes::OuterJoin)
|
|
145
147
|
.on(alias_table[primary_key].eq(hierarchy_table[foreign_key]))
|
|
146
148
|
.join_sources
|
data/lib/closure_tree/support.rb
CHANGED
|
@@ -160,7 +160,12 @@ module ClosureTree
|
|
|
160
160
|
def with_advisory_lock(instance = nil, &block)
|
|
161
161
|
lock_method = options[:advisory_lock_timeout_seconds].present? ? :with_advisory_lock! : :with_advisory_lock
|
|
162
162
|
if options[:with_advisory_lock] && connection.supports_advisory_locks? && model_class.respond_to?(lock_method)
|
|
163
|
-
|
|
163
|
+
lock_options = advisory_lock_options
|
|
164
|
+
if use_transaction_level_lock?
|
|
165
|
+
connection.materialize_transactions
|
|
166
|
+
lock_options = lock_options.merge(transaction: true)
|
|
167
|
+
end
|
|
168
|
+
model_class.public_send(lock_method, advisory_lock_name(instance), lock_options) do
|
|
164
169
|
transaction(&block)
|
|
165
170
|
end
|
|
166
171
|
else
|
|
@@ -168,6 +173,12 @@ module ClosureTree
|
|
|
168
173
|
end
|
|
169
174
|
end
|
|
170
175
|
|
|
176
|
+
private def use_transaction_level_lock?
|
|
177
|
+
return false unless connection.adapter_name.match?(/postg/i)
|
|
178
|
+
|
|
179
|
+
connection.open_transactions == 1 && connection.current_transaction.joinable?
|
|
180
|
+
end
|
|
181
|
+
|
|
171
182
|
def build_ancestry_attr_path(path, attributes)
|
|
172
183
|
path = path.is_a?(Array) ? path.dup : [path]
|
|
173
184
|
unless path.first.is_a?(Hash)
|
|
@@ -195,7 +206,7 @@ module ClosureTree
|
|
|
195
206
|
def find_by_large_path(path, attributes = {}, parent_id = nil)
|
|
196
207
|
next_parent_id = parent_id
|
|
197
208
|
child = nil
|
|
198
|
-
path.
|
|
209
|
+
path.in_groups_of(max_join_tables, false).each do |subpath|
|
|
199
210
|
child = model_class.find_by_path(subpath, attributes, next_parent_id)
|
|
200
211
|
return nil if child.nil?
|
|
201
212
|
|
data/lib/closure_tree/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: closure_tree
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 9.
|
|
4
|
+
version: 9.8.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matthew McEachen
|
|
@@ -30,14 +30,14 @@ dependencies:
|
|
|
30
30
|
requirements:
|
|
31
31
|
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 7.
|
|
33
|
+
version: 7.6.0
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: 7.
|
|
40
|
+
version: 7.6.0
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: zeitwerk
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -178,7 +178,7 @@ licenses:
|
|
|
178
178
|
metadata:
|
|
179
179
|
bug_tracker_uri: https://github.com/ClosureTree/closure_tree/issues
|
|
180
180
|
changelog_uri: https://github.com/ClosureTree/closure_tree/blob/master/CHANGELOG.md
|
|
181
|
-
documentation_uri: https://www.rubydoc.info/gems/closure_tree/9.
|
|
181
|
+
documentation_uri: https://www.rubydoc.info/gems/closure_tree/9.8.0
|
|
182
182
|
homepage_uri: https://closuretree.github.io/closure_tree/
|
|
183
183
|
source_code_uri: https://github.com/ClosureTree/closure_tree
|
|
184
184
|
rubygems_mfa_required: 'true'
|
|
@@ -196,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
196
196
|
- !ruby/object:Gem::Version
|
|
197
197
|
version: '0'
|
|
198
198
|
requirements: []
|
|
199
|
-
rubygems_version:
|
|
199
|
+
rubygems_version: 4.0.10
|
|
200
200
|
specification_version: 4
|
|
201
201
|
summary: Easily and efficiently make your ActiveRecord model support hierarchies
|
|
202
202
|
test_files: []
|