slug 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :minor: 5
3
- :patch: 4
2
+ :patch: 5
4
3
  :major: 0
4
+ :minor: 5
data/lib/slug/slug.rb CHANGED
@@ -8,10 +8,13 @@ module Slug
8
8
  #
9
9
  # Options:
10
10
  # * <tt>:column</tt> - the column the slug will be saved to (defaults to <tt>:slug</tt>)
11
+ # * <tt>:validates_uniquness_if</tt> - proc to determine whether uniqueness validation runs, same format as validates_uniquness_of :if
11
12
  #
12
- # Slug will take care of validating presence and uniqueness of slug. It will generate the slug before create;
13
- # subsequent changes to the source column will have no effect on the slug. If you'd like to update the slug
14
- # later on, call <tt>@model.set_slug</tt>
13
+ # Slug will take care of validating presence and uniqueness of slug.
14
+
15
+ # Before create, Slug will generate and assign the slug if it wasn't explicitly set.
16
+ # Note that subsequent changes to the source column will have no effect on the slug.
17
+ # If you'd like to update the slug later on, call <tt>@model.set_slug</tt>
15
18
  def slug source, opts={}
16
19
  class_inheritable_accessor :slug_source, :slug_column
17
20
  include InstanceMethods
@@ -19,9 +22,12 @@ module Slug
19
22
  self.slug_source = source
20
23
 
21
24
  self.slug_column = opts.has_key?(:column) ? opts[:column] : :slug
25
+
26
+ uniqueness_opts = {}
27
+ uniqueness_opts.merge!(:if => opts[:validates_uniqueness_if]) if opts[:validates_uniqueness_if].present?
22
28
 
23
29
  validates_presence_of self.slug_column, :message => "cannot be blank. Is #{self.slug_source} sluggable?"
24
- validates_uniqueness_of self.slug_column
30
+ validates_uniqueness_of self.slug_column, uniqueness_opts
25
31
  validates_format_of self.slug_column, :with => /^[a-z0-9-]+$/, :message => "contains invalid characters. Only downcase letters, numbers, and '-' are allowed."
26
32
  before_validation_on_create :set_slug
27
33
  end
@@ -32,7 +38,7 @@ module Slug
32
38
  # Sets the slug. Called before create.
33
39
  def set_slug
34
40
  validate_slug_columns
35
- self[self.slug_column] = self.send(self.slug_source)
41
+ self[self.slug_column] = self.send(self.slug_source) if self[self.slug_column].blank?
36
42
 
37
43
  strip_diacritics_from_slug
38
44
  normalize_slug
@@ -63,9 +69,9 @@ module Slug
63
69
  s = ActiveSupport::Multibyte.proxy_class.new(self[self.slug_column]).normalize(:kc)
64
70
  s.downcase!
65
71
  s.strip!
66
- s.gsub!(/[^\w\s-]/u, '') # Remove non-word characters
67
- s.gsub!(/\s+/u, '-') # Convert whitespaces to dashes
68
- s.gsub!(/-\z/u, '') # Remove trailing dashes
72
+ s.gsub!(/[^\w\s-]/, '') # Remove non-word characters
73
+ s.gsub!(/\s+/, '-') # Convert whitespaces to dashes
74
+ s.gsub!(/-\z/, '') # Remove trailing dashes
69
75
  s.gsub!(/-+/, '-') # get rid of double-dashes
70
76
  self[self.slug_column] = s.to_s
71
77
  end
data/slug.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{slug}
8
- s.version = "0.5.4"
8
+ s.version = "0.5.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ben Koski"]
12
- s.date = %q{2010-03-30}
12
+ s.date = %q{2010-04-29}
13
13
  s.description = %q{Simple, straightforward slugs for your ActiveRecord models.}
14
14
  s.email = %q{ben.koski@gmail.com}
15
15
  s.extra_rdoc_files = [
data/test/models.rb CHANGED
@@ -13,6 +13,10 @@ class Company < ActiveRecord::Base
13
13
  slug :name
14
14
  end
15
15
 
16
+ class Post < ActiveRecord::Base
17
+ slug :headline, :validates_uniqueness_if => Proc.new { false }
18
+ end
19
+
16
20
  # Used to test slugs based on methods rather than database attributes
17
21
  class Event < ActiveRecord::Base
18
22
  slug :title_for_slug
data/test/schema.rb CHANGED
@@ -16,6 +16,11 @@ ActiveRecord::Schema.define(:version => 1) do
16
16
  t.column "slug", "string"
17
17
  end
18
18
 
19
+ create_table "posts", :force => true do |t|
20
+ t.column "headline", "string"
21
+ t.column "slug", "string"
22
+ end
23
+
19
24
  create_table "events", :force => true do |t|
20
25
  t.column "title", "string"
21
26
  t.column "location", "string"
data/test/test_slug.rb CHANGED
@@ -67,7 +67,30 @@ class TestSlug < Test::Unit::TestCase
67
67
  assert !article.valid?
68
68
  assert article.errors[:slug].present?
69
69
  end
70
+
71
+ should "validate uniqueness of slug by default" do
72
+ article1 = Article.create!(:headline => 'Test Headline')
73
+ article2 = Article.create!(:headline => 'Test Headline')
74
+ article2.slug = 'test-headline'
75
+
76
+ assert !article2.valid?
77
+ assert article2.errors[:slug].present?
78
+ end
70
79
 
80
+ should "use validate_uniquness_if proc to decide whether uniqueness validation applies" do
81
+ article1 = Post.create!(:headline => 'Test Headline')
82
+ article2 = Post.new
83
+ article2.slug = 'test-headline'
84
+
85
+ assert article2.valid?
86
+ end
87
+
88
+ should "not overwrite slug value on create if it was already specified" do
89
+ a = Article.create!(:headline => 'Test Headline', :slug => 'slug1')
90
+ assert_equal 'slug1', a.slug
91
+ end
92
+
93
+
71
94
  context "slug normalization" do
72
95
  setup do
73
96
  @article = Article.new
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Koski
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-30 00:00:00 -04:00
12
+ date: 2010-04-29 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency