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 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.2.1</a>
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.0"
30
- gemspec.add_dependency "ezmobius-redis"
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.set_add(key_set_for(resource.model), resource.key.join)
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
- record[property.name.to_s] = property.typecast(@redis["#{query.model.to_s.downcase}:#{record[redis_key_for(query.model)]}:#{property.name}"])
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.delete("#{collection.query.model.to_s.downcase}:#{record[redis_key_for(collection.query.model)]}:#{p.name}")
92
+ @redis.del("#{collection.query.model.to_s.downcase}:#{record[redis_key_for(collection.query.model)]}:#{p.name}")
85
93
  end
86
- @redis.set_delete(key_set_for(collection.query.model), record[redis_key_for(collection.query.model)])
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.set_delete("#{collection.query.model.to_s.downcase}:#{p.name}:#{encode(record[p.name])}", record[redis_key_for(collection.query.model)])
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.set_add("#{resource.model.to_s.downcase}:#{property.name}:#{encode(resource[property.name.to_s])}", resource.key)
116
+ @redis.sadd("#{resource.model.to_s.downcase}:#{property.name}:#{encode(resource[property.name.to_s])}", resource.key)
106
117
  end
107
118
 
108
- resource.attributes(:field).each do |property, value|
109
- next if resource.key.include?(property)
110
- @redis["#{resource.model.to_s.downcase}:#{resource.key.join}:#{property}"] = value unless value.nil?
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.set_member?(key_set_for(query.model), o.value)
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.set_members(key_set_for(query.model)).each do |val|
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.set_members("#{query.model.to_s.downcase}:#{operand.subject.name}:#{encode(operand.value)}")
198
+ @redis.smembers("#{query.model.to_s.downcase}:#{operand.subject.name}:#{encode(operand.value)}")
187
199
  end
188
200
 
189
201
  ##
@@ -13,7 +13,7 @@ describe DataMapper::Adapters::RedisAdapter do
13
13
 
14
14
  after(:all) do
15
15
  redis = Redis.new(:db => 15)
16
- redis.flush_db
16
+ redis.flushdb
17
17
  end
18
18
 
19
19
  it_should_behave_like 'An Adapter'
@@ -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
- - 10
9
- version: 0.0.10
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-03-03 00:00:00 -08:00
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: redis
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
- version: "0"
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: 2
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