has_unique_slug 0.1.5 → 0.1.6

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 ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ script: bundle exec rspec spec
data/README.md CHANGED
@@ -52,6 +52,11 @@ All the standard url helper methods will still work since `to_param` is overrid
52
52
  post = Post.create! :title => "Sample Post"
53
53
  post_path(post) # /posts/sample-post
54
54
 
55
+
56
+ ## Gotchas
57
+
58
+ If you are adding this to an existing project that already contains records, perform the necessary setup then run something like `Post.all.each {|p| p.save }` in the rails console to populate the slug columns.
59
+
55
60
  ## TODO:
56
61
 
57
62
  - Add support for scopes
@@ -16,9 +16,9 @@ module HasUniqueSlug
16
16
  def has_unique_slug args = {}
17
17
 
18
18
  # Setup default options
19
- options = { :column => :slug, :subject => :title }
19
+ options = { :column => :slug, :subject => :title, :scope => nil }
20
20
  options.merge! args
21
- slug_column, subject_column = options[:column], options[:subject]
21
+ slug_column, subject_column, scope_column = options[:column], options[:subject], options[:scope]
22
22
 
23
23
  # Use before_validates otherwise ActiveRecord uniqueness validations on the model will fail. Uniqueness is already guarneteed.
24
24
  # It is not recommend to use a 'validates :slug, :uniqueness => true' validation because that will add unndeeded stress on the
@@ -31,6 +31,13 @@ module HasUniqueSlug
31
31
  # Ensure the current slug is unique in the database, if not, make it unqiue
32
32
  test_slug, i = slug_prefix, 1
33
33
  record_scope = record.new_record? ? record.class.scoped : record.class.where("id != ?", record.id)
34
+
35
+ # Add scope to uniqueness call
36
+ unless scope_column.nil?
37
+ record_scope = record_scope.where("#{scope_column} = ?", record[scope_column])
38
+ end
39
+
40
+ # Test for uniqueness
34
41
  while not record_scope.where("#{slug_column} = ?", test_slug).count.zero?
35
42
  test_slug = "#{slug_prefix}-#{(i += 1)}"
36
43
  end
@@ -1,3 +1,3 @@
1
1
  module HasUniqueSlug
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
@@ -8,6 +8,14 @@ class Standard < ActiveRecord::Base
8
8
  end
9
9
  end
10
10
 
11
+ class StandardWithScope < ActiveRecord::Base
12
+ has_unique_slug :scope => :some_scope
13
+
14
+ def self.table_name
15
+ "standard"
16
+ end
17
+ end
18
+
11
19
  class Custom < ActiveRecord::Base
12
20
  has_unique_slug :column => :permalink, :subject => :name
13
21
 
@@ -34,12 +42,18 @@ describe HasUniqueSlug do
34
42
  teardown_db
35
43
  end
36
44
 
45
+ after(:each) do
46
+ Standard.destroy_all
47
+ Custom.destroy_all
48
+ end
49
+
37
50
  it "creates a unique slug" do
38
51
  r = Standard.create! :title => "Sample Record"
39
52
  r.slug.should == "sample-record"
40
53
  end
41
54
 
42
55
  it "should add incremental column if not unique" do
56
+ Standard.create! :title => "Sample Record"
43
57
  2.upto 5 do |i|
44
58
  r = Standard.create! :title => "Sample Record"
45
59
  r.slug.should == "sample-record-#{i}"
@@ -47,7 +61,7 @@ describe HasUniqueSlug do
47
61
  end
48
62
 
49
63
  it "should not increment the slug if the duplicate is itself" do
50
- r = Standard.last
64
+ r = Standard.create! :title => "Sample Record"
51
65
  slug = r.slug
52
66
  r.save.should be_true
53
67
  r.slug.should == slug
@@ -79,4 +93,20 @@ describe HasUniqueSlug do
79
93
  r.permalink.should == slug
80
94
  end
81
95
 
96
+ it "should allow two slugs with the same value if scopes differ" do
97
+ r = StandardWithScope.create! :title => "Sample Record", :some_scope => 1
98
+ r.slug.should == "sample-record"
99
+
100
+ r = StandardWithScope.create! :title => "Sample Record", :some_scope => 2
101
+ r.slug.should == "sample-record"
102
+ end
103
+
104
+ it "should increment the slug if two records share the same scope" do
105
+ r = StandardWithScope.create! :title => "Sample Record", :some_scope => 1
106
+ r.slug.should == "sample-record"
107
+
108
+ r = StandardWithScope.create! :title => "Sample Record", :some_scope => 1
109
+ r.slug.should == "sample-record-2"
110
+ end
111
+
82
112
  end
data/spec/spec_helper.rb CHANGED
@@ -18,6 +18,7 @@ def setup_db
18
18
  create_table :standard do |t|
19
19
  t.column :title, :string
20
20
  t.column :slug, :string
21
+ t.column :some_scope, :integer
21
22
  end
22
23
  create_table :custom do |t|
23
24
  t.column :name, :string
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_unique_slug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-28 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70285815385920 !ruby/object:Gem::Requirement
16
+ requirement: &70256493008000 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70285815385920
24
+ version_requirements: *70256493008000
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activerecord
27
- requirement: &70285815385340 !ruby/object:Gem::Requirement
27
+ requirement: &70256493007320 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70285815385340
35
+ version_requirements: *70256493007320
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sqlite3
38
- requirement: &70285815384660 !ruby/object:Gem::Requirement
38
+ requirement: &70256493006540 !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: *70285815384660
46
+ version_requirements: *70256493006540
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &70285815383900 !ruby/object:Gem::Requirement
49
+ requirement: &70256493005660 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70285815383900
57
+ version_requirements: *70256493005660
58
58
  description: Generates a unique slug for use as a drop-in replacement for ids.
59
59
  email:
60
60
  - brendan@unknowncollective.com
@@ -63,6 +63,7 @@ extensions: []
63
63
  extra_rdoc_files: []
64
64
  files:
65
65
  - .gitignore
66
+ - .travis.yml
66
67
  - Gemfile
67
68
  - README.md
68
69
  - Rakefile
@@ -85,7 +86,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
85
86
  version: '0'
86
87
  segments:
87
88
  - 0
88
- hash: -4232824133400025288
89
+ hash: -4480308170059512738
89
90
  required_rubygems_version: !ruby/object:Gem::Requirement
90
91
  none: false
91
92
  requirements:
@@ -94,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
95
  version: '0'
95
96
  segments:
96
97
  - 0
97
- hash: -4232824133400025288
98
+ hash: -4480308170059512738
98
99
  requirements: []
99
100
  rubyforge_project: has_unique_slug
100
101
  rubygems_version: 1.8.10