closure_tree 7.4.0 → 8.0.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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +30 -56
  3. data/.github/workflows/ci_jruby.yml +68 -0
  4. data/.github/workflows/ci_truffleruby.yml +71 -0
  5. data/.github/workflows/release.yml +17 -0
  6. data/.gitignore +1 -1
  7. data/.release-please-manifest.json +1 -0
  8. data/.tool-versions +1 -0
  9. data/Appraisals +9 -53
  10. data/CHANGELOG.md +5 -0
  11. data/Gemfile +2 -3
  12. data/README.md +21 -9
  13. data/Rakefile +11 -16
  14. data/closure_tree.gemspec +16 -9
  15. data/lib/closure_tree/active_record_support.rb +3 -14
  16. data/lib/closure_tree/digraphs.rb +1 -1
  17. data/lib/closure_tree/finders.rb +1 -1
  18. data/lib/closure_tree/hash_tree.rb +1 -1
  19. data/lib/closure_tree/hierarchy_maintenance.rb +3 -6
  20. data/lib/closure_tree/model.rb +3 -3
  21. data/lib/closure_tree/numeric_deterministic_ordering.rb +3 -8
  22. data/lib/closure_tree/support.rb +3 -7
  23. data/lib/closure_tree/version.rb +1 -1
  24. data/lib/generators/closure_tree/migration_generator.rb +1 -4
  25. data/release-please-config.json +4 -0
  26. data/test/closure_tree/cache_invalidation_test.rb +36 -0
  27. data/test/closure_tree/cuisine_type_test.rb +42 -0
  28. data/test/closure_tree/generator_test.rb +49 -0
  29. data/test/closure_tree/has_closure_tree_root_test.rb +80 -0
  30. data/test/closure_tree/hierarchy_maintenance_test.rb +56 -0
  31. data/test/closure_tree/label_test.rb +674 -0
  32. data/test/closure_tree/metal_test.rb +59 -0
  33. data/test/closure_tree/model_test.rb +9 -0
  34. data/test/closure_tree/namespace_type_test.rb +13 -0
  35. data/test/closure_tree/parallel_test.rb +162 -0
  36. data/test/closure_tree/pool_test.rb +33 -0
  37. data/test/closure_tree/support_test.rb +18 -0
  38. data/test/closure_tree/tag_test.rb +8 -0
  39. data/test/closure_tree/user_test.rb +175 -0
  40. data/test/closure_tree/uuid_tag_test.rb +8 -0
  41. data/test/support/query_counter.rb +25 -0
  42. data/test/support/tag_examples.rb +923 -0
  43. data/test/test_helper.rb +99 -0
  44. metadata +52 -21
  45. data/_config.yml +0 -1
  46. data/tests.sh +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e4ac0bb16bca6ba730b542b35639b067ad113e2c7010265cae6e0192425e1b82
4
- data.tar.gz: 03004e7033f76268a1e96b3ee4a0c5d9066a4c716caab80c6082ddb60404b598
3
+ metadata.gz: 1833e9f0cef7b45722dc67fcea625de8ee04bd820de6567da77f5f7bf3a97e65
4
+ data.tar.gz: 6c0c050d6b081b612b11d76c2e79b1f84f56dade7ad3b6f2b445f9bfa3d90d1d
5
5
  SHA512:
6
- metadata.gz: 5eac3ad625f051cc1e5fa62165076119d1cda689b619aeb6e83c9a32bbd33f343817c867cfd97abc26d32c56346eb833d39e747ec1d60ae9abf018e79a762442
7
- data.tar.gz: 6f01c8b3b6ef3382340d0743a87e34243e9283bb64d3cefec1a79a7fb23c670f8da02e0125f7497e8afa834077aa75c60830988f14b2c7e095a6f7fe3ac8e02b
6
+ metadata.gz: 3d61b4e41fd71552f54aba6bfec350fc75d5a923797c580fe2d7e48df6e7f3917477f7992c6bd9d59b614730f9978c77acd100ee4d848d737afb42e3e629dcf6
7
+ data.tar.gz: ed181080ce63b08712cbd8981cfa057cb4c432ed228cff8dac22a3770f9d41d7a81adff3b3b251bffb710e030952d6fe570e767707c835d72cbb0915ec328008
@@ -2,20 +2,32 @@
2
2
  name: CI
3
3
 
4
4
  on:
5
- - push
6
- - pull_request
5
+ push:
6
+ branches:
7
+ - master
8
+ pull_request:
9
+ branches:
10
+ - master
11
+
7
12
 
8
13
  jobs:
9
14
  rspec:
10
- runs-on: ubuntu-20.04
11
-
15
+ runs-on: ubuntu-latest
12
16
  services:
17
+ mysql:
18
+ image: mysql/mysql-server
19
+ ports:
20
+ - "3306:3306"
21
+ env:
22
+ MYSQL_ROOT_PASSWORD: root
23
+ MYSQL_DATABASE: closure_tree_test
24
+ MYSQL_ROOT_HOST: '%'
13
25
  postgres:
14
- image: 'postgres:13'
26
+ image: 'postgres'
15
27
  ports: ['5432:5432']
16
28
  env:
17
29
  POSTGRES_PASSWORD: postgres
18
- POSTGRES_DB: closure_tree
30
+ POSTGRES_DB: closure_tree_test
19
31
  options: >-
20
32
  --health-cmd pg_isready
21
33
  --health-interval 10s
@@ -26,68 +38,30 @@ jobs:
26
38
  fail-fast: false
27
39
  matrix:
28
40
  ruby:
29
- - '3.0'
30
- - '2.7'
31
- - '2.6'
32
- - '2.5'
41
+ - '3.3'
33
42
  rails:
34
- - activerecord_6.1
35
- - activerecord_6.0
36
- - activerecord_5.2
37
- - activerecord_5.1
38
- - activerecord_5.0
39
- - activerecord_4.2
43
+ - activerecord_8.0
44
+ - activerecord_7.2
45
+ - activerecord_7.1
40
46
  - activerecord_edge
41
47
  adapter:
42
- - sqlite3
43
- - mysql2
44
- - postgresql
45
- exclude:
46
- - ruby: '2.7'
47
- rails: activerecord_4.2
48
- - ruby: '3.0'
49
- rails: activerecord_4.2
50
- - ruby: '3.0'
51
- rails: activerecord_5.0
52
- - ruby: '3.0'
53
- rails: activerecord_5.1
54
- - ruby: '3.0'
55
- rails: activerecord_5.2
56
- - ruby: '2.5'
57
- rails: activerecord_edge
58
- - ruby: '2.6'
59
- rails: activerecord_edge
48
+ - 'sqlite3:///:memory:'
49
+ - mysql2://root:root@0/closure_tree_test
50
+ - postgres://closure_tree:closure_tree@0/closure_tree_test
60
51
 
61
52
  steps:
62
53
  - name: Checkout
63
- uses: actions/checkout@v2
54
+ uses: actions/checkout@v3
64
55
 
65
56
  - name: Setup Ruby
66
57
  uses: ruby/setup-ruby@v1
67
58
  with:
68
59
  ruby-version: ${{ matrix.ruby }}
69
-
70
- - name: Set DB Adapter
60
+ bundler-cache: true
61
+ rubygems: latest
71
62
  env:
72
- RAILS_VERSION: ${{ matrix.rails }}
73
- DB_ADAPTER: ${{ matrix.adapter }}
74
-
75
- # See: https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-README.md#mysql
76
- run: |
77
- if [ "${DB_ADAPTER}" = "mysql2" ]; then
78
- sudo systemctl start mysql.service
79
- mysql -u root -proot -e 'create database closure_tree;'
80
- fi
81
-
82
- - name: Bundle
83
- env:
84
- RAILS_VERSION: ${{ matrix.rails }}
85
- DB_ADAPTER: ${{ matrix.adapter }}
86
63
  BUNDLE_GEMFILE: gemfiles/${{ matrix.rails }}.gemfile
87
- run: |
88
- gem install bundler
89
- bundle config path vendor/bundle
90
- bundle install --jobs 4 --retry 3
64
+ RAILS_ENV: test
91
65
 
92
66
  - name: RSpec
93
67
  env:
@@ -95,4 +69,4 @@ jobs:
95
69
  DB_ADAPTER: ${{ matrix.adapter }}
96
70
  BUNDLE_GEMFILE: gemfiles/${{ matrix.rails }}.gemfile
97
71
  WITH_ADVISORY_LOCK_PREFIX: ${{ github.run_id }}
98
- run: bin/rake --trace spec:all
72
+ run: bin/rake
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: CI Jruby
3
+
4
+ on:
5
+ push:
6
+ branches:
7
+ - master
8
+ pull_request:
9
+ branches:
10
+ - master
11
+ concurrency:
12
+ group: ci-${{ github.head_ref }}-jruby
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ rspec:
17
+ runs-on: ubuntu-latest
18
+ services:
19
+ mysql:
20
+ image: mysql/mysql-server
21
+ ports:
22
+ - "3306:3306"
23
+ env:
24
+ MYSQL_ROOT_PASSWORD: root
25
+ MYSQL_DATABASE: closure_tree_test
26
+ MYSQL_ROOT_HOST: '%'
27
+ postgres:
28
+ image: 'postgres'
29
+ ports: ['5432:5432']
30
+ env:
31
+ POSTGRES_PASSWORD: postgres
32
+ POSTGRES_DB: closure_tree_test
33
+ options: >-
34
+ --health-cmd pg_isready
35
+ --health-interval 10s
36
+ --health-timeout 5s
37
+ --health-retries 5
38
+
39
+ strategy:
40
+ fail-fast: false
41
+ matrix:
42
+ rails:
43
+ - activerecord_7.1
44
+ adapter:
45
+ - 'sqlite3:///:memory:'
46
+ - mysql2://root:root@0/closure_tree_test
47
+ - postgres://closure_tree:closure_tree@0/closure_tree_test
48
+ steps:
49
+ - name: Checkout
50
+ uses: actions/checkout@v3
51
+
52
+ - name: Setup Ruby
53
+ uses: ruby/setup-ruby@v1
54
+ with:
55
+ ruby-version: jruby
56
+ bundler-cache: true
57
+ rubygems: latest
58
+ env:
59
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.rails }}.gemfile
60
+ RAILS_ENV: test
61
+
62
+ - name: RSpec
63
+ env:
64
+ RAILS_VERSION: ${{ matrix.rails }}
65
+ DB_ADAPTER: ${{ matrix.adapter }}
66
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.rails }}.gemfile
67
+ WITH_ADVISORY_LOCK_PREFIX: ${{ github.run_id }}
68
+ run: bin/rake
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: CI Truffleruby
3
+
4
+ on:
5
+ push:
6
+ branches:
7
+ - master
8
+ pull_request:
9
+ branches:
10
+ - master
11
+ concurrency:
12
+ group: ci-${{ github.head_ref }}-truffleruby
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ rspec:
17
+ runs-on: ubuntu-latest
18
+ services:
19
+ mysql:
20
+ image: mysql/mysql-server
21
+ ports:
22
+ - "3306:3306"
23
+ env:
24
+ MYSQL_ROOT_PASSWORD: root
25
+ MYSQL_DATABASE: closure_tree_test
26
+ MYSQL_ROOT_HOST: '%'
27
+ postgres:
28
+ image: 'postgres'
29
+ ports: ['5432:5432']
30
+ env:
31
+ POSTGRES_PASSWORD: postgres
32
+ POSTGRES_DB: closure_tree_test
33
+ options: >-
34
+ --health-cmd pg_isready
35
+ --health-interval 10s
36
+ --health-timeout 5s
37
+ --health-retries 5
38
+
39
+ strategy:
40
+ fail-fast: false
41
+ matrix:
42
+ ruby:
43
+ - truffleruby
44
+ rails:
45
+ - activerecord_7.1
46
+ adapter:
47
+ - 'sqlite3:///:memory:'
48
+ - mysql2://root:root@0/closure_tree_test
49
+ - postgres://closure_tree:closure_tree@0/closure_tree_test
50
+
51
+ steps:
52
+ - name: Checkout
53
+ uses: actions/checkout@v3
54
+
55
+ - name: Setup Ruby
56
+ uses: ruby/setup-ruby@v1
57
+ with:
58
+ ruby-version: truffleruby
59
+ bundler-cache: true
60
+ rubygems: latest
61
+ env:
62
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.rails }}.gemfile
63
+ RAILS_ENV: test
64
+
65
+ - name: RSpec
66
+ env:
67
+ RAILS_VERSION: ${{ matrix.rails }}
68
+ DB_ADAPTER: ${{ matrix.adapter }}
69
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.rails }}.gemfile
70
+ WITH_ADVISORY_LOCK_PREFIX: ${{ github.run_id }}
71
+ run: bin/rake
@@ -0,0 +1,17 @@
1
+ name: release-please
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: write
11
+ pull-requests: write
12
+
13
+ jobs:
14
+ release-please:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: googleapis/release-please-action@v4
data/.gitignore CHANGED
@@ -11,7 +11,7 @@ tmp/
11
11
  .yardoc/
12
12
  .rvmrc
13
13
  *.lock
14
- tmp/
15
14
  .ruby-*
16
15
  *.iml
16
+ .env
17
17
  coverage/
@@ -0,0 +1 @@
1
+ {".":"8.0.0"}
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.4.4
data/Appraisals CHANGED
@@ -1,55 +1,11 @@
1
+ # frozen_string_literal: true
1
2
 
2
- appraise 'activerecord-4.2' do
3
- gem 'activerecord', '~> 4.2.0'
4
- platforms :ruby do
5
- gem 'mysql2', "< 0.5"
6
- gem 'pg', "~> 0.21"
7
- gem 'sqlite3', '~> 1.3.13'
8
- end
9
-
10
- platforms :jruby do
11
- gem 'activerecord-jdbcmysql-adapter'
12
- gem 'activerecord-jdbcpostgresql-adapter'
13
- gem 'activerecord-jdbcsqlite3-adapter'
14
- end
15
- end
16
-
17
- appraise 'activerecord-5.0' do
18
- gem 'activerecord', '~> 5.0.0'
19
- platforms :ruby do
20
- gem 'mysql2'
21
- gem 'pg'
22
- gem 'sqlite3', '~> 1.3.13'
23
- end
24
-
25
- platforms :jruby do
26
- gem 'activerecord-jdbcmysql-adapter'
27
- gem 'activerecord-jdbcpostgresql-adapter'
28
- gem 'activerecord-jdbcsqlite3-adapter'
29
- end
30
- end
31
-
32
- appraise 'activerecord-5.1' do
33
- gem 'activerecord', '~> 5.1.0'
34
- platforms :ruby do
35
- gem 'mysql2'
36
- gem 'pg'
37
- gem 'sqlite3', '~> 1.3.13'
38
- end
39
-
40
- platforms :jruby do
41
- gem 'activerecord-jdbcmysql-adapter'
42
- gem 'activerecord-jdbcpostgresql-adapter'
43
- gem 'activerecord-jdbcsqlite3-adapter'
44
- end
45
- end
46
-
47
- appraise 'activerecord-5.2' do
48
- gem 'activerecord', '~> 5.2.0'
49
- platforms :ruby do
3
+ appraise 'activerecord-7.1' do
4
+ gem 'activerecord', '~> 7.1.0'
5
+ platforms :ruby, :truffleruby do
50
6
  gem 'mysql2'
51
7
  gem 'pg'
52
- gem 'sqlite3'
8
+ gem 'sqlite3', '< 2.0'
53
9
  end
54
10
 
55
11
  platforms :jruby do
@@ -59,8 +15,8 @@ appraise 'activerecord-5.2' do
59
15
  end
60
16
  end
61
17
 
62
- appraise 'activerecord-6.0' do
63
- gem 'activerecord', '~> 6.0.0'
18
+ appraise 'activerecord-7.2' do
19
+ gem 'activerecord', '~> 7.2.0'
64
20
  platforms :ruby do
65
21
  gem 'mysql2'
66
22
  gem 'pg'
@@ -74,8 +30,8 @@ appraise 'activerecord-6.0' do
74
30
  end
75
31
  end
76
32
 
77
- appraise 'activerecord-6.1' do
78
- gem 'activerecord', '~> 6.1.0'
33
+ appraise 'activerecord-8.0' do
34
+ gem 'activerecord', '~> 8.0.0'
79
35
  platforms :ruby do
80
36
  gem 'mysql2'
81
37
  gem 'pg'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ### 8.0.0
4
+
5
+ - Drop support to EOL ruby and rails
6
+ - Reference ancestor_hierarchies in depth instead of ancestors to avoid n+1
7
+
3
8
  ## [7.4.0](https://github.com/ClosureTree/closure_tree/tree/7.4.0)
4
9
 
5
10
  [Full Changelog](https://github.com/ClosureTree/closure_tree/compare/v7.3.0...7.4.0)
data/Gemfile CHANGED
@@ -1,7 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
4
6
 
5
-
6
- gem "bump", "~> 0.10.0"
7
- gem "github_changelog_generator", "~> 1.16"
data/README.md CHANGED
@@ -5,8 +5,7 @@
5
5
  Common applications include modeling hierarchical data, like tags, threaded comments, page graphs in CMSes,
6
6
  and tracking user referrals.
7
7
 
8
- [![Join the chat at https://gitter.im/closure_tree/Lobby](https://badges.gitter.im/closure_tree/Lobby.svg)](https://gitter.im/closure_tree/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
9
- [![Build Status](https://api.travis-ci.org/ClosureTree/closure_tree.svg?branch=master)](http://travis-ci.org/ClosureTree/closure_tree)
8
+ [![CI](https://github.com/ClosureTree/closure_tree/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/ClosureTree/closure_tree/actions/workflows/ci.yml)
10
9
  [![Gem Version](https://badge.fury.io/rb/closure_tree.svg)](https://badge.fury.io/rb/closure_tree)
11
10
 
12
11
  Dramatically more performant than
@@ -25,7 +24,7 @@ closure_tree has some great features:
25
24
  * 2 SQL INSERTs on node creation
26
25
  * 3 SQL INSERT/UPDATEs on node reparenting
27
26
  * __Support for [concurrency](#concurrency)__ (using [with_advisory_lock](https://github.com/ClosureTree/with_advisory_lock))
28
- * __Tested against ActiveRecord 4.2, 5.0, 5.1, 5.2 and 6.0 with Ruby 2.5 and 2.6__
27
+ * __Tested against ActiveRecord 7.1+ with Ruby 3.3+__
29
28
  * Support for reparenting children (and all their descendants)
30
29
  * Support for [single-table inheritance (STI)](#sti) within the hierarchy
31
30
  * ```find_or_create_by_path``` for [building out heterogeneous hierarchies quickly and conveniently](#find_or_create_by_path)
@@ -53,7 +52,7 @@ for a description of different tree storage algorithms.
53
52
 
54
53
  ## Installation
55
54
 
56
- Note that closure_tree only supports ActiveRecord 4.2 and later, and has test coverage for MySQL, PostgreSQL, and SQLite.
55
+ Note that closure_tree only supports ActiveRecord 7.1 and later, and has test coverage for MySQL, PostgreSQL, and SQLite.
57
56
 
58
57
  1. Add `gem 'closure_tree'` to your Gemfile
59
58
 
@@ -661,14 +660,27 @@ end
661
660
 
662
661
  ## Testing
663
662
 
664
- Closure tree is [tested under every valid combination](http://travis-ci.org/#!/ClosureTree/closure_tree) of
663
+ Closure tree is [tested under every valid combination](https://github.com/ClosureTree/closure_tree/blob/master/.github/workflows/ci.yml) of
665
664
 
666
- * Ruby 2.5, 2.6 and 2.7
667
- * ActiveRecord 4.2, 5.x and 6.0
665
+ * Ruby 3.3+
666
+ * ActiveRecord 7.1+
668
667
  * PostgreSQL, MySQL, and SQLite. Concurrency tests are only run with MySQL and PostgreSQL.
669
668
 
670
- Assuming you're using [rbenv](https://github.com/sstephenson/rbenv), you can use ```tests.sh``` to
671
- run the test matrix locally.
669
+ ```shell
670
+ $ bundle
671
+ $ appraisal bundle # this will install the matrix of dependencies
672
+ $ appraisal rake # this will run the tests in all combinations
673
+ $ appraisal activerecord-7.0 rake # this will run the tests in AR 7.0 only
674
+ $ appraisal activerecord-7.0 rake spec # this will run rspec in AR 7.0 only
675
+ $ appraisal activerecord-7.0 rake test # this will run minitest in AR 7.0 only
676
+ ```
677
+
678
+ By default the test are run with sqlite3 only.
679
+ You run test with other databases by passing the database url as environment variable:
680
+
681
+ ```shell
682
+ $ DATABASE_URL=postgres://localhost/my_database appraisal activerecord-7.0 rake test
683
+ ```
672
684
 
673
685
  ## Change log
674
686
 
data/Rakefile CHANGED
@@ -2,36 +2,31 @@
2
2
 
3
3
  require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
+ require 'rake/testtask'
5
6
 
6
7
  RSpec::Core::RakeTask.new(:spec) do |task|
7
8
  task.pattern = 'spec/closure_tree/*_spec.rb'
8
9
  end
9
10
 
10
- task default: :spec
11
+ task default: %i[spec test]
11
12
 
12
13
  namespace :spec do
13
14
  desc 'Run all spec variants'
14
15
  task :all do
15
16
  rake = 'bin/rake'
16
- fail unless system("#{rake} spec:generators")
17
17
 
18
- [['', ''], ['db_prefix_', ''], ['', '_db_suffix'], ['abc_', '_123']].each do |prefix, suffix|
18
+ [['', ''], ['db_prefix_', ''], ['', '_db_suffix'], %w[abc_ _123]].each do |prefix, suffix|
19
19
  env = "DB_PREFIX=#{prefix} DB_SUFFIX=#{suffix}"
20
- fail unless system("#{rake} spec #{env}")
20
+ raise unless system("#{rake} spec #{env}")
21
21
  end
22
22
  end
23
-
24
- desc 'Run generator specs'
25
- RSpec::Core::RakeTask.new(:generators) do |task|
26
- task.pattern = 'spec/generators/*_spec.rb'
27
- end
28
23
  end
29
24
 
30
- require 'github_changelog_generator/task'
31
- GitHubChangelogGenerator::RakeTask.new :changelog do |config|
32
- config.user = 'ClosureTree'
33
- config.project = 'closure_tree'
34
- config.issues = false
35
- config.future_release = '5.2.0'
36
- config.since_tag = 'v7.3.0'
25
+ Rake::TestTask.new do |t|
26
+ t.libs.push 'lib'
27
+ t.libs.push 'test'
28
+ t.pattern = 'test/**/*_test.rb'
29
+ t.verbose = true
37
30
  end
31
+
32
+ task default: 'spec:all'
data/closure_tree.gemspec CHANGED
@@ -5,32 +5,39 @@ require_relative 'lib/closure_tree/version'
5
5
  Gem::Specification.new do |gem|
6
6
  gem.name = 'closure_tree'
7
7
  gem.version = ::ClosureTree::VERSION
8
- gem.authors = ['Matthew McEachen']
9
- gem.email = ['matthew-github@mceachen.org']
10
- gem.homepage = 'http://mceachen.github.io/closure_tree/'
8
+ gem.authors = ['Matthew McEachen', 'Abdelkader Boudih']
9
+ gem.email = %w[matthew+github@mceachen.org terminale@gmail.com]
10
+ gem.homepage = 'https://github.com/ClosureTree/closure_tree/'
11
11
 
12
12
  gem.summary = %q(Easily and efficiently make your ActiveRecord model support hierarchies)
13
- gem.description = gem.summary
14
13
  gem.license = 'MIT'
15
14
 
15
+ gem.metadata = {
16
+ 'bug_tracker_uri' => "https://github.com/ClosureTree/closure_tree/issues",
17
+ 'changelog_uri' => "https://github.com/ClosureTree/closure_tree/blob/master/CHANGELOG.md",
18
+ 'documentation_uri' => "https://www.rubydoc.info/gems/closure_tree/#{gem.version}",
19
+ 'homepage_uri' => "https://closuretree.github.io/closure_tree/",
20
+ 'source_code_uri' => "https://github.com/ClosureTree/closure_tree",
21
+ }
22
+
16
23
  gem.files = `git ls-files`.split($/).reject do |f|
17
24
  f.match(%r{^(spec|img|gemfiles)})
18
25
  end
19
26
 
20
27
  gem.test_files = gem.files.grep(%r{^spec/})
21
- gem.required_ruby_version = '>= 2.0.0'
28
+ gem.required_ruby_version = '>= 3.3.0'
22
29
 
23
- gem.add_runtime_dependency 'activerecord', '>= 4.2.10'
24
- gem.add_runtime_dependency 'with_advisory_lock', '>= 4.0.0'
30
+ gem.add_runtime_dependency 'activerecord', '>= 7.1.0'
31
+ gem.add_runtime_dependency 'with_advisory_lock', '>= 5.0.0', '< 6.0.0'
25
32
 
26
33
  gem.add_development_dependency 'appraisal'
27
34
  gem.add_development_dependency 'database_cleaner'
28
35
  gem.add_development_dependency 'generator_spec'
29
36
  gem.add_development_dependency 'parallel'
30
- gem.add_development_dependency 'pg'
37
+ gem.add_development_dependency 'minitest'
38
+ gem.add_development_dependency 'minitest-reporters'
31
39
  gem.add_development_dependency 'rspec-instafail'
32
40
  gem.add_development_dependency 'rspec-rails'
33
- gem.add_development_dependency 'sqlite3'
34
41
  gem.add_development_dependency 'simplecov'
35
42
  gem.add_development_dependency 'timecop'
36
43
  # gem.add_development_dependency 'byebug'
@@ -1,20 +1,9 @@
1
1
  module ClosureTree
2
2
  module ActiveRecordSupport
3
+ delegate :quote, to: :connection
3
4
 
4
- def quote(field)
5
- connection.quote(field)
6
- end
7
-
8
- def ensure_fixed_table_name(table_name)
9
- [
10
- ActiveRecord::Base.table_name_prefix,
11
- remove_prefix_and_suffix(table_name),
12
- ActiveRecord::Base.table_name_suffix
13
- ].compact.join
14
- end
15
-
16
- def remove_prefix_and_suffix(table_name)
17
- pre, suff = ActiveRecord::Base.table_name_prefix, ActiveRecord::Base.table_name_suffix
5
+ def remove_prefix_and_suffix(table_name, model = ActiveRecord::Base)
6
+ pre, suff = model.table_name_prefix, model.table_name_suffix
18
7
  if table_name.start_with?(pre) && table_name.end_with?(suff)
19
8
  table_name[pre.size..-(suff.size + 1)]
20
9
  else
@@ -11,7 +11,7 @@ module ClosureTree
11
11
  _ct.has_name? ? read_attribute(_ct.name_column) : to_s
12
12
  end
13
13
 
14
- module ClassMethods
14
+ class_methods do
15
15
  # Renders the given scope as a DOT digraph, suitable for rendering by Graphviz
16
16
  def to_dot_digraph(tree_scope)
17
17
  id_to_instance = tree_scope.reduce({}) { |h, ea| h[ea.id] = ea; h }
@@ -50,7 +50,7 @@ module ClosureTree
50
50
  scope.without_instance(self)
51
51
  end
52
52
 
53
- module ClassMethods
53
+ class_methods do
54
54
 
55
55
  def without_instance(instance)
56
56
  if instance.new_record?
@@ -6,7 +6,7 @@ module ClosureTree
6
6
  _ct.hash_tree(self_and_descendants, options[:limit_depth])
7
7
  end
8
8
 
9
- module ClassMethods
9
+ class_methods do
10
10
 
11
11
  # There is no default depth limit. This might be crazy-big, depending
12
12
  # on your tree shape. Hash huge trees at your own peril!
@@ -35,13 +35,10 @@ module ClosureTree
35
35
  end
36
36
 
37
37
  def _ct_after_save
38
- as_5_1 = ActiveSupport.version >= Gem::Version.new('5.1.0')
39
- changes_method = as_5_1 ? :saved_changes : :changes
40
-
41
- if public_send(changes_method)[_ct.parent_column_name] || @was_new_record
38
+ if public_send(:saved_changes)[_ct.parent_column_name] || @was_new_record
42
39
  rebuild!
43
40
  end
44
- if public_send(changes_method)[_ct.parent_column_name] && !@was_new_record
41
+ if public_send(:saved_changes)[_ct.parent_column_name] && !@was_new_record
45
42
  # Resetting the ancestral collections addresses
46
43
  # https://github.com/mceachen/closure_tree/issues/68
47
44
  ancestor_hierarchies.reload
@@ -107,7 +104,7 @@ module ClosureTree
107
104
  end
108
105
  end
109
106
 
110
- module ClassMethods
107
+ class_methods do
111
108
  # Rebuilds the hierarchy table based on the parent_id column in the database.
112
109
  # Note that the hierarchy table will be truncated.
113
110
  def rebuild!