wulffeld_slug 0.0.20 → 0.0.21
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/VERSION +1 -1
- data/lib/wulffeld_slug/prepare_string.rb +61 -0
- data/lib/wulffeld_slug/slug_include.rb +9 -46
- data/lib/wulffeld_slug.rb +1 -0
- data/spec/app/models/venue.rb +13 -0
- data/spec/lib/prepare_string_spec.rb +11 -0
- data/spec/lib/slug_spec.rb +17 -10
- data/spec/spec_helper.rb +12 -3
- data/wulffeld_slug.gemspec +68 -2
- metadata +417 -183
data/Gemfile.lock
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.21
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module WulffeldSlug
|
2
|
+
class PrepareString
|
3
|
+
attr_accessor :words,
|
4
|
+
:options,
|
5
|
+
:slug
|
6
|
+
|
7
|
+
def initialize(words, options = {})
|
8
|
+
@words = words
|
9
|
+
@options = options
|
10
|
+
@options[:max] ||= 239
|
11
|
+
@options[:case] ||= :downcase
|
12
|
+
@options[:kinds] ||= [:latin, :bulgarian, :cyrillic, :danish, :german, :greek, :macedonian, :norwegian, :romanian, :russian, :serbian, :spanish, :swedish, :ukrainian]
|
13
|
+
|
14
|
+
@slug = ''
|
15
|
+
|
16
|
+
prepare_string
|
17
|
+
end
|
18
|
+
|
19
|
+
# Use dashes.
|
20
|
+
# http://www.mattcutts.com/blog/dashes-vs-underscores/
|
21
|
+
def prepare_string
|
22
|
+
words = @words.map do |s|
|
23
|
+
prepare_word(s)
|
24
|
+
end
|
25
|
+
|
26
|
+
words.reject!(&:blank?)
|
27
|
+
|
28
|
+
@slug =
|
29
|
+
case options[:case]
|
30
|
+
when :preserve
|
31
|
+
words
|
32
|
+
when :downcase
|
33
|
+
words.map(&:downcase)
|
34
|
+
when :capitalize
|
35
|
+
words.map(&:capitalize)
|
36
|
+
when :upcase
|
37
|
+
words.map(&:upcase)
|
38
|
+
end.join('-')[0..@options[:max]]
|
39
|
+
end
|
40
|
+
|
41
|
+
def prepare_word(word)
|
42
|
+
# Blow away apostrophes
|
43
|
+
word.gsub! /['`]/,""
|
44
|
+
|
45
|
+
# @ --> at, and & --> and
|
46
|
+
word.gsub! /\s*@\s*/, " at "
|
47
|
+
word.gsub! /\s*&\s*/, " and "
|
48
|
+
|
49
|
+
options[:kinds].each do |kind|
|
50
|
+
word = Babosa::Identifier.new(word).transliterate!(kind)
|
51
|
+
break if word =~ /^[[:ascii:]]+$/
|
52
|
+
end
|
53
|
+
word.strip!
|
54
|
+
|
55
|
+
# Convert spaces to dashes.
|
56
|
+
word.gsub!(/[^a-zA-Z0-9]+/i, '-')
|
57
|
+
|
58
|
+
word
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -37,14 +37,18 @@ module WulffeldSlug
|
|
37
37
|
# NOTE: Uniqueness is not checked if slug is non-nil. You must ensure uniqueness yourself then.
|
38
38
|
return unless slug.blank?
|
39
39
|
|
40
|
-
|
41
|
-
return if
|
40
|
+
slug_items = resolve_slug_items
|
41
|
+
return if slug_items.blank?
|
42
42
|
|
43
|
-
self.slug = to_unique_slug(
|
43
|
+
self.slug = to_unique_slug(slug_items)
|
44
44
|
end
|
45
45
|
|
46
|
-
def
|
47
|
-
|
46
|
+
def resolve_slug_items
|
47
|
+
[*send(slug_config[:fields])].reject(&:nil?).map {|f| f.is_a?(String) ? f : send(f) }.flatten.reject(&:blank?)
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_unique_slug(slug_items, n=nil)
|
51
|
+
str_part = WulffeldSlug::PrepareString.new(slug_items, slug_config.merge(:kinds => (respond_to?(:slug_kinds) ? [*slug_kinds] : nil))).slug
|
48
52
|
str_part = self.id.to_s if str_part.blank? && !self.new_record?
|
49
53
|
|
50
54
|
loop do
|
@@ -72,46 +76,5 @@ module WulffeldSlug
|
|
72
76
|
n += 1
|
73
77
|
end
|
74
78
|
end
|
75
|
-
|
76
|
-
# Use dashes.
|
77
|
-
# http://www.mattcutts.com/blog/dashes-vs-underscores/
|
78
|
-
def prepare_string(s, max=239)
|
79
|
-
# Blow away apostrophes
|
80
|
-
s.gsub! /['`]/,""
|
81
|
-
|
82
|
-
# @ --> at, and & --> and
|
83
|
-
s.gsub! /\s*@\s*/, " at "
|
84
|
-
s.gsub! /\s*&\s*/, " and "
|
85
|
-
|
86
|
-
if respond_to?(:slug_kinds)
|
87
|
-
kinds = [*slug_kinds]
|
88
|
-
else
|
89
|
-
kinds = [:latin, :bulgarian, :cyrillic, :danish, :german, :greek, :macedonian, :norwegian, :romanian, :russian, :serbian, :spanish, :swedish, :ukrainian]
|
90
|
-
end
|
91
|
-
kinds.each do |kind|
|
92
|
-
s = Babosa::Identifier.new(s).transliterate!(kind)
|
93
|
-
break if s =~ /^[[:ascii:]]+$/
|
94
|
-
end
|
95
|
-
s.strip!
|
96
|
-
|
97
|
-
# Convert spaces to dashes.
|
98
|
-
s.gsub!(/[^a-zA-Z0-9]+/i, '-')
|
99
|
-
|
100
|
-
words = s.split('-').reject {|w| w.blank? }
|
101
|
-
|
102
|
-
new_slug =
|
103
|
-
case slug_config[:case]
|
104
|
-
when :preserve
|
105
|
-
words
|
106
|
-
when :downcase
|
107
|
-
words.map(&:downcase)
|
108
|
-
when :capitalize
|
109
|
-
words.map(&:capitalize)
|
110
|
-
when :upcase
|
111
|
-
words.map(&:upcase)
|
112
|
-
end.join('-')
|
113
|
-
|
114
|
-
new_slug = new_slug[0..max]
|
115
|
-
end
|
116
79
|
end
|
117
80
|
end
|
data/lib/wulffeld_slug.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'WulffeldSlug::PrepareString' do
|
4
|
+
it "should convert @ to 'at'" do
|
5
|
+
WulffeldSlug::PrepareString.new(["deckard@nexus6.net"]).slug.should == 'deckard-at-nexus6-net'
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should convert & to 'and'" do
|
9
|
+
WulffeldSlug::PrepareString.new(["Deckard & Batty"]).slug.should == 'deckard-and-batty'
|
10
|
+
end
|
11
|
+
end
|
data/spec/lib/slug_spec.rb
CHANGED
@@ -4,17 +4,17 @@ describe 'WulffeldSlug' do
|
|
4
4
|
context ":case option" do
|
5
5
|
context ":case => :upcase" do
|
6
6
|
it "should upcase the slug" do
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
actor = Actor.new(:name => "Geoffrey Rush")
|
8
|
+
actor.valid?
|
9
|
+
actor.slug.should == 'GEOFFREY-RUSH'
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
context ":case => :preserve" do
|
14
14
|
it "should preserve capitalization" do
|
15
15
|
user = User.new(:login => "Batty")
|
16
|
-
user.
|
17
|
-
user.
|
16
|
+
user.valid?
|
17
|
+
user.slug.should == 'Batty'
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -25,18 +25,19 @@ describe 'WulffeldSlug' do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "creates a slug" do
|
28
|
-
article.save
|
28
|
+
article.save!
|
29
29
|
article.slug.should == "blade-runner"
|
30
30
|
end
|
31
31
|
|
32
32
|
it "creates a unique slug" do
|
33
|
-
|
33
|
+
Article.create!(:title => "Blade Runner")
|
34
|
+
article.save!
|
34
35
|
article.slug.should == "blade-runner-1"
|
35
36
|
end
|
36
37
|
|
37
38
|
it "creates a slug without superfluous spaces" do
|
38
39
|
article.title = " The Shawshank Redemption "
|
39
|
-
article.
|
40
|
+
article.valid?
|
40
41
|
article.slug.should == "the-shawshank-redemption"
|
41
42
|
end
|
42
43
|
end
|
@@ -44,8 +45,8 @@ describe 'WulffeldSlug' do
|
|
44
45
|
context "dynamic slug fields" do
|
45
46
|
it "should create a slug based on the non-nil field(s)" do
|
46
47
|
user = User.new(:login => "deckard")
|
47
|
-
user.
|
48
|
-
user.
|
48
|
+
user.valid?
|
49
|
+
user.slug.should == 'deckard'
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
@@ -89,5 +90,11 @@ describe 'WulffeldSlug' do
|
|
89
90
|
article.valid?
|
90
91
|
article.slug.should == "dvorec-sporta"
|
91
92
|
end
|
93
|
+
|
94
|
+
it "should transliterate all parts" do
|
95
|
+
venue = Venue.new(:name => "Дворец Спорта", :country => "Russia")
|
96
|
+
venue.valid?
|
97
|
+
venue.slug.should == "dvorec-sporta-russia"
|
98
|
+
end
|
92
99
|
end
|
93
100
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -10,8 +10,9 @@ ENV["RAILS_ENV"] = "test"
|
|
10
10
|
|
11
11
|
require "wulffeld_slug"
|
12
12
|
require "mongoid"
|
13
|
-
require "
|
13
|
+
require "database_cleaner"
|
14
14
|
require "factory_girl"
|
15
|
+
require "rspec"
|
15
16
|
|
16
17
|
Mongoid.configure do |config|
|
17
18
|
config.master = Mongo::Connection.new.db("wulffeld_slug_test")
|
@@ -20,6 +21,8 @@ end
|
|
20
21
|
|
21
22
|
Dir[ File.join(MODELS, "*.rb") ].sort.each { |file| require File.basename(file) }
|
22
23
|
|
24
|
+
DatabaseCleaner[:mongoid].strategy = :truncation
|
25
|
+
|
23
26
|
RSpec.configure do |config|
|
24
27
|
require 'rspec/expectations'
|
25
28
|
|
@@ -27,6 +30,12 @@ RSpec.configure do |config|
|
|
27
30
|
|
28
31
|
config.mock_with :rspec
|
29
32
|
|
30
|
-
config.
|
31
|
-
|
33
|
+
config.before(:each) do
|
34
|
+
DatabaseCleaner.clean
|
35
|
+
Mongoid::IdentityMap.clear
|
36
|
+
end
|
37
|
+
|
38
|
+
config.after(:suite) do
|
39
|
+
Mongoid.purge!
|
40
|
+
end
|
32
41
|
end
|
data/wulffeld_slug.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "wulffeld_slug"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.21"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Martin Moen Wulffeld"]
|
12
|
-
s.date = "2012-04-
|
12
|
+
s.date = "2012-04-26"
|
13
13
|
s.description = ""
|
14
14
|
s.email = "martin@wulffeld.org"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -22,12 +22,15 @@ Gem::Specification.new do |s|
|
|
22
22
|
"Rakefile",
|
23
23
|
"VERSION",
|
24
24
|
"lib/wulffeld_slug.rb",
|
25
|
+
"lib/wulffeld_slug/prepare_string.rb",
|
25
26
|
"lib/wulffeld_slug/slug.rb",
|
26
27
|
"lib/wulffeld_slug/slug_include.rb",
|
27
28
|
"spec/app/models/actor.rb",
|
28
29
|
"spec/app/models/article.rb",
|
29
30
|
"spec/app/models/user.rb",
|
31
|
+
"spec/app/models/venue.rb",
|
30
32
|
"spec/factories.rb",
|
33
|
+
"spec/lib/prepare_string_spec.rb",
|
31
34
|
"spec/lib/slug_spec.rb",
|
32
35
|
"spec/spec_helper.rb",
|
33
36
|
"wulffeld_slug.gemspec"
|
@@ -129,6 +132,27 @@ Gem::Specification.new do |s|
|
|
129
132
|
s.add_development_dependency(%q<jeweler>, [">= 1.6.2"])
|
130
133
|
s.add_development_dependency(%q<rdoc>, [">= 3.8"])
|
131
134
|
s.add_development_dependency(%q<rspec>, [">= 2.7.0"])
|
135
|
+
s.add_development_dependency(%q<mongoid>, ["= 2.2.0"])
|
136
|
+
s.add_development_dependency(%q<bson>, ["= 1.3.0"])
|
137
|
+
s.add_development_dependency(%q<bson_ext>, ["= 1.3.0"])
|
138
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.21"])
|
139
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.6.2"])
|
140
|
+
s.add_development_dependency(%q<rdoc>, [">= 3.8"])
|
141
|
+
s.add_development_dependency(%q<rspec>, [">= 2.7.0"])
|
142
|
+
s.add_development_dependency(%q<mongoid>, ["= 2.2.0"])
|
143
|
+
s.add_development_dependency(%q<bson>, ["= 1.3.0"])
|
144
|
+
s.add_development_dependency(%q<bson_ext>, ["= 1.3.0"])
|
145
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.21"])
|
146
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.6.2"])
|
147
|
+
s.add_development_dependency(%q<rdoc>, [">= 3.8"])
|
148
|
+
s.add_development_dependency(%q<rspec>, [">= 2.7.0"])
|
149
|
+
s.add_development_dependency(%q<mongoid>, ["= 2.2.0"])
|
150
|
+
s.add_development_dependency(%q<bson>, ["= 1.3.0"])
|
151
|
+
s.add_development_dependency(%q<bson_ext>, ["= 1.3.0"])
|
152
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.21"])
|
153
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.6.2"])
|
154
|
+
s.add_development_dependency(%q<rdoc>, [">= 3.8"])
|
155
|
+
s.add_development_dependency(%q<rspec>, [">= 2.7.0"])
|
132
156
|
s.add_runtime_dependency(%q<babosa>, [">= 0.3.7"])
|
133
157
|
s.add_runtime_dependency(%q<activesupport>, [">= 3.1.0"])
|
134
158
|
else
|
@@ -220,6 +244,27 @@ Gem::Specification.new do |s|
|
|
220
244
|
s.add_dependency(%q<jeweler>, [">= 1.6.2"])
|
221
245
|
s.add_dependency(%q<rdoc>, [">= 3.8"])
|
222
246
|
s.add_dependency(%q<rspec>, [">= 2.7.0"])
|
247
|
+
s.add_dependency(%q<mongoid>, ["= 2.2.0"])
|
248
|
+
s.add_dependency(%q<bson>, ["= 1.3.0"])
|
249
|
+
s.add_dependency(%q<bson_ext>, ["= 1.3.0"])
|
250
|
+
s.add_dependency(%q<bundler>, [">= 1.0.21"])
|
251
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.2"])
|
252
|
+
s.add_dependency(%q<rdoc>, [">= 3.8"])
|
253
|
+
s.add_dependency(%q<rspec>, [">= 2.7.0"])
|
254
|
+
s.add_dependency(%q<mongoid>, ["= 2.2.0"])
|
255
|
+
s.add_dependency(%q<bson>, ["= 1.3.0"])
|
256
|
+
s.add_dependency(%q<bson_ext>, ["= 1.3.0"])
|
257
|
+
s.add_dependency(%q<bundler>, [">= 1.0.21"])
|
258
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.2"])
|
259
|
+
s.add_dependency(%q<rdoc>, [">= 3.8"])
|
260
|
+
s.add_dependency(%q<rspec>, [">= 2.7.0"])
|
261
|
+
s.add_dependency(%q<mongoid>, ["= 2.2.0"])
|
262
|
+
s.add_dependency(%q<bson>, ["= 1.3.0"])
|
263
|
+
s.add_dependency(%q<bson_ext>, ["= 1.3.0"])
|
264
|
+
s.add_dependency(%q<bundler>, [">= 1.0.21"])
|
265
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.2"])
|
266
|
+
s.add_dependency(%q<rdoc>, [">= 3.8"])
|
267
|
+
s.add_dependency(%q<rspec>, [">= 2.7.0"])
|
223
268
|
s.add_dependency(%q<babosa>, [">= 0.3.7"])
|
224
269
|
s.add_dependency(%q<activesupport>, [">= 3.1.0"])
|
225
270
|
end
|
@@ -312,6 +357,27 @@ Gem::Specification.new do |s|
|
|
312
357
|
s.add_dependency(%q<jeweler>, [">= 1.6.2"])
|
313
358
|
s.add_dependency(%q<rdoc>, [">= 3.8"])
|
314
359
|
s.add_dependency(%q<rspec>, [">= 2.7.0"])
|
360
|
+
s.add_dependency(%q<mongoid>, ["= 2.2.0"])
|
361
|
+
s.add_dependency(%q<bson>, ["= 1.3.0"])
|
362
|
+
s.add_dependency(%q<bson_ext>, ["= 1.3.0"])
|
363
|
+
s.add_dependency(%q<bundler>, [">= 1.0.21"])
|
364
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.2"])
|
365
|
+
s.add_dependency(%q<rdoc>, [">= 3.8"])
|
366
|
+
s.add_dependency(%q<rspec>, [">= 2.7.0"])
|
367
|
+
s.add_dependency(%q<mongoid>, ["= 2.2.0"])
|
368
|
+
s.add_dependency(%q<bson>, ["= 1.3.0"])
|
369
|
+
s.add_dependency(%q<bson_ext>, ["= 1.3.0"])
|
370
|
+
s.add_dependency(%q<bundler>, [">= 1.0.21"])
|
371
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.2"])
|
372
|
+
s.add_dependency(%q<rdoc>, [">= 3.8"])
|
373
|
+
s.add_dependency(%q<rspec>, [">= 2.7.0"])
|
374
|
+
s.add_dependency(%q<mongoid>, ["= 2.2.0"])
|
375
|
+
s.add_dependency(%q<bson>, ["= 1.3.0"])
|
376
|
+
s.add_dependency(%q<bson_ext>, ["= 1.3.0"])
|
377
|
+
s.add_dependency(%q<bundler>, [">= 1.0.21"])
|
378
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.2"])
|
379
|
+
s.add_dependency(%q<rdoc>, [">= 3.8"])
|
380
|
+
s.add_dependency(%q<rspec>, [">= 2.7.0"])
|
315
381
|
s.add_dependency(%q<babosa>, [">= 0.3.7"])
|
316
382
|
s.add_dependency(%q<activesupport>, [">= 3.1.0"])
|
317
383
|
end
|