whoahbot-dm-redis-adapter 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,29 +2,26 @@ h1. dm-redis-adapter
2
2
 
3
3
  This is a <a href="http://datamapper.org">DataMapper</a> adapter for the <a href="http://github.com/antirez/redis/">Redis</a> key-value database.
4
4
 
5
- Redis is a very fast key-value store with some interesting data structures added. You can have a key that is a SET, LIST, or a STRING that is binary safe. Data structures like SET and LIST allow for even more interesting things. Redis is a fabulous and fast engine for data structures, and you can read more about it here: <a href="http://code.google.com/p/redis/">redis</a>. Redis is also a persistent data store, and can be used in large-scale environments with master-slave replication.
5
+ Redis is a very fast key-value store with some interesting data structures added. You can have a key that is a SET, LIST, or a STRING that is binary safe. Data structures like SET and LIST allow for even more interesting things. Redis is a fabulous and fast engine for data structures, and you can read more about it here: <a href="http://code.google.com/p/redis/">redis</a>. Redis is also a persistent data store, and can be used in large-scale environments with master-slave replication and consistent hashing on the client side.
6
6
 
7
7
  <a href="http://datamapper.org">DataMapper</a> is a brilliant ORM that is based on the <a href="http://www.martinfowler.com/eaaCatalog/identityMap.html">IdentityMap</a> pattern. Usage of DataMapper resembles that of ActiveRecord, the popular ORM bundled with Ruby on Rails, but with some very important differences. A quote from the DM wiki: "One row in the database should equal one object reference. Pretty simple idea. Pretty profound impact." Having an identity map allows for very efficient queries to the database, as well as interesting forms of lazy loading of attributes or associations.
8
8
 
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.
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
11
  h1. Install
12
12
 
13
13
  Prerequisites:
14
14
  * Redis:
15
- ** <a href="http://code.google.com/p/redis/">Redis, v0.100</a>
15
+ ** <a href="http://code.google.com/p/redis/">Redis, v1.0</a>
16
16
  * Gems:
17
- ** <a href="http://code.google.com/p/redis/">redis (0.0.3.4)</a>
18
17
  ** <a href="http://github.com/datamapper/extlib">extlib</a>, dependency for dm-core
19
- ** <a href="http://github.com/datamapper/dm-core/tree/next">dm-core</a> next branch
20
-
21
- I installed the redis gem from the redis .tgz file like so:
18
+ ** <a href="http://github.com/datamapper/dm-core/">dm-core</a> v0.10
22
19
 
20
+ Install the dm-redis adapter:
23
21
  <pre>
24
22
  <code>
25
- > tar -xvzf redis-0.100.tar.gz
26
- > cd redis-0.100/client-libraries/ruby
27
- > sudo rake install
23
+ > gem sources -a http://gems.github.com
24
+ > sudo gem install whoahbot-dm-redis-adapter
28
25
  </code>
29
26
  </pre>
30
27
 
@@ -34,8 +31,9 @@ Setup your adapter, define your models and properties:
34
31
 
35
32
  <pre>
36
33
  <code>
34
+ require 'rubygems'
37
35
  require 'dm-core'
38
- require 'dm_redis_adapter'
36
+ require 'dm_redis'
39
37
 
40
38
  DataMapper.setup(:default, {:adapter => "redis"})
41
39
 
@@ -50,4 +48,9 @@ Setup your adapter, define your models and properties:
50
48
  </code>
51
49
  </pre>
52
50
 
53
- Now you can use redis in a ORM style, and take advantage of all of the amazing things that DataMapper offers.
51
+ Now you can use redis in a ORM style, and take advantage of all of the amazing things that DataMapper offers.
52
+
53
+ h1. Badass contributors
54
+
55
+ * <a href="http://github.com/aeden">Anthony Eden (aeden)</a> Gem cleanup, update to jeweler
56
+ * <a href="http://github.com/sr">Simon Roset (sr)</a> Fixes for edge dm-core
data/Rakefile CHANGED
@@ -1,56 +1,37 @@
1
1
  require 'rubygems'
2
- require 'rake/gempackagetask'
3
- require 'rubygems/specification'
4
- require 'date'
5
2
  require 'spec/rake/spectask'
6
3
 
7
4
  GEM = 'dm-redis-adapter'
8
5
  GEM_NAME = 'dm-redis-adapter'
9
- GEM_VERSION = '0.0.4'
10
6
  AUTHORS = ['Dan Herrera']
11
7
  EMAIL = "whoahbot@gmail.com"
12
8
  HOMEPAGE = "http://github.com/whoahbot/dm-redis-adapter"
13
9
  SUMMARY = "DataMapper adapter for the Redis key-value database"
14
10
 
15
- spec = Gem::Specification.new do |s|
16
- s.name = GEM
17
- s.version = GEM_VERSION
18
- s.platform = Gem::Platform::RUBY
19
- s.has_rdoc = true
20
- s.extra_rdoc_files = ["MIT-LICENSE"]
21
- s.summary = SUMMARY
22
- s.description = s.summary
23
- s.authors = AUTHORS
24
- s.email = EMAIL
25
- s.homepage = HOMEPAGE
26
- s.add_dependency "rspec"
27
- s.add_dependency "dm-core", "0.10.0"
28
- s.add_dependency "redis", "0.0.3.4"
29
- s.require_path = 'lib'
30
- s.autorequire = GEM
31
- s.files = %w(MIT-LICENSE README.textile Rakefile) + Dir.glob("{lib,spec}/**/*")
11
+ begin
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gemspec|
14
+ gemspec.name = GEM
15
+ gemspec.summary = SUMMARY
16
+ gemspec.email = EMAIL
17
+ gemspec.homepage = HOMEPAGE
18
+ gemspec.description = SUMMARY
19
+ gemspec.authors = AUTHORS
20
+ gemspec.add_dependency "dm-core", "0.10.0"
21
+ gemspec.add_dependency "ezmobius-redis"
22
+ gemspec.files = %w(MIT-LICENSE README.textile Rakefile) + Dir.glob("{lib,spec}/**/*")
23
+ gemspec.has_rdoc = true
24
+ gemspec.extra_rdoc_files = ["MIT-LICENSE"]
25
+ end
26
+ rescue LoadError
27
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
32
28
  end
33
29
 
30
+
34
31
  task :default => :spec
35
32
 
36
33
  desc "Run specs"
37
34
  Spec::Rake::SpecTask.new do |t|
38
35
  t.spec_files = FileList['spec/**/*_spec.rb']
39
36
  t.spec_opts = %w(-fs --color)
40
- end
41
-
42
- Rake::GemPackageTask.new(spec) do |pkg|
43
- pkg.gem_spec = spec
44
- end
45
-
46
- desc "install the gem locally"
47
- task :install => [:package] do
48
- sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
49
- end
50
-
51
- desc "create a gemspec file"
52
- task :make_spec do
53
- File.open("#{GEM}.gemspec", "w") do |file|
54
- file.puts spec.to_ruby
55
- end
56
37
  end
@@ -3,7 +3,7 @@ require 'redis'
3
3
  module DataMapper
4
4
  module Adapters
5
5
  Extlib::Inflection.word 'redis'
6
-
6
+
7
7
  class RedisAdapter < AbstractAdapter
8
8
  ##
9
9
  # Used by DataMapper to put records into the redis data-store: "INSERT" in SQL-speak.
@@ -17,14 +17,13 @@ module DataMapper
17
17
  # @api semipublic
18
18
  def create(resources)
19
19
  resources.each do |resource|
20
- # model.each {|c| c.to_s}.join(":")
21
- initialize_identity_field(resource, @redis.incr("#{resource.model.to_s.downcase}:#{redis_key_for(resource.model)}:serial"))
20
+ initialize_serial(resource, @redis.incr("#{resource.model.to_s.downcase}:#{redis_key_for(resource.model)}:serial"))
22
21
  @redis.set_add("#{resource.model.to_s.downcase}:#{redis_key_for(resource.model)}:all", resource.key)
23
22
  end
24
-
23
+
25
24
  update_attributes(resources)
26
25
  end
27
-
26
+
28
27
  ##
29
28
  # Looks up one record or a collection of records from the data-store:
30
29
  # "SELECT" in SQL.
@@ -40,7 +39,7 @@ module DataMapper
40
39
  def read(query)
41
40
  records = records_for(query).each do |record|
42
41
  query.fields.each do |property|
43
- next if query.model.key.include?(property.name)
42
+ next if query.model.key.include?(property)
44
43
  record[property.name.to_s] = property.typecast(@redis["#{query.model.to_s.downcase}:#{record[redis_key_for(query.model)]}:#{property.name}"])
45
44
  end
46
45
  end
@@ -50,7 +49,7 @@ module DataMapper
50
49
  records = query.sort_records(records)
51
50
  records
52
51
  end
53
-
52
+
54
53
  ##
55
54
  # Used by DataMapper to update the attributes on existing records in the redis
56
55
  # data-store: "UPDATE" in SQL-speak. It takes a hash of the attributes
@@ -65,12 +64,12 @@ module DataMapper
65
64
  # @api semipublic
66
65
  def update(attributes, collection)
67
66
  attributes = attributes_as_fields(attributes)
68
-
67
+
69
68
  records_to_update = records_for(collection.query)
70
69
  records_to_update.each { |r| r.update(attributes) }
71
70
  update_attributes(collection)
72
71
  end
73
-
72
+
74
73
  ##
75
74
  # Destroys all the records matching the given query. "DELETE" in SQL.
76
75
  #
@@ -90,9 +89,9 @@ module DataMapper
90
89
  @redis.set_delete("#{collection.query.model.to_s.downcase}:#{redis_key_for(collection.query.model)}:all", record[redis_key_for(collection.query.model)])
91
90
  end
92
91
  end
93
-
92
+
94
93
  private
95
-
94
+
96
95
  ##
97
96
  # Creates a string representation for the keys in a given model
98
97
  #
@@ -107,7 +106,7 @@ module DataMapper
107
106
  def redis_key_for(model)
108
107
  model.key.collect {|k| k.name}.join(":")
109
108
  end
110
-
109
+
111
110
  ##
112
111
  # Saves each key value pair to the redis data store
113
112
  #
@@ -123,7 +122,7 @@ module DataMapper
123
122
  end
124
123
  end
125
124
  end
126
-
125
+
127
126
  ##
128
127
  # Retrieves records for a particular model.
129
128
  #
@@ -136,25 +135,25 @@ module DataMapper
136
135
  # @api private
137
136
  def records_for(query)
138
137
  keys = []
139
- query.conditions.operands.select {|o| o.is_a?(DataMapper::Query::Conditions::EqualToComparison) && query.model.key.include?(o.property)}.each do |o|
138
+ query.conditions.operands.select {|o| o.is_a?(DataMapper::Query::Conditions::EqualToComparison) && query.model.key.include?(o.subject)}.each do |o|
140
139
  if @redis.set_member?("#{query.model.to_s.downcase}:#{redis_key_for(query.model)}:all", o.value)
141
140
  keys << {"#{redis_key_for(query.model)}" => o.value}
142
141
  end
143
142
  end
144
-
143
+
145
144
  # if query.limit
146
145
  # @redis.sort("#{query.model.to_s.downcase}:#{redis_key_for(query.model)}:all", :limit => [query.offset, query.limit]).each do |val|
147
146
  # keys << {"#{redis_key_for(query.model)}" => val.to_i}
148
147
  # end
149
148
  # end
150
-
149
+
151
150
  # Keys are empty, fall back and load all the values for this model
152
151
  if keys.empty?
153
152
  @redis.set_members("#{query.model.to_s.downcase}:#{redis_key_for(query.model)}:all").each do |val|
154
153
  keys << {"#{redis_key_for(query.model)}" => val.to_i}
155
154
  end
156
155
  end
157
-
156
+
158
157
  keys
159
158
  end
160
159
 
@@ -174,7 +173,7 @@ module DataMapper
174
173
  @redis = Redis.new(@options)
175
174
  end
176
175
  end # class RedisAdapter
177
-
176
+
178
177
  const_added(:RedisAdapter)
179
178
  end # module Adapters
180
- end # module DataMapper
179
+ end # module DataMapper
@@ -1,5 +1,4 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper'
2
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib/dm_redis_adapter'))
3
2
  require 'redis'
4
3
 
5
4
  require 'dm-core/spec/adapter_shared_spec'
@@ -11,11 +10,11 @@ describe DataMapper::Adapters::RedisAdapter do
11
10
  :db => 15
12
11
  })
13
12
  end
14
-
13
+
15
14
  after(:all) do
16
15
  redis = Redis.new(:db => 15)
17
- redis.flushdb
16
+ redis.flush_db
18
17
  end
19
-
18
+
20
19
  it_should_behave_like 'An Adapter'
21
- end
20
+ end
@@ -1,4 +1,4 @@
1
1
  require 'rubygems'
2
2
  require 'dm-core'
3
3
 
4
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib/dm_redis_adapter'))
4
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib/dm_redis'))
metadata CHANGED
@@ -1,27 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whoahbot-dm-redis-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Herrera
8
- autorequire: dm-redis-adapter
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-02 00:00:00 -07:00
12
+ date: 2009-09-15 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: rspec
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
24
- version:
25
15
  - !ruby/object:Gem::Dependency
26
16
  name: dm-core
27
17
  type: :runtime
@@ -33,14 +23,14 @@ dependencies:
33
23
  version: 0.10.0
34
24
  version:
35
25
  - !ruby/object:Gem::Dependency
36
- name: redis
26
+ name: ezmobius-redis
37
27
  type: :runtime
38
28
  version_requirement:
39
29
  version_requirements: !ruby/object:Gem::Requirement
40
30
  requirements:
41
- - - "="
31
+ - - ">="
42
32
  - !ruby/object:Gem::Version
43
- version: 0.0.3.4
33
+ version: "0"
44
34
  version:
45
35
  description: DataMapper adapter for the Redis key-value database
46
36
  email: whoahbot@gmail.com
@@ -54,14 +44,15 @@ files:
54
44
  - MIT-LICENSE
55
45
  - README.textile
56
46
  - Rakefile
57
- - lib/dm_redis_adapter.rb
58
- - spec/dm_redis_adapter_spec.rb
47
+ - lib/dm_redis.rb
48
+ - spec/dm_redis_spec.rb
59
49
  - spec/spec_helper.rb
60
- has_rdoc: false
50
+ has_rdoc: true
61
51
  homepage: http://github.com/whoahbot/dm-redis-adapter
52
+ licenses:
62
53
  post_install_message:
63
- rdoc_options: []
64
-
54
+ rdoc_options:
55
+ - --charset=UTF-8
65
56
  require_paths:
66
57
  - lib
67
58
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -79,9 +70,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
70
  requirements: []
80
71
 
81
72
  rubyforge_project:
82
- rubygems_version: 1.2.0
73
+ rubygems_version: 1.3.5
83
74
  signing_key:
84
- specification_version: 3
75
+ specification_version: 2
85
76
  summary: DataMapper adapter for the Redis key-value database
86
- test_files: []
87
-
77
+ test_files:
78
+ - spec/dm_redis_spec.rb
79
+ - spec/spec_helper.rb