redis-objects 0.5.1 → 0.5.2

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/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,11 @@
1
1
  = Changelog for Redis::Objects
2
2
 
3
+ == 0.5.2 [Development]
4
+
5
+ * Added Redis::SortedSet#member? method [Karl Varga]
6
+
7
+ * Added +ttl+ method to CoreCommands [Karl Varga]
8
+
3
9
  == 0.5.1 [Final] (23 May 2011)
4
10
 
5
11
  * Fixed super class delegation conflicts with Redis Counters vs ActiveRecord [Tim Aßmann]
data/Rakefile CHANGED
@@ -11,6 +11,7 @@ begin
11
11
  gem.homepage = "http://github.com/nateware/redis-objects"
12
12
  gem.authors = ["Nate Wiger"]
13
13
  gem.add_development_dependency "bacon", ">= 0"
14
+ gem.add_development_dependency "redis-namespace", ">= 0"
14
15
  gem.requirements << 'redis, v2.1.1 or greater'
15
16
  gem.add_dependency('redis', '>= 2.1.1') # ALSO: update spec/spec_helper.rb
16
17
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.1
1
+ 0.5.2
data/lib/redis/counter.rb CHANGED
@@ -28,6 +28,14 @@ class Redis
28
28
  true # hack for redis-rb regression
29
29
  end
30
30
 
31
+ # Reset the counter to its starting value, and return previous value.
32
+ # Use this to "reap" the counter and save it somewhere else. This is
33
+ # atomic in that no increments or decrements are lost if you process
34
+ # the returned value.
35
+ def getset(to=options[:start])
36
+ redis.getset(key, to.to_i).to_i
37
+ end
38
+
31
39
  # Returns the current value of the counter. Normally just calling the
32
40
  # counter will lazily fetch the value, and only update it if increment
33
41
  # or decrement is called. This forces a network call to redis-server
@@ -37,7 +37,11 @@ class Redis
37
37
  def expireat(unixtime)
38
38
  redis.expire key, unixtime
39
39
  end
40
-
40
+
41
+ def ttl
42
+ redis.ttl(@key).seconds
43
+ end
44
+
41
45
  def move(dbindex)
42
46
  redis.move key, dbindex
43
47
  end
data/lib/redis/list.rb CHANGED
@@ -55,7 +55,8 @@ class Redis
55
55
  # a range of values using Redis: LRANGE.
56
56
  def [](index, length=nil)
57
57
  if index.is_a? Range
58
- range(index.first, index.last)
58
+ last = index.exclude_end? ? (index.last - 1) : index.last
59
+ range(index.first, last)
59
60
  elsif length
60
61
  case length <=> 0
61
62
  when 1 then range(index, index + length - 1)
@@ -79,6 +79,13 @@ class Redis
79
79
  redis.set(redis_field_key(name, id), to.to_i)
80
80
  true
81
81
  end
82
+
83
+ # Set a counter to its starting value and return the old value.
84
+ def getset_counter(name, id=nil, to=nil)
85
+ verify_counter_defined!(name, id)
86
+ to = @redis_objects[name][:start] if to.nil?
87
+ redis.getset(redis_field_key(name, id), to.to_i).to_i
88
+ end
82
89
 
83
90
  private
84
91
 
@@ -168,8 +168,8 @@ class Redis
168
168
  alias_method :incrby, :increment
169
169
 
170
170
  # Convenience to calling increment() with a negative number.
171
- def decrement(by=1)
172
- redis.zincrby(key, -by).to_i
171
+ def decrement(member, by=1)
172
+ redis.zincrby(key, -by, member).to_i
173
173
  end
174
174
  alias_method :decr, :decrement
175
175
  alias_method :decrby, :decrement
@@ -286,6 +286,11 @@ class Redis
286
286
  redis.zcount(key, min, max)
287
287
  end
288
288
 
289
+ # Return a boolean indicating whether +value+ is a member.
290
+ def member?(value)
291
+ !redis.zscore(key, to_redis(value)).nil?
292
+ end
293
+
289
294
  private
290
295
 
291
296
  def keys_from_objects(sets)
@@ -4,14 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{redis-objects}
8
- s.version = "0.5.1"
7
+ s.name = "redis-objects"
8
+ s.version = "0.5.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nate Wiger"]
12
- s.date = %q{2011-05-23}
13
- s.description = %q{Map Redis types directly to Ruby objects. Works with any class or ORM.}
14
- s.email = %q{nate@wiger.org}
12
+ s.date = "2011-09-20"
13
+ s.description = "Map Redis types directly to Ruby objects. Works with any class or ORM."
14
+ s.email = "nate@wiger.org"
15
15
  s.extra_rdoc_files = [
16
16
  "README.rdoc"
17
17
  ]
@@ -46,24 +46,27 @@ Gem::Specification.new do |s|
46
46
  "spec/redis_objects_model_spec.rb",
47
47
  "spec/spec_helper.rb"
48
48
  ]
49
- s.homepage = %q{http://github.com/nateware/redis-objects}
49
+ s.homepage = "http://github.com/nateware/redis-objects"
50
50
  s.require_paths = ["lib"]
51
51
  s.requirements = ["redis, v2.1.1 or greater"]
52
- s.rubygems_version = %q{1.7.2}
53
- s.summary = %q{Map Redis types directly to Ruby objects}
52
+ s.rubygems_version = "1.8.10"
53
+ s.summary = "Map Redis types directly to Ruby objects"
54
54
 
55
55
  if s.respond_to? :specification_version then
56
56
  s.specification_version = 3
57
57
 
58
58
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
59
  s.add_development_dependency(%q<bacon>, [">= 0"])
60
+ s.add_development_dependency(%q<redis-namespace>, [">= 0"])
60
61
  s.add_runtime_dependency(%q<redis>, [">= 2.1.1"])
61
62
  else
62
63
  s.add_dependency(%q<bacon>, [">= 0"])
64
+ s.add_dependency(%q<redis-namespace>, [">= 0"])
63
65
  s.add_dependency(%q<redis>, [">= 2.1.1"])
64
66
  end
65
67
  else
66
68
  s.add_dependency(%q<bacon>, [">= 0"])
69
+ s.add_dependency(%q<redis-namespace>, [">= 0"])
67
70
  s.add_dependency(%q<redis>, [">= 2.1.1"])
68
71
  end
69
72
  end
@@ -81,6 +81,10 @@ begin
81
81
  @ar2.total.decrement.should == 1
82
82
  @ar2.total.reset
83
83
  @ar2.total.should == 0
84
+ @ar2.total.reset(55)
85
+ @ar2.total.should == 55
86
+ @ar2.total.getset(12).should == 55
87
+ @ar2.total.should == 12
84
88
  @ar2.destroy
85
89
  end
86
90
 
@@ -147,6 +147,7 @@ describe Redis::List do
147
147
  # Test against similar Ruby functionality
148
148
  a = @list.values
149
149
  @list[0..2].should == a[0..2]
150
+ @list[0...2].should == a[0...2]
150
151
  @list.slice(0..2).should == a.slice(0..2)
151
152
  @list[0, 2].should == a[0, 2]
152
153
  @list.range(0, 2).should == a[0..2] # range for Redis works like .. in Ruby
@@ -266,6 +267,8 @@ describe Redis::Counter do
266
267
  @counter.should == 0
267
268
  @counter.reset(15).should.be.true
268
269
  @counter.should == 15
270
+ @counter.getset(111).should == 15
271
+ @counter.should == 111
269
272
  end
270
273
 
271
274
  after do
@@ -193,6 +193,8 @@ describe Redis::Objects do
193
193
  Roster.decrement_counter(:available_slots, @roster.id).should == 11
194
194
  Roster.reset_counter(:available_slots, @roster.id).should == true
195
195
  Roster.get_counter(:available_slots, @roster.id).should == 10
196
+ Roster.getset_counter(:available_slots, @roster.id, 555).should == 10
197
+ Roster.get_counter(:available_slots, @roster.id).should == 555
196
198
  end
197
199
 
198
200
  it "should support class-level increment/decrement of global counters" do
@@ -211,6 +213,8 @@ describe Redis::Objects do
211
213
  Roster.decrement_counter(:total_players_online).should == 1
212
214
  Roster.reset_counter(:total_players_online).should == true
213
215
  Roster.get_counter(:total_players_online).should == 0
216
+ Roster.getset_counter(:total_players_online, nil, 111).should == 0
217
+ Roster.get_counter(:total_players_online).should == 111
214
218
  end
215
219
 
216
220
  it "should take an atomic block for increment/decrement" do
data/spec/spec_helper.rb CHANGED
@@ -6,17 +6,33 @@ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
6
6
  require 'bacon'
7
7
  Bacon.summary_at_exit
8
8
 
9
- $redis = Redis.new(:host => ENV['REDIS_HOST'], :port => ENV['REDIS_PORT'])
10
-
11
9
  UNIONSTORE_KEY = 'test:unionstore'
12
10
  INTERSTORE_KEY = 'test:interstore'
13
11
  DIFFSTORE_KEY = 'test:diffstore'
14
12
 
13
+ # Start our own redis-server to avoid corrupting any others
14
+ REDIS_BIN = 'redis-server'
15
+ REDIS_PORT = ENV['REDIS_PORT'] || 9212
16
+ REDIS_HOST = ENV['REDIS_HOST'] || 'localhost'
17
+ REDIS_PID = File.expand_path 'redis.pid', File.dirname(__FILE__)
18
+ REDIS_DUMP = File.expand_path 'redis.rdb', File.dirname(__FILE__)
19
+ puts "=> Starting redis-server on #{REDIS_HOST}:#{REDIS_PORT}"
20
+ fork_pid = fork do
21
+ system "(echo port #{REDIS_PORT}; echo logfile /dev/null; echo daemonize yes; echo pidfile #{REDIS_PID}; echo dbfilename #{REDIS_DUMP}) | #{REDIS_BIN} -"
22
+ end
23
+ at_exit do
24
+ pid = File.read(REDIS_PID).to_i
25
+ puts "=> Killing #{REDIS_BIN} with pid #{pid}"
26
+ Process.kill "TERM", pid
27
+ Process.kill "KILL", pid
28
+ File.unlink REDIS_PID, REDIS_DUMP
29
+ end
30
+
31
+ # Grab a global handle
32
+ $redis = Redis.new(:host => REDIS_HOST, :port => REDIS_PORT)
15
33
 
16
34
  SORT_ORDER = {:order => 'desc alpha'}
17
35
  SORT_LIMIT = {:limit => [2, 2]}
18
36
  SORT_BY = {:by => 'm_*'}
19
37
  SORT_GET = {:get => 'spec/*/sorted'}.merge!(SORT_LIMIT)
20
38
  SORT_STORE = {:store => "spec/aftersort"}.merge!(SORT_GET)
21
-
22
-
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: redis-objects
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.5.1
5
+ version: 0.5.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nate Wiger
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-23 00:00:00 Z
13
+ date: 2011-09-20 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bacon
@@ -24,16 +24,27 @@ dependencies:
24
24
  type: :development
25
25
  version_requirements: *id001
26
26
  - !ruby/object:Gem::Dependency
27
- name: redis
27
+ name: redis-namespace
28
28
  prerelease: false
29
29
  requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ type: :development
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: redis
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
30
41
  none: false
31
42
  requirements:
32
43
  - - ">="
33
44
  - !ruby/object:Gem::Version
34
45
  version: 2.1.1
35
46
  type: :runtime
36
- version_requirements: *id002
47
+ version_requirements: *id003
37
48
  description: Map Redis types directly to Ruby objects. Works with any class or ORM.
38
49
  email: nate@wiger.org
39
50
  executables: []
@@ -95,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
106
  requirements:
96
107
  - redis, v2.1.1 or greater
97
108
  rubyforge_project:
98
- rubygems_version: 1.7.2
109
+ rubygems_version: 1.8.10
99
110
  signing_key:
100
111
  specification_version: 3
101
112
  summary: Map Redis types directly to Ruby objects