acts-as-taggable-on-mongoid 6.0.1.2 → 6.0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8d93a7c1beb5fbe71abb708118e35b734203691f
4
- data.tar.gz: 6ae2ad0b0060b5265c879338aa26d4684d551a26
3
+ metadata.gz: c13fda8fcc653c6f63e06b5cede43f5981330550
4
+ data.tar.gz: 0e29ec9543e00254f4b495b40ff6f2499c8cb0cd
5
5
  SHA512:
6
- metadata.gz: e5ac3c342c801316fb57ace4fc70f143db77c1204ace3cc3ee7a192de608e64dd5d2737afa9bd6284a355719dda04d34d474105410ee3b07947df895d61de2cb
7
- data.tar.gz: 13f2f14dd4cda732d427f4e0c71f3eaf8efacbaa9a8bc74417fbf7ad68edb1a0b9e72523ee9d3e26552682d9ed7c1045f63548e0b790384c658e03d9c8267658
6
+ metadata.gz: eb149028e0ba4adc52119f84059fbb8afd5090f14d1812895b69b01697df8603c93b392982dd1c766adc34da443059820c22ce34ef392e3b04906f21242d5fbf
7
+ data.tar.gz: 2e07b06e928dacc5d88a409f5fb8985b3a5f032a5422ba2ec4e30930baf2bfb03ee6bffedce2f6625edd4281f2811ffb71cb9af7b204cd4c9f35aef9c52f8cf2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- acts-as-taggable-on-mongoid (6.0.1.2)
4
+ acts-as-taggable-on-mongoid (6.0.1.3)
5
5
  activesupport (~> 4.2)
6
6
  mongoid (~> 5.2)
7
7
 
@@ -38,7 +38,7 @@ GEM
38
38
  descendants_tracker (~> 0.0.1)
39
39
  colorize (0.8.1)
40
40
  concurrent-ruby (1.0.5)
41
- cornucopia (0.1.53)
41
+ cornucopia (0.1.55)
42
42
  activesupport (< 5.0)
43
43
  database_cleaner (1.7.0)
44
44
  descendants_tracker (0.0.4)
@@ -74,7 +74,7 @@ GEM
74
74
  tzinfo (>= 0.3.37)
75
75
  multi_xml (0.6.0)
76
76
  multipart-post (2.0.0)
77
- octokit (4.11.0)
77
+ octokit (4.12.0)
78
78
  sawyer (~> 0.8.0, >= 0.5.3)
79
79
  origin (2.3.1)
80
80
  parallel (1.12.1)
@@ -138,7 +138,7 @@ GEM
138
138
  rspec-support (3.8.0)
139
139
  rspec_junit_formatter (0.3.0)
140
140
  rspec-core (>= 2, < 4, != 2.12.0)
141
- rubocop (0.59.0)
141
+ rubocop (0.59.1)
142
142
  jaro_winkler (~> 1.5.1)
143
143
  parallel (~> 1.10)
144
144
  parser (>= 2.5, != 2.5.1.1)
@@ -48,6 +48,22 @@ module ActsAsTaggableOnMongoid
48
48
 
49
49
  autoload :Taggable
50
50
 
51
+ autoload_under "models/concerns" do
52
+ autoload :TagFields
53
+ autoload :TagAssociations
54
+ autoload :TagValidations
55
+ autoload :TagScopes
56
+ autoload :TagMethods
57
+ autoload :TagModel
58
+
59
+ autoload :TaggingFields
60
+ autoload :TaggingAssociations
61
+ autoload :TaggingValidations
62
+ autoload :TaggingScopes
63
+ autoload :TaggingMethods
64
+ autoload :TaggingModel
65
+ end
66
+
51
67
  autoload_under :Models do
52
68
  autoload :Tag
53
69
  autoload :Tagging
@@ -0,0 +1,15 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ module TagAssociations
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ ### ASSOCIATIONS:
9
+
10
+ has_many :taggings, dependent: :destroy, class_name: "ActsAsTaggableOnMongoid::Models::Tagging"
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ module TagFields
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include Mongoid::Document
9
+ include Mongoid::Timestamps
10
+
11
+ field :name, type: String
12
+ field :taggings_count, type: Integer, default: 0
13
+ field :context, type: String
14
+ field :taggable_type, type: String
15
+
16
+ # field :type, type: String
17
+
18
+ index({ name: 1, taggable_type: 1, context: 1 }, unique: true)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,67 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ module TagMethods
5
+ extend ActiveSupport::Concern
6
+
7
+ ### CLASS METHODS:
8
+
9
+ class_methods do
10
+ def find_or_create_all_with_like_by_name(tag_definition, *list)
11
+ list = ActsAsTaggableOnMongoid::TagList.new(tag_definition, *Array.wrap(list).flatten)
12
+
13
+ return [] if list.empty?
14
+
15
+ list.map do |tag_name|
16
+ begin
17
+ tries ||= 3
18
+
19
+ existing_tag = tag_definition.tags_table.for_tag(tag_definition).named(tag_name).first
20
+
21
+ existing_tag || create_tag(tag_definition, tag_name)
22
+ rescue Mongoid::Errors::Validations
23
+ # :nocov:
24
+ if (tries -= 1).positive?
25
+ retry
26
+ end
27
+
28
+ raise ActsAsTaggableOnMongoid::Errors::DuplicateTagError.new, "'#{tag_name}' has already been taken"
29
+ # :nocov:
30
+ end
31
+ end
32
+ end
33
+
34
+ def create_tag(tag_definition, name)
35
+ tag_definition.tags_table.create(name: name,
36
+ context: tag_definition.tag_type,
37
+ taggable_type: tag_definition.owner.name)
38
+ end
39
+
40
+ def as_8bit_ascii(string)
41
+ string = string.to_s
42
+ if defined?(Encoding)
43
+ string.dup.force_encoding("BINARY")
44
+ else
45
+ # :nocov:
46
+ string.mb_chars
47
+ # :nocov:
48
+ end
49
+ end
50
+ end
51
+
52
+ ### INSTANCE METHODS:
53
+
54
+ def ==(other)
55
+ super || (other.class == self.class &&
56
+ name == other.name &&
57
+ context == other.context &&
58
+ taggable_type == other.taggable_type)
59
+ end
60
+
61
+ def to_s
62
+ name
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,17 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ module TagModel
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include ActsAsTaggableOnMongoid::Models::Concerns::TagFields
9
+ include ActsAsTaggableOnMongoid::Models::Concerns::TagMethods
10
+ include ActsAsTaggableOnMongoid::Models::Concerns::TagAssociations
11
+ include ActsAsTaggableOnMongoid::Models::Concerns::TagValidations
12
+ include ActsAsTaggableOnMongoid::Models::Concerns::TagScopes
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ module TagScopes
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ ### SCOPES:
9
+ scope :most_used, ->(limit = 20) { order("taggings_count desc").limit(limit) }
10
+ scope :least_used, ->(limit = 20) { order("taggings_count asc").limit(limit) }
11
+
12
+ scope :named, ->(name) { where(name: as_8bit_ascii(name)) }
13
+ scope :named_any, ->(*names) { where(:name.in => names.map { |name| as_8bit_ascii(name) }) }
14
+ scope :named_like, ->(name) { where(name: /#{as_8bit_ascii(name)}/i) }
15
+ scope :named_like_any, ->(*names) { where(:name.in => names.map { |name| /#{as_8bit_ascii(name)}/i }) }
16
+ scope :for_context, ->(context) { where(context: context) }
17
+ scope :for_taggable_class, ->(taggable_type) { where(taggable_type: taggable_type.name) }
18
+ scope :for_tag, ->(tag_definition) { for_taggable_class(tag_definition.owner).for_context(tag_definition.tag_type) }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ module TagValidations
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ ### VALIDATIONS:
9
+
10
+ validates :name, presence: true
11
+ validates :context, presence: true
12
+ validates :taggable_type, presence: true
13
+ validates :name, uniqueness: { scope: %i[context taggable_type] }
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ module TaggingAssociations
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ belongs_to :tag, counter_cache: true, inverse_of: :taggings
9
+ belongs_to :taggable, polymorphic: true
10
+ # belongs_to :tagger, { polymorphic: true, optional: true }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ module TaggingFields
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include Mongoid::Document
9
+ include Mongoid::Timestamps
10
+
11
+ field :tag_name, type: String
12
+ field :context, type: String
13
+
14
+ # If/when adding the concept of a tagger, this index will need to be changed.
15
+ index({ taggable_id: 1, taggable_type: 1, context: 1, tag_name: 1 }, unique: true, name: "tagging_taggable_context_tag_name")
16
+ index(tag_name: 1)
17
+ index(tag_id: 1, tag_type: 1)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,51 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ # This module includes the methods and callbacks needed/used by a Tagging model
5
+ module TaggingMethods
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ after_save :tagging_saved
10
+ after_destroy :tagging_destroyed
11
+ after_destroy :remove_unused_tags
12
+ end
13
+
14
+ ### INSTANCE METHODS:
15
+
16
+ private
17
+
18
+ def remove_unused_tags
19
+ return nil unless taggable
20
+
21
+ tag_definition = taggable.tag_types[context]
22
+
23
+ return unless tag_definition&.remove_unused_tags?
24
+
25
+ tag.destroy if tag.reload.taggings_count.zero?
26
+ end
27
+
28
+ def tagging_saved
29
+ tag_definition = taggable.tag_types[context]
30
+
31
+ return unless tag_definition
32
+
33
+ tag_list = taggable.public_send(tag_definition.tag_list_name)
34
+ tag_list.add_tagging(self)
35
+ end
36
+
37
+ def tagging_destroyed
38
+ taggable_was = taggable_type_was.constantize.where(id: taggable_id_was).first
39
+
40
+ return unless taggable_was
41
+
42
+ tag_definition = taggable_was.tag_types[context_was]
43
+
44
+ return unless tag_definition
45
+
46
+ taggable_was.public_send(tag_definition.tag_list_name).remove(tag_name_was)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,25 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ # This module includes all methods and defintions needed/used by a Tagging model.
5
+ #
6
+ # Tagging model definitions are done via including this or the sub-modules so that
7
+ # the definitions of the core attributes for a Tagging model can be defined in each
8
+ # class separately.
9
+ #
10
+ # The primary reason for doing this is validations, which call the superclass validations
11
+ # for classes that inherit causing problems with independent inherted classes.
12
+ module TaggingModel
13
+ extend ActiveSupport::Concern
14
+
15
+ included do
16
+ include ActsAsTaggableOnMongoid::Models::Concerns::TaggingFields
17
+ include ActsAsTaggableOnMongoid::Models::Concerns::TaggingMethods
18
+ include ActsAsTaggableOnMongoid::Models::Concerns::TaggingAssociations
19
+ include ActsAsTaggableOnMongoid::Models::Concerns::TaggingValidations
20
+ include ActsAsTaggableOnMongoid::Models::Concerns::TaggingScopes
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ # This module includes the scopes needed/used by a Tagging model
5
+ module TaggingScopes
6
+ extend ActiveSupport::Concern
7
+
8
+ DEFAULT_CONTEXT = "tags"
9
+
10
+ included do
11
+ # scope :owned_by, ->(owner) { where(tagger: owner) }
12
+ # scope :not_owned, -> { where(tagger_id: nil, tagger_type: nil) }
13
+
14
+ scope :by_contexts, ->(*contexts) { where(:context.in => Array.wrap(contexts.presence || DEFAULT_CONTEXT)) }
15
+ scope :by_context, ->(context = DEFAULT_CONTEXT) { by_contexts(context.to_s) }
16
+ scope :for_tag, ->(tag_definition) { where(taggable_type: tag_definition.owner.name).by_context(tag_definition.tag_type) }
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ module ActsAsTaggableOnMongoid
2
+ module Models
3
+ module Concerns
4
+ # This module includes the validations needed/used by a Tagging model
5
+ module TaggingValidations
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ validates :tag_name, presence: true
10
+ validates :context, presence: true
11
+ validates :tag, presence: true
12
+ validates :taggable, presence: true
13
+
14
+ # validates :tag_id, uniqueness: {scope: [:taggable_type, :taggable_id, :context, :tagger_id, :tagger_type]}
15
+ validates :tag_name, uniqueness: { scope: %i[taggable_type taggable_id context] }
16
+ # validates :tag_id, uniqueness: {scope: [:taggable_type, :taggable_id, :context, :tagger_id, :tagger_type]}
17
+ validates :tag_id, uniqueness: { scope: %i[taggable_type taggable_id context] }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -4,100 +4,7 @@ module ActsAsTaggableOnMongoid
4
4
  module Models
5
5
  # A class representing all tags that have ever been set on a model.
6
6
  class Tag
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
-
10
- field :name, type: String
11
- field :taggings_count, type: Integer, default: 0
12
- field :context, type: String
13
- field :taggable_type, type: String
14
-
15
- # field :type, type: String
16
-
17
- index({ name: 1, taggable_type: 1, context: 1 }, unique: true)
18
-
19
- ### ASSOCIATIONS:
20
-
21
- has_many :taggings, dependent: :destroy, class_name: "ActsAsTaggableOnMongoid::Models::Tagging"
22
-
23
- ### VALIDATIONS:
24
-
25
- validates :name, presence: true
26
- validates :context, presence: true
27
- validates :taggable_type, presence: true
28
- validates :name, uniqueness: { scope: %i[context taggable_type] }
29
-
30
- ### SCOPES:
31
- scope :most_used, ->(limit = 20) { order("taggings_count desc").limit(limit) }
32
- scope :least_used, ->(limit = 20) { order("taggings_count asc").limit(limit) }
33
-
34
- scope :named, ->(name) { where(name: as_8bit_ascii(name)) }
35
- scope :named_any, ->(*names) { where(:name.in => names.map { |name| as_8bit_ascii(name) }) }
36
- scope :named_like, ->(name) { where(name: /#{as_8bit_ascii(name)}/i) }
37
- scope :named_like_any, ->(*names) { where(:name.in => names.map { |name| /#{as_8bit_ascii(name)}/i }) }
38
- scope :for_context, ->(context) { where(context: context) }
39
- scope :for_taggable_class, ->(taggable_type) { where(taggable_type: taggable_type.name) }
40
- scope :for_tag, ->(tag_definition) { for_taggable_class(tag_definition.owner).for_context(tag_definition.tag_type) }
41
-
42
- ### CLASS METHODS:
43
-
44
- class << self
45
- def find_or_create_all_with_like_by_name(tag_definition, *list)
46
- list = ActsAsTaggableOnMongoid::TagList.new(tag_definition, *Array.wrap(list).flatten)
47
-
48
- return [] if list.empty?
49
-
50
- list.map do |tag_name|
51
- begin
52
- tries ||= 3
53
-
54
- existing_tag = tag_definition.tags_table.for_tag(tag_definition).named(tag_name).first
55
-
56
- existing_tag || create_tag(tag_definition, tag_name)
57
- rescue Mongoid::Errors::Validations
58
- # :nocov:
59
- if (tries -= 1).positive?
60
- retry
61
- end
62
-
63
- raise ActsAsTaggableOnMongoid::Errors::DuplicateTagError.new, "'#{tag_name}' has already been taken"
64
- # :nocov:
65
- end
66
- end
67
- end
68
-
69
- private
70
-
71
- def create_tag(tag_definition, name)
72
- tag_definition.tags_table.create(name: name,
73
- context: tag_definition.tag_type,
74
- taggable_type: tag_definition.owner.name)
75
- end
76
-
77
- def as_8bit_ascii(string)
78
- string = string.to_s
79
- if defined?(Encoding)
80
- string.dup.force_encoding("BINARY")
81
- else
82
- # :nocov:
83
- string.mb_chars
84
- # :nocov:
85
- end
86
- end
87
- end
88
-
89
- ### INSTANCE METHODS:
90
-
91
- def ==(other)
92
- super || (other.class == self.class &&
93
- name == other.name &&
94
- context == other.context &&
95
- taggable_type == other.taggable_type)
96
- end
97
-
98
- def to_s
99
- name
100
- end
7
+ include ActsAsTaggableOnMongoid::Models::Concerns::TagModel
101
8
  end
102
9
  end
103
10
  end
@@ -4,77 +4,7 @@ module ActsAsTaggableOnMongoid
4
4
  module Models
5
5
  # A class representing the actual tags assigned to a particular model object
6
6
  class Tagging
7
- include Mongoid::Document
8
- include Mongoid::Timestamps
9
-
10
- DEFAULT_CONTEXT = "tags"
11
-
12
- after_save :tagging_saved
13
- after_destroy :tagging_destroyed
14
-
15
- field :tag_name, type: String
16
- field :context, type: String
17
-
18
- belongs_to :tag, counter_cache: true, inverse_of: :taggings
19
- belongs_to :taggable, polymorphic: true
20
- # belongs_to :tagger, { polymorphic: true, optional: true }
21
-
22
- # If/when adding the concept of a tagger, this index will need to be changed.
23
- index({ taggable_id: 1, taggable_type: 1, context: 1, tag_name: 1 }, unique: true, name: "tagging_taggable_context_tag_name")
24
- index(tag_name: 1)
25
- index(tag_id: 1, tag_type: 1)
26
-
27
- # scope :owned_by, ->(owner) { where(tagger: owner) }
28
- # scope :not_owned, -> { where(tagger_id: nil, tagger_type: nil) }
29
-
30
- scope :by_contexts, ->(*contexts) { where(:context.in => Array.wrap(contexts.presence || DEFAULT_CONTEXT)) }
31
- scope :by_context, ->(context = DEFAULT_CONTEXT) { by_contexts(context.to_s) }
32
- scope :for_tag, ->(tag_definition) { where(taggable_type: tag_definition.owner.name).by_context(tag_definition.tag_type) }
33
-
34
- validates :tag_name, presence: true
35
- validates :context, presence: true
36
- validates :tag, presence: true
37
- validates :taggable, presence: true
38
-
39
- # validates :tag_id, uniqueness: {scope: [:taggable_type, :taggable_id, :context, :tagger_id, :tagger_type]}
40
- validates :tag_name, uniqueness: { scope: %i[taggable_type taggable_id context] }
41
- # validates :tag_id, uniqueness: {scope: [:taggable_type, :taggable_id, :context, :tagger_id, :tagger_type]}
42
- validates :tag_id, uniqueness: { scope: %i[taggable_type taggable_id context] }
43
-
44
- after_destroy :remove_unused_tags
45
-
46
- private
47
-
48
- def remove_unused_tags
49
- return nil unless taggable
50
-
51
- tag_definition = taggable.tag_types[context]
52
-
53
- return unless tag_definition&.remove_unused_tags?
54
-
55
- tag.destroy if tag.reload.taggings_count.zero?
56
- end
57
-
58
- def tagging_saved
59
- tag_definition = taggable.tag_types[context]
60
-
61
- return unless tag_definition
62
-
63
- tag_list = taggable.public_send(tag_definition.tag_list_name)
64
- tag_list.add_tagging(self)
65
- end
66
-
67
- def tagging_destroyed
68
- taggable_was = taggable_type_was.constantize.where(id: taggable_id_was).first
69
-
70
- return unless taggable_was
71
-
72
- tag_definition = taggable_was.tag_types[context_was]
73
-
74
- return unless tag_definition
75
-
76
- taggable_was.public_send(tag_definition.tag_list_name).remove(tag_name_was)
77
- end
7
+ include ActsAsTaggableOnMongoid::Models::Concerns::TaggingModel
78
8
  end
79
9
  end
80
10
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActsAsTaggableOnMongoid
4
- VERSION = "6.0.1.2"
4
+ VERSION = "6.0.1.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts-as-taggable-on-mongoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.1.2
4
+ version: 6.0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - RealNobody
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-18 00:00:00.000000000 Z
11
+ date: 2018-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -326,6 +326,18 @@ files:
326
326
  - lib/acts_as_taggable_on_mongoid/default_parser.rb
327
327
  - lib/acts_as_taggable_on_mongoid/errors/duplicate_tag_error.rb
328
328
  - lib/acts_as_taggable_on_mongoid/generic_parser.rb
329
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tag_associations.rb
330
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tag_fields.rb
331
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tag_methods.rb
332
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tag_model.rb
333
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tag_scopes.rb
334
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tag_validations.rb
335
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tagging_associations.rb
336
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tagging_fields.rb
337
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tagging_methods.rb
338
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tagging_model.rb
339
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tagging_scopes.rb
340
+ - lib/acts_as_taggable_on_mongoid/models/concerns/tagging_validations.rb
329
341
  - lib/acts_as_taggable_on_mongoid/models/tag.rb
330
342
  - lib/acts_as_taggable_on_mongoid/models/tagging.rb
331
343
  - lib/acts_as_taggable_on_mongoid/tag_list.rb