redis-objects 1.4.3 → 1.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a9f86f294c2283b6ceae1730dfe6f1d1c3665ac9733cd107a4aa522d8a66bda
4
- data.tar.gz: 50d631298aff5bcd5b15179c1a700a56a512c4a096cedad4c3f716999dcfebea
3
+ metadata.gz: 831f2916f47c47d9e3fcce9f8c585327c3e0e6e56204880ddfc860c279ec0e85
4
+ data.tar.gz: 188263c23463afc2f68b026efb79bac230ed140fba5d164540c99bac9d4553c2
5
5
  SHA512:
6
- metadata.gz: 48b37a11d5a2a5844863f2a7c559b5e38a6a96eab5d8f5393d0b688f8ffada7f8e480bb12d93869ca7a82d1fbb0fd311fc85a5f72635a4749ee771fefe834abc
7
- data.tar.gz: b09b794badff0249c468b0cc33b2daa24e87ab084cc5a778eb3415894bdad6e90070f7e3da4d417c16ec867017d4c15e5d06c0ca163560e5c4513297e3698241
6
+ metadata.gz: 2189c5151d3f59ca67445e4f560e23f68e34c62c6a257b58bbf9eb08775420044b82680c7dc4b808769347542c27fa1f295776bd418e4bf34a1d1e1b78799843
7
+ data.tar.gz: a26ad235bba5d586b8076c5640d4f725806187e41345af154d929b8ba4339932d97c86fb9d4a512777052df67aeca0a3f0fcda7d22e4f55248ff78fd14e3b552
data/.gitignore CHANGED
@@ -9,3 +9,5 @@ spec/redis.pid
9
9
  dump.rdb
10
10
  Gemfile.lock
11
11
  redis-objects-*.gem
12
+ coverage/
13
+ .DS_Store
data/.travis.yml CHANGED
@@ -5,7 +5,12 @@ before_install:
5
5
  - gem install bundler
6
6
 
7
7
  rvm:
8
- - 2.2
9
- - 2.3.3
10
- - 2.4.0
11
- - 2.5.1
8
+ - 2.3.8
9
+ - 2.4.10
10
+ - 2.5.9
11
+ - 2.6.7
12
+ - 2.7.3
13
+ - 3.0.1
14
+
15
+ # For code coverage reports
16
+ script: bundle exec rake
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,42 @@
1
1
  = Changelog for Redis::Objects
2
2
 
3
+ == 1.5.1 (10 Jul 2021)
4
+
5
+ * Added double-splat for **options to account for Ruby 3.0 [Nate Wiger]
6
+
7
+ * Fix ConnectionPoolProxy Ruby 3.0 compatibility Fix: https://github.com/nateware/redis-objects/pull/258 [Jean byroot Boussier]
8
+
9
+ * Change Redis#exists to Redis#exists? * bump redis version to 4.2 [Alina Hryshchuk]
10
+
11
+ * Local variable `dir` is not in use since 98226b95f35ef455f231692fdb679dfd61200a78 [Akira Matsuda]
12
+
13
+ * Issue 249: when atomic decrbyfloat fails, increment back instead of decrementing again [Slava Samoliuk]
14
+
15
+ * Update documentation to reflect ability to assign values directly [Artin Boghosian]
16
+
17
+ * Allow directly assigning values of lists, hashes and sets [Artin Boghosian]
18
+
19
+
20
+ == 1.5.0 (18 Sep 2019)
21
+
22
+ * updated README on expireat [Nate Wiger]
23
+
24
+ * Add option for using a custom serializer [Tomás Rojas]
25
+
26
+ * DRY up objects to enable custom prefixing when desired [Tomás Rojas]
27
+
28
+ * Allow spop to return multiple members [Evan Paul]
29
+
30
+ * Rename #delete! to #redis_delete_objects [Mattias Pfeiffer]
31
+
32
+ * Make deletion simpler with just 1 call to Redis [Mattias Pfeiffer]
33
+
34
+ * Move `CoreCommands` inclusion to `BaseObject` [Tomás Rojas]
35
+
36
+ * Move `Enumerable` functionality to `EnumerableObject` [Tomás Rojas]
37
+
38
+ * Move `attr_reader`s to `Redis::BaseObject` [Tomás Rojas]
39
+
3
40
  == 1.4.3 (7 Oct 2018)
4
41
 
5
42
  * Merge pull request #235 from johnc219/fix/end-time-expiration Add expiration in seconds to obtain end_time [Nate Wiger]
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  Redis::Objects - Map Redis types directly to Ruby objects
2
2
  =========================================================
3
3
 
4
- [![Build Status](https://travis-ci.org/nateware/redis-objects.png)](https://travis-ci.org/nateware/redis-objects)
4
+ [![Build Status](https://app.travis-ci.com/nateware/redis-objects.svg?branch=master)](https://travis-ci.com/github/nateware/redis-objects)
5
+ [![Code Coverage](https://codecov.io/gh/nateware/redis-objects/branch/master/graph/badge.svg)](https://codecov.io/gh/nateware/redis-objects)
5
6
  [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=MJF7JU5M7F8VL)
6
7
 
7
8
  This is **not** an ORM. People that are wrapping ORM’s around Redis are missing the point.
@@ -9,7 +10,7 @@ This is **not** an ORM. People that are wrapping ORM’s around Redis are missin
9
10
  The killer feature of Redis is that it allows you to perform _atomic_ operations
10
11
  on _individual_ data structures, like counters, lists, and sets. The **atomic** part is HUGE.
11
12
  Using an ORM wrapper that retrieves a "record", updates values, then sends those values back,
12
- _removes_ the atomicity, cutting the nuts off the major advantage of Redis. Just use MySQL, k?
13
+ _removes_ the atomicity, and thus the major advantage of Redis. Just use MySQL, k?
13
14
 
14
15
  This gem provides a Rubyish interface to Redis, by mapping [Redis data types](http://redis.io/commands)
15
16
  to Ruby objects, via a thin layer over the `redis` gem. It offers several advantages
@@ -144,6 +145,7 @@ Familiar Ruby array operations Just Work (TM):
144
145
  @team.on_base.shift
145
146
  @team.on_base.length # 1
146
147
  @team.on_base.delete('player2')
148
+ @team.on_base = ['player1', 'player2'] # ['player1', 'player2']
147
149
  ~~~
148
150
 
149
151
  Sets work too:
@@ -157,6 +159,15 @@ Sets work too:
157
159
  puts player
158
160
  end
159
161
  player = @team.outfielders.detect{|of| of == 'outfielder2'}
162
+ @team.outfielders = ['outfielder1', 'outfielder3'] # ['outfielder1', 'outfielder3']
163
+ ~~~
164
+
165
+ Hashes work too:
166
+
167
+ ~~~ruby
168
+ @team.pitchers_faced['player1'] = 'pitcher2'
169
+ @team.pitchers_faced['player2'] = 'pitcher1'
170
+ @team.pitchers_faced = { 'player1' => 'pitcher2', 'player2' => 'pitcher1' }
160
171
  ~~~
161
172
 
162
173
  And you can do unions and intersections between objects (kinda cool):
@@ -550,20 +561,40 @@ Use :expiration and :expireat options to set default expiration.
550
561
 
551
562
  ~~~ruby
552
563
  value :value_with_expiration, :expiration => 1.hour
553
- value :value_with_expireat, :expireat => Time.now + 1.hour
564
+ value :value_with_expireat, :expireat => lambda { Time.now + 1.hour }
554
565
  ~~~
555
566
 
556
- :warning: `expireat` is evaluated at class load time.
557
- In this example, it will be one hour after evaluating class, not after one hour after setting value.
567
+ :warning: In the above example, `expiration` is evaluated at class load time.
568
+ In this example, it will be one hour after loading the class, not after one hour
569
+ after setting a value. If you want to expire one hour after setting the value,
570
+ please use `:expireat` with `lambda`.
571
+
572
+ Custom serialization
573
+ --------------------
574
+ You can customize how values are serialized by setting `serializer: CustomSerializer`.
575
+ The default is `Marshal` from the standard lib, but it can be anything that responds to `dump` and
576
+ `load`. `JSON` and `YAML` are popular options.
558
577
 
559
- If you want to expire one hour after setting the value. please use `lambda`.
578
+ If you need to pass extra arguments to `dump` or `load`, you can set
579
+ `marshal_dump_args: { foo: 'bar' }` and `marshal_load_args: { foo: 'bar' }` respectively.
560
580
 
561
581
  ~~~ruby
562
- value :value_with_expireat, :expireat => lambda { Time.now + 1.hour }
582
+ class CustomSerializer
583
+ def self.dump(value)
584
+ # custom code for serializing
585
+ end
586
+
587
+ def self.load(value)
588
+ # custom code for deserializing
589
+ end
590
+ end
591
+
592
+ @account = Account.create!(params[:account])
593
+ @newest = Redis::Value.new('custom_serializer', marshal: true, serializer: CustomSerializer)
594
+ @newest.value = @account.attributes
563
595
  ~~~
564
596
 
565
597
  Author
566
598
  =======
567
- Copyright (c) 2009-2013 [Nate Wiger](http://nateware.com). All Rights Reserved.
599
+ Copyright (c) 2009-2019 [Nate Wiger](http://nateware.com). All Rights Reserved.
568
600
  Released under the [Artistic License](http://www.opensource.org/licenses/artistic-license-2.0.php).
569
-
@@ -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
@@ -106,7 +102,7 @@ class Redis
106
102
  def decrbyfloat(by=1.0, &block)
107
103
  allow_expiration do
108
104
  val = redis.incrbyfloat(key, -by).to_f
109
- block_given? ? rewindable_block(:incrbyfloat, -by, val, &block) : val
105
+ block_given? ? rewindable_block(:incrbyfloat, by, val, &block) : val
110
106
  end
111
107
  end
112
108
 
@@ -116,7 +112,7 @@ class Redis
116
112
  alias_method :to_i, :value
117
113
 
118
114
  def nil?
119
- !redis.exists(key)
115
+ !redis.exists?(key)
120
116
  end
121
117
 
122
118
  ##
@@ -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
@@ -1,16 +1,10 @@
1
- require File.dirname(__FILE__) + '/base_object'
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 < BaseObject
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)
@@ -139,24 +123,20 @@ class Redis
139
123
  hsh
140
124
  end
141
125
 
142
- # Get values in bulk, takes an array of keys as arguments.
126
+ # Get values in bulk, takes an array of fields as arguments.
143
127
  # Values are returned in a collection in the same order than their keys in *keys Redis: HMGET
144
- def bulk_values(*keys)
145
- get_keys = *keys.flatten
146
- return [] if get_keys.empty?
147
- res = redis.hmget(key, get_keys)
148
- get_keys.inject([]){|collection, k| collection << unmarshal(res.shift, options[:marshal_keys][k])}
128
+ def bulk_values(*fields)
129
+ get_fields = *fields.flatten
130
+ return [] if get_fields.empty?
131
+ res = redis.hmget(key, get_fields)
132
+ get_fields.collect{|k| unmarshal(res.shift, options[:marshal_keys][k])}
149
133
  end
150
134
 
151
135
  # Increment value by integer at field. Redis: HINCRBY
152
136
  def incrby(field, by=1)
153
137
  allow_expiration do
154
138
  ret = redis.hincrby(key, field, by)
155
- unless ret.is_a? Array
156
- ret.to_i
157
- else
158
- nil
159
- end
139
+ ret.to_i
160
140
  end
161
141
  end
162
142
  alias_method :incr, :incrby
@@ -171,11 +151,7 @@ class Redis
171
151
  def incrbyfloat(field, by=1.0)
172
152
  allow_expiration do
173
153
  ret = redis.hincrbyfloat(key, field, by)
174
- unless ret.is_a? Array
175
- ret.to_f
176
- else
177
- nil
178
- end
154
+ ret.to_f
179
155
  end
180
156
  end
181
157
 
@@ -183,9 +159,5 @@ class Redis
183
159
  def decrbyfloat(field, by=1.0)
184
160
  incrbyfloat(field, -by)
185
161
  end
186
-
187
- def as_json(*)
188
- to_hash
189
- end
190
162
  end
191
163
  end
@@ -2,16 +2,21 @@ class Redis
2
2
  module Helpers
3
3
  # These are core commands that all types share (rename, etc)
4
4
  module CoreCommands
5
- def exists?
5
+ def exists
6
6
  redis.exists key
7
7
  end
8
-
8
+
9
+ def exists?
10
+ redis.exists? key
11
+ end
12
+
13
+ # Delete key. Redis: DEL
9
14
  def delete
10
15
  redis.del key
11
16
  end
12
17
  alias_method :del, :delete
13
18
  alias_method :clear, :delete
14
-
19
+
15
20
  def type
16
21
  redis.type key
17
22
  end
@@ -29,7 +34,7 @@ class Redis
29
34
  @key = dest if ret && setkey
30
35
  ret
31
36
  end
32
-
37
+
33
38
  def expire(seconds)
34
39
  redis.expire key, seconds
35
40
  end
@@ -50,20 +55,19 @@ class Redis
50
55
  redis.move key, dbindex
51
56
  end
52
57
 
53
- def sort(options={})
54
- options[:order] = "asc alpha" if options.keys.count == 0 # compat with Ruby
55
- val = redis.sort(key, options)
56
- val.is_a?(Array) ? val.map{|v| unmarshal(v)} : val
58
+ def serializer
59
+ options[:serializer] || Marshal
57
60
  end
58
61
 
59
62
  def marshal(value, domarshal=false)
60
63
  if options[:marshal] || domarshal
61
- Marshal.dump(value)
64
+ dump_args = options[:marshal_dump_args] || []
65
+ serializer.dump(value, *(dump_args.is_a?(Array) ? dump_args : [dump_args]))
62
66
  else
63
67
  value
64
68
  end
65
69
  end
66
-
70
+
67
71
  def unmarshal(value, domarshal=false)
68
72
  if value.nil?
69
73
  nil
@@ -73,7 +77,8 @@ class Redis
73
77
  elsif !value.is_a?(String)
74
78
  value
75
79
  else
76
- Marshal.load(value)
80
+ load_args = options[:marshal_load_args] || []
81
+ serializer.load(value, *(load_args.is_a?(Array) ? load_args : [load_args]))
77
82
  end
78
83
  else
79
84
  value
data/lib/redis/list.rb CHANGED
@@ -1,18 +1,11 @@
1
- require File.dirname(__FILE__) + '/base_object'
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 < BaseObject
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
@@ -9,6 +9,7 @@ class Redis
9
9
  def method_missing(name, *args, &block)
10
10
  @pool.with { |x| x.send(name, *args, &block) }
11
11
  end
12
+ ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
12
13
 
13
14
  def respond_to_missing?(name, include_all = false)
14
15
  @pool.with { |x| x.respond_to?(name, include_all) }
@@ -26,6 +26,15 @@ class Redis
26
26
  )
27
27
  )
28
28
  end
29
+
30
+ define_method(:"#{name}=") do |values|
31
+ hash_key = public_send(name)
32
+
33
+ redis.pipelined do
34
+ hash_key.clear
35
+ hash_key.bulk_set(values)
36
+ end
37
+ end
29
38
  end
30
39
 
31
40
  if options[:global]
@@ -26,6 +26,15 @@ class Redis
26
26
  )
27
27
  )
28
28
  end
29
+
30
+ define_method(:"#{name}=") do |values|
31
+ list = public_send(name)
32
+
33
+ redis.pipelined do
34
+ list.clear
35
+ list.push(*values)
36
+ end
37
+ end
29
38
  end
30
39
 
31
40
  if options[:global]
@@ -26,6 +26,15 @@ class Redis
26
26
  )
27
27
  )
28
28
  end
29
+
30
+ define_method(:"#{name}=") do |values|
31
+ set = public_send(name)
32
+
33
+ redis.pipelined do
34
+ set.clear
35
+ set.merge(*values)
36
+ end
37
+ end
29
38
  end
30
39
 
31
40
  if options[:global]
@@ -1,5 +1,5 @@
1
1
  class Redis
2
2
  module Objects
3
- VERSION = "1.4.3"
3
+ VERSION = "1.6.0"
4
4
  end
5
5
  end
data/lib/redis/objects.rb CHANGED
@@ -46,8 +46,6 @@ class Redis
46
46
  #
47
47
  #
48
48
  module Objects
49
- dir = File.expand_path(__FILE__.sub(/\.rb$/,''))
50
-
51
49
  autoload :Counters, 'redis/objects/counters'
52
50
  autoload :Lists, 'redis/objects/lists'
53
51
  autoload :Locks, 'redis/objects/locks'
@@ -173,8 +171,15 @@ class Redis
173
171
  def redis() self.class.redis end
174
172
  def redis_objects() self.class.redis_objects end
175
173
 
176
- def delete!
177
- redis.del(redis_objects.keys.map { |k| send(k) }.reject(&:nil?).map { |obj| obj.key })
174
+ def redis_delete_objects
175
+ redis.del(redis_instance_keys)
176
+ end
177
+
178
+ def redis_instance_keys
179
+ redis_objects
180
+ .reject { |_, value| value[:global] }
181
+ .keys
182
+ .collect { |name| redis_field_key(name) }
178
183
  end
179
184
 
180
185
  def redis_options(name) #:nodoc:
data/lib/redis/set.rb CHANGED
@@ -1,17 +1,10 @@
1
- require File.dirname(__FILE__) + '/base_object'
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 < BaseObject
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)
@@ -1,17 +1,10 @@
1
- require File.dirname(__FILE__) + '/base_object'
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 < BaseObject
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
@@ -124,7 +117,7 @@ class Redis
124
117
  options[:offset] || options[:limit] || options[:count]
125
118
  args[:with_scores] = true if options[:withscores] || options[:with_scores]
126
119
 
127
- redis.zrangebyscore(key, min, max, args).map{|v| unmarshal(v) }
120
+ redis.zrangebyscore(key, min, max, **args).map{|v| unmarshal(v) }
128
121
  end
129
122
 
130
123
  # Returns all the elements in the sorted set at key with a score between max and min
@@ -140,7 +133,7 @@ class Redis
140
133
  options[:offset] || options[:limit] || options[:count]
141
134
  args[:with_scores] = true if options[:withscores] || options[:with_scores]
142
135
 
143
- redis.zrevrangebyscore(key, max, min, args).map{|v| unmarshal(v) }
136
+ redis.zrevrangebyscore(key, max, min, **args).map{|v| unmarshal(v) }
144
137
  end
145
138
 
146
139
  # Remove all elements in the sorted set at key with rank between start and end. Start and end are
@@ -229,7 +222,7 @@ class Redis
229
222
  def interstore(name, *sets)
230
223
  allow_expiration do
231
224
  opts = sets.last.is_a?(Hash) ? sets.pop : {}
232
- redis.zinterstore(key_from_object(name), keys_from_objects([self] + sets), opts)
225
+ redis.zinterstore(key_from_object(name), keys_from_objects([self] + sets), **opts)
233
226
  end
234
227
  end
235
228
 
@@ -265,7 +258,7 @@ class Redis
265
258
  def unionstore(name, *sets)
266
259
  allow_expiration do
267
260
  opts = sets.last.is_a?(Hash) ? sets.pop : {}
268
- redis.zunionstore(key_from_object(name), keys_from_objects([self] + sets), opts)
261
+ redis.zunionstore(key_from_object(name), keys_from_objects([self] + sets), **opts)
269
262
  end
270
263
  end
271
264