diff --git a/lib/redistat/model.rb b/lib/redistat/model.rb index 07bd330..677c524 100644 --- a/lib/redistat/model.rb +++ b/lib/redistat/model.rb @@ -1,13 +1,50 @@ module Redistat - class Model + module Model - def self.create(*args) - Event.new(self.name, self.options, *args) + def self.included(base) + base.extend(self) end - def self.options + def store(label, stats = {}, date = nil, meta = {}, opts = {}) + Event.new(name, label, date, stats, options.merge(opts), meta).save + end + alias :event :store + + def fetch(label, from, till, opts = {}) + Finder.find({ + :scope => name, + :label => label, + :from => from, + :till => till + }.merge(options.merge(opts))) + end + alias :find :fetch + + def depth(depth = nil) + if !depth.nil? + options[:depth] = depth + else + options[:depth] || nil + end + end + + def store_event(boolean = nil) + if !boolean.nil? + options[:store_event] = boolean + else + options[:store_event] || nil + end + end + + def options @options ||= {} end + private + + def name + @name ||= self.to_s + end + end end \ No newline at end of file diff --git a/spec/model_helper.rb b/spec/model_helper.rb new file mode 100644 index 0000000..fd31251 --- /dev/null +++ b/spec/model_helper.rb @@ -0,0 +1,15 @@ +require "redistat" + +class ModelHelper + include Redistat::Model + + +end + +class ModelHelper2 + include Redistat::Model + + depth :day + store_event true + +end \ No newline at end of file diff --git a/spec/model_spec.rb b/spec/model_spec.rb new file mode 100644 index 0000000..87fbfdc --- /dev/null +++ b/spec/model_spec.rb @@ -0,0 +1,60 @@ +require "spec_helper" +require "model_helper" + +describe Redistat::Model do + include Redistat::Database + + before(:each) do + db.flushdb + end + + it "should should name itself correctly" do + ModelHelper.send(:name).should == "ModelHelper" + ModelHelper2.send(:name).should == "ModelHelper2" + end + + it "should listen to model-defined options" do + ModelHelper2.depth.should == :day + ModelHelper2.store_event.should == true + + ModelHelper.depth.should == nil + ModelHelper.store_event.should == nil + ModelHelper.depth(:hour) + ModelHelper.depth.should == :hour + ModelHelper.store_event(true) + ModelHelper.store_event.should == true + ModelHelper.options[:depth] = nil + ModelHelper.options[:store_event] = nil + ModelHelper.depth.should == nil + ModelHelper.store_event.should == nil + end + + it "should store and fetch stats" do + ModelHelper.store("sheep.black", {:count => 6, :weight => 461}, 4.hours.ago) + ModelHelper.store("sheep.black", {:count => 2, :weight => 156}) + + stats = ModelHelper.fetch("sheep.black", 2.hours.ago, 1.hour.from_now) + stats.total["count"].should == 2 + stats.total["weight"].should == 156 + stats.first.should == stats.total + + stats = ModelHelper.fetch("sheep.black", 5.hours.ago, 1.hour.from_now) + stats.total["count"].should == 8 + stats.total["weight"].should == 617 + stats.first.should == stats.total + + ModelHelper.store("sheep.white", {:count => 5, :weight => 393}, 4.hours.ago) + ModelHelper.store("sheep.white", {:count => 4, :weight => 316}) + + stats = ModelHelper.fetch("sheep.white", 2.hours.ago, 1.hour.from_now) + stats.total["count"].should == 4 + stats.total["weight"].should == 316 + stats.first.should == stats.total + + stats = ModelHelper.fetch("sheep.white", 5.hours.ago, 1.hour.from_now) + stats.total["count"].should == 9 + stats.total["weight"].should == 709 + stats.first.should == stats.total + end + +end \ No newline at end of file