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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b33b2d3bff238b8d3a42e41b94ece6f9b6c9efbcacd23628972d6237f2c3bda
4
- data.tar.gz: 82a70b8fd95a7bdc6726e3408765027ff45caaa6c21080326966d39eeba89dd8
3
+ metadata.gz: 85721d6e16c245ba1eeb1d4a513464df79e33ec64cf91f6252084ac2c4d49d55
4
+ data.tar.gz: aafd7ee3e237653140f31e35d299ad3d9afc21006708c6e2425df7909222ae0b
5
5
  SHA512:
6
- metadata.gz: 51f1f00fcc5c81e2fa380540178f63581aa1f66bfc941777480fb28ac87b2fbd00881e067940f62b5ae031e7a38d16a71f6b4a5e2b757e444df6e4343be09e73
7
- data.tar.gz: 8116299896bd8f6eacdbfd7a4ffc8453d2328bc773760cb4d028c4444280b46513efcd7587c806bdd2194df46a0fba53847f232df99f7eadff99a3596606e5f3
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.5.0'
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
- alias_table = Arel::Table.new(table_name).alias(alias_name)
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
@@ -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
- model_class.public_send(lock_method, advisory_lock_name(instance), advisory_lock_options) do
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.in_groups(max_join_tables, false).each do |subpath|
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
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ClosureTree
4
- VERSION = Gem::Version.new('9.7.0')
4
+ VERSION = Gem::Version.new('9.8.0')
5
5
  end
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.7.0
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.5.0
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.5.0
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.7.0
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: 3.6.9
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: []