Sha256: f3756718d103c2681c3405811564431360f72cbdb4c027364a775c9cc3d022c4

Contents?: true

Size: 1.63 KB

Versions: 6

Compression:

Stored size: 1.63 KB

Contents

require 'securerandom'

module FriendlyId

  # This class provides the slug candidate functionality.
  # @see FriendlyId::Slugged
  class Candidates

    include Enumerable

    def initialize(object, *array)
      @object = object
      @raw_candidates = to_candidate_array(object, array.flatten(1))
    end

    def each(*args, &block)
      return candidates unless block_given?
      candidates.each{ |candidate| yield candidate }
    end

    private

    def candidates
      @candidates ||= begin
        candidates = normalize(@raw_candidates)
        filter(candidates)
      end
    end

    def normalize(candidates)
      candidates.map do |candidate|
        @object.normalize_friendly_id(candidate.map(&:call).join(' '))
      end.select {|x| wanted?(x)}
    end

    def filter(candidates)
      unless candidates.all? {|x| reserved?(x)}
        candidates.reject! {|x| reserved?(x)}
      end
      candidates
    end

    def to_candidate_array(object, array)
      array.map do |candidate|
        case candidate
        when String
          [->{candidate}]
        when Array
          to_candidate_array(object, candidate).flatten
        when Symbol
          [object.method(candidate)]
        else
          if candidate.respond_to?(:call)
            [candidate]
          else
            [->{candidate.to_s}]
          end
        end
      end
    end

    def wanted?(slug)
      slug.present?
    end

    def reserved?(slug)
      config = @object.friendly_id_config
      return false unless config.uses? ::FriendlyId::Reserved
      return false unless config.reserved_words
      config.reserved_words.include?(slug)
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
friendly_id-5.4.2 lib/friendly_id/candidates.rb
friendly_id-5.4.1 lib/friendly_id/candidates.rb
friendly_id-5.4.0 lib/friendly_id/candidates.rb
friendly_id-5.3.0 lib/friendly_id/candidates.rb
friendly_id-5.2.5 lib/friendly_id/candidates.rb
friendly_id-5.2.4 lib/friendly_id/candidates.rb