mongoid_taggable 0.1.6 → 0.1.7

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.
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ begin
7
7
  require 'jeweler'
8
8
  Jeweler::Tasks.new do |gemspec|
9
9
  gemspec.name = "mongoid_taggable"
10
- gemspec.version = "0.1.6"
10
+ gemspec.version = "0.1.7"
11
11
  gemspec.summary = "Mongoid taggable behaviour"
12
12
  gemspec.description = "Mongoid Taggable provides some helpers to create taggable documents."
13
13
  gemspec.email = "wilkerlucio@gmail.com"
@@ -15,17 +15,21 @@
15
15
  module Mongoid::Taggable
16
16
  def self.included(base)
17
17
  # create fields for tags and index it
18
- base.field :tags_array, :type => Array
18
+ base.field :tags_array, :type => Array, :default => []
19
19
  base.index [['tags_array', Mongo::ASCENDING]]
20
20
 
21
21
  # add callback to save tags index
22
22
  base.after_save do |document|
23
- document.class.save_tags_index!
23
+ if document.tags_array_changed
24
+ document.class.save_tags_index!
25
+ document.tags_array_changed = false
26
+ end
24
27
  end
25
28
 
26
29
  # extend model
27
30
  base.extend ClassMethods
28
31
  base.send :include, InstanceMethods
32
+ base.send :attr_accessor, :tags_array_changed
29
33
 
30
34
  # enable indexing as default
31
35
  base.enable_tags_index!
@@ -41,21 +45,19 @@ module Mongoid::Taggable
41
45
  def tagged_with_all(*tags)
42
46
  self.all_in(:tags_array => tags.flatten)
43
47
  end
44
-
48
+
45
49
  def tagged_with_any(*tags)
46
50
  self.any_in(:tags_array => tags.flatten)
47
51
  end
48
52
 
49
53
  def tags
50
- db = Mongoid::Config.master
51
- db.collection(tags_index_collection).find.to_a.map{ |r| r["_id"] }
54
+ tags_index_collection.master.find.to_a.map{ |r| r["_id"] }
52
55
  end
53
56
 
54
57
  # retrieve the list of tags with weight (i.e. count), this is useful for
55
58
  # creating tag clouds
56
59
  def tags_with_weight
57
- db = Mongoid::Config.master
58
- db.collection(tags_index_collection).find.to_a.map{ |r| [r["_id"], r["value"]] }
60
+ tags_index_collection.master.find.to_a.map{ |r| [r["_id"], r["value"]] }
59
61
  end
60
62
 
61
63
  def disable_tags_index!
@@ -71,16 +73,17 @@ module Mongoid::Taggable
71
73
  @tags_separator || ','
72
74
  end
73
75
 
74
- def tags_index_collection
76
+ def tags_index_collection_name
75
77
  "#{collection_name}_tags_index"
76
78
  end
77
79
 
80
+ def tags_index_collection
81
+ @@tags_index_collection ||= Mongoid::Collection.new(self, tags_index_collection_name)
82
+ end
83
+
78
84
  def save_tags_index!
79
85
  return unless @do_tags_index
80
86
 
81
- db = Mongoid::Config.master
82
- coll = db.collection(collection_name)
83
-
84
87
  map = "function() {
85
88
  if (!this.tags_array) {
86
89
  return;
@@ -101,7 +104,7 @@ module Mongoid::Taggable
101
104
  return count;
102
105
  }"
103
106
 
104
- coll.map_reduce(map, reduce, :out => tags_index_collection)
107
+ self.collection.master.map_reduce(map, reduce, :out => tags_index_collection_name)
105
108
  end
106
109
  end
107
110
 
@@ -112,6 +115,7 @@ module Mongoid::Taggable
112
115
 
113
116
  def tags=(tags)
114
117
  self.tags_array = tags.split(self.class.tags_separator).map(&:strip).reject(&:blank?)
118
+ @tags_array_changed = true
115
119
  end
116
120
  end
117
121
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid_taggable}
8
- s.version = "0.1.6"
8
+ s.version = "0.1.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Wilker Lucio", "Kris Kowalik"]
12
- s.date = %q{2011-05-04}
12
+ s.date = %q{2011-07-01}
13
13
  s.description = %q{Mongoid Taggable provides some helpers to create taggable documents.}
14
14
  s.email = %q{wilkerlucio@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -17,10 +17,17 @@ require File.join(File.dirname(__FILE__), %w[.. spec_helper])
17
17
  class MyModel
18
18
  include Mongoid::Document
19
19
  include Mongoid::Taggable
20
+ field :name
20
21
  end
21
22
 
22
23
  describe Mongoid::Taggable do
23
24
 
25
+ describe "default tags array value" do
26
+ it 'should be an empty array' do
27
+ MyModel.new.tags_array.should == []
28
+ end
29
+ end
30
+
24
31
  context "finding" do
25
32
  let(:model){MyModel.create!(:tags => "interesting,stuff,good,bad")}
26
33
  context "by tagged_with" do
@@ -119,7 +126,15 @@ describe Mongoid::Taggable do
119
126
 
120
127
  context "indexing tags" do
121
128
  it "should generate the index collection name based on model" do
122
- MyModel.tags_index_collection.should == "my_models_tags_index"
129
+ MyModel.tags_index_collection_name.should == "my_models_tags_index"
130
+ end
131
+
132
+ it "should generate the index collection model based on model" do
133
+ MyModel.tags_index_collection.should be_a Mongoid::Collection
134
+ end
135
+
136
+ it "should generate the index collection model based on model with the collection name" do
137
+ MyModel.tags_index_collection.name.should == "my_models_tags_index"
123
138
  end
124
139
 
125
140
  context "retrieving index" do
@@ -160,5 +175,22 @@ describe Mongoid::Taggable do
160
175
  MyModel.tags.should == []
161
176
  end
162
177
  end
178
+
179
+ it 'should launch the map/reduce if index activate and tag_arrays change' do
180
+ m = MyModel.create!(:tags => "food,ant,bee")
181
+ m.tags = 'juice,food'
182
+ MyModel.collection.master.should_receive(:map_reduce)
183
+ m.save
184
+ end
185
+
186
+ it 'should not launch the map/reduce if index activate and tag_arrays not change' do
187
+ m = MyModel.create!(:tags => "food,ant,bee")
188
+ MyModel.collection.master.should_not_receive(:map_reduce)
189
+ m.save
190
+ m.name = 'hello'
191
+ m.save
192
+ end
193
+
163
194
  end
164
- end
195
+
196
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: mongoid_taggable
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.6
5
+ version: 0.1.7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Wilker Lucio
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-05-04 00:00:00 Z
14
+ date: 2011-07-01 00:00:00 Z
15
15
  dependencies: []
16
16
 
17
17
  description: Mongoid Taggable provides some helpers to create taggable documents.