redis-objects 1.4.3 → 1.5.0
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.
- 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
|