friendly_id 1.9.9 → 2.0.0
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.tar.gz.sig +0 -0
- data/History.txt +5 -4
- data/Manifest.txt +1 -10
- data/README.rdoc +13 -8
- data/Rakefile +5 -3
- data/friendly_id.gemspec +3 -3
- data/lib/friendly_id.rb +15 -8
- data/lib/friendly_id/helpers.rb +13 -0
- data/lib/friendly_id/non_sluggable_class_methods.rb +14 -15
- data/lib/friendly_id/slug.rb +2 -3
- data/lib/friendly_id/sluggable_class_methods.rb +3 -9
- data/lib/friendly_id/sluggable_instance_methods.rb +18 -18
- data/lib/friendly_id/version.rb +3 -3
- data/lib/tasks/friendly_id.rake +1 -1
- data/test/fixtures/posts.yml +5 -1
- data/test/fixtures/slugs.yml +8 -0
- data/test/non_slugged_test.rb +29 -7
- data/test/sluggable_test.rb +4 -0
- metadata +16 -14
- metadata.gz.sig +0 -0
- data/coverage/index.html +0 -409
- data/coverage/lib-friendly_id-non_sluggable_class_methods_rb.html +0 -646
- data/coverage/lib-friendly_id-non_sluggable_instance_methods_rb.html +0 -638
- data/coverage/lib-friendly_id-shoulda_macros_rb.html +0 -641
- data/coverage/lib-friendly_id-sluggable_class_methods_rb.html +0 -714
- data/coverage/lib-friendly_id-sluggable_instance_methods_rb.html +0 -710
- data/coverage/lib-friendly_id-string_helpers_rb.html +0 -685
- data/coverage/lib-friendly_id_rb.html +0 -665
- data/coverage/lib-slug_rb.html +0 -695
- data/coverage/rails-init_rb.html +0 -606
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
==
|
1
|
+
== 2.0.0 2009-01-03
|
2
2
|
|
3
|
-
*
|
3
|
+
* 5 major enhancements:
|
4
4
|
* Support for scoped slugs (Norman Clarke)
|
5
5
|
* Support for UTF-8 friendly_ids (Norman Clarke)
|
6
6
|
* Can now be installed via Ruby Gems, or as a Rails plugin (Norman Clarke)
|
7
|
-
* Shoulda macro ({Josh Nichols}[http://github.com/technicalpickles])
|
8
7
|
* Improved handling of non-unique slugs (Norman Clarke and Adrian Mugnolo)
|
9
|
-
|
8
|
+
* 2 minor enhancements:
|
9
|
+
* Shoulda macro (Josh Nichols - http://github.com/technicalpickles)
|
10
|
+
* Various small bugfixes, cleanups and refactorings
|
10
11
|
|
11
12
|
== 2008-12-01
|
12
13
|
|
data/Manifest.txt
CHANGED
@@ -3,16 +3,6 @@ MIT-LICENSE
|
|
3
3
|
Manifest.txt
|
4
4
|
README.rdoc
|
5
5
|
Rakefile
|
6
|
-
coverage/index.html
|
7
|
-
coverage/lib-friendly_id-non_sluggable_class_methods_rb.html
|
8
|
-
coverage/lib-friendly_id-non_sluggable_instance_methods_rb.html
|
9
|
-
coverage/lib-friendly_id-shoulda_macros_rb.html
|
10
|
-
coverage/lib-friendly_id-sluggable_class_methods_rb.html
|
11
|
-
coverage/lib-friendly_id-sluggable_instance_methods_rb.html
|
12
|
-
coverage/lib-friendly_id-string_helpers_rb.html
|
13
|
-
coverage/lib-friendly_id_rb.html
|
14
|
-
coverage/lib-slug_rb.html
|
15
|
-
coverage/rails-init_rb.html
|
16
6
|
friendly_id.gemspec
|
17
7
|
generators/friendly_id/friendly_id_generator.rb
|
18
8
|
generators/friendly_id/templates/create_slugs.rb
|
@@ -20,6 +10,7 @@ generators/friendly_id_20_upgrade/friendly_id_20_upgrade_generator.rb
|
|
20
10
|
generators/friendly_id_20_upgrade/templates/upgrade_friendly_id_to_20.rb
|
21
11
|
init.rb
|
22
12
|
lib/friendly_id.rb
|
13
|
+
lib/friendly_id/helpers.rb
|
23
14
|
lib/friendly_id/non_sluggable_class_methods.rb
|
24
15
|
lib/friendly_id/non_sluggable_instance_methods.rb
|
25
16
|
lib/friendly_id/shoulda_macros.rb
|
data/README.rdoc
CHANGED
@@ -213,12 +213,18 @@ that uses a non-Roman writing system, your feedback would be most welcome.
|
|
213
213
|
|
214
214
|
FriendlyId is installed as a Ruby Gem:
|
215
215
|
|
216
|
-
gem install
|
216
|
+
gem install friendly_id
|
217
217
|
|
218
218
|
Alternatively, you can install it as a Rails plugin, though this is
|
219
219
|
discouraged:
|
220
220
|
|
221
|
-
./script/plugin install git://github.com/norman/friendly_id.git
|
221
|
+
./script/plugin install git://github.com/norman/friendly_id.git
|
222
|
+
|
223
|
+
If you are installing as a plugin, make sure you have installed the unicode gem,
|
224
|
+
which FriendlyId depends on:
|
225
|
+
|
226
|
+
gem install unicode
|
227
|
+
|
222
228
|
|
223
229
|
== Setting it up
|
224
230
|
|
@@ -226,7 +232,7 @@ FriendlyId currently works with Rails 2.0.0 and higher. Here's how to set it up.
|
|
226
232
|
|
227
233
|
1) Install the Gem:
|
228
234
|
|
229
|
-
sudo gem install
|
235
|
+
sudo gem install friendly_id
|
230
236
|
cd my_app
|
231
237
|
script/generate friendly_id
|
232
238
|
rake db:migrate
|
@@ -264,15 +270,15 @@ rake:friendly_id:remove_old_slugs MODEL=MyModelName DAYS=60
|
|
264
270
|
If you installed an older version of FriendlyId and want to upgrade to 2.0,
|
265
271
|
follow these steps:
|
266
272
|
|
267
|
-
==== Install the
|
273
|
+
==== Install the friendly_id Gem:
|
274
|
+
|
275
|
+
sudo gem install friendly_id
|
268
276
|
|
269
|
-
sudo gem install friendly-id
|
270
|
-
|
271
277
|
==== Add FriendlyId to environment.rb:
|
272
278
|
|
273
279
|
===== For Rails 2.1 and higher:
|
274
280
|
|
275
|
-
config.gem "friendly_id"
|
281
|
+
config.gem "friendly_id"
|
276
282
|
|
277
283
|
===== For Rails 2.0:
|
278
284
|
|
@@ -293,7 +299,6 @@ Add this to the bottom of environment.rb:
|
|
293
299
|
|
294
300
|
That's it!
|
295
301
|
|
296
|
-
|
297
302
|
== Hacking FriendlyId:
|
298
303
|
|
299
304
|
FriendlyId is {hosted on Github}[git://github.com/norman/friendly_id.git], and
|
data/Rakefile
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require File.join(File.dirname(__FILE__), 'lib', 'friendly_id', 'version')
|
1
|
+
require 'newgem'
|
2
|
+
require 'lib/friendly_id/version'
|
4
3
|
|
5
4
|
Hoe.new("friendly_id", FriendlyId::Version::STRING) do |p|
|
6
5
|
p.rubyforge_name = "friendly-id"
|
@@ -13,6 +12,9 @@ Hoe.new("friendly_id", FriendlyId::Version::STRING) do |p|
|
|
13
12
|
p.need_zip = true
|
14
13
|
p.test_globs = ['test/**/*_test.rb']
|
15
14
|
p.extra_deps << ['unicode', '>= 0.1']
|
15
|
+
p.extra_dev_deps = [
|
16
|
+
['newgem', ">= #{::Newgem::VERSION}"]
|
17
|
+
]
|
16
18
|
p.rdoc_pattern = /^(lib|bin|ext)|txt|rdoc$/
|
17
19
|
changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
18
20
|
p.remote_rdoc_dir = ""
|
data/friendly_id.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{friendly_id}
|
3
|
-
s.version = "
|
3
|
+
s.version = "2.0.0"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["Norman Clarke", "Adrian Mugnolo", "Emilio Tagua"]
|
7
7
|
s.cert_chain = ["/Users/norman/.gem/gem-public_cert.pem"]
|
8
|
-
s.date = %q{2008-12-
|
8
|
+
s.date = %q{2008-12-30}
|
9
9
|
s.description = %q{A comprehensive slugging and pretty-URL plugin for Ruby on Rails.}
|
10
10
|
s.email = ["norman@randomba.org", "adrian@randomba.org", "miloops@gmail.com"]
|
11
11
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt"]
|
12
|
-
s.files = ["History.txt", "MIT-LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "
|
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
13
|
s.has_rdoc = true
|
14
14
|
s.homepage = %q{http://randomba.org}
|
15
15
|
s.rdoc_options = ["--main", "README.txt"]
|
data/lib/friendly_id.rb
CHANGED
@@ -1,17 +1,12 @@
|
|
1
1
|
require 'unicode'
|
2
|
+
require 'friendly_id/helpers'
|
2
3
|
require 'friendly_id/slug'
|
3
4
|
require 'friendly_id/shoulda_macros'
|
4
5
|
|
6
|
+
|
5
7
|
# FriendlyId is a comprehensize Rails plugin/gem for slugging and permalinks.
|
6
8
|
module FriendlyId
|
7
9
|
|
8
|
-
# Load FriendlyId if the gem is included in a Rails app.
|
9
|
-
def self.enable
|
10
|
-
return if ActiveRecord::Base.methods.include? 'has_friendly_id'
|
11
|
-
ActiveRecord::Base.class_eval { extend FriendlyId::ClassMethods }
|
12
|
-
Test::Unit::TestCase.class_eval { include FriendlyId::ShouldaMacros }
|
13
|
-
end
|
14
|
-
|
15
10
|
# This error is raised when it's not possible to generate a unique slug.
|
16
11
|
class SlugGenerationError < StandardError ; end
|
17
12
|
|
@@ -38,7 +33,7 @@ module FriendlyId
|
|
38
33
|
class_inheritable_reader :friendly_id_options
|
39
34
|
|
40
35
|
if options[:use_slug]
|
41
|
-
has_many :slugs, :order => 'id DESC', :as => :sluggable, :dependent => :destroy
|
36
|
+
has_many :slugs, :order => 'id DESC', :as => :sluggable, :dependent => :destroy, :readonly => true
|
42
37
|
require 'friendly_id/sluggable_class_methods'
|
43
38
|
require 'friendly_id/sluggable_instance_methods'
|
44
39
|
extend SluggableClassMethods
|
@@ -54,6 +49,18 @@ module FriendlyId
|
|
54
49
|
|
55
50
|
end
|
56
51
|
|
52
|
+
class << self
|
53
|
+
|
54
|
+
# Load FriendlyId if the gem is included in a Rails app.
|
55
|
+
def enable
|
56
|
+
return if ActiveRecord::Base.methods.include? 'has_friendly_id'
|
57
|
+
ActiveRecord::Base.class_eval { extend FriendlyId::ClassMethods }
|
58
|
+
Test::Unit::TestCase.class_eval { include FriendlyId::ShouldaMacros }
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
|
57
64
|
end
|
58
65
|
|
59
66
|
if defined?(ActiveRecord)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module FriendlyId
|
2
|
+
|
3
|
+
module Helpers
|
4
|
+
# Calculate expected result size for find_some_with_friendly (taken from
|
5
|
+
# active_record/base.rb)
|
6
|
+
def expected_size(ids_and_names, options) #:nodoc:#
|
7
|
+
size = options[:offset] ? ids_and_names.size - options[:offset] : ids_and_names.size
|
8
|
+
size = options[:limit] if options[:limit] && size > options[:limit]
|
9
|
+
size
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module FriendlyId::NonSluggableClassMethods
|
2
2
|
|
3
|
+
include FriendlyId::Helpers
|
4
|
+
|
3
5
|
def self.extended(base) #:nodoc:#
|
4
6
|
class << base
|
5
7
|
alias_method_chain :find_one, :friendly
|
@@ -19,23 +21,20 @@ module FriendlyId::NonSluggableClassMethods
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def find_some_with_friendly(ids_and_names, options) #:nodoc:#
|
22
|
-
|
23
|
-
|
24
|
+
|
25
|
+
results = with_scope :find => options do
|
26
|
+
find :all, :conditions => ["#{ quoted_table_name }.#{ primary_key } IN (?) OR #{friendly_id_options[:column].to_s} IN (?)",
|
27
|
+
ids_and_names, ids_and_names]
|
24
28
|
end
|
29
|
+
|
30
|
+
expected = expected_size(ids_and_names, options)
|
31
|
+
if results.size != expected
|
32
|
+
raise ActiveRecord::RecordNotFound, "Couldn't find all #{ name.pluralize } with IDs (#{ ids_and_names * ', ' }) AND #{ sanitize_sql options[:conditions] } (found #{ results.size } results, but was looking for #{ expected })"
|
33
|
+
end
|
34
|
+
|
35
|
+
results.each {|r| r.send(:found_using_friendly_id=, true) if ids_and_names.include?(r.friendly_id)}
|
25
36
|
|
26
|
-
ids = ids_and_names - results_by_name.map { |r| r[ friendly_id_options[:column] ] }
|
27
|
-
results = results_by_name
|
28
|
-
|
29
|
-
results += with_scope :find => options do
|
30
|
-
find :all, :conditions => ["#{ quoted_table_name }.#{ primary_key } IN (?)", ids]
|
31
|
-
end unless ids.empty?
|
32
|
-
|
33
|
-
expected_size = options[:offset] ? ids_and_names.size - options[:offset] : ids_and_names.size
|
34
|
-
expected_size = options[:limit] if options[:limit] && expected_size > options[:limit]
|
35
|
-
|
36
|
-
raise ActiveRecord::RecordNotFound, "Couldn't find all #{ name.pluralize } with IDs (#{ ids_and_names * ', ' }) AND #{ sanitize_sql options[:conditions] } (found #{ results.size } results, but was looking for #{ expected_size })" if results.size != expected_size
|
37
|
-
|
38
|
-
results_by_name.each { |r| r.send(:found_using_friendly_id=, true) }
|
39
37
|
results
|
38
|
+
|
40
39
|
end
|
41
40
|
end
|
data/lib/friendly_id/slug.rb
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
class Slug < ActiveRecord::Base
|
3
3
|
|
4
4
|
belongs_to :sluggable, :polymorphic => true
|
5
|
-
|
6
|
-
before_create :set_sequence
|
7
|
-
before_save :check_for_blank_name
|
5
|
+
before_save :check_for_blank_name, :set_sequence
|
8
6
|
|
9
7
|
class << self
|
10
8
|
|
@@ -81,6 +79,7 @@ class Slug < ActiveRecord::Base
|
|
81
79
|
end
|
82
80
|
|
83
81
|
def set_sequence
|
82
|
+
return unless new_record?
|
84
83
|
last = Slug.find(:first, :conditions => { :name => name, :scope => scope,
|
85
84
|
:sluggable_type => sluggable_type}, :order => "sequence DESC",
|
86
85
|
:select => 'sequence')
|
@@ -1,4 +1,6 @@
|
|
1
1
|
module FriendlyId::SluggableClassMethods
|
2
|
+
|
3
|
+
include FriendlyId::Helpers
|
2
4
|
|
3
5
|
def self.extended(base) #:nodoc:#
|
4
6
|
|
@@ -48,11 +50,10 @@ module FriendlyId::SluggableClassMethods
|
|
48
50
|
find_options = {:select => "#{self.table_name}.*"}
|
49
51
|
find_options[:joins] = :slugs unless options[:include] && [*options[:include]].flatten.include?(:slugs)
|
50
52
|
find_options[:conditions] = "#{quoted_table_name}.#{primary_key} IN (#{ids.empty? ? 'NULL' : ids.join(',')}) "
|
51
|
-
find_options[:conditions] << "OR
|
53
|
+
find_options[:conditions] << "OR slugs.id IN (#{slugs.to_s(:db)})"
|
52
54
|
|
53
55
|
results = with_scope(:find => find_options) { find_every(options) }
|
54
56
|
|
55
|
-
# calculate expected size, taken from active_record/base.rb
|
56
57
|
expected = expected_size(ids_and_names, options)
|
57
58
|
if results.size != expected
|
58
59
|
raise ActiveRecord::RecordNotFound, "Couldn't find all #{ name.pluralize } with IDs (#{ ids_and_names * ', ' }) AND #{ sanitize_sql options[:conditions] } (found #{ results.size } results, but was looking for #{ expected })"
|
@@ -79,13 +80,6 @@ module FriendlyId::SluggableClassMethods
|
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
82
|
-
# Calculate expected result size for find_some_with_friendly
|
83
|
-
def expected_size(ids_and_names, options) #:nodoc:#
|
84
|
-
size = options[:offset] ? ids_and_names.size - options[:offset] : ids_and_names.size
|
85
|
-
size = options[:limit] if options[:limit] && size > options[:limit]
|
86
|
-
size
|
87
|
-
end
|
88
|
-
|
89
83
|
# Build arrays of slugs and ids, for the find_some_with_friendly method.
|
90
84
|
def get_slugs_and_ids(ids_and_names, options) #:nodoc:#
|
91
85
|
scope = options.delete(:scope)
|
@@ -53,23 +53,6 @@ module FriendlyId::SluggableInstanceMethods
|
|
53
53
|
slug ? slug.to_friendly_id : id.to_s
|
54
54
|
end
|
55
55
|
|
56
|
-
# Set the slug using the generated friendly id.
|
57
|
-
def set_slug
|
58
|
-
if self.class.friendly_id_options[:use_slug] && new_slug_needed?
|
59
|
-
@most_recent_slug = nil
|
60
|
-
slug_attributes = {:name => slug_text}
|
61
|
-
if friendly_id_options[:scope]
|
62
|
-
scope = send(friendly_id_options[:scope])
|
63
|
-
slug_attributes[:scope] = scope.respond_to?(:to_param) ? scope.to_param : scope.to_s
|
64
|
-
end
|
65
|
-
# If we're renaming back to a previously used friendly_id, delete the
|
66
|
-
# slug so that we can recycle the name without having to use a sequence.
|
67
|
-
slugs.find(:all, :conditions => {:name => slug_text, :scope => scope}).each { |s| s.destroy }
|
68
|
-
s = slugs.build slug_attributes
|
69
|
-
s.send(:set_sequence)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
56
|
# Get the processed string used as the basis of the friendly id.
|
74
57
|
def slug_text
|
75
58
|
base = send friendly_id_options[:column]
|
@@ -98,8 +81,25 @@ module FriendlyId::SluggableInstanceMethods
|
|
98
81
|
|
99
82
|
def init_finder_slug
|
100
83
|
return false if !@finder_slug_name
|
101
|
-
slug = Slug.find(:first, :conditions => {:sluggable_id => id, :name => @finder_slug_name})
|
84
|
+
slug = Slug.find(:first, :conditions => {:sluggable_id => id, :name => @finder_slug_name, :sluggable_type => self.class.name })
|
102
85
|
finder_slug = slug
|
103
86
|
end
|
104
87
|
|
88
|
+
# Set the slug using the generated friendly id.
|
89
|
+
def set_slug
|
90
|
+
if self.class.friendly_id_options[:use_slug] && new_slug_needed?
|
91
|
+
@most_recent_slug = nil
|
92
|
+
slug_attributes = {:name => slug_text}
|
93
|
+
if friendly_id_options[:scope]
|
94
|
+
scope = send(friendly_id_options[:scope])
|
95
|
+
slug_attributes[:scope] = scope.respond_to?(:to_param) ? scope.to_param : scope.to_s
|
96
|
+
end
|
97
|
+
# If we're renaming back to a previously used friendly_id, delete the
|
98
|
+
# slug so that we can recycle the name without having to use a sequence.
|
99
|
+
slugs.find(:all, :conditions => {:name => slug_text, :scope => scope}).each { |s| s.destroy }
|
100
|
+
slug = slugs.build slug_attributes
|
101
|
+
slug
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
105
|
end
|
data/lib/friendly_id/version.rb
CHANGED
data/lib/tasks/friendly_id.rake
CHANGED
@@ -8,7 +8,7 @@ namespace :friendly_id do
|
|
8
8
|
while records = sluggable_class.find(:all, :include => :slugs, :conditions => "slugs.id IS NULL", :limit => 1000) do
|
9
9
|
break if records.size == 0
|
10
10
|
records.each do |r|
|
11
|
-
r.set_slug
|
11
|
+
r.send(:set_slug)
|
12
12
|
r.save!
|
13
13
|
puts "#{sluggable_class.to_s}(#{r.id}) friendly_id set to \"#{r.slug.name}\""
|
14
14
|
end
|
data/test/fixtures/posts.yml
CHANGED
@@ -16,4 +16,8 @@ common_title:
|
|
16
16
|
|
17
17
|
common_title2:
|
18
18
|
name: Common Title
|
19
|
-
content: A second post with a very common title
|
19
|
+
content: A second post with a very common title
|
20
|
+
|
21
|
+
john_smith:
|
22
|
+
name: John Smith
|
23
|
+
content: Should allow for identical slug names between sluggable types
|
data/test/fixtures/slugs.yml
CHANGED
data/test/non_slugged_test.rb
CHANGED
@@ -11,24 +11,39 @@ class NonSluggedTest < Test::Unit::TestCase
|
|
11
11
|
assert User.find(users(:joe).friendly_id)
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
|
14
|
+
def test_should_find_users_using_friendly_id
|
15
|
+
assert User.find([users(:joe).friendly_id])
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
assert_equal
|
18
|
+
def test_to_param_should_return_a_string
|
19
|
+
assert_equal String, users(:joe).to_param.class
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_should_not_find_users_using_non_existent_friendly_ids
|
23
23
|
assert_raises ActiveRecord::RecordNotFound do
|
24
|
-
User.find(['
|
24
|
+
User.find(['bad', 'bad2'])
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
def test_finding_by_array_with_friendly_and_non_friendly_id_for_same_record_raises_error
|
29
|
+
assert_raises ActiveRecord::RecordNotFound do
|
30
|
+
User.find([users(:joe).id, "joe"]).size
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_finding_with_mixed_array_should_indicate_whether_found_by_numeric_or_friendly
|
35
|
+
@users = User.find([users(:jane).id, "joe"], :order => "login ASC")
|
36
|
+
assert @users[0].found_using_numeric_id?
|
37
|
+
assert @users[1].found_using_friendly_id?
|
38
|
+
end
|
27
39
|
|
28
40
|
def test_finder_options_are_not_ignored
|
29
41
|
assert_raises ActiveRecord::RecordNotFound do
|
30
42
|
User.find(users(:joe).friendly_id, :conditions => "1 = 2")
|
31
43
|
end
|
44
|
+
assert_raises ActiveRecord::RecordNotFound do
|
45
|
+
User.find([users(:joe).friendly_id], :conditions => "1 = 2")
|
46
|
+
end
|
32
47
|
end
|
33
48
|
|
34
49
|
def test_user_should_have_friendly_id_options
|
@@ -36,8 +51,12 @@ class NonSluggedTest < Test::Unit::TestCase
|
|
36
51
|
end
|
37
52
|
|
38
53
|
def test_user_should_not_be_found_using_friendly_id_unless_it_really_was
|
39
|
-
|
40
|
-
|
54
|
+
assert !User.find(users(:joe).id).found_using_friendly_id?
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_users_should_not_be_found_using_friendly_id_unless_they_really_were
|
58
|
+
@users = User.find([users(:jane).id])
|
59
|
+
assert @users[0].found_using_numeric_id?
|
41
60
|
end
|
42
61
|
|
43
62
|
def test_user_should_be_considered_found_by_numeric_id_as_default
|
@@ -48,15 +67,18 @@ class NonSluggedTest < Test::Unit::TestCase
|
|
48
67
|
def test_user_should_indicate_if_it_was_found_using_numeric_id
|
49
68
|
@user = User.find(users(:joe).id)
|
50
69
|
assert @user.found_using_numeric_id?
|
70
|
+
assert !@user.found_using_friendly_id?
|
51
71
|
end
|
52
72
|
|
53
73
|
def test_user_should_indicate_if_it_was_found_using_friendly_id
|
54
74
|
@user = User.find(users(:joe).friendly_id)
|
75
|
+
assert !@user.found_using_numeric_id?
|
55
76
|
assert @user.found_using_friendly_id?
|
56
77
|
end
|
57
78
|
|
58
79
|
def test_should_indicate_there_is_a_better_id_if_found_by_numeric_id
|
59
80
|
@user = User.find(users(:joe).id)
|
81
|
+
assert @user.found_using_numeric_id?
|
60
82
|
assert @user.has_better_id?
|
61
83
|
end
|
62
84
|
|