friendly_id 2.2.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,9 @@
1
+ == 2.2.1 2009-10-23
2
+
3
+ * 2 minor enhancements:
4
+ * slug cache now properly caches the slug sequence (closes GH issue #10)
5
+ * attr_protected is now only invoked on the cached_slug column if attr_accessible has not already been invoked. (closes GH issue #11)
6
+
1
7
  == 2.2.0 2009-10-19
2
8
 
3
9
  * 1 major enhancement:
data/Manifest.txt CHANGED
@@ -4,7 +4,6 @@ Manifest.txt
4
4
  README.rdoc
5
5
  Rakefile
6
6
  config/website.yml
7
- friendly_id.gemspec
8
7
  generators/friendly_id/friendly_id_generator.rb
9
8
  generators/friendly_id/templates/create_slugs.rb
10
9
  generators/friendly_id_20_upgrade/friendly_id_20_upgrade_generator.rb
data/README.rdoc CHANGED
@@ -172,12 +172,19 @@ Then, redo the slugs:
172
172
 
173
173
  rake friendly_id:redo_slugs MODEL=User
174
174
 
175
+ This feature exists largely to improve the performance of URL
176
+ generation, the part of Rails where FriendlyId has the biggest
177
+ performance impact. FriendlyId never queries against this column, so
178
+ it's not necessary to add an index on it unless your application does.
179
+
180
+ Two warnings when using this feature:
181
+
175
182
  *DO NOT* forget to redo the slugs, or else this feature will not work!
176
183
 
177
- Also note that this feature exists largely to improve the performance of URL
178
- generation, the part of Rails where FriendlyId has the biggest performance
179
- impact. FriendlyId never queries against this column, so it's not necessary to
180
- add an index on it unless your application does.
184
+ Also, this feature uses +attr_protected+ to protect the cached_slug
185
+ column, unless you have already invoked +attr_accessible+. So if you
186
+ wish to use +attr_accessible+, you must invoke it BEFORE you invoke
187
+ +has_friendly_id+ in your class.
181
188
 
182
189
  ==== Using a custom column name:
183
190
 
data/lib/friendly_id.rb CHANGED
@@ -42,7 +42,7 @@ module FriendlyId
42
42
  # Options:
43
43
  # * <tt>:use_slug</tt> - Defaults to false. Use slugs when you want to use a non-unique text field for friendly ids.
44
44
  # * <tt>:max_length</tt> - Defaults to 255. The maximum allowed length for a slug.
45
- # * <tt>:cache_column</tt> - Defaults to nil. Use this column as a cache for generating to_param (experimental).
45
+ # * <tt>:cache_column</tt> - Defaults to nil. Use this column as a cache for generating to_param (experimental) Note that if you use this option, any calls to +attr_accessible+ must be made BEFORE any calls to has_friendly_id in your class.
46
46
  # * <tt>:strip_diacritics</tt> - Defaults to false. If true, it will remove accents, umlauts, etc. from western characters.
47
47
  # * <tt>:strip_non_ascii</tt> - Defaults to false. If true, it will all non-ascii ([^a-z0-9]) characters.
48
48
  # * <tt>:reserved</tt> - Array of words that are reserved and can't be used as friendly_id's. For sluggable models, if such a word is used, it will raise a FriendlyId::SlugGenerationError. Defaults to ["new", "index"].
@@ -79,11 +79,13 @@ module FriendlyId
79
79
  extend SluggableClassMethods
80
80
  include SluggableInstanceMethods
81
81
  before_save :set_slug
82
+ after_save :set_slug_cache
82
83
  if block_given?
83
84
  write_inheritable_attribute :slug_normalizer_block, block
84
85
  end
85
86
  if options[:cache_column]
86
- attr_protected options[:cache_column].to_sym
87
+ # only protect the column if the class is not already using attributes_accessible
88
+ attr_protected options[:cache_column].to_sym unless accessible_attributes
87
89
  end
88
90
  else
89
91
  require 'friendly_id/non_sluggable_class_methods'
@@ -32,15 +32,14 @@ module FriendlyId::SluggableClassMethods
32
32
  end
33
33
 
34
34
  result
35
+
35
36
  rescue ActiveRecord::RecordNotFound => e
36
37
 
37
38
  if friendly_id_options[:scope]
38
39
  if !scope
39
40
  raise ActiveRecord::RecordNotFound.new("%s; expected scope but got none" % e.message)
40
- # e.message << "; expected scope but got none"
41
41
  else
42
42
  raise ActiveRecord::RecordNotFound.new("%s and scope=#{scope}" % e.message)
43
- # e.message << " and scope=#{scope}"
44
43
  end
45
44
  end
46
45
 
@@ -118,12 +118,14 @@ private
118
118
  # If we're renaming back to a previously used friendly_id, delete the
119
119
  # slug so that we can recycle the name without having to use a sequence.
120
120
  slugs.find(:all, :conditions => {:name => slug_text, :scope => scope}).each { |s| s.destroy }
121
- slug = slugs.build slug_attributes
122
- if cache = friendly_id_options[:cache_column]
123
- new_slug = slug.to_friendly_id
124
- send("#{cache}=", new_slug) unless send(cache) == new_slug
125
- end
126
- slug
121
+ slugs.build slug_attributes
122
+ end
123
+ end
124
+
125
+ def set_slug_cache
126
+ if friendly_id_options[:cache_column] && send(friendly_id_options[:cache_column]) != slug.to_friendly_id
127
+ send "#{friendly_id_options[:cache_column]}=", slug.to_friendly_id
128
+ send :update_without_callbacks
127
129
  end
128
130
  end
129
131
 
@@ -4,7 +4,7 @@ module FriendlyId #:nodoc:
4
4
  module Version #:nodoc:
5
5
  MAJOR = 2
6
6
  MINOR = 2
7
- TINY = 0
7
+ TINY = 1
8
8
  STRING = [MAJOR, MINOR, TINY].join('.')
9
9
  end
10
10
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8!
2
- # @paris.reload
2
+ require "mocha"
3
3
 
4
4
  require File.dirname(__FILE__) + '/test_helper'
5
5
 
@@ -29,9 +29,22 @@ class CachedSlugModelTest < Test::Unit::TestCase
29
29
  should "protect the cached slug value" do
30
30
  @paris.update_attributes(:my_slug => "Madrid")
31
31
  @paris.reload
32
- assert_equal("paris", @paris.my_slug)
32
+ assert_equal "paris", @paris.my_slug
33
33
  end
34
34
 
35
+ should "cache the incremented sequence for duplicate slug names" do
36
+ @paris2 = City.create!(:name => "Paris")
37
+ assert_equal 2, @paris2.slug.sequence
38
+ assert_equal "paris--2", @paris2.my_slug
39
+ end
40
+
41
+ should "not update the cached slug column if it has not changed" do
42
+ @paris.population = 10_000_000
43
+ @paris.expects(:my_slug=).never
44
+ @paris.save
45
+ end
46
+
47
+
35
48
  context "found by its friendly id" do
36
49
 
37
50
  setup do
data/test/schema.rb CHANGED
@@ -42,6 +42,7 @@ ActiveRecord::Schema.define(:version => 1) do
42
42
 
43
43
  create_table "cities", :force => true do |t|
44
44
  t.column "name", "string"
45
+ t.column "population", "integer"
45
46
  t.column "my_slug", "string"
46
47
  end
47
48
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: friendly_id
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.2.1
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-10-19 00:00:00 -03:00
14
+ date: 2009-10-23 00:00:00 -03:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
@@ -84,7 +84,6 @@ files:
84
84
  - README.rdoc
85
85
  - Rakefile
86
86
  - config/website.yml
87
- - friendly_id.gemspec
88
87
  - generators/friendly_id/friendly_id_generator.rb
89
88
  - generators/friendly_id/templates/create_slugs.rb
90
89
  - generators/friendly_id_20_upgrade/friendly_id_20_upgrade_generator.rb
data/friendly_id.gemspec DELETED
@@ -1,46 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- Gem::Specification.new do |s|
4
- s.name = %q{friendly_id}
5
- s.version = "2.2.0"
6
-
7
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Norman Clarke", "Adrian Mugnolo", "Emilio Tagua"]
9
- s.date = %q{2009-09-21}
10
- s.description = %q{A comprehensive slugging and pretty-URL plugin for ActiveRecord.}
11
- s.email = ["norman@rubysouth.com", "adrian@rubysouth.com", "miloops@gmail.com"]
12
- s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
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/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/contest.rb", "test/custom_slug_normalizer_test.rb", "test/models/book.rb", "test/models/country.rb", "test/models/event.rb", "test/models/novel.rb", "test/models/person.rb", "test/models/post.rb", "test/models/thing.rb", "test/models/user.rb", "test/non_slugged_test.rb", "test/schema.rb", "test/scoped_model_test.rb", "test/slug_test.rb", "test/slugged_model_test.rb", "test/sti_test.rb", "test/test_helper.rb"]
14
- s.homepage = %q{http://friendly-id.rubyforge.org/}
15
- s.rdoc_options = ["--main", "README.rdoc"]
16
- s.require_paths = ["lib"]
17
- s.rubyforge_project = %q{friendly-id}
18
- s.rubygems_version = %q{1.3.4}
19
- s.summary = %q{A comprehensive slugging and pretty-URL plugin for ActiveRecord.}
20
- s.test_files = ["test/custom_slug_normalizer_test.rb", "test/non_slugged_test.rb", "test/scoped_model_test.rb", "test/slug_test.rb", "test/slugged_model_test.rb", "test/sti_test.rb"]
21
-
22
- if s.respond_to? :specification_version then
23
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
- s.specification_version = 3
25
-
26
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
- s.add_runtime_dependency(%q<activerecord>, [">= 2.0.0"])
28
- s.add_runtime_dependency(%q<activesupport>, [">= 2.0.0"])
29
- s.add_development_dependency(%q<newgem>, [">= 1.4.1"])
30
- s.add_development_dependency(%q<sqlite3-ruby>, [">= 0"])
31
- s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
32
- else
33
- s.add_dependency(%q<activerecord>, [">= 2.0.0"])
34
- s.add_dependency(%q<activesupport>, [">= 2.0.0"])
35
- s.add_dependency(%q<newgem>, [">= 1.4.1"])
36
- s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
37
- s.add_dependency(%q<hoe>, [">= 1.8.0"])
38
- end
39
- else
40
- s.add_dependency(%q<activerecord>, [">= 2.0.0"])
41
- s.add_dependency(%q<activesupport>, [">= 2.0.0"])
42
- s.add_dependency(%q<newgem>, [">= 1.4.1"])
43
- s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
44
- s.add_dependency(%q<hoe>, [">= 1.8.0"])
45
- end
46
- end