class SlugConverter

Constants

VERSION

Public Class Methods

new(number_or_slug) click to toggle source
# File lib/slug_converter.rb, line 13
def initialize(number_or_slug)
   @alphabet = SlugConverter.configuration.alphabet.split(//)
  if number_or_slug.to_i != 0
    @number = number_or_slug.to_i
  elsif validate_string(number_or_slug)
    @slug = number_or_slug.downcase
  else
    raise ArgumentError, 'Argument must be integer value or non-empty string consisting of predefined letters'
  end
end

Public Instance Methods

number() click to toggle source
# File lib/slug_converter.rb, line 24
def number
  if @number.nil?
    @number = bijective_decode
  else
    @number
  end
end
number=(new_number) click to toggle source
# File lib/slug_converter.rb, line 32
def number=(new_number)
  @number = new_number
  @slug = bijective_encode
  @number
end
slug() click to toggle source
# File lib/slug_converter.rb, line 38
def slug
  if @slug.nil?
    @slug = bijective_encode
  else
    @slug
  end
end
slug=(new_slug) click to toggle source
# File lib/slug_converter.rb, line 46
def slug=(new_slug)
  @slug = new_slug
  @number = bijective_decode
  @slug
end

Private Instance Methods

bijective_decode() click to toggle source
# File lib/slug_converter.rb, line 66
def bijective_decode
  i = 0
  base = @alphabet.length
  @slug.each_char { |c| i = i * base + @alphabet.index(c) }
  i
end
bijective_encode() click to toggle source
# File lib/slug_converter.rb, line 54
def bijective_encode
  id = @number
  return @alphabet[0] if id == 0
  s = ''
  base = @alphabet.length
  while id > 0
    s << @alphabet[id.modulo(base)]
    id /= base
  end
  s.reverse
end
validate_string(slug) click to toggle source
# File lib/slug_converter.rb, line 73
def validate_string(slug)
  unless slug.nil?
    alphabet = Set.new @alphabet
    slug_letters = Set.new slug.downcase().split(//)
    slug != "" && (slug_letters.subset? alphabet)
  end
end