slug 0.5.2 → 0.5.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/VERSION.yml +1 -1
- data/lib/slug/slug.rb +8 -7
- data/slug.gemspec +4 -5
- data/test/test_slug.rb +27 -4
- metadata +2 -2
data/VERSION.yml
CHANGED
data/lib/slug/slug.rb
CHANGED
@@ -20,8 +20,9 @@ module Slug
|
|
20
20
|
|
21
21
|
self.slug_column = opts.has_key?(:column) ? opts[:column] : :slug
|
22
22
|
|
23
|
-
validates_presence_of
|
24
|
-
validates_uniqueness_of
|
23
|
+
validates_presence_of self.slug_column, :message => "#{self.slug_column} cannot be blank. Is #{self.slug_source} sluggable?"
|
24
|
+
validates_uniqueness_of self.slug_column
|
25
|
+
validates_format_of self.slug_column, :with => /^[a-z0-9-]+/, :message => "#{self.slug_column} contains invalid characters. Only downcase letters, numbers, and '-' are allowed."
|
25
26
|
before_validation_on_create :set_slug
|
26
27
|
end
|
27
28
|
end
|
@@ -54,7 +55,7 @@ module Slug
|
|
54
55
|
raise ArgumentError, "Source column '#{self.slug_source}' does not exist!" if !self.respond_to?(self.slug_source)
|
55
56
|
raise ArgumentError, "Slug column '#{self.slug_column}' does not exist!" if !self.respond_to?("#{self.slug_column}=")
|
56
57
|
end
|
57
|
-
|
58
|
+
|
58
59
|
# Takes the slug, downcases it and replaces non-word characters with a -.
|
59
60
|
# Feel free to override this method if you'd like different slug formatting.
|
60
61
|
def normalize_slug
|
@@ -62,9 +63,10 @@ module Slug
|
|
62
63
|
s = ActiveSupport::Multibyte.proxy_class.new(self[self.slug_column]).normalize(:kc)
|
63
64
|
s.downcase!
|
64
65
|
s.strip!
|
65
|
-
s.gsub!(/[\
|
66
|
-
s.gsub!(/\s+/u, '-')
|
67
|
-
s.gsub!(/-\z/u, '')
|
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
|
69
|
+
s.gsub!(/-+/, '-') # get rid of double-dashes
|
68
70
|
self[self.slug_column] = s.to_s
|
69
71
|
end
|
70
72
|
|
@@ -83,7 +85,6 @@ module Slug
|
|
83
85
|
a
|
84
86
|
end
|
85
87
|
s = s.pack('U*')
|
86
|
-
s.gsub!(/[^a-z0-9]+/i, ' ')
|
87
88
|
self[self.slug_column] = s.to_s
|
88
89
|
end
|
89
90
|
|
data/slug.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{slug}
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.3"
|
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{
|
12
|
+
s.date = %q{2010-03-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 = [
|
@@ -59,4 +59,3 @@ Gem::Specification.new do |s|
|
|
59
59
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
data/test/test_slug.rb
CHANGED
@@ -45,15 +45,12 @@ class TestSlug < Test::Unit::TestCase
|
|
45
45
|
article = Article.create
|
46
46
|
assert !article.valid?
|
47
47
|
require 'ruby-debug'
|
48
|
-
debugger if article.errors.count > 1
|
49
|
-
assert_equal 1, article.errors.count
|
50
48
|
assert article.errors.on(:slug)
|
51
49
|
end
|
52
50
|
|
53
51
|
should "set validation error if normalization makes source value empty" do
|
54
|
-
article = Article.create(:headline => '
|
52
|
+
article = Article.create(:headline => '$$$')
|
55
53
|
assert !article.valid?
|
56
|
-
assert_equal 1, article.errors.count
|
57
54
|
assert article.errors.on(:slug)
|
58
55
|
end
|
59
56
|
|
@@ -63,6 +60,14 @@ class TestSlug < Test::Unit::TestCase
|
|
63
60
|
assert_equal 'test-headline', article.slug
|
64
61
|
end
|
65
62
|
|
63
|
+
should "validate slug format on save" do
|
64
|
+
article = Article.create!(:headline => 'Test Headline')
|
65
|
+
article.slug = 'A BAD $LUG.'
|
66
|
+
|
67
|
+
assert !article.valid?
|
68
|
+
assert article.errors[:slug].present?
|
69
|
+
end
|
70
|
+
|
66
71
|
context "slug normalization" do
|
67
72
|
setup do
|
68
73
|
@article = Article.new
|
@@ -127,6 +132,24 @@ class TestSlug < Test::Unit::TestCase
|
|
127
132
|
@article.save!
|
128
133
|
assert_match 'a-b-c-d', @article.slug
|
129
134
|
end
|
135
|
+
|
136
|
+
should "not insert dashes for periods in acronyms, regardless of where they appear in string" do
|
137
|
+
@article.headline = "N.Y.P.D. vs. N.S.A. vs. F.B.I."
|
138
|
+
@article.save!
|
139
|
+
assert_match 'nypd-vs-nsa-vs-fbi', @article.slug
|
140
|
+
end
|
141
|
+
|
142
|
+
should "not insert dashes for apostrophes" do
|
143
|
+
@article.headline = "Thomas Jefferson's Papers"
|
144
|
+
@article.save!
|
145
|
+
assert_match 'thomas-jeffersons-papers', @article.slug
|
146
|
+
end
|
147
|
+
|
148
|
+
should "preserve numbers in slug" do
|
149
|
+
@article.headline = "2010 Election"
|
150
|
+
@article.save!
|
151
|
+
assert_match '2010-election', @article.slug
|
152
|
+
end
|
130
153
|
end
|
131
154
|
|
132
155
|
context "diacritics handling" do
|
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
|
+
version: 0.5.3
|
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:
|
12
|
+
date: 2010-03-29 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|