acts-as-taggable-on 9.0.0 → 11.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/spec.yml +12 -14
- data/Appraisals +10 -7
- data/CHANGELOG.md +22 -3
- data/CONTRIBUTING.md +3 -3
- data/Gemfile +0 -1
- data/README.md +16 -4
- data/acts-as-taggable-on.gemspec +5 -5
- data/db/migrate/1_acts_as_taggable_on_migration.rb +0 -1
- data/gemfiles/activerecord_7.0.gemfile +2 -2
- data/gemfiles/{activerecord_6.0.gemfile → activerecord_7.1.gemfile} +2 -2
- data/gemfiles/{activerecord_6.1.gemfile → activerecord_7.2.gemfile} +2 -2
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/tag.rb +4 -3
- data/lib/acts-as-taggable-on/taggable/caching.rb +46 -0
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/collection.rb +5 -4
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/core.rb +4 -6
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/ownership.rb +5 -7
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/tagged_with_query/query_base.rb +11 -2
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable.rb +8 -8
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/tagger.rb +5 -13
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/tagging.rb +1 -1
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/utils.rb +0 -4
- data/lib/{acts_as_taggable_on → acts-as-taggable-on}/version.rb +1 -1
- data/lib/acts-as-taggable-on.rb +14 -29
- data/lib/tasks/example/acts-as-taggable-on.rb.example +8 -0
- data/lib/tasks/install_initializer.rake +23 -0
- data/spec/acts_as_taggable_on/acts_as_taggable_on_spec.rb +5 -10
- data/spec/acts_as_taggable_on/acts_as_tagger_spec.rb +2 -2
- data/spec/acts_as_taggable_on/caching_spec.rb +0 -4
- data/spec/acts_as_taggable_on/tag_list_spec.rb +3 -3
- data/spec/acts_as_taggable_on/tag_spec.rb +45 -2
- data/spec/acts_as_taggable_on/taggable_spec.rb +51 -44
- data/spec/acts_as_taggable_on/tagger_spec.rb +8 -8
- data/spec/acts_as_taggable_on/tagging_spec.rb +28 -2
- data/spec/support/database.rb +3 -11
- data/spec/support/database_cleaner.rb +4 -0
- metadata +57 -36
- data/lib/acts_as_taggable_on/taggable/cache.rb +0 -92
- data/lib/acts_as_taggable_on.rb +0 -6
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/default_parser.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/engine.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/generic_parser.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/tag_list.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/related.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/tag_list_type.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/tagged_with_query/all_tags_query.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/tagged_with_query/any_tags_query.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/tagged_with_query/exclude_tags_query.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/tagged_with_query.rb +0 -0
- /data/lib/{acts_as_taggable_on → acts-as-taggable-on}/tags_helper.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e13692b84fcccf9821c3f37ce992c07452df045dc2c20c58a47ab704ed8bdd36
|
4
|
+
data.tar.gz: 85bdcb03c9666c61efd92329f243e51bd4acf1941f32238dfecd50aaf8decf9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52f08142695e549389e407a214eafc2003ccba07a62e659acaf8c02f44d4a533ec6aef149e77900d344227b4453b8eac1ded100758e543cb7437f9391b3817f6
|
7
|
+
data.tar.gz: f82dfcbee2386842ab6f3319598f144fce5a59905fa2f5e92cfc07eb6d986e0283b666132226b824f13d52a51d92f10d010543691776f7a138a96ad8e50c39de
|
data/.github/workflows/spec.yml
CHANGED
@@ -10,15 +10,15 @@ jobs:
|
|
10
10
|
DB: ${{ matrix.db }}
|
11
11
|
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
12
12
|
strategy:
|
13
|
+
fail-fast: false
|
13
14
|
matrix:
|
14
15
|
ruby:
|
15
|
-
-
|
16
|
-
- 2
|
17
|
-
-
|
18
|
-
- 2.5
|
16
|
+
- 3.3
|
17
|
+
- 3.2
|
18
|
+
- 3.1
|
19
19
|
gemfile:
|
20
|
-
- gemfiles/
|
21
|
-
- gemfiles/
|
20
|
+
- gemfiles/activerecord_7.2.gemfile
|
21
|
+
- gemfiles/activerecord_7.1.gemfile
|
22
22
|
- gemfiles/activerecord_7.0.gemfile
|
23
23
|
db:
|
24
24
|
- mysql
|
@@ -27,15 +27,13 @@ jobs:
|
|
27
27
|
include:
|
28
28
|
- ruby: truffleruby-head
|
29
29
|
db: postgresql
|
30
|
-
gemfile: gemfiles/
|
30
|
+
gemfile: gemfiles/activerecord_7.0.gemfile
|
31
31
|
- ruby: truffleruby-head
|
32
32
|
db: postgresql
|
33
|
-
gemfile: gemfiles/activerecord_7.
|
34
|
-
|
35
|
-
|
36
|
-
gemfile: gemfiles/activerecord_7.
|
37
|
-
- ruby: 2.6
|
38
|
-
gemfile: gemfiles/activerecord_7.0.gemfile
|
33
|
+
gemfile: gemfiles/activerecord_7.1.gemfile
|
34
|
+
- ruby: truffleruby-head
|
35
|
+
db: postgresql
|
36
|
+
gemfile: gemfiles/activerecord_7.2.gemfile
|
39
37
|
|
40
38
|
services:
|
41
39
|
postgres:
|
@@ -61,7 +59,7 @@ jobs:
|
|
61
59
|
--health-timeout 5s
|
62
60
|
--health-retries 5
|
63
61
|
steps:
|
64
|
-
- uses: actions/checkout@
|
62
|
+
- uses: actions/checkout@v4
|
65
63
|
- name: Set up Ruby
|
66
64
|
uses: ruby/setup-ruby@v1
|
67
65
|
with:
|
data/Appraisals
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
appraise 'activerecord-
|
4
|
-
gem 'activerecord', '~>
|
3
|
+
appraise 'activerecord-7.0' do
|
4
|
+
gem 'activerecord', '~> 7.0.1'
|
5
5
|
gem 'pg'
|
6
|
+
gem 'sqlite3', '~> 1.4'
|
6
7
|
gem 'mysql2', '~> 0.5'
|
7
8
|
end
|
8
9
|
|
9
|
-
appraise 'activerecord-
|
10
|
-
gem 'activerecord', '~>
|
10
|
+
appraise 'activerecord-7.1' do
|
11
|
+
gem 'activerecord', '~> 7.1.0'
|
11
12
|
gem 'pg'
|
13
|
+
gem 'sqlite3', '~> 1.4'
|
12
14
|
gem 'mysql2', '~> 0.5'
|
13
15
|
end
|
14
16
|
|
15
|
-
appraise 'activerecord-7.
|
16
|
-
gem 'activerecord', '~> 7.
|
17
|
+
appraise 'activerecord-7.2' do
|
18
|
+
gem 'activerecord', '~> 7.2.0'
|
17
19
|
gem 'pg'
|
20
|
+
gem 'sqlite3', '~> 1.4'
|
18
21
|
gem 'mysql2', '~> 0.5'
|
19
|
-
end
|
22
|
+
end
|
data/CHANGELOG.md
CHANGED
@@ -10,6 +10,25 @@ Each change should fall into categories that would affect whether the release is
|
|
10
10
|
|
11
11
|
As such, _Breaking Changes_ are major. _Features_ would map to either major or minor. _Fixes_, _Performance_, and _Misc_ are either minor or patch, the difference being kind of fuzzy for the purposes of history. Adding _Documentation_ (including tests) would be patch level.
|
12
12
|
|
13
|
+
### [v11.0.0) / 2024-08-23](https://github.com/mbleigh/acts-as-taggable-on/compare/v10.0.0...v11.0.0)
|
14
|
+
- Removed support for Ruby 2.7
|
15
|
+
- Removed support for Rails 6.1
|
16
|
+
- Added support for Ruby 3.2 and 3.3
|
17
|
+
- Added support for Rails 7.2
|
18
|
+
- Remove legacy code
|
19
|
+
- Renamed gem folder from acts_as_taggable_on to acts-as-taggable-on
|
20
|
+
- Removed legacy autoloading and replaced it with zeitwerk
|
21
|
+
|
22
|
+
### [v10.0.0) / 2023-10-15](https://github.com/mbleigh/acts-as-taggable-on/compare/v9.0.1...v10.0.0)
|
23
|
+
* Features
|
24
|
+
* [@glampr Add support for prefix and suffix searches alongside previously supported containment (wildcard) searches](https://github.com/mbleigh/acts-as-taggable-on/pull/1082)
|
25
|
+
* [@donquxiote Add support for horizontally sharded databases](https://github.com/mbleigh/acts-as-taggable-on/pull/1079)
|
26
|
+
* [aovertus Remove restriction around ActiveRecord 7.x versions allowing support until next major is released](https://github.com/mbleigh/acts-as-taggable-on/pull/1110)
|
27
|
+
|
28
|
+
### [v9.0.1) / 2022-01-07](https://github.com/mbleigh/acts-as-taggable-on/compare/v9.0.0..v9.0.1)
|
29
|
+
* Fixes
|
30
|
+
* Fix migration that generate default index
|
31
|
+
|
13
32
|
### [v9.0.0) / 2022-01-04](https://github.com/mbleigh/acts-as-taggable-on/compare/v8.1.0...v9.0.0)
|
14
33
|
* Fixes
|
15
34
|
* Support activerecord-7.0.0
|
@@ -35,7 +54,7 @@ As such, _Breaking Changes_ are major. _Features_ would map to either major or m
|
|
35
54
|
* Features
|
36
55
|
* [@kvokka Rails 6.1 support](https://github.com/mbleigh/acts-as-taggable-on/pull/1013)
|
37
56
|
* Fixes
|
38
|
-
* [@nbulaj Add support for Ruby 2.7 and it's kwargs](https://github.com/mbleigh/acts-as-taggable-on/pull/
|
57
|
+
* [@nbulaj Add support for Ruby 2.7 and it's kwargs](https://github.com/mbleigh/acts-as-taggable-on/pull/999)
|
39
58
|
* [@Andythurlow @endorfin case sensitivity fix for tagged_with](https://github.com/mbleigh/acts-as-taggable-on/pull/965)
|
40
59
|
|
41
60
|
### [6.5.0 / 2019-11-07](https://github.com/mbleigh/acts-as-taggable-on/compare/v6.0.0...v6.5.0)
|
@@ -111,7 +130,7 @@ As such, _Breaking Changes_ are major. _Features_ would map to either major or m
|
|
111
130
|
|
112
131
|
* Fixes
|
113
132
|
* [@rikettsie #623 collation parameter is ignored if it generates an exception](https://github.com/mbleigh/acts-as-taggable-on/pull/650)
|
114
|
-
* [@bwvoss References working parser in
|
133
|
+
* [@bwvoss References working parser in deprecation warning](https://github.com/mbleigh/acts-as-taggable-on/pull/659)
|
115
134
|
* [@jh125486 Updated tagging_contexts to include dynamic contexts](https://github.com/mbleigh/acts-as-taggable-on/pull/660)
|
116
135
|
* [@jh125486 Fixed wildcard test (postgres returning rows with unexpected order)](https://github.com/mbleigh/acts-as-taggable-on/pull/660)
|
117
136
|
* [@FlowerWrong Add rails 5.0.0 alpha support, not hack rails <5](https://github.com/mbleigh/acts-as-taggable-on/pull/673)
|
@@ -132,7 +151,7 @@ As such, _Breaking Changes_ are major. _Features_ would map to either major or m
|
|
132
151
|
* [@seuros Remove more deprecations](https://github.com/mbleigh/acts-as-taggable-on/commit/05794170f64f8bf250b34d2d594e368721009278)
|
133
152
|
* [@lukeasrodgers Bugfix `TagList#concat` with non-duplicates.](https://github.com/mbleigh/acts-as-taggable-on/commit/2c6214f0ddf8c6440ab81eec04d1fbf9d97c8826)
|
134
153
|
* [@seuros clean! should return self.](https://github.com/mbleigh/acts-as-taggable-on/commit/c739422f56f8ff37e3f321235e74997422a1c980)
|
135
|
-
* [@rbritom
|
154
|
+
* [@rbritom re-enable appraisals](https://github.com/mbleigh/acts-as-taggable-on/commit/0ca1f1c5b059699c683a28b522e86a3d5cd7639e)
|
136
155
|
* [@rbritom remove index conditionally on up method.](https://github.com/mbleigh/acts-as-taggable-on/commit/9cc580e7f88164634eb10c8826e5b30ea0e00544)
|
137
156
|
* [@rbritom add index on down method . ](https://github.com/mbleigh/acts-as-taggable-on/pull/767)
|
138
157
|
* [@rbritom remove index conditionally on up method](https://github.com/mbleigh/acts-as-taggable-on/commit/9cc580e7f88164634eb10c8826e5b30ea0e00544)
|
data/CONTRIBUTING.md
CHANGED
@@ -29,7 +29,7 @@
|
|
29
29
|
* Use well-described, small (atomic) commits.
|
30
30
|
* Include links to any relevant github issues.
|
31
31
|
* *Don't* change the VERSION file.
|
32
|
-
6. Extra Credit: [Confirm it runs and tests pass on the rubies specified in the
|
32
|
+
6. Extra Credit: [Confirm it runs and tests pass on the rubies specified in the Github Actions config](.github/workflows/spec.yml). I will otherwise confirm it runs on these.
|
33
33
|
|
34
34
|
How I handle pull requests:
|
35
35
|
|
@@ -44,13 +44,13 @@ How I handle pull requests:
|
|
44
44
|
|
45
45
|
* [A Note About Git Commit Messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
|
46
46
|
* [http://stopwritingramblingcommitmessages.com/](http://stopwritingramblingcommitmessages.com/)
|
47
|
-
* [ThoughtBot style guide](https://github.com/thoughtbot/guides/tree/
|
47
|
+
* [ThoughtBot style guide](https://github.com/thoughtbot/guides/tree/main/git)
|
48
48
|
|
49
49
|
### About Pull Requests (PR's)
|
50
50
|
|
51
51
|
* [All Your Open Source Code Are Belong To Us](http://www.benjaminfleischer.com/2013/07/30/all-your-open-source-code-are-belong-to-us/)
|
52
52
|
* [Using Pull Requests](https://help.github.com/articles/using-pull-requests)
|
53
|
-
* [Github pull requests made easy](
|
53
|
+
* [Github pull requests made easy](https://www.element84.com/blog/github-pull-requests-made-easy)
|
54
54
|
|
55
55
|
## Documentation
|
56
56
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -22,7 +22,6 @@
|
|
22
22
|
- [Upgrading](#upgrading)
|
23
23
|
- [Contributors](#contributors)
|
24
24
|
- [Compatibility](#compatibility)
|
25
|
-
- [TODO](#todo)
|
26
25
|
- [Testing](#testing)
|
27
26
|
- [License](#license)
|
28
27
|
|
@@ -57,7 +56,7 @@ was used.
|
|
57
56
|
To use it, add it to your Gemfile:
|
58
57
|
|
59
58
|
```ruby
|
60
|
-
gem 'acts-as-taggable-on'
|
59
|
+
gem 'acts-as-taggable-on'
|
61
60
|
```
|
62
61
|
|
63
62
|
and bundle:
|
@@ -255,7 +254,11 @@ User.tagged_with(["awesome", "cool"], :exclude => true)
|
|
255
254
|
User.tagged_with(['awesome', 'cool'], :on => :tags, :any => true).tagged_with(['smart', 'shy'], :on => :skills, :any => true)
|
256
255
|
```
|
257
256
|
|
258
|
-
|
257
|
+
#### Wildcard tag search
|
258
|
+
You now have the following options for prefix, suffix and containment search, along with `:any` or `:exclude` option.
|
259
|
+
Use `wild: :suffix` to place a wildcard at the end of the tag. It will be looking for `awesome%` and `cool%` in SQL.
|
260
|
+
Use `wild: :prefix` to place a wildcard at the beginning of the tag. It will be looking for `%awesome` and `%cool` in SQL.
|
261
|
+
Use `wild: true` to place a wildcard both at the beginning and the end of the tag. It will be looking for `%awesome%` and `%cool%` in SQL.
|
259
262
|
|
260
263
|
__Tip:__ `User.tagged_with([])` or `User.tagged_with('')` will return `[]`, an empty set of records.
|
261
264
|
|
@@ -296,6 +299,15 @@ to allow for dynamic tag contexts (this could be user generated tag contexts!)
|
|
296
299
|
User.tagged_with("same", :on => :customs) # => [@user]
|
297
300
|
```
|
298
301
|
|
302
|
+
### Finding tags based on context
|
303
|
+
|
304
|
+
You can find tags for a specific context by using the ```for_context``` scope:
|
305
|
+
|
306
|
+
```ruby
|
307
|
+
ActsAsTaggableOn::Tag.for_context(:tags)
|
308
|
+
ActsAsTaggableOn::Tag.for_context(:skills)
|
309
|
+
```
|
310
|
+
|
299
311
|
### Tag Parsers
|
300
312
|
|
301
313
|
If you want to change how tags are parsed, you can define your own implementation:
|
@@ -364,7 +376,7 @@ Note that `tag_list` only returns tags whose taggings do not have an owner. Cont
|
|
364
376
|
To retrieve all tags of an object (regardless of ownership) or if only one owner can tag the object, use `all_tags_list`.
|
365
377
|
|
366
378
|
##### Adding owned tags
|
367
|
-
Note that **owned tags** are added all at once, in the form of ***comma
|
379
|
+
Note that **owned tags** are added all at once, in the form of ***comma separated tags*** in string.
|
368
380
|
Also, when you try to add **owned tags** again, it simply overwrites the previous set of **owned tags**.
|
369
381
|
So to append tags in previously existing **owned tags** list, go as follows:
|
370
382
|
```ruby
|
data/acts-as-taggable-on.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
|
4
|
-
require 'acts_as_taggable_on/version'
|
2
|
+
|
3
|
+
require_relative 'lib/acts-as-taggable-on/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |gem|
|
7
6
|
gem.name = 'acts-as-taggable-on'
|
@@ -16,13 +15,14 @@ Gem::Specification.new do |gem|
|
|
16
15
|
gem.files = `git ls-files`.split($/)
|
17
16
|
gem.test_files = gem.files.grep(%r{^spec/})
|
18
17
|
gem.require_paths = ['lib']
|
19
|
-
gem.required_ruby_version = '>=
|
18
|
+
gem.required_ruby_version = '>= 3.0.0'
|
20
19
|
|
21
20
|
if File.exist?('UPGRADING.md')
|
22
21
|
gem.post_install_message = File.read('UPGRADING.md')
|
23
22
|
end
|
24
23
|
|
25
|
-
gem.add_runtime_dependency 'activerecord', '>=
|
24
|
+
gem.add_runtime_dependency 'activerecord', '>= 7.0', '< 8.0'
|
25
|
+
gem.add_runtime_dependency 'zeitwerk', '>= 2.4', '< 3.0'
|
26
26
|
|
27
27
|
gem.add_development_dependency 'rspec-rails'
|
28
28
|
gem.add_development_dependency 'rspec-its'
|
@@ -22,7 +22,6 @@ class ActsAsTaggableOnMigration < ActiveRecord::Migration[6.0]
|
|
22
22
|
t.datetime :created_at
|
23
23
|
end
|
24
24
|
|
25
|
-
add_index ActsAsTaggableOn.taggings_table, :tag_id
|
26
25
|
add_index ActsAsTaggableOn.taggings_table, %i[taggable_id taggable_type context],
|
27
26
|
name: 'taggings_taggable_context_idx'
|
28
27
|
end
|
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "activerecord", "~> 7.0.
|
5
|
+
gem "activerecord", "~> 7.0.1"
|
6
6
|
gem "pg"
|
7
|
+
gem "sqlite3", "~> 1.4"
|
7
8
|
gem "mysql2", "~> 0.5"
|
8
9
|
|
9
10
|
group :local_development do
|
@@ -11,7 +12,6 @@ group :local_development do
|
|
11
12
|
gem "guard-rspec"
|
12
13
|
gem "appraisal"
|
13
14
|
gem "rake"
|
14
|
-
gem "sqlite3"
|
15
15
|
gem "byebug", platforms: [:mri]
|
16
16
|
end
|
17
17
|
|
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "activerecord", "~>
|
5
|
+
gem "activerecord", "~> 7.1.0"
|
6
6
|
gem "pg"
|
7
|
+
gem "sqlite3", "~> 1.4"
|
7
8
|
gem "mysql2", "~> 0.5"
|
8
9
|
|
9
10
|
group :local_development do
|
@@ -11,7 +12,6 @@ group :local_development do
|
|
11
12
|
gem "guard-rspec"
|
12
13
|
gem "appraisal"
|
13
14
|
gem "rake"
|
14
|
-
gem "sqlite3"
|
15
15
|
gem "byebug", platforms: [:mri]
|
16
16
|
end
|
17
17
|
|
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "activerecord", "~>
|
5
|
+
gem "activerecord", "~> 7.2.0"
|
6
6
|
gem "pg"
|
7
|
+
gem "sqlite3", "~> 1.4"
|
7
8
|
gem "mysql2", "~> 0.5"
|
8
9
|
|
9
10
|
group :local_development do
|
@@ -11,7 +12,6 @@ group :local_development do
|
|
11
12
|
gem "guard-rspec"
|
12
13
|
gem "appraisal"
|
13
14
|
gem "rake"
|
14
|
-
gem "sqlite3"
|
15
15
|
gem "byebug", platforms: [:mri]
|
16
16
|
end
|
17
17
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActsAsTaggableOn
|
4
|
-
class Tag <
|
4
|
+
class Tag < ActsAsTaggableOn.base_class.constantize
|
5
5
|
self.table_name = ActsAsTaggableOn.tags_table
|
6
6
|
|
7
7
|
### ASSOCIATIONS:
|
@@ -84,10 +84,11 @@ module ActsAsTaggableOn
|
|
84
84
|
tries ||= 3
|
85
85
|
comparable_tag_name = comparable_name(tag_name)
|
86
86
|
existing_tag = existing_tags.find { |tag| comparable_name(tag.name) == comparable_tag_name }
|
87
|
-
existing_tag
|
87
|
+
next existing_tag if existing_tag
|
88
|
+
|
89
|
+
transaction(requires_new: true) { create(name: tag_name) }
|
88
90
|
rescue ActiveRecord::RecordNotUnique
|
89
91
|
if (tries -= 1).positive?
|
90
|
-
ActiveRecord::Base.connection.execute 'ROLLBACK'
|
91
92
|
existing_tags = named_any(list)
|
92
93
|
retry
|
93
94
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActsAsTaggableOn
|
4
|
+
module Taggable
|
5
|
+
module Caching
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
initialize_tags_cache
|
10
|
+
before_save :save_cached_tag_list
|
11
|
+
end
|
12
|
+
|
13
|
+
class_methods do
|
14
|
+
def initialize_tags_cache
|
15
|
+
tag_types.map(&:to_s).each do |tag_type|
|
16
|
+
define_singleton_method("caching_#{tag_type.singularize}_list?") do
|
17
|
+
caching_tag_list_on?(tag_type)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def acts_as_taggable_on(*args)
|
23
|
+
super(*args)
|
24
|
+
initialize_tags_cache
|
25
|
+
end
|
26
|
+
|
27
|
+
def caching_tag_list_on?(context)
|
28
|
+
column_names.include?("cached_#{context.to_s.singularize}_list")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def save_cached_tag_list
|
33
|
+
tag_types.map(&:to_s).each do |tag_type|
|
34
|
+
next unless self.class.respond_to?("caching_#{tag_type.singularize}_list?")
|
35
|
+
if self.class.send("caching_#{tag_type.singularize}_list?") && tag_list_cache_set_on(tag_type)
|
36
|
+
list = tag_list_cache_on(tag_type).to_a.flatten.compact.join("#{ActsAsTaggableOn.delimiter} ")
|
37
|
+
self["cached_#{tag_type.singularize}_list"] = list
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -3,12 +3,13 @@
|
|
3
3
|
module ActsAsTaggableOn
|
4
4
|
module Taggable
|
5
5
|
module Collection
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
initialize_acts_as_taggable_on_collection
|
9
10
|
end
|
10
11
|
|
11
|
-
|
12
|
+
class_methods do
|
12
13
|
def initialize_acts_as_taggable_on_collection
|
13
14
|
tag_types.map(&:to_s).each do |tag_type|
|
14
15
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
@@ -6,19 +6,17 @@ require_relative 'tag_list_type'
|
|
6
6
|
module ActsAsTaggableOn
|
7
7
|
module Taggable
|
8
8
|
module Core
|
9
|
-
|
10
|
-
base.extend ActsAsTaggableOn::Taggable::Core::ClassMethods
|
9
|
+
extend ActiveSupport::Concern
|
11
10
|
|
12
|
-
|
11
|
+
included do
|
13
12
|
attr_writer :custom_contexts
|
14
13
|
|
15
14
|
after_save :save_tags
|
16
|
-
end
|
17
15
|
|
18
|
-
|
16
|
+
initialize_acts_as_taggable_on_core
|
19
17
|
end
|
20
18
|
|
21
|
-
|
19
|
+
class_methods do
|
22
20
|
def initialize_acts_as_taggable_on_core
|
23
21
|
include taggable_mixin
|
24
22
|
tag_types.map(&:to_s).each do |tags_type|
|
@@ -3,17 +3,15 @@
|
|
3
3
|
module ActsAsTaggableOn
|
4
4
|
module Taggable
|
5
5
|
module Ownership
|
6
|
-
|
7
|
-
base.extend ActsAsTaggableOn::Taggable::Ownership::ClassMethods
|
6
|
+
extend ActiveSupport::Concern
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
end
|
8
|
+
included do
|
9
|
+
after_save :save_owned_tags
|
12
10
|
|
13
|
-
|
11
|
+
initialize_acts_as_taggable_on_ownership
|
14
12
|
end
|
15
13
|
|
16
|
-
|
14
|
+
class_methods do
|
17
15
|
def acts_as_taggable_on(*args)
|
18
16
|
initialize_acts_as_taggable_on_ownership
|
19
17
|
super(*args)
|
data/lib/{acts_as_taggable_on → acts-as-taggable-on}/taggable/tagged_with_query/query_base.rb
RENAMED
@@ -33,7 +33,7 @@ module ActsAsTaggableOn
|
|
33
33
|
matches_attribute = matches_attribute.lower unless ActsAsTaggableOn.strict_case_match
|
34
34
|
|
35
35
|
if options[:wild].present?
|
36
|
-
matches_attribute.matches(
|
36
|
+
matches_attribute.matches(wildcard_escaped_tag(tag), '!', ActsAsTaggableOn.strict_case_match)
|
37
37
|
else
|
38
38
|
matches_attribute.matches(escaped_tag(tag), '!', ActsAsTaggableOn.strict_case_match)
|
39
39
|
end
|
@@ -45,7 +45,7 @@ module ActsAsTaggableOn
|
|
45
45
|
|
46
46
|
if options[:wild].present?
|
47
47
|
matches_attribute.matches_any(tag_list.map do |tag|
|
48
|
-
|
48
|
+
wildcard_escaped_tag(tag)
|
49
49
|
end, '!', ActsAsTaggableOn.strict_case_match)
|
50
50
|
else
|
51
51
|
matches_attribute.matches_any(tag_list.map do |tag|
|
@@ -59,6 +59,15 @@ module ActsAsTaggableOn
|
|
59
59
|
ActsAsTaggableOn::Utils.escape_like(tag)
|
60
60
|
end
|
61
61
|
|
62
|
+
def wildcard_escaped_tag(tag)
|
63
|
+
case options[:wild]
|
64
|
+
when :suffix then "#{escaped_tag(tag)}%"
|
65
|
+
when :prefix then "%#{escaped_tag(tag)}"
|
66
|
+
when true then "%#{escaped_tag(tag)}%"
|
67
|
+
else escaped_tag(tag)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
62
71
|
def adjust_taggings_alias(taggings_alias)
|
63
72
|
taggings_alias = "taggings_alias_#{Digest::SHA1.hexdigest(taggings_alias)}" if taggings_alias.size > 75
|
64
73
|
taggings_alias
|
@@ -66,7 +66,7 @@ module ActsAsTaggableOn
|
|
66
66
|
# called on each call of taggable_on
|
67
67
|
include Core
|
68
68
|
include Collection
|
69
|
-
include
|
69
|
+
include Caching
|
70
70
|
include Ownership
|
71
71
|
include Related
|
72
72
|
end
|
@@ -91,13 +91,13 @@ module ActsAsTaggableOn
|
|
91
91
|
self.tag_types = (self.tag_types + tag_types).uniq
|
92
92
|
self.preserve_tag_order = preserve_tag_order
|
93
93
|
else
|
94
|
-
class_attribute :tag_types
|
95
|
-
self.tag_types = tag_types
|
96
|
-
class_attribute :preserve_tag_order
|
97
|
-
self.preserve_tag_order = preserve_tag_order
|
98
|
-
class_attribute :tenant_column
|
99
|
-
|
100
94
|
class_eval do
|
95
|
+
class_attribute :tag_types
|
96
|
+
class_attribute :preserve_tag_order
|
97
|
+
class_attribute :tenant_column
|
98
|
+
self.tag_types = tag_types
|
99
|
+
self.preserve_tag_order = preserve_tag_order
|
100
|
+
|
101
101
|
has_many :taggings, as: :taggable, dependent: :destroy, class_name: '::ActsAsTaggableOn::Tagging'
|
102
102
|
has_many :base_tags, through: :taggings, source: :tag, class_name: '::ActsAsTaggableOn::Tag'
|
103
103
|
|
@@ -111,7 +111,7 @@ module ActsAsTaggableOn
|
|
111
111
|
# called on each call of taggable_on
|
112
112
|
include Core
|
113
113
|
include Collection
|
114
|
-
include
|
114
|
+
include Caching
|
115
115
|
include Ownership
|
116
116
|
include Related
|
117
117
|
end
|
@@ -2,11 +2,9 @@
|
|
2
2
|
|
3
3
|
module ActsAsTaggableOn
|
4
4
|
module Tagger
|
5
|
-
|
6
|
-
base.extend ClassMethods
|
7
|
-
end
|
5
|
+
extend ActiveSupport::Concern
|
8
6
|
|
9
|
-
|
7
|
+
class_methods do
|
10
8
|
##
|
11
9
|
# Make a model a tagger. This allows an instance of a model to claim ownership
|
12
10
|
# of tags.
|
@@ -40,9 +38,7 @@ module ActsAsTaggableOn
|
|
40
38
|
false
|
41
39
|
end
|
42
40
|
|
43
|
-
|
44
|
-
tagger?
|
45
|
-
end
|
41
|
+
alias is_tagger? tagger?
|
46
42
|
end
|
47
43
|
|
48
44
|
module InstanceMethods
|
@@ -75,9 +71,7 @@ module ActsAsTaggableOn
|
|
75
71
|
self.class.is_tagger?
|
76
72
|
end
|
77
73
|
|
78
|
-
|
79
|
-
tagger?
|
80
|
-
end
|
74
|
+
alias is_tagger? tagger?
|
81
75
|
end
|
82
76
|
|
83
77
|
module SingletonMethods
|
@@ -85,9 +79,7 @@ module ActsAsTaggableOn
|
|
85
79
|
true
|
86
80
|
end
|
87
81
|
|
88
|
-
|
89
|
-
tagger?
|
90
|
-
end
|
82
|
+
alias is_tagger? tagger?
|
91
83
|
end
|
92
84
|
end
|
93
85
|
end
|
@@ -26,10 +26,6 @@ module ActsAsTaggableOn
|
|
26
26
|
using_postgresql? ? 'ILIKE' : 'LIKE'
|
27
27
|
end
|
28
28
|
|
29
|
-
def legacy_activerecord?
|
30
|
-
ActiveRecord.version <= Gem::Version.new('5.3.0')
|
31
|
-
end
|
32
|
-
|
33
29
|
# escape _ and % characters in strings, since these are wildcards in SQL.
|
34
30
|
def escape_like(str)
|
35
31
|
str.gsub(/[!%_]/) { |x| "!#{x}" }
|