19 Commits

Author SHA1 Message Date
3267ee1eb9 Merge branch 'release/v0.0.8' 2011-01-12 16:13:13 +00:00
6309e4b217 Version bump to 0.0.8 2011-01-12 16:12:55 +00:00
776ee8ac97 make version available in code via
Redistat::VERSION
2011-01-12 16:11:19 +00:00
3b346e88e0 moved DateHelper module to it's own files for the
sake of transparency
2011-01-12 16:10:38 +00:00
c3fe861b10 connection handling was so thread-safe that it
stopped working in newly created threads
2011-01-12 16:04:42 +00:00
bc5034b6bb Merge branch 'release/v0.0.7' into dev 2010-12-29 17:29:20 +00:00
66510fe344 Merge branch 'release/v0.0.7' 2010-12-29 17:29:13 +00:00
745473862f added note about system_timer gem to readme 2010-12-29 17:28:56 +00:00
a5c8fc6fbf Version bump to 0.0.7 2010-12-29 17:27:19 +00:00
115b223d7c added class_name option to Model warpper for
customizing the scope used in Redis keys
2010-12-29 17:26:22 +00:00
0597b587fd Merge branch 'feature/ruby19' into dev 2010-12-29 17:14:40 +00:00
89932759ef Merge branch 'master' of https://github.com/JamesHarrison/redistat into feature/ruby19 2010-12-29 16:42:50 +00:00
55e0687837 Merge branch 'dev' into feature/ruby19 2010-12-29 16:42:36 +00:00
James Harrison
93360dbeb9 Specs pass again - problem with Time.now resolution surpassing that provided by values stored in a Redistat::Date, truncated to seconds by using to_s, which is accurate enough for testing purposes 2010-12-28 23:55:39 +00:00
James Harrison
6a66605e0b Adds Ruby 1.9.2 compat (references to TimeExt#round collide with the new real Time#now, changed to TimeExt#beginning_of_closest), 3 specs failing relating to time equality testing 2010-12-28 23:46:25 +00:00
James Harrison
d9ce0daade Removes SystemTimer for Ruby 1.9.2 compat 2010-12-28 22:11:33 +00:00
f6ec2e97b2 Merge branch 'dev' of github.com:jimeh/redistat into dev 2010-12-09 22:42:55 +00:00
67dc9433c7 fixed typo in deprecation warning 2010-12-09 22:42:27 +00:00
f0fcd2110d Merge branch 'release/v0.0.6' into dev 2010-12-01 13:41:48 +00:00
17 changed files with 99 additions and 30 deletions

View File

@@ -1,11 +1,10 @@
PATH PATH
remote: . remote: .
specs: specs:
redistat (0.0.6) redistat (0.0.8)
activesupport (>= 2.3.0) activesupport (>= 2.3.0)
json (>= 1.4.0) json (>= 1.4.0)
redis (>= 2.1.0) redis (>= 2.1.0)
system_timer (>= 1.0.0)
time_ext (>= 0.2.8) time_ext (>= 0.2.8)
GEM GEM
@@ -24,7 +23,6 @@ GEM
rspec-expectations (2.1.0) rspec-expectations (2.1.0)
diff-lcs (~> 1.1.2) diff-lcs (~> 1.1.2)
rspec-mocks (2.1.0) rspec-mocks (2.1.0)
system_timer (1.0)
time_ext (0.2.8) time_ext (0.2.8)
activesupport (>= 2.3.0) activesupport (>= 2.3.0)
i18n (>= 0.4.2) i18n (>= 0.4.2)
@@ -39,6 +37,5 @@ DEPENDENCIES
redis (>= 2.1.0) redis (>= 2.1.0)
redistat! redistat!
rspec (>= 2.1.0) rspec (>= 2.1.0)
system_timer (>= 1.0.0)
time_ext (>= 0.2.8) time_ext (>= 0.2.8)
yard (>= 0.6.3) yard (>= 0.6.3)

View File

@@ -14,6 +14,8 @@ Redis fits perfectly with all of these requirements. It has atomic operations li
gem install redistat gem install redistat
If you are using Ruby 1.8.x, it's recommended you also install the `system_timer` gem, as the Redis gem will otherwise complain.
## Usage ## Usage
The simplest way to use Redistat is through the model wrapper. The simplest way to use Redistat is through the model wrapper.

View File

@@ -13,6 +13,7 @@ require 'redistat/collection'
require 'redistat/connection' require 'redistat/connection'
require 'redistat/database' require 'redistat/database'
require 'redistat/date' require 'redistat/date'
require 'redistat/date_helper'
require 'redistat/event' require 'redistat/event'
require 'redistat/finder' require 'redistat/finder'
require 'redistat/finder/date_set' require 'redistat/finder/date_set'
@@ -22,10 +23,12 @@ require 'redistat/model'
require 'redistat/result' require 'redistat/result'
require 'redistat/scope' require 'redistat/scope'
require 'redistat/summary' require 'redistat/summary'
require 'redistat/version'
require 'redistat/core_ext/date' require 'redistat/core_ext/date'
require 'redistat/core_ext/time' require 'redistat/core_ext/time'
require 'redistat/core_ext/fixnum' require 'redistat/core_ext/fixnum'
require 'redistat/core_ext/bignum'
module Redistat module Redistat
@@ -54,7 +57,7 @@ module Redistat
end end
def flush def flush
puts "WARNING: Redistat.flush is deprecated. Use Redistat.redis.flush instead." puts "WARNING: Redistat.flush is deprecated. Use Redistat.redis.flushdb instead."
connection.flushdb connection.flushdb
end end

View File

@@ -18,6 +18,7 @@ module Redistat
end end
def create(options = {}) def create(options = {})
#TODO clean/remove all ref-less connections
ref = options.delete(:ref) || :default ref = options.delete(:ref) || :default
options.reverse_merge!(default_options) options.reverse_merge!(default_options)
conn = (connections[connection_id(options)] ||= connection(options)) conn = (connections[connection_id(options)] ||= connection(options))
@@ -26,15 +27,11 @@ module Redistat
end end
def connections def connections
threaded[:connections] ||= {} @connections ||= {}
end end
def references def references
threaded[:references] ||= {} @references ||= {}
end
def threaded
Thread.current[:redistat] ||= {}
end end
private private

View File

@@ -0,0 +1,8 @@
class Bignum
include Redistat::DateHelper
def to_time
Time.at(self)
end
end

View File

@@ -22,6 +22,8 @@ module Redistat
from_string(input) from_string(input)
elsif input.is_a?(::Fixnum) elsif input.is_a?(::Fixnum)
from_integer(input) from_integer(input)
elsif input.is_a?(::Bignum)
from_integer(input)
end end
end end
@@ -83,11 +85,4 @@ module Redistat
end end
end end
module DateHelper
def to_redistat(depth = nil)
Redistat::Date.new(self, depth)
end
alias :to_rs :to_redistat
end
end end

View File

@@ -0,0 +1,8 @@
module Redistat
module DateHelper
def to_redistat(depth = nil)
Redistat::Date.new(self, depth)
end
alias :to_rs :to_redistat
end
end

View File

@@ -42,7 +42,7 @@ module Redistat
return find_start_year_for(start_date, end_date, lowest_depth) if unit == :year return find_start_year_for(start_date, end_date, lowest_depth) if unit == :year
index = Date::DEPTHS.index(unit) index = Date::DEPTHS.index(unit)
nunit = Date::DEPTHS[(index > 0) ? index-1 : index] nunit = Date::DEPTHS[(index > 0) ? index-1 : index]
if start_date < start_date.round(nunit) || start_date.next(nunit).beginning_of(nunit) > end_date.beginning_of(nunit) if start_date < start_date.beginning_of_closest(nunit) || start_date.next(nunit).beginning_of(nunit) > end_date.beginning_of(nunit)
add = [] add = []
start_date.beginning_of_each(unit, :include_start => lowest_depth).until(start_date.end_of(nunit)) do |t| start_date.beginning_of_each(unit, :include_start => lowest_depth).until(start_date.end_of(nunit)) do |t|
add << t.to_rs.to_s(unit) if t < end_date.beginning_of(unit) add << t.to_rs.to_s(unit) if t < end_date.beginning_of(unit)
@@ -59,7 +59,7 @@ module Redistat
index = Date::DEPTHS.index(unit) index = Date::DEPTHS.index(unit)
nunit = Date::DEPTHS[(index > 0) ? index-1 : index] nunit = Date::DEPTHS[(index > 0) ? index-1 : index]
has_nunit = end_date.prev(nunit).beginning_of(nunit) >= start_date.beginning_of(nunit) has_nunit = end_date.prev(nunit).beginning_of(nunit) >= start_date.beginning_of(nunit)
nearest_nunit = end_date.round(nunit) nearest_nunit = end_date.beginning_of_closest(nunit)
if end_date >= nearest_nunit && has_nunit if end_date >= nearest_nunit && has_nunit
add = [] add = []
end_date.beginning_of(nunit).beginning_of_each(unit, :include_start => true, :include_end => lowest_depth).until(end_date) do |t| end_date.beginning_of(nunit).beginning_of_each(unit, :include_start => true, :include_end => lowest_depth).until(end_date) do |t|

View File

@@ -39,6 +39,15 @@ module Redistat
end end
end end
def class_name(class_name = nil)
if !class_name.nil?
options[:class_name] = class_name
else
options[:class_name] || nil
end
end
alias :scope :class_name
def depth(depth = nil) def depth(depth = nil)
if !depth.nil? if !depth.nil?
options[:depth] = depth options[:depth] = depth
@@ -62,7 +71,7 @@ module Redistat
private private
def name def name
@name ||= self.to_s options[:class_name] || (@name ||= self.to_s)
end end
end end

View File

@@ -1,3 +1,3 @@
module Redistat module Redistat
VERSION = "0.0.6" VERSION = "0.0.8"
end end

View File

@@ -22,7 +22,6 @@ Gem::Specification.new do |s|
s.add_runtime_dependency 'activesupport', '>= 2.3.0' s.add_runtime_dependency 'activesupport', '>= 2.3.0'
s.add_runtime_dependency 'json', '>= 1.4.0' s.add_runtime_dependency 'json', '>= 1.4.0'
s.add_runtime_dependency 'redis', '>= 2.1.0' s.add_runtime_dependency 'redis', '>= 2.1.0'
s.add_runtime_dependency 'system_timer', '>= 1.0.0'
s.add_runtime_dependency 'time_ext', '>= 0.2.8' s.add_runtime_dependency 'time_ext', '>= 0.2.8'
s.add_development_dependency 'rspec', '>= 2.1.0' s.add_development_dependency 'rspec', '>= 2.1.0'

View File

@@ -20,7 +20,7 @@ describe Redistat::Event do
@event.scope.should == @scope @event.scope.should == @scope
@event.label.should == @label @event.label.should == @label
@event.label_hash.should == @label_hash @event.label_hash.should == @label_hash
@event.date.to_time.should == @date @event.date.to_time.to_s.should == @date.to_s
@event.stats.should == @stats @event.stats.should == @stats
@event.meta.should == @meta @event.meta.should == @meta
@event.options.should == @event.default_options.merge(@options) @event.options.should == @event.default_options.merge(@options)
@@ -28,10 +28,10 @@ describe Redistat::Event do
it "should allow changing attributes" do it "should allow changing attributes" do
# date # date
@event.date.to_time.should == @date @event.date.to_time.to_s.should == @date.to_s
@date = Time.now @date = Time.now
@event.date = @date @event.date = @date
@event.date.to_time.should == @date @event.date.to_time.to_s.should == @date.to_s
# label # label
@event.label.should == @label @event.label.should == @label
@event.label_hash.should == @label_hash @event.label_hash.should == @label_hash

View File

@@ -46,10 +46,10 @@ describe Redistat::Key do
@key.scope = @scope @key.scope = @scope
@key.scope.should == @scope @key.scope.should == @scope
# date # date
@key.date.to_time.should == @date @key.date.to_time.to_s.should == @date.to_s
@date = Time.now @date = Time.now
@key.date = @date @key.date = @date
@key.date.to_time.should == @date @key.date.to_time.to_s.should == @date.to_s
# label # label
@key.label.should == @label @key.label.should == @label
@key.label_hash == @label_hash @key.label_hash == @label_hash

View File

@@ -20,4 +20,11 @@ class ModelHelper3
connect_to :port => 8379, :db => 14 connect_to :port => 8379, :db => 14
end
class ModelHelper4
include Redistat::Model
class_name "FancyHelper"
end end

View File

@@ -8,6 +8,7 @@ describe Redistat::Model do
ModelHelper1.redis.flushdb ModelHelper1.redis.flushdb
ModelHelper2.redis.flushdb ModelHelper2.redis.flushdb
ModelHelper3.redis.flushdb ModelHelper3.redis.flushdb
ModelHelper4.redis.flushdb
end end
it "should should name itself correctly" do it "should should name itself correctly" do
@@ -19,6 +20,7 @@ describe Redistat::Model do
ModelHelper2.depth.should == :day ModelHelper2.depth.should == :day
ModelHelper2.store_event.should == true ModelHelper2.store_event.should == true
ModelHelper2.hashed_label.should == true ModelHelper2.hashed_label.should == true
ModelHelper2.class_name.should be_nil
ModelHelper1.depth.should == nil ModelHelper1.depth.should == nil
ModelHelper1.store_event.should == nil ModelHelper1.store_event.should == nil
@@ -35,6 +37,9 @@ describe Redistat::Model do
ModelHelper1.depth.should == nil ModelHelper1.depth.should == nil
ModelHelper1.store_event.should == nil ModelHelper1.store_event.should == nil
ModelHelper1.hashed_label.should == nil ModelHelper1.hashed_label.should == nil
ModelHelper4.class_name.should == "FancyHelper"
ModelHelper4.send(:name).should == "FancyHelper"
end end
it "should store and fetch stats" do it "should store and fetch stats" do

View File

@@ -8,5 +8,5 @@ require 'rspec'
require 'rspec/autorun' require 'rspec/autorun'
# use the test Redistat instance # use the test Redistat instance
Redistat.connect(:port => 8379, :db => 15) Redistat.connect(:port => 8379, :db => 15, :thread_safe => true)
Redistat.redis.flushdb Redistat.redis.flushdb

View File

@@ -0,0 +1,39 @@
require "spec_helper"
describe "Thread-Safety" do
include Redistat::Database
before(:each) do
db.flushdb
end
#TODO should have more comprehensive thread-safe tests
it "should incr in multiple threads" do
threads = []
50.times do
threads << Thread.new {
db.incr("spec:incr")
}
end
threads.each { |t| t.join }
db.get("spec:incr").should == "50"
end
it "should store event in multiple threads" do
class ThreadSafetySpec
include Redistat::Model
end
threads = []
50.times do
threads << Thread.new {
ThreadSafetySpec.store("spec:threadsafe", {:count => 1, :rand => rand(5)})
}
end
threads.each { |t| t.join }
result = ThreadSafetySpec.fetch("spec:threadsafe", 5.hours.ago, 5.hours.from_now)
result.total[:count].should == 50
result.total[:rand].should <= 250
end
end