class Merit::Judge

Public Class Methods

new(rule, options = {}) click to toggle source
# File lib/merit/judge.rb, line 7
def initialize(rule, options = {})
  @rule = rule
  @action = options[:action]
  Merit.observers.each do |class_name|
    add_observer class_name.constantize.new
  end
end

Public Instance Methods

apply_badges() click to toggle source

Grant badge if rule applies. If it doesn't, and the badge is temporary, then remove it.

# File lib/merit/judge.rb, line 17
def apply_badges
  if rule_applies?
    grant_badges
  else
    remove_badges if @rule.temporary
  end
end
apply_points() click to toggle source
# File lib/merit/judge.rb, line 25
def apply_points
  return unless rule_applies?
  sashes.each do |sash|
    point = sash.add_points points, category: category
    notify_observers(
      description: I18n.t("merit.granted_points", points: points),
      merit_object: point,
      sash_id: point.sash_id
    )
  end
end

Private Instance Methods

badge() click to toggle source
# File lib/merit/judge.rb, line 90
def badge
  @rule.badge
end
category() click to toggle source
# File lib/merit/judge.rb, line 82
def category
  @rule.category
end
grant_badges() click to toggle source
# File lib/merit/judge.rb, line 39
def grant_badges
  sashes.each do |sash|
    next unless new_or_multiple?(sash)
    badge_sash = sash.add_badge badge.id
    notify_observers(
      description: I18n.t("merit.granted_badge", badge_name: badge.name),
      merit_object: badge_sash,
      sash_id: badge_sash.sash_id
    )
  end
end
new_or_multiple?(sash) click to toggle source
# File lib/merit/judge.rb, line 62
def new_or_multiple?(sash)
  !sash.badge_ids.include?(badge.id) || @rule.multiple
end
notify_observers(changed_data = {}) click to toggle source
Calls superclass method
# File lib/merit/judge.rb, line 94
def notify_observers(changed_data = {})
  changed
  hash = {
    granted_at: @action.created_at,
    merit_action_id: @action.id
  }.merge(changed_data)
  super(hash)
end
points() click to toggle source
# File lib/merit/judge.rb, line 74
def points
  if @rule.score.respond_to?(:call)
    @rule.score.call(rule_object)
  else
    @rule.score
  end
end
remove_badges() click to toggle source
# File lib/merit/judge.rb, line 51
def remove_badges
  sashes.each do |sash|
    if sash.rm_badge badge.id
      notify_observers(
        description: I18n.t("merit.removed_badge", badge_name: badge.name),
        sash_id: sash.id
      )
    end
  end
end
rule_applies?() click to toggle source
# File lib/merit/judge.rb, line 70
def rule_applies?
  @rule.applies? rule_object
end
rule_object() click to toggle source
# File lib/merit/judge.rb, line 66
def rule_object
  BaseTargetFinder.find(@rule, @action)
end
sashes() click to toggle source
# File lib/merit/judge.rb, line 86
def sashes
  @sashes ||= SashFinder.find @rule, @action
end