mongoid_taggable_with_context 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,26 +1,26 @@
1
- module Mongoid::TaggableWithContext::GroupBy
2
- module TaggableWithContext
3
- extend ActiveSupport::Concern
4
- included do
5
- raise <<-ERR
6
- Mongoid::TaggableWithContext::GroupBy::TaggableWithContext is no longer used.
7
- Instead, please include both Mongoid::TaggableWithContext and
8
- Mongoid::TaggableWithContext::AggregationStrategy::RealTimeGroupBy
9
- in your Model.
10
- ERR
11
- end
12
- end
13
- module AggregationStrategy
14
- module RealTime
15
- extend ActiveSupport::Concern
16
- included do
17
- raise <<-ERR
18
- Mongoid::TaggableWithContext::GroupBy::AggregationStrategy::RealTime
19
- is no longer used. Instead, please include both Mongoid::TaggableWithContext and
20
- Mongoid::TaggableWithContext::AggregationStrategy::RealTimeGroupBy
21
- in your Model.
22
- ERR
23
- end
24
- end
25
- end
1
+ module Mongoid::TaggableWithContext::GroupBy
2
+ module TaggableWithContext
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ raise <<-ERR
6
+ Mongoid::TaggableWithContext::GroupBy::TaggableWithContext is no longer used.
7
+ Instead, please include both Mongoid::TaggableWithContext and
8
+ Mongoid::TaggableWithContext::AggregationStrategy::RealTimeGroupBy
9
+ in your Model.
10
+ ERR
11
+ end
12
+ end
13
+ module AggregationStrategy
14
+ module RealTime
15
+ extend ActiveSupport::Concern
16
+ included do
17
+ raise <<-ERR
18
+ Mongoid::TaggableWithContext::GroupBy::AggregationStrategy::RealTime
19
+ is no longer used. Instead, please include both Mongoid::TaggableWithContext and
20
+ Mongoid::TaggableWithContext::AggregationStrategy::RealTimeGroupBy
21
+ in your Model.
22
+ ERR
23
+ end
24
+ end
25
+ end
26
26
  end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module TaggableWithContext
4
- VERSION = '1.1.3'
5
- end
6
- end
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module TaggableWithContext
4
+ VERSION = '1.1.4'
5
+ end
6
+ end
@@ -1,8 +1,8 @@
1
- require 'active_support/concern'
2
-
3
- require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context')
4
- require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context/aggregation_strategy/map_reduce')
5
- require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context/aggregation_strategy/real_time')
6
- require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context/aggregation_strategy/real_time_group_by')
7
- require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context/deprecations')
1
+ require 'active_support/concern'
2
+
3
+ require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context')
4
+ require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context/aggregation_strategy/map_reduce')
5
+ require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context/aggregation_strategy/real_time')
6
+ require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context/aggregation_strategy/real_time_group_by')
7
+ require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context/deprecations')
8
8
  require File.join(File.dirname(__FILE__), 'mongoid/taggable_with_context/version')
@@ -1,70 +1,71 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = "mongoid_taggable_with_context"
8
- s.version = "1.1.3"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Aaron Qian", "Luca G. Soave", "John Shields", "Wilker Lucio", "Ches Martin"]
12
- s.date = "2013-05-26"
13
- s.description = "Add multiple tag fields on Mongoid documents with aggregation capability."
14
- s.extra_rdoc_files = [
15
- "LICENSE.txt",
16
- "README.md"
17
- ]
18
- s.files = [
19
- ".document",
20
- ".travis.yml",
21
- "Gemfile",
22
- "LICENSE.txt",
23
- "README.md",
24
- "Rakefile",
25
- "init.rb",
26
- "lib/mongoid/taggable_with_context.rb",
27
- "lib/mongoid/taggable_with_context/aggregation_strategy/map_reduce.rb",
28
- "lib/mongoid/taggable_with_context/aggregation_strategy/real_time.rb",
29
- "lib/mongoid/taggable_with_context/aggregation_strategy/real_time_group_by.rb",
30
- "lib/mongoid/taggable_with_context/deprecations.rb",
31
- "lib/mongoid/taggable_with_context/version.rb",
32
- "lib/mongoid_taggable_with_context.rb",
33
- "mongoid_taggable_with_context.gemspec",
34
- "spec/mongoid_taggable_with_context_spec.rb",
35
- "spec/spec_helper.rb"
36
- ]
37
- s.homepage = "http://github.com/lgs/mongoid_taggable_with_context"
38
- s.licenses = ["MIT"]
39
- s.require_paths = ["lib"]
40
- s.rubygems_version = "2.0.3"
41
- s.summary = "Mongoid taggable behaviour"
42
-
43
- if s.respond_to? :specification_version then
44
- s.specification_version = 4
45
-
46
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
- s.add_runtime_dependency(%q<mongoid>, [">= 3.0.0"])
48
- s.add_development_dependency(%q<rake>, [">= 0"])
49
- s.add_development_dependency(%q<rspec>, [">= 0"])
50
- s.add_development_dependency(%q<yard>, [">= 0"])
51
- s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
52
- s.add_development_dependency(%q<jeweler>, [">= 0"])
53
- else
54
- s.add_dependency(%q<mongoid>, [">= 3.0.0"])
55
- s.add_dependency(%q<rake>, [">= 0"])
56
- s.add_dependency(%q<rspec>, [">= 0"])
57
- s.add_dependency(%q<yard>, [">= 0"])
58
- s.add_dependency(%q<bundler>, [">= 1.0.0"])
59
- s.add_dependency(%q<jeweler>, [">= 0"])
60
- end
61
- else
62
- s.add_dependency(%q<mongoid>, [">= 3.0.0"])
63
- s.add_dependency(%q<rake>, [">= 0"])
64
- s.add_dependency(%q<rspec>, [">= 0"])
65
- s.add_dependency(%q<yard>, [">= 0"])
66
- s.add_dependency(%q<bundler>, [">= 1.0.0"])
67
- s.add_dependency(%q<jeweler>, [">= 0"])
68
- end
69
- end
70
-
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: mongoid_taggable_with_context 1.1.4 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "mongoid_taggable_with_context"
9
+ s.version = "1.1.4"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.authors = ["Aaron Qian", "Luca G. Soave", "John Shields", "Wilker Lucio", "Ches Martin"]
13
+ s.date = "2013-10-14"
14
+ s.description = "Add multiple tag fields on Mongoid documents with aggregation capability."
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".travis.yml",
22
+ "Gemfile",
23
+ "LICENSE.txt",
24
+ "README.md",
25
+ "Rakefile",
26
+ "init.rb",
27
+ "lib/mongoid/taggable_with_context.rb",
28
+ "lib/mongoid/taggable_with_context/aggregation_strategy/map_reduce.rb",
29
+ "lib/mongoid/taggable_with_context/aggregation_strategy/real_time.rb",
30
+ "lib/mongoid/taggable_with_context/aggregation_strategy/real_time_group_by.rb",
31
+ "lib/mongoid/taggable_with_context/deprecations.rb",
32
+ "lib/mongoid/taggable_with_context/version.rb",
33
+ "lib/mongoid_taggable_with_context.rb",
34
+ "mongoid_taggable_with_context.gemspec",
35
+ "spec/mongoid_taggable_with_context_spec.rb",
36
+ "spec/spec_helper.rb"
37
+ ]
38
+ s.homepage = "http://github.com/lgs/mongoid_taggable_with_context"
39
+ s.licenses = ["MIT"]
40
+ s.require_paths = ["lib"]
41
+ s.rubygems_version = "2.1.8"
42
+ s.summary = "Mongoid taggable behaviour"
43
+
44
+ if s.respond_to? :specification_version then
45
+ s.specification_version = 4
46
+
47
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
+ s.add_runtime_dependency(%q<mongoid>, [">= 3.0.0"])
49
+ s.add_development_dependency(%q<rake>, [">= 0"])
50
+ s.add_development_dependency(%q<rspec>, [">= 0"])
51
+ s.add_development_dependency(%q<yard>, [">= 0"])
52
+ s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
53
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
54
+ else
55
+ s.add_dependency(%q<mongoid>, [">= 3.0.0"])
56
+ s.add_dependency(%q<rake>, [">= 0"])
57
+ s.add_dependency(%q<rspec>, [">= 0"])
58
+ s.add_dependency(%q<yard>, [">= 0"])
59
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
60
+ s.add_dependency(%q<jeweler>, [">= 0"])
61
+ end
62
+ else
63
+ s.add_dependency(%q<mongoid>, [">= 3.0.0"])
64
+ s.add_dependency(%q<rake>, [">= 0"])
65
+ s.add_dependency(%q<rspec>, [">= 0"])
66
+ s.add_dependency(%q<yard>, [">= 0"])
67
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
68
+ s.add_dependency(%q<jeweler>, [">= 0"])
69
+ end
70
+ end
71
+
@@ -1,465 +1,465 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- class MyModel
4
- include Mongoid::Document
5
- include Mongoid::TaggableWithContext
6
-
7
- taggable
8
- taggable :artists
9
- taggable :albums, default: []
10
- end
11
-
12
- class M1
13
- include Mongoid::Document
14
- include Mongoid::TaggableWithContext
15
- include Mongoid::TaggableWithContext::AggregationStrategy::MapReduce
16
-
17
- taggable
18
- taggable :a, as: :artists
19
- end
20
-
21
- class M2
22
- include Mongoid::Document
23
- include Mongoid::TaggableWithContext
24
- include Mongoid::TaggableWithContext::AggregationStrategy::RealTime
25
-
26
- taggable
27
- taggable :artists
28
- end
29
-
30
- class M3
31
- include Mongoid::Document
32
- include Mongoid::TaggableWithContext
33
- include Mongoid::TaggableWithContext::AggregationStrategy::RealTimeGroupBy
34
-
35
- field :user
36
- taggable group_by_field: :user
37
- taggable :artists, group_by_field: :user
38
- end
39
-
40
- describe Mongoid::TaggableWithContext do
41
-
42
- context "default field value" do
43
- before :each do
44
- @m = MyModel.new
45
- end
46
-
47
- it "should be nil for artists" do
48
- @m.artists.should eql nil
49
- end
50
-
51
- it "should be array for albums" do
52
- @m.albums.should eql []
53
- end
54
- end
55
-
56
- context "saving tags from plain text" do
57
- before :each do
58
- @m = MyModel.new
59
- end
60
-
61
- it "should set tags from string" do
62
- @m.tags = "some new tag"
63
- @m.tags.should == %w[some new tag]
64
- end
65
-
66
- it "should set artists tags from string" do
67
- @m.artists = "some new tag"
68
- @m.artists.should == %w[some new tag]
69
- end
70
-
71
- it "should retrieve tags string" do
72
- @m.tags = %w[some new tags]
73
- @m.tags_string.should == "some new tags"
74
- end
75
-
76
- it "should set tags from tags string" do
77
- tags = "some cool tags"
78
- @m.albums_string = tags
79
- @m.albums.should == tags.split(' ')
80
- end
81
-
82
- it "should retrieve artists string" do
83
- @m.artists = %w[some new tags]
84
- @m.artists_string.should == "some new tags"
85
- end
86
-
87
- it "should strip tags before put in array" do
88
- @m.tags = "now with some spaces in places "
89
- @m.tags.should == %w[now with some spaces in places]
90
- end
91
-
92
- it "should remove repeated tags from string" do
93
- @m.tags = "some new tags some new tags"
94
- @m.tags.should == %w[some new tags]
95
- end
96
-
97
- it "should remove repeated tags from array" do
98
- @m.tags = %w[some new tags some new tags]
99
- @m.tags.should == %w[some new tags]
100
- end
101
-
102
- it "should remove nil tags from array" do
103
- @m.tags = ["some", nil, "new", nil, "tags"]
104
- @m.tags.should == %w[some new tags]
105
- end
106
-
107
- it "should allow tags to be set to nil" do
108
- @m.tags = nil
109
- @m.tags.should == nil
110
- end
111
- end
112
-
113
- context "saving tags from array" do
114
- before :each do
115
- @m = MyModel.new
116
- end
117
-
118
- it "should remove repeated tags from array" do
119
- @m.tags = %w[some new tags some new tags]
120
- @m.tags.should == %w[some new tags]
121
- end
122
-
123
- it "should remove nil tags from array" do
124
- @m.tags = ["some", nil, "new", nil, "tags"]
125
- @m.tags.should == %w[some new tags]
126
- end
127
-
128
- it "should remove empty strings from array" do
129
- @m.tags = ["some", "", "new", "", "tags"]
130
- @m.tags.should == %w[some new tags]
131
- end
132
- end
133
-
134
- context "tagged_with" do
135
- before :each do
136
- @m1 = MyModel.create!(tags: "food ant bee", artists: "jeff greg mandy aaron andy")
137
- @m2 = MyModel.create!(tags: "juice food bee zip", artists: "grant andrew andy")
138
- @m3 = MyModel.create!(tags: "honey strip food", artists: "mandy aaron andy")
139
- end
140
-
141
- it "should retrieve a list of documents" do
142
- (MyModel.tags_tagged_with("food").to_a - [@m1, @m2, @m3]).should be_empty
143
- (MyModel.artists_tagged_with("aaron").to_a - [@m1, @m3]).should be_empty
144
- end
145
- end
146
-
147
- context "no aggregation" do
148
- it "should raise AggregationStrategyMissing exception when retreiving tags" do
149
- lambda{ MyModel.tags }.should raise_error(Mongoid::TaggableWithContext::AggregationStrategyMissing)
150
- end
151
-
152
- it "should raise AggregationStrategyMissing exception when retreiving tags with weights" do
153
- lambda{ MyModel.tags_with_weight }.should raise_error(Mongoid::TaggableWithContext::AggregationStrategyMissing)
154
- end
155
-
156
- end
157
-
158
- shared_examples_for "aggregation" do
159
- context "retrieving index" do
160
- context "when there's no tags'" do
161
- it "should return an empty array" do
162
- klass.tags.should == []
163
- klass.artists.should == []
164
-
165
- klass.tags_with_weight.should == []
166
- klass.artists_with_weight == []
167
- end
168
- end
169
-
170
- context "on create directly" do
171
- before :each do
172
- klass.create!(user: "user1", tags: "food ant bee", artists: "jeff greg mandy aaron andy")
173
- klass.create!(user: "user1", tags: "juice food bee zip", artists: "grant andrew andy")
174
- klass.create!(user: "user2", tags: "honey strip food", artists: "mandy aaron andy")
175
- end
176
-
177
- it "should retrieve the list of all saved tags distinct and ordered" do
178
- klass.tags.should == %w[ant bee food honey juice strip zip]
179
- klass.artists.should == %w[aaron andrew andy grant greg jeff mandy]
180
- end
181
-
182
- it "should retrieve a list of tags with weight" do
183
- klass.tags_with_weight.should == [
184
- ['ant', 1],
185
- ['bee', 2],
186
- ['food', 3],
187
- ['honey', 1],
188
- ['juice', 1],
189
- ['strip', 1],
190
- ['zip', 1]
191
- ]
192
-
193
- klass.artists_with_weight.should == [
194
- ['aaron', 2],
195
- ['andrew', 1],
196
- ['andy', 3],
197
- ['grant', 1],
198
- ['greg', 1],
199
- ['jeff', 1],
200
- ['mandy', 2]
201
- ]
202
- end
203
- end
204
-
205
- context "on new then change attributes directly" do
206
- before :each do
207
- m = klass.new
208
- m.tags = "food ant bee"
209
- m.artists = "jeff greg mandy aaron andy"
210
- m.save!
211
-
212
- m = klass.new
213
- m.tags = "juice food bee zip"
214
- m.artists = "grant andrew andy"
215
- m.save!
216
-
217
- m = klass.new
218
- m.tags = "honey strip food"
219
- m.artists = "mandy aaron andy"
220
- m.save!
221
- end
222
-
223
- it "should retrieve the list of all saved tags distinct and ordered" do
224
- klass.tags.should == %w[ant bee food honey juice strip zip]
225
- klass.artists.should == %w[aaron andrew andy grant greg jeff mandy]
226
- end
227
-
228
- it "should retrieve a list of tags with weight" do
229
- klass.tags_with_weight.should == [
230
- ['ant', 1],
231
- ['bee', 2],
232
- ['food', 3],
233
- ['honey', 1],
234
- ['juice', 1],
235
- ['strip', 1],
236
- ['zip', 1]
237
- ]
238
-
239
- klass.artists_with_weight.should == [
240
- ['aaron', 2],
241
- ['andrew', 1],
242
- ['andy', 3],
243
- ['grant', 1],
244
- ['greg', 1],
245
- ['jeff', 1],
246
- ['mandy', 2]
247
- ]
248
- end
249
- end
250
-
251
- context "on create then update" do
252
- before :each do
253
- m1 = klass.create!(user: "user1", tags: "food ant bee", artists: "jeff greg mandy aaron andy")
254
- m2 = klass.create!(user: "user1", tags: "juice food bee zip", artists: "grant andrew andy")
255
- m3 = klass.create!(user: "user2", tags: "honey strip food", artists: "mandy aaron andy")
256
-
257
- m1.tags = m1.tags + %w[honey strip shoe]
258
- m1.save!
259
-
260
- m3.artists = m3.artists + %w[grant greg gory]
261
- m3.save!
262
- end
263
-
264
- it "should retrieve the list of all saved tags distinct and ordered" do
265
- klass.tags.should == %w[ant bee food honey juice shoe strip zip]
266
- klass.artists.should == %w[aaron andrew andy gory grant greg jeff mandy]
267
- end
268
-
269
- it "should retrieve a list of tags with weight" do
270
- klass.tags_with_weight.should == [
271
- ['ant', 1],
272
- ['bee', 2],
273
- ['food', 3],
274
- ['honey', 2],
275
- ['juice', 1],
276
- ['shoe', 1],
277
- ['strip', 2],
278
- ['zip', 1]
279
- ]
280
-
281
- klass.artists_with_weight.should == [
282
- ['aaron', 2],
283
- ['andrew', 1],
284
- ['andy', 3],
285
- ['gory', 1],
286
- ['grant', 2],
287
- ['greg', 2],
288
- ['jeff', 1],
289
- ['mandy', 2]
290
- ]
291
- end
292
- end
293
-
294
- context "on create, update, then destroy" do
295
- before :each do
296
- m1 = klass.create!(user: "user1", tags: "food ant bee", artists: "jeff greg mandy aaron andy")
297
- m2 = klass.create!(user: "user1", tags: "juice food bee zip", artists: "grant andrew andy")
298
- m3 = klass.create!(user: "user2", tags: "honey strip food", artists: "mandy aaron andy")
299
-
300
- m1.tags = m1.tags + %w[honey strip shoe] - %w[food]
301
- m1.save!
302
-
303
- m3.artists = m3.artists + %w[grant greg gory] - %w[andy]
304
- m3.save!
305
-
306
- m2.destroy
307
- end
308
-
309
- it "should retrieve the list of all saved tags distinct and ordered" do
310
- klass.tags.should == %w[ant bee food honey shoe strip]
311
- klass.artists.should == %w[aaron andy gory grant greg jeff mandy]
312
- end
313
-
314
- it "should retrieve a list of tags with weight" do
315
- klass.tags_with_weight.should == [
316
- ['ant', 1],
317
- ['bee', 1],
318
- ['food', 1],
319
- ['honey', 2],
320
- ['shoe', 1],
321
- ['strip', 2]
322
- ]
323
-
324
- klass.artists_with_weight.should == [
325
- ['aaron', 2],
326
- ['andy', 1],
327
- ['gory', 1],
328
- ['grant', 1],
329
- ['greg', 2],
330
- ['jeff', 1],
331
- ['mandy', 2]
332
- ]
333
- end
334
- end
335
- end
336
- end
337
-
338
- context "map-reduce aggregation" do
339
- let(:klass) { M1 }
340
- it_should_behave_like "aggregation"
341
-
342
- it "should generate the tags aggregation collection name correctly" do
343
- klass.aggregation_collection_for(:tags).should == "m1s_tags_aggregation"
344
- end
345
-
346
- it "should generate the artists aggregation collection name correctly" do
347
- klass.aggregation_collection_for(:artists).should == "m1s_artists_aggregation"
348
- end
349
- end
350
-
351
- context "realtime aggregation" do
352
- let(:klass) { M2 }
353
- it_should_behave_like "aggregation"
354
-
355
- it "should generate the tags aggregation collection name correctly" do
356
- klass.aggregation_collection_for(:tags).should == "m2s_tags_aggregation"
357
- end
358
-
359
- it "should generate the artists aggregation collection name correctly" do
360
- klass.aggregation_collection_for(:artists).should == "m2s_artists_aggregation"
361
- end
362
- end
363
-
364
- context "realtime aggregation group by" do
365
- let(:klass) { M3 }
366
- it_should_behave_like "aggregation"
367
-
368
- it "should have artists_group_by_field value :user" do
369
- klass.artists_group_by_field.should == :user
370
- end
371
-
372
- it "should generate the tags aggregation collection name correctly" do
373
- klass.aggregation_collection_for(:tags).should == "m3s_tags_aggregation"
374
- end
375
-
376
- it "should generate the artists aggregation collection name correctly" do
377
- klass.aggregation_collection_for(:artists).should == "m3s_artists_aggregation"
378
- end
379
-
380
- context "for groupings" do
381
- before :each do
382
- klass.create!(user: "user1", tags: "food ant bee", artists: "jeff greg mandy aaron andy")
383
- klass.create!(user: "user1", tags: "juice food bee zip", artists: "grant andrew andy")
384
- klass.create!(user: "user2", tags: "honey strip food", artists: "mandy aaron andy")
385
- end
386
-
387
- it "should retrieve the list of all saved tags distinct and ordered" do
388
- klass.tags("user1").should == %w[ant bee food juice zip]
389
- klass.tags("user2").should == %w[food honey strip]
390
-
391
- klass.artists("user1").should == %w[aaron andrew andy grant greg jeff mandy]
392
- klass.artists("user2").should == %w[aaron andy mandy]
393
- end
394
-
395
- it "should retrieve a list of tags with weight" do
396
- klass.tags_with_weight("user1").should == [
397
- ['ant', 1],
398
- ['bee', 2],
399
- ['food', 2],
400
- ['juice', 1],
401
- ['zip', 1]
402
- ]
403
-
404
- klass.tags_with_weight("user2").should == [
405
- ['food', 1],
406
- ['honey', 1],
407
- ['strip', 1]
408
- ]
409
-
410
- klass.artists_with_weight("user1").should == [
411
- ['aaron', 1],
412
- ['andrew', 1],
413
- ['andy', 2],
414
- ['grant', 1],
415
- ['greg', 1],
416
- ['jeff', 1],
417
- ['mandy', 1]
418
- ]
419
-
420
- klass.artists_with_weight("user2").should == [
421
- ['aaron', 1],
422
- ['andy', 1],
423
- ['mandy', 1]
424
- ]
425
- end
426
- end
427
- end
428
-
429
- context "removed options" do
430
- it "should throw error if :field option is specified" do
431
- expect do
432
- class Invalid
433
- include Mongoid::Document
434
- include Mongoid::TaggableWithContext
435
- taggable field: :foobar
436
- end
437
- end.to raise_error
438
- end
439
- it "should throw error if :string_method option is specified" do
440
- expect do
441
- class Invalid
442
- include Mongoid::Document
443
- include Mongoid::TaggableWithContext
444
- taggable string_method: :foobar
445
- end
446
- end.to raise_error
447
- end
448
- it "should throw error if GroupBy::TaggableWithContext module is included" do
449
- expect do
450
- class Invalid
451
- include Mongoid::Document
452
- include Mongoid::TaggableWithContext::GroupBy::TaggableWithContext
453
- end
454
- end.to raise_error
455
- end
456
- it "should throw error if GroupBy::AggregationStrategy::RealTime module is included" do
457
- expect do
458
- class Invalid
459
- include Mongoid::Document
460
- include Mongoid::TaggableWithContext::GroupBy::AggregationStrategy::RealTime
461
- end
462
- end.to raise_error
463
- end
464
- end
465
- end
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ class MyModel
4
+ include Mongoid::Document
5
+ include Mongoid::TaggableWithContext
6
+
7
+ taggable
8
+ taggable :artists
9
+ taggable :albums, default: []
10
+ end
11
+
12
+ class M1
13
+ include Mongoid::Document
14
+ include Mongoid::TaggableWithContext
15
+ include Mongoid::TaggableWithContext::AggregationStrategy::MapReduce
16
+
17
+ taggable
18
+ taggable :a, as: :artists
19
+ end
20
+
21
+ class M2
22
+ include Mongoid::Document
23
+ include Mongoid::TaggableWithContext
24
+ include Mongoid::TaggableWithContext::AggregationStrategy::RealTime
25
+
26
+ taggable
27
+ taggable :artists
28
+ end
29
+
30
+ class M3
31
+ include Mongoid::Document
32
+ include Mongoid::TaggableWithContext
33
+ include Mongoid::TaggableWithContext::AggregationStrategy::RealTimeGroupBy
34
+
35
+ field :user
36
+ taggable group_by_field: :user
37
+ taggable :artists, group_by_field: :user
38
+ end
39
+
40
+ describe Mongoid::TaggableWithContext do
41
+
42
+ context "default field value" do
43
+ before :each do
44
+ @m = MyModel.new
45
+ end
46
+
47
+ it "should be nil for artists" do
48
+ @m.artists.should eql nil
49
+ end
50
+
51
+ it "should be array for albums" do
52
+ @m.albums.should eql []
53
+ end
54
+ end
55
+
56
+ context "saving tags from plain text" do
57
+ before :each do
58
+ @m = MyModel.new
59
+ end
60
+
61
+ it "should set tags from string" do
62
+ @m.tags = "some new tag"
63
+ @m.tags.should == %w[some new tag]
64
+ end
65
+
66
+ it "should set artists tags from string" do
67
+ @m.artists = "some new tag"
68
+ @m.artists.should == %w[some new tag]
69
+ end
70
+
71
+ it "should retrieve tags string" do
72
+ @m.tags = %w[some new tags]
73
+ @m.tags_string.should == "some new tags"
74
+ end
75
+
76
+ it "should set tags from tags string" do
77
+ tags = "some cool tags"
78
+ @m.albums_string = tags
79
+ @m.albums.should == tags.split(' ')
80
+ end
81
+
82
+ it "should retrieve artists string" do
83
+ @m.artists = %w[some new tags]
84
+ @m.artists_string.should == "some new tags"
85
+ end
86
+
87
+ it "should strip tags before put in array" do
88
+ @m.tags = "now with some spaces in places "
89
+ @m.tags.should == %w[now with some spaces in places]
90
+ end
91
+
92
+ it "should remove repeated tags from string" do
93
+ @m.tags = "some new tags some new tags"
94
+ @m.tags.should == %w[some new tags]
95
+ end
96
+
97
+ it "should remove repeated tags from array" do
98
+ @m.tags = %w[some new tags some new tags]
99
+ @m.tags.should == %w[some new tags]
100
+ end
101
+
102
+ it "should remove nil tags from array" do
103
+ @m.tags = ["some", nil, "new", nil, "tags"]
104
+ @m.tags.should == %w[some new tags]
105
+ end
106
+
107
+ it "should allow tags to be set to nil" do
108
+ @m.tags = nil
109
+ @m.tags.should == nil
110
+ end
111
+ end
112
+
113
+ context "saving tags from array" do
114
+ before :each do
115
+ @m = MyModel.new
116
+ end
117
+
118
+ it "should remove repeated tags from array" do
119
+ @m.tags = %w[some new tags some new tags]
120
+ @m.tags.should == %w[some new tags]
121
+ end
122
+
123
+ it "should remove nil tags from array" do
124
+ @m.tags = ["some", nil, "new", nil, "tags"]
125
+ @m.tags.should == %w[some new tags]
126
+ end
127
+
128
+ it "should remove empty strings from array" do
129
+ @m.tags = ["some", "", "new", "", "tags"]
130
+ @m.tags.should == %w[some new tags]
131
+ end
132
+ end
133
+
134
+ context "tagged_with" do
135
+ before :each do
136
+ @m1 = MyModel.create!(tags: "food ant bee", artists: "jeff greg mandy aaron andy")
137
+ @m2 = MyModel.create!(tags: "juice food bee zip", artists: "grant andrew andy")
138
+ @m3 = MyModel.create!(tags: "honey strip food", artists: "mandy aaron andy")
139
+ end
140
+
141
+ it "should retrieve a list of documents" do
142
+ (MyModel.tags_tagged_with("food").to_a - [@m1, @m2, @m3]).should be_empty
143
+ (MyModel.artists_tagged_with("aaron").to_a - [@m1, @m3]).should be_empty
144
+ end
145
+ end
146
+
147
+ context "no aggregation" do
148
+ it "should raise AggregationStrategyMissing exception when retreiving tags" do
149
+ lambda{ MyModel.tags }.should raise_error(Mongoid::TaggableWithContext::AggregationStrategyMissing)
150
+ end
151
+
152
+ it "should raise AggregationStrategyMissing exception when retreiving tags with weights" do
153
+ lambda{ MyModel.tags_with_weight }.should raise_error(Mongoid::TaggableWithContext::AggregationStrategyMissing)
154
+ end
155
+
156
+ end
157
+
158
+ shared_examples_for "aggregation" do
159
+ context "retrieving index" do
160
+ context "when there's no tags'" do
161
+ it "should return an empty array" do
162
+ klass.tags.should == []
163
+ klass.artists.should == []
164
+
165
+ klass.tags_with_weight.should == []
166
+ klass.artists_with_weight == []
167
+ end
168
+ end
169
+
170
+ context "on create directly" do
171
+ before :each do
172
+ klass.create!(user: "user1", tags: "food ant bee", artists: "jeff greg mandy aaron andy")
173
+ klass.create!(user: "user1", tags: "juice food bee zip", artists: "grant andrew andy")
174
+ klass.create!(user: "user2", tags: "honey strip food", artists: "mandy aaron andy")
175
+ end
176
+
177
+ it "should retrieve the list of all saved tags distinct and ordered" do
178
+ klass.tags.should == %w[ant bee food honey juice strip zip]
179
+ klass.artists.should == %w[aaron andrew andy grant greg jeff mandy]
180
+ end
181
+
182
+ it "should retrieve a list of tags with weight" do
183
+ klass.tags_with_weight.should == [
184
+ ['ant', 1],
185
+ ['bee', 2],
186
+ ['food', 3],
187
+ ['honey', 1],
188
+ ['juice', 1],
189
+ ['strip', 1],
190
+ ['zip', 1]
191
+ ]
192
+
193
+ klass.artists_with_weight.should == [
194
+ ['aaron', 2],
195
+ ['andrew', 1],
196
+ ['andy', 3],
197
+ ['grant', 1],
198
+ ['greg', 1],
199
+ ['jeff', 1],
200
+ ['mandy', 2]
201
+ ]
202
+ end
203
+ end
204
+
205
+ context "on new then change attributes directly" do
206
+ before :each do
207
+ m = klass.new
208
+ m.tags = "food ant bee"
209
+ m.artists = "jeff greg mandy aaron andy"
210
+ m.save!
211
+
212
+ m = klass.new
213
+ m.tags = "juice food bee zip"
214
+ m.artists = "grant andrew andy"
215
+ m.save!
216
+
217
+ m = klass.new
218
+ m.tags = "honey strip food"
219
+ m.artists = "mandy aaron andy"
220
+ m.save!
221
+ end
222
+
223
+ it "should retrieve the list of all saved tags distinct and ordered" do
224
+ klass.tags.should == %w[ant bee food honey juice strip zip]
225
+ klass.artists.should == %w[aaron andrew andy grant greg jeff mandy]
226
+ end
227
+
228
+ it "should retrieve a list of tags with weight" do
229
+ klass.tags_with_weight.should == [
230
+ ['ant', 1],
231
+ ['bee', 2],
232
+ ['food', 3],
233
+ ['honey', 1],
234
+ ['juice', 1],
235
+ ['strip', 1],
236
+ ['zip', 1]
237
+ ]
238
+
239
+ klass.artists_with_weight.should == [
240
+ ['aaron', 2],
241
+ ['andrew', 1],
242
+ ['andy', 3],
243
+ ['grant', 1],
244
+ ['greg', 1],
245
+ ['jeff', 1],
246
+ ['mandy', 2]
247
+ ]
248
+ end
249
+ end
250
+
251
+ context "on create then update" do
252
+ before :each do
253
+ m1 = klass.create!(user: "user1", tags: "food ant bee", artists: "jeff greg mandy aaron andy")
254
+ m2 = klass.create!(user: "user1", tags: "juice food bee zip", artists: "grant andrew andy")
255
+ m3 = klass.create!(user: "user2", tags: "honey strip food", artists: "mandy aaron andy")
256
+
257
+ m1.tags = m1.tags + %w[honey strip shoe]
258
+ m1.save!
259
+
260
+ m3.artists = m3.artists + %w[grant greg gory]
261
+ m3.save!
262
+ end
263
+
264
+ it "should retrieve the list of all saved tags distinct and ordered" do
265
+ klass.tags.should == %w[ant bee food honey juice shoe strip zip]
266
+ klass.artists.should == %w[aaron andrew andy gory grant greg jeff mandy]
267
+ end
268
+
269
+ it "should retrieve a list of tags with weight" do
270
+ klass.tags_with_weight.should == [
271
+ ['ant', 1],
272
+ ['bee', 2],
273
+ ['food', 3],
274
+ ['honey', 2],
275
+ ['juice', 1],
276
+ ['shoe', 1],
277
+ ['strip', 2],
278
+ ['zip', 1]
279
+ ]
280
+
281
+ klass.artists_with_weight.should == [
282
+ ['aaron', 2],
283
+ ['andrew', 1],
284
+ ['andy', 3],
285
+ ['gory', 1],
286
+ ['grant', 2],
287
+ ['greg', 2],
288
+ ['jeff', 1],
289
+ ['mandy', 2]
290
+ ]
291
+ end
292
+ end
293
+
294
+ context "on create, update, then destroy" do
295
+ before :each do
296
+ m1 = klass.create!(user: "user1", tags: "food ant bee", artists: "jeff greg mandy aaron andy")
297
+ m2 = klass.create!(user: "user1", tags: "juice food bee zip", artists: "grant andrew andy")
298
+ m3 = klass.create!(user: "user2", tags: "honey strip food", artists: "mandy aaron andy")
299
+
300
+ m1.tags = m1.tags + %w[honey strip shoe] - %w[food]
301
+ m1.save!
302
+
303
+ m3.artists = m3.artists + %w[grant greg gory] - %w[andy]
304
+ m3.save!
305
+
306
+ m2.destroy
307
+ end
308
+
309
+ it "should retrieve the list of all saved tags distinct and ordered" do
310
+ klass.tags.should == %w[ant bee food honey shoe strip]
311
+ klass.artists.should == %w[aaron andy gory grant greg jeff mandy]
312
+ end
313
+
314
+ it "should retrieve a list of tags with weight" do
315
+ klass.tags_with_weight.should == [
316
+ ['ant', 1],
317
+ ['bee', 1],
318
+ ['food', 1],
319
+ ['honey', 2],
320
+ ['shoe', 1],
321
+ ['strip', 2]
322
+ ]
323
+
324
+ klass.artists_with_weight.should == [
325
+ ['aaron', 2],
326
+ ['andy', 1],
327
+ ['gory', 1],
328
+ ['grant', 1],
329
+ ['greg', 2],
330
+ ['jeff', 1],
331
+ ['mandy', 2]
332
+ ]
333
+ end
334
+ end
335
+ end
336
+ end
337
+
338
+ context "map-reduce aggregation" do
339
+ let(:klass) { M1 }
340
+ it_should_behave_like "aggregation"
341
+
342
+ it "should generate the tags aggregation collection name correctly" do
343
+ klass.aggregation_collection_for(:tags).should == "m1s_tags_aggregation"
344
+ end
345
+
346
+ it "should generate the artists aggregation collection name correctly" do
347
+ klass.aggregation_collection_for(:artists).should == "m1s_artists_aggregation"
348
+ end
349
+ end
350
+
351
+ context "realtime aggregation" do
352
+ let(:klass) { M2 }
353
+ it_should_behave_like "aggregation"
354
+
355
+ it "should generate the tags aggregation collection name correctly" do
356
+ klass.aggregation_collection_for(:tags).should == "m2s_tags_aggregation"
357
+ end
358
+
359
+ it "should generate the artists aggregation collection name correctly" do
360
+ klass.aggregation_collection_for(:artists).should == "m2s_artists_aggregation"
361
+ end
362
+ end
363
+
364
+ context "realtime aggregation group by" do
365
+ let(:klass) { M3 }
366
+ it_should_behave_like "aggregation"
367
+
368
+ it "should have artists_group_by_field value :user" do
369
+ klass.artists_group_by_field.should == :user
370
+ end
371
+
372
+ it "should generate the tags aggregation collection name correctly" do
373
+ klass.aggregation_collection_for(:tags).should == "m3s_tags_aggregation"
374
+ end
375
+
376
+ it "should generate the artists aggregation collection name correctly" do
377
+ klass.aggregation_collection_for(:artists).should == "m3s_artists_aggregation"
378
+ end
379
+
380
+ context "for groupings" do
381
+ before :each do
382
+ klass.create!(user: "user1", tags: "food ant bee", artists: "jeff greg mandy aaron andy")
383
+ klass.create!(user: "user1", tags: "juice food bee zip", artists: "grant andrew andy")
384
+ klass.create!(user: "user2", tags: "honey strip food", artists: "mandy aaron andy")
385
+ end
386
+
387
+ it "should retrieve the list of all saved tags distinct and ordered" do
388
+ klass.tags("user1").should == %w[ant bee food juice zip]
389
+ klass.tags("user2").should == %w[food honey strip]
390
+
391
+ klass.artists("user1").should == %w[aaron andrew andy grant greg jeff mandy]
392
+ klass.artists("user2").should == %w[aaron andy mandy]
393
+ end
394
+
395
+ it "should retrieve a list of tags with weight" do
396
+ klass.tags_with_weight("user1").should == [
397
+ ['ant', 1],
398
+ ['bee', 2],
399
+ ['food', 2],
400
+ ['juice', 1],
401
+ ['zip', 1]
402
+ ]
403
+
404
+ klass.tags_with_weight("user2").should == [
405
+ ['food', 1],
406
+ ['honey', 1],
407
+ ['strip', 1]
408
+ ]
409
+
410
+ klass.artists_with_weight("user1").should == [
411
+ ['aaron', 1],
412
+ ['andrew', 1],
413
+ ['andy', 2],
414
+ ['grant', 1],
415
+ ['greg', 1],
416
+ ['jeff', 1],
417
+ ['mandy', 1]
418
+ ]
419
+
420
+ klass.artists_with_weight("user2").should == [
421
+ ['aaron', 1],
422
+ ['andy', 1],
423
+ ['mandy', 1]
424
+ ]
425
+ end
426
+ end
427
+ end
428
+
429
+ context "removed options" do
430
+ it "should throw error if :field option is specified" do
431
+ expect do
432
+ class Invalid
433
+ include Mongoid::Document
434
+ include Mongoid::TaggableWithContext
435
+ taggable field: :foobar
436
+ end
437
+ end.to raise_error
438
+ end
439
+ it "should throw error if :string_method option is specified" do
440
+ expect do
441
+ class Invalid
442
+ include Mongoid::Document
443
+ include Mongoid::TaggableWithContext
444
+ taggable string_method: :foobar
445
+ end
446
+ end.to raise_error
447
+ end
448
+ it "should throw error if GroupBy::TaggableWithContext module is included" do
449
+ expect do
450
+ class Invalid
451
+ include Mongoid::Document
452
+ include Mongoid::TaggableWithContext::GroupBy::TaggableWithContext
453
+ end
454
+ end.to raise_error
455
+ end
456
+ it "should throw error if GroupBy::AggregationStrategy::RealTime module is included" do
457
+ expect do
458
+ class Invalid
459
+ include Mongoid::Document
460
+ include Mongoid::TaggableWithContext::GroupBy::AggregationStrategy::RealTime
461
+ end
462
+ end.to raise_error
463
+ end
464
+ end
465
+ end