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 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