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 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