From c7c4e4345f548e14659a2cbeadb00cc242a8657d Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Tue, 20 Jul 2010 03:00:45 +0300 Subject: [PATCH] Redistat::Event stores events --- lib/redistat.rb | 1 + lib/redistat/event.rb | 54 +++++++++++++++++++++++++++++++++++-------- spec/event_spec.rb | 38 +++++++++++++++++++++++++++++- 3 files changed, 83 insertions(+), 10 deletions(-) diff --git a/lib/redistat.rb b/lib/redistat.rb index e524b1e..981dec9 100644 --- a/lib/redistat.rb +++ b/lib/redistat.rb @@ -2,6 +2,7 @@ require "redis" require "date" require "time" +require "json/pure" require "digest/sha1" require "redistat/database" diff --git a/lib/redistat/event.rb b/lib/redistat/event.rb index b447d20..39c34be 100644 --- a/lib/redistat/event.rb +++ b/lib/redistat/event.rb @@ -1,22 +1,63 @@ module Redistat class Event + include Database + extend Database + attr_reader :id attr_reader :key attr_accessor :stats attr_accessor :meta attr_accessor :options - def initialize(scope, label = nil, date = nil, stats = {}, meta = {}, options = {}) + def initialize(scope, label = nil, date = nil, stats = {}, meta = {}, options = {}, is_new = true) @options = default_options.merge(options) - @scope = scope @key = Key.new(scope, label, date, @options) @stats = stats ||= {} @meta = meta ||= {} + @new = is_new + end + + def default_options + { :depth => :hour, :store_event => false } end - def default_options - { :depth => :hour, } + def new? + @new + end + + def save + return false if !self.new? + @id = self.class.next_id + + #TODO store sumarized stats + + if @options[:store_event] + db.hset "#{KEY_EVENT_PREFIX}#{@id}", :scope, self.scope + db.hset "#{KEY_EVENT_PREFIX}#{@id}", :label, self.label + db.hset "#{KEY_EVENT_PREFIX}#{@id}", :date, self.date.to_time.to_s + db.hset "#{KEY_EVENT_PREFIX}#{@id}", :stats, self.stats.to_json + db.hset "#{KEY_EVENT_PREFIX}#{@id}", :meta, self.meta.to_json + db.hset "#{KEY_EVENT_PREFIX}#{@id}", :options, self.options.to_json + db.sadd "#{self.scope}#{KEY_EVENT_IDS_SUFFIX}", @id + end + @new = false + self + end + + def self.create(*args) + self.new(*args).save + end + + def self.next_id + db.incr(KEY_NEXT_EVENT_ID) + end + + def self.find(id) + event = db.hgetall "#{KEY_EVENT_PREFIX}#{id}" + return nil if event.size == 0 + self.new( event["scope"], event["label"], event["date"], JSON.parse(event["stats"]), + JSON.parse(event["meta"]), JSON.parse(event["options"]), false ) end def date @@ -50,10 +91,5 @@ module Redistat @key.label = input end - - def save - - end - end end \ No newline at end of file diff --git a/spec/event_spec.rb b/spec/event_spec.rb index 9d838a1..dfa2e78 100644 --- a/spec/event_spec.rb +++ b/spec/event_spec.rb @@ -13,7 +13,15 @@ describe Redistat::Event do @event = Redistat::Event.new(@scope, @label, @date, @stats, @meta, @options) end - # it "should initialize properly" + it "should initialize properly" do + @event.scope.should == @scope + @event.label.should == @label + @event.label_hash.should == @label_hash + @event.date.to_time.should == @date + @event.stats.should == @stats + @event.meta.should == @meta + @event.options.should == @event.default_options.merge(@options) + end it "should allow changing attributes" do # date @@ -31,4 +39,32 @@ describe Redistat::Event do @event.label_hash.should == @label_hash end + it "should increment next_id" do + Redistat::Event.next_id.should == 1 + Redistat::Event.next_id.should == 2 + Redistat::Event.next_id.should == 3 + end + + it "should store event properly" do + @event = Redistat::Event.new(@scope, @label, @date, @stats, @meta, @options.merge({:store_event => true})) + @event.new?.should be_true + @event.save + @event.new?.should be_false + keys = db.keys "*" + keys.should include("#{Redistat::KEY_EVENT_PREFIX}#{@event.id}") + keys.should include("#{@event.scope}#{Redistat::KEY_EVENT_IDS_SUFFIX}") + end + + it "should find event by id" do + @event = Redistat::Event.new(@scope, @label, @date, @stats, @meta, @options.merge({:store_event => true})).save + fetched = Redistat::Event.find(@event.id) + @event.scope.should == fetched.scope + @event.label.should == fetched.label + @event.date.to_s.should == fetched.date.to_s + end + + def db + Redistat.redis + end + end \ No newline at end of file