mongo_mapper_tagger 0.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
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9f18a52122328c024458d2942c397475ff023fe3
|
4
|
+
data.tar.gz: 9ef72345a064a047f51433b8235e22e538fbc290
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5bdeff914b6bb0b2dc6127a176e82968d063b66170059d35a94a2eedaa94f570029fd198f6484d4f2b7eaffe8255518542c34e8e576bed761d8fd88b45c22751
|
7
|
+
data.tar.gz: b130fe1ce030aab75836c0592f067494d90e43d0f3c0bf049475c573eadf81743921aa41af6d708d98510abc4167e01e1e5b1d3d2ca0004e08b8c10363b9f11c
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# @author Dan Guilak
|
2
|
+
|
3
|
+
require 'mongo_mapper'
|
4
|
+
require 'set'
|
5
|
+
|
6
|
+
module MongoMapper
|
7
|
+
module Plugins
|
8
|
+
module MongoMapperTagger
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
has_many :tags, as: :mongo_taggable, class_name: "MongoMapper::Tag"
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
# Returns a query of all objects with a particular tag.
|
17
|
+
#
|
18
|
+
# @param tag [String] the tag to find
|
19
|
+
# @return [Plucky] the query of objects with that tag.
|
20
|
+
def by_tag(tag)
|
21
|
+
ids = MongoMapper::Tag.where(mongo_taggable_type: self.name, tag: tag).distinct(:mongo_taggable_id)
|
22
|
+
|
23
|
+
where(_id: { '$in': ids })
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns an array of strings of the current tags on the object.
|
28
|
+
#
|
29
|
+
# @return [Array] an array of strings representing the tags on an object.
|
30
|
+
def tag_list
|
31
|
+
tags.map(&:tag)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Sets the tags on the object using (see #update_tags_from_list!)
|
35
|
+
#
|
36
|
+
# @param new_tag_list [String] the new delimiter-separated list of tags with which
|
37
|
+
# to update the object.
|
38
|
+
def tag_list=(new_tag_list)
|
39
|
+
update_tags_from_list!(new_tag_list)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Takes a new list of tags as a delimited string, adds and removes
|
43
|
+
# tags on the object as necessary in order to get the object tags to
|
44
|
+
# match the new list.
|
45
|
+
#
|
46
|
+
# @param new_tag_list [String] the new delimiter-separated list of tags with which
|
47
|
+
# to update the object
|
48
|
+
# @param delimiter [String] the delimiter for new_tag_list (default comma)
|
49
|
+
def update_tags_from_list!(new_tag_list, delimiter=',')
|
50
|
+
old_tag_list = tag_list.to_set
|
51
|
+
new_tag_list = new_tag_list.split(delimiter).to_set
|
52
|
+
|
53
|
+
to_remove = (old_tag_list - new_tag_list).to_a
|
54
|
+
to_add = (new_tag_list - old_tag_list).to_a
|
55
|
+
|
56
|
+
to_remove.each { |tag| MongoMapper::Tag.remove_by_object_and_tag!(self, tag) }
|
57
|
+
|
58
|
+
to_add.each { |tag| MongoMapper::Tag.add_by_object_and_tag!(self, tag) }
|
59
|
+
end
|
60
|
+
|
61
|
+
# Removes a tag from the object.
|
62
|
+
#
|
63
|
+
# @param tag [String] the tag to remove from the object.
|
64
|
+
def remove_tag!(tag)
|
65
|
+
MongoMapper::Tag.remove_by_object_and_tag!(self, tag)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Adds a tag to the object.
|
69
|
+
#
|
70
|
+
# @param tag [String] the tag to add to the object.
|
71
|
+
def add_tag!(tag)
|
72
|
+
MongoMapper::Tag.add_by_object_and_tag!(self, tag)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# @author Dan Guilak
|
2
|
+
|
3
|
+
class MongoMapper::Tag
|
4
|
+
class TagNotFound < StandardError; end
|
5
|
+
|
6
|
+
include MongoMapper::Document
|
7
|
+
|
8
|
+
key :tag, String, required: true
|
9
|
+
|
10
|
+
ensure_index :tag
|
11
|
+
ensure_index :mongo_taggable_type
|
12
|
+
ensure_index :mongo_taggable_id
|
13
|
+
|
14
|
+
belongs_to :mongo_taggable, polymorphic: true
|
15
|
+
|
16
|
+
validates_uniqueness_of :tag, scope: [ :mongo_taggable_id, :mongo_taggable_type ]
|
17
|
+
|
18
|
+
class << self
|
19
|
+
# Removes a tag by the type of the object, the id of the object, and the tag name.
|
20
|
+
# Raises an error if the tag wasn't found.
|
21
|
+
#
|
22
|
+
# @param taggable_type [String] the type (class name) of the object.
|
23
|
+
# @param taggable_id [String] the BSON ID of the object.
|
24
|
+
# @param tag_name [String] the name of the tag to remove.
|
25
|
+
def remove_by_type_and_id_and_tag!(taggable_type, taggable_id, tag_name)
|
26
|
+
success = remove_by_type_and_id_and_tag(taggable_type, taggable_id, tag_name)
|
27
|
+
|
28
|
+
raise TagNotFound unless success
|
29
|
+
end
|
30
|
+
|
31
|
+
# Removes a tag by the type of the object, the id of the object, and the tag name.
|
32
|
+
#
|
33
|
+
# @param taggable_type [String] the type (class name) of the object.
|
34
|
+
# @param taggable_id [String] the BSON ID of the object.
|
35
|
+
# @param tag_name [String] the name of the tag to remove.
|
36
|
+
# @return [Boolean] true if successful, false if not
|
37
|
+
def remove_by_type_and_id_and_tag(taggable_type, taggable_id, tag_name)
|
38
|
+
tag = first(mongo_taggable_type: taggable_type, mongo_taggable_id: taggable_id, tag: tag_name)
|
39
|
+
|
40
|
+
return false unless tag.present?
|
41
|
+
|
42
|
+
success = tag.destroy
|
43
|
+
success && success["ok"] == 1
|
44
|
+
end
|
45
|
+
|
46
|
+
# Adds a tag by the type of the object, the id of the object, and the tag name.
|
47
|
+
# Raises an error if the tag wasn't created successfully.
|
48
|
+
#
|
49
|
+
# @param taggable_type [String] the type (class name) of the object.
|
50
|
+
# @param taggable_id [String] the BSON ID of the object.
|
51
|
+
# @param tag_name [String] the name of the tag to add.
|
52
|
+
def add_by_type_and_id_and_tag!(taggable_type, taggable_id, tag_name)
|
53
|
+
create!(mongo_taggable_type: taggable_type, mongo_taggable_id: taggable_id, tag: tag_name)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Adds a tag by the type of the object, the id of the object, and the tag name.
|
57
|
+
#
|
58
|
+
# @param taggable_type [String] the type (class name) of the object.
|
59
|
+
# @param taggable_id [String] the BSON ID of the object.
|
60
|
+
# @param tag_name [String] the name of the tag to add.
|
61
|
+
# @return [Boolean] true if successful, false if not
|
62
|
+
def add_by_type_and_id_and_tag(taggable_type, taggable_id, tag_name)
|
63
|
+
find_args = {
|
64
|
+
mongo_taggable_type: taggable_type,
|
65
|
+
mongo_taggable_id: taggable_id,
|
66
|
+
tag: tag_name,
|
67
|
+
}
|
68
|
+
|
69
|
+
# `create` will return the object if it finds it, rather than returning false.
|
70
|
+
if first(find_args).present?
|
71
|
+
return false
|
72
|
+
end
|
73
|
+
|
74
|
+
success = create(find_args)
|
75
|
+
|
76
|
+
success.present?
|
77
|
+
end
|
78
|
+
|
79
|
+
# Removes a tag on an object.
|
80
|
+
# Raises if the tag isn't found.
|
81
|
+
#
|
82
|
+
# @param object [Object] object from which to remove the tag
|
83
|
+
# @param tag_name [String] tag to remove from the object.
|
84
|
+
def remove_by_object_and_tag!(object, tag_name)
|
85
|
+
remove_by_type_and_id_and_tag!(object.class.name, object.id, tag_name)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Removes a tag on an object.
|
89
|
+
#
|
90
|
+
# @param object [Object] object from which to remove the tag
|
91
|
+
# @param tag_name [String] tag to remove from the object.
|
92
|
+
# @return [Boolean] true if successful, false if not
|
93
|
+
def remove_by_object_and_tag(object, tag_name)
|
94
|
+
remove_by_type_and_id_and_tag(object.class.name, object.id, tag_name)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Adds a tag on an object.
|
98
|
+
#
|
99
|
+
# @param object [Object] object from which to remove the tag
|
100
|
+
# @param tag_name [String] tag to add to the object.
|
101
|
+
def add_by_object_and_tag(object, tag_name)
|
102
|
+
add_by_type_and_id_and_tag(object.class.name, object.id, tag_name)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Adds a tag on an object.
|
106
|
+
# Raises if the tag wasn't successfully created.
|
107
|
+
#
|
108
|
+
# @param object [Object] object on which to add the tag
|
109
|
+
# @param tag_name [String] tag to add to the object.
|
110
|
+
def add_by_object_and_tag!(object, tag_name)
|
111
|
+
add_by_type_and_id_and_tag!(object.class.name, object.id, tag_name)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mongo_mapper_tagger
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dan Guilak
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-04 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Dead simple tagging for MongoMapper
|
14
|
+
email: dan@learnup.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/mongo_mapper/plugins/mongo_mapper_tagger.rb
|
20
|
+
- lib/mongo_mapper/plugins/mongo_mapper_tagger/tag.rb
|
21
|
+
- lib/mongo_mapper_tagger.rb
|
22
|
+
homepage: http://github.com/golearnup/mongo_mapper_tagger
|
23
|
+
licenses:
|
24
|
+
- MIT
|
25
|
+
metadata: {}
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirements: []
|
41
|
+
rubyforge_project:
|
42
|
+
rubygems_version: 2.4.8
|
43
|
+
signing_key:
|
44
|
+
specification_version: 4
|
45
|
+
summary: Dead simple tagging for MongoMapper
|
46
|
+
test_files: []
|
47
|
+
has_rdoc:
|