redis-objects 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +37 -0
- data/README.rdoc +26 -15
- data/lib/redis/helpers/serialize.rb +2 -0
- data/lib/redis/list.rb +1 -1
- data/lib/redis/sorted_set.rb +1 -1
- data/spec/redis_objects_instance_spec.rb +25 -6
- data/spec/redis_objects_model_spec.rb +3 -3
- metadata +6 -6
- data/ChangeLog +0 -23
data/CHANGELOG.rdoc
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
= Changelog for Redis::Objects
|
2
|
+
|
3
|
+
== 0.3.0 [Final] (14 April 2010)
|
4
|
+
|
5
|
+
* Due to Ruby 1.9 bugs and performance considerations, marshaling of
|
6
|
+
data types is now OFF by default. You must say :marshal => true for
|
7
|
+
any objects that you want serialization enabled on. [Nate Wiger]
|
8
|
+
|
9
|
+
* Sorted Set class changed slightly due to feedback. You can now get
|
10
|
+
an individual element back via @set['item'] since it acts like a Hash.
|
11
|
+
|
12
|
+
== 0.2.4 [Final] (9 April 2010)*
|
13
|
+
|
14
|
+
* Added sorted set support via Redis::SortedSet [Nate Wiger]
|
15
|
+
|
16
|
+
== 0.2.3 [Final] (18 February 2010)*
|
17
|
+
|
18
|
+
* Added lock expiration to Redis::Lock [Ben VandenBos]
|
19
|
+
|
20
|
+
* Fixed some bugs [Ben VandenBos]
|
21
|
+
|
22
|
+
* Added lock tests and test helpers [Ben VandenBos]
|
23
|
+
|
24
|
+
== 0.2.2 [Final] (14 December 2009)*
|
25
|
+
|
26
|
+
* Added @set.diff(@set2) with "^" and "-" synonyms (oversight). [Nate Wiger]
|
27
|
+
|
28
|
+
* Implemented Redis core commands in all data types, such as rename. [Nate Wiger]
|
29
|
+
|
30
|
+
* Renamed Redis::Serialize to Redis::Helpers::Serialize to keep Redis:: cleaner. [Nate Wiger]
|
31
|
+
|
32
|
+
* More spec coverage. [Nate Wiger]
|
33
|
+
|
34
|
+
== 0.2.1 [Final] (27 November 2009)*
|
35
|
+
|
36
|
+
* First worthwhile public release, with good spec coverage and functionality. [Nate Wiger]
|
37
|
+
|
data/README.rdoc
CHANGED
@@ -12,7 +12,7 @@ to Ruby objects, via a thin layer over Ezra's +redis+ gem. It offers several ad
|
|
12
12
|
over the lower-level redis-rb API:
|
13
13
|
|
14
14
|
1. Easy to integrate directly with existing ORMs - ActiveRecord, DataMapper, etc. Add counters to your model!
|
15
|
-
2. Complex data structures are automatically Marshaled
|
15
|
+
2. Complex data structures are automatically Marshaled (if you set :marshal => true)
|
16
16
|
3. Integers are returned as integers, rather than '17'
|
17
17
|
4. Higher-level types are provided, such as Locks, that wrap multiple calls
|
18
18
|
|
@@ -171,10 +171,10 @@ Simple values are easy as well:
|
|
171
171
|
@value.value = 'a'
|
172
172
|
@value.delete
|
173
173
|
|
174
|
-
|
174
|
+
Complex data is no problem with :marshal => true:
|
175
175
|
|
176
176
|
@account = Account.create!(params[:account])
|
177
|
-
@newest = Redis::Value.new('newest_account')
|
177
|
+
@newest = Redis::Value.new('newest_account', :marshal => true)
|
178
178
|
@newest.value = @account.attributes
|
179
179
|
puts @newest.value['username']
|
180
180
|
|
@@ -198,16 +198,15 @@ Lists work just like Ruby arrays:
|
|
198
198
|
@list.clear
|
199
199
|
# etc
|
200
200
|
|
201
|
-
Complex data types are no problem:
|
201
|
+
Complex data types are no problem with :marshal => true:
|
202
202
|
|
203
|
+
@list = Redis::List.new('list_name', :marshal => true)
|
203
204
|
@list << {:name => "Nate", :city => "San Diego"}
|
204
205
|
@list << {:name => "Peter", :city => "Oceanside"}
|
205
206
|
@list.each do |el|
|
206
207
|
puts "#{el[:name]} lives in #{el[:city]}"
|
207
208
|
end
|
208
209
|
|
209
|
-
This gem will automatically marshal complex data, similar to how session stores work.
|
210
|
-
|
211
210
|
=== Sets
|
212
211
|
|
213
212
|
Sets work like the Ruby {Set}[http://ruby-doc.org/core/classes/Set.html] class:
|
@@ -248,8 +247,10 @@ Or store them in Redis:
|
|
248
247
|
@set1.diffstore('diffname', @set2, @set3)
|
249
248
|
members = @set1.redis.get('diffname')
|
250
249
|
|
251
|
-
And use complex data types too:
|
250
|
+
And use complex data types too, with :marshal => true:
|
252
251
|
|
252
|
+
@set1 = Redis::Set.new('set1', :marshal => true)
|
253
|
+
@set2 = Redis::Set.new('set2', :marshal => true)
|
253
254
|
@set1 << {:name => "Nate", :city => "San Diego"}
|
254
255
|
@set1 << {:name => "Peter", :city => "Oceanside"}
|
255
256
|
@set2 << {:name => "Nate", :city => "San Diego"}
|
@@ -269,15 +270,20 @@ a Hash and an Array. You assign like a Hash, but retrieve like an Array:
|
|
269
270
|
@sorted_set['Nate'] = 15
|
270
271
|
@sorted_set['Peter'] = 75
|
271
272
|
@sorted_set['Jeff'] = 24
|
272
|
-
|
273
|
-
# atomic increment
|
274
|
-
@sorted_set.increment('Nate')
|
275
|
-
@sorted_set.incr('Peter') # shorthand
|
276
|
-
@sorted_set.incr('Jeff', 4)
|
277
273
|
|
278
|
-
|
274
|
+
# Array access to get sorted order
|
275
|
+
@sorted_set[0..2] # => ["Nate", "Jeff", "Peter"]
|
276
|
+
@sorted_set[0,2] # => ["Nate", "Jeff"]
|
277
|
+
|
278
|
+
@sorted_set['Peter'] # => 75
|
279
|
+
@sorted_set['Jeff'] # => 24
|
280
|
+
@sorted_set.score('Jeff') # same thing (24)
|
281
|
+
|
282
|
+
@sorted_set.rank('Peter') # => 2
|
283
|
+
@sorted_set.rank('Jeff') # => 1
|
284
|
+
|
279
285
|
@sorted_set.first # => "Nate"
|
280
|
-
@sorted_set.last # => "
|
286
|
+
@sorted_set.last # => "Peter"
|
281
287
|
@sorted_set.revrange(0,2) # => ["Peter", "Jeff", "Nate"]
|
282
288
|
|
283
289
|
@sorted_set['Newbie'] = 1
|
@@ -286,7 +292,12 @@ a Hash and an Array. You assign like a Hash, but retrieve like an Array:
|
|
286
292
|
@sorted_set.rangebyscore(10, 100, :limit => 2) # => ["Nate", "Jeff"]
|
287
293
|
@sorted_set.members(:withscores => true) # => [["Newbie", 1], ["Nate", 16], ["Jeff", 28], ["Peter", 76]]
|
288
294
|
|
289
|
-
|
295
|
+
# atomic increment
|
296
|
+
@sorted_set.increment('Nate')
|
297
|
+
@sorted_set.incr('Peter') # shorthand
|
298
|
+
@sorted_set.incr('Jeff', 4)
|
299
|
+
|
300
|
+
The other Redis Sorted Set commands are supported as well; see {Sorted Sets API}[http://code.google.com/p/redis/wiki/SortedSets].
|
290
301
|
|
291
302
|
== Atomic Counters and Locks
|
292
303
|
|
@@ -4,6 +4,7 @@ class Redis
|
|
4
4
|
include Marshal
|
5
5
|
|
6
6
|
def to_redis(value)
|
7
|
+
return value unless options[:marshal]
|
7
8
|
case value
|
8
9
|
when String, Fixnum, Bignum, Float
|
9
10
|
value
|
@@ -13,6 +14,7 @@ class Redis
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def from_redis(value)
|
17
|
+
return value unless options[:marshal]
|
16
18
|
case value
|
17
19
|
when Array
|
18
20
|
value.collect{|v| from_redis(v)}
|
data/lib/redis/list.rb
CHANGED
data/lib/redis/sorted_set.rb
CHANGED
@@ -27,15 +27,24 @@ describe Redis::Value do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should handle complex marshaled values" do
|
30
|
+
@value.options[:marshal] = true
|
30
31
|
@value.should == nil
|
31
32
|
@value.value = {:json => 'data'}
|
32
33
|
@value.should == {:json => 'data'}
|
33
|
-
|
34
|
+
|
35
|
+
# no marshaling
|
36
|
+
@value.options[:marshal] = false
|
37
|
+
v = {:json => 'data'}
|
38
|
+
@value.value = v
|
39
|
+
@value.should == v.to_s
|
40
|
+
|
41
|
+
@value.options[:marshal] = true
|
34
42
|
@value.value = [[1,2], {:t3 => 4}]
|
35
43
|
@value.should == [[1,2], {:t3 => 4}]
|
36
44
|
@value.get.should == [[1,2], {:t3 => 4}]
|
37
45
|
@value.del.should be_true
|
38
46
|
@value.should be_nil
|
47
|
+
@value.options[:marshal] = false
|
39
48
|
end
|
40
49
|
|
41
50
|
it "should support renaming values" do
|
@@ -106,6 +115,7 @@ describe Redis::List do
|
|
106
115
|
@list << 'j'
|
107
116
|
@list.should == ['a','c','f','j']
|
108
117
|
@list[0..2].should == ['a','c','f']
|
118
|
+
@list[0, 2].should == ['a','c','f'] # consistent with Redis, not Ruby
|
109
119
|
@list[1, 3].should == ['c','f','j']
|
110
120
|
@list.length.should == 4
|
111
121
|
@list.size.should == 4
|
@@ -138,13 +148,17 @@ describe Redis::List do
|
|
138
148
|
end
|
139
149
|
|
140
150
|
it "should handle lists of complex data types" do
|
141
|
-
@list
|
142
|
-
|
143
|
-
|
144
|
-
@list
|
151
|
+
@list.options[:marshal] = true
|
152
|
+
v1 = {:json => 'data'}
|
153
|
+
v2 = {:json2 => 'data2'}
|
154
|
+
@list << v1
|
155
|
+
@list << v2
|
156
|
+
@list.first.should == v1
|
157
|
+
@list.last.should == v2
|
145
158
|
@list << [1,2,3,[4,5]]
|
146
159
|
@list.last.should == [1,2,3,[4,5]]
|
147
160
|
@list.shift.should == {:json => 'data'}
|
161
|
+
@list.options[:marshal] = false
|
148
162
|
end
|
149
163
|
|
150
164
|
it "should support renaming lists" do
|
@@ -442,15 +456,20 @@ describe Redis::SortedSet do
|
|
442
456
|
@set['a'] = 21
|
443
457
|
@set.add('a', 5)
|
444
458
|
@set.score('a').should == 5
|
459
|
+
@set['a'].should == 5
|
445
460
|
@set['a'] = 3
|
446
461
|
@set['b'] = 5
|
462
|
+
@set['b'].should == 5
|
447
463
|
@set['c'] = 4
|
448
464
|
|
449
465
|
@set[0,-1].should == ['a','c','b']
|
466
|
+
@set[0..2].should == ['a','c','b']
|
467
|
+
@set[0,2].should == ['a','c','b'] # consistent with Redis, not Ruby
|
468
|
+
@set.range(0,1,:withscores => true).should == [['a',3],['c',4]]
|
450
469
|
@set.range(0,-1).should == ['a','c','b']
|
451
470
|
@set.revrange(0,-1).should == ['b','c','a']
|
452
471
|
@set[0..1].should == ['a','c']
|
453
|
-
@set[1].should ==
|
472
|
+
@set[1].should == 0 # missing
|
454
473
|
@set.at(1).should == 'c'
|
455
474
|
@set.first.should == 'a'
|
456
475
|
@set.last.should == 'b'
|
@@ -10,9 +10,9 @@ class Roster
|
|
10
10
|
counter :pitchers, :limit => :max_pitchers
|
11
11
|
counter :basic
|
12
12
|
lock :resort, :timeout => 2
|
13
|
-
value :starting_pitcher
|
14
|
-
list :player_stats
|
15
|
-
set :outfielders
|
13
|
+
value :starting_pitcher, :marshal => true
|
14
|
+
list :player_stats, :marshal => true
|
15
|
+
set :outfielders, :marshal => true
|
16
16
|
|
17
17
|
# global class counters
|
18
18
|
counter :total_players_online, :global => true
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Nate Wiger
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-14 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -39,7 +39,7 @@ extensions: []
|
|
39
39
|
|
40
40
|
extra_rdoc_files:
|
41
41
|
- ATOMICITY.rdoc
|
42
|
-
-
|
42
|
+
- CHANGELOG.rdoc
|
43
43
|
- README.rdoc
|
44
44
|
files:
|
45
45
|
- lib/redis/counter.rb
|
@@ -61,7 +61,7 @@ files:
|
|
61
61
|
- spec/redis_objects_model_spec.rb
|
62
62
|
- spec/spec_helper.rb
|
63
63
|
- ATOMICITY.rdoc
|
64
|
-
-
|
64
|
+
- CHANGELOG.rdoc
|
65
65
|
- README.rdoc
|
66
66
|
has_rdoc: true
|
67
67
|
homepage: http://github.com/nateware/redis-objects
|
data/ChangeLog
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
|
2
|
-
*0.2.3 [Final] (18 February 2010)*
|
3
|
-
|
4
|
-
* Added lock expiration to Redis::Lock [Ben VandenBos]
|
5
|
-
|
6
|
-
* Fixed some bugs [Ben VandenBos]
|
7
|
-
|
8
|
-
* Added lock tests and test helpers [Ben VandenBos]
|
9
|
-
|
10
|
-
*0.2.2 [Final] (14 December 2009)*
|
11
|
-
|
12
|
-
* Added @set.diff(@set2) with "^" and "-" synonyms (oversight). [Nate Wiger]
|
13
|
-
|
14
|
-
* Implemented Redis core commands in all data types, such as rename. [Nate Wiger]
|
15
|
-
|
16
|
-
* Renamed Redis::Serialize to Redis::Helpers::Serialize to keep Redis:: cleaner. [Nate Wiger]
|
17
|
-
|
18
|
-
* More spec coverage. [Nate Wiger]
|
19
|
-
|
20
|
-
*0.2.1 [Final] (27 November 2009)*
|
21
|
-
|
22
|
-
* First worthwhile public release, with good spec coverage and functionality. [Nate Wiger]
|
23
|
-
|