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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +30 -56
- data/.github/workflows/ci_jruby.yml +68 -0
- data/.github/workflows/ci_truffleruby.yml +71 -0
- data/.github/workflows/release.yml +17 -0
- data/.gitignore +1 -1
- data/.release-please-manifest.json +1 -0
- data/.tool-versions +1 -0
- data/Appraisals +9 -53
- data/CHANGELOG.md +5 -0
- data/Gemfile +2 -3
- data/README.md +21 -9
- data/Rakefile +11 -16
- data/closure_tree.gemspec +16 -9
- data/lib/closure_tree/active_record_support.rb +3 -14
- data/lib/closure_tree/digraphs.rb +1 -1
- data/lib/closure_tree/finders.rb +1 -1
- data/lib/closure_tree/hash_tree.rb +1 -1
- data/lib/closure_tree/hierarchy_maintenance.rb +3 -6
- data/lib/closure_tree/model.rb +3 -3
- data/lib/closure_tree/numeric_deterministic_ordering.rb +3 -8
- data/lib/closure_tree/support.rb +3 -7
- data/lib/closure_tree/version.rb +1 -1
- data/lib/generators/closure_tree/migration_generator.rb +1 -4
- data/release-please-config.json +4 -0
- data/test/closure_tree/cache_invalidation_test.rb +36 -0
- data/test/closure_tree/cuisine_type_test.rb +42 -0
- data/test/closure_tree/generator_test.rb +49 -0
- data/test/closure_tree/has_closure_tree_root_test.rb +80 -0
- data/test/closure_tree/hierarchy_maintenance_test.rb +56 -0
- data/test/closure_tree/label_test.rb +674 -0
- data/test/closure_tree/metal_test.rb +59 -0
- data/test/closure_tree/model_test.rb +9 -0
- data/test/closure_tree/namespace_type_test.rb +13 -0
- data/test/closure_tree/parallel_test.rb +162 -0
- data/test/closure_tree/pool_test.rb +33 -0
- data/test/closure_tree/support_test.rb +18 -0
- data/test/closure_tree/tag_test.rb +8 -0
- data/test/closure_tree/user_test.rb +175 -0
- data/test/closure_tree/uuid_tag_test.rb +8 -0
- data/test/support/query_counter.rb +25 -0
- data/test/support/tag_examples.rb +923 -0
- data/test/test_helper.rb +99 -0
- metadata +52 -21
- data/_config.yml +0 -1
- data/tests.sh +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1833e9f0cef7b45722dc67fcea625de8ee04bd820de6567da77f5f7bf3a97e65
|
4
|
+
data.tar.gz: 6c0c050d6b081b612b11d76c2e79b1f84f56dade7ad3b6f2b445f9bfa3d90d1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d61b4e41fd71552f54aba6bfec350fc75d5a923797c580fe2d7e48df6e7f3917477f7992c6bd9d59b614730f9978c77acd100ee4d848d737afb42e3e629dcf6
|
7
|
+
data.tar.gz: ed181080ce63b08712cbd8981cfa057cb4c432ed228cff8dac22a3770f9d41d7a81adff3b3b251bffb710e030952d6fe570e767707c835d72cbb0915ec328008
|
data/.github/workflows/ci.yml
CHANGED
@@ -2,20 +2,32 @@
|
|
2
2
|
name: CI
|
3
3
|
|
4
4
|
on:
|
5
|
-
|
6
|
-
|
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-
|
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
|
26
|
+
image: 'postgres'
|
15
27
|
ports: ['5432:5432']
|
16
28
|
env:
|
17
29
|
POSTGRES_PASSWORD: postgres
|
18
|
-
POSTGRES_DB:
|
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.
|
30
|
-
- '2.7'
|
31
|
-
- '2.6'
|
32
|
-
- '2.5'
|
41
|
+
- '3.3'
|
33
42
|
rails:
|
34
|
-
-
|
35
|
-
-
|
36
|
-
-
|
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
|
-
-
|
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@
|
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
|
-
|
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
|
-
|
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
|
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
@@ -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-
|
3
|
-
gem 'activerecord', '~>
|
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-
|
63
|
-
gem 'activerecord', '~>
|
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-
|
78
|
-
gem 'activerecord', '~>
|
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
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
|
-
[](http://travis-ci.org/ClosureTree/closure_tree)
|
8
|
+
[](https://github.com/ClosureTree/closure_tree/actions/workflows/ci.yml)
|
10
9
|
[](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
|
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
|
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](
|
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
|
667
|
-
* ActiveRecord
|
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
|
-
|
671
|
-
|
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:
|
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'], [
|
18
|
+
[['', ''], ['db_prefix_', ''], ['', '_db_suffix'], %w[abc_ _123]].each do |prefix, suffix|
|
19
19
|
env = "DB_PREFIX=#{prefix} DB_SUFFIX=#{suffix}"
|
20
|
-
|
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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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 = [
|
10
|
-
gem.homepage = '
|
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 = '>=
|
28
|
+
gem.required_ruby_version = '>= 3.3.0'
|
22
29
|
|
23
|
-
gem.add_runtime_dependency 'activerecord', '>=
|
24
|
-
gem.add_runtime_dependency 'with_advisory_lock', '>=
|
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 '
|
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
|
5
|
-
|
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
|
-
|
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 }
|
data/lib/closure_tree/finders.rb
CHANGED
@@ -35,13 +35,10 @@ module ClosureTree
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def _ct_after_save
|
38
|
-
|
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(
|
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
|
-
|
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!
|