Project

General

Profile

Download (1.35 KB) Statistics
| Branch: | Tag: | Revision:
module ReportCommon
METRIC = %w[applied restarted failed failed_restarts skipped pending]
BIT_NUM = 6
MAX = (1 << BIT_NUM) -1 # maximum value per metric
LOG_LEVELS = %w[debug info notice warning err alert emerg crit]

extend ActiveSupport::Concern

included do
# search for a metric - e.g.:
# Report.with("failed") --> all reports which have a failed counter > 0
# Report.with("failed",20) --> all reports which have a failed counter > 20
scope :with, ->(*arg) { { :conditions => "(#{report_status} >> #{BIT_NUM*METRIC.index(arg[0])} & #{MAX}) > #{arg[1] || 0}"} }
end

# generate dynamically methods for all metrics
# e.g. Report.last.applied
METRIC.each do |method|
define_method method do
status method
end
end

# returns true if total error metrics are > 0
def error?
%w[failed failed_restarts].sum {|f| status f} > 0
end

# returns true if total action metrics are > 0
def changes?
%w[applied restarted].sum {|f| status f} > 0
end

# returns true if there are any changes pending
def pending?
pending > 0
end

#returns metrics
#when no metric type is specific returns hash with all values
#passing a METRIC member will return its value
def status(type = nil)
@calc ||= ReportStatusCalculator.new(:bit_field => read_attribute(self.class.report_status))
@calc.status(type)
end
end
(18-18/23)