lib/minuteman.rb
require 'redic'
module Minuteman
LUA_CACHE = Hash.new { |h, k| h[k] = Hash.new }
LUA_OPERATIONS = File.expand_path("../minuteman/lua/operations.lua", __FILE__)
class << self
def config
@_configuration ||= Configuration.new
end
def configure
yield(config)
end
def prefix
config.prefix
end
def patterns
config.patterns
end
def time_spans
@_time_spans = patterns.keys
end
def events
config.redis.call("SMEMBERS", "#{Minuteman.prefix}::Events")
end
def track(action, users = nil, time = Time.now.utc)
users = Minuteman::User.create if users.nil?
Array(users).each do |user|
process do
time_spans.each do |time_span|
event = Minuteman::Event.find_or_create(
type: action,
time: patterns[time_span].call(time)
)
event.setbit(user.id)
end
end
end
users
end
def add(action, time = Time.now.utc, users = [])
time_spans.each do |time_span|
process do
counter = Minuteman::Counter.create({
type: action,
time: patterns[time_span].call(time)
})
counter.incr
end
end
Array(users).each do |user|
time_spans.each do |time_span|
counter = Minuteman::Counter::User.create({
user_id: user.id,
type: action,
time: patterns[time_span].call(time)
})
counter.incr
end
end
end
def analyze(action)
analyzers_cache[action]
end
def count(action)
counters_cache[action]
end
private
def process(&block)
if !!config.parallel
Thread.current(&block)
else
block.call
end
end
def analyzers_cache
@_analyzers_cache ||= Hash.new do |h,k|
h[k] = Minuteman::Analyzer.new(k)
end
end
def counters_cache
@_counters_cache ||= Hash.new do |h,k|
h[k] = Minuteman::Analyzer.new(k, Minuteman::Counter)
end
end
end
end
# Helper method to easily access the analytics part
def Minuteman(action)
Minuteman.analyze(action)
end
# Why call this method so different from Minuteman?
# for the lulz: https://github.com/maccman/counterman/issues/1
def Counterman(action)
Minuteman.count(action)
end
require 'minuteman/user'
require 'minuteman/event'
require 'minuteman/counter'
require 'minuteman/result'
require 'minuteman/analyzer'
require 'minuteman/configuration'