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 CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wulffeld_slug (0.0.20)
4
+ wulffeld_slug (0.0.21)
5
5
  activesupport (>= 3.1.0)
6
6
  babosa (>= 0.3.7)
7
7
  wulffeld_slug
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.20
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
- a = [*send(slug_config[:fields])].reject {|f| f.blank? }.map {|f| f.is_a?(String) ? f : send(f) }.flatten
41
- return if a.blank?
40
+ slug_items = resolve_slug_items
41
+ return if slug_items.blank?
42
42
 
43
- self.slug = to_unique_slug(a.join('-'))
43
+ self.slug = to_unique_slug(slug_items)
44
44
  end
45
45
 
46
- def to_unique_slug(s, n=nil)
47
- str_part = prepare_string(s)
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
@@ -1,4 +1,5 @@
1
1
  require 'babosa'
2
2
  require 'active_support'
3
+ require 'wulffeld_slug/prepare_string'
3
4
  require 'wulffeld_slug/slug'
4
5
  require 'wulffeld_slug/slug_include'
@@ -0,0 +1,13 @@
1
+ class Venue
2
+ include Mongoid::Document
3
+ extend WulffeldSlug::Slug
4
+
5
+ field :name
6
+ field :country
7
+
8
+ has_slug :slug_fields, :mongo => true
9
+
10
+ def slug_fields
11
+ [:name, :country]
12
+ end
13
+ end
@@ -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
@@ -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
- user = Actor.new(:name => "Geoffrey Rush")
8
- user.save!
9
- user.reload.slug.should == 'GEOFFREY-RUSH'
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.save!
17
- user.reload.slug.should == 'Batty'
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
- article.save
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.save
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.save!
48
- user.reload.slug.should == 'deckard'
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 "rspec"
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.after(:suite) { Mongoid.purge! }
31
- config.before(:each) { Mongoid::IdentityMap.clear }
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
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "wulffeld_slug"
8
- s.version = "0.0.20"
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-25"
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