wulffeld_slug 0.0.20 → 0.0.21
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/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
|