norman-friendly_id 2.0.1 → 2.0.2
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/config/website.yml +2 -0
- data/friendly_id.gemspec +4 -3
- data/lib/friendly_id/slug.rb +6 -1
- data/lib/friendly_id/sluggable_class_methods.rb +1 -1
- data/lib/friendly_id/sluggable_instance_methods.rb +7 -4
- data/lib/friendly_id/version.rb +1 -1
- data/lib/friendly_id.rb +14 -6
- data/test/sluggable_test.rb +8 -1
- metadata +3 -2
data/config/website.yml
ADDED
data/friendly_id.gemspec
CHANGED
@@ -2,14 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{friendly_id}
|
5
|
-
s.version = "2.0.
|
5
|
+
s.version = "2.0.2"
|
6
|
+
|
6
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
7
8
|
s.authors = ["Norman Clarke", "Adrian Mugnolo", "Emilio Tagua"]
|
8
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-02-07}
|
9
10
|
s.description = %q{A comprehensive slugging and pretty-URL plugin for Ruby on Rails.}
|
10
11
|
s.email = ["norman@randomba.org", "adrian@randomba.org", "miloops@gmail.com"]
|
11
12
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
|
12
|
-
s.files = ["History.txt", "MIT-LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "friendly_id.gemspec", "generators/friendly_id/friendly_id_generator.rb", "generators/friendly_id/templates/create_slugs.rb", "generators/friendly_id_20_upgrade/friendly_id_20_upgrade_generator.rb", "generators/friendly_id_20_upgrade/templates/upgrade_friendly_id_to_20.rb", "init.rb", "lib/friendly_id.rb", "lib/friendly_id/helpers.rb", "lib/friendly_id/non_sluggable_class_methods.rb", "lib/friendly_id/non_sluggable_instance_methods.rb", "lib/friendly_id/shoulda_macros.rb", "lib/friendly_id/slug.rb", "lib/friendly_id/sluggable_class_methods.rb", "lib/friendly_id/sluggable_instance_methods.rb", "lib/friendly_id/version.rb", "lib/tasks/friendly_id.rake", "lib/tasks/friendly_id.rb", "test/database.yml", "test/fixtures/countries.yml", "test/fixtures/country.rb", "test/fixtures/people.yml", "test/fixtures/person.rb", "test/fixtures/post.rb", "test/fixtures/posts.yml", "test/fixtures/slugs.yml", "test/fixtures/user.rb", "test/fixtures/users.yml", "test/non_slugged_test.rb", "test/rails/2.x/app/controllers/application.rb", "test/rails/2.x/config/boot.rb", "test/rails/2.x/config/database.yml", "test/rails/2.x/config/environment.rb", "test/rails/2.x/config/environments/test.rb", "test/rails/2.x/config/routes.rb", "test/schema.rb", "test/scoped_model_test.rb", "test/slug_test.rb", "test/sluggable_test.rb", "test/test_helper.rb"]
|
13
|
+
s.files = ["History.txt", "MIT-LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "config/website.yml", "friendly_id.gemspec", "generators/friendly_id/friendly_id_generator.rb", "generators/friendly_id/templates/create_slugs.rb", "generators/friendly_id_20_upgrade/friendly_id_20_upgrade_generator.rb", "generators/friendly_id_20_upgrade/templates/upgrade_friendly_id_to_20.rb", "init.rb", "lib/friendly_id.rb", "lib/friendly_id/helpers.rb", "lib/friendly_id/non_sluggable_class_methods.rb", "lib/friendly_id/non_sluggable_instance_methods.rb", "lib/friendly_id/shoulda_macros.rb", "lib/friendly_id/slug.rb", "lib/friendly_id/sluggable_class_methods.rb", "lib/friendly_id/sluggable_instance_methods.rb", "lib/friendly_id/version.rb", "lib/tasks/friendly_id.rake", "lib/tasks/friendly_id.rb", "test/database.yml", "test/fixtures/countries.yml", "test/fixtures/country.rb", "test/fixtures/people.yml", "test/fixtures/person.rb", "test/fixtures/post.rb", "test/fixtures/posts.yml", "test/fixtures/slugs.yml", "test/fixtures/user.rb", "test/fixtures/users.yml", "test/non_slugged_test.rb", "test/rails/2.x/app/controllers/application.rb", "test/rails/2.x/config/boot.rb", "test/rails/2.x/config/database.yml", "test/rails/2.x/config/environment.rb", "test/rails/2.x/config/environments/test.rb", "test/rails/2.x/config/routes.rb", "test/schema.rb", "test/scoped_model_test.rb", "test/slug_test.rb", "test/sluggable_test.rb", "test/test_helper.rb"]
|
13
14
|
s.has_rdoc = true
|
14
15
|
s.homepage = %q{http://randomba.org}
|
15
16
|
s.rdoc_options = ["--main", "README.rdoc"]
|
data/lib/friendly_id/slug.rb
CHANGED
@@ -49,11 +49,16 @@ class Slug < ActiveRecord::Base
|
|
49
49
|
cp < 0x300 || cp > 0x036F
|
50
50
|
}.pack('U*')
|
51
51
|
end
|
52
|
+
|
53
|
+
# Remove non-ascii characters from the string.
|
54
|
+
def strip_non_ascii(string)
|
55
|
+
strip_diacritics(string).gsub(/[^a-z0-9]+/i, ' ')
|
56
|
+
end
|
52
57
|
|
53
58
|
private
|
54
59
|
|
55
60
|
def chars_func
|
56
|
-
Rails.version
|
61
|
+
Rails.version >= "2.2" ? :mb_chars : :chars
|
57
62
|
rescue NoMethodError
|
58
63
|
:chars
|
59
64
|
end
|
@@ -87,7 +87,7 @@ module FriendlyId::SluggableClassMethods
|
|
87
87
|
ids = []
|
88
88
|
ids_and_names.each do |id_or_name|
|
89
89
|
name, sequence = Slug.parse id_or_name
|
90
|
-
slug = Slug.find(:first, :
|
90
|
+
slug = Slug.find(:first, :conditions => {
|
91
91
|
:name => name,
|
92
92
|
:scope => scope,
|
93
93
|
:sequence => sequence,
|
@@ -57,10 +57,13 @@ module FriendlyId::SluggableInstanceMethods
|
|
57
57
|
def slug_text
|
58
58
|
base = send friendly_id_options[:column]
|
59
59
|
if self.friendly_id_options[:strip_diacritics]
|
60
|
-
base = Slug::
|
61
|
-
else
|
62
|
-
base = Slug::normalize(base)
|
60
|
+
base = Slug::strip_diacritics(base)
|
63
61
|
end
|
62
|
+
if self.friendly_id_options[:strip_non_ascii]
|
63
|
+
base = Slug::strip_non_ascii(base)
|
64
|
+
end
|
65
|
+
base = Slug::normalize(base)
|
66
|
+
|
64
67
|
if base.length > friendly_id_options[:max_length]
|
65
68
|
base = base[0...friendly_id_options[:max_length]]
|
66
69
|
end
|
@@ -82,7 +85,7 @@ module FriendlyId::SluggableInstanceMethods
|
|
82
85
|
def init_finder_slug
|
83
86
|
return false if !@finder_slug_name
|
84
87
|
name, sequence = Slug.parse(@finder_slug_name)
|
85
|
-
slug = Slug.find(:first, :conditions => {:sluggable_id => id, :name => name, :sequence => sequence, :sluggable_type => self.class.name })
|
88
|
+
slug = Slug.find(:first, :conditions => {:sluggable_id => id, :name => name, :sequence => sequence, :sluggable_type => self.class.base_class.name })
|
86
89
|
finder_slug = slug
|
87
90
|
end
|
88
91
|
|
data/lib/friendly_id/version.rb
CHANGED
data/lib/friendly_id.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'unicode'
|
2
1
|
require 'friendly_id/helpers'
|
3
2
|
require 'friendly_id/slug'
|
4
3
|
require 'friendly_id/shoulda_macros'
|
@@ -13,8 +12,8 @@ module FriendlyId
|
|
13
12
|
module ClassMethods
|
14
13
|
|
15
14
|
# Default options for friendly_id.
|
16
|
-
DEFAULT_FRIENDLY_ID_OPTIONS = {:method => nil, :use_slug => false, :max_length => 255, :reserved => [], :strip_diacritics => false, :scope => nil}.freeze
|
17
|
-
VALID_FRIENDLY_ID_KEYS = [:use_slug, :max_length, :reserved, :strip_diacritics, :scope].freeze
|
15
|
+
DEFAULT_FRIENDLY_ID_OPTIONS = {:method => nil, :use_slug => false, :max_length => 255, :reserved => [], :strip_diacritics => false, :strip_non_ascii => false, :scope => nil}.freeze
|
16
|
+
VALID_FRIENDLY_ID_KEYS = [:use_slug, :max_length, :reserved, :strip_diacritics, :strip_non_ascii, :scope].freeze
|
18
17
|
|
19
18
|
# Set up an ActiveRecord model to use a friendly_id.
|
20
19
|
#
|
@@ -25,6 +24,7 @@ module FriendlyId
|
|
25
24
|
# * <tt>:use_slug</tt> - Defaults to false. Use slugs when you want to use a non-unique text field for friendly ids.
|
26
25
|
# * <tt>:max_length</tt> - Defaults to 255. The maximum allowed length for a slug.
|
27
26
|
# * <tt>:strip_diacritics</tt> - Defaults to false. If true, it will remove accents, umlauts, etc. from western characters.
|
27
|
+
# * <tt>:strip_non_ascii</tt> - Defaults to false. If true, it will all non-ascii ([^a-z0-9]) characters.
|
28
28
|
# * <tt>:reseved</tt> - Array of words that are reserved and can't be used as slugs. If such a word is used, it will be treated the same as if that slug was already taken (numeric extension will be appended). Defaults to [].
|
29
29
|
def has_friendly_id(column, options = {})
|
30
30
|
options.assert_valid_keys VALID_FRIENDLY_ID_KEYS
|
@@ -33,7 +33,7 @@ module FriendlyId
|
|
33
33
|
class_inheritable_reader :friendly_id_options
|
34
34
|
|
35
35
|
if options[:use_slug]
|
36
|
-
has_many :slugs, :order => 'id DESC', :as => :sluggable, :dependent => :destroy
|
36
|
+
has_many :slugs, :order => 'id DESC', :as => :sluggable, :dependent => :destroy
|
37
37
|
require 'friendly_id/sluggable_class_methods'
|
38
38
|
require 'friendly_id/sluggable_instance_methods'
|
39
39
|
extend SluggableClassMethods
|
@@ -55,7 +55,15 @@ module FriendlyId
|
|
55
55
|
def enable
|
56
56
|
return if ActiveRecord::Base.methods.include? 'has_friendly_id'
|
57
57
|
ActiveRecord::Base.class_eval { extend FriendlyId::ClassMethods }
|
58
|
-
|
58
|
+
begin
|
59
|
+
if Rails.version >= "2.3"
|
60
|
+
ActiveSupport::TestCase.class_eval { include FriendlyId::ShouldaMacros }
|
61
|
+
else
|
62
|
+
Test::Unit::TestCase.class_eval { include FriendlyId::ShouldaMacros }
|
63
|
+
end
|
64
|
+
rescue NoMethodError
|
65
|
+
Test::Unit::TestCase.class_eval { include FriendlyId::ShouldaMacros }
|
66
|
+
end
|
59
67
|
end
|
60
68
|
|
61
69
|
end
|
@@ -64,4 +72,4 @@ end
|
|
64
72
|
|
65
73
|
if defined?(ActiveRecord)
|
66
74
|
FriendlyId::enable
|
67
|
-
end
|
75
|
+
end
|
data/test/sluggable_test.rb
CHANGED
@@ -6,6 +6,8 @@ class SluggableTest < Test::Unit::TestCase
|
|
6
6
|
|
7
7
|
def setup
|
8
8
|
Post.friendly_id_options[:max_length] = FriendlyId::ClassMethods::DEFAULT_FRIENDLY_ID_OPTIONS[:max_length]
|
9
|
+
Post.friendly_id_options[:strip_non_ascii] = false
|
10
|
+
Post.friendly_id_options[:strip_diacritics] = false
|
9
11
|
end
|
10
12
|
|
11
13
|
def test_should_allow_for_identical_slug_names_between_sluggable_types
|
@@ -100,11 +102,16 @@ class SluggableTest < Test::Unit::TestCase
|
|
100
102
|
end
|
101
103
|
|
102
104
|
def test_should_not_strip_diactics_from_slug_unless_configured_to_do_so
|
103
|
-
Post.friendly_id_options[:strip_diacritics] = false
|
104
105
|
@post = Post.new(:name => "¡FELIZ AÑO!")
|
105
106
|
assert_equal "feliz-año", @post.slug_text
|
106
107
|
end
|
107
108
|
|
109
|
+
def test_should_convert_to_ascii
|
110
|
+
Post.friendly_id_options[:strip_non_ascii] = true
|
111
|
+
@post = Post.new(:name => "17” cômpütér mõnitor")
|
112
|
+
assert_equal '17-computer-monitor', @post.slug_text
|
113
|
+
end
|
114
|
+
|
108
115
|
def test_should_not_make_new_slug_unless_friendly_id_method_has_changed
|
109
116
|
posts(:with_one_slug).content = "Edited content"
|
110
117
|
posts(:with_one_slug).save!
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: norman-friendly_id
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Norman Clarke
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2009-
|
14
|
+
date: 2009-02-07 00:00:00 -08:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
@@ -60,6 +60,7 @@ files:
|
|
60
60
|
- Manifest.txt
|
61
61
|
- README.rdoc
|
62
62
|
- Rakefile
|
63
|
+
- config/website.yml
|
63
64
|
- friendly_id.gemspec
|
64
65
|
- generators/friendly_id/friendly_id_generator.rb
|
65
66
|
- generators/friendly_id/templates/create_slugs.rb
|