Sha256: 8c6b4e49140ddc42574ec07c7fe8eb2aeb49646bbb8078b8b2e9a65d30f82ee3

Contents?: true

Size: 1.86 KB

Versions: 1

Compression:

Stored size: 1.86 KB

Contents

require "acts_as_digested_on/version"
require 'digest/sha1'

module ActsAsDigestedOn
  def self.included(model)
    model.extend ClassMethods
  end

  module Validations
    def self.included(model)
      model.class_eval do
        options = acts_as_digested_on_vars[:validates_uniqueness_of_options]
        validates_uniqueness_of acts_as_digested_on_vars[:digest_column], options
      end
    end
  end

  module Callbacks
    def self.included(model)
      model.class_eval do
        before_validation :set_digest
      end
    end
  end

  module InstanceMethods
    def generate_digest
      digest = Digest::SHA1.hexdigest(original_string_for_digest)
      digest.encode! 'utf-8' if RUBY_VERSION.to_f >= 1.9
      digest
    end

    private
    def original_string_for_digest
      separator = '--'
      attr_names = self.class.acts_as_digested_on_vars[:attr_names]

      str = separator.dup
      str << attr_names.map { |v| send(v).to_s }.join(separator)
      str << separator
      str
    end

    def set_digest
      digest_column = self.class.acts_as_digested_on_vars[:digest_column]
      self[digest_column] = generate_digest
    end
  end

  module ClassMethods
    def acts_as_digested_on(attr_names, options = {})
      options = options.symbolize_keys

      attr_names = Array(attr_names).flatten
      digest_column = options.delete(:digest_column) || 'digest'
      unique = options.key?(:unique) ? options.delete(:unique) : true

      class_attribute :acts_as_digested_on_vars
      self.acts_as_digested_on_vars = {
        :attr_names => attr_names,
        :digest_column => digest_column,
        :unique => unique,
        :validates_uniqueness_of_options => options
      }

      include InstanceMethods
      include Callbacks
      include Validations if self.acts_as_digested_on_vars[:unique]
    end
  end
end

ActiveRecord::Base.send :include, ActsAsDigestedOn

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
acts_as_digested_on-0.0.4 lib/acts_as_digested_on.rb