lib/token_attr.rb in token_attr-0.1.0 vs lib/token_attr.rb in token_attr-0.2.0

- old
+ new

@@ -1,88 +1,3 @@ require 'token_attr/version' -require 'active_record' -require 'active_support/concern' - -module TokenAttr - extend ActiveSupport::Concern - - DEFAULT_TOKEN_LENGTH = 8.freeze - ALPHABETIC_ALPHABET = [('a'..'z'),('A'..'Z')].map(&:to_a).flatten.freeze - NUMERIC_ALPHABET = [(0..9)].map(&:to_a).flatten.freeze - ALPHANUMERIC_ALPHABET = [ALPHABETIC_ALPHABET, NUMERIC_ALPHABET].flatten.freeze - - class TooManyAttemptsError < StandardError - attr_reader :attribute, :token - - def initialize(attr_name, token, message = nil) - @attribute = attr_name - @token = token - message ||= "Can't generate unique token for \"#{attr_name}\". Last attempt with \"#{token}\"." - super(message) - end - end - - included do - before_validation :generate_tokens - end - - module ClassMethods - def token_attr(attr_name, options = {}) - token_attributes << attr_name - - define_method "should_generate_new_#{attr_name}_token?" do - send(attr_name).blank? - end - - define_method "generate_new_#{attr_name}_token" 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 - - def token_attributes - @token_attributes ||= [] - end - end - - def generate_tokens - self.class.token_attributes.each do |attr_name| - if send("should_generate_new_#{attr_name}_token?") - new_token = nil - try_count = 0 - begin - raise TooManyAttemptsError.new(attr_name, new_token) if try_count == 5 - new_token = send("generate_new_#{attr_name}_token") - try_count += 1 - end until token_is_unique?(attr_name, new_token) - - send "#{attr_name}=", new_token - end - end - end - - def token_is_unique?(attr_name, token) - scope = self.class.where(attr_name => token) - scope = scope.where(id != self.id) if self.persisted? - !scope.exists? - end - -end - -# Uncomment to auto-extend ActiveRecord, probably not a good idea -# ActiveRecord::Base.send(:extend, TokenAttr) +require 'token_attr/concern' +require 'token_attr/errors'