redis_object
Advanced tools
@@ -37,7 +37,7 @@ require 'active_support/inflector' | ||
| include Seabright::Keys | ||
| include Seabright::Types | ||
| include Seabright::DefaultValues | ||
| include Seabright::Indices | ||
| include Seabright::Collections | ||
| include Seabright::Types | ||
| include Seabright::Triggers | ||
| include Seabright::Indices | ||
| include Seabright::Views | ||
@@ -44,0 +44,0 @@ include Seabright::ViewCaching |
@@ -74,5 +74,11 @@ module Seabright | ||
| def get(k) | ||
| cached_hash_values[k.to_s] ||= _get(k) | ||
| filter_gotten_value(k, (cached_hash_values[k.to_s] || _get(k))) | ||
| end | ||
| def filter_gotten_value(k,v) | ||
| self.class.get_filters.inject(v) do |acc, filter| | ||
| filter.call(self, k, acc) | ||
| end | ||
| end | ||
| def _get(k) | ||
@@ -96,2 +102,5 @@ if is_ref_key?(k) && (v = get_reference(store.hget(hkey, k.to_s))) | ||
| def mset(dat) | ||
| dat = self.class.mset_filters.inject(dat) do |acc,filter| | ||
| filter.call(self, acc) | ||
| end | ||
| store.hmset(hkey, *(dat.inject([]){|acc,(k,v)| acc << [k,v] }.flatten)) | ||
@@ -120,2 +129,5 @@ cached_hash_values.merge!(dat) | ||
| def set(k,v) | ||
| (k,v) = self.class.set_filters.inject([k,v]) do |acc,filter| | ||
| filter.call(self,*acc) unless acc.nil? or acc[0].nil? | ||
| end | ||
| return nil if k.nil? | ||
@@ -157,2 +169,5 @@ return set_ref(k,v) if v.is_a?(RedisObject) | ||
| def setnx(k,v) | ||
| (k,v) = self.class.set_filters.inject([k,v]) do |acc,filter| | ||
| filter.call(self,*acc) | ||
| end | ||
| if success = store.hsetnx(hkey, k.to_s, v.to_s) | ||
@@ -223,2 +238,30 @@ cached_hash_values[k.to_s] = v | ||
| def action_filters | ||
| @@action_filters ||= {} | ||
| end | ||
| def set_filters | ||
| action_filters[:set] ||= [] | ||
| end | ||
| def filter_sets(&block) | ||
| set_filters << block | ||
| end | ||
| def mset_filters | ||
| action_filters[:mset] ||= [] | ||
| end | ||
| def filter_msets(&block) | ||
| mset_filters << block | ||
| end | ||
| def get_filters | ||
| action_filters[:get] ||= [] | ||
| end | ||
| def filter_gets(&block) | ||
| get_filters << block | ||
| end | ||
| def clean_id(i) | ||
@@ -225,0 +268,0 @@ i.to_s.gsub(/.*:/,'').gsub(/_h$/,'') |
@@ -9,16 +9,2 @@ module Seabright | ||
| def load(o_id) | ||
| super(o_id) | ||
| store.smembers(hkey_col).each do |name| | ||
| collections[name] = Seabright::Collection.load(name,self) | ||
| define_access(name) do | ||
| get_collection(name) | ||
| end | ||
| define_access(name.to_s.singularize) do | ||
| get_collection(name).latest | ||
| end | ||
| end | ||
| true | ||
| end | ||
| def delete_child(obj) | ||
@@ -82,10 +68,14 @@ if col = get_collection(obj.collection_name) | ||
| def get(k) | ||
| if has_collection?(k) | ||
| get_collection(k) | ||
| elsif has_collection?(pk = k.to_s.pluralize) | ||
| get_collection(pk).first | ||
| else | ||
| super(k) | ||
| def load(o_id) | ||
| super(o_id) | ||
| store.smembers(hkey_col).each do |name| | ||
| collections[name] = Seabright::Collection.load(name,self) | ||
| define_access(name) do | ||
| get_collection(name) | ||
| end | ||
| define_access(name.to_s.singularize) do | ||
| get_collection(name).latest | ||
| end | ||
| end | ||
| true | ||
| end | ||
@@ -102,3 +92,3 @@ | ||
| store.sadd hkey_col, name | ||
| @collection_names << name.to_s | ||
| collection_names << name.to_s | ||
| collections[name.to_s] ||= Collection.load(name,self) | ||
@@ -109,3 +99,3 @@ define_access(name.to_s.pluralize) do | ||
| define_access(name.to_s.singularize) do | ||
| get_collection(name).latest | ||
| get_collection(name).first | ||
| end | ||
@@ -124,12 +114,2 @@ end | ||
| def mset(dat) | ||
| dat.select! {|k,v| !collections[k.to_s] } | ||
| super(dat) | ||
| end | ||
| def set(k,v) | ||
| @data ? super(k,v) : has_collection?(k) ? get_collection(k.to_s).replace(v) : super(k,v) | ||
| v | ||
| end | ||
| def collect_type_by_key(col,*keys) | ||
@@ -144,2 +124,33 @@ collect = get_collection(col) | ||
| def intercept_sets_for_collecting! | ||
| return if @intercepted_sets_for_collecting | ||
| self.class_eval do | ||
| filter_gets do |obj, k, v| | ||
| if obj.has_collection?(k) | ||
| obj.get_collection(k) | ||
| elsif obj.has_collection?(pk = k.to_s.pluralize) | ||
| obj.get_collection(pk).first | ||
| else | ||
| v | ||
| end | ||
| end | ||
| filter_sets do |obj, k, v| | ||
| if obj.has_collection?(k) | ||
| obj.get_collection(k.to_s).replace(v) | ||
| return [nil,nil] | ||
| else | ||
| [k,v] | ||
| end | ||
| end | ||
| filter_msets do |obj, dat| | ||
| dat.select {|k,v| !obj.collections[k.to_s] } | ||
| end | ||
| end | ||
| @intercepted_sets_for_collecting = true | ||
| end | ||
| def hkey_col(ident = nil) | ||
@@ -179,8 +190,7 @@ "#{hkey(ident)}:collections" | ||
| if has_collection?(k) | ||
| get_collection(k) | ||
| return get_collection(k) | ||
| elsif has_collection?(pk = k.to_s.pluralize) | ||
| get_collection(pk).first | ||
| else | ||
| super(k) | ||
| return get_collection(pk).first | ||
| end | ||
| nil | ||
| end | ||
@@ -205,2 +215,3 @@ | ||
| base.extend(ClassMethods) | ||
| base.intercept_sets_for_collecting! | ||
| end | ||
@@ -249,8 +260,14 @@ | ||
| RedisObject::ScriptSources::FwdScript = "redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0)\nlocal keys = redis.call('ZRANGE', KEYS[1], 0, KEYS[4])\nredis.call('DEL', KEYS[1])\nreturn keys".freeze | ||
| RedisObject::ScriptSources::RevScript = "redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0)\nlocal keys = redis.call('ZREVRANGE', KEYS[1], 0, KEYS[4])\nredis.call('DEL', KEYS[1])\nreturn keys".freeze | ||
| RedisObject::ScriptSources::FwdScript = "redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0) | ||
| local keys = redis.call('ZRANGE', KEYS[1], 0, KEYS[4]) | ||
| redis.call('DEL', KEYS[1]) | ||
| return keys".freeze | ||
| RedisObject::ScriptSources::RevScript = "redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0) | ||
| local keys = redis.call('ZREVRANGE', KEYS[1], 0, KEYS[4]) | ||
| redis.call('DEL', KEYS[1]) | ||
| return keys".freeze | ||
| def keys_by_index(idx,num=-1,reverse=false) | ||
| keys = run_script(reverse ? :RevScript : :FwdScript, [temp_key, sort_index_key(idx), key, num]) | ||
| ListEnumerator.new(keys) do |y| | ||
| keys = run_script(reverse ? :RevScript : :FwdScript, [temp_key, sort_index_key(idx), key, num>0 ? num - 1 : -1]) | ||
| ListEnumerator.new(keys.uniq) do |y| | ||
| keys.each do |member| | ||
@@ -596,2 +613,5 @@ y << member | ||
| def class_const_for(name) | ||
| if cls = RedisObject.constant_lookups[name.to_s.classify.to_sym] | ||
| return cls | ||
| end | ||
| Object.const_get(name.to_s.classify.to_sym) rescue RedisObject | ||
@@ -598,0 +618,0 @@ end |
@@ -14,8 +14,8 @@ module Seabright | ||
| alias_method :undefaulted_get, :get unless method_defined?(:undefaulted_get) | ||
| def get(k) | ||
| if !is_set?(k) && (d = self.class.default_vals[k.to_sym]) && !d.nil? | ||
| return d | ||
| filter_gets do |obj, k, v| | ||
| if !obj.is_set?(k) && (d = obj.class.default_vals[k.to_sym]) && !d.nil? | ||
| d | ||
| else | ||
| v | ||
| end | ||
| undefaulted_get(k) | ||
| end | ||
@@ -22,0 +22,0 @@ |
@@ -10,30 +10,35 @@ module Seabright | ||
| def filtered_method_call(method,*args) | ||
| if filters = self.class.filters_for(method) | ||
| filters.each do |f| | ||
| next unless args.is_a?(Array) and !args[0].nil? | ||
| args = send(f,*args) | ||
| filter_gets do |obj, k, v| | ||
| if filters = obj.class.filters_for(:get) | ||
| return filters.inject(v) do |acc,f| | ||
| obj.send(f,acc) | ||
| end | ||
| else | ||
| v | ||
| end | ||
| unless args.is_a?(Array) | ||
| args = [nil,nil] | ||
| end | ||
| send("unfiltered_#{method.to_s}".to_sym,*args) | ||
| end | ||
| alias_method :unfiltered_get, :get unless method_defined?(:unfiltered_get) | ||
| def get(k) | ||
| filtered_method_call(:get,k) | ||
| filter_sets do |obj, k, v| | ||
| if filters = obj.class.filters_for(:set) | ||
| filters.inject([k,v]) do |acc,f| | ||
| obj.send(f,*acc) | ||
| end | ||
| else | ||
| [k,v] | ||
| end | ||
| end | ||
| alias_method :unfiltered_set, :set unless method_defined?(:unfiltered_set) | ||
| def set(k,v) | ||
| filtered_method_call(:set,k,v) | ||
| end | ||
| alias_method :unfiltered_setnx, :setnx unless method_defined?(:unfiltered_setnx) | ||
| def setnx(k,v) | ||
| filtered_method_call(:setnx,k,v) | ||
| end | ||
| # filter_msets do |dat| | ||
| # if filters = self.class.filters_for(method) | ||
| # filters.each do |f| | ||
| # next unless args.is_a?(Array) and !args[0].nil? | ||
| # args = send(f,*args) | ||
| # end | ||
| # end | ||
| # unless args.is_a?(Array) | ||
| # args = [nil,nil] | ||
| # end | ||
| # args | ||
| # end | ||
| # | ||
| end | ||
@@ -45,3 +50,2 @@ @intercept_for_filters = true | ||
| filter_method(:set,filter) | ||
| filter_method(:setnx,filter) | ||
| end | ||
@@ -48,0 +52,0 @@ |
@@ -25,13 +25,2 @@ module Seabright | ||
| def indexed_set_method(meth,k,v) | ||
| ret = send("unindexed_#{meth}".to_sym,k,v) | ||
| if self.class.has_index?(k) | ||
| set_index k, v, hkey | ||
| end | ||
| if self.class.has_sort_index?(k) | ||
| set_sort_index k, v, hkey | ||
| end | ||
| ret | ||
| end | ||
| def set_index(k,v,hkey) | ||
@@ -49,21 +38,20 @@ if cur = get(k) | ||
| alias_method :unindexed_set, :set unless method_defined?(:unindexed_set) | ||
| def set(k,v) | ||
| indexed_set_method(:set,k,v) | ||
| filter_sets do |obj, k, v| | ||
| if obj.class.has_index?(k) | ||
| obj.set_index k, v, obj.hkey | ||
| end | ||
| if obj.class.has_sort_index?(k) | ||
| obj.set_sort_index k, v, obj.hkey | ||
| end | ||
| [k, v] | ||
| end | ||
| alias_method :unindexed_setnx, :setnx unless method_defined?(:unindexed_setnx) | ||
| def setnx(k,v) | ||
| indexed_set_method(:setnx,k,v) | ||
| end | ||
| alias_method :unindexed_mset, :mset unless method_defined?(:unindexed_mset) | ||
| def mset(dat) | ||
| dat.select {|k,v| self.class.has_index?(k) }.each do |k,v| | ||
| set_index k, v, hkey | ||
| filter_msets do |obj, dat| | ||
| dat.each do |k,v| | ||
| obj.set_index(k, v, obj.hkey) if obj.class.has_index?(k) | ||
| end | ||
| dat.select {|k,v| self.class.has_sort_index?(k) }.each do |k,v| | ||
| set_sort_index k, v, hkey | ||
| dat.each do |k,v| | ||
| obj.set_sort_index(k, v, obj.hkey) if obj.class.has_sort_index?(k) | ||
| end | ||
| unindexed_mset(dat) | ||
| dat | ||
| end | ||
@@ -152,2 +140,3 @@ | ||
| base.extend(ClassMethods) | ||
| base.intercept_sets_for_indices! | ||
| end | ||
@@ -154,0 +143,0 @@ |
| module Seabright | ||
| def RedisObject.constant_lookups | ||
| @constant_lookups ||= {} | ||
| end | ||
| module InheritanceTracking | ||
| module ClassMethods | ||
| def inherited(child_class) | ||
| RedisObject.constant_lookups[child_class.name.to_s.split("::").last.to_sym] ||= child_class | ||
| child_classes_set.add(child_class) | ||
@@ -7,0 +14,0 @@ end |
@@ -6,3 +6,5 @@ module Seabright | ||
| # return unless self.class.time_matters? | ||
| set(:created_at, Time.now) if !is_set?(:created_at) | ||
| if !is_set?(:created_at) | ||
| set(:created_at, Time.now) | ||
| end | ||
| set(:updated_at, Time.now) | ||
@@ -9,0 +11,0 @@ end |
@@ -139,26 +139,15 @@ module Seabright | ||
| return if @intercepted_for_typing | ||
| self.class_eval do | ||
| alias_method :untyped_get, :get unless method_defined?(:untyped_get) | ||
| def get(k) | ||
| enforce_format(k,untyped_get(k)) | ||
| end | ||
| alias_method :untyped_mset, :mset unless method_defined?(:untyped_mset) | ||
| def mset(dat) | ||
| dat.merge!(dat) {|k,v1,v2| save_format(k,v1) } | ||
| untyped_mset(dat) | ||
| end | ||
| alias_method :untyped_set, :set unless method_defined?(:untyped_set) | ||
| def set(k,v) | ||
| untyped_set(k,save_format(k,v)) | ||
| end | ||
| alias_method :untyped_setnx, :setnx unless method_defined?(:untyped_setnx) | ||
| def setnx(k,v) | ||
| untyped_setnx(k,save_format(k,v)) | ||
| end | ||
| filter_gets do |obj, k, v| | ||
| obj.enforce_format(k, v) | ||
| end | ||
| filter_sets do |obj, k, v| | ||
| [k, obj.save_format(k,v)] | ||
| end | ||
| filter_msets do |obj, dat| | ||
| dat.merge!(dat) {|k,v1,v2| obj.save_format(k, v1) } | ||
| end | ||
| @intercepted_for_typing = true | ||
@@ -165,0 +154,0 @@ end |
@@ -6,2 +6,3 @@ module Seabright | ||
| def format_array(val) | ||
| return val if val.is_a?(Array) | ||
| val ? Yajl::Parser.new(:symbolize_keys => true).parse(val) : [] | ||
@@ -11,2 +12,3 @@ end | ||
| def save_array(val) | ||
| return val if val.is_a?(String) | ||
| Yajl::Encoder.encode(val) | ||
@@ -13,0 +15,0 @@ end |
@@ -6,7 +6,7 @@ module Seabright | ||
| def format_boolean(val) | ||
| val=="true" | ||
| (val === true or val === "true") ? true : false | ||
| end | ||
| def save_boolean(val) | ||
| val === true ? "true" : "false" | ||
| (val === true or val === "true") ? "true" : "false" | ||
| end | ||
@@ -13,0 +13,0 @@ |
@@ -6,2 +6,3 @@ module Seabright | ||
| def format_json(val) | ||
| return val unless val.is_a?(String) | ||
| val ? Yajl::Parser.new(:symbolize_keys => true).parse(val) : nil | ||
@@ -11,2 +12,3 @@ end | ||
| def save_json(val) | ||
| return val if val.is_a?(String) | ||
| Yajl::Encoder.encode(val) | ||
@@ -13,0 +15,0 @@ end |
| module Seabright | ||
| class RedisObject | ||
| VERSION = "1.5.1" | ||
| VERSION = "1.5.3" | ||
| end | ||
| end |
@@ -25,3 +25,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| RedisObject.dump_stores_to_files("/tmp") | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| end | ||
@@ -28,0 +28,0 @@ |
@@ -33,3 +33,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| end | ||
@@ -36,0 +36,0 @@ |
@@ -13,3 +13,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| @granddad = GrandDad.create("gramps") | ||
@@ -144,3 +144,3 @@ @dad = Daddy.create("dad") | ||
| # @dad.sons.indexed(:created_at,3,true).count.should eq(3) | ||
| @dad.sons.indexed(:created_at,3,true).count.should eq(3) | ||
@@ -147,0 +147,0 @@ Son.indexed(:created_at,3,true).count.should eq(3) |
@@ -31,3 +31,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| end | ||
@@ -34,0 +34,0 @@ |
@@ -19,5 +19,5 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| describe Seabright::Triggers do | ||
| describe Seabright::Dumping do | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| 5.times do | ||
@@ -68,3 +68,3 @@ d = DumpableObject.create(phone: Random.rand(100)*555, mailed: true, canceled_at: Time.now) | ||
| r.size.should > 100 | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| RedisObject.load_dump r, :yml | ||
@@ -75,3 +75,3 @@ DumpableObject.latest.generic_objects.count.should eq(1) | ||
| # r.size.should > 100 | ||
| # RedisObject.store.flushdb | ||
| # SpecHelper.flushdb | ||
| # RedisObject.load_dump r, :json | ||
@@ -78,0 +78,0 @@ # DumpableObject.latest.generic_objects.count.should eq(1) |
@@ -11,3 +11,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| @dad = Dad.create("daddy") | ||
@@ -14,0 +14,0 @@ @son = Son.create("sonny") |
@@ -16,3 +16,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| end | ||
@@ -19,0 +19,0 @@ |
@@ -38,3 +38,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| end | ||
@@ -41,0 +41,0 @@ |
@@ -13,3 +13,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
@@ -16,0 +16,0 @@ mozzarella = Topping.create(:mozzarella) |
@@ -19,12 +19,15 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| describe Seabright::Triggers do | ||
| before do | ||
| RedisObject.store.flushdb | ||
| @secret = SensitiveObject.create(test: Time.now, yay: true, stuff: {test: "1"}, worthless: "yup", sup: "dawg") | ||
| before(:each) do | ||
| SpecHelper.flushdb | ||
| end | ||
| let(:secret) do | ||
| SensitiveObject.create(test: Time.now, yay: true, stuff: {test: "1"}, worthless: "yup", sup: "dawg") | ||
| end | ||
| it "can sanitize a field or two willy nilly" do | ||
| @secret.stuff.should be_a(Hash) | ||
| @secret.sanitize! :stuff, :sup | ||
| @secret.stuff.should eq(nil) | ||
| secret.stuff.should be_a(Hash) | ||
| secret.sanitize! :stuff, :sup | ||
| secret.stuff.should eq(nil) | ||
@@ -35,7 +38,7 @@ end | ||
| @secret.test.should_not eq(nil) | ||
| @secret.yay.should eq(true) | ||
| @secret.sanitize_by_name! :burn | ||
| @secret.test.should eq(nil) | ||
| @secret.yay.should eq(false) | ||
| secret.test.should_not eq(nil) | ||
| secret.yay.should eq(true) | ||
| secret.sanitize_by_name! :burn | ||
| secret.test.should eq(nil) | ||
| secret.yay.should eq(false) | ||
@@ -42,0 +45,0 @@ end |
@@ -10,3 +10,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
@@ -13,0 +13,0 @@ (1..5).each do |n| |
@@ -38,3 +38,11 @@ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib' | ||
| module SpecHelper | ||
| def self.flushdb | ||
| RedisObject.store.flushdb | ||
| end | ||
| end | ||
| raise 'must specify TEST_DB' unless ENV['TEST_DB'] | ||
| RedisObject.configure_store({adapter:'Redis', db:ENV['TEST_DB']},:global,:alias) |
@@ -9,3 +9,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| end | ||
@@ -12,0 +12,0 @@ |
@@ -33,3 +33,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| end | ||
@@ -36,0 +36,0 @@ |
@@ -29,3 +29,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| end | ||
@@ -32,0 +32,0 @@ |
@@ -56,3 +56,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| @obj = TypedObject.create(TestData) | ||
@@ -59,0 +59,0 @@ @dad = Container.create("daddy") |
@@ -36,3 +36,3 @@ require File.dirname(__FILE__) + '/spec_helper' | ||
| before do | ||
| RedisObject.store.flushdb | ||
| SpecHelper.flushdb | ||
| @obj = ViewedObject.create(TestData) | ||
@@ -39,0 +39,0 @@ end |