Skip to content

Commit

Permalink
Add deprecation warnings for DistRedis.
Browse files Browse the repository at this point in the history
  • Loading branch information
djanowski committed Apr 23, 2010
1 parent 1f166dc commit 724f17f
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 118 deletions.
4 changes: 4 additions & 0 deletions lib/redis.rb
Expand Up @@ -6,6 +6,10 @@ class Redis
def self.new(*attrs)
Client.new(*attrs)
end

def self.deprecate(message, trace = caller[0])
$stderr.puts "\n#{message} (in #{trace})"
end
end

begin
Expand Down
6 changes: 4 additions & 2 deletions lib/redis/client.rb
Expand Up @@ -496,8 +496,10 @@ def log(str, level = :info)
@logger.send(level, str.to_s) if @logger
end

def deprecated(old, new, trace = caller[0])
$stderr.puts "\nRedis: The method #{old} is deprecated. Use #{new} instead (in #{trace})"
def deprecated(old, new = nil, trace = caller[0])
message = "The method #{old} is deprecated and will be removed in 2.0"
message << " - use #{new} instead" if new
Redis.deprecate(message, trace)
end

def requires_timeout_reset?(command)
Expand Down
118 changes: 8 additions & 110 deletions lib/redis/dist_redis.rb
@@ -1,115 +1,13 @@
require 'redis/hash_ring'
Redis.deprecate %q{"redis/dist_redis" is deprecated. Require "redis/distributed" and replace DistRedis for Redis::Distributed.}, caller[0]

class Redis
class DistRedis
attr_reader :ring
def initialize(opts={})
hosts = []

db = opts[:db] || nil
timeout = opts[:timeout] || nil

raise "No hosts given" unless opts[:hosts]

opts[:hosts].each do |h|
host, port = h.split(':')
hosts << Client.new(:host => host, :port => port, :db => db, :timeout => timeout)
end

@ring = HashRing.new hosts
end

def node_for_key(key)
key = $1 if key =~ /\{(.*)?\}/
@ring.get_node(key)
end

def add_server(server)
server, port = server.split(':')
@ring.add_node Client.new(:host => server, :port => port)
end

def method_missing(sym, *args, &blk)
if redis = node_for_key(args.first.to_s)
redis.send sym, *args, &blk
else
super
end
end

def node_keys(glob)
@ring.nodes.map do |red|
red.keys(glob)
end
end

def keys(glob)
node_keys(glob).flatten
end

def save
on_each_node :save
end

def bgsave
on_each_node :bgsave
end

def quit
on_each_node :quit
end

def flush_all
on_each_node :flush_all
end
alias_method :flushall, :flush_all
require "redis/hash_ring"
require "redis/distributed"

def flush_db
on_each_node :flush_db
end
alias_method :flushdb, :flush_db

def delete_cloud!
@ring.nodes.each do |red|
red.keys("*").each do |key|
red.del key
end
end
end

def on_each_node(command, *args)
@ring.nodes.each do |red|
red.send(command, *args)
end
end

def mset()

end

def mget(*keyz)
results = {}
kbn = keys_by_node(keyz)
kbn.each do |node, node_keyz|
node.mapped_mget(*node_keyz).each do |k, v|
results[k] = v
end
end
keyz.flatten.map { |k| results[k] }
end

def keys_by_node(*keyz)
keyz.flatten.inject({}) do |kbn, k|
node = node_for_key(k)
next if kbn[node] && kbn[node].include?(k)
kbn[node] ||= []
kbn[node] << k
kbn
end
end

def type(key)
method_missing(:type, key)
class Redis
class DistRedis < Redis::Distributed
def initialize(*args)
Redis.deprecate "DistRedis is deprecated in favor of Redis::Distributed.", caller[1]
super(*args)
end
end
end
Expand Down
115 changes: 115 additions & 0 deletions lib/redis/distributed.rb
@@ -0,0 +1,115 @@
require 'redis/hash_ring'

class Redis
class Distributed
attr_reader :ring
def initialize(opts={})
hosts = []

db = opts[:db] || nil
timeout = opts[:timeout] || nil

raise "No hosts given" unless opts[:hosts]

opts[:hosts].each do |h|
host, port = h.split(':')
hosts << Client.new(:host => host, :port => port, :db => db, :timeout => timeout)
end

@ring = HashRing.new hosts
end

def node_for_key(key)
key = $1 if key =~ /\{(.*)?\}/
@ring.get_node(key)
end

def add_server(server)
server, port = server.split(':')
@ring.add_node Client.new(:host => server, :port => port)
end

def method_missing(sym, *args, &blk)
if redis = node_for_key(args.first.to_s)
redis.send sym, *args, &blk
else
super
end
end

def node_keys(glob)
@ring.nodes.map do |red|
red.keys(glob)
end
end

def keys(glob)
node_keys(glob).flatten
end

def save
on_each_node :save
end

def bgsave
on_each_node :bgsave
end

def quit
on_each_node :quit
end

def flush_all
on_each_node :flush_all
end
alias_method :flushall, :flush_all

def flush_db
on_each_node :flush_db
end
alias_method :flushdb, :flush_db

def delete_cloud!
@ring.nodes.each do |red|
red.keys("*").each do |key|
red.del key
end
end
end

def on_each_node(command, *args)
@ring.nodes.each do |red|
red.send(command, *args)
end
end

def mset()

end

def mget(*keyz)
results = {}
kbn = keys_by_node(keyz)
kbn.each do |node, node_keyz|
node.mapped_mget(*node_keyz).each do |k, v|
results[k] = v
end
end
keyz.flatten.map { |k| results[k] }
end

def keys_by_node(*keyz)
keyz.flatten.inject({}) do |kbn, k|
node = node_for_key(k)
next if kbn[node] && kbn[node].include?(k)
kbn[node] ||= []
kbn[node] << k
kbn
end
end

def type(key)
method_missing(:type, key)
end
end
end
26 changes: 20 additions & 6 deletions test/redis_test.rb
Expand Up @@ -975,6 +975,20 @@ def redis.call_command(attrs)
end

context "Distributed" do
test "deprecation warning" do
capture_stderr do
require "redis/dist_redis"

assert $stderr.string[%q{"redis/dist_redis" is deprecated. Require "redis/distributed" and replace DistRedis for Redis::Distributed.}]
end

capture_stderr do
DistRedis.new(:hosts=> ["localhost:6379", "127.0.0.1:6379"], :db => 15)

assert $stderr.string[%q{DistRedis is deprecated in favor of Redis::Distributed.}]
end
end

test "handle multiple servers" do
require "redis/dist_redis"

Expand Down Expand Up @@ -1070,7 +1084,7 @@ def redis.call_command(attrs)
capture_stderr do
@r.set_add("foo", "s1")

assert $stderr.string["Redis: The method set_add is deprecated. Use sadd instead"]
assert $stderr.string["The method set_add is deprecated and will be removed in 2.0 - use sadd instead"]
end
end

Expand All @@ -1083,7 +1097,7 @@ def redis.call_command(attrs)
sleep 2

assert_nil @r.get("foo")
assert $stderr.string["Redis: The method set with an expire is deprecated. Use set_with_expire instead"]
assert $stderr.string["The method set with an expire is deprecated and will be removed in 2.0 - use set_with_expire instead"]
end
end

Expand All @@ -1092,7 +1106,7 @@ def redis.call_command(attrs)
@r.incr("foo", 2)

assert_equal "2", @r.get("foo")
assert $stderr.string["Redis: The method incr with an increment is deprecated. Use incrby instead"]
assert $stderr.string["The method incr with an increment is deprecated and will be removed in 2.0 - use incrby instead"]
end
end

Expand All @@ -1101,7 +1115,7 @@ def redis.call_command(attrs)
@r.decr("foo", 2)

assert_equal "-2", @r.get("foo")
assert $stderr.string["Redis: The method decr with a decrement is deprecated. Use decrby instead"]
assert $stderr.string["The method decr with a decrement is deprecated and will be removed in 2.0 - use decrby instead"]
end
end

Expand All @@ -1111,7 +1125,7 @@ def redis.call_command(attrs)

assert_equal "s1", @r.get("foo")
assert_equal "s2", @r.get("bar")
assert $stderr.string["Redis: The method mset with a hash is deprecated. Use mapped_mset instead"]
assert $stderr.string["The method mset with a hash is deprecated and will be removed in 2.0 - use mapped_mset instead"]
end
end

Expand All @@ -1121,7 +1135,7 @@ def redis.call_command(attrs)

assert_equal "s1", @r.get("foo")
assert_equal "s2", @r.get("bar")
assert $stderr.string["Redis: The method msetnx with a hash is deprecated. Use mapped_msetnx instead"]
assert $stderr.string["The method msetnx with a hash is deprecated and will be removed in 2.0 - use mapped_msetnx instead"]
end
end
end
Expand Down

0 comments on commit 724f17f

Please sign in to comment.