easyredis 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest CHANGED
@@ -5,4 +5,4 @@ Rakefile
5
5
  easyredis.gemspec
6
6
  lib/easyredis.rb
7
7
  tests/benchmark.rb
8
- tests/test.rb
8
+ tests/man.rb
data/README.md CHANGED
@@ -14,9 +14,7 @@ Or, you can get the source with git:
14
14
 
15
15
  $ git clone git://github.com/alecbenzer/easyredis.git
16
16
 
17
- or just download and extract a tar archive with the Downloads button.
18
-
19
- Once you have the source, you can run:
17
+ and run:
20
18
 
21
19
  $ rake manifest
22
20
  $ rake build_gemspec
@@ -53,17 +51,16 @@ Or, we can choose our own ids:
53
51
 
54
52
  p = Post.new("coolpost")
55
53
  p.title = "A Cool Post"
56
- p.body = "This post has a high level of coolnes."
54
+ p.body = "This post has a high level of coolness."
57
55
 
58
56
  p2 = Post.find("coolpost") # this is a very fast lookup
59
57
  p2.title # => "A Cool Post"
60
58
 
61
59
  We also get a created_at field for free that we can sort by.
62
60
 
63
- p.created_at # a ruby Time object
64
- Post.all # get all posts, ordered by creation time
65
- Post.all :order => :desc # specifying an order option
66
- Post[41] # the 42nd (0-based indexing) post that was created
61
+ p.created_at # a ruby Time object
62
+ Post.all :order => :desc # all posts ordered by descending time
63
+ Post[n] # the nth (0-based indexing) post that was created
67
64
 
68
65
  ## Searching and Sorting
69
66
 
@@ -85,18 +82,18 @@ And also search:
85
82
  Post.search_by :title, "A common title" # all posts with this title
86
83
  Post.find_by :title, "My First Post" # just one post
87
84
 
88
- ## Text Search and Completions
85
+ ## Implicit References
89
86
 
90
- We could have defined Post like this:
87
+ You may have noticed fields have not been given any types. EasyRedis automatically tracks the type of a field based on the type of data you assign it.
91
88
 
92
- class Post < EasyRedis::Model
93
- field :title
94
- field :body
89
+ This works for references, too:
95
90
 
96
- text_search :title
91
+ class Comment < EasyRedis::Model
92
+ field :text
93
+ field :post
97
94
  end
98
-
99
- Now we can perform text searches and completions against our title field:
100
-
101
- Post.matches(:title,"Fir") # titles that begin with "Fir"
102
- Post.match(:title,"First") # posts whose titles contain "First"
95
+
96
+ c = Comment.new
97
+ c.text = "A comment!"
98
+
99
+ c.post = Post[0]
data/Rakefile CHANGED
@@ -2,9 +2,9 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('easyredis','0.0.5') do |p|
5
+ Echoe.new('easyredis','0.0.6') do |p|
6
6
  p.description = "framework designed to make using redis as a database simpler"
7
- p.url = "https://github.com/alecbenzer/easyredis"
7
+ p.url = "http://alecbenzer.github.com/easyredis/"
8
8
  p.author = "Alec Benzer"
9
9
  p.email = "alecbezer @nospam@ gmail.com"
10
10
  p.ignore_pattern = ["*.rdb"]
@@ -13,7 +13,7 @@ end
13
13
 
14
14
 
15
15
  require 'benchmark'
16
- require './tests/test'
16
+ require './tests/man'
17
17
 
18
18
  def rand_name(length=2)
19
19
  chars = []
@@ -24,14 +24,14 @@ end
24
24
 
25
25
  namespace :bm do
26
26
  task :clear do
27
- puts "destroying #{Man.count} previous entries"
27
+ puts "destroying #{Man.count} previous entries (sec)"
28
28
  time = Benchmark.measure { Man.destroy_all }
29
29
  puts time.format
30
30
  end
31
31
 
32
32
  task :add do
33
33
  count = ENV["count"] ? ENV["count"].to_i : 25000
34
- puts "adding #{count} new entries"
34
+ puts "adding #{count} new entries (sec)"
35
35
  time = Benchmark::Tms.new
36
36
  length = Math.log(3*count,26).round
37
37
  count.times do
@@ -49,7 +49,7 @@ namespace :bm do
49
49
  name = Man.rand.name
50
50
  count = -1
51
51
  time = Benchmark.measure { count = Man.search_by(:name,name).count }
52
- puts "retrived #{count} records in:"
52
+ puts "retrived #{count} records in (ms):"
53
53
  puts (time*1000).format
54
54
  end
55
55
 
@@ -59,9 +59,9 @@ namespace :bm do
59
59
  age = rand(100)
60
60
  t1 = Benchmark.measure { Man.search(:age => age) }
61
61
  t2 = Benchmark.measure { Man.search_by(:age,age) }
62
- puts "Model#search:"
62
+ puts "Model#search (ms):"
63
63
  puts (t1*1000).format
64
- puts "Model#search_by:"
64
+ puts "Model#search_by (ms):"
65
65
  puts (t2*1000).format
66
66
  puts "search is #{((t1.real/t2.real) - 1)*100}% slower"
67
67
  end
@@ -72,15 +72,17 @@ namespace :bm do
72
72
  age = man.age
73
73
  count = 0
74
74
  time = Benchmark.measure { count = Man.search(:name => name, :age => age).size }
75
- puts "retrived #{count} out of #{Man.count} entries in:"
75
+ puts "retrived #{count} out of #{Man.count} entries in (ms):"
76
76
  puts (time*1000).format
77
77
  end
78
78
 
79
79
  task :find do
80
- puts "finding one of #{Man.count} entries by name"
80
+ puts "finding one of #{Man.count} entries by name (ms)"
81
81
  name = Man.rand.name
82
82
  time = Benchmark.measure { Man.find_by(:name,name) }
83
83
  puts (time*1000).format
84
84
  end
85
85
 
86
+ task :all => [:populate, :search, :multisearch, :find]
87
+
86
88
  end
@@ -2,20 +2,20 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{easyredis}
5
- s.version = "0.0.5"
5
+ s.version = "0.0.6"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Alec Benzer"]
9
- s.date = %q{2011-02-09}
9
+ s.date = %q{2011-05-16}
10
10
  s.description = %q{framework designed to make using redis as a database simpler}
11
11
  s.email = %q{alecbezer @nospam@ gmail.com}
12
12
  s.extra_rdoc_files = ["LICENSE", "README.md", "lib/easyredis.rb"]
13
- s.files = ["LICENSE", "Manifest", "README.md", "Rakefile", "easyredis.gemspec", "lib/easyredis.rb", "tests/benchmark.rb", "tests/test.rb"]
14
- s.homepage = %q{https://github.com/alecbenzer/easyredis}
13
+ s.files = ["LICENSE", "Manifest", "README.md", "Rakefile", "easyredis.gemspec", "lib/easyredis.rb", "tests/benchmark.rb", "tests/man.rb"]
14
+ s.homepage = %q{http://alecbenzer.github.com/easyredis/}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Easyredis", "--main", "README.md"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{easyredis}
18
- s.rubygems_version = %q{1.5.0}
18
+ s.rubygems_version = %q{1.6.2}
19
19
  s.summary = %q{framework designed to make using redis as a database simpler}
20
20
 
21
21
  if s.respond_to? :specification_version then
@@ -12,7 +12,7 @@ require 'set'
12
12
  # main EasyRedis module which
13
13
  # holds all classes and helper methods
14
14
  module EasyRedis
15
-
15
+
16
16
  # generate a 'score' for a string
17
17
  # used for storing it in a sorted set
18
18
  #
@@ -81,10 +81,10 @@ module EasyRedis
81
81
  end
82
82
  end
83
83
 
84
- # exception that indicates that the given field has not been indexed for text-searching
85
- class FieldNotTextSearchable < RuntimeError
84
+ # exception that indicates that the given field has not been indexed for sorting/searching
85
+ class FieldNotSearchable < RuntimeError
86
86
  def initialize(field)
87
- @message = "field '#{field.to_s}' not text-searchable"
87
+ @message = "field '#{field.to_s}' not searchable"
88
88
  end
89
89
 
90
90
  def to_s
@@ -92,6 +92,17 @@ module EasyRedis
92
92
  end
93
93
  end
94
94
 
95
+ # exception that indicates that the given field has not been indexed for text-searching
96
+ # class FieldNotTextSearchable < RuntimeError
97
+ # def initialize(field)
98
+ # @message = "field '#{field.to_s}' not text-searchable"
99
+ # end
100
+ #
101
+ # def to_s
102
+ # @message
103
+ # end
104
+ # end
105
+
95
106
  # exception that indicated an unknown ordering option was encountered
96
107
  class UnknownOrderOption < RuntimeError
97
108
  def initialize(opt)
@@ -107,6 +118,10 @@ module EasyRedis
107
118
  class Collection
108
119
  include Enumerable
109
120
 
121
+ def initialize(&p)
122
+ @access = p
123
+ end
124
+
110
125
  # access elements in this sort
111
126
  #
112
127
  # Work's like an Array's [] method. It can take a specific index, a range, or an offset and an amount/limit.
@@ -151,71 +166,33 @@ module EasyRedis
151
166
  end
152
167
  end
153
168
 
154
- private
155
-
156
- # access the elements corresponding to the given range
157
- #
158
- # meant to be overridden in child classes
159
- def access(range)
160
- []
161
- end
162
-
163
- end
164
-
165
- # class representing a sort
166
- class Sort < Collection
167
-
168
- # initialize the sort with a specific field, ordering option, and model
169
- #
170
- # @param [Symbol] field a symbol corresponding to a field of klass
171
- # @param [:asc, :desc] order a symbol specifying to sort in either ascending or descending order
172
- # @param [Class] klass the klass whose entries we are accessing
173
- def initialize(field,order,klass)
174
- raise EasyRedis::FieldNotSortable, field unless klass.sortable?(field)
175
- raise EasyRedis::UnknownOrderOption, order unless [:asc,:desc].member? order
176
- @field = field
177
- @order = order
178
- @klass = klass
179
- end
180
-
181
- # return the number of elements in this sort
182
- #
183
- # As of now, idential to the Model's count method.
184
- # This method is explicility defined here to overwrite the default one in Enumerable, which iterates through all the entries to count them, which is much slower than a ZCARD command
185
- def count
186
- @count ||= EasyRedis.redis.zcard(@klass.sort_key(@field))
187
- @count
188
- end
189
-
190
169
  def inspect
191
- "#<EasyRedis::Sort model=#{@klass.name}, field=#{@field.to_s}, order=#{@order.to_s}>"
170
+ "#<EasyRedis::Collection>"
192
171
  end
193
172
 
194
173
  private
195
174
 
196
- # takes a range and returns corresponding elements
175
+ # access the elements corresponding to the given range
176
+ #
177
+ # meant to be overridden in child classes
197
178
  def access(range)
198
- a = range.begin
199
- b = range.end
200
- b -= 1 if range.exclude_end?
201
- ids = []
202
- if @order == :asc
203
- ids = EasyRedis.redis.zrange(@klass.sort_key(@field),a,b)
204
- elsif @order == :desc
205
- ids = EasyRedis.redis.zrevrange(@klass.sort_key(@field),a,b)
179
+ if @access
180
+ @access[range]
181
+ else
182
+ []
206
183
  end
207
- ids.map{|i|@klass.build(i)}
208
184
  end
209
185
 
210
186
  end
211
187
 
212
-
213
188
  # class representing a data model
214
189
  # you want to store in redis
215
190
  class Model
216
191
 
217
192
  @@sorts = []
218
- @@text_searches = []
193
+ @@searches = []
194
+ @@types = {}
195
+ # @@text_searches = []
219
196
 
220
197
  # add a field to the model
221
198
  #
@@ -233,42 +210,77 @@ module EasyRedis
233
210
  if prev
234
211
  prev
235
212
  else
236
- instance_variable_set(instance_var,Marshal.load(EasyRedis.redis.hget(key_name,name)))
213
+ data = EasyRedis.redis.hget(key_name,name)
214
+ type = get_type(name)
215
+ if type == 'int'
216
+ data = data.to_i
217
+ elsif type == 'flt'
218
+ data = data.to_f
219
+ elsif type == 'str'
220
+ data = data.to_s
221
+ elsif type.match /^model:/
222
+ klass = eval(type[6..-1])
223
+ data = klass.find(data)
224
+ end
225
+ instance_variable_set(instance_var,data)
237
226
  end
238
227
  end
239
228
 
240
229
  define_method setter.to_sym do |val|
241
- EasyRedis.redis.hset(key_name,name,Marshal.dump(val))
242
230
  instance_variable_set(instance_var,val)
231
+ if val.is_a? Fixnum
232
+ set_type(name,'int')
233
+ elsif val.is_a? Float
234
+ set_type(name,'flt')
235
+ elsif val.is_a? String
236
+ set_type(name,'str')
237
+ elsif val.is_a? EasyRedis::Model
238
+ set_type(name,"model:#{val.class.name}")
239
+ val = val.id
240
+ end # TODO: else.... marshall it
241
+ EasyRedis.redis.hset(key_name,name,val)
243
242
 
244
243
  if self.class.sortable? name.to_sym
245
244
  EasyRedis.redis.zadd(sort_key(name),EasyRedis.score(val),@id)
246
245
  end
247
246
 
248
- if self.class.text_search? name.to_sym
249
- val.split.each do |term|
250
- EasyRedis.redis.zadd term_key(name,term), created_at.to_i, id
251
- EasyRedis.redis.zadd terms_key(name), EasyRedis.score(term), term
252
- end
247
+ if self.class.searchable? name
248
+ EasyRedis.redis.sadd(search_key(name,val),@id)
253
249
  end
250
+
251
+ #if self.class.text_search? name.to_sym
252
+ # val.split.each do |term|
253
+ # EasyRedis.redis.zadd term_key(name,term), created_at.to_i, id
254
+ # EasyRedis.redis.zadd terms_key(name), EasyRedis.score(term), term
255
+ # end
256
+ #end
254
257
  end
255
258
  end
256
259
 
257
- # index a field to be sorted/searched
260
+ # index a field to be sorted
258
261
  #
259
262
  # @param (see #field)
260
263
  def self.sort_on(field)
261
264
  @@sorts << field.to_sym
265
+ nil
262
266
  end
263
267
 
264
- # index a field for text searching
268
+ # index a field to be searched (with exact matches)
265
269
  #
266
270
  # @param (see #field)
267
- def self.text_search(field)
268
- @@text_searches << field.to_sym
269
- sort_on(field) unless sortable? field
271
+ def self.search_on(field)
272
+ @@searches << field.to_sym
273
+ nil
270
274
  end
271
275
 
276
+ # index a field for text searching
277
+ #
278
+ # @param (see #field)
279
+ # def self.text_search(field)
280
+ # @@text_searches << field.to_sym
281
+ # sort_on(field) unless sortable? field
282
+ # end
283
+
272
284
  # returns number of instances of this model
273
285
  def self.count
274
286
  EasyRedis.redis.zcard(prefix)
@@ -296,10 +308,15 @@ module EasyRedis
296
308
  end
297
309
 
298
310
  # find an entry of this model based on its id
311
+ # OR, find an entry based on field/value pairs in a hash
312
+ # (current only works with one pair)
299
313
  #
300
- # @param [Integer] id the id of the entry to retrive
314
+ # @param [Integer,Hash] id the id of the entry to retrive, or a hash of field/value pairs
301
315
  def self.find(id)
302
- if EasyRedis.redis.zscore(prefix,id)
316
+ if id.is_a? Hash
317
+ pair = id.to_a.first
318
+ self.find_by(pair[0],pair[1]) # TODO: add support for multiple field/value pairs
319
+ elsif EasyRedis.redis.zscore(prefix,id)
303
320
  build(id)
304
321
  else
305
322
  nil
@@ -318,10 +335,10 @@ module EasyRedis
318
335
  # @param [Symbol] field a symbol representing the field to search on
319
336
  # @param val the value of field to search for
320
337
  def self.search_by(field, val, options = {})
321
- raise EasyRedis::FieldNotSortable, field unless @@sorts.member? field.to_sym
322
- scr = EasyRedis.score(val)
338
+ # scr = EasyRedis.score(val)
323
339
  # options[:limit] = [0,options[:limit]] if options[:limit]
324
- ids = EasyRedis.redis.zrangebyscore(sort_key(field),scr,scr,proc_options(options))
340
+ # ids = EasyRedis.redis.zrangebyscore(sort_key(field),scr,scr,proc_options(options))
341
+ ids = EasyRedis.redis.smembers(search_key(field,val))
325
342
  ids.map{|i| build(i) }
326
343
  end
327
344
 
@@ -329,67 +346,92 @@ module EasyRedis
329
346
  #
330
347
  # @param (see #search_by)
331
348
  def self.find_by(field,val)
332
- search_by(field,val,:limit => 1).first
349
+ i = EasyRedis.redis.srandmember(search_key(field,val))
350
+ build(i) if i
333
351
  end
334
352
 
335
353
  # search the model based on multiple parameters
336
354
  #
337
355
  # @param [Hash] params a hash of field => value pairs
338
356
  def self.search(params)
339
- return search_by(*params.first) if params.size == 1 # comment out for benchmarking purposes
340
- result_set = nil
341
- params.each do |field,value|
342
- scr = EasyRedis.score(value)
343
- ids = EasyRedis.redis.zrangebyscore(sort_key(field),scr,scr)
344
- result_set = result_set ? (result_set & Set.new(ids)) : Set.new(ids)
357
+ return search_by(*params.first) if params.size == 1
358
+ if params.all? {|f,v| searchable? f }
359
+ ids = EasyRedis.redis.sinter(*params.map{|k,v|search_key(k,v)})
360
+ ids.map{|i|build(i)}
361
+ elsif params.all? {|f,v| sortable? f}
362
+ result_set = nil
363
+ params.each do |field,value|
364
+ scr = EasyRedis.score(value)
365
+ ids = EasyRedis.redis.zrangebyscore(sort_key(field),scr,scr)
366
+ result_set = result_set ? (result_set & Set.new(ids)) : Set.new(ids)
367
+ end
368
+ result_set.map{|i|build(i)}
369
+ else
370
+ raise "fields must all be searchable or all be sortable"
345
371
  end
346
- result_set.map{|i|build(i)}
347
372
  end
348
373
 
349
374
  # get all entries, sorted by the given field
350
375
  def self.sort_by(field,options = {:order => :asc})
351
- EasyRedis::Sort.new(field,options[:order],self)
376
+ raise EasyRedis::FieldNotSortable unless self.sortable? field
377
+ EasyRedis::Collection.new do |range|
378
+ a = range.begin
379
+ b = range.end
380
+ b -= 1 if range.exclude_end?
381
+ ids = []
382
+ if options[:order] == :asc
383
+ ids = EasyRedis.redis.zrange(sort_key(field),a,b)
384
+ elsif options[:order] == :desc
385
+ ids = EasyRedis.redis.zrevrange(sort_key(field),a,b)
386
+ end
387
+ ids.map{|i| build(i)}
388
+ end
352
389
  end
353
390
 
354
391
  # gives all values for the given field that begin with str
355
392
  #
356
393
  # @param [Symbol] field a symbol representing a field indexed with text_search.
357
- def self.matches(field,str)
358
- raise FieldNotTextSearchable, field unless self.text_search? field
359
- scr = EasyRedis.score(str)
360
- a,b = scr, scr+1/(27.0**str.size)
361
- EasyRedis.redis.zrangebyscore(terms_key(field), "#{a}", "(#{b}")
362
- end
394
+ # def self.matches(field,str)
395
+ # raise EasyRedis::FieldNotTextSearchable, field unless self.text_search? field
396
+ # scr = EasyRedis.score(str)
397
+ # a,b = scr, scr+1/(27.0**str.size)
398
+ # EasyRedis.redis.zrangebyscore(terms_key(field), "#{a}", "(#{b}")
399
+ # end
363
400
 
364
401
  # searches for all entries where field contains the string str
365
402
  #
366
403
  # The string must appear exactly as a term in field's value. To search based on the beginning of a term, you can combine this method with matches.
367
404
  # The field must have been indexed with text_search.
368
- def self.match(field,str, options = {})
369
- raise EasyRedis::FieldNotTextSearchable, filename unless text_search? field
370
- ids = EasyRedis.redis.zrange(term_key(field,str), 0, -1, proc_options(options))
371
- ids.map{|i| build(i)}
372
- end
405
+ # def self.match(field,str, options = {})
406
+ # raise EasyRedis::FieldNotTextSearchable, filename unless text_search? field
407
+ # ids = EasyRedis.redis.zrange(term_key(field,str), 0, -1, proc_options(options))
408
+ # ids.map{|i| build(i)}
409
+ # end
373
410
 
374
411
  # indicates whether field has been indexed with sort_on
375
412
  def self.sortable?(field)
376
413
  @@sorts and (@@sorts.member? field or field.to_sym == :created_at)
377
414
  end
378
415
 
379
- # indicates whether field has been indexed with text_search
380
- def self.text_search?(field)
381
- @@text_searches and @@text_searches.member?(field)
416
+ # indicates whether field has been indexed with sort_on
417
+ def self.searchable?(field)
418
+ @@searches and @@searches.member? field.to_sym
382
419
  end
383
420
 
421
+ # indicates whether field has been indexed with text_search
422
+ # def self.text_search?(field)
423
+ # @@text_searches and @@text_searches.member?(field)
424
+ # end
425
+
384
426
  # destroy all instances of this model
385
427
  def self.destroy_all
386
428
  all.each {|x| x.destroy}
387
429
  @@sorts.each {|field| EasyRedis.redis.del(sort_key(field)) }
388
- @@text_searches.each {|field| EasyRedis.redis.del(terms_key(field)) }
430
+ # @@text_searches.each {|field| EasyRedis.redis.del(terms_key(field)) }
389
431
  EasyRedis.redis.del(prefix)
390
432
  EasyRedis.redis.del(prefix + ":next_id")
391
433
  end
392
-
434
+
393
435
 
394
436
  # the id of this entry
395
437
  attr_reader :id
@@ -489,6 +531,10 @@ module EasyRedis
489
531
  end
490
532
  end
491
533
 
534
+ def self.search_key(field,value)
535
+ "#{prefix}:search_#{field}:#{value}"
536
+ end
537
+
492
538
  def self.terms_key(field)
493
539
  "#{prefix}:terms_#{field.to_s}"
494
540
  end
@@ -497,6 +543,23 @@ module EasyRedis
497
543
  "#{prefix}:term_#{field}:#{term}"
498
544
  end
499
545
 
546
+ def self.type_key(field)
547
+ "#{prefix}:type_#{field}"
548
+ end
549
+
550
+ def self.get_type(field)
551
+ if @@types[field]
552
+ @@types[field]
553
+ else
554
+ @@types[field] = EasyRedis.redis.get(type_key(field))
555
+ end
556
+ end
557
+
558
+ def self.set_type(field,type)
559
+ EasyRedis.redis.set(type_key(field),type)
560
+ @@types[field] = type
561
+ end
562
+
500
563
  def prefix
501
564
  self.class.prefix
502
565
  end
@@ -505,6 +568,10 @@ module EasyRedis
505
568
  self.class.sort_key(field)
506
569
  end
507
570
 
571
+ def search_key(field,val)
572
+ self.class.search_key(field,val)
573
+ end
574
+
508
575
  def terms_key(field)
509
576
  self.class.terms_key(field)
510
577
  end
@@ -512,5 +579,18 @@ module EasyRedis
512
579
  def term_key(field,term)
513
580
  self.class.term_key(field,term)
514
581
  end
582
+
583
+ def type_key(field)
584
+ self.class.type_key(field)
585
+ end
586
+
587
+ def get_type(field)
588
+ self.class.get_type(field)
589
+ end
590
+
591
+ def set_type(field,type)
592
+ self.class.set_type(field,type)
593
+ end
594
+
515
595
  end
516
596
  end
@@ -4,8 +4,8 @@ class Man < EasyRedis::Model
4
4
  field :name
5
5
  field :age
6
6
 
7
- text_search :name
8
- sort_on :age
7
+ search_on :name
8
+ search_on :age
9
9
  end
10
10
 
11
11
  EasyRedis.connect
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: easyredis
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.5
5
+ version: 0.0.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Alec Benzer
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-02-09 00:00:00 -05:00
13
+ date: 2011-05-16 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -42,9 +42,9 @@ files:
42
42
  - easyredis.gemspec
43
43
  - lib/easyredis.rb
44
44
  - tests/benchmark.rb
45
- - tests/test.rb
45
+ - tests/man.rb
46
46
  has_rdoc: true
47
- homepage: https://github.com/alecbenzer/easyredis
47
+ homepage: http://alecbenzer.github.com/easyredis/
48
48
  licenses: []
49
49
 
50
50
  post_install_message:
@@ -72,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
72
  requirements: []
73
73
 
74
74
  rubyforge_project: easyredis
75
- rubygems_version: 1.5.0
75
+ rubygems_version: 1.6.2
76
76
  signing_key:
77
77
  specification_version: 3
78
78
  summary: framework designed to make using redis as a database simpler