mongoid-slugify 0.0.2 → 0.0.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.
data/.travis.yml CHANGED
@@ -2,6 +2,8 @@ rvm:
2
2
  - 1.8.7
3
3
  - 1.9.2
4
4
  - 1.9.3
5
- - rbx-2.0
6
- - jruby
5
+ - rbx-18mode
6
+ - rbx-19mode
7
+ - jruby-18mode
8
+ - jruby-19mode
7
9
  - ree
data/Gemfile CHANGED
@@ -4,4 +4,3 @@ source 'http://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  gem 'bson_ext', :platforms => :ruby
7
- gem 'activesupport', '~> 3.2.0'
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Slugify
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -9,39 +9,9 @@ module Mongoid
9
9
  included do
10
10
  field :slug
11
11
  index :slug, :unique => true
12
- before_save :assign_slug
12
+ before_save :assign_slug, :if => :assign_slug?
13
13
  end
14
14
 
15
- def to_param
16
- slug || super
17
- end
18
-
19
- private
20
- def generate_slug
21
- raise NotImplementedError
22
- end
23
-
24
- def generate_unique_slug
25
- current_slug = generate_slug
26
- pattern = /^#{Regexp.escape(current_slug)}(?:-(\d+))?$/
27
-
28
- appropriate_class = self.class
29
- while (appropriate_class.superclass.include?(Mongoid::Document))
30
- appropriate_class = appropriate_class.superclass
31
- end
32
-
33
- existing_slugs = appropriate_class.where(:slug => pattern, :_id.ne => _id).only(:slug).map { |record| record.slug }
34
- if existing_slugs.count > 0
35
- max_counter = existing_slugs.map { |slug| (pattern.match(slug)[1] || 0).to_i }.max
36
- current_slug += "-#{max_counter + 1}"
37
- end
38
- current_slug
39
- end
40
-
41
- def assign_slug
42
- self.slug = generate_unique_slug
43
- end
44
-
45
15
  module ClassMethods
46
16
  def find_by_slug(slug)
47
17
  where(:slug => slug).first
@@ -52,12 +22,47 @@ module Mongoid
52
22
  end
53
23
 
54
24
  def find_by_slug_or_id(slug_or_id)
55
- find_by_slug(slug_or_id) || where(:id => id).first
25
+ find_by_slug(slug_or_id) || where(:_id => slug_or_id).first
56
26
  end
57
27
 
58
28
  def find_by_slug_or_id!(slug_or_id)
59
29
  find_by_slug(slug_or_id) || find(slug_or_id)
60
30
  end
61
31
  end
32
+
33
+ def to_param
34
+ slug || super
35
+ end
36
+
37
+ private
38
+ def assign_slug?
39
+ true
40
+ end
41
+
42
+ def generate_slug
43
+ raise NotImplementedError
44
+ end
45
+
46
+ def generate_unique_slug
47
+ current_slug = generate_slug
48
+ pattern = /^#{Regexp.escape(current_slug)}(?:-(\d+))?$/
49
+
50
+ appropriate_class = self.class
51
+ while (appropriate_class.superclass.include?(Mongoid::Document))
52
+ appropriate_class = appropriate_class.superclass
53
+ end
54
+
55
+ existing_slugs = appropriate_class.where(:slug => pattern, :_id.ne => _id).only(:slug).map { |record| record.slug }
56
+ if existing_slugs.count > 0
57
+ max_counter = existing_slugs.map { |slug| (pattern.match(slug)[1] || 0).to_i }.max
58
+ current_slug << "-#{max_counter + 1}"
59
+ end
60
+
61
+ current_slug
62
+ end
63
+
64
+ def assign_slug
65
+ self.slug = generate_unique_slug
66
+ end
62
67
  end
63
68
  end
@@ -32,6 +32,13 @@ end
32
32
  class ComicBook < Book
33
33
  end
34
34
 
35
+ class CookBook < Book
36
+ private
37
+ def assign_slug?
38
+ slug.blank?
39
+ end
40
+ end
41
+
35
42
  class Person
36
43
  include Mongoid::Document
37
44
  include Mongoid::Slugify
@@ -98,6 +105,36 @@ module Mongoid
98
105
  end
99
106
  end
100
107
 
108
+ context "when assign_slug? is configured to work only when slug is empty" do
109
+ let(:book) do
110
+ CookBook.create(:title => "A Thousand Plateaus")
111
+ end
112
+
113
+ it "generates a slug" do
114
+ book.to_param.should eql "a-thousand-plateaus"
115
+ end
116
+
117
+ it "does not update the slug" do
118
+ book.title = "Anti Oedipus"
119
+ book.save
120
+ book.to_param.should eql "a-thousand-plateaus"
121
+ end
122
+
123
+ it "updates the slug if it's nil" do
124
+ book.title = "Anti Oedipus"
125
+ book.slug = nil
126
+ book.save
127
+ book.to_param.should eql "anti-oedipus"
128
+ end
129
+
130
+ it "updates the slug if it's empty" do
131
+ book.title = "Anti Oedipus"
132
+ book.slug = ""
133
+ book.save
134
+ book.to_param.should eql "anti-oedipus"
135
+ end
136
+ end
137
+
101
138
  context "when the slug is composed of multiple fields" do
102
139
  let!(:author) do
103
140
  Author.create(
@@ -203,29 +240,43 @@ module Mongoid
203
240
  end
204
241
  end
205
242
 
206
- describe ".find_by_slug" do
207
- let!(:book) { Book.create(:title => "A Thousand Plateaus") }
243
+ describe 'ClassMethods' do
244
+ let(:book) { Book.create(:title => "A Thousand Plateaus") }
208
245
 
209
- it "returns nil if no document is found" do
210
- Book.find_by_slug(:title => "Anti Oedipus").should be_nil
211
- end
246
+ describe ".find_by_slug" do
247
+ it "returns nil if no document is found" do
248
+ Book.find_by_slug("Anti Oedipus").should be_nil
249
+ end
212
250
 
213
- it "returns the document if it is found" do
214
- Book.find_by_slug(book.slug).should == book
251
+ it "returns the document if it is found" do
252
+ Book.find_by_slug(book.slug).should == book
253
+ end
215
254
  end
216
- end
217
255
 
218
- describe ".find_by_slug!" do
219
- let!(:book) { Book.create(:title => "A Thousand Plateaus") }
256
+ describe ".find_by_slug!" do
257
+ it "raises a Mongoid::Errors::DocumentNotFound error if no document is found" do
258
+ lambda {
259
+ Book.find_by_slug!("Anti Oedipus")
260
+ }.should raise_error(Mongoid::Errors::DocumentNotFound)
261
+ end
220
262
 
221
- it "raises a Mongoid::Errors::DocumentNotFound error if no document is found" do
222
- lambda {
223
- Book.find_by_slug!(:title => "Anti Oedipus")
224
- }.should raise_error(Mongoid::Errors::DocumentNotFound)
263
+ it "returns the document when it is found" do
264
+ Book.find_by_slug!(book.slug).should == book
265
+ end
225
266
  end
226
267
 
227
- it "returns the document when it is found" do
228
- Book.find_by_slug!(book.slug).should == book
268
+ describe ".find_by_slug_or_id" do
269
+ it "returns nil if no document is found" do
270
+ Book.find_by_slug_or_id("Anti Oedipus").should be_nil
271
+ end
272
+
273
+ it "returns the document when it is found by slug" do
274
+ Book.find_by_slug_or_id(book.slug).should == book
275
+ end
276
+
277
+ it "returns the document when it is found by id" do
278
+ Book.find_by_slug_or_id(book.id).should == book
279
+ end
229
280
  end
230
281
  end
231
282
  end
data/spec/spec_helper.rb CHANGED
@@ -2,8 +2,7 @@ require "bundler/setup"
2
2
  Bundler.require(:default, :development)
3
3
 
4
4
  Mongoid.configure do |config|
5
- name = "mongoid_slugify_test"
6
- config.master = Mongo::Connection.new.db(name)
5
+ config.master = Mongo::Connection.new.db("mongoid_slugify_test")
7
6
  end
8
7
 
9
8
  DatabaseCleaner.strategy = :truncation
@@ -13,7 +12,7 @@ RSpec.configure do |config|
13
12
  config.before :each do
14
13
  DatabaseCleaner.start
15
14
  end
16
-
15
+
17
16
  config.after :each do
18
17
  DatabaseCleaner.clean
19
18
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-slugify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-01 00:00:00.000000000 Z
12
+ date: 2012-05-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &70152738090960 !ruby/object:Gem::Requirement
16
+ requirement: &70279909356200 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70152738090960
24
+ version_requirements: *70279909356200
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mongoid
27
- requirement: &70152738090440 !ruby/object:Gem::Requirement
27
+ requirement: &70279909355580 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '2.0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70152738090440
35
+ version_requirements: *70279909355580
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &70152738089980 !ruby/object:Gem::Requirement
38
+ requirement: &70279909354960 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70152738089980
46
+ version_requirements: *70279909354960
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70152738089400 !ruby/object:Gem::Requirement
49
+ requirement: &70279909354460 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70152738089400
57
+ version_requirements: *70279909354460
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: database_cleaner
60
- requirement: &70152738088960 !ruby/object:Gem::Requirement
60
+ requirement: &70279909353820 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70152738088960
68
+ version_requirements: *70279909353820
69
69
  description: Provides a simple way to add slug generation to a Mongoid model
70
70
  email:
71
71
  - fxposter@gmail.com