dm-redis-adapter 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +7 -2
- data/Rakefile +4 -3
- data/lib/dm_redis.rb +25 -13
- data/spec/dm_redis_spec.rb +1 -1
- data/spec/dm_redis_validations_spec.rb +59 -0
- metadata +22 -6
data/README.textile
CHANGED
@@ -8,11 +8,15 @@ Redis is a very fast key-value store with some interesting data structures added
|
|
8
8
|
|
9
9
|
Marrying DataMapper to Redis allows for schema-less models, you can add fields at any time without having to create a migration. DataMapper also allows us to store non-native Redis types in the db, like Date fields.
|
10
10
|
|
11
|
+
h1. Changelog
|
12
|
+
|
13
|
+
* v0.0.11 Updates to support newer versions of the redis client, support for JSON datatypes
|
14
|
+
|
11
15
|
h1. Install
|
12
16
|
|
13
17
|
Prerequisites:
|
14
18
|
* Redis:
|
15
|
-
** <a href="http://code.google.com/p/redis/">Redis, v1.
|
19
|
+
** <a href="http://code.google.com/p/redis/">Redis, v1.3.8</a>
|
16
20
|
* Gems:
|
17
21
|
** <a href="http://github.com/datamapper/dm-core/">dm-core</a> v0.10.2
|
18
22
|
|
@@ -85,4 +89,5 @@ h1. Badass contributors
|
|
85
89
|
|
86
90
|
* <a href="http://github.com/aeden">Anthony Eden (aeden)</a> Gem cleanup, update to jeweler
|
87
91
|
* <a href="http://github.com/sr">Simon Roset (sr)</a> Fixes for edge dm-core
|
88
|
-
* <a href="http://github.com/">Chris Hoffman (cehoffman)</a> Fixes for Ruby 1.9, bundler for development deps
|
92
|
+
* <a href="http://github.com/cehoffman">Chris Hoffman (cehoffman)</a> Fixes for Ruby 1.9, bundler for development deps
|
93
|
+
* <a href="http://github.com/bpo">brian p o'rourke (bpo)</a> Updates for newer versions of redis client and DM JSON type support
|
data/Rakefile
CHANGED
@@ -26,8 +26,9 @@ begin
|
|
26
26
|
gemspec.homepage = HOMEPAGE
|
27
27
|
gemspec.description = SUMMARY
|
28
28
|
gemspec.authors = AUTHORS
|
29
|
-
gemspec.add_dependency "dm-core", "0.10.
|
30
|
-
gemspec.add_dependency "
|
29
|
+
gemspec.add_dependency "dm-core", ">= 0.10.2"
|
30
|
+
gemspec.add_dependency "dm-types", ">= 0.10.2"
|
31
|
+
gemspec.add_dependency "redis"
|
31
32
|
gemspec.files = %w(MIT-LICENSE README.textile Rakefile) + Dir.glob("{lib,spec}/**/*")
|
32
33
|
gemspec.has_rdoc = true
|
33
34
|
gemspec.extra_rdoc_files = ["MIT-LICENSE"]
|
@@ -43,4 +44,4 @@ desc "Run specs"
|
|
43
44
|
Spec::Rake::SpecTask.new do |t|
|
44
45
|
t.spec_files = FileList['spec/**/*_spec.rb']
|
45
46
|
t.spec_opts = %w(-fs --color)
|
46
|
-
end
|
47
|
+
end
|
data/lib/dm_redis.rb
CHANGED
@@ -17,7 +17,7 @@ module DataMapper
|
|
17
17
|
def create(resources)
|
18
18
|
resources.each do |resource|
|
19
19
|
initialize_serial(resource, @redis.incr("#{resource.model.to_s.downcase}:#{redis_key_for(resource.model)}:serial"))
|
20
|
-
@redis.
|
20
|
+
@redis.sadd(key_set_for(resource.model), resource.key.join)
|
21
21
|
end
|
22
22
|
update_attributes(resources)
|
23
23
|
end
|
@@ -38,10 +38,18 @@ module DataMapper
|
|
38
38
|
records = records_for(query).each do |record|
|
39
39
|
query.fields.each do |property|
|
40
40
|
next if query.model.key.include?(property)
|
41
|
-
|
41
|
+
|
42
|
+
# Integers are stored as Strings in Redis. If there's a
|
43
|
+
# string coming out that should be an integer, convert it
|
44
|
+
# now. All other typecasting is handled by datamapper
|
45
|
+
# separately.
|
46
|
+
if property.primitive == Integer
|
47
|
+
record[property.name.to_s] = property.typecast(@redis["#{query.model.to_s.downcase}:#{record[redis_key_for(query.model)]}:#{property.name}"])
|
48
|
+
else
|
49
|
+
record[property.name.to_s] = @redis["#{query.model.to_s.downcase}:#{record[redis_key_for(query.model)]}:#{property.name}"]
|
50
|
+
end
|
42
51
|
end
|
43
52
|
end
|
44
|
-
|
45
53
|
records = query.match_records(records)
|
46
54
|
records = query.sort_records(records)
|
47
55
|
records
|
@@ -81,11 +89,11 @@ module DataMapper
|
|
81
89
|
def delete(collection)
|
82
90
|
records_for(collection.query).each do |record|
|
83
91
|
collection.query.model.properties.each do |p|
|
84
|
-
@redis.
|
92
|
+
@redis.del("#{collection.query.model.to_s.downcase}:#{record[redis_key_for(collection.query.model)]}:#{p.name}")
|
85
93
|
end
|
86
|
-
@redis.
|
94
|
+
@redis.srem(key_set_for(collection.query.model), record[redis_key_for(collection.query.model)])
|
87
95
|
collection.query.model.properties.select {|p| p.index}.each do |p|
|
88
|
-
@redis.
|
96
|
+
@redis.srem("#{collection.query.model.to_s.downcase}:#{p.name}:#{encode(record[p.name])}", record[redis_key_for(collection.query.model)])
|
89
97
|
end
|
90
98
|
end
|
91
99
|
end
|
@@ -101,13 +109,17 @@ module DataMapper
|
|
101
109
|
# @api private
|
102
110
|
def update_attributes(resources)
|
103
111
|
resources.each do |resource|
|
112
|
+
model = resource.model
|
113
|
+
attributes = resource.dirty_attributes
|
114
|
+
|
104
115
|
resource.model.properties.select {|p| p.index}.each do |property|
|
105
|
-
@redis.
|
116
|
+
@redis.sadd("#{resource.model.to_s.downcase}:#{property.name}:#{encode(resource[property.name.to_s])}", resource.key)
|
106
117
|
end
|
107
118
|
|
108
|
-
|
109
|
-
next
|
110
|
-
|
119
|
+
model.properties(self.name).each do |property|
|
120
|
+
next unless attributes.key?(property)
|
121
|
+
value = attributes[property]
|
122
|
+
@redis["#{resource.model.to_s.downcase}:#{resource.key.join}:#{property.name}"] = value unless value.nil?
|
111
123
|
end
|
112
124
|
end
|
113
125
|
end
|
@@ -127,7 +139,7 @@ module DataMapper
|
|
127
139
|
|
128
140
|
query.conditions.operands.select {|o| o.is_a?(DataMapper::Query::Conditions::EqualToComparison)}.each do |o|
|
129
141
|
if query.model.key.include?(o.subject)
|
130
|
-
if @redis.
|
142
|
+
if @redis.sismember(key_set_for(query.model), o.value)
|
131
143
|
keys << {"#{redis_key_for(query.model)}" => o.value}
|
132
144
|
end
|
133
145
|
end
|
@@ -144,7 +156,7 @@ module DataMapper
|
|
144
156
|
|
145
157
|
# Keys are empty, fall back and load all the values for this model
|
146
158
|
if keys.empty?
|
147
|
-
@redis.
|
159
|
+
@redis.smembers(key_set_for(query.model)).each do |val|
|
148
160
|
keys << {"#{redis_key_for(query.model)}" => val.to_i}
|
149
161
|
end
|
150
162
|
end
|
@@ -183,7 +195,7 @@ module DataMapper
|
|
183
195
|
# Array of id's of all members matching the query
|
184
196
|
# @api private
|
185
197
|
def find_matches(query, operand)
|
186
|
-
@redis.
|
198
|
+
@redis.smembers("#{query.model.to_s.downcase}:#{operand.subject.name}:#{encode(operand.value)}")
|
187
199
|
end
|
188
200
|
|
189
201
|
##
|
data/spec/dm_redis_spec.rb
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
require File.expand_path("../spec_helper", __FILE__)
|
2
|
+
require 'redis'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'dm-validations'
|
5
|
+
require 'dm-types'
|
6
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib/dm_redis.rb'))
|
7
|
+
|
8
|
+
describe DataMapper::Adapters::RedisAdapter do
|
9
|
+
before(:all) do
|
10
|
+
@adapter = DataMapper.setup(:default, {
|
11
|
+
:adapter => "redis",
|
12
|
+
:db => 15
|
13
|
+
})
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should validate unique entries that are indexed" do
|
17
|
+
class Crumblecake
|
18
|
+
include DataMapper::Resource
|
19
|
+
validates_is_unique :flavor
|
20
|
+
|
21
|
+
property :id, Serial
|
22
|
+
property :flavor, String, :index => true
|
23
|
+
end
|
24
|
+
|
25
|
+
Crumblecake.create(:flavor => "snozzbler")
|
26
|
+
Crumblecake.new(:flavor => "snozzbler").valid?.should be_false
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "json support" do
|
30
|
+
before(:all) do
|
31
|
+
class Host
|
32
|
+
include DataMapper::Resource
|
33
|
+
|
34
|
+
property :id, Serial
|
35
|
+
property :name, String
|
36
|
+
property :env, DataMapper::Types::Json, :default => lambda { {} }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be able to store json blocks" do
|
41
|
+
h = Host.create( :name => "new_vm", :env => {"foo" => "bar"} )
|
42
|
+
|
43
|
+
h.reload
|
44
|
+
h.env["foo"].should == "bar"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should be able to update json blocks" do
|
48
|
+
h = Host.create( :name => "new_vm" )
|
49
|
+
h.env = h.env.merge "baz" => "bof"
|
50
|
+
h.save
|
51
|
+
h.reload.env["baz"].should == "bof"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
after(:all) do
|
56
|
+
redis = Redis.new(:db => 15)
|
57
|
+
redis.flushdb
|
58
|
+
end
|
59
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 11
|
9
|
+
version: 0.0.11
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Dan Herrera
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-04-26 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
35
|
+
name: dm-types
|
36
36
|
prerelease: false
|
37
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
@@ -40,9 +40,23 @@ dependencies:
|
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
segments:
|
42
42
|
- 0
|
43
|
-
|
43
|
+
- 10
|
44
|
+
- 2
|
45
|
+
version: 0.10.2
|
44
46
|
type: :runtime
|
45
47
|
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: redis
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
58
|
+
type: :runtime
|
59
|
+
version_requirements: *id003
|
46
60
|
description: DataMapper adapter for the Redis key-value database
|
47
61
|
email: whoahbot@gmail.com
|
48
62
|
executables: []
|
@@ -57,6 +71,7 @@ files:
|
|
57
71
|
- Rakefile
|
58
72
|
- lib/dm_redis.rb
|
59
73
|
- spec/dm_redis_spec.rb
|
74
|
+
- spec/dm_redis_validations_spec.rb
|
60
75
|
- spec/spec_helper.rb
|
61
76
|
has_rdoc: true
|
62
77
|
homepage: http://github.com/whoahbot/dm-redis-adapter
|
@@ -86,8 +101,9 @@ requirements: []
|
|
86
101
|
rubyforge_project:
|
87
102
|
rubygems_version: 1.3.6
|
88
103
|
signing_key:
|
89
|
-
specification_version:
|
104
|
+
specification_version: 3
|
90
105
|
summary: DataMapper adapter for the Redis key-value database
|
91
106
|
test_files:
|
92
107
|
- spec/dm_redis_spec.rb
|
108
|
+
- spec/dm_redis_validations_spec.rb
|
93
109
|
- spec/spec_helper.rb
|