Skip to content

Commit

Permalink
Merge 278acdd into 296d508
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffLuckett committed Nov 13, 2018
2 parents 296d508 + 278acdd commit 4a9f240
Show file tree
Hide file tree
Showing 13 changed files with 70 additions and 101 deletions.
24 changes: 8 additions & 16 deletions lib/mock_redis/geospatial_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,13 @@ def geoadd(key, *args)
zadd(key, scored_points)
end

def geodist(key, *args)
if args.length < 2
raise Redis::CommandError,
"ERR wrong number of arguments for 'geodist' command"
end

raise Redis::CommandError, 'ERR syntax error' if args.length > 3

to_meter = 1
to_meter = parse_unit(args[2]) if args.length == 3
def geodist(key, member1, member2, unit = 'm')
to_meter = parse_unit(unit)

return nil if zcard(key).zero?

score1 = zscore(key, args[0])
score2 = zscore(key, args[1])
score1 = zscore(key, member1)
score2 = zscore(key, member2)
return nil if score1.nil? || score2.nil?
hash1 = { bits: score1.to_i, step: STEP }
hash2 = { bits: score2.to_i, step: STEP }
Expand All @@ -49,12 +41,12 @@ def geodist(key, *args)
format('%.4f', distance)
end

def geohash(key, *members)
def geohash(key, members)
lng_range = (-180..180)
lat_range = (-90..90)
geoalphabet = '0123456789bcdefghjkmnpqrstuvwxyz'

members.map do |member|
Array(members).map do |member|
score = zscore(key, member)
next nil unless score
score = score.to_i
Expand All @@ -71,8 +63,8 @@ def geohash(key, *members)
end
end

def geopos(key, *members)
members.map do |member|
def geopos(key, members)
Array(members).map do |member|
score = zscore(key, member)
next nil unless score
hash = { bits: score.to_i, step: STEP }
Expand Down
8 changes: 4 additions & 4 deletions lib/mock_redis/hash_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ module HashMethods
include Assertions
include UtilityMethods

def hdel(key, field)
def hdel(key, *fields)
with_hash_at(key) do |hash|
if field.is_a?(Array)
if fields.is_a?(Array)
orig_size = hash.size
fields = field.map(&:to_s)
fields = fields.map(&:to_s)
hash.delete_if { |k, _v| fields.include?(k) }
orig_size - hash.size
else
hash.delete(field.to_s) ? 1 : 0
hash.delete(fields[0].to_s) ? 1 : 0
end
end
end
Expand Down
8 changes: 0 additions & 8 deletions lib/mock_redis/indifferent_hash.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
class MockRedis
class IndifferentHash < Hash
def [](key)
super(key.to_s)
end

def []=(key, value)
super(key.to_s, value)
end

def has_key?(key)
super(key.to_s)
end
Expand Down
9 changes: 1 addition & 8 deletions lib/mock_redis/string_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,6 @@ def get(key)
data[key]
end

def [](key)
get(key)
end

def getbit(key, offset)
assert_stringy(key)

Expand Down Expand Up @@ -202,6 +198,7 @@ def mapped_msetnx(hash)
end

def set(key, value, options = {})
key = key.to_s
return_true = false
options = options.dup
if options.delete(:nx)
Expand Down Expand Up @@ -232,10 +229,6 @@ def set(key, value, options = {})
return_true ? true : 'OK'
end

def []=(key, value, options = {})
set(key, value, options)
end

def setbit(key, offset, value)
assert_stringy(key, 'ERR bit is not an integer or out of range')
retval = getbit(key, offset)
Expand Down
35 changes: 24 additions & 11 deletions lib/mock_redis/transaction_wrapper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ def respond_to?(method, include_private = false)
def initialize(db)
@db = db
@transaction_futures = []
@in_multi = false
@multi_stack = []
@multi_block_given = false
end

def method_missing(method, *args, &block)
if @in_multi
if in_multi?
future = MockRedis::Future.new([method, *args])
@transaction_futures << future

Expand All @@ -35,23 +35,25 @@ def initialize_copy(source)
super
@db = @db.clone
@transaction_futures = @transaction_futures.clone
@multi_stack = @multi_stack.clone
end

def discard
unless @in_multi
unless in_multi?
raise Redis::CommandError, 'ERR DISCARD without MULTI'
end
@in_multi = false
@multi_block_given = false
pop_multi

@transaction_futures = []
'OK'
end

def exec
unless @in_multi
unless in_multi?
raise Redis::CommandError, 'ERR EXEC without MULTI'
end
@in_multi = false
pop_multi
return if in_multi?
@multi_block_given = false

responses = @transaction_futures.map do |future|
Expand All @@ -68,12 +70,21 @@ def exec
responses
end

def in_multi?
@multi_stack.any?
end

def push_multi
@multi_stack.push(@multi_stack.size + 1)
end

def pop_multi
@multi_stack.pop
end

def multi
if @in_multi
raise Redis::CommandError, 'ERR MULTI calls can not be nested'
end
@in_multi = true
if block_given?
push_multi
@multi_block_given = true
begin
yield(self)
Expand All @@ -83,6 +94,8 @@ def multi
raise e
end
else
raise Redis::CommandError, 'ERR MULTI calls can not be nested' if in_multi?
push_multi
'OK'
end
end
Expand Down
2 changes: 1 addition & 1 deletion mock_redis.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Gem::Specification.new do |s|
s.required_ruby_version = '>= 2.2'

s.add_development_dependency 'rake', '>= 10', '< 12'
s.add_development_dependency 'redis', '~> 3.3.0'
s.add_development_dependency 'redis', '~>4.0.1'
s.add_development_dependency 'rspec', '~> 3.0'
s.add_development_dependency 'rspec-its', '~> 1.0'
end
8 changes: 4 additions & 4 deletions spec/commands/geodist_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,13 @@

context 'with less than 3 arguments' do
[1, 2].each do |count|
let(:message) { "ERR wrong number of arguments for 'geodist' command" }

context "with #{count} arguments" do
it 'raises an error' do
args = list.slice(0, count)
expect { @redises.geodist(*args) }
.to raise_error(Redis::CommandError, message)
.to raise_error(
ArgumentError, "wrong number of arguments (given #{args.count}, expected 3..4)"
)
end
end
end
Expand All @@ -98,7 +98,7 @@
it 'raises an error' do
args = list.slice(0, 5)
expect { @redises.geodist(*args) }
.to raise_error(Redis::CommandError, message)
.to raise_error(ArgumentError, 'wrong number of arguments (given 5, expected 3..4)')
end
end
end
Expand Down
8 changes: 4 additions & 4 deletions spec/commands/geohash_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
end

it 'returns decoded coordinates pairs for each point' do
results = @redises.geohash(key, 'SF', 'LA')
results = @redises.geohash(key, %w[SF LA])
expect(results).to be == expected_result
end

context 'with non-existing points only' do
it 'returns array filled with nils' do
results = @redises.geohash(key, 'FF', 'FA')
results = @redises.geohash(key, %w[FF FA])
expect(results).to be == [nil, nil]
end
end
Expand All @@ -34,7 +34,7 @@
end

it 'returns mixture of nil and coordinates pair' do
results = @redises.geohash(key, 'SF', 'FA')
results = @redises.geohash(key, %w[SF FA])
expect(results).to be == expected_result
end
end
Expand All @@ -45,7 +45,7 @@
before { @redises.del(key) }

it 'returns empty array' do
results = @redises.geohash(key, 'SF', 'LA')
results = @redises.geohash(key, %w[SF LA])
expect(results).to be == [nil, nil]
end
end
Expand Down
8 changes: 4 additions & 4 deletions spec/commands/geopos_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@
end

it 'returns decoded coordinates pairs for each point' do
coords = @redises.geopos(key, 'SF', 'LA')
coords = @redises.geopos(key, %w[SF LA])
expect(coords).to be == expected_result
end

context 'with non-existing points only' do
it 'returns array filled with nils' do
coords = @redises.geopos(key, 'FF', 'FA')
coords = @redises.geopos(key, %w[FF FA])
expect(coords).to be == [nil, nil]
end
end
Expand All @@ -37,7 +37,7 @@
end

it 'returns mixture of nil and coordinates pair' do
coords = @redises.geopos(key, 'SF', 'FA')
coords = @redises.geopos(key, %w[SF FA])
expect(coords).to be == expected_result
end
end
Expand All @@ -48,7 +48,7 @@
before { @redises.del(key) }

it 'returns empty array' do
coords = @redises.geopos(key, 'SF', 'LA')
coords = @redises.geopos(key, %w[SF LA])
expect(coords).to be == [nil, nil]
end
end
Expand Down
21 changes: 0 additions & 21 deletions spec/commands/hash_operator_spec.rb

This file was deleted.

4 changes: 2 additions & 2 deletions spec/commands/hdel_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@
end

it 'supports a variable number of arguments' do
@redises.hdel(@key, %w[k1 k2])
@redises.hdel(@key, 'k1', 'k2')
@redises.get(@key).should be_nil
end

it 'treats variable arguments as strings' do
field = 2
@redises.hset(@key, field, 'two')
@redises.hdel(@key, [field])
@redises.hdel(@key, field)
@redises.hget(@key, field).should be_nil
end

Expand Down
2 changes: 1 addition & 1 deletion spec/commands/pipelined_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
end

it 'returns an array of the array replies' do
results = @redises.pipelined do |redis|
results = @redises.pipelined do |_redis|
@redises.lrange(key1, 0, -1)
@redises.lrange(key2, 0, -1)
end
Expand Down

0 comments on commit 4a9f240

Please sign in to comment.