module Sluggo

Sluggo generates strings that look like tokens

Constants

VERSION

Public Class Methods

rare(options = {}, &is_unique) click to toggle source

Repeatedly attempt to generate a unique token, where uniqueness is determined by a provided code block. This may not actually end up generating a unique token, but possibly just a rare token. @param options [Hash] @option options [Integer] :length (6) the length of the token to return @option options [Integer] :chances (100) the number of tries before

giving up on uniqueness

@param is_unique [Proc] a proc that returns true if the supplied

|slug| is unique

@raise [ArgumentError] if no block is given @raise [ArgumentError] if chances are provided, but is < 1 @raise [ArgumentError] if length is provided, but is < 1

# File lib/sluggo.rb, line 19
def self.rare(options = {}, &is_unique)
  length, chances, is_unique = sanitize_options(
    options.merge({:is_unique => is_unique})
  )

  while (chances -= 1) >= 0 do
    current_slug = Random.base62(length)
    break if is_unique.call(current_slug)
  end
  current_slug
end

Private Class Methods

rare_error_message(option, value = nil) click to toggle source
# File lib/sluggo.rb, line 47
def rare_error_message(option, value = nil)
  case option
  when :is_unique
    'You must provide a block to determine uniqueness'
  when :chances
    "You must allow at least one chance (chances: #{value})"
  end
end
sanitize_options(options = {}) click to toggle source
# File lib/sluggo.rb, line 33
def sanitize_options(options = {})
  if options[:is_unique].nil?
    raise ArgumentError.new(rare_error_message(:is_unique))
  end

  options[:chances].tap do |chances|
    unless chances.nil?
      raise ArgumentError.new(rare_error_message(:chances, chances)) if chances < 1
    end
  end

  [options[:length] || 6, options[:chances] || 100, options[:is_unique]]
end