mongoid_slug 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mongoid_slug.rb CHANGED
@@ -12,6 +12,7 @@ module Mongoid::Slug
12
12
  options = args.last.is_a?(Hash) ? args.pop : {}
13
13
  self.slug_name = options[:as] || :slug
14
14
  self.slugged_fields = args
15
+
15
16
  field slug_name
16
17
  index slug_name, :unique => true
17
18
  before_save :generate_slug
@@ -19,25 +20,33 @@ module Mongoid::Slug
19
20
  end
20
21
 
21
22
  def to_param
22
- slug
23
+ self.send slug_name
23
24
  end
24
25
 
25
26
  private
26
27
 
27
- def duplicate_of(slug, association_chain=[])
28
+ def find_(slug, stack=[])
28
29
  if embedded?
29
- association_chain << association_name
30
- _parent.send :duplicate_of, slug, association_chain
30
+ stack << association_name
31
+ _parent.send :find_, slug, stack
31
32
  else
32
- association_chain.reverse! << "slug"
33
- collection.find(association_chain.join(".") => slug)
33
+ stack.reverse!
34
+ path = (stack + [slug_name]).join(".")
35
+ found = collection.find(path => slug).to_a
36
+
37
+ stack.each do |name|
38
+ if found.any?
39
+ found = found.first.send(name)
40
+ end
41
+ end
42
+
43
+ found
34
44
  end
35
45
  end
36
46
 
37
47
  def find_unique_slug(suffix='')
38
48
  slug = ("#{slug_base} #{suffix}").parameterize
39
-
40
- if duplicate_of(slug).reject{ |doc| doc.id == self.id }.empty?
49
+ if find_(slug).to_a.reject{ |doc| doc.id == self.id }.empty?
41
50
  slug
42
51
  else
43
52
  suffix = suffix.blank? ? '1' : "#{suffix.to_i + 1}"
@@ -2,5 +2,6 @@ class Person
2
2
  include Mongoid::Document
3
3
  include Mongoid::Slug
4
4
  field :name
5
+ field :age, :type => Integer
5
6
  slug :name, :as => :permalink
6
7
  end
@@ -24,27 +24,27 @@ describe Mongoid::Slug do
24
24
 
25
25
  it "appends a counter when slug is not unique" do
26
26
  similar_book = Book.create(:title => @book.title)
27
- similar_book.slug.should match /\d$/
27
+ similar_book.to_param.should match /\d$/
28
28
  end
29
29
 
30
30
  it "does not append a counter when slug is unique" do
31
- @book.slug.should_not match /\d$/
31
+ @book.to_param.should_not match /\d$/
32
32
  end
33
33
 
34
34
  it "does not update slug if slugged fields have not changed" do
35
- former_slug = @book.slug
35
+ former_slug = @book.to_param
36
36
  @book.update_attributes(:isbn => "9785545858118")
37
- @book.slug.should eql former_slug
37
+ @book.to_param.should eql former_slug
38
38
  end
39
39
 
40
40
  it "does not update slug if slugged fields have changed but generated slug is the same" do
41
- former_slug = @book.slug
41
+ former_slug = @book.to_param
42
42
  @book.update_attributes(:title => "A thousand plateaus")
43
- @book.slug.should eql former_slug
43
+ @book.to_param.should eql former_slug
44
44
  end
45
45
 
46
46
  it "finds by slug" do
47
- Book.where(:slug => @book.slug).first.should eql @book
47
+ Book.where(:slug => @book.to_param).first.should eql @book
48
48
  end
49
49
 
50
50
  end
@@ -71,21 +71,27 @@ describe Mongoid::Slug do
71
71
 
72
72
  it "appends a counter when slug is not unique" do
73
73
  similar_subject = @book.subjects.create(:name => @subject.name)
74
- similar_subject.slug.should match /\d$/
74
+ similar_subject.to_param.should match /\d$/
75
75
  end
76
76
 
77
77
  it "does not append a counter when slug is unique" do
78
- @subject.slug.should_not match /\d$/
78
+ @subject.to_param.should_not match /\d$/
79
79
  end
80
80
 
81
- it "does not update slug if slugged field has not changed" do
82
- former_slug = @subject.slug
81
+ it "does not update slug if slugged fields have not changed" do
82
+ former_slug = @subject.to_param
83
83
  @subject.update_attributes(:description => "Lorem ipsum dolor sit amet")
84
- @subject.slug.should eql former_slug
84
+ @subject.to_param.should eql former_slug
85
+ end
86
+
87
+ it "does not update slug if slugged fields have changed but generated slug is the same" do
88
+ former_slug = @subject.to_param
89
+ @subject.update_attributes(:title => "PSYCHOANALYSIS")
90
+ @subject.to_param.should eql former_slug
85
91
  end
86
92
 
87
93
  it "finds by slug" do
88
- @book.subjects.where(:slug => @subject.slug).first.should eql @subject
94
+ @book.subjects.where(:slug => @subject.to_param).first.should eql @subject
89
95
  end
90
96
 
91
97
  end
@@ -105,10 +111,16 @@ describe Mongoid::Slug do
105
111
  @publisher.to_param.should eql "Harvard UP".parameterize
106
112
  end
107
113
 
108
- it "does not update slug if slugged field has not changed" do
109
- former_slug = @publisher.slug
114
+ it "does not update slug if slugged fields have not changed" do
115
+ former_slug = @publisher.to_param
110
116
  @publisher.update_attributes(:year => 2001)
111
- @publisher.slug.should eql former_slug
117
+ @publisher.to_param.should eql former_slug
118
+ end
119
+
120
+ it "does not update slug if slugged fields have changed but generated slug is the same" do
121
+ former_slug = @publisher.to_param
122
+ @publisher.update_attributes(:name => "oup")
123
+ @publisher.to_param.should eql former_slug
112
124
  end
113
125
 
114
126
  end
@@ -136,11 +148,17 @@ describe Mongoid::Slug do
136
148
  it "appends a counter when slug is not unique" do
137
149
  similar_author = Author.create(:first_name => @author.first_name,
138
150
  :last_name => @author.last_name)
139
- similar_author.slug.should match /\d$/
151
+ similar_author.to_param.should match /\d$/
140
152
  end
141
153
 
142
154
  it "does not append a counter when slug is unique" do
143
- @author.slug.should_not match /\d$/
155
+ @author.to_param.should_not match /\d$/
156
+ end
157
+
158
+ it "does not update slug if slugged fields have changed but generated slug is the same" do
159
+ former_slug = @author.to_param
160
+ @author.update_attributes(:first_name => "gilles", :last_name => "DELEUZE")
161
+ @author.to_param.should eql former_slug
144
162
  end
145
163
 
146
164
  it "finds by slug" do
@@ -174,21 +192,27 @@ describe Mongoid::Slug do
174
192
 
175
193
  it "appends a counter when slug is not unique" do
176
194
  similar_baz = @bar.bazes.create(:name => @baz.name)
177
- similar_baz.slug.should match /\d$/
195
+ similar_baz.to_param.should match /\d$/
178
196
  end
179
197
 
180
198
  it "does not append a counter when slug is unique" do
181
- @baz.slug.should_not match /\d$/
199
+ @baz.to_param.should_not match /\d$/
182
200
  end
183
201
 
184
- it "does not update slug if slugged field has not changed" do
185
- former_slug = @baz.slug
202
+ it "does not update slug if slugged fields have not changed" do
203
+ former_slug = @baz.to_param
186
204
  @baz.update_attributes(:other => "Lorem ipsum dolor sit amet")
187
- @baz.slug.should eql former_slug
205
+ @baz.to_param.should eql former_slug
206
+ end
207
+
208
+ it "does not update slug if slugged fields have changed but generated slug is the same" do
209
+ former_slug = @baz.to_param
210
+ @baz.update_attributes(:name => "BAZ")
211
+ @baz.to_param.should eql former_slug
188
212
  end
189
213
 
190
214
  it "finds by slug" do
191
- @bar.bazes.where(:slug => @baz.slug).first.should eql @baz
215
+ @bar.bazes.where(:slug => @baz.to_param).first.should eql @baz
192
216
  end
193
217
 
194
218
  end
@@ -204,9 +228,48 @@ describe Mongoid::Slug do
204
228
  @person.send(:permalink).should eql "john-doe"
205
229
  end
206
230
 
231
+ it "generates slug" do
232
+ @person.to_param.should eql(@person.name.parameterize)
233
+ end
234
+
235
+ it "updates slug" do
236
+ @person.update_attributes(:name => "Jane Doe")
237
+ @person.to_param.should eql "Jane Doe".parameterize
238
+ end
239
+
240
+ it "generates a unique slug" do
241
+ similar_person = Person.create(:name => @person.name)
242
+ similar_person.to_param.should_not eql @person.to_param
243
+ end
244
+
245
+ it "appends a counter when slug is not unique" do
246
+ similar_person = Person.create(:name => @person.name)
247
+ similar_person.to_param.should match /\d$/
248
+ end
249
+
250
+ it "does not append a counter when slug is unique" do
251
+ @person.to_param.should_not match /\d$/
252
+ end
253
+
254
+ it "does not update slug if slugged fields have not changed" do
255
+ former_slug = @person.to_param
256
+ @person.update_attributes(:age => 31)
257
+ @person.to_param.should eql former_slug
258
+ end
259
+
260
+ it "does not update slug if slugged fields have changed but generated slug is the same" do
261
+ former_slug = @person.to_param
262
+ @person.update_attributes(:name => "JOHN DOE")
263
+ @person.to_param.should eql former_slug
264
+ end
265
+
266
+ it "finds by slug" do
267
+ Person.where(:permalink => @person.to_param).first.should eql @person
268
+ end
269
+
207
270
  end
208
271
 
209
- context "#duplicate_of" do
272
+ context "#find_" do
210
273
 
211
274
  before(:each) do
212
275
  @foo = Foo.create(:name => "foo")
@@ -215,15 +278,15 @@ describe Mongoid::Slug do
215
278
  end
216
279
 
217
280
  it "finds duplicate slug of a root document" do
218
- @foo.send(:duplicate_of, @foo.slug).count.should eql 1
281
+ @foo.send(:find_, @foo.to_param).count.should eql 1
219
282
  end
220
283
 
221
284
  it "finds duplicate slug of an embedded document" do
222
- @bar.send(:duplicate_of, @bar.slug).count.should eql 1
285
+ @bar.send(:find_, @bar.to_param).count.should eql 1
223
286
  end
224
287
 
225
288
  it "finds duplicate slug of a deeply-embedded document" do
226
- @baz.send(:duplicate_of, @baz.slug).count.should eql 1
289
+ @baz.send(:find_, @baz.to_param).count.should eql 1
227
290
  end
228
291
 
229
292
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_slug
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 3
10
- version: 0.4.3
9
+ - 4
10
+ version: 0.4.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Hakan Ensari
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-07-07 00:00:00 +01:00
19
+ date: 2010-07-08 00:00:00 +01:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency