redis-objects 1.4.3 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.rdoc +20 -0
- data/README.md +28 -8
- data/lib/redis/base_object.rb +6 -0
- data/lib/redis/counter.rb +0 -4
- data/lib/redis/enumerable_object.rb +28 -0
- data/lib/redis/hash_key.rb +2 -22
- data/lib/redis/helpers/core_commands.rb +11 -10
- data/lib/redis/list.rb +2 -19
- data/lib/redis/lock.rb +0 -8
- data/lib/redis/objects.rb +9 -2
- data/lib/redis/objects/version.rb +1 -1
- data/lib/redis/set.rb +4 -21
- data/lib/redis/sorted_set.rb +2 -9
- data/lib/redis/value.rb +0 -5
- data/spec/redis_objects_custom_serializer.rb +198 -0
- data/spec/redis_objects_model_spec.rb +10 -3
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1645ef709707def1356b48d10f02ed09c7cffc5e83568dc3b2d14c030fdff3d7
|
4
|
+
data.tar.gz: f1ef896dfaa12b573631417eaae3039bf16fd0d07ea4019956aa002c24a057f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9d492b56d5c712d5c33d19ac682fd45eb937ead9dba84d7123346a40aaf88020dd6be82c8697342a130470f8a23bf0d3cc701e6691cf15e685efc1aec64737a
|
7
|
+
data.tar.gz: c5033f81a4d8c9aba6798aca9bf49cf5613217b6ef388252df92fe099111b4a85c0709e96fc64fcfe2bb0cc54720a536f2b08ea6c49976d44604347d7049b978
|
data/.travis.yml
CHANGED
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,25 @@
|
|
1
1
|
= Changelog for Redis::Objects
|
2
2
|
|
3
|
+
== 1.5.0 (18 Sep 2019)
|
4
|
+
|
5
|
+
* updated README on expireat [Nate Wiger]
|
6
|
+
|
7
|
+
* Add option for using a custom serializer [Tomás Rojas]
|
8
|
+
|
9
|
+
* DRY up objects to enable custom prefixing when desired [Tomás Rojas]
|
10
|
+
|
11
|
+
* Allow spop to return multiple members [Evan Paul]
|
12
|
+
|
13
|
+
* Rename #delete! to #redis_delete_objects [Mattias Pfeiffer]
|
14
|
+
|
15
|
+
* Make deletion simpler with just 1 call to Redis [Mattias Pfeiffer]
|
16
|
+
|
17
|
+
* Move `CoreCommands` inclusion to `BaseObject` [Tomás Rojas]
|
18
|
+
|
19
|
+
* Move `Enumerable` functionality to `EnumerableObject` [Tomás Rojas]
|
20
|
+
|
21
|
+
* Move `attr_reader`s to `Redis::BaseObject` [Tomás Rojas]
|
22
|
+
|
3
23
|
== 1.4.3 (7 Oct 2018)
|
4
24
|
|
5
25
|
* Merge pull request #235 from johnc219/fix/end-time-expiration Add expiration in seconds to obtain end_time [Nate Wiger]
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ This is **not** an ORM. People that are wrapping ORM’s around Redis are missin
|
|
9
9
|
The killer feature of Redis is that it allows you to perform _atomic_ operations
|
10
10
|
on _individual_ data structures, like counters, lists, and sets. The **atomic** part is HUGE.
|
11
11
|
Using an ORM wrapper that retrieves a "record", updates values, then sends those values back,
|
12
|
-
_removes_ the atomicity,
|
12
|
+
_removes_ the atomicity, and thus the major advantage of Redis. Just use MySQL, k?
|
13
13
|
|
14
14
|
This gem provides a Rubyish interface to Redis, by mapping [Redis data types](http://redis.io/commands)
|
15
15
|
to Ruby objects, via a thin layer over the `redis` gem. It offers several advantages
|
@@ -550,20 +550,40 @@ Use :expiration and :expireat options to set default expiration.
|
|
550
550
|
|
551
551
|
~~~ruby
|
552
552
|
value :value_with_expiration, :expiration => 1.hour
|
553
|
-
value :value_with_expireat, :expireat => Time.now + 1.hour
|
553
|
+
value :value_with_expireat, :expireat => lambda { Time.now + 1.hour }
|
554
554
|
~~~
|
555
555
|
|
556
|
-
:warning: `
|
557
|
-
In this example, it will be one hour after
|
556
|
+
:warning: In the above example, `expiration` is evaluated at class load time.
|
557
|
+
In this example, it will be one hour after loading the class, not after one hour
|
558
|
+
after setting a value. If you want to expire one hour after setting the value,
|
559
|
+
please use `:expireat` with `lambda`.
|
560
|
+
|
561
|
+
Custom serialization
|
562
|
+
--------------------
|
563
|
+
You can customize how values are serialized by setting `serializer: CustomSerializer`.
|
564
|
+
The default is `Marshal` from the standard lib, but it can be anything that responds to `dump` and
|
565
|
+
`load`. `JSON` and `YAML` are popular options.
|
558
566
|
|
559
|
-
If you
|
567
|
+
If you need to pass extra arguments to `dump` or `load`, you can set
|
568
|
+
`marshal_dump_args: { foo: 'bar' }` and `marshal_load_args: { foo: 'bar' }` respectively.
|
560
569
|
|
561
570
|
~~~ruby
|
562
|
-
|
571
|
+
class CustomSerializer
|
572
|
+
def self.dump(value)
|
573
|
+
# custom code for serializing
|
574
|
+
end
|
575
|
+
|
576
|
+
def self.load(value)
|
577
|
+
# custom code for deserializing
|
578
|
+
end
|
579
|
+
end
|
580
|
+
|
581
|
+
@account = Account.create!(params[:account])
|
582
|
+
@newest = Redis::Value.new('custom_serializer', marshal: true, serializer: CustomSerializer)
|
583
|
+
@newest.value = @account.attributes
|
563
584
|
~~~
|
564
585
|
|
565
586
|
Author
|
566
587
|
=======
|
567
|
-
Copyright (c) 2009-
|
588
|
+
Copyright (c) 2009-2019 [Nate Wiger](http://nateware.com). All Rights Reserved.
|
568
589
|
Released under the [Artistic License](http://www.opensource.org/licenses/artistic-license-2.0.php).
|
569
|
-
|
data/lib/redis/base_object.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
+
require 'redis/helpers/core_commands'
|
2
|
+
|
1
3
|
class Redis
|
2
4
|
# Defines base functionality for all redis-objects.
|
3
5
|
class BaseObject
|
6
|
+
include Redis::Helpers::CoreCommands
|
7
|
+
|
8
|
+
attr_reader :key, :options
|
9
|
+
|
4
10
|
def initialize(key, *args)
|
5
11
|
@key = key.is_a?(Array) ? key.flatten.join(':') : key
|
6
12
|
@options = args.last.is_a?(Hash) ? args.pop : {}
|
data/lib/redis/counter.rb
CHANGED
@@ -9,10 +9,6 @@ class Redis
|
|
9
9
|
# class to define a counter.
|
10
10
|
#
|
11
11
|
class Counter < BaseObject
|
12
|
-
require 'redis/helpers/core_commands'
|
13
|
-
include Redis::Helpers::CoreCommands
|
14
|
-
|
15
|
-
attr_reader :key, :options
|
16
12
|
def initialize(key, *args)
|
17
13
|
super(key, *args)
|
18
14
|
@options[:start] ||= @options[:default] || 0
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base_object'
|
2
|
+
|
3
|
+
class Redis
|
4
|
+
#
|
5
|
+
# Class representing a Redis enumerable type (list, set, sorted set, or hash).
|
6
|
+
#
|
7
|
+
class EnumerableObject < BaseObject
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
# Iterate through each member. Redis::Objects mixes in Enumerable,
|
11
|
+
# so you can also use familiar methods like +collect+, +detect+, and so forth.
|
12
|
+
def each(&block)
|
13
|
+
value.each(&block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def sort(options={})
|
17
|
+
return super() if block_given?
|
18
|
+
options[:order] = "asc alpha" if options.keys.count == 0 # compat with Ruby
|
19
|
+
val = redis.sort(key, options)
|
20
|
+
val.is_a?(Array) ? val.map{|v| unmarshal(v)} : val
|
21
|
+
end
|
22
|
+
|
23
|
+
# ActiveSupport's core extension `Enumerable#as_json` implementation is incompatible with ours.
|
24
|
+
def as_json(*)
|
25
|
+
to_hash
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/redis/hash_key.rb
CHANGED
@@ -1,16 +1,10 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/
|
1
|
+
require File.dirname(__FILE__) + '/enumerable_object'
|
2
2
|
|
3
3
|
class Redis
|
4
4
|
#
|
5
5
|
# Class representing a Redis hash.
|
6
6
|
#
|
7
|
-
class HashKey <
|
8
|
-
require 'enumerator'
|
9
|
-
include Enumerable
|
10
|
-
require 'redis/helpers/core_commands'
|
11
|
-
include Redis::Helpers::CoreCommands
|
12
|
-
|
13
|
-
attr_reader :key, :options
|
7
|
+
class HashKey < EnumerableObject
|
14
8
|
def initialize(key, *args)
|
15
9
|
super
|
16
10
|
@options[:marshal_keys] ||= {}
|
@@ -74,11 +68,6 @@ class Redis
|
|
74
68
|
alias_method :clone, :all
|
75
69
|
alias_method :value, :all
|
76
70
|
|
77
|
-
# Enumerate through all fields. Redis: HGETALL
|
78
|
-
def each(&block)
|
79
|
-
all.each(&block)
|
80
|
-
end
|
81
|
-
|
82
71
|
# Enumerate through each keys. Redis: HKEYS
|
83
72
|
def each_key(&block)
|
84
73
|
keys.each(&block)
|
@@ -101,11 +90,6 @@ class Redis
|
|
101
90
|
true if size == 0
|
102
91
|
end
|
103
92
|
|
104
|
-
# Clears the dict of all keys/values. Redis: DEL
|
105
|
-
def clear
|
106
|
-
redis.del(key)
|
107
|
-
end
|
108
|
-
|
109
93
|
# Set keys in bulk, takes a hash of field/values {'field1' => 'val1'}. Redis: HMSET
|
110
94
|
def bulk_set(*args)
|
111
95
|
raise ArgumentError, "Argument to bulk_set must be hash of key/value pairs" unless args.last.is_a?(::Hash)
|
@@ -183,9 +167,5 @@ class Redis
|
|
183
167
|
def decrbyfloat(field, by=1.0)
|
184
168
|
incrbyfloat(field, -by)
|
185
169
|
end
|
186
|
-
|
187
|
-
def as_json(*)
|
188
|
-
to_hash
|
189
|
-
end
|
190
170
|
end
|
191
171
|
end
|
@@ -5,13 +5,14 @@ class Redis
|
|
5
5
|
def exists?
|
6
6
|
redis.exists key
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
|
+
# Delete key. Redis: DEL
|
9
10
|
def delete
|
10
11
|
redis.del key
|
11
12
|
end
|
12
13
|
alias_method :del, :delete
|
13
14
|
alias_method :clear, :delete
|
14
|
-
|
15
|
+
|
15
16
|
def type
|
16
17
|
redis.type key
|
17
18
|
end
|
@@ -29,7 +30,7 @@ class Redis
|
|
29
30
|
@key = dest if ret && setkey
|
30
31
|
ret
|
31
32
|
end
|
32
|
-
|
33
|
+
|
33
34
|
def expire(seconds)
|
34
35
|
redis.expire key, seconds
|
35
36
|
end
|
@@ -50,20 +51,19 @@ class Redis
|
|
50
51
|
redis.move key, dbindex
|
51
52
|
end
|
52
53
|
|
53
|
-
def
|
54
|
-
options[:
|
55
|
-
val = redis.sort(key, options)
|
56
|
-
val.is_a?(Array) ? val.map{|v| unmarshal(v)} : val
|
54
|
+
def serializer
|
55
|
+
options[:serializer] || Marshal
|
57
56
|
end
|
58
57
|
|
59
58
|
def marshal(value, domarshal=false)
|
60
59
|
if options[:marshal] || domarshal
|
61
|
-
|
60
|
+
dump_args = options[:marshal_dump_args] || []
|
61
|
+
serializer.dump(value, *(dump_args.is_a?(Array) ? dump_args : [dump_args]))
|
62
62
|
else
|
63
63
|
value
|
64
64
|
end
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def unmarshal(value, domarshal=false)
|
68
68
|
if value.nil?
|
69
69
|
nil
|
@@ -73,7 +73,8 @@ class Redis
|
|
73
73
|
elsif !value.is_a?(String)
|
74
74
|
value
|
75
75
|
else
|
76
|
-
|
76
|
+
load_args = options[:marshal_load_args] || []
|
77
|
+
serializer.load(value, *(load_args.is_a?(Array) ? load_args : [load_args]))
|
77
78
|
end
|
78
79
|
else
|
79
80
|
value
|
data/lib/redis/list.rb
CHANGED
@@ -1,18 +1,11 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/
|
1
|
+
require File.dirname(__FILE__) + '/enumerable_object'
|
2
2
|
|
3
3
|
class Redis
|
4
4
|
#
|
5
5
|
# Class representing a Redis list. Instances of Redis::List are designed to
|
6
6
|
# behave as much like Ruby arrays as possible.
|
7
7
|
#
|
8
|
-
class List <
|
9
|
-
require 'enumerator'
|
10
|
-
include Enumerable
|
11
|
-
require 'redis/helpers/core_commands'
|
12
|
-
include Redis::Helpers::CoreCommands
|
13
|
-
|
14
|
-
attr_reader :key, :options
|
15
|
-
|
8
|
+
class List < EnumerableObject
|
16
9
|
# Works like push. Can chain together: list << 'a' << 'b'
|
17
10
|
def <<(value)
|
18
11
|
push(value) # marshal in push()
|
@@ -123,12 +116,6 @@ class Redis
|
|
123
116
|
redis.lrem(key, count, marshal(name)) # weird api
|
124
117
|
end
|
125
118
|
|
126
|
-
# Iterate through each member of the set. Redis::Objects mixes in Enumerable,
|
127
|
-
# so you can also use familiar methods like +collect+, +detect+, and so forth.
|
128
|
-
def each(&block)
|
129
|
-
values.each(&block)
|
130
|
-
end
|
131
|
-
|
132
119
|
# Return a range of values from +start_index+ to +end_index+. Can also use
|
133
120
|
# the familiar list[start,end] Ruby syntax. Redis: LRANGE
|
134
121
|
def range(start_index, end_index)
|
@@ -169,9 +156,5 @@ class Redis
|
|
169
156
|
def to_s
|
170
157
|
values.join(', ')
|
171
158
|
end
|
172
|
-
|
173
|
-
def as_json(*)
|
174
|
-
to_hash
|
175
|
-
end
|
176
159
|
end
|
177
160
|
end
|
data/lib/redis/lock.rb
CHANGED
@@ -11,7 +11,6 @@ class Redis
|
|
11
11
|
class Lock < BaseObject
|
12
12
|
class LockTimeout < StandardError; end #:nodoc:
|
13
13
|
|
14
|
-
attr_reader :key, :options
|
15
14
|
def initialize(key, *args)
|
16
15
|
super(key, *args)
|
17
16
|
@options[:timeout] ||= 5
|
@@ -19,13 +18,6 @@ class Redis
|
|
19
18
|
redis.setnx(key, @options[:start]) unless @options[:start] == 0 || @options[:init] === false
|
20
19
|
end
|
21
20
|
|
22
|
-
# Clear the lock. Should only be needed if there's a server crash
|
23
|
-
# or some other event that gets locks in a stuck state.
|
24
|
-
def clear
|
25
|
-
redis.del(key)
|
26
|
-
end
|
27
|
-
alias_method :delete, :clear
|
28
|
-
|
29
21
|
def value
|
30
22
|
nil
|
31
23
|
end
|
data/lib/redis/objects.rb
CHANGED
@@ -173,8 +173,15 @@ class Redis
|
|
173
173
|
def redis() self.class.redis end
|
174
174
|
def redis_objects() self.class.redis_objects end
|
175
175
|
|
176
|
-
def
|
177
|
-
redis.del(
|
176
|
+
def redis_delete_objects
|
177
|
+
redis.del(redis_instance_keys)
|
178
|
+
end
|
179
|
+
|
180
|
+
def redis_instance_keys
|
181
|
+
redis_objects
|
182
|
+
.reject { |_, value| value[:global] }
|
183
|
+
.keys
|
184
|
+
.collect { |name| redis_field_key(name) }
|
178
185
|
end
|
179
186
|
|
180
187
|
def redis_options(name) #:nodoc:
|
data/lib/redis/set.rb
CHANGED
@@ -1,17 +1,10 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/
|
1
|
+
require File.dirname(__FILE__) + '/enumerable_object'
|
2
2
|
|
3
3
|
class Redis
|
4
4
|
#
|
5
5
|
# Class representing a set.
|
6
6
|
#
|
7
|
-
class Set <
|
8
|
-
require 'enumerator'
|
9
|
-
include Enumerable
|
10
|
-
require 'redis/helpers/core_commands'
|
11
|
-
include Redis::Helpers::CoreCommands
|
12
|
-
|
13
|
-
attr_reader :key, :options
|
14
|
-
|
7
|
+
class Set < EnumerableObject
|
15
8
|
# Works like add. Can chain together: list << 'a' << 'b'
|
16
9
|
def <<(value)
|
17
10
|
add(value)
|
@@ -27,8 +20,8 @@ class Redis
|
|
27
20
|
end
|
28
21
|
|
29
22
|
# Remove and return a random member. Redis: SPOP
|
30
|
-
def pop
|
31
|
-
unmarshal redis.spop(key)
|
23
|
+
def pop(count = nil)
|
24
|
+
unmarshal redis.spop(key, count)
|
32
25
|
end
|
33
26
|
|
34
27
|
# return a random member. Redis: SRANDMEMBER
|
@@ -74,12 +67,6 @@ class Redis
|
|
74
67
|
res
|
75
68
|
end
|
76
69
|
|
77
|
-
# Iterate through each member of the set. Redis::Objects mixes in Enumerable,
|
78
|
-
# so you can also use familiar methods like +collect+, +detect+, and so forth.
|
79
|
-
def each(&block)
|
80
|
-
members.each(&block)
|
81
|
-
end
|
82
|
-
|
83
70
|
# Return the intersection with another set. Can pass it either another set
|
84
71
|
# object or set name. Also available as & which is a bit cleaner:
|
85
72
|
#
|
@@ -185,10 +172,6 @@ class Redis
|
|
185
172
|
members.join(', ')
|
186
173
|
end
|
187
174
|
|
188
|
-
def as_json(*)
|
189
|
-
to_hash
|
190
|
-
end
|
191
|
-
|
192
175
|
private
|
193
176
|
|
194
177
|
def keys_from_objects(sets)
|
data/lib/redis/sorted_set.rb
CHANGED
@@ -1,17 +1,10 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/
|
1
|
+
require File.dirname(__FILE__) + '/enumerable_object'
|
2
2
|
|
3
3
|
class Redis
|
4
4
|
#
|
5
5
|
# Class representing a sorted set.
|
6
6
|
#
|
7
|
-
class SortedSet <
|
8
|
-
# require 'enumerator'
|
9
|
-
# include Enumerable
|
10
|
-
require 'redis/helpers/core_commands'
|
11
|
-
include Redis::Helpers::CoreCommands
|
12
|
-
|
13
|
-
attr_reader :key, :options
|
14
|
-
|
7
|
+
class SortedSet < EnumerableObject
|
15
8
|
# How to add values using a sorted set. The key is the member, eg,
|
16
9
|
# "Peter", and the value is the score, eg, 163. So:
|
17
10
|
# num_posts['Peter'] = 163
|
data/lib/redis/value.rb
CHANGED
@@ -6,11 +6,6 @@ class Redis
|
|
6
6
|
# Class representing a simple value. You can use standard Ruby operations on it.
|
7
7
|
#
|
8
8
|
class Value < BaseObject
|
9
|
-
require 'redis/helpers/core_commands'
|
10
|
-
include Redis::Helpers::CoreCommands
|
11
|
-
|
12
|
-
attr_reader :key, :options
|
13
|
-
|
14
9
|
def value=(val)
|
15
10
|
allow_expiration do
|
16
11
|
if val.nil?
|
@@ -0,0 +1,198 @@
|
|
1
|
+
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
3
|
+
|
4
|
+
require 'redis/objects'
|
5
|
+
|
6
|
+
class CustomSerializer
|
7
|
+
class << self
|
8
|
+
attr_accessor :dump_called, :load_called, :dump_args, :load_args
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.dump(value, *args, **kargs)
|
12
|
+
@dump_called = true
|
13
|
+
@dump_args = [args, kargs]
|
14
|
+
Marshal.dump(value)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.load(value, *args, **kargs)
|
18
|
+
@load_called = true
|
19
|
+
@load_args = [args, kargs]
|
20
|
+
Marshal.load(value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.reset!
|
24
|
+
@dump_called = nil
|
25
|
+
@load_called = nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'with custom serialization' do
|
30
|
+
before do
|
31
|
+
CustomSerializer.reset!
|
32
|
+
end
|
33
|
+
|
34
|
+
describe Redis::Value do
|
35
|
+
before do
|
36
|
+
@value = Redis::Value.new(
|
37
|
+
'spec/value_custom_serializer',
|
38
|
+
marshal: true,
|
39
|
+
serializer: CustomSerializer
|
40
|
+
)
|
41
|
+
@value.clear
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'uses custom serializer' do
|
45
|
+
@value.value = { json: 'data' }
|
46
|
+
CustomSerializer.dump_called.should == true
|
47
|
+
CustomSerializer.load_called.should == nil
|
48
|
+
@value.value.should == { json: 'data' }
|
49
|
+
CustomSerializer.dump_called.should == true
|
50
|
+
CustomSerializer.load_called.should == true
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'passes extra arguments to dump' do
|
54
|
+
@value.options[:marshal_dump_args] = ['some', { extra: 'arguments' }]
|
55
|
+
@value.value = 1
|
56
|
+
CustomSerializer.dump_args.should == [['some'], { extra: 'arguments' }]
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'passes extra arguments to load' do
|
60
|
+
@value.options[:marshal_load_args] = ['some', { extra: 'arguments' }]
|
61
|
+
@value.value = 1
|
62
|
+
@value.value.should == 1
|
63
|
+
CustomSerializer.load_args.should == [['some'], { extra: 'arguments' }]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe Redis::List do
|
68
|
+
before do
|
69
|
+
@list = Redis::List.new(
|
70
|
+
'spec/list_custom_serializer',
|
71
|
+
marshal: true,
|
72
|
+
serializer: CustomSerializer
|
73
|
+
)
|
74
|
+
@list.clear
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'uses custom serializer' do
|
78
|
+
@list << { json: 'data' }
|
79
|
+
CustomSerializer.dump_called.should == true
|
80
|
+
CustomSerializer.load_called.should == nil
|
81
|
+
@list.should == [{ json: 'data' }]
|
82
|
+
CustomSerializer.dump_called.should == true
|
83
|
+
CustomSerializer.load_called.should == true
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'passes extra arguments to dump' do
|
87
|
+
@list.options[:marshal_dump_args] = ['some', { extra: 'arguments' }]
|
88
|
+
@list << 1
|
89
|
+
CustomSerializer.dump_args.should == [['some'], { extra: 'arguments' }]
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'passes extra arguments to load' do
|
93
|
+
@list.options[:marshal_load_args] = ['some', { extra: 'arguments' }]
|
94
|
+
@list << 1
|
95
|
+
@list.values.should == [1]
|
96
|
+
CustomSerializer.load_args.should == [['some'], { extra: 'arguments' }]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe Redis::HashKey do
|
101
|
+
before do
|
102
|
+
@hash = Redis::HashKey.new(
|
103
|
+
'spec/hash_custom_serializer',
|
104
|
+
marshal: true,
|
105
|
+
serializer: CustomSerializer
|
106
|
+
)
|
107
|
+
@hash.clear
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'uses custom serializer' do
|
111
|
+
@hash['a'] = 1
|
112
|
+
CustomSerializer.dump_called.should == true
|
113
|
+
CustomSerializer.load_called.should == nil
|
114
|
+
@hash.value.should == { 'a' => 1 }
|
115
|
+
CustomSerializer.dump_called.should == true
|
116
|
+
CustomSerializer.load_called.should == true
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'passes extra arguments to dump' do
|
120
|
+
@hash.options[:marshal_dump_args] = ['some', { extra: 'arguments' }]
|
121
|
+
@hash['a'] = 1
|
122
|
+
CustomSerializer.dump_args.should == [['some'], { extra: 'arguments' }]
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'passes extra arguments to load' do
|
126
|
+
@hash.options[:marshal_load_args] = ['some', { extra: 'arguments' }]
|
127
|
+
@hash['a'] = 1
|
128
|
+
@hash.value.should == { 'a' => 1 }
|
129
|
+
CustomSerializer.load_args.should == [['some'], { extra: 'arguments' }]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe Redis::Set do
|
134
|
+
before do
|
135
|
+
@set = Redis::Set.new(
|
136
|
+
'spec/set_custom_serializer',
|
137
|
+
marshal: true,
|
138
|
+
serializer: CustomSerializer
|
139
|
+
)
|
140
|
+
@set.clear
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'uses custom serializer' do
|
144
|
+
@set << 'a'
|
145
|
+
CustomSerializer.dump_called.should == true
|
146
|
+
CustomSerializer.load_called.should == nil
|
147
|
+
@set.members.should == ['a']
|
148
|
+
CustomSerializer.dump_called.should == true
|
149
|
+
CustomSerializer.load_called.should == true
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'passes extra arguments to dump' do
|
153
|
+
@set.options[:marshal_dump_args] = ['some', { extra: 'arguments' }]
|
154
|
+
@set << 'a'
|
155
|
+
CustomSerializer.dump_args.should == [['some'], { extra: 'arguments' }]
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'passes extra arguments to load' do
|
159
|
+
@set.options[:marshal_load_args] = ['some', { extra: 'arguments' }]
|
160
|
+
@set << 'a'
|
161
|
+
@set.members.should == ['a']
|
162
|
+
CustomSerializer.load_args.should == [['some'], { extra: 'arguments' }]
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe Redis::SortedSet do
|
167
|
+
before do
|
168
|
+
@set = Redis::SortedSet.new(
|
169
|
+
'spec/zset_custom_serializer',
|
170
|
+
marshal: true,
|
171
|
+
serializer: CustomSerializer
|
172
|
+
)
|
173
|
+
@set.clear
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'uses custom serializer' do
|
177
|
+
@set['a'] = 1
|
178
|
+
CustomSerializer.dump_called.should == true
|
179
|
+
CustomSerializer.load_called.should == nil
|
180
|
+
@set.members.should == ['a']
|
181
|
+
CustomSerializer.dump_called.should == true
|
182
|
+
CustomSerializer.load_called.should == true
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'passes extra arguments to dump' do
|
186
|
+
@set.options[:marshal_dump_args] = ['some', { extra: 'arguments' }]
|
187
|
+
@set['a'] = 1
|
188
|
+
CustomSerializer.dump_args.should == [['some'], { extra: 'arguments' }]
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'passes extra arguments to load' do
|
192
|
+
@set.options[:marshal_load_args] = ['some', { extra: 'arguments' }]
|
193
|
+
@set['a'] = 1
|
194
|
+
@set.members.should == ['a']
|
195
|
+
CustomSerializer.load_args.should == [['some'], { extra: 'arguments' }]
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
@@ -1009,8 +1009,15 @@ describe Redis::Objects do
|
|
1009
1009
|
end
|
1010
1010
|
|
1011
1011
|
it "should allow deleting the entire object" do
|
1012
|
-
@roster.redis.keys
|
1013
|
-
@roster.
|
1014
|
-
@roster.redis.keys
|
1012
|
+
(@roster.redis.keys & @roster.redis_instance_keys).count.should > 0
|
1013
|
+
@roster.redis_delete_objects.should > 0
|
1014
|
+
(@roster.redis.keys & @roster.redis_instance_keys).count.should == 0
|
1015
|
+
end
|
1016
|
+
|
1017
|
+
it "should be able to return all instance keys" do
|
1018
|
+
@roster.redis_instance_keys.include?('roster:1:player_stats').should == true
|
1019
|
+
@roster.redis_instance_keys.include?('players:my_rank:user1').should == true
|
1020
|
+
@roster.redis_instance_keys.include?('roster:1:player_stats').should == true
|
1021
|
+
@roster.redis_instance_keys.include?('players:all_stats').should == false
|
1015
1022
|
end
|
1016
1023
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-objects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nate Wiger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -140,6 +140,7 @@ files:
|
|
140
140
|
- lib/redis-objects.rb
|
141
141
|
- lib/redis/base_object.rb
|
142
142
|
- lib/redis/counter.rb
|
143
|
+
- lib/redis/enumerable_object.rb
|
143
144
|
- lib/redis/hash_key.rb
|
144
145
|
- lib/redis/helpers/core_commands.rb
|
145
146
|
- lib/redis/list.rb
|
@@ -162,6 +163,7 @@ files:
|
|
162
163
|
- spec/redis_namespace_compat_spec.rb
|
163
164
|
- spec/redis_objects_active_record_spec.rb
|
164
165
|
- spec/redis_objects_conn_spec.rb
|
166
|
+
- spec/redis_objects_custom_serializer.rb
|
165
167
|
- spec/redis_objects_instance_spec.rb
|
166
168
|
- spec/redis_objects_model_spec.rb
|
167
169
|
- spec/spec_helper.rb
|
@@ -184,8 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
186
|
- !ruby/object:Gem::Version
|
185
187
|
version: '0'
|
186
188
|
requirements: []
|
187
|
-
|
188
|
-
rubygems_version: 2.7.3
|
189
|
+
rubygems_version: 3.0.3
|
189
190
|
signing_key:
|
190
191
|
specification_version: 4
|
191
192
|
summary: Map Redis types directly to Ruby objects
|
@@ -194,6 +195,7 @@ test_files:
|
|
194
195
|
- spec/redis_namespace_compat_spec.rb
|
195
196
|
- spec/redis_objects_active_record_spec.rb
|
196
197
|
- spec/redis_objects_conn_spec.rb
|
198
|
+
- spec/redis_objects_custom_serializer.rb
|
197
199
|
- spec/redis_objects_instance_spec.rb
|
198
200
|
- spec/redis_objects_model_spec.rb
|
199
201
|
- spec/spec_helper.rb
|