redpear 0.8.0 → 0.9.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.
- data/lib/redpear/connection.rb +1 -16
- data/lib/redpear/model.rb +11 -5
- data/lib/redpear/store/base.rb +11 -3
- data/lib/redpear/store/counter.rb +8 -3
- data/lib/redpear/store/enumerable.rb +13 -1
- data/lib/redpear/store/hash.rb +14 -6
- data/lib/redpear/store/list.rb +8 -4
- data/lib/redpear/store/set.rb +14 -5
- data/lib/redpear/store/sorted_set.rb +25 -12
- data/lib/redpear/store/value.rb +13 -3
- data/lib/redpear/version.rb +1 -1
- metadata +19 -34
data/lib/redpear/connection.rb
CHANGED
@@ -57,8 +57,7 @@ class Redpear::Connection
|
|
57
57
|
# The (optional) slave connection, defaults to master
|
58
58
|
def initialize(master = Redis.current, slave = nil)
|
59
59
|
@master = _connect(master)
|
60
|
-
@slave = _connect(slave
|
61
|
-
@transaction = nil
|
60
|
+
@slave = slave ? _connect(slave) : @master
|
62
61
|
end
|
63
62
|
|
64
63
|
# @param [Symbol] name
|
@@ -74,20 +73,6 @@ class Redpear::Connection
|
|
74
73
|
@current = nil
|
75
74
|
end
|
76
75
|
|
77
|
-
# Run a transaction, prevents accidental transaction nesting
|
78
|
-
def transaction(&block)
|
79
|
-
if @transaction
|
80
|
-
yield
|
81
|
-
else
|
82
|
-
begin
|
83
|
-
@transaction = true
|
84
|
-
multi(&block)
|
85
|
-
ensure
|
86
|
-
@transaction = nil
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
76
|
MASTER_METHODS.each do |meth|
|
92
77
|
define_method(meth) do |*a, &b|
|
93
78
|
(current || master).send(meth, *a, &b)
|
data/lib/redpear/model.rb
CHANGED
@@ -32,15 +32,15 @@ class Redpear::Model < Hash
|
|
32
32
|
|
33
33
|
alias_method :create, :new
|
34
34
|
|
35
|
-
# @param [
|
35
|
+
# @param [Redis] define a custom connection
|
36
36
|
attr_writer :connection
|
37
37
|
|
38
38
|
# @param [String] define a custom scope
|
39
39
|
attr_writer :scope
|
40
40
|
|
41
|
-
# @return [
|
41
|
+
# @return [Redis] the connection
|
42
42
|
def connection
|
43
|
-
@connection ||= (superclass.respond_to?(:connection) ? superclass.connection :
|
43
|
+
@connection ||= (superclass.respond_to?(:connection) ? superclass.connection : Redis.current)
|
44
44
|
end
|
45
45
|
|
46
46
|
# @return [String] the scope of this model. Example:
|
@@ -69,10 +69,16 @@ class Redpear::Model < Hash
|
|
69
69
|
@_pk_counter ||= Redpear::Store::Counter.new nested_key(:+), connection
|
70
70
|
end
|
71
71
|
|
72
|
-
# Runs a bulk-operation.
|
72
|
+
# Runs a transactional bulk-operation.
|
73
73
|
# @yield operations that should be run in the transaction
|
74
74
|
def transaction(&block)
|
75
|
-
connection.
|
75
|
+
connection.multi(&block)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Runs a bulk-operation.
|
79
|
+
# @yield operations that should be run as bulk
|
80
|
+
def pipelined(&block)
|
81
|
+
connection.pipelined(&block)
|
76
82
|
end
|
77
83
|
|
78
84
|
# Destroys a record. Example:
|
data/lib/redpear/store/base.rb
CHANGED
@@ -2,12 +2,20 @@ require 'securerandom'
|
|
2
2
|
|
3
3
|
class Redpear::Store::Base
|
4
4
|
|
5
|
+
# Transforamtions
|
6
|
+
IS_NIL = lambda {|v| v.nil? }.freeze
|
7
|
+
IS_ZERO = lambda {|v| v.zero? }.freeze
|
8
|
+
IS_TRUE = lambda {|v| !!v }.freeze
|
9
|
+
TO_INT = lambda {|v| v.to_i }.freeze
|
10
|
+
TO_SET = lambda {|v| v.to_set }.freeze
|
11
|
+
PICK_FIRST = lambda {|v| v.first }.freeze
|
12
|
+
|
5
13
|
attr_reader :key, :conn
|
6
14
|
|
7
15
|
# Creates and yields over a temporary key.
|
8
16
|
# Useful in combination with e.g. `interstore`, `unionstore`, etc.
|
9
17
|
#
|
10
|
-
# @param [
|
18
|
+
# @param [Redis] conn
|
11
19
|
# The connection
|
12
20
|
# @param [Hash] options
|
13
21
|
# The options hash
|
@@ -32,7 +40,7 @@ class Redpear::Store::Base
|
|
32
40
|
# Constructor
|
33
41
|
# @param [String] key
|
34
42
|
# The storage key
|
35
|
-
# @param [
|
43
|
+
# @param [Redis] conn
|
36
44
|
# The connection
|
37
45
|
def initialize(key, conn)
|
38
46
|
@key, @conn = key, conn
|
@@ -126,4 +134,4 @@ class Redpear::Store::Base
|
|
126
134
|
end
|
127
135
|
end
|
128
136
|
|
129
|
-
end
|
137
|
+
end
|
@@ -1,8 +1,13 @@
|
|
1
1
|
class Redpear::Store::Counter < Redpear::Store::Value
|
2
|
-
|
2
|
+
|
3
3
|
# @return [Integer] the value
|
4
4
|
def get
|
5
|
-
super
|
5
|
+
case value = super
|
6
|
+
when Redis::Future
|
7
|
+
value.instance_eval { @transformation = TO_INT }
|
8
|
+
else
|
9
|
+
value.to_i
|
10
|
+
end
|
6
11
|
end
|
7
12
|
|
8
13
|
# Sets the value
|
@@ -41,4 +46,4 @@ class Redpear::Store::Counter < Redpear::Store::Value
|
|
41
46
|
alias_method :previous, :decrement
|
42
47
|
alias_method :prev, :decrement
|
43
48
|
|
44
|
-
end
|
49
|
+
end
|
@@ -5,4 +5,16 @@ class Redpear::Store::Enumerable < Redpear::Store::Base
|
|
5
5
|
# @see Redpear::Store::Base#value
|
6
6
|
alias_method :value, :to_a
|
7
7
|
|
8
|
-
|
8
|
+
# Alias for #length
|
9
|
+
# @return [Integer] the length
|
10
|
+
def size
|
11
|
+
length
|
12
|
+
end
|
13
|
+
|
14
|
+
# Alias for #length
|
15
|
+
# @return [Integer] the length
|
16
|
+
def count
|
17
|
+
length
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/lib/redpear/store/hash.rb
CHANGED
@@ -30,7 +30,12 @@ class Redpear::Store::Hash < Redpear::Store::Enumerable
|
|
30
30
|
|
31
31
|
# @return [Boolean] true, if empty
|
32
32
|
def empty?
|
33
|
-
length
|
33
|
+
case value = length
|
34
|
+
when Redis::Future
|
35
|
+
value.instance_eval { @transformation = IS_ZERO }
|
36
|
+
else
|
37
|
+
value.zero?
|
38
|
+
end
|
34
39
|
end
|
35
40
|
|
36
41
|
# @param [String] field
|
@@ -70,7 +75,6 @@ class Redpear::Store::Hash < Redpear::Store::Enumerable
|
|
70
75
|
def length
|
71
76
|
conn.hlen key
|
72
77
|
end
|
73
|
-
alias_method :size, :length
|
74
78
|
|
75
79
|
# @param [String] field
|
76
80
|
# The field to increment
|
@@ -97,9 +101,13 @@ class Redpear::Store::Hash < Redpear::Store::Enumerable
|
|
97
101
|
|
98
102
|
# @param [Hash] hash
|
99
103
|
# The pairs to update
|
100
|
-
def update(hash)
|
101
|
-
merge!(hash)
|
102
|
-
|
104
|
+
def update(hash)
|
105
|
+
case result = merge!(hash)
|
106
|
+
when Redis::Future
|
107
|
+
result
|
108
|
+
else
|
109
|
+
to_hash
|
110
|
+
end
|
103
111
|
end
|
104
112
|
|
105
113
|
# @param [Hash] hash
|
@@ -117,4 +125,4 @@ class Redpear::Store::Hash < Redpear::Store::Enumerable
|
|
117
125
|
other.respond_to?(:to_hash) && other.to_hash == to_hash
|
118
126
|
end
|
119
127
|
|
120
|
-
end
|
128
|
+
end
|
data/lib/redpear/store/list.rb
CHANGED
@@ -45,13 +45,18 @@ class Redpear::Store::List < Redpear::Store::Enumerable
|
|
45
45
|
# Destructive slice. Returns specified range and removes other items.
|
46
46
|
# @overload slice(start, length)
|
47
47
|
def slice!(start, length = nil)
|
48
|
-
case start
|
48
|
+
result = case start
|
49
49
|
when Range, Array
|
50
50
|
trim *range_pair(start)
|
51
51
|
else
|
52
52
|
trim(start, start + length - 1)
|
53
53
|
end
|
54
|
-
|
54
|
+
case result
|
55
|
+
when Redis::Future
|
56
|
+
result
|
57
|
+
else
|
58
|
+
to_a
|
59
|
+
end
|
55
60
|
end
|
56
61
|
|
57
62
|
# @param [Integer] start
|
@@ -71,7 +76,6 @@ class Redpear::Store::List < Redpear::Store::Enumerable
|
|
71
76
|
def length
|
72
77
|
conn.llen key
|
73
78
|
end
|
74
|
-
alias_method :size, :length
|
75
79
|
|
76
80
|
# Appends a single item. Chainable example:
|
77
81
|
# list << 'a' << 'b'
|
@@ -141,4 +145,4 @@ class Redpear::Store::List < Redpear::Store::Enumerable
|
|
141
145
|
conn.linsert key, :after, pivot, item
|
142
146
|
end
|
143
147
|
|
144
|
-
end
|
148
|
+
end
|
data/lib/redpear/store/set.rb
CHANGED
@@ -10,14 +10,19 @@ class Redpear::Store::Set < Redpear::Store::Enumerable
|
|
10
10
|
|
11
11
|
# @return [Set] all members
|
12
12
|
def all
|
13
|
-
members
|
13
|
+
case value = members
|
14
|
+
when Redis::Future
|
15
|
+
value.instance_eval { @transformation = TO_SET }
|
16
|
+
else
|
17
|
+
value.to_set
|
18
|
+
end
|
14
19
|
end
|
15
20
|
alias_method :to_set, :all
|
16
21
|
alias_method :value, :all
|
17
22
|
|
18
23
|
# @return [Array] the array of members
|
19
24
|
def members
|
20
|
-
conn.smembers(key)
|
25
|
+
conn.smembers(key)
|
21
26
|
end
|
22
27
|
alias_method :to_a, :members
|
23
28
|
|
@@ -25,7 +30,6 @@ class Redpear::Store::Set < Redpear::Store::Enumerable
|
|
25
30
|
def length
|
26
31
|
conn.scard key
|
27
32
|
end
|
28
|
-
alias_method :size, :length
|
29
33
|
|
30
34
|
# Adds a single value. Chainable example:
|
31
35
|
# set << 'a' << 'b'
|
@@ -52,7 +56,12 @@ class Redpear::Store::Set < Redpear::Store::Enumerable
|
|
52
56
|
|
53
57
|
# @return [Boolean] true, if empty
|
54
58
|
def empty?
|
55
|
-
length
|
59
|
+
case value = length
|
60
|
+
when Redis::Future
|
61
|
+
value.instance_eval { @transformation = IS_ZERO }
|
62
|
+
else
|
63
|
+
value.zero?
|
64
|
+
end
|
56
65
|
end
|
57
66
|
|
58
67
|
# Removes a random value
|
@@ -144,4 +153,4 @@ class Redpear::Store::Set < Redpear::Store::Enumerable
|
|
144
153
|
conn.smove key, target.to_s, value
|
145
154
|
end
|
146
155
|
|
147
|
-
end
|
156
|
+
end
|
@@ -21,7 +21,6 @@ class Redpear::Store::SortedSet < Redpear::Store::Enumerable
|
|
21
21
|
def length
|
22
22
|
conn.zcard key
|
23
23
|
end
|
24
|
-
alias_method :size, :length
|
25
24
|
|
26
25
|
# Returns items from range
|
27
26
|
# @param [Range] range
|
@@ -45,8 +44,7 @@ class Redpear::Store::SortedSet < Redpear::Store::Enumerable
|
|
45
44
|
# @param [String] member
|
46
45
|
# @return [Integer] the score for the given `member`
|
47
46
|
def score(member)
|
48
|
-
|
49
|
-
number.to_f if number
|
47
|
+
conn.zscore(key, member)
|
50
48
|
end
|
51
49
|
alias_method :[], :score
|
52
50
|
|
@@ -54,8 +52,7 @@ class Redpear::Store::SortedSet < Redpear::Store::Enumerable
|
|
54
52
|
# @param [String] member
|
55
53
|
# @return [Integer] the index for the given `member`
|
56
54
|
def index(member)
|
57
|
-
|
58
|
-
number.to_i if number
|
55
|
+
conn.zrank(key, member)
|
59
56
|
end
|
60
57
|
alias_method :rank, :index
|
61
58
|
|
@@ -63,8 +60,7 @@ class Redpear::Store::SortedSet < Redpear::Store::Enumerable
|
|
63
60
|
# @param [String] member
|
64
61
|
# @return [Integer] the index for the given `member`
|
65
62
|
def rindex(member)
|
66
|
-
|
67
|
-
number.to_i if number
|
63
|
+
conn.zrevrank(key, member)
|
68
64
|
end
|
69
65
|
alias_method :rrank, :rindex
|
70
66
|
|
@@ -76,13 +72,23 @@ class Redpear::Store::SortedSet < Redpear::Store::Enumerable
|
|
76
72
|
|
77
73
|
# @return [Boolean] true, if member is included
|
78
74
|
def include?(member)
|
79
|
-
|
75
|
+
case value = conn.zscore(key, member)
|
76
|
+
when Redis::Future
|
77
|
+
value.instance_eval { @transformation = IS_TRUE }
|
78
|
+
else
|
79
|
+
!!value
|
80
|
+
end
|
80
81
|
end
|
81
82
|
alias_method :member?, :include?
|
82
83
|
|
83
84
|
# @return [Boolean] true, if empty
|
84
85
|
def empty?
|
85
|
-
length
|
86
|
+
case value = length
|
87
|
+
when Redis::Future
|
88
|
+
value.instance_eval { @transformation = IS_ZERO }
|
89
|
+
else
|
90
|
+
value.zero?
|
91
|
+
end
|
86
92
|
end
|
87
93
|
|
88
94
|
# Returns a slice of members between index +range+, with the lower index returned first
|
@@ -153,7 +159,12 @@ class Redpear::Store::SortedSet < Redpear::Store::Enumerable
|
|
153
159
|
# Return with scores, defaults to true
|
154
160
|
# @return [Array] member + score for given `index`.
|
155
161
|
def at(index, options = {})
|
156
|
-
slice(index..index, options)
|
162
|
+
case value = slice(index..index, options)
|
163
|
+
when Redis::Future
|
164
|
+
value.instance_eval { @transformation = PICK_FIRST }
|
165
|
+
else
|
166
|
+
value.first
|
167
|
+
end
|
157
168
|
end
|
158
169
|
|
159
170
|
# @return [String] member with the lowest index
|
@@ -218,14 +229,16 @@ class Redpear::Store::SortedSet < Redpear::Store::Enumerable
|
|
218
229
|
# The member to increment
|
219
230
|
# @param [Integer] by
|
220
231
|
# The increment, defaults to 1
|
232
|
+
# @return [Float] the new value
|
221
233
|
def increment(member, by = 1)
|
222
|
-
conn.zincrby(key, by, member)
|
234
|
+
conn.zincrby(key, by, member)
|
223
235
|
end
|
224
236
|
|
225
237
|
# @param [String] member
|
226
238
|
# The member to decrement
|
227
239
|
# @param [Integer] by
|
228
240
|
# The decrement, defaults to 1
|
241
|
+
# @return [Float] the new value
|
229
242
|
def decrement(member, by = 1)
|
230
243
|
increment member, -by
|
231
244
|
end
|
@@ -238,4 +251,4 @@ class Redpear::Store::SortedSet < Redpear::Store::Enumerable
|
|
238
251
|
conn.send method, key, start, finish, options
|
239
252
|
end
|
240
253
|
|
241
|
-
end
|
254
|
+
end
|
data/lib/redpear/store/value.rb
CHANGED
@@ -43,12 +43,22 @@ class Redpear::Store::Value < Redpear::Store::Base
|
|
43
43
|
# @param [String] other
|
44
44
|
# @return [Boolean] true, if equals `other`
|
45
45
|
def ==(other)
|
46
|
-
value
|
46
|
+
case value = self.value
|
47
|
+
when Redis::Future
|
48
|
+
value.instance_eval { @transformation = Kernel.lambda {|v| v == other } }
|
49
|
+
else
|
50
|
+
value == other
|
51
|
+
end
|
47
52
|
end
|
48
53
|
|
49
54
|
# @return [Boolean] true, if value is nil
|
50
55
|
def nil?
|
51
|
-
value.
|
56
|
+
case value = self.value
|
57
|
+
when Redis::Future
|
58
|
+
value.instance_eval { @transformation = IS_NIL }
|
59
|
+
else
|
60
|
+
value.nil?
|
61
|
+
end
|
52
62
|
end
|
53
63
|
|
54
64
|
# @return [Boolean] true, if responds to `method`
|
@@ -63,4 +73,4 @@ class Redpear::Store::Value < Redpear::Store::Base
|
|
63
73
|
base.respond_to?(method) ? base.send(method, *a, &b) : super
|
64
74
|
end
|
65
75
|
|
66
|
-
end
|
76
|
+
end
|
data/lib/redpear/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redpear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
@@ -123,52 +123,36 @@ dependencies:
|
|
123
123
|
- - ! '>='
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: hiredis
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - ! '>='
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: '0'
|
134
|
-
type: :development
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ! '>='
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: '0'
|
142
126
|
description: Simple, elegant & efficient ORM for Redis
|
143
127
|
email: dimitrij@blacksquaremedia.com
|
144
128
|
executables: []
|
145
129
|
extensions: []
|
146
130
|
extra_rdoc_files: []
|
147
131
|
files:
|
148
|
-
- lib/redpear.rb
|
149
132
|
- lib/redpear/connection.rb
|
133
|
+
- lib/redpear/schema.rb
|
134
|
+
- lib/redpear/store/lock.rb
|
135
|
+
- lib/redpear/store/set.rb
|
136
|
+
- lib/redpear/store/base.rb
|
137
|
+
- lib/redpear/store/value.rb
|
138
|
+
- lib/redpear/store/sorted_set.rb
|
139
|
+
- lib/redpear/store/enumerable.rb
|
140
|
+
- lib/redpear/store/hash.rb
|
141
|
+
- lib/redpear/store/counter.rb
|
142
|
+
- lib/redpear/store/list.rb
|
143
|
+
- lib/redpear/concern.rb
|
144
|
+
- lib/redpear/store.rb
|
145
|
+
- lib/redpear/model.rb
|
150
146
|
- lib/redpear/schema/column.rb
|
147
|
+
- lib/redpear/schema/score.rb
|
151
148
|
- lib/redpear/schema/index.rb
|
152
149
|
- lib/redpear/schema/collection.rb
|
153
|
-
- lib/redpear/schema/score.rb
|
154
|
-
- lib/redpear/concern.rb
|
155
|
-
- lib/redpear/store.rb
|
156
150
|
- lib/redpear/model/factory_girl.rb
|
157
151
|
- lib/redpear/model/finders.rb
|
158
|
-
- lib/redpear/model/expiration.rb
|
159
152
|
- lib/redpear/model/machinist.rb
|
153
|
+
- lib/redpear/model/expiration.rb
|
160
154
|
- lib/redpear/version.rb
|
161
|
-
- lib/redpear
|
162
|
-
- lib/redpear/store/enumerable.rb
|
163
|
-
- lib/redpear/store/counter.rb
|
164
|
-
- lib/redpear/store/hash.rb
|
165
|
-
- lib/redpear/store/base.rb
|
166
|
-
- lib/redpear/store/value.rb
|
167
|
-
- lib/redpear/store/list.rb
|
168
|
-
- lib/redpear/store/set.rb
|
169
|
-
- lib/redpear/store/sorted_set.rb
|
170
|
-
- lib/redpear/model.rb
|
171
|
-
- lib/redpear/schema.rb
|
155
|
+
- lib/redpear.rb
|
172
156
|
homepage: https://github.com/bsm/redpear
|
173
157
|
licenses: []
|
174
158
|
post_install_message:
|
@@ -194,3 +178,4 @@ signing_key:
|
|
194
178
|
specification_version: 3
|
195
179
|
summary: Redpear, a Redis ORM
|
196
180
|
test_files: []
|
181
|
+
has_rdoc:
|