simple_slug 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/simple_slug/model_addition.rb +52 -18
- data/lib/simple_slug/version.rb +1 -1
- data/lib/simple_slug.rb +4 -0
- data/spec/simple_slug/model_addition_spec.rb +35 -6
- data/spec/spec_helper.rb +1 -0
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 1e8cbeedf05abbf945614e72846da70ca8e21379
         | 
| 4 | 
            +
              data.tar.gz: 550eada3c913277bbe43a57d64a22d1215d3a483
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: eab35d261a855fcfb5a95dd626a8faa3447dff6e65fd8f7dace62dbb3e0e16a6f3ed75b14b625bfdd256412ab3bc9a4708b00461c57c9f1401ff3394d9cc0a9b
         | 
| 7 | 
            +
              data.tar.gz: 973807508c775c94a059b437a7fc8afee529a2963113d3b65ff4fd561bf2feb58ba919be92646137e9b32dfea809bf91cf683ac9f6d611b6af53f956f0a01fc1
         | 
| @@ -56,15 +56,43 @@ module SimpleSlug | |
| 56 56 | 
             
                  end
         | 
| 57 57 |  | 
| 58 58 | 
             
                  def should_generate_new_slug?
         | 
| 59 | 
            -
                     | 
| 59 | 
            +
                    return true if simple_slug_options[:history]
         | 
| 60 | 
            +
                    return simple_slug_get.blank? unless simple_slug_options[:locales]
         | 
| 61 | 
            +
                    simple_slug_options[:locales].any? { |locale| simple_slug_get(locale).blank? }
         | 
| 60 62 | 
             
                  end
         | 
| 61 63 |  | 
| 62 64 | 
             
                  def simple_slug_generate(force=false)
         | 
| 65 | 
            +
                    (simple_slug_options[:locales] || [nil]).each do |locale|
         | 
| 66 | 
            +
                      simple_slug_generate_for_locale(locale, force)
         | 
| 67 | 
            +
                    end
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  def simple_slug_generate_for_locale(locale=nil, force=false)
         | 
| 71 | 
            +
                    simple_slug_with_locale(locale) do
         | 
| 72 | 
            +
                      simple_slug = simple_slug_normalize(simple_slug_base)
         | 
| 73 | 
            +
                      simple_slug = simple_slug.first(simple_slug_options[:max_length]) if simple_slug_options[:max_length]
         | 
| 74 | 
            +
                      return if !force && simple_slug == simple_slug_get(locale).to_s.sub(/--\d+\z/, '')
         | 
| 75 | 
            +
                      resolved_simple_slug = simple_slug_resolve(simple_slug, locale)
         | 
| 76 | 
            +
                      simple_slug_set(resolved_simple_slug, locale)
         | 
| 77 | 
            +
                    end
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  def simple_slug_with_locale(locale)
         | 
| 81 | 
            +
                    if defined? Globalize
         | 
| 82 | 
            +
                      Globalize.with_locale(locale) do
         | 
| 83 | 
            +
                        I18n.with_locale(locale) { yield }
         | 
| 84 | 
            +
                      end
         | 
| 85 | 
            +
                    else
         | 
| 86 | 
            +
                      I18n.with_locale(locale) { yield }
         | 
| 87 | 
            +
                    end
         | 
| 88 | 
            +
                  end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                  def simple_slug_generate_(force=false, locale=nil)
         | 
| 63 91 | 
             
                    simple_slug = simple_slug_normalize(simple_slug_base)
         | 
| 64 92 | 
             
                    simple_slug = simple_slug.first(simple_slug_options[:max_length]) if simple_slug_options[:max_length]
         | 
| 65 | 
            -
                    return true if !force && simple_slug ==  | 
| 66 | 
            -
                    resolved_simple_slug = simple_slug_resolve(simple_slug)
         | 
| 67 | 
            -
                     | 
| 93 | 
            +
                    return true if !force && simple_slug == simple_slug_get(locale).to_s.sub(/--\d+\z/, '')
         | 
| 94 | 
            +
                    resolved_simple_slug = simple_slug_resolve(simple_slug, locale)
         | 
| 95 | 
            +
                    simple_slug_set(resolved_simple_slug, locale)
         | 
| 68 96 | 
             
                  end
         | 
| 69 97 |  | 
| 70 98 | 
             
                  def simple_slug_base
         | 
| @@ -72,15 +100,17 @@ module SimpleSlug | |
| 72 100 | 
             
                  end
         | 
| 73 101 |  | 
| 74 102 | 
             
                  def simple_slug_normalize(base)
         | 
| 75 | 
            -
                     | 
| 103 | 
            +
                    base = SimpleSlug.normalize_cyrillic(base)
         | 
| 104 | 
            +
                    parameterize_args = ActiveSupport::VERSION::MAJOR > 4 ? {separator: '-'} : '-'
         | 
| 105 | 
            +
                    normalized = I18n.transliterate(base).parameterize(parameterize_args).downcase
         | 
| 76 106 | 
             
                    normalized.to_s =~ SimpleSlug::STARTS_WITH_NUMBER_REGEXP ? "_#{normalized}" : normalized
         | 
| 77 107 | 
             
                  end
         | 
| 78 108 |  | 
| 79 | 
            -
                  def simple_slug_resolve(slug_value)
         | 
| 80 | 
            -
                    if simple_slug_exists?(slug_value)
         | 
| 109 | 
            +
                  def simple_slug_resolve(slug_value, locale=nil)
         | 
| 110 | 
            +
                    if simple_slug_exists?(slug_value, locale)
         | 
| 81 111 | 
             
                      loop do
         | 
| 82 112 | 
             
                        slug_value_with_suffix = simple_slug_next(slug_value)
         | 
| 83 | 
            -
                        break slug_value_with_suffix unless simple_slug_exists?(slug_value_with_suffix)
         | 
| 113 | 
            +
                        break slug_value_with_suffix unless simple_slug_exists?(slug_value_with_suffix, locale)
         | 
| 84 114 | 
             
                      end
         | 
| 85 115 | 
             
                    else
         | 
| 86 116 | 
             
                      slug_value
         | 
| @@ -91,12 +121,12 @@ module SimpleSlug | |
| 91 121 | 
             
                    "#{slug_value}--#{rand(99999)}"
         | 
| 92 122 | 
             
                  end
         | 
| 93 123 |  | 
| 94 | 
            -
                  def simple_slug_exists?(slug_value)
         | 
| 95 | 
            -
                    simple_slug_base_exists?(slug_value) || simple_slug_history_exists?(slug_value)
         | 
| 124 | 
            +
                  def simple_slug_exists?(slug_value, locale=nil)
         | 
| 125 | 
            +
                    simple_slug_base_exists?(slug_value, locale) || simple_slug_history_exists?(slug_value)
         | 
| 96 126 | 
             
                  end
         | 
| 97 127 |  | 
| 98 | 
            -
                  def simple_slug_base_exists?(slug_value)
         | 
| 99 | 
            -
                    base_scope = self.class.unscoped.where( | 
| 128 | 
            +
                  def simple_slug_base_exists?(slug_value, locale=nil)
         | 
| 129 | 
            +
                    base_scope = self.class.unscoped.where(simple_slug_column(locale) => slug_value)
         | 
| 100 130 | 
             
                    base_scope = base_scope.where('id != ?', id) if persisted?
         | 
| 101 131 | 
             
                    base_scope.exists?
         | 
| 102 132 | 
             
                  end
         | 
| @@ -108,16 +138,20 @@ module SimpleSlug | |
| 108 138 | 
             
                    base_scope.exists?
         | 
| 109 139 | 
             
                  end
         | 
| 110 140 |  | 
| 111 | 
            -
                  def simple_slug_set(value)
         | 
| 112 | 
            -
                    send "#{ | 
| 141 | 
            +
                  def simple_slug_set(value, locale=nil)
         | 
| 142 | 
            +
                    send "#{simple_slug_column(locale)}=", value
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  def simple_slug_get(locale=nil)
         | 
| 146 | 
            +
                    send simple_slug_column(locale)
         | 
| 113 147 | 
             
                  end
         | 
| 114 148 |  | 
| 115 | 
            -
                  def  | 
| 116 | 
            -
                    send | 
| 149 | 
            +
                  def simple_slug_stored_slug(locale=nil)
         | 
| 150 | 
            +
                    send("#{simple_slug_column(locale)}_was")
         | 
| 117 151 | 
             
                  end
         | 
| 118 152 |  | 
| 119 | 
            -
                  def  | 
| 120 | 
            -
                     | 
| 153 | 
            +
                  def simple_slug_column(locale=nil)
         | 
| 154 | 
            +
                    [simple_slug_options[:slug_column], locale].compact.join('_')
         | 
| 121 155 | 
             
                  end
         | 
| 122 156 | 
             
                end
         | 
| 123 157 |  | 
    
        data/lib/simple_slug/version.rb
    CHANGED
    
    
    
        data/lib/simple_slug.rb
    CHANGED
    
    
| @@ -12,6 +12,17 @@ class SlugGenerationRspecModelWithoutCallback < RspecActiveModelBase | |
| 12 12 | 
             
              simple_slug :name, callback_type: nil
         | 
| 13 13 | 
             
            end
         | 
| 14 14 |  | 
| 15 | 
            +
            class SlugGenerationRspecModelLocalized < RspecActiveModelBase
         | 
| 16 | 
            +
              attr_accessor :slug_en, :name_en
         | 
| 17 | 
            +
              alias_method :slug_en_was, :slug_en
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              simple_slug :name, locales: [nil, :en]
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def name
         | 
| 22 | 
            +
                I18n.locale == :en ? name_en : @name
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| 25 | 
            +
             | 
| 15 26 | 
             
            describe SimpleSlug::ModelAddition do
         | 
| 16 27 | 
             
              describe 'slug generation' do
         | 
| 17 28 | 
             
                before do
         | 
| @@ -39,15 +50,15 @@ describe SimpleSlug::ModelAddition do | |
| 39 50 | 
             
              describe 'resolve conflicts' do
         | 
| 40 51 | 
             
                it 'duplicate slug' do
         | 
| 41 52 | 
             
                  record = SlugGenerationRspecModel.new(name: 'Hi')
         | 
| 42 | 
            -
                  expect(record).to receive(:simple_slug_exists?).once.ordered.with('hi').and_return(true)
         | 
| 43 | 
            -
                  expect(record).to receive(:simple_slug_exists?).once.ordered.with(/hi--\d | 
| 53 | 
            +
                  expect(record).to receive(:simple_slug_exists?).once.ordered.with('hi', nil).and_return(true)
         | 
| 54 | 
            +
                  expect(record).to receive(:simple_slug_exists?).once.ordered.with(/hi--\d+/, nil).and_return(false)
         | 
| 44 55 | 
             
                  record.save
         | 
| 45 56 | 
             
                  expect(record.slug).to start_with('hi--')
         | 
| 46 57 | 
             
                end
         | 
| 47 58 |  | 
| 48 59 | 
             
                it 'numeric slug' do
         | 
| 49 60 | 
             
                  record = SlugGenerationRspecModel.new(name: '123')
         | 
| 50 | 
            -
                  expect(record).to receive(:simple_slug_exists?).with('_123').and_return(false)
         | 
| 61 | 
            +
                  expect(record).to receive(:simple_slug_exists?).with('_123', nil).and_return(false)
         | 
| 51 62 | 
             
                  record.save
         | 
| 52 63 | 
             
                  expect(record.slug).to eq '_123'
         | 
| 53 64 | 
             
                end
         | 
| @@ -94,17 +105,23 @@ describe SimpleSlug::ModelAddition do | |
| 94 105 | 
             
                end
         | 
| 95 106 |  | 
| 96 107 | 
             
                it 'cuts slug to max length' do
         | 
| 97 | 
            -
                   | 
| 108 | 
            +
                  record = SlugGenerationRspecModel.new(name: 'Hello' * 100)
         | 
| 109 | 
            +
                  record.simple_slug_generate
         | 
| 110 | 
            +
                  expect(record.slug.length).to eq 240
         | 
| 98 111 | 
             
                end
         | 
| 99 112 |  | 
| 100 113 | 
             
                it 'use max length from per model options' do
         | 
| 101 114 | 
             
                  SlugGenerationRspecModel.simple_slug_options[:max_length] = 100
         | 
| 102 | 
            -
                   | 
| 115 | 
            +
                  record = SlugGenerationRspecModel.new(name: 'Hello' * 100)
         | 
| 116 | 
            +
                  record.simple_slug_generate
         | 
| 117 | 
            +
                  expect(record.slug.length).to eq 100
         | 
| 103 118 | 
             
                end
         | 
| 104 119 |  | 
| 105 120 | 
             
                it 'omit max length' do
         | 
| 106 121 | 
             
                  SimpleSlug.max_length = nil
         | 
| 107 | 
            -
                   | 
| 122 | 
            +
                  record = SlugGenerationRspecModel.new(name: 'Hello' * 100)
         | 
| 123 | 
            +
                  record.simple_slug_generate
         | 
| 124 | 
            +
                  expect(record.slug.length).to eq 500
         | 
| 108 125 | 
             
                end
         | 
| 109 126 | 
             
              end
         | 
| 110 127 |  | 
| @@ -119,4 +136,16 @@ describe SimpleSlug::ModelAddition do | |
| 119 136 | 
             
                  expect(SlugGenerationRspecModelWithoutCallback.new).not_to receive(:should_generate_new_slug?)
         | 
| 120 137 | 
             
                end
         | 
| 121 138 | 
             
              end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
              describe 'localized' do
         | 
| 141 | 
            +
                before do
         | 
| 142 | 
            +
                  allow_any_instance_of(SlugGenerationRspecModelLocalized).to receive(:simple_slug_exists?).and_return(false)
         | 
| 143 | 
            +
                end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                it 'generate slug for locales' do
         | 
| 146 | 
            +
                  record = SlugGenerationRspecModelLocalized.create(name: 'Hello', name_en: 'Hello en')
         | 
| 147 | 
            +
                  expect(record.slug).to eq 'hello'
         | 
| 148 | 
            +
                  expect(record.slug_en).to eq 'hello-en'
         | 
| 149 | 
            +
                end
         | 
| 150 | 
            +
              end
         | 
| 122 151 | 
             
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: simple_slug
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Alex Leschenko
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016- | 
| 11 | 
            +
            date: 2016-08-26 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activerecord
         |