friendly_id 5.0.2 → 5.0.3
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.
- checksums.yaml +4 -4
- data/.travis.yml +15 -1
- data/Changelog.md +2 -0
- data/Gemfile +8 -2
- data/README.md +1 -0
- data/friendly_id.gemspec +1 -2
- data/gemfiles/Gemfile.rails-4.0.rb +9 -2
- data/gemfiles/Gemfile.rails-4.1.rb +29 -0
- data/gemfiles/Gemfile.rails-stable.rb +8 -2
- data/lib/friendly_id/base.rb +5 -1
- data/lib/friendly_id/configuration.rb +1 -1
- data/lib/friendly_id/finders.rb +19 -7
- data/lib/friendly_id/history.rb +1 -0
- data/lib/friendly_id/initializer.rb +1 -1
- data/lib/friendly_id/scoped.rb +4 -4
- data/lib/friendly_id/slugged.rb +5 -5
- data/lib/friendly_id/version.rb +1 -1
- data/test/scoped_test.rb +34 -0
- data/test/slugged_test.rb +30 -1
- data/test/sti_test.rb +62 -2
- metadata +28 -41
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: ae540f2127bb8f4e872640deb40fe582eedad06a
         | 
| 4 | 
            +
              data.tar.gz: 8d9e0ddb7339a440bd8000240a083b5586dee6a8
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: dcbcea5a8df1f5919c72ac9775ad619953fc776a7191c5e163d04c3361d9338fda12e37a7b50104345ef8583c3e8ac589b563231aa99e97cf52ed5305550fd2d
         | 
| 7 | 
            +
              data.tar.gz: 2f48d2758e511c32ad5de5187c28509799cd2a46180d6d9b69ee6e190a5d8449b076e9f8cf7ef1159a69b6fc572f650bcb907087303ac2396b483418b2fe71d1
         | 
    
        data/.travis.yml
    CHANGED
    
    | @@ -1,13 +1,27 @@ | |
| 1 1 | 
             
            language: ruby
         | 
| 2 2 | 
             
            rvm:
         | 
| 3 3 | 
             
              - 2.0.0
         | 
| 4 | 
            +
              - 2.1.0
         | 
| 5 | 
            +
              - jruby-19mode
         | 
| 6 | 
            +
              - rbx
         | 
| 4 7 | 
             
            env:
         | 
| 5 8 | 
             
              - DB=postgres
         | 
| 6 9 | 
             
              - DB=mysql
         | 
| 7 | 
            -
              - DB=sqlite3
         | 
| 8 10 | 
             
            gemfile:
         | 
| 9 11 | 
             
              - gemfiles/Gemfile.rails-4.0.rb
         | 
| 10 12 | 
             
              - gemfiles/Gemfile.rails-stable.rb
         | 
| 13 | 
            +
              - gemfiles/Gemfile.rails-4.1.rb
         | 
| 11 14 |  | 
| 12 15 | 
             
            before_script: 'bundle exec rake db:create db:up'
         | 
| 13 16 | 
             
            script: 'COVERAGE=true bundle exec rake test'
         | 
| 17 | 
            +
            matrix:
         | 
| 18 | 
            +
              allow_failures:
         | 
| 19 | 
            +
                - rvm: jruby-19mode
         | 
| 20 | 
            +
                  gemfile: gemfiles/Gemfile.rails-4.1.rb
         | 
| 21 | 
            +
                  env: DB=postgres
         | 
| 22 | 
            +
                - rvm: jruby-19mode
         | 
| 23 | 
            +
                  gemfile: gemfiles/Gemfile.rails-4.1.rb
         | 
| 24 | 
            +
                  env: DB=mysql
         | 
| 25 | 
            +
                - rvm: jruby-19mode
         | 
| 26 | 
            +
                  gemfile: gemfiles/Gemfile.rails-4.1.rb
         | 
| 27 | 
            +
                  env: DB=sqlite3
         | 
    
        data/Changelog.md
    CHANGED
    
    | @@ -9,6 +9,8 @@ suggestions, ideas and improvements to FriendlyId. | |
| 9 9 | 
             
            * Documentation improvements (thanks [John Bachir](https://github.com/jjb)).
         | 
| 10 10 | 
             
            * Minor refactoring of internals (thanks [Gagan Ahwad](https://github.com/gaganawhad)).
         | 
| 11 11 | 
             
            * Set slug to `nil` on call to `dup` to ensure slug is generated ([#483](https://github.com/norman/friendly_id/pull/483)).
         | 
| 12 | 
            +
            * Bug fixes for STI ([#516](https://github.com/norman/friendly_id/pull/516)).
         | 
| 13 | 
            +
            * Bug fix for finds with models that use the :history module ([#509](https://github.com/norman/friendly_id/pull/509)).
         | 
| 12 14 |  | 
| 13 15 | 
             
            ## 5.0.1 (2013-10-27)
         | 
| 14 16 |  | 
    
        data/Gemfile
    CHANGED
    
    | @@ -6,10 +6,16 @@ gemspec | |
| 6 6 | 
             
            group :development, :test do
         | 
| 7 7 | 
             
              platforms :jruby do
         | 
| 8 8 | 
             
                gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.beta2'
         | 
| 9 | 
            -
                gem ' | 
| 9 | 
            +
                gem 'kramdown'
         | 
| 10 10 | 
             
              end
         | 
| 11 11 |  | 
| 12 | 
            -
              platforms :ruby do
         | 
| 12 | 
            +
              platforms :ruby, :rbx do
         | 
| 13 13 | 
             
                gem 'sqlite3'
         | 
| 14 | 
            +
                gem 'redcarpet'
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              platforms :rbx do
         | 
| 18 | 
            +
                gem 'rubysl', '~> 2.0'
         | 
| 19 | 
            +
                gem 'rubinius-developer_tools'
         | 
| 14 20 | 
             
              end
         | 
| 15 21 | 
             
            end
         | 
    
        data/README.md
    CHANGED
    
    | @@ -57,6 +57,7 @@ The most important changes are: | |
| 57 57 | 
             
            * Finders are no longer overridden by default. If you want to do friendly finds,
         | 
| 58 58 | 
             
              you must do `Model.friendly.find` rather than `Model.find`. You can however
         | 
| 59 59 | 
             
              restore FriendlyId 4-style finders by using the `:finders` addon:
         | 
| 60 | 
            +
             | 
| 60 61 | 
             
              ```ruby
         | 
| 61 62 | 
             
              friendly_id :foo, use: :slugged # you must do MyClass.friendly.find('bar')
         | 
| 62 63 | 
             
              # or...
         | 
    
        data/friendly_id.gemspec
    CHANGED
    
    | @@ -16,7 +16,7 @@ Gem::Specification.new do |s| | |
| 16 16 |  | 
| 17 17 | 
             
              s.required_ruby_version = '>= 1.9.3'
         | 
| 18 18 |  | 
| 19 | 
            -
              s.add_dependency 'activerecord', ' | 
| 19 | 
            +
              s.add_dependency 'activerecord', '>= 4.0.0'
         | 
| 20 20 |  | 
| 21 21 | 
             
              s.add_development_dependency 'coveralls'
         | 
| 22 22 | 
             
              s.add_development_dependency 'railties', '~> 4.0.0'
         | 
| @@ -26,7 +26,6 @@ Gem::Specification.new do |s| | |
| 26 26 | 
             
              s.add_development_dependency 'i18n'
         | 
| 27 27 | 
             
              s.add_development_dependency 'ffaker'
         | 
| 28 28 | 
             
              s.add_development_dependency 'simplecov'
         | 
| 29 | 
            -
              s.add_development_dependency 'redcarpet'
         | 
| 30 29 |  | 
| 31 30 | 
             
              s.description = <<-EOM
         | 
| 32 31 | 
             
            FriendlyId is the "Swiss Army bulldozer" of slugging and permalink plugins for
         | 
| @@ -8,12 +8,19 @@ group :development, :test do | |
| 8 8 | 
             
                gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.beta2'
         | 
| 9 9 | 
             
                gem 'activerecord-jdbcmysql-adapter', '>= 1.3.0.beta2'
         | 
| 10 10 | 
             
                gem 'activerecord-jdbcpostgresql-adapter', '>= 1.3.0.beta2'
         | 
| 11 | 
            -
                gem ' | 
| 11 | 
            +
                gem 'kramdown'
         | 
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| 14 | 
            -
              platforms :ruby do
         | 
| 14 | 
            +
              platforms :ruby, :rbx do
         | 
| 15 15 | 
             
                gem 'sqlite3'
         | 
| 16 16 | 
             
                gem 'mysql2'
         | 
| 17 17 | 
             
                gem 'pg'
         | 
| 18 | 
            +
                gem 'redcarpet'
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              platforms :rbx do
         | 
| 22 | 
            +
                gem 'rubysl', '~> 2.0'
         | 
| 23 | 
            +
                gem 'rubinius-developer_tools'
         | 
| 24 | 
            +
                gem 'json'
         | 
| 18 25 | 
             
              end
         | 
| 19 26 | 
             
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            source 'https://rubygems.org'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            gemspec path: '../'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            gem 'activerecord', '~> 4.1.0.beta1'
         | 
| 6 | 
            +
            gem 'railties', '~> 4.1.0.beta1'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            # Database Configuration
         | 
| 9 | 
            +
            group :development, :test do
         | 
| 10 | 
            +
              platforms :jruby do
         | 
| 11 | 
            +
                gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.beta2'
         | 
| 12 | 
            +
                gem 'activerecord-jdbcmysql-adapter', '>= 1.3.0.beta2'
         | 
| 13 | 
            +
                gem 'activerecord-jdbcpostgresql-adapter', '>= 1.3.0.beta2'
         | 
| 14 | 
            +
                gem 'kramdown'
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              platforms :ruby, :rbx do
         | 
| 18 | 
            +
                gem 'sqlite3'
         | 
| 19 | 
            +
                gem 'mysql2'
         | 
| 20 | 
            +
                gem 'pg'
         | 
| 21 | 
            +
                gem 'redcarpet'
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              platforms :rbx do
         | 
| 25 | 
            +
                gem 'rubysl', '~> 2.0'
         | 
| 26 | 
            +
                gem 'rubinius-developer_tools'
         | 
| 27 | 
            +
                gem 'json'
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| @@ -13,12 +13,18 @@ group :development, :test do | |
| 13 13 | 
             
                gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.beta2'
         | 
| 14 14 | 
             
                gem 'activerecord-jdbcmysql-adapter', '>= 1.3.0.beta2'
         | 
| 15 15 | 
             
                gem 'activerecord-jdbcpostgresql-adapter', '>= 1.3.0.beta2'
         | 
| 16 | 
            -
                gem ' | 
| 16 | 
            +
                gem 'kramdown'
         | 
| 17 17 | 
             
              end
         | 
| 18 18 |  | 
| 19 | 
            -
              platforms :ruby do
         | 
| 19 | 
            +
              platforms :ruby, :rbx do
         | 
| 20 20 | 
             
                gem 'sqlite3'
         | 
| 21 21 | 
             
                gem 'mysql2'
         | 
| 22 22 | 
             
                gem 'pg'
         | 
| 23 | 
            +
                gem 'redcarpet'
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              platforms :rbx do
         | 
| 27 | 
            +
                gem 'rubysl', '~> 2.0'
         | 
| 28 | 
            +
                gem 'rubinius-developer_tools'
         | 
| 23 29 | 
             
              end
         | 
| 24 30 | 
             
            end
         | 
    
        data/lib/friendly_id/base.rb
    CHANGED
    
    | @@ -18,6 +18,10 @@ addons it should use. See the documentation for this method for a list of all | |
| 18 18 | 
             
            available addons, or skim through the rest of the docs to get a high-level
         | 
| 19 19 | 
             
            overview.
         | 
| 20 20 |  | 
| 21 | 
            +
            *A note about single table inheritance (STI): you must extend FriendlyId in
         | 
| 22 | 
            +
            all classes that participate in STI, both your parent classes and their
         | 
| 23 | 
            +
            children.*
         | 
| 24 | 
            +
             | 
| 21 25 | 
             
            ### The Default Setup: Simple Models
         | 
| 22 26 |  | 
| 23 27 | 
             
            The simplest way to use FriendlyId is with a model that has a uniquely indexed
         | 
| @@ -249,7 +253,7 @@ often better and easier to use {FriendlyId::Slugged slugs}. | |
| 249 253 |  | 
| 250 254 | 
             
                # Clears slug on duplicate records when calling `dup`.
         | 
| 251 255 | 
             
                def dup
         | 
| 252 | 
            -
                  super.tap { |duplicate| duplicate.slug = nil }
         | 
| 256 | 
            +
                  super.tap { |duplicate| duplicate.slug = nil if duplicate.respond_to?('slug=') }
         | 
| 253 257 | 
             
                end
         | 
| 254 258 | 
             
              end
         | 
| 255 259 | 
             
            end
         | 
    
        data/lib/friendly_id/finders.rb
    CHANGED
    
    | @@ -18,7 +18,7 @@ By default, these methods are available only on the `friendly` scope: | |
| 18 18 | 
             
            Prior to version 5.0, FriendlyId overrode the default finder methods to perform
         | 
| 19 19 | 
             
            friendly finds all the time. This required modifying parts of Rails that did
         | 
| 20 20 | 
             
            not have a public API, which was harder to maintain and at times caused
         | 
| 21 | 
            -
            compatiblity problems. In 5.0 we decided change the library's defaults and add
         | 
| 21 | 
            +
            compatiblity problems. In 5.0 we decided to change the library's defaults and add
         | 
| 22 22 | 
             
            the friendly finder methods only to the `friendly` scope in order to boost
         | 
| 23 23 | 
             
            compatiblity. However, you can still opt-in to original functionality very
         | 
| 24 24 | 
             
            easily by using the `:finders` addon:
         | 
| @@ -63,18 +63,30 @@ for models that use FriendlyId with something similar to the following: | |
| 63 63 |  | 
| 64 64 | 
             
            =end
         | 
| 65 65 | 
             
              module Finders
         | 
| 66 | 
            -
             | 
| 66 | 
            +
             | 
| 67 | 
            +
                module ClassMethods
         | 
| 68 | 
            +
                  if (ActiveRecord::VERSION::MAJOR == 4) && (ActiveRecord::VERSION::MINOR == 0)
         | 
| 69 | 
            +
                    def relation_delegate_class(klass)
         | 
| 70 | 
            +
                      relation_class_name = :"#{klass.to_s.gsub('::', '_')}_#{self.to_s.gsub('::', '_')}"
         | 
| 71 | 
            +
                      klass.const_get(relation_class_name)
         | 
| 72 | 
            +
                    end
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                def self.setup(model_class)
         | 
| 67 77 | 
             
                  model_class.instance_eval do
         | 
| 68 78 | 
             
                    relation.class.send(:include, friendly_id_config.finder_methods)
         | 
| 69 79 | 
             
                  end
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                def self.included(model_class)
         | 
| 83 | 
            +
                  model_class.extend(ClassMethods)
         | 
| 70 84 |  | 
| 71 85 | 
             
                  # Support for friendly finds on associations for Rails 4.0.1 and above.
         | 
| 72 | 
            -
                  # As of 1 October 2013 this works on Rails 4-0-stable, but may change.
         | 
| 73 86 | 
             
                  if ::ActiveRecord.const_defined?('AssociationRelation')
         | 
| 74 | 
            -
                     | 
| 75 | 
            -
                     | 
| 76 | 
            -
                    association_relation_class.send(:include, model_class.friendly_id_config.finder_methods)
         | 
| 87 | 
            +
                    association_relation_delegate_class = model_class.relation_delegate_class(::ActiveRecord::AssociationRelation)
         | 
| 88 | 
            +
                    association_relation_delegate_class.send(:include, model_class.friendly_id_config.finder_methods)
         | 
| 77 89 | 
             
                  end
         | 
| 78 90 | 
             
                end
         | 
| 79 91 | 
             
              end
         | 
| 80 | 
            -
            end
         | 
| 92 | 
            +
            end
         | 
    
        data/lib/friendly_id/history.rb
    CHANGED
    
    
| @@ -64,7 +64,7 @@ FriendlyId.defaults do |config| | |
| 64 64 | 
             
              #  ### Controlling when slugs are generated
         | 
| 65 65 | 
             
              #
         | 
| 66 66 | 
             
              # As of FriendlyId 5.0, new slugs are generated only when the slug field is
         | 
| 67 | 
            -
              # nil, but  | 
| 67 | 
            +
              # nil, but if you're using a column as your base method can change this
         | 
| 68 68 | 
             
              # behavior by overriding the `should_generate_new_friendly_id` method that
         | 
| 69 69 | 
             
              # FriendlyId adds to your model. The change below makes FriendlyId 5.0 behave
         | 
| 70 70 | 
             
              # more like 4.0.
         | 
    
        data/lib/friendly_id/scoped.rb
    CHANGED
    
    | @@ -58,7 +58,7 @@ All supplied values will be used to determine scope. | |
| 58 58 | 
             
            ### Finding Records by Friendly ID
         | 
| 59 59 |  | 
| 60 60 | 
             
            If you are using scopes your friendly ids may not be unique, so a simple find
         | 
| 61 | 
            -
            like
         | 
| 61 | 
            +
            like:
         | 
| 62 62 |  | 
| 63 63 | 
             
                Restaurant.friendly.find("joes-diner")
         | 
| 64 64 |  | 
| @@ -127,13 +127,13 @@ an example of one way to set this up: | |
| 127 127 | 
             
                    relation = relation.where(column => send(column))
         | 
| 128 128 | 
             
                  end
         | 
| 129 129 | 
             
                  if changed.include?(friendly_id_config.slug_column)
         | 
| 130 | 
            -
                     | 
| 131 | 
            -
                    relation = relation.where( | 
| 130 | 
            +
                    primary_key_name = self.class.primary_key
         | 
| 131 | 
            +
                    relation = relation.where.not(primary_key_name => send(primary_key_name))
         | 
| 132 132 | 
             
                  end
         | 
| 133 133 | 
             
                  relation
         | 
| 134 134 | 
             
                end
         | 
| 135 135 | 
             
                private :scope_for_slug_generator
         | 
| 136 | 
            -
             | 
| 136 | 
            +
             | 
| 137 137 | 
             
                def slug_generator
         | 
| 138 138 | 
             
                  friendly_id_config.slug_generator_class.new(scope_for_slug_generator)
         | 
| 139 139 | 
             
                end
         | 
    
        data/lib/friendly_id/slugged.rb
    CHANGED
    
    | @@ -76,7 +76,7 @@ dashes, and Unicode Latin characters with ASCII approximations: | |
| 76 76 |  | 
| 77 77 | 
             
            #### Column or Method?
         | 
| 78 78 |  | 
| 79 | 
            -
            FriendlyId always uses a method as the basis of the slug text - not a column.  | 
| 79 | 
            +
            FriendlyId always uses a method as the basis of the slug text - not a column. At
         | 
| 80 80 | 
             
            first glance, this may sound confusing, but remember that Active Record provides
         | 
| 81 81 | 
             
            methods for each column in a model's associated table, and that's what
         | 
| 82 82 | 
             
            FriendlyId uses.
         | 
| @@ -106,7 +106,7 @@ FriendlyId will append a UUID to the generated slug to ensure uniqueness: | |
| 106 106 | 
             
                car.friendly_id #=> "peugot-206"
         | 
| 107 107 | 
             
                car2.friendly_id #=> "peugot-206-f9f3789a-daec-4156-af1d-fab81aa16ee5"
         | 
| 108 108 |  | 
| 109 | 
            -
            Previous versions of FriendlyId appended a numeric sequence  | 
| 109 | 
            +
            Previous versions of FriendlyId appended a numeric sequence to make slugs
         | 
| 110 110 | 
             
            unique, but this was removed to simplify using FriendlyId in concurrent code.
         | 
| 111 111 |  | 
| 112 112 | 
             
            #### Candidates
         | 
| @@ -299,11 +299,11 @@ Github issue](https://github.com/norman/friendly_id/issues/185) for discussion. | |
| 299 299 |  | 
| 300 300 | 
             
                def scope_for_slug_generator
         | 
| 301 301 | 
             
                  scope = self.class.base_class.unscoped
         | 
| 302 | 
            -
                  scope = scope.friendly unless  | 
| 302 | 
            +
                  scope = scope.friendly unless scope.respond_to?(:exists_by_friendly_id?)
         | 
| 303 303 |  | 
| 304 304 | 
             
                  if changed.include?(friendly_id_config.slug_column)
         | 
| 305 | 
            -
                     | 
| 306 | 
            -
                    scope = scope.where( | 
| 305 | 
            +
                    primary_key_name = self.class.primary_key
         | 
| 306 | 
            +
                    scope = scope.where.not(primary_key_name => send(primary_key_name))
         | 
| 307 307 | 
             
                  end
         | 
| 308 308 | 
             
                  scope
         | 
| 309 309 | 
             
                end
         | 
    
        data/lib/friendly_id/version.rb
    CHANGED
    
    
    
        data/test/scoped_test.rb
    CHANGED
    
    | @@ -10,6 +10,10 @@ class Novel < ActiveRecord::Base | |
| 10 10 | 
             
              belongs_to :novelist
         | 
| 11 11 | 
             
              belongs_to :publisher
         | 
| 12 12 | 
             
              friendly_id :name, :use => :scoped, :scope => [:publisher, :novelist]
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def should_generate_new_friendly_id?
         | 
| 15 | 
            +
                new_record? || super
         | 
| 16 | 
            +
              end
         | 
| 13 17 | 
             
            end
         | 
| 14 18 |  | 
| 15 19 | 
             
            class Publisher < ActiveRecord::Base
         | 
| @@ -54,6 +58,36 @@ class ScopedTest < MiniTest::Unit::TestCase | |
| 54 58 | 
             
                end
         | 
| 55 59 | 
             
              end
         | 
| 56 60 |  | 
| 61 | 
            +
              test "should not allow duplicate slugs inside scope after regeneration for persisted record" do
         | 
| 62 | 
            +
                with_instance_of Novelist do |novelist|
         | 
| 63 | 
            +
                  novel1 = Novel.create! :name => "a", :novelist => novelist
         | 
| 64 | 
            +
                  novel2 = Novel.new :name => "a", :novelist => novelist
         | 
| 65 | 
            +
                  novel2.save!
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  novel2.send(:set_slug)
         | 
| 68 | 
            +
                  first_generated_friendly_id = novel2.friendly_id
         | 
| 69 | 
            +
                  novel2.send(:set_slug)
         | 
| 70 | 
            +
                  second_generated_friendly_id = novel2.friendly_id
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  assert novel1.friendly_id != novel2.friendly_id
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              test "should not allow duplicate slugs inside scope after regeneration for new record" do
         | 
| 77 | 
            +
                with_instance_of Novelist do |novelist|
         | 
| 78 | 
            +
                  novel1 = Novel.create! :name => "a", :novelist => novelist
         | 
| 79 | 
            +
                  novel2 = Novel.new :name => "a", :novelist => novelist
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  novel2.send(:set_slug)
         | 
| 82 | 
            +
                  first_generated_friendly_id = novel2.friendly_id
         | 
| 83 | 
            +
                  novel2.send(:set_slug)
         | 
| 84 | 
            +
                  second_generated_friendly_id = novel2.friendly_id
         | 
| 85 | 
            +
                  novel2.save!
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  assert novel1.friendly_id != novel2.friendly_id
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
             | 
| 57 91 | 
             
              test "should apply scope with multiple columns" do
         | 
| 58 92 | 
             
                transaction do
         | 
| 59 93 | 
             
                  novelist = Novelist.create! :name => "a"
         | 
    
        data/test/slugged_test.rb
    CHANGED
    
    | @@ -141,6 +141,35 @@ class SlugGeneratorTest < MiniTest::Unit::TestCase | |
| 141 141 | 
             
                end
         | 
| 142 142 | 
             
              end
         | 
| 143 143 |  | 
| 144 | 
            +
              test "should not allow duplicate slugs after regeneration for persisted record" do
         | 
| 145 | 
            +
                transaction do
         | 
| 146 | 
            +
                  model1 = model_class.create! :name => "a"
         | 
| 147 | 
            +
                  model2 = model_class.new :name => "a"
         | 
| 148 | 
            +
                  model2.save!
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                  model2.send(:set_slug)
         | 
| 151 | 
            +
                  first_generated_friendly_id = model2.friendly_id
         | 
| 152 | 
            +
                  model2.send(:set_slug)
         | 
| 153 | 
            +
                  second_generated_friendly_id = model2.friendly_id
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                  assert model1.friendly_id != model2.friendly_id
         | 
| 156 | 
            +
                end
         | 
| 157 | 
            +
              end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
              test "should not allow duplicate slugs after regeneration for new record" do
         | 
| 160 | 
            +
                transaction do
         | 
| 161 | 
            +
                  model1 = model_class.create! :name => "a"
         | 
| 162 | 
            +
                  model2 = model_class.new :name => "a"
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                  model2.send(:set_slug)
         | 
| 165 | 
            +
                  first_generated_friendly_id = model2.friendly_id
         | 
| 166 | 
            +
                  model2.send(:set_slug)
         | 
| 167 | 
            +
                  second_generated_friendly_id = model2.friendly_id
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                  assert model1.friendly_id != model2.friendly_id
         | 
| 170 | 
            +
                end
         | 
| 171 | 
            +
              end
         | 
| 172 | 
            +
             | 
| 144 173 | 
             
            end
         | 
| 145 174 |  | 
| 146 175 | 
             
            class SlugSeparatorTest < MiniTest::Unit::TestCase
         | 
| @@ -220,7 +249,7 @@ class StringAsPrimaryKeyFindTest < MiniTest::Unit::TestCase | |
| 220 249 | 
             
                friendly_id :name, :use => :slugged
         | 
| 221 250 | 
             
                before_create :init_primary_key
         | 
| 222 251 |  | 
| 223 | 
            -
                def self.primary_key | 
| 252 | 
            +
                def self.primary_key
         | 
| 224 253 | 
             
                  "string_key"
         | 
| 225 254 | 
             
                end
         | 
| 226 255 |  | 
    
        data/test/sti_test.rb
    CHANGED
    
    | @@ -8,7 +8,7 @@ class StiTest < MiniTest::Unit::TestCase | |
| 8 8 |  | 
| 9 9 | 
             
              class Journalist < ActiveRecord::Base
         | 
| 10 10 | 
             
                extend FriendlyId
         | 
| 11 | 
            -
                friendly_id :name, :use => :slugged
         | 
| 11 | 
            +
                friendly_id :name, :use => [:slugged]
         | 
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| 14 14 | 
             
              class Editorialist < Journalist
         | 
| @@ -59,7 +59,6 @@ class StiTest < MiniTest::Unit::TestCase | |
| 59 59 | 
             
                  assert_match(/foo-bar-.+/, editoralist.slug)
         | 
| 60 60 | 
             
                end
         | 
| 61 61 | 
             
              end
         | 
| 62 | 
            -
             | 
| 63 62 | 
             
            end
         | 
| 64 63 |  | 
| 65 64 | 
             
            class StiTestWithHistory < StiTest
         | 
| @@ -74,4 +73,65 @@ class StiTestWithHistory < StiTest | |
| 74 73 | 
             
              def model_class
         | 
| 75 74 | 
             
                Editorialist
         | 
| 76 75 | 
             
              end
         | 
| 76 | 
            +
            end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
             | 
| 79 | 
            +
            class StiTestWithFinders < MiniTest::Unit::TestCase
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              include FriendlyId::Test
         | 
| 82 | 
            +
             | 
| 83 | 
            +
              class Journalist < ActiveRecord::Base
         | 
| 84 | 
            +
                extend FriendlyId
         | 
| 85 | 
            +
                friendly_id :name, :use => [:slugged, :finders]
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
              class Editorialist < Journalist
         | 
| 89 | 
            +
                extend FriendlyId
         | 
| 90 | 
            +
                friendly_id :name, :use => [:slugged, :finders]
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              def model_class
         | 
| 94 | 
            +
                Editorialist
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              test "friendly_id slugs should be looked up from subclass with friendly" do
         | 
| 98 | 
            +
                transaction do
         | 
| 99 | 
            +
                  editoralist = model_class.create! :name => 'foo bar'
         | 
| 100 | 
            +
                  assert_equal editoralist, model_class.friendly.find(editoralist.slug)
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
              end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              test "friendly_id slugs should be looked up from subclass" do
         | 
| 105 | 
            +
                transaction do
         | 
| 106 | 
            +
                  editoralist = model_class.create! :name => 'foo bar'
         | 
| 107 | 
            +
                  assert_equal editoralist, model_class.find(editoralist.slug)
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
              end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
            class StiTestSubClass < MiniTest::Unit::TestCase
         | 
| 114 | 
            +
             | 
| 115 | 
            +
              include FriendlyId::Test
         | 
| 116 | 
            +
             | 
| 117 | 
            +
              class Journalist < ActiveRecord::Base
         | 
| 118 | 
            +
                extend FriendlyId
         | 
| 119 | 
            +
              end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
              class Editorialist < Journalist
         | 
| 122 | 
            +
                extend FriendlyId
         | 
| 123 | 
            +
                friendly_id :name, :use => [:slugged, :finders]
         | 
| 124 | 
            +
              end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              def model_class
         | 
| 127 | 
            +
                Editorialist
         | 
| 128 | 
            +
              end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
              test "friendly_id slugs can be created and looked up from subclass" do
         | 
| 131 | 
            +
                transaction do
         | 
| 132 | 
            +
                  editoralist = model_class.create! :name => 'foo bar'
         | 
| 133 | 
            +
                  assert_equal editoralist, model_class.find(editoralist.slug)
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
              end
         | 
| 136 | 
            +
             | 
| 77 137 | 
             
            end
         | 
    
        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: 5.0. | 
| 4 | 
            +
              version: 5.0.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Norman Clarke
         | 
| @@ -9,146 +9,132 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2014-02-14 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: activerecord
         | 
| 16 16 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                requirements:
         | 
| 18 | 
            -
                - -  | 
| 18 | 
            +
                - - ">="
         | 
| 19 19 | 
             
                  - !ruby/object:Gem::Version
         | 
| 20 20 | 
             
                    version: 4.0.0
         | 
| 21 21 | 
             
              type: :runtime
         | 
| 22 22 | 
             
              prerelease: false
         | 
| 23 23 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 24 24 | 
             
                requirements:
         | 
| 25 | 
            -
                - -  | 
| 25 | 
            +
                - - ">="
         | 
| 26 26 | 
             
                  - !ruby/object:Gem::Version
         | 
| 27 27 | 
             
                    version: 4.0.0
         | 
| 28 28 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 29 29 | 
             
              name: coveralls
         | 
| 30 30 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 31 31 | 
             
                requirements:
         | 
| 32 | 
            -
                - -  | 
| 32 | 
            +
                - - ">="
         | 
| 33 33 | 
             
                  - !ruby/object:Gem::Version
         | 
| 34 34 | 
             
                    version: '0'
         | 
| 35 35 | 
             
              type: :development
         | 
| 36 36 | 
             
              prerelease: false
         | 
| 37 37 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 38 38 | 
             
                requirements:
         | 
| 39 | 
            -
                - -  | 
| 39 | 
            +
                - - ">="
         | 
| 40 40 | 
             
                  - !ruby/object:Gem::Version
         | 
| 41 41 | 
             
                    version: '0'
         | 
| 42 42 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 43 43 | 
             
              name: railties
         | 
| 44 44 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 45 45 | 
             
                requirements:
         | 
| 46 | 
            -
                - - ~>
         | 
| 46 | 
            +
                - - "~>"
         | 
| 47 47 | 
             
                  - !ruby/object:Gem::Version
         | 
| 48 48 | 
             
                    version: 4.0.0
         | 
| 49 49 | 
             
              type: :development
         | 
| 50 50 | 
             
              prerelease: false
         | 
| 51 51 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 52 52 | 
             
                requirements:
         | 
| 53 | 
            -
                - - ~>
         | 
| 53 | 
            +
                - - "~>"
         | 
| 54 54 | 
             
                  - !ruby/object:Gem::Version
         | 
| 55 55 | 
             
                    version: 4.0.0
         | 
| 56 56 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 57 57 | 
             
              name: minitest
         | 
| 58 58 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 59 59 | 
             
                requirements:
         | 
| 60 | 
            -
                - -  | 
| 60 | 
            +
                - - ">="
         | 
| 61 61 | 
             
                  - !ruby/object:Gem::Version
         | 
| 62 62 | 
             
                    version: 4.4.0
         | 
| 63 63 | 
             
              type: :development
         | 
| 64 64 | 
             
              prerelease: false
         | 
| 65 65 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 66 66 | 
             
                requirements:
         | 
| 67 | 
            -
                - -  | 
| 67 | 
            +
                - - ">="
         | 
| 68 68 | 
             
                  - !ruby/object:Gem::Version
         | 
| 69 69 | 
             
                    version: 4.4.0
         | 
| 70 70 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 71 71 | 
             
              name: mocha
         | 
| 72 72 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 73 73 | 
             
                requirements:
         | 
| 74 | 
            -
                - - ~>
         | 
| 74 | 
            +
                - - "~>"
         | 
| 75 75 | 
             
                  - !ruby/object:Gem::Version
         | 
| 76 76 | 
             
                    version: 0.13.3
         | 
| 77 77 | 
             
              type: :development
         | 
| 78 78 | 
             
              prerelease: false
         | 
| 79 79 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 80 80 | 
             
                requirements:
         | 
| 81 | 
            -
                - - ~>
         | 
| 81 | 
            +
                - - "~>"
         | 
| 82 82 | 
             
                  - !ruby/object:Gem::Version
         | 
| 83 83 | 
             
                    version: 0.13.3
         | 
| 84 84 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 85 85 | 
             
              name: yard
         | 
| 86 86 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 87 87 | 
             
                requirements:
         | 
| 88 | 
            -
                - -  | 
| 88 | 
            +
                - - ">="
         | 
| 89 89 | 
             
                  - !ruby/object:Gem::Version
         | 
| 90 90 | 
             
                    version: '0'
         | 
| 91 91 | 
             
              type: :development
         | 
| 92 92 | 
             
              prerelease: false
         | 
| 93 93 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 94 94 | 
             
                requirements:
         | 
| 95 | 
            -
                - -  | 
| 95 | 
            +
                - - ">="
         | 
| 96 96 | 
             
                  - !ruby/object:Gem::Version
         | 
| 97 97 | 
             
                    version: '0'
         | 
| 98 98 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 99 99 | 
             
              name: i18n
         | 
| 100 100 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 101 101 | 
             
                requirements:
         | 
| 102 | 
            -
                - -  | 
| 102 | 
            +
                - - ">="
         | 
| 103 103 | 
             
                  - !ruby/object:Gem::Version
         | 
| 104 104 | 
             
                    version: '0'
         | 
| 105 105 | 
             
              type: :development
         | 
| 106 106 | 
             
              prerelease: false
         | 
| 107 107 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 108 108 | 
             
                requirements:
         | 
| 109 | 
            -
                - -  | 
| 109 | 
            +
                - - ">="
         | 
| 110 110 | 
             
                  - !ruby/object:Gem::Version
         | 
| 111 111 | 
             
                    version: '0'
         | 
| 112 112 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 113 113 | 
             
              name: ffaker
         | 
| 114 114 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 115 115 | 
             
                requirements:
         | 
| 116 | 
            -
                - -  | 
| 116 | 
            +
                - - ">="
         | 
| 117 117 | 
             
                  - !ruby/object:Gem::Version
         | 
| 118 118 | 
             
                    version: '0'
         | 
| 119 119 | 
             
              type: :development
         | 
| 120 120 | 
             
              prerelease: false
         | 
| 121 121 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 122 122 | 
             
                requirements:
         | 
| 123 | 
            -
                - -  | 
| 123 | 
            +
                - - ">="
         | 
| 124 124 | 
             
                  - !ruby/object:Gem::Version
         | 
| 125 125 | 
             
                    version: '0'
         | 
| 126 126 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 127 127 | 
             
              name: simplecov
         | 
| 128 128 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 129 129 | 
             
                requirements:
         | 
| 130 | 
            -
                - -  | 
| 130 | 
            +
                - - ">="
         | 
| 131 131 | 
             
                  - !ruby/object:Gem::Version
         | 
| 132 132 | 
             
                    version: '0'
         | 
| 133 133 | 
             
              type: :development
         | 
| 134 134 | 
             
              prerelease: false
         | 
| 135 135 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 136 136 | 
             
                requirements:
         | 
| 137 | 
            -
                - -  | 
| 138 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 139 | 
            -
                    version: '0'
         | 
| 140 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 141 | 
            -
              name: redcarpet
         | 
| 142 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 143 | 
            -
                requirements:
         | 
| 144 | 
            -
                - - '>='
         | 
| 145 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 146 | 
            -
                    version: '0'
         | 
| 147 | 
            -
              type: :development
         | 
| 148 | 
            -
              prerelease: false
         | 
| 149 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 150 | 
            -
                requirements:
         | 
| 151 | 
            -
                - - '>='
         | 
| 137 | 
            +
                - - ">="
         | 
| 152 138 | 
             
                  - !ruby/object:Gem::Version
         | 
| 153 139 | 
             
                    version: '0'
         | 
| 154 140 | 
             
            description: |
         | 
| @@ -162,10 +148,10 @@ executables: [] | |
| 162 148 | 
             
            extensions: []
         | 
| 163 149 | 
             
            extra_rdoc_files: []
         | 
| 164 150 | 
             
            files:
         | 
| 165 | 
            -
            - .gemtest
         | 
| 166 | 
            -
            - .gitignore
         | 
| 167 | 
            -
            - .travis.yml
         | 
| 168 | 
            -
            - .yardopts
         | 
| 151 | 
            +
            - ".gemtest"
         | 
| 152 | 
            +
            - ".gitignore"
         | 
| 153 | 
            +
            - ".travis.yml"
         | 
| 154 | 
            +
            - ".yardopts"
         | 
| 169 155 | 
             
            - CONTRIBUTING.md
         | 
| 170 156 | 
             
            - Changelog.md
         | 
| 171 157 | 
             
            - Gemfile
         | 
| @@ -175,6 +161,7 @@ files: | |
| 175 161 | 
             
            - bench.rb
         | 
| 176 162 | 
             
            - friendly_id.gemspec
         | 
| 177 163 | 
             
            - gemfiles/Gemfile.rails-4.0.rb
         | 
| 164 | 
            +
            - gemfiles/Gemfile.rails-4.1.rb
         | 
| 178 165 | 
             
            - gemfiles/Gemfile.rails-stable.rb
         | 
| 179 166 | 
             
            - guide.rb
         | 
| 180 167 | 
             
            - lib/friendly_id.rb
         | 
| @@ -222,17 +209,17 @@ require_paths: | |
| 222 209 | 
             
            - lib
         | 
| 223 210 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 224 211 | 
             
              requirements:
         | 
| 225 | 
            -
              - -  | 
| 212 | 
            +
              - - ">="
         | 
| 226 213 | 
             
                - !ruby/object:Gem::Version
         | 
| 227 214 | 
             
                  version: 1.9.3
         | 
| 228 215 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 229 216 | 
             
              requirements:
         | 
| 230 | 
            -
              - -  | 
| 217 | 
            +
              - - ">="
         | 
| 231 218 | 
             
                - !ruby/object:Gem::Version
         | 
| 232 219 | 
             
                  version: '0'
         | 
| 233 220 | 
             
            requirements: []
         | 
| 234 221 | 
             
            rubyforge_project: friendly_id
         | 
| 235 | 
            -
            rubygems_version: 2.0 | 
| 222 | 
            +
            rubygems_version: 2.2.0
         | 
| 236 223 | 
             
            signing_key: 
         | 
| 237 224 | 
             
            specification_version: 4
         | 
| 238 225 | 
             
            summary: A comprehensive slugging and pretty-URL plugin.
         |