dm-redis-adapter 0.0.10 → 0.0.11
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.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
|