permalink 2.0.0 → 2.1.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.
- checksums.yaml +5 -5
- data/.github/FUNDING.yml +3 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +13 -0
- data/.travis.yml +2 -3
- data/Gemfile +2 -0
- data/README.md +37 -15
- data/Rakefile +6 -1
- data/lib/permalink.rb +5 -3
- data/lib/permalink/active_record.rb +33 -20
- data/lib/permalink/normalizations/contraction.rb +2 -0
- data/lib/permalink/normalizations/downcase.rb +2 -0
- data/lib/permalink/normalizations/leading_trailing_dashes.rb +2 -0
- data/lib/permalink/normalizations/multiple_dashes.rb +2 -0
- data/lib/permalink/normalizations/non_alphanumeric.rb +2 -0
- data/lib/permalink/normalizations/transliteration.rb +4 -2
- data/lib/permalink/version.rb +3 -1
- data/permalink.gemspec +10 -2
- data/test/permalink/active_record_test.rb +7 -4
- data/test/permalink/normalizations_test.rb +18 -6
- data/test/permalink/permalink_test.rb +10 -8
- data/test/support/post.rb +2 -0
- data/test/support/schema.rb +3 -1
- data/test/support/user.rb +2 -0
- data/test/test_helper.rb +5 -1
- metadata +54 -11
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: b59f20670f6bcfbd6b204ad5e23aefcce7abf477b6b574d165d87e892e9b6afc
         | 
| 4 | 
            +
              data.tar.gz: dfdee1e9df89d3d11e9d9240811c00a4307abf1a22accc6346e992b092326225
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 79d9f75edc2fd001ffe2cc4544ba5bd0fbc38a7a842641f5d656136961233aa926a72e9ad2e5d387641e354d5b4dd919f92567289d84a137644ed7edab782857
         | 
| 7 | 
            +
              data.tar.gz: '080cb2da608b09403a9e4aae8d42f1465a0cb33b3902aadf2f4747c50c72bd21bd361f91dc1abce55503df7d5488d5332099e20cc9755938ae54f8a5045cd9a3'
         | 
    
        data/.github/FUNDING.yml
    ADDED
    
    
    
        data/.gitignore
    CHANGED
    
    
    
        data/.rubocop.yml
    ADDED
    
    
    
        data/.travis.yml
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,9 +1,9 @@ | |
| 1 1 | 
             
            # Permalink
         | 
| 2 2 |  | 
| 3 | 
            -
            [](https://codeclimate.com/github/fnando/permalink)
         | 
| 4 4 | 
             
            [](https://travis-ci.org/fnando/permalink)
         | 
| 5 | 
            -
            [](https://rubygems.org/permalink)
         | 
| 6 | 
            -
            [](https://rubygems.org/permalink)
         | 
| 5 | 
            +
            [](https://rubygems.org/gems/permalink)
         | 
| 6 | 
            +
            [](https://rubygems.org/gems/permalink)
         | 
| 7 7 |  | 
| 8 8 | 
             
            ## Installation
         | 
| 9 9 |  | 
| @@ -11,7 +11,8 @@ | |
| 11 11 |  | 
| 12 12 | 
             
            ## Usage
         | 
| 13 13 |  | 
| 14 | 
            -
            Add the method call `permalink` to your model. Your model should have a | 
| 14 | 
            +
            Add the method call `permalink` to your model. Your model should have a
         | 
| 15 | 
            +
            `permalink` attribute.
         | 
| 15 16 |  | 
| 16 17 | 
             
            ```ruby
         | 
| 17 18 | 
             
            class Page < ActiveRecord::Base
         | 
| @@ -27,9 +28,12 @@ class page < ActiveRecord::Base | |
| 27 28 | 
             
            end
         | 
| 28 29 | 
             
            ```
         | 
| 29 30 |  | 
| 30 | 
            -
            If you don't want to use `permalink`, you can call | 
| 31 | 
            +
            If you don't want to use `permalink`, you can call
         | 
| 32 | 
            +
            `Permalink.generate("some text")` string method and manage the permalink process
         | 
| 33 | 
            +
            by yourself.
         | 
| 31 34 |  | 
| 32 | 
            -
            Permalinks are not unique by default. `permalink` overrides `to_param` as | 
| 35 | 
            +
            Permalinks are not unique by default. `permalink` overrides `to_param` as
         | 
| 36 | 
            +
            following:
         | 
| 33 37 |  | 
| 34 38 | 
             
            ```ruby
         | 
| 35 39 | 
             
            def to_param
         | 
| @@ -45,7 +49,9 @@ class Page < ActiveRecord::Base | |
| 45 49 | 
             
            end
         | 
| 46 50 | 
             
            ```
         | 
| 47 51 |  | 
| 48 | 
            -
            The above settings will generate something link `100-some-title-page`. By | 
| 52 | 
            +
            The above settings will generate something link `100-some-title-page`. By
         | 
| 53 | 
            +
            overriding `to_param` method you don't have to change a thing on your app
         | 
| 54 | 
            +
            routes.
         | 
| 49 55 |  | 
| 50 56 | 
             
            If you want to generate unique permalink, use the `:unique` option:
         | 
| 51 57 |  | 
| @@ -55,7 +61,8 @@ class Page < ActiveRecord::Base | |
| 55 61 | 
             
            end
         | 
| 56 62 | 
             
            ```
         | 
| 57 63 |  | 
| 58 | 
            -
            The permalink can be tied to a given scope. Let's say you want to have unique | 
| 64 | 
            +
            The permalink can be tied to a given scope. Let's say you want to have unique
         | 
| 65 | 
            +
            permalinks by user. Just set the `:scope` option.
         | 
| 59 66 |  | 
| 60 67 | 
             
            ```ruby
         | 
| 61 68 | 
             
            class Page < ActiveRecord::Base
         | 
| @@ -73,9 +80,13 @@ another_page = another_user.pages.create(title: 'Hello') | |
| 73 80 | 
             
            another_page.permalink #=> hello
         | 
| 74 81 | 
             
            ```
         | 
| 75 82 |  | 
| 76 | 
            -
            The permalink is generated using `ActiveSupport::Multibyte::Chars` class; this | 
| 83 | 
            +
            The permalink is generated using `ActiveSupport::Multibyte::Chars` class; this
         | 
| 84 | 
            +
            means that characters will properly replaced from `áéíó` to `aeio`, for
         | 
| 85 | 
            +
            instance.
         | 
| 77 86 |  | 
| 78 | 
            -
            The permalink is created when `before_validation` callback is evaluated. This | 
| 87 | 
            +
            The permalink is created when `before_validation` callback is evaluated. This
         | 
| 88 | 
            +
            plugin also tries to generate a permalink when `before_save` callback is
         | 
| 89 | 
            +
            evaluated and the instance has no permalink set.
         | 
| 79 90 |  | 
| 80 91 | 
             
            You can force the permalink generation by setting the `:force` option.
         | 
| 81 92 |  | 
| @@ -89,8 +100,19 @@ end | |
| 89 100 |  | 
| 90 101 | 
             
            Copyright (c) 2011-2015 Nando Vieira, released under the MIT license
         | 
| 91 102 |  | 
| 92 | 
            -
            Permission is hereby granted, free of charge, to any person obtaining a copy of | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 103 | 
            +
            Permission is hereby granted, free of charge, to any person obtaining a copy of
         | 
| 104 | 
            +
            this software and associated documentation files (the "Software"), to deal in
         | 
| 105 | 
            +
            the Software without restriction, including without limitation the rights to
         | 
| 106 | 
            +
            use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
         | 
| 107 | 
            +
            the Software, and to permit persons to whom the Software is furnished to do so,
         | 
| 108 | 
            +
            subject to the following conditions:
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            The above copyright notice and this permission notice shall be included in all
         | 
| 111 | 
            +
            copies or substantial portions of the Software.
         | 
| 112 | 
            +
             | 
| 113 | 
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
         | 
| 114 | 
            +
            IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
         | 
| 115 | 
            +
            FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
         | 
| 116 | 
            +
            COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
         | 
| 117 | 
            +
            IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
         | 
| 118 | 
            +
            CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -1,5 +1,8 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require "bundler/gem_tasks"
         | 
| 2 4 | 
             
            require "rake/testtask"
         | 
| 5 | 
            +
            require "rubocop/rake_task"
         | 
| 3 6 |  | 
| 4 7 | 
             
            Rake::TestTask.new(:test) do |t|
         | 
| 5 8 | 
             
              t.libs << "test"
         | 
| @@ -7,4 +10,6 @@ Rake::TestTask.new(:test) do |t| | |
| 7 10 | 
             
              t.warning = false
         | 
| 8 11 | 
             
            end
         | 
| 9 12 |  | 
| 10 | 
            -
             | 
| 13 | 
            +
            RuboCop::RakeTask.new
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            task default: %i[test rubocop]
         | 
    
        data/lib/permalink.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require "active_record"
         | 
| 2 4 | 
             
            require "permalink/active_record"
         | 
| 3 5 | 
             
            require "permalink/normalizations/contraction"
         | 
| @@ -15,12 +17,12 @@ module Permalink | |
| 15 17 | 
             
                Normalizations::NonAlphanumeric,
         | 
| 16 18 | 
             
                Normalizations::MultipleDashes,
         | 
| 17 19 | 
             
                Normalizations::LeadingTrailingDashes
         | 
| 18 | 
            -
              ]
         | 
| 20 | 
            +
              ].freeze
         | 
| 19 21 |  | 
| 20 22 | 
             
              DEFAULT_OPTIONS = {
         | 
| 21 23 | 
             
                normalizations: DEFAULT_NORMALIZATIONS,
         | 
| 22 24 | 
             
                separator: "-"
         | 
| 23 | 
            -
              }
         | 
| 25 | 
            +
              }.freeze
         | 
| 24 26 |  | 
| 25 27 | 
             
              def self.generate(input, options = DEFAULT_OPTIONS)
         | 
| 26 28 | 
             
                options = DEFAULT_OPTIONS.merge(options)
         | 
| @@ -33,4 +35,4 @@ module Permalink | |
| 33 35 | 
             
              end
         | 
| 34 36 | 
             
            end
         | 
| 35 37 |  | 
| 36 | 
            -
            ActiveRecord::Base. | 
| 38 | 
            +
            ActiveRecord::Base.include Permalink::ActiveRecord
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Permalink
         | 
| 2 4 | 
             
              module ActiveRecord
         | 
| 3 5 | 
             
                def self.included(base)
         | 
| @@ -16,14 +18,14 @@ module Permalink | |
| 16 18 | 
             
                  def permalink(from_column, options = {})
         | 
| 17 19 | 
             
                    include InstanceMethods
         | 
| 18 20 |  | 
| 19 | 
            -
                    options = options.reverse_merge( | 
| 20 | 
            -
                      to_param: [ | 
| 21 | 
            +
                    options = options.reverse_merge(
         | 
| 22 | 
            +
                      to_param: %i[id permalink],
         | 
| 21 23 | 
             
                      to: :permalink,
         | 
| 22 24 | 
             
                      unique: false,
         | 
| 23 25 | 
             
                      force: false,
         | 
| 24 26 | 
             
                      separator: "-",
         | 
| 25 27 | 
             
                      normalizations: Permalink::DEFAULT_NORMALIZATIONS
         | 
| 26 | 
            -
                     | 
| 28 | 
            +
                    )
         | 
| 27 29 |  | 
| 28 30 | 
             
                    self.permalink_options = {
         | 
| 29 31 | 
             
                      from_column_name: from_column,
         | 
| @@ -45,14 +47,12 @@ module Permalink | |
| 45 47 | 
             
                  def to_param
         | 
| 46 48 | 
             
                    to_param_option = permalink_options[:to_param]
         | 
| 47 49 |  | 
| 48 | 
            -
                    to_param_option.compact.map  | 
| 50 | 
            +
                    to_param_option.compact.map do |name|
         | 
| 49 51 | 
             
                      respond_to?(name) ? public_send(name).to_s : name.to_s
         | 
| 50 | 
            -
                     | 
| 52 | 
            +
                    end.reject(&:blank?).join(permalink_options[:separator])
         | 
| 51 53 | 
             
                  end
         | 
| 52 54 |  | 
| 53 | 
            -
                  private
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                  def next_available_permalink(permalink)
         | 
| 55 | 
            +
                  private def next_available_permalink(permalink)
         | 
| 56 56 | 
             
                    unique_permalink = permalink
         | 
| 57 57 | 
             
                    scope = build_scope_for_permalink
         | 
| 58 58 |  | 
| @@ -60,7 +60,9 @@ module Permalink | |
| 60 60 | 
             
                      suffix = 2
         | 
| 61 61 |  | 
| 62 62 | 
             
                      while scope.where(to_permalink_name => unique_permalink).first
         | 
| 63 | 
            -
                        unique_permalink = | 
| 63 | 
            +
                        unique_permalink =
         | 
| 64 | 
            +
                          [permalink, suffix].join(permalink_options[:separator])
         | 
| 65 | 
            +
             | 
| 64 66 | 
             
                        suffix += 1
         | 
| 65 67 | 
             
                      end
         | 
| 66 68 | 
             
                    end
         | 
| @@ -68,42 +70,53 @@ module Permalink | |
| 68 70 | 
             
                    unique_permalink
         | 
| 69 71 | 
             
                  end
         | 
| 70 72 |  | 
| 71 | 
            -
                  def build_scope_for_permalink
         | 
| 73 | 
            +
                  private def build_scope_for_permalink
         | 
| 72 74 | 
             
                    search_scope = permalink_options[:scope]
         | 
| 73 75 | 
             
                    scope = self.class.unscoped
         | 
| 74 | 
            -
             | 
| 76 | 
            +
             | 
| 77 | 
            +
                    if search_scope
         | 
| 78 | 
            +
                      scope = scope.where(search_scope => public_send(search_scope))
         | 
| 79 | 
            +
                    end
         | 
| 80 | 
            +
             | 
| 75 81 | 
             
                    scope
         | 
| 76 82 | 
             
                  end
         | 
| 77 83 |  | 
| 78 | 
            -
                  def from_permalink_name
         | 
| 84 | 
            +
                  private def from_permalink_name
         | 
| 79 85 | 
             
                    permalink_options[:from_column_name]
         | 
| 80 86 | 
             
                  end
         | 
| 81 87 |  | 
| 82 | 
            -
                  def to_permalink_name
         | 
| 88 | 
            +
                  private def to_permalink_name
         | 
| 83 89 | 
             
                    permalink_options[:to_column_name]
         | 
| 84 90 | 
             
                  end
         | 
| 85 91 |  | 
| 86 | 
            -
                  def from_permalink_value
         | 
| 92 | 
            +
                  private def from_permalink_value
         | 
| 87 93 | 
             
                    read_attribute(from_permalink_name)
         | 
| 88 94 | 
             
                  end
         | 
| 89 95 |  | 
| 90 | 
            -
                  def to_permalink_value
         | 
| 96 | 
            +
                  private def to_permalink_value
         | 
| 91 97 | 
             
                    read_attribute(to_permalink_name)
         | 
| 92 98 | 
             
                  end
         | 
| 93 99 |  | 
| 94 | 
            -
                  def update_permalink?
         | 
| 100 | 
            +
                  private def update_permalink?
         | 
| 95 101 | 
             
                    changes[from_permalink_name] &&
         | 
| 96 102 | 
             
                    (permalink_options[:force] || to_permalink_value.blank?)
         | 
| 97 103 | 
             
                  end
         | 
| 98 104 |  | 
| 99 | 
            -
                  def create_permalink
         | 
| 105 | 
            +
                  private def create_permalink
         | 
| 106 | 
            +
                    return unless update_permalink?
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                    permalink = Permalink.generate(
         | 
| 109 | 
            +
                      from_permalink_value.to_s,
         | 
| 110 | 
            +
                      permalink_generator_options
         | 
| 111 | 
            +
                    )
         | 
| 112 | 
            +
             | 
| 100 113 | 
             
                    write_attribute(
         | 
| 101 114 | 
             
                      to_permalink_name,
         | 
| 102 | 
            -
                      next_available_permalink( | 
| 103 | 
            -
                    ) | 
| 115 | 
            +
                      next_available_permalink(permalink)
         | 
| 116 | 
            +
                    )
         | 
| 104 117 | 
             
                  end
         | 
| 105 118 |  | 
| 106 | 
            -
                  def permalink_generator_options
         | 
| 119 | 
            +
                  private def permalink_generator_options
         | 
| 107 120 | 
             
                    {
         | 
| 108 121 | 
             
                      separator: permalink_options[:separator],
         | 
| 109 122 | 
             
                      normalizations: permalink_options[:normalizations]
         | 
| @@ -1,9 +1,11 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Permalink
         | 
| 2 4 | 
             
              module Normalizations
         | 
| 3 5 | 
             
                module Transliteration
         | 
| 4 6 | 
             
                  def self.call(input, _options = nil)
         | 
| 5 | 
            -
                     | 
| 6 | 
            -
                      . | 
| 7 | 
            +
                    input
         | 
| 8 | 
            +
                      .unicode_normalize(:nfkd)
         | 
| 7 9 | 
             
                      .gsub(/[^\x00-\x7F]/, "")
         | 
| 8 10 | 
             
                      .to_s
         | 
| 9 11 | 
             
                  end
         | 
    
        data/lib/permalink/version.rb
    CHANGED
    
    
    
        data/permalink.gemspec
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require "./lib/permalink/version"
         | 
| 2 4 |  | 
| 3 5 | 
             
            Gem::Specification.new do |s|
         | 
| @@ -10,14 +12,20 @@ Gem::Specification.new do |s| | |
| 10 12 | 
             
              s.summary     = "Generate permalink attributes on ActiveModel/ActiveRecord"
         | 
| 11 13 | 
             
              s.description = s.summary
         | 
| 12 14 | 
             
              s.license     = "MIT"
         | 
| 15 | 
            +
              s.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
         | 
| 13 16 |  | 
| 14 17 | 
             
              s.files         = `git ls-files`.split("\n")
         | 
| 15 18 | 
             
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         | 
| 16 | 
            -
              s.executables   = `git ls-files -- bin | 
| 19 | 
            +
              s.executables   = `git ls-files -- bin/*`
         | 
| 20 | 
            +
                                .split("\n")
         | 
| 21 | 
            +
                                .map {|f| File.basename(f) }
         | 
| 17 22 | 
             
              s.require_paths = ["lib"]
         | 
| 18 23 |  | 
| 19 24 | 
             
              s.add_dependency "activerecord"
         | 
| 20 | 
            -
              s.add_development_dependency "sqlite3"
         | 
| 21 25 | 
             
              s.add_development_dependency "minitest-utils"
         | 
| 22 26 | 
             
              s.add_development_dependency "rake"
         | 
| 27 | 
            +
              s.add_development_dependency "rubocop"
         | 
| 28 | 
            +
              s.add_development_dependency "rubocop-fnando"
         | 
| 29 | 
            +
              s.add_development_dependency "simplecov"
         | 
| 30 | 
            +
              s.add_development_dependency "sqlite3"
         | 
| 23 31 | 
             
            end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require "test_helper"
         | 
| 2 4 |  | 
| 3 5 | 
             
            class ActiveRecordTest < Minitest::Test
         | 
| @@ -123,7 +125,7 @@ class ActiveRecordTest < Minitest::Test | |
| 123 125 | 
             
                model.permalink :title, force: true
         | 
| 124 126 |  | 
| 125 127 | 
             
                record = model.create(title: "Some nice post")
         | 
| 126 | 
            -
                record. | 
| 128 | 
            +
                record.update title: "Awesome post"
         | 
| 127 129 |  | 
| 128 130 | 
             
                assert_equal "awesome-post", record.permalink
         | 
| 129 131 | 
             
              end
         | 
| @@ -133,7 +135,7 @@ class ActiveRecordTest < Minitest::Test | |
| 133 135 |  | 
| 134 136 | 
             
                record = model.create(title: "Some nice post")
         | 
| 135 137 |  | 
| 136 | 
            -
                record. | 
| 138 | 
            +
                record.update title: "Awesome post"
         | 
| 137 139 | 
             
                assert_equal "awesome-post", record.permalink
         | 
| 138 140 |  | 
| 139 141 | 
             
                record = model.create(title: "Awesome post")
         | 
| @@ -144,7 +146,7 @@ class ActiveRecordTest < Minitest::Test | |
| 144 146 | 
             
                model.permalink :title, force: true, unique: true
         | 
| 145 147 |  | 
| 146 148 | 
             
                record = model.create(title: "Some nice post")
         | 
| 147 | 
            -
                record. | 
| 149 | 
            +
                record.update description: "some description"
         | 
| 148 150 |  | 
| 149 151 | 
             
                assert_equal "some-nice-post", record.permalink
         | 
| 150 152 | 
             
              end
         | 
| @@ -164,7 +166,8 @@ class ActiveRecordTest < Minitest::Test | |
| 164 166 | 
             
              end
         | 
| 165 167 |  | 
| 166 168 | 
             
              test "uses custom normalization" do
         | 
| 167 | 
            -
                model.permalink :title, | 
| 169 | 
            +
                model.permalink :title,
         | 
| 170 | 
            +
                                normalizations: [->(input, _options) { input.to_s.reverse }]
         | 
| 168 171 | 
             
                record = model.create(title: "Some nice post")
         | 
| 169 172 |  | 
| 170 173 | 
             
                assert_equal "Some nice post".reverse, record.permalink
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require "test_helper"
         | 
| 2 4 |  | 
| 3 5 | 
             
            class NormalizationsTest < Minitest::Test
         | 
| @@ -7,7 +9,8 @@ class NormalizationsTest < Minitest::Test | |
| 7 9 | 
             
              end
         | 
| 8 10 |  | 
| 9 11 | 
             
              test "applies transliteration" do
         | 
| 10 | 
            -
                assert_equal "aeiou", | 
| 12 | 
            +
                assert_equal "aeiou",
         | 
| 13 | 
            +
                             Permalink::Normalizations::Transliteration.call("áéíóú")
         | 
| 11 14 | 
             
              end
         | 
| 12 15 |  | 
| 13 16 | 
             
              test "applies downcasing" do
         | 
| @@ -15,22 +18,31 @@ class NormalizationsTest < Minitest::Test | |
| 15 18 | 
             
              end
         | 
| 16 19 |  | 
| 17 20 | 
             
              test "applies lead/trailing dashes replacement" do
         | 
| 18 | 
            -
                 | 
| 21 | 
            +
                permalink = Permalink::Normalizations::LeadingTrailingDashes.call("-test-")
         | 
| 22 | 
            +
                assert_equal "test", permalink
         | 
| 19 23 | 
             
              end
         | 
| 20 24 |  | 
| 21 25 | 
             
              test "applies multiple dashes replacement" do
         | 
| 22 | 
            -
                 | 
| 26 | 
            +
                permalink =
         | 
| 27 | 
            +
                  Permalink::Normalizations::MultipleDashes.call("nice----permalink")
         | 
| 28 | 
            +
                assert_equal "nice-permalink", permalink
         | 
| 23 29 | 
             
              end
         | 
| 24 30 |  | 
| 25 31 | 
             
              test "applies multiple dashes replacement with custom separator" do
         | 
| 26 | 
            -
                 | 
| 32 | 
            +
                permalink = Permalink::Normalizations::MultipleDashes
         | 
| 33 | 
            +
                            .call("nice----permalink", separator: "_")
         | 
| 34 | 
            +
                assert_equal "nice_permalink", permalink
         | 
| 27 35 | 
             
              end
         | 
| 28 36 |  | 
| 29 37 | 
             
              test "applies non-alphanumeric replacement" do
         | 
| 30 | 
            -
                 | 
| 38 | 
            +
                permalink =
         | 
| 39 | 
            +
                  Permalink::Normalizations::NonAlphanumeric.call("nice-permalink!")
         | 
| 40 | 
            +
                assert_equal "nice-permalink-", permalink
         | 
| 31 41 | 
             
              end
         | 
| 32 42 |  | 
| 33 43 | 
             
              test "applies non-alphanumeric replacement with custom separator" do
         | 
| 34 | 
            -
                 | 
| 44 | 
            +
                permalink = Permalink::Normalizations::NonAlphanumeric
         | 
| 45 | 
            +
                            .call("nice-permalink!", separator: "_")
         | 
| 46 | 
            +
                assert_equal "nice_permalink_", permalink
         | 
| 35 47 | 
             
              end
         | 
| 36 48 | 
             
            end
         | 
| @@ -1,15 +1,17 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require "test_helper"
         | 
| 2 4 |  | 
| 3 5 | 
             
            class PermalinkTest < Minitest::Test
         | 
| 4 6 | 
             
              {
         | 
| 5 | 
            -
                 | 
| 6 | 
            -
                '////// meph1sto r0x ! \\\\\\' =>  | 
| 7 | 
            -
                 | 
| 8 | 
            -
                 | 
| 9 | 
            -
                'some-)()()-ExtRa!/// .data==?> | 
| 10 | 
            -
                 | 
| 11 | 
            -
                "Don't Repeat Yourself (DRY)" =>  | 
| 12 | 
            -
                "Text\nwith\nline\n\n\tbreaks" =>  | 
| 7 | 
            +
                "This IS a Tripped out title!!.!1  (well/ not really)" => "this-is-a-tripped-out-title-1-well-not-really", # rubocop:disable Layout/LineLength
         | 
| 8 | 
            +
                '////// meph1sto r0x ! \\\\\\' => "meph1sto-r0x",
         | 
| 9 | 
            +
                "āčēģīķļņū" => "acegiklnu",
         | 
| 10 | 
            +
                "中文測試 chinese text" => "chinese-text",
         | 
| 11 | 
            +
                'some-)()()-ExtRa!/// .data==?>   to \/\/test' => "some-extra-data-to-test",
         | 
| 12 | 
            +
                "http://simplesideias.com.br/tags/" => "http-simplesideias-com-br-tags",
         | 
| 13 | 
            +
                "Don't Repeat Yourself (DRY)" => "dont-repeat-yourself-dry",
         | 
| 14 | 
            +
                "Text\nwith\nline\n\n\tbreaks" => "text-with-line-breaks",
         | 
| 13 15 | 
             
                "can't do it" => "cant-do-it",
         | 
| 14 16 | 
             
                "i'm a dog" => "im-a-dog"
         | 
| 15 17 | 
             
              }.each do |from, to|
         | 
    
        data/test/support/post.rb
    CHANGED
    
    
    
        data/test/support/schema.rb
    CHANGED
    
    
    
        data/test/support/user.rb
    CHANGED
    
    
    
        data/test/test_helper.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: permalink
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2. | 
| 4 | 
            +
              version: 2.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Nando Vieira
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2020-09-25 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activerecord
         | 
| @@ -25,7 +25,7 @@ dependencies: | |
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '0'
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            -
              name:  | 
| 28 | 
            +
              name: minitest-utils
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - ">="
         | 
| @@ -39,7 +39,7 @@ dependencies: | |
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 40 | 
             
                    version: '0'
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            -
              name:  | 
| 42 | 
            +
              name: rake
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 44 | 
             
                requirements:
         | 
| 45 45 | 
             
                - - ">="
         | 
| @@ -53,7 +53,49 @@ dependencies: | |
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 54 | 
             
                    version: '0'
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            -
              name:  | 
| 56 | 
            +
              name: rubocop
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - ">="
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '0'
         | 
| 62 | 
            +
              type: :development
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - ">="
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '0'
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: rubocop-fnando
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - ">="
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: '0'
         | 
| 76 | 
            +
              type: :development
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - ">="
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: '0'
         | 
| 83 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            +
              name: simplecov
         | 
| 85 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 | 
            +
                requirements:
         | 
| 87 | 
            +
                - - ">="
         | 
| 88 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            +
                    version: '0'
         | 
| 90 | 
            +
              type: :development
         | 
| 91 | 
            +
              prerelease: false
         | 
| 92 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 | 
            +
                requirements:
         | 
| 94 | 
            +
                - - ">="
         | 
| 95 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            +
                    version: '0'
         | 
| 97 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 98 | 
            +
              name: sqlite3
         | 
| 57 99 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 100 | 
             
                requirements:
         | 
| 59 101 | 
             
                - - ">="
         | 
| @@ -73,7 +115,9 @@ executables: [] | |
| 73 115 | 
             
            extensions: []
         | 
| 74 116 | 
             
            extra_rdoc_files: []
         | 
| 75 117 | 
             
            files:
         | 
| 118 | 
            +
            - ".github/FUNDING.yml"
         | 
| 76 119 | 
             
            - ".gitignore"
         | 
| 120 | 
            +
            - ".rubocop.yml"
         | 
| 77 121 | 
             
            - ".travis.yml"
         | 
| 78 122 | 
             
            - Gemfile
         | 
| 79 123 | 
             
            - README.md
         | 
| @@ -99,7 +143,7 @@ homepage: http://rubygems.org/gems/permalink | |
| 99 143 | 
             
            licenses:
         | 
| 100 144 | 
             
            - MIT
         | 
| 101 145 | 
             
            metadata: {}
         | 
| 102 | 
            -
            post_install_message: | 
| 146 | 
            +
            post_install_message:
         | 
| 103 147 | 
             
            rdoc_options: []
         | 
| 104 148 | 
             
            require_paths:
         | 
| 105 149 | 
             
            - lib
         | 
| @@ -107,16 +151,15 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 107 151 | 
             
              requirements:
         | 
| 108 152 | 
             
              - - ">="
         | 
| 109 153 | 
             
                - !ruby/object:Gem::Version
         | 
| 110 | 
            -
                  version:  | 
| 154 | 
            +
                  version: 2.5.0
         | 
| 111 155 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 112 156 | 
             
              requirements:
         | 
| 113 157 | 
             
              - - ">="
         | 
| 114 158 | 
             
                - !ruby/object:Gem::Version
         | 
| 115 159 | 
             
                  version: '0'
         | 
| 116 160 | 
             
            requirements: []
         | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 119 | 
            -
            signing_key: 
         | 
| 161 | 
            +
            rubygems_version: 3.1.2
         | 
| 162 | 
            +
            signing_key:
         | 
| 120 163 | 
             
            specification_version: 4
         | 
| 121 164 | 
             
            summary: Generate permalink attributes on ActiveModel/ActiveRecord
         | 
| 122 165 | 
             
            test_files:
         |