module TokenAttr::Concern::ClassMethods

Public Instance Methods

token_attr(attr_name, options = {}) click to toggle source
# File lib/token_attr/concern.rb, line 20
def token_attr(attr_name, options = {})
  token_definitions << TokenDefinition.new(attr_name, options[:scope])

  define_method "should_generate_new_#{attr_name}?" do
    send(attr_name).blank?
  end

  define_method "generate_new_#{attr_name}" do
    token_length = options.fetch(:length, DEFAULT_TOKEN_LENGTH)

    if alphabet = options[:alphabet]
      alphabet_array = case alphabet
      when :alphanumeric
        ALPHANUMERIC_ALPHABET
      when :alphabetic
        ALPHABETIC_ALPHABET
      when :numeric
        NUMERIC_ALPHABET
      else
        alphabet.split('')
      end
      (0...token_length).map{ alphabet_array.sample }.join
    else
      hex_length = (token_length / 2.0).ceil # 2 characters per length
      SecureRandom.hex(hex_length).slice(0...token_length)
    end
  end
end
token_definitions() click to toggle source
# File lib/token_attr/concern.rb, line 49
def token_definitions
  @token_definitions ||= []
end