redis-objective 0.1.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/README.md +39 -0
- data/Rakefile +20 -0
- data/VERSION +1 -0
- data/lib/redis/objective.rb +59 -0
- data/spec/redis/objective_spec.rb +126 -0
- metadata +77 -0
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Store objects in Redis
|
2
|
+
|
3
|
+
sudo gem install redis-objective
|
4
|
+
|
5
|
+
Usage
|
6
|
+
=====
|
7
|
+
require 'redis/objective'
|
8
|
+
redis = Redis.new(:host => ...).objective
|
9
|
+
|
10
|
+
redis['xxx'] = {:foo => :bar}
|
11
|
+
redis['xxx'] # {:foo => :bar}
|
12
|
+
redis['xxx'] = nil # delete key 'xxx'
|
13
|
+
|
14
|
+
# Non-objects can be read:
|
15
|
+
pure = Redis.new
|
16
|
+
pure['xxx'] = 'abc'
|
17
|
+
redis['xxx'] # 'abc'
|
18
|
+
|
19
|
+
# get/set - many
|
20
|
+
redis.mset('xxx' => {:foo => :bat}, 'yyy' => 'something else') # {'xxx' => {:foo => :bar}, 'yyy' => 'something else'}
|
21
|
+
redis.mget('xxx','yyy') # {'xxx' => {:foo => :bar}, 'yyy' => 'something else'}
|
22
|
+
|
23
|
+
### Supported methods
|
24
|
+
|
25
|
+
- get / []
|
26
|
+
- set /set_with_expire / []=
|
27
|
+
- mget / mapped_mget
|
28
|
+
- mset / mapped_mset
|
29
|
+
- all other missing methods are delegated
|
30
|
+
|
31
|
+
TODO
|
32
|
+
====
|
33
|
+
- also unset keys that were set to nil via mset
|
34
|
+
|
35
|
+
Author
|
36
|
+
======
|
37
|
+
[Michael Grosser](http://pragmatig.wordpress.com)
|
38
|
+
grosser.michael@gmail.com
|
39
|
+
Hereby placed under public domain, do what you want, just do not hold me accountable...
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
task :default => :spec
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
Spec::Rake::SpecTask.new {|t| t.spec_opts = ['--color']}
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
project_name = 'redis-objective'
|
8
|
+
Jeweler::Tasks.new do |gem|
|
9
|
+
gem.name = project_name
|
10
|
+
gem.summary = "Store objects in Redis"
|
11
|
+
gem.email = "grosser.michael@gmail.com"
|
12
|
+
gem.homepage = "http://github.com/grosser/#{project_name}"
|
13
|
+
gem.authors = ["Michael Grosser"]
|
14
|
+
gem.add_dependency ['redis']
|
15
|
+
end
|
16
|
+
|
17
|
+
Jeweler::GemcutterTasks.new
|
18
|
+
rescue LoadError
|
19
|
+
puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"
|
20
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'redis'
|
2
|
+
|
3
|
+
class Redis::Client
|
4
|
+
def objective
|
5
|
+
@@objective ||= Redis::Objective.new(self)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class Redis::Objective
|
10
|
+
VERSION = File.read( File.join(File.dirname(__FILE__),'..','..','VERSION') ).strip
|
11
|
+
|
12
|
+
def initialize(client)
|
13
|
+
@client = client
|
14
|
+
end
|
15
|
+
|
16
|
+
def get(key, *args)
|
17
|
+
value = @client.get(key, *args)
|
18
|
+
return if value.nil?
|
19
|
+
YAML.load(value)
|
20
|
+
end
|
21
|
+
alias :[] :get
|
22
|
+
|
23
|
+
def set(key, value, *args)
|
24
|
+
if value.nil?
|
25
|
+
@client.del(key)
|
26
|
+
else
|
27
|
+
if args.empty?
|
28
|
+
@client.set(key, value.to_yaml)
|
29
|
+
else
|
30
|
+
@client.set_with_expire(key, value.to_yaml, *args)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
value
|
34
|
+
end
|
35
|
+
alias :[]= :set
|
36
|
+
alias :set_with_expire :set
|
37
|
+
|
38
|
+
def mapped_mget(*args)
|
39
|
+
@client.mapped_mget(*args).inject({}){|h,k_v| h[k_v[0]] = YAML.load(k_v[1]); h}
|
40
|
+
end
|
41
|
+
alias :mget :mapped_mget
|
42
|
+
|
43
|
+
def mset(*args)
|
44
|
+
# flatten given hash/nested array
|
45
|
+
if args.size == 1
|
46
|
+
args = args.first.inject([]){|a,k_v| a << k_v[0]; a << k_v[1]; a}
|
47
|
+
end
|
48
|
+
|
49
|
+
# serialize all values [k1, v1, k2, v2, ...]
|
50
|
+
args.size.times{|i| args[i] = args[i].to_yaml if i % 2 == 1 }
|
51
|
+
|
52
|
+
@client.mset(*args)
|
53
|
+
end
|
54
|
+
alias :mapped_mset :mset
|
55
|
+
|
56
|
+
def method_missing(name, *args, &block)
|
57
|
+
@client.send(name, *args, &block)
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
$LOAD_PATH << 'lib'
|
4
|
+
require 'redis/objective'
|
5
|
+
|
6
|
+
REDIS = Redis.new
|
7
|
+
|
8
|
+
REDIS['xxx'] = '1'
|
9
|
+
REDIS['xxx'].should == '1'
|
10
|
+
|
11
|
+
describe "Redis.objective" do
|
12
|
+
before do
|
13
|
+
REDIS.flushdb
|
14
|
+
end
|
15
|
+
|
16
|
+
describe :get do
|
17
|
+
before do
|
18
|
+
REDIS.objective.set('x',[1,2])
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'works through []' do
|
22
|
+
REDIS.objective['x'].should == [1,2]
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'works through get' do
|
26
|
+
REDIS.objective.get('x').should == [1,2]
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'does crash with nil' do
|
30
|
+
REDIS.objective.get('unknown').should == nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe :set do
|
35
|
+
it 'works through []' do
|
36
|
+
REDIS.objective['x'] = [1,2]
|
37
|
+
REDIS.objective['x'].should == [1,2]
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'works through set' do
|
41
|
+
REDIS.objective.set('x', [1,2])
|
42
|
+
REDIS.objective['x'].should == [1,2]
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'works through set_with_expire' do
|
46
|
+
pending 'my local redis server des not support this...'
|
47
|
+
REDIS.objective.set_with_expire('x', [1,2], 1)
|
48
|
+
REDIS.objective['x'].should == [1,2]
|
49
|
+
sleep 1
|
50
|
+
REDIS.objective['x'].should == nil
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'does not set nil' do
|
54
|
+
REDIS.objective['x'] = nil
|
55
|
+
REDIS['x'].should == nil
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'overwrites when setting nil' do
|
59
|
+
REDIS.objective['x'] = [1,2]
|
60
|
+
REDIS.objective['x'] = nil
|
61
|
+
REDIS['x'].should == nil
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'returns the set value' do
|
65
|
+
REDIS.objective.set('x',[1,2]).should == [1,2]
|
66
|
+
REDIS.objective.set('x',nil).should == nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe :mapped_mget do
|
71
|
+
before do
|
72
|
+
REDIS.objective['xx'] = [1,2]
|
73
|
+
REDIS.objective['xy'] = [3,4]
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'gets objective' do
|
77
|
+
REDIS.objective.mapped_mget('xx','xy').should == {'xx' => [1,2], 'xy' => [3,4]}
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'does not crash with nil' do
|
81
|
+
REDIS.objective.mapped_mget('xx','unknown').should == {'xx' => [1,2]}
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'works with mget' do
|
85
|
+
REDIS.objective.mget('xx','unknown').should == {'xx' => [1,2]}
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe :mapped_mset do
|
90
|
+
it 'sets objective' do
|
91
|
+
REDIS.objective.mapped_mset('xx' => [1,2], 'xy' => [3,4])
|
92
|
+
REDIS.objective['xx'].should == [1,2]
|
93
|
+
REDIS.objective['xy'].should == [3,4]
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'sets with nested array' do
|
97
|
+
REDIS.objective.mapped_mset([['xx', [1,2]], ['xy', [3,4]]])
|
98
|
+
REDIS.objective['xx'].should == [1,2]
|
99
|
+
REDIS.objective['xy'].should == [3,4]
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'sets with flat array' do
|
103
|
+
REDIS.objective.mapped_mset('xx', [1,2], 'xy', [3,4])
|
104
|
+
REDIS.objective['xx'].should == [1,2]
|
105
|
+
REDIS.objective['xy'].should == [3,4]
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'sets with mset' do
|
109
|
+
REDIS.objective.mset('xx', [1,2], 'xy', [3,4])
|
110
|
+
REDIS.objective['xx'].should == [1,2]
|
111
|
+
REDIS.objective['xy'].should == [3,4]
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'can set nil' do
|
115
|
+
REDIS.objective.mset('xx', [1,2], 'xy', nil)
|
116
|
+
REDIS.objective['xx'].should == [1,2]
|
117
|
+
REDIS.objective['xy'].should == nil
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'deletes keys that are set to nil'
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'has a version' do
|
124
|
+
Redis::Objective::VERSION.should =~ /^\d+\.\d+\.\d+$/
|
125
|
+
end
|
126
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redis-objective
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Michael Grosser
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-04-13 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: redis
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
32
|
+
description:
|
33
|
+
email: grosser.michael@gmail.com
|
34
|
+
executables: []
|
35
|
+
|
36
|
+
extensions: []
|
37
|
+
|
38
|
+
extra_rdoc_files:
|
39
|
+
- README.md
|
40
|
+
files:
|
41
|
+
- README.md
|
42
|
+
- Rakefile
|
43
|
+
- VERSION
|
44
|
+
- lib/redis/objective.rb
|
45
|
+
- spec/redis/objective_spec.rb
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: http://github.com/grosser/redis-objective
|
48
|
+
licenses: []
|
49
|
+
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options:
|
52
|
+
- --charset=UTF-8
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 1.3.6
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: Store objects in Redis
|
76
|
+
test_files:
|
77
|
+
- spec/redis/objective_spec.rb
|