make_taggable 0.7.4 → 1.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/CHANGELOG.md +79 -0
- data/CONTRIBUTING.md +65 -22
- data/LICENSE.md +18 -17
- data/README.md +73 -444
- data/UPGRADING.md +28 -2
- data/docs/caching.md +93 -0
- data/docs/configuration.md +108 -0
- data/docs/contexts.md +147 -0
- data/docs/database.md +106 -0
- data/docs/getting-started.md +114 -0
- data/docs/migrating-from-aato.md +67 -0
- data/docs/ownership.md +111 -0
- data/docs/parsers.md +109 -0
- data/docs/querying.md +163 -0
- data/docs/tag-clouds.md +74 -0
- data/lib/make_taggable/default_parser.rb +45 -32
- data/lib/make_taggable/engine.rb +6 -0
- data/lib/make_taggable/generic_parser.rb +30 -4
- data/lib/make_taggable/tag.rb +121 -19
- data/lib/make_taggable/tag_list.rb +77 -24
- data/lib/make_taggable/taggable/cache.rb +61 -11
- data/lib/make_taggable/taggable/collection.rb +102 -30
- data/lib/make_taggable/taggable/core.rb +154 -34
- data/lib/make_taggable/taggable/ownership.rb +82 -4
- data/lib/make_taggable/taggable/related.rb +66 -3
- data/lib/make_taggable/taggable/tag_list_type.rb +8 -0
- data/lib/make_taggable/taggable/tagged_with_query/all_tags_query.rb +10 -0
- data/lib/make_taggable/taggable/tagged_with_query/any_tags_query.rb +10 -0
- data/lib/make_taggable/taggable/tagged_with_query/exclude_tags_query.rb +10 -0
- data/lib/make_taggable/taggable/tagged_with_query/query_base.rb +15 -0
- data/lib/make_taggable/taggable/tagged_with_query.rb +17 -0
- data/lib/make_taggable/taggable.rb +34 -33
- data/lib/make_taggable/tagger.rb +73 -12
- data/lib/make_taggable/tagging.rb +30 -3
- data/lib/make_taggable/tags_helper.rb +22 -1
- data/lib/make_taggable/utils.rb +40 -5
- data/lib/make_taggable/version.rb +8 -1
- data/lib/make_taggable.rb +153 -8
- data/make_taggable.gemspec +13 -20
- metadata +50 -165
- data/.dummyrc +0 -17
- data/.github/workflows/ci.yml +0 -140
- data/.github/workflows/standard-ci.yml +0 -27
- data/.gitignore +0 -17
- data/.rspec +0 -3
- data/Appraisals +0 -15
- data/Gemfile +0 -16
- data/Rakefile +0 -13
- data/gemfiles/rails_5.gemfile +0 -9
- data/gemfiles/rails_6.gemfile +0 -9
- data/gemfiles/rails_6_1.gemfile +0 -9
- data/gemfiles/rails_master.gemfile +0 -9
- data/lib/tasks/setup_test_db.rake +0 -8
data/lib/make_taggable.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "make_taggable/version"
|
|
2
4
|
require "active_record"
|
|
3
5
|
require "active_record/version"
|
|
@@ -11,6 +13,21 @@ end
|
|
|
11
13
|
|
|
12
14
|
require "digest/sha1"
|
|
13
15
|
|
|
16
|
+
##
|
|
17
|
+
# Tagging for Active Record models, across any number of named contexts.
|
|
18
|
+
#
|
|
19
|
+
# Make a model taggable with {MakeTaggable::Taggable#make_taggable}, and configure the library
|
|
20
|
+
# through {MakeTaggable.setup}. Every setting on {MakeTaggable::Configuration} can also be read and
|
|
21
|
+
# written directly here.
|
|
22
|
+
#
|
|
23
|
+
# @example
|
|
24
|
+
# class Book < ActiveRecord::Base
|
|
25
|
+
# make_taggable :genres
|
|
26
|
+
# end
|
|
27
|
+
#
|
|
28
|
+
# Book.create!(genre_list: "sci-fi, classic")
|
|
29
|
+
# Book.tagged_with("sci-fi")
|
|
30
|
+
#
|
|
14
31
|
module MakeTaggable
|
|
15
32
|
extend ActiveSupport::Autoload
|
|
16
33
|
|
|
@@ -28,23 +45,52 @@ module MakeTaggable
|
|
|
28
45
|
autoload :Cache
|
|
29
46
|
autoload :Collection
|
|
30
47
|
autoload :Core
|
|
31
|
-
autoload :Dirty
|
|
32
48
|
autoload :Ownership
|
|
33
49
|
autoload :Related
|
|
34
50
|
autoload :TagListType
|
|
35
51
|
end
|
|
36
52
|
|
|
37
53
|
autoload :Utils
|
|
38
|
-
autoload :Compatibility
|
|
39
54
|
|
|
55
|
+
##
|
|
56
|
+
# Raised when a tag name is taken by a competing write and cannot be resolved by retrying.
|
|
57
|
+
#
|
|
40
58
|
class DuplicateTagError < StandardError
|
|
41
59
|
end
|
|
42
60
|
|
|
61
|
+
##
|
|
62
|
+
# Yields the configuration so settings can be assigned in one block.
|
|
63
|
+
#
|
|
64
|
+
# Called without a block it only ensures the configuration exists, which is how the library
|
|
65
|
+
# initialises itself on load.
|
|
66
|
+
#
|
|
67
|
+
# @yieldparam configuration [MakeTaggable::Configuration] the current configuration
|
|
68
|
+
# @return [MakeTaggable::Configuration, NilClass] the configuration when no block is given
|
|
69
|
+
#
|
|
70
|
+
# @example
|
|
71
|
+
# MakeTaggable.setup do |config|
|
|
72
|
+
# config.force_lowercase = true
|
|
73
|
+
# config.remove_unused_tags = true
|
|
74
|
+
# end
|
|
75
|
+
#
|
|
43
76
|
def self.setup
|
|
44
77
|
@configuration ||= Configuration.new
|
|
45
78
|
yield @configuration if block_given?
|
|
46
79
|
end
|
|
47
80
|
|
|
81
|
+
##
|
|
82
|
+
# Forwards unknown calls to the configuration, so every setting can be read and written directly
|
|
83
|
+
# on `MakeTaggable` as well as inside a {setup} block.
|
|
84
|
+
#
|
|
85
|
+
# @param method_name [Symbol] the configuration reader or writer
|
|
86
|
+
# @param args [Array<Object>] arguments forwarded to the configuration
|
|
87
|
+
# @return [Object] whatever the configuration returns
|
|
88
|
+
# @raise [NoMethodError] when the configuration has no such setting
|
|
89
|
+
#
|
|
90
|
+
# @example
|
|
91
|
+
# MakeTaggable.force_lowercase = true
|
|
92
|
+
# MakeTaggable.force_lowercase # => true
|
|
93
|
+
#
|
|
48
94
|
def self.method_missing(method_name, *args, &block)
|
|
49
95
|
if @configuration.respond_to?(method_name)
|
|
50
96
|
@configuration.send(method_name, *args, &block)
|
|
@@ -53,16 +99,70 @@ module MakeTaggable
|
|
|
53
99
|
end
|
|
54
100
|
end
|
|
55
101
|
|
|
102
|
+
##
|
|
103
|
+
# Reports the configuration's settings as available on `MakeTaggable` itself.
|
|
104
|
+
#
|
|
105
|
+
# @param method_name [Symbol] the method being tested
|
|
106
|
+
# @param include_private [TrueClass, FalseClass] whether private methods count
|
|
107
|
+
# @return [TrueClass, FalseClass]
|
|
108
|
+
#
|
|
56
109
|
def self.respond_to_missing?(method_name, include_private = false)
|
|
57
|
-
@configuration.respond_to?
|
|
110
|
+
@configuration.respond_to?(method_name, include_private) || super
|
|
58
111
|
end
|
|
59
112
|
|
|
113
|
+
##
|
|
114
|
+
# The string used to join tags back together for display, derived from the configured delimiter.
|
|
115
|
+
#
|
|
116
|
+
# A trailing space is added when the delimiter does not already end in one, so a comma delimiter
|
|
117
|
+
# renders as `"one, two"` rather than `"one,two"`. When several delimiters are configured the
|
|
118
|
+
# first is used.
|
|
119
|
+
#
|
|
120
|
+
# @return [String] the delimiter, guaranteed to end in a space
|
|
121
|
+
#
|
|
122
|
+
# @example
|
|
123
|
+
# MakeTaggable.glue # => ", "
|
|
124
|
+
#
|
|
60
125
|
def self.glue
|
|
61
126
|
setting = @configuration.delimiter
|
|
62
127
|
delimiter = setting.is_a?(Array) ? setting[0] : setting
|
|
63
128
|
delimiter.end_with?(" ") ? delimiter : "#{delimiter} "
|
|
64
129
|
end
|
|
65
130
|
|
|
131
|
+
##
|
|
132
|
+
# The library's settings.
|
|
133
|
+
#
|
|
134
|
+
# Reach these through {MakeTaggable.setup} or directly on `MakeTaggable`, which forwards to the
|
|
135
|
+
# single instance held here.
|
|
136
|
+
#
|
|
137
|
+
# @!attribute [rw] force_lowercase
|
|
138
|
+
# Whether tag names are downcased before they are saved.
|
|
139
|
+
# @return [TrueClass, FalseClass] defaults to `false`
|
|
140
|
+
# @!attribute [rw] force_parameterize
|
|
141
|
+
# Whether tag names are parameterized before they are saved.
|
|
142
|
+
# @return [TrueClass, FalseClass] defaults to `false`
|
|
143
|
+
# @!attribute [rw] remove_unused_tags
|
|
144
|
+
# Whether a tag row is destroyed once its last tagging goes away. Requires `tags_counter`.
|
|
145
|
+
# @return [TrueClass, FalseClass] defaults to `false`
|
|
146
|
+
# @!attribute [rw] default_parser
|
|
147
|
+
# The class used to turn tag input into a {MakeTaggable::TagList}.
|
|
148
|
+
# @return [Class] defaults to {MakeTaggable::DefaultParser}
|
|
149
|
+
# @!attribute [rw] tags_counter
|
|
150
|
+
# Whether taggings maintain a counter cache on their tag.
|
|
151
|
+
# @return [TrueClass, FalseClass] defaults to `true`
|
|
152
|
+
# @!attribute [rw] tags_table
|
|
153
|
+
# The table backing {MakeTaggable::Tag}.
|
|
154
|
+
# @return [Symbol, String] defaults to `:tags`
|
|
155
|
+
# @!attribute [rw] taggings_table
|
|
156
|
+
# The table backing {MakeTaggable::Tagging}.
|
|
157
|
+
# @return [Symbol, String] defaults to `:taggings`
|
|
158
|
+
# @!attribute [r] delimiter
|
|
159
|
+
# The delimiter, or delimiters, separating tags in a string. Metacharacters are escaped, so
|
|
160
|
+
# each one is matched literally.
|
|
161
|
+
# @return [String, Array<String>] defaults to `","`
|
|
162
|
+
# @!attribute [r] strict_case_match
|
|
163
|
+
# Whether tag lookups are case sensitive.
|
|
164
|
+
# @return [TrueClass, FalseClass] defaults to `false`
|
|
165
|
+
#
|
|
66
166
|
class Configuration
|
|
67
167
|
attr_accessor :force_lowercase, :force_parameterize,
|
|
68
168
|
:remove_unused_tags, :default_parser,
|
|
@@ -70,6 +170,11 @@ module MakeTaggable
|
|
|
70
170
|
:taggings_table
|
|
71
171
|
attr_reader :delimiter, :strict_case_match
|
|
72
172
|
|
|
173
|
+
##
|
|
174
|
+
# Builds the configuration with the library's defaults.
|
|
175
|
+
#
|
|
176
|
+
# @return [MakeTaggable::Configuration]
|
|
177
|
+
#
|
|
73
178
|
def initialize
|
|
74
179
|
@delimiter = ","
|
|
75
180
|
@force_lowercase = false
|
|
@@ -83,19 +188,49 @@ module MakeTaggable
|
|
|
83
188
|
@taggings_table = :taggings
|
|
84
189
|
end
|
|
85
190
|
|
|
191
|
+
##
|
|
192
|
+
# Sets whether tag lookups are case sensitive.
|
|
193
|
+
#
|
|
194
|
+
# Ignored while {#force_binary_collation=} is on, which already implies case sensitivity.
|
|
195
|
+
#
|
|
196
|
+
# @param force_cs [TrueClass, FalseClass] whether to match case exactly
|
|
197
|
+
# @return [TrueClass, FalseClass]
|
|
198
|
+
#
|
|
86
199
|
def strict_case_match=(force_cs)
|
|
87
200
|
@strict_case_match = force_cs unless @force_binary_collation
|
|
88
201
|
end
|
|
89
202
|
|
|
203
|
+
##
|
|
204
|
+
# Sets the delimiter separating tags in a string.
|
|
205
|
+
#
|
|
206
|
+
# @deprecated Configure a {#default_parser} instead. This will be removed in a future release.
|
|
207
|
+
#
|
|
208
|
+
# @param string [String, Array<String>] one delimiter, or several
|
|
209
|
+
# @return [String, Array<String>]
|
|
210
|
+
#
|
|
211
|
+
# @example Several delimiters, matched literally
|
|
212
|
+
# MakeTaggable.delimiter = [",", "|"]
|
|
213
|
+
#
|
|
90
214
|
def delimiter=(string)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
215
|
+
# Active Record does not always have a logger -- a plain Active Record
|
|
216
|
+
# process, or an initializer running before the logger is assigned, will
|
|
217
|
+
# both leave it nil.
|
|
218
|
+
ActiveRecord::Base.logger&.warn(
|
|
219
|
+
"MakeTaggable.delimiter is deprecated and will be removed in a future " \
|
|
220
|
+
"release. Configure a MakeTaggable.default_parser instead."
|
|
221
|
+
)
|
|
96
222
|
@delimiter = string
|
|
97
223
|
end
|
|
98
224
|
|
|
225
|
+
##
|
|
226
|
+
# Switches the MySQL tag name column between a binary and a case-insensitive collation.
|
|
227
|
+
#
|
|
228
|
+
# A binary collation makes tag names compare exactly, including accented and other multi-byte
|
|
229
|
+
# characters, and forces {#strict_case_match} on. Does nothing on other adapters.
|
|
230
|
+
#
|
|
231
|
+
# @param force_bin [TrueClass, FalseClass] whether to apply the binary collation
|
|
232
|
+
# @return [TrueClass, FalseClass]
|
|
233
|
+
#
|
|
99
234
|
def force_binary_collation=(force_bin)
|
|
100
235
|
if Utils.using_mysql?
|
|
101
236
|
if force_bin
|
|
@@ -109,6 +244,16 @@ module MakeTaggable
|
|
|
109
244
|
end
|
|
110
245
|
end
|
|
111
246
|
|
|
247
|
+
##
|
|
248
|
+
# Alters the MySQL tag name column to the requested collation.
|
|
249
|
+
#
|
|
250
|
+
# Failures are reported rather than raised: the column does not exist yet the first time the
|
|
251
|
+
# migrations run, and that is not an error.
|
|
252
|
+
#
|
|
253
|
+
# @param bincoll [TrueClass, FalseClass] `true` for `utf8mb4_bin`, `false` for
|
|
254
|
+
# `utf8mb4_general_ci`
|
|
255
|
+
# @return [NilClass]
|
|
256
|
+
#
|
|
112
257
|
def self.apply_binary_collation(bincoll)
|
|
113
258
|
if Utils.using_mysql?
|
|
114
259
|
coll = "utf8mb4_general_ci"
|
data/make_taggable.gemspec
CHANGED
|
@@ -6,37 +6,30 @@ Gem::Specification.new do |spec|
|
|
|
6
6
|
spec.authors = ["Matthew Kennedy", "Michael Bleigh", "Joost Baaij"]
|
|
7
7
|
spec.email = %w[m.kennedy@me.com]
|
|
8
8
|
|
|
9
|
-
spec.required_ruby_version = ">= 2
|
|
9
|
+
spec.required_ruby_version = ">= 3.2"
|
|
10
10
|
|
|
11
11
|
spec.summary = "Advanced Tagging For Rails"
|
|
12
|
-
spec.description = "MakeTaggable
|
|
12
|
+
spec.description = "MakeTaggable lets Active Record models carry tags across any number of " \
|
|
13
|
+
"named contexts, with ownership, ordering, custom parsers and tag-cloud calculations."
|
|
13
14
|
|
|
14
15
|
spec.homepage = "https://github.com/MatthewKennedy/make_taggable"
|
|
15
16
|
spec.license = "MIT"
|
|
16
17
|
|
|
17
|
-
spec.metadata["homepage_uri"] = spec.homepage
|
|
18
18
|
spec.metadata["source_code_uri"] = spec.homepage
|
|
19
|
-
spec.metadata["changelog_uri"] = "
|
|
20
|
-
|
|
21
|
-
spec.
|
|
22
|
-
|
|
19
|
+
spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"
|
|
20
|
+
spec.metadata["bug_tracker_uri"] = "#{spec.homepage}/issues"
|
|
21
|
+
spec.metadata["documentation_uri"] = "#{spec.homepage}/blob/master/docs"
|
|
22
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
|
23
|
+
|
|
24
|
+
spec.files = Dir.chdir(__dir__) do
|
|
25
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
|
26
|
+
f.match(%r{\A(spec|gemfiles|\.github)/}) || f.match(%r{\A(\.|Appraisals|Rakefile|Gemfile)})
|
|
27
|
+
end
|
|
23
28
|
end
|
|
24
29
|
|
|
25
|
-
spec.bindir = "exe"
|
|
26
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
27
30
|
spec.require_paths = ["lib"]
|
|
28
31
|
|
|
29
|
-
spec.add_dependency "activerecord", ">=
|
|
30
|
-
|
|
31
|
-
spec.add_development_dependency "rails", ">= 5.2.0", "<= 7.5.0"
|
|
32
|
-
spec.add_development_dependency "appraisal", "~> 2.3.0"
|
|
33
|
-
spec.add_development_dependency "mysql2", "~> 0.5.0"
|
|
34
|
-
spec.add_development_dependency "pg", "~> 1.2.0"
|
|
35
|
-
spec.add_development_dependency "rspec", "~> 3.10.0"
|
|
36
|
-
spec.add_development_dependency "rspec-rails", "~> 4.0.0"
|
|
37
|
-
spec.add_development_dependency "standard", "~> 0.10.0"
|
|
38
|
-
spec.add_development_dependency "sqlite3", "~> 1.4.0"
|
|
39
|
-
spec.add_development_dependency "rails-dummy", "~> 0.1.0"
|
|
32
|
+
spec.add_dependency "activerecord", ">= 7.2"
|
|
40
33
|
|
|
41
34
|
if File.exist?("UPGRADING.md")
|
|
42
35
|
spec.post_install_message = File.read("UPGRADING.md")
|
metadata
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: make_taggable
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matthew Kennedy
|
|
8
8
|
- Michael Bleigh
|
|
9
9
|
- Joost Baaij
|
|
10
|
-
|
|
11
|
-
bindir: exe
|
|
10
|
+
bindir: bin
|
|
12
11
|
cert_chain: []
|
|
13
|
-
date:
|
|
12
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
14
13
|
dependencies:
|
|
15
14
|
- !ruby/object:Gem::Dependency
|
|
16
15
|
name: activerecord
|
|
@@ -18,173 +17,27 @@ dependencies:
|
|
|
18
17
|
requirements:
|
|
19
18
|
- - ">="
|
|
20
19
|
- !ruby/object:Gem::Version
|
|
21
|
-
version:
|
|
22
|
-
- - "<="
|
|
23
|
-
- !ruby/object:Gem::Version
|
|
24
|
-
version: 7.5.0
|
|
20
|
+
version: '7.2'
|
|
25
21
|
type: :runtime
|
|
26
22
|
prerelease: false
|
|
27
23
|
version_requirements: !ruby/object:Gem::Requirement
|
|
28
24
|
requirements:
|
|
29
25
|
- - ">="
|
|
30
26
|
- !ruby/object:Gem::Version
|
|
31
|
-
version:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
version: 7.5.0
|
|
35
|
-
- !ruby/object:Gem::Dependency
|
|
36
|
-
name: rails
|
|
37
|
-
requirement: !ruby/object:Gem::Requirement
|
|
38
|
-
requirements:
|
|
39
|
-
- - ">="
|
|
40
|
-
- !ruby/object:Gem::Version
|
|
41
|
-
version: 5.2.0
|
|
42
|
-
- - "<="
|
|
43
|
-
- !ruby/object:Gem::Version
|
|
44
|
-
version: 7.5.0
|
|
45
|
-
type: :development
|
|
46
|
-
prerelease: false
|
|
47
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
48
|
-
requirements:
|
|
49
|
-
- - ">="
|
|
50
|
-
- !ruby/object:Gem::Version
|
|
51
|
-
version: 5.2.0
|
|
52
|
-
- - "<="
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: 7.5.0
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: appraisal
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - "~>"
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: 2.3.0
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - "~>"
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: 2.3.0
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: mysql2
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - "~>"
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: 0.5.0
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - "~>"
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: 0.5.0
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: pg
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - "~>"
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: 1.2.0
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - "~>"
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: 1.2.0
|
|
97
|
-
- !ruby/object:Gem::Dependency
|
|
98
|
-
name: rspec
|
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
|
100
|
-
requirements:
|
|
101
|
-
- - "~>"
|
|
102
|
-
- !ruby/object:Gem::Version
|
|
103
|
-
version: 3.10.0
|
|
104
|
-
type: :development
|
|
105
|
-
prerelease: false
|
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
-
requirements:
|
|
108
|
-
- - "~>"
|
|
109
|
-
- !ruby/object:Gem::Version
|
|
110
|
-
version: 3.10.0
|
|
111
|
-
- !ruby/object:Gem::Dependency
|
|
112
|
-
name: rspec-rails
|
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
|
114
|
-
requirements:
|
|
115
|
-
- - "~>"
|
|
116
|
-
- !ruby/object:Gem::Version
|
|
117
|
-
version: 4.0.0
|
|
118
|
-
type: :development
|
|
119
|
-
prerelease: false
|
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
-
requirements:
|
|
122
|
-
- - "~>"
|
|
123
|
-
- !ruby/object:Gem::Version
|
|
124
|
-
version: 4.0.0
|
|
125
|
-
- !ruby/object:Gem::Dependency
|
|
126
|
-
name: standard
|
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
|
128
|
-
requirements:
|
|
129
|
-
- - "~>"
|
|
130
|
-
- !ruby/object:Gem::Version
|
|
131
|
-
version: 0.10.0
|
|
132
|
-
type: :development
|
|
133
|
-
prerelease: false
|
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
-
requirements:
|
|
136
|
-
- - "~>"
|
|
137
|
-
- !ruby/object:Gem::Version
|
|
138
|
-
version: 0.10.0
|
|
139
|
-
- !ruby/object:Gem::Dependency
|
|
140
|
-
name: sqlite3
|
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
|
142
|
-
requirements:
|
|
143
|
-
- - "~>"
|
|
144
|
-
- !ruby/object:Gem::Version
|
|
145
|
-
version: 1.4.0
|
|
146
|
-
type: :development
|
|
147
|
-
prerelease: false
|
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
-
requirements:
|
|
150
|
-
- - "~>"
|
|
151
|
-
- !ruby/object:Gem::Version
|
|
152
|
-
version: 1.4.0
|
|
153
|
-
- !ruby/object:Gem::Dependency
|
|
154
|
-
name: rails-dummy
|
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
|
156
|
-
requirements:
|
|
157
|
-
- - "~>"
|
|
158
|
-
- !ruby/object:Gem::Version
|
|
159
|
-
version: 0.1.0
|
|
160
|
-
type: :development
|
|
161
|
-
prerelease: false
|
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
-
requirements:
|
|
164
|
-
- - "~>"
|
|
165
|
-
- !ruby/object:Gem::Version
|
|
166
|
-
version: 0.1.0
|
|
167
|
-
description: MakeTaggable is a fork of Acts-As-Taggable-On with code updates & fresh
|
|
168
|
-
migrations
|
|
27
|
+
version: '7.2'
|
|
28
|
+
description: MakeTaggable lets Active Record models carry tags across any number of
|
|
29
|
+
named contexts, with ownership, ordering, custom parsers and tag-cloud calculations.
|
|
169
30
|
email:
|
|
170
31
|
- m.kennedy@me.com
|
|
171
32
|
executables: []
|
|
172
33
|
extensions: []
|
|
173
34
|
extra_rdoc_files: []
|
|
174
35
|
files:
|
|
175
|
-
- ".dummyrc"
|
|
176
|
-
- ".github/workflows/ci.yml"
|
|
177
|
-
- ".github/workflows/standard-ci.yml"
|
|
178
|
-
- ".gitignore"
|
|
179
|
-
- ".rspec"
|
|
180
|
-
- Appraisals
|
|
181
36
|
- CHANGELOG.md
|
|
182
37
|
- CODE_OF_CONDUCT.md
|
|
183
38
|
- CONTRIBUTING.md
|
|
184
|
-
- Gemfile
|
|
185
39
|
- LICENSE.md
|
|
186
40
|
- README.md
|
|
187
|
-
- Rakefile
|
|
188
41
|
- UPGRADING.md
|
|
189
42
|
- bin/console
|
|
190
43
|
- bin/setup
|
|
@@ -193,10 +46,16 @@ files:
|
|
|
193
46
|
- db/migrate/3_change_tag_name_collation_mysql.rb
|
|
194
47
|
- db/migrate/4_add_index_to_tags.rb
|
|
195
48
|
- db/migrate/5_add_index_to_taggings.rb
|
|
196
|
-
-
|
|
197
|
-
-
|
|
198
|
-
-
|
|
199
|
-
-
|
|
49
|
+
- docs/caching.md
|
|
50
|
+
- docs/configuration.md
|
|
51
|
+
- docs/contexts.md
|
|
52
|
+
- docs/database.md
|
|
53
|
+
- docs/getting-started.md
|
|
54
|
+
- docs/migrating-from-aato.md
|
|
55
|
+
- docs/ownership.md
|
|
56
|
+
- docs/parsers.md
|
|
57
|
+
- docs/querying.md
|
|
58
|
+
- docs/tag-clouds.md
|
|
200
59
|
- lib/make_taggable.rb
|
|
201
60
|
- lib/make_taggable/default_parser.rb
|
|
202
61
|
- lib/make_taggable/engine.rb
|
|
@@ -220,22 +79,49 @@ files:
|
|
|
220
79
|
- lib/make_taggable/tags_helper.rb
|
|
221
80
|
- lib/make_taggable/utils.rb
|
|
222
81
|
- lib/make_taggable/version.rb
|
|
223
|
-
- lib/tasks/setup_test_db.rake
|
|
224
82
|
- lib/tasks/tags_collate_utf8.rake
|
|
225
83
|
- make_taggable.gemspec
|
|
226
84
|
homepage: https://github.com/MatthewKennedy/make_taggable
|
|
227
85
|
licenses:
|
|
228
86
|
- MIT
|
|
229
87
|
metadata:
|
|
230
|
-
homepage_uri: https://github.com/MatthewKennedy/make_taggable
|
|
231
88
|
source_code_uri: https://github.com/MatthewKennedy/make_taggable
|
|
232
89
|
changelog_uri: https://github.com/MatthewKennedy/make_taggable/blob/master/CHANGELOG.md
|
|
90
|
+
bug_tracker_uri: https://github.com/MatthewKennedy/make_taggable/issues
|
|
91
|
+
documentation_uri: https://github.com/MatthewKennedy/make_taggable/blob/master/docs
|
|
92
|
+
rubygems_mfa_required: 'true'
|
|
233
93
|
post_install_message: |
|
|
234
|
-
|
|
94
|
+
Upgrading to MakeTaggable 1.0
|
|
95
|
+
|
|
96
|
+
This release renames the declaration methods and changes how delimiters are escaped.
|
|
97
|
+
|
|
98
|
+
1. Rename the declarations in your models:
|
|
99
|
+
|
|
100
|
+
acts_as_taggable -> make_taggable
|
|
101
|
+
acts_as_taggable_on :skills -> make_taggable :skills
|
|
102
|
+
acts_as_ordered_taggable -> make_ordered_taggable
|
|
103
|
+
acts_as_ordered_taggable_on :skills -> make_ordered_taggable :skills
|
|
104
|
+
acts_as_tagger -> make_tagger
|
|
105
|
+
|
|
106
|
+
Everything generated per context keeps its name: skill_list, skills,
|
|
107
|
+
skill_counts, top_skills, skills_from, find_related_skills.
|
|
108
|
+
|
|
109
|
+
2. If you configure a delimiter containing a regular expression
|
|
110
|
+
metacharacter, unescape it. Delimiters are now literal strings:
|
|
111
|
+
|
|
112
|
+
MakeTaggable.delimiter = ['\|'] -> MakeTaggable.delimiter = ["|"]
|
|
113
|
+
|
|
114
|
+
3. If you rely on `make_taggable` with no arguments adding no contexts,
|
|
115
|
+
note that it now tags on :tags.
|
|
116
|
+
|
|
117
|
+
4. Requirements are now Ruby 3.2 and Active Record 7.2 or newer.
|
|
118
|
+
|
|
119
|
+
Install any new migrations:
|
|
235
120
|
|
|
236
121
|
rails make_taggable_engine:install:migrations
|
|
122
|
+
rails db:migrate
|
|
237
123
|
|
|
238
|
-
|
|
124
|
+
Full notes: https://github.com/MatthewKennedy/make_taggable/blob/master/CHANGELOG.md
|
|
239
125
|
rdoc_options: []
|
|
240
126
|
require_paths:
|
|
241
127
|
- lib
|
|
@@ -243,15 +129,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
243
129
|
requirements:
|
|
244
130
|
- - ">="
|
|
245
131
|
- !ruby/object:Gem::Version
|
|
246
|
-
version: '2
|
|
132
|
+
version: '3.2'
|
|
247
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
248
134
|
requirements:
|
|
249
135
|
- - ">="
|
|
250
136
|
- !ruby/object:Gem::Version
|
|
251
137
|
version: '0'
|
|
252
138
|
requirements: []
|
|
253
|
-
rubygems_version: 3.
|
|
254
|
-
signing_key:
|
|
139
|
+
rubygems_version: 3.6.9
|
|
255
140
|
specification_version: 4
|
|
256
141
|
summary: Advanced Tagging For Rails
|
|
257
142
|
test_files: []
|
data/.dummyrc
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
--skip-bootsnap
|
|
2
|
-
--skip-webpack
|
|
3
|
-
--skip-action-cable
|
|
4
|
-
--skip-spring
|
|
5
|
-
--skip-coffee
|
|
6
|
-
--skip-turbolinks
|
|
7
|
-
--skip-listen
|
|
8
|
-
--skip-action-text
|
|
9
|
-
--skip-active-storage
|
|
10
|
-
--skip-action-cable
|
|
11
|
-
--skip-action-mailer
|
|
12
|
-
--skip-action-mailbox
|
|
13
|
-
--skip-active-job
|
|
14
|
-
--skip-javascript
|
|
15
|
-
--skip-test
|
|
16
|
-
|
|
17
|
-
--template=spec/template/test_app_template.rb
|