fakeredis 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
1
  module FakeRedis
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -202,32 +202,25 @@ class Redis
202
202
  end
203
203
 
204
204
  def hgetall(key)
205
- case hash = @data[key]
206
- when nil then {}
207
- when Hash then hash
208
- else fail "Not a hash"
209
- end
205
+ data_type_check(key, Hash)
206
+ @data[key] || {}
210
207
  end
211
208
 
212
209
  def hget(key, field)
213
- return unless @data[key]
214
- fail "Not a hash" unless @data[key].is_a?(Hash)
215
- @data[key][field.to_s]
210
+ data_type_check(key, Hash)
211
+ @data[key] && @data[key][field.to_s]
216
212
  end
217
213
 
218
214
  def hdel(key, field)
219
- return unless @data[key]
220
- fail "Not a hash" unless @data[key].is_a?(Hash)
221
- @data[key].delete(field)
215
+ data_type_check(key, Hash)
216
+ @data[key] && @data[key].delete(field)
222
217
  remove_key_for_empty_collection(key)
223
218
  end
224
219
 
225
220
  def hkeys(key)
226
- case hash = @data[key]
227
- when nil then []
228
- when Hash then hash.keys
229
- else fail "Not a hash"
230
- end
221
+ data_type_check(key, Hash)
222
+ return [] if @data[key].nil?
223
+ @data[key].keys
231
224
  end
232
225
 
233
226
  def keys(pattern = "*")
@@ -260,31 +253,29 @@ class Redis
260
253
  end
261
254
 
262
255
  def llen(key)
263
- @data[key] ||= []
264
- fail "Not a list" unless @data[key].is_a?(Array)
256
+ data_type_check(key, Array)
257
+ return 0 unless @data[key]
265
258
  @data[key].size
266
259
  end
267
260
 
268
261
  def lrange(key, startidx, endidx)
269
- return unless @data[key]
270
- fail "Not a list" unless @data[key].is_a?(Array)
271
- @data[key][startidx..endidx]
262
+ data_type_check(key, Array)
263
+ @data[key] && @data[key][startidx..endidx]
272
264
  end
273
265
 
274
266
  def ltrim(key, start, stop)
275
- fail "Not a list" unless @data[key].is_a?(Array)
267
+ data_type_check(key, Array)
276
268
  return unless @data[key]
277
269
  @data[key] = @data[key][start..stop]
278
270
  end
279
271
 
280
272
  def lindex(key, index)
281
- fail "Not a list" unless @data[key].is_a?(Array)
282
- return unless @data[key]
283
- @data[key][index]
273
+ data_type_check(key, Array)
274
+ @data[key] && @data[key][index]
284
275
  end
285
276
 
286
277
  def linsert(key, where, pivot, value)
287
- fail "Not a list" unless @data[key].is_a?(Array)
278
+ data_type_check(key, Array)
288
279
  return unless @data[key]
289
280
  index = @data[key].index(pivot)
290
281
  case where
@@ -295,14 +286,14 @@ class Redis
295
286
  end
296
287
 
297
288
  def lset(key, index, value)
298
- fail "Not a list" unless @data[key].is_a?(Array)
289
+ data_type_check(key, Array)
299
290
  return unless @data[key]
300
- raise RuntimeError unless index < @data[key].size
291
+ raise RuntimeError if index >= @data[key].size
301
292
  @data[key][index] = value
302
293
  end
303
294
 
304
295
  def lrem(key, count, value)
305
- fail "Not a list" unless @data[key].is_a?(Array)
296
+ data_type_check(key, Array)
306
297
  return unless @data[key]
307
298
  old_size = @data[key].size
308
299
  diff =
@@ -320,107 +311,100 @@ class Redis
320
311
  end
321
312
 
322
313
  def rpush(key, value)
314
+ data_type_check(key, Array)
323
315
  @data[key] ||= []
324
- fail "Not a list" unless @data[key].is_a?(Array)
325
316
  @data[key].push(value)
317
+ @data[key].size
326
318
  end
327
319
 
328
320
  def rpushx(key, value)
321
+ data_type_check(key, Array)
329
322
  return unless @data[key]
330
- fail "Not a list" unless @data[key].is_a?(Array)
331
323
  rpush(key, value)
332
324
  end
333
325
 
334
326
  def lpush(key, value)
327
+ data_type_check(key, Array)
335
328
  @data[key] ||= []
336
- fail "Not a list" unless @data[key].is_a?(Array)
337
- @data[key] = [value] + @data[key]
329
+ @data[key].unshift(value)
338
330
  @data[key].size
339
331
  end
340
332
 
341
333
  def lpushx(key, value)
334
+ data_type_check(key, Array)
342
335
  return unless @data[key]
343
- fail "Not a list" unless @data[key].is_a?(Array)
344
336
  lpush(key, value)
345
337
  end
346
338
 
347
339
  def rpop(key)
348
- fail "Not a list" unless @data[key].is_a?(Array)
340
+ data_type_check(key, Array)
341
+ return unless @data[key]
349
342
  @data[key].pop
350
343
  end
351
344
 
352
345
  def rpoplpush(key1, key2)
353
- fail "Not a list" unless @data[key1].is_a?(Array)
354
- elem = @data[key1].pop
346
+ data_type_check(key1, Array)
347
+ elem = rpop(key1)
355
348
  lpush(key2, elem)
356
349
  end
357
350
 
358
351
  def lpop(key)
352
+ data_type_check(key, Array)
359
353
  return unless @data[key]
360
- fail "Not a list" unless @data[key].is_a?(Array)
361
- @data[key].delete_at(0)
354
+ @data[key].shift
362
355
  end
363
356
 
364
357
  def smembers(key)
365
- fail_unless_set(key)
366
- case set = @data[key]
367
- when nil then []
368
- when Set then set.to_a.reverse
369
- end
358
+ data_type_check(key, Set)
359
+ return [] unless @data[key]
360
+ @data[key].to_a.reverse
370
361
  end
371
362
 
372
363
  def sismember(key, value)
373
- fail_unless_set(key)
374
- case set = @data[key]
375
- when nil then false
376
- when Set then set.include?(value.to_s)
377
- end
364
+ data_type_check(key, Set)
365
+ return false unless @data[key]
366
+ @data[key].include?(value.to_s)
378
367
  end
379
368
 
380
369
  def sadd(key, value)
381
- fail_unless_set(key)
382
- case set = @data[key]
383
- when nil then @data[key] = Set.new([value.to_s]); true
384
- when Set then !!set.add?(value.to_s)
370
+ data_type_check(key, Set)
371
+ if @data[key]
372
+ !!@data[key].add?(value.to_s)
373
+ else
374
+ @data[key] = Set.new([value.to_s])
375
+ true
385
376
  end
386
377
  end
387
378
 
388
379
  def srem(key, value)
389
- fail_unless_set(key)
390
- deleted =
391
- case set = @data[key]
392
- when nil then false
393
- when Set then !!set.delete?(value.to_s)
394
- end
395
-
380
+ data_type_check(key, Set)
381
+ deleted = !!(@data[key] && @data[key].delete?(value.to_s))
396
382
  remove_key_for_empty_collection(key)
397
383
  deleted
398
384
  end
399
385
 
400
386
  def smove(source, destination, value)
401
- fail_unless_set(destination)
387
+ data_type_check(destination, Set)
402
388
  result = self.srem(source, value)
403
389
  self.sadd(destination, value) if result
404
390
  result
405
391
  end
406
392
 
407
393
  def spop(key)
408
- fail_unless_set(key)
394
+ data_type_check(key, Set)
409
395
  elem = srandmember(key)
410
396
  srem(key, elem)
411
397
  elem
412
398
  end
413
399
 
414
400
  def scard(key)
415
- fail_unless_set(key)
416
- case set = @data[key]
417
- when nil then 0
418
- when Set then set.size
419
- end
401
+ data_type_check(key, Set)
402
+ return 0 unless @data[key]
403
+ @data[key].size
420
404
  end
421
405
 
422
406
  def sinter(*keys)
423
- keys.each { |k| fail_unless_set(k) }
407
+ keys.each { |k| data_type_check(k, Set) }
424
408
  return Set.new if keys.any? { |k| @data[k].nil? }
425
409
  keys = keys.map { |k| @data[k] || Set.new }
426
410
  keys.inject do |set, key|
@@ -429,13 +413,13 @@ class Redis
429
413
  end
430
414
 
431
415
  def sinterstore(destination, *keys)
432
- fail_unless_set(destination)
416
+ data_type_check(destination, Set)
433
417
  result = sinter(*keys)
434
418
  @data[destination] = Set.new(result)
435
419
  end
436
420
 
437
421
  def sunion(*keys)
438
- keys.each { |k| fail_unless_set(k) }
422
+ keys.each { |k| data_type_check(k, Set) }
439
423
  keys = keys.map { |k| @data[k] || Set.new }
440
424
  keys.inject(Set.new) do |set, key|
441
425
  set | key
@@ -443,13 +427,13 @@ class Redis
443
427
  end
444
428
 
445
429
  def sunionstore(destination, *keys)
446
- fail_unless_set(destination)
430
+ data_type_check(destination, Set)
447
431
  result = sunion(*keys)
448
432
  @data[destination] = Set.new(result)
449
433
  end
450
434
 
451
435
  def sdiff(key1, *keys)
452
- [key1, *keys].each { |k| fail_unless_set(k) }
436
+ [key1, *keys].each { |k| data_type_check(k, Set) }
453
437
  keys = keys.map { |k| @data[k] || Set.new }
454
438
  keys.inject(@data[key1]) do |memo, set|
455
439
  memo - set
@@ -457,17 +441,15 @@ class Redis
457
441
  end
458
442
 
459
443
  def sdiffstore(destination, key1, *keys)
460
- fail_unless_set(destination)
444
+ data_type_check(destination, Set)
461
445
  result = sdiff(key1, *keys)
462
446
  @data[destination] = Set.new(result)
463
447
  end
464
448
 
465
449
  def srandmember(key)
466
- fail_unless_set(key)
467
- case set = @data[key]
468
- when nil then nil
469
- when Set then set.to_a[rand(set.size)]
470
- end
450
+ data_type_check(key, Set)
451
+ return nil unless @data[key]
452
+ @data[key].to_a[rand(@data[key].size)]
471
453
  end
472
454
 
473
455
  def del(*keys)
@@ -527,69 +509,71 @@ class Redis
527
509
  end
528
510
 
529
511
  def hset(key, field, value)
512
+ data_type_check(key, Hash)
530
513
  field = field.to_s
531
- case hash = @data[key]
532
- when nil then @data[key] = { field => value.to_s }; true
533
- when Hash then result = !hash.include?(field); hash[field] = value.to_s; result
534
- else fail "Not a hash"
514
+ if @data[key]
515
+ result = !@data[key].include?(field)
516
+ @data[key][field] = value.to_s
517
+ result
518
+ else
519
+ @data[key] = { field => value.to_s }
520
+ true
535
521
  end
536
522
  end
537
523
 
538
524
  def hsetnx(key, field, value)
525
+ data_type_check(key, Hash)
539
526
  field = field.to_s
540
- return false if (@data[key][field] rescue false)
527
+ return false if @data[key] && @data[key][field]
541
528
  hset(key, field, value)
542
529
  end
543
530
 
544
531
  def hmset(key, *fields)
532
+ data_type_check(key, Hash)
545
533
  @data[key] ||= {}
546
- fail "Not a hash" unless @data[key].is_a?(Hash)
547
534
  fields.each_slice(2) do |field|
548
535
  @data[key][field[0].to_s] = field[1].to_s
549
536
  end
550
537
  end
551
538
 
552
539
  def hmget(key, *fields)
540
+ data_type_check(key, Hash)
553
541
  values = []
554
- fields.each do |field|
542
+ fields.map do |field|
555
543
  field = field.to_s
556
- case hash = @data[key]
557
- when nil then values << nil
558
- when Hash then values << hash[field]
559
- else fail "Not a hash"
544
+ if @data[key]
545
+ @data[key][field]
546
+ else
547
+ nil
560
548
  end
561
549
  end
562
- values
563
550
  end
564
551
 
565
552
  def hlen(key)
566
- case hash = @data[key]
567
- when nil then 0
568
- when Hash then hash.size
569
- else fail "Not a hash"
570
- end
553
+ data_type_check(key, Hash)
554
+ return 0 unless @data[key]
555
+ @data[key].size
571
556
  end
572
557
 
573
558
  def hvals(key)
574
- case hash = @data[key]
575
- when nil then []
576
- when Hash then hash.values
577
- else fail "Not a hash"
578
- end
559
+ data_type_check(key, Hash)
560
+ return [] unless @data[key]
561
+ @data[key].values
579
562
  end
580
563
 
581
564
  def hincrby(key, field, increment)
582
- case hash = @data[key]
583
- when nil then @data[key] = { field => increment.to_s }
584
- when Hash then hash[field] = (hash[field].to_i + increment.to_i).to_s
585
- else fail "Not a hash"
565
+ data_type_check(key, Hash)
566
+ if @data[key]
567
+ @data[key][field] = (@data[key][field.to_s].to_i + increment.to_i).to_s
568
+ else
569
+ @data[key] = { field => increment.to_s }
586
570
  end
587
571
  @data[key][field].to_i
588
572
  end
589
573
 
590
574
  def hexists(key, field)
591
- return unless @data[key]
592
- fail "Not a hash" unless @data[key].is_a?(Hash)
575
+ data_type_check(key, Hash)
576
+ return false unless @data[key]
593
577
  @data[key].key?(field)
594
578
  end
595
579
 
@@ -705,7 +689,7 @@ class Redis
705
689
  end
706
690
 
707
691
  def zadd(key, score, value)
708
- fail_unless_zset(key)
692
+ data_type_check(key, ZSet)
709
693
  @data[key] ||= ZSet.new
710
694
  exists = @data[key].key?(value.to_s)
711
695
  @data[key][value.to_s] = score.to_i
@@ -713,7 +697,7 @@ class Redis
713
697
  end
714
698
 
715
699
  def zrem(key, value)
716
- fail_unless_zset(key)
700
+ data_type_check(key, ZSet)
717
701
  exists = false
718
702
  exists = @data[key].delete(value.to_s) if @data[key]
719
703
  remove_key_for_empty_collection(key)
@@ -721,40 +705,40 @@ class Redis
721
705
  end
722
706
 
723
707
  def zcard(key)
724
- fail_unless_zset(key)
708
+ data_type_check(key, ZSet)
725
709
  @data[key] ? @data[key].size : 0
726
710
  end
727
711
 
728
712
  def zscore(key, value)
729
- fail_unless_zset(key)
713
+ data_type_check(key, ZSet)
730
714
  @data[key] && @data[key][value.to_s].to_s
731
715
  end
732
716
 
733
717
  def zcount(key, min, max)
734
- fail_unless_zset(key)
718
+ data_type_check(key, ZSet)
735
719
  return 0 unless @data[key]
736
720
  zrange_select_by_score(key, min, max).size
737
721
  end
738
722
 
739
723
  def zincrby(key, num, value)
740
- fail_unless_zset(key)
724
+ data_type_check(key, ZSet)
741
725
  @data[key][value.to_s] ||= 0
742
726
  @data[key][value.to_s] += num
743
727
  @data[key][value.to_s].to_s
744
728
  end
745
729
 
746
730
  def zrank(key, value)
747
- fail_unless_zset(key)
731
+ data_type_check(key, ZSet)
748
732
  @data[key].keys.sort_by {|k| @data[key][k] }.index(value.to_s)
749
733
  end
750
734
 
751
735
  def zrevrank(key, value)
752
- fail_unless_zset(key)
736
+ data_type_check(key, ZSet)
753
737
  @data[key].keys.sort_by {|k| -@data[key][k] }.index(value.to_s)
754
738
  end
755
739
 
756
740
  def zrange(key, start, stop, with_scores = nil)
757
- fail_unless_zset(key)
741
+ data_type_check(key, ZSet)
758
742
  return [] unless @data[key]
759
743
 
760
744
  if with_scores
@@ -765,7 +749,7 @@ class Redis
765
749
  end
766
750
 
767
751
  def zrevrange(key, start, stop, with_scores = nil)
768
- fail_unless_zset(key)
752
+ data_type_check(key, ZSet)
769
753
  return [] unless @data[key]
770
754
 
771
755
  if with_scores
@@ -776,7 +760,7 @@ class Redis
776
760
  end
777
761
 
778
762
  def zrangebyscore(key, min, max, with_scores = nil)
779
- fail_unless_zset(key)
763
+ data_type_check(key, ZSet)
780
764
  return [] unless @data[key]
781
765
 
782
766
  range = zrange_select_by_score(key, min, max)
@@ -788,7 +772,7 @@ class Redis
788
772
  end
789
773
 
790
774
  def zrevrangebyscore(key, max, min, with_scores = nil)
791
- fail_unless_zset(key)
775
+ data_type_check(key, ZSet)
792
776
  return [] unless @data[key]
793
777
 
794
778
  range = zrange_select_by_score(key, min, max)
@@ -800,7 +784,7 @@ class Redis
800
784
  end
801
785
 
802
786
  def zinterstore(out, _, *keys)
803
- fail_unless_zset(out)
787
+ data_type_check(out, ZSet)
804
788
 
805
789
  hashes = keys.map do |src|
806
790
  case @data[src]
@@ -824,22 +808,6 @@ class Redis
824
808
 
825
809
  private
826
810
 
827
- def is_a_set?(key)
828
- @data[key].is_a?(Set) || @data[key].nil?
829
- end
830
-
831
- def fail_unless_set(key)
832
- fail "Not a set" unless is_a_set?(key)
833
- end
834
-
835
- def is_a_zset?(key)
836
- @data[key].is_a?(ZSet) || @data[key].nil?
837
- end
838
-
839
- def fail_unless_zset(key)
840
- fail "Not a sorted set" unless is_a_zset?(key)
841
- end
842
-
843
811
  def zrange_select_by_score(key, min, max)
844
812
  @data[key].reject {|_,v| v < min || v > max }
845
813
  end
@@ -847,6 +815,12 @@ class Redis
847
815
  def remove_key_for_empty_collection(key)
848
816
  del(key) if @data[key] && @data[key].empty?
849
817
  end
818
+
819
+ def data_type_check(key, klass)
820
+ if @data[key] && !@data[key].is_a?(klass)
821
+ fail "Operation against a key holding the wrong kind of value: Expected #{klass} at #{key}."
822
+ end
823
+ end
850
824
  end
851
825
  end
852
826
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fakeredis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-01 00:00:00.000000000 Z
12
+ date: 2012-03-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &70149263528920 !ruby/object:Gem::Requirement
16
+ requirement: &70160189787260 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.2.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70149263528920
24
+ version_requirements: *70160189787260
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70149263528400 !ruby/object:Gem::Requirement
27
+ requirement: &70160189786740 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: 2.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70149263528400
35
+ version_requirements: *70160189786740
36
36
  description: Fake (In-memory) driver for redis-rb. Useful for testing environment
37
37
  and machines without Redis.
38
38
  email: