redismodel 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/lib/redismodel.rb CHANGED
@@ -11,7 +11,7 @@ class DateTime
11
11
  end
12
12
 
13
13
  class RedisModel
14
- VERSION = '0.1.4'
14
+ VERSION = '0.1.5'
15
15
  DEFAULT_CONFIG = {
16
16
  :atomic => true,
17
17
  :default_sort => "created_at"
@@ -37,7 +37,8 @@ class RedisModel
37
37
  end
38
38
  end
39
39
 
40
- class InvalidRecord < RuntimeError; end
40
+ class RecordNotFound < RuntimeError; end
41
+ class PropertyTypeIncorrect < RuntimeError; end
41
42
 
42
43
  def self.connection(klass)
43
44
  hash = {}
@@ -54,7 +55,7 @@ class RedisModel
54
55
  # Casts a object type as a compatible type for redis, or reverses the process.
55
56
  #
56
57
  # Examples:
57
- # #cast( Integer, "1" ) => 1
58
+ # #cast( Fixnum, "1" ) => 1
58
59
  # #cast( Array, [1,2,3] ) => "[1,2,3]"
59
60
  # #cast( Hash, {:a => 1, 'b' => "2", :c => ['c']} ) => "--- \nb: \"2\"\n:c: \n- c\n:a: 1\n"
60
61
  # #cast( Hash, "--- \nb: \"2\"\n:c: \n- c\n:a: 1\n" ) => {"b"=>"2", :c=>["c"], :a=>1}
@@ -64,7 +65,7 @@ class RedisModel
64
65
  klass = klass.to_s
65
66
  v_class = value.class.to_s
66
67
 
67
- if klass == "Integer" && v_class == "String"
68
+ if klass == "Fixnum" && v_class == "String"
68
69
  value.to_i
69
70
  elsif (klass == "Array" || klass == "Hash") && v_class == "String"
70
71
  YAML.load(value)
@@ -93,14 +94,15 @@ class RedisModel
93
94
  end
94
95
 
95
96
 
96
- def self.blank_record
97
- hash = {}
97
+ def self.blank_record(hash={})
98
+ blanks = {
99
+ String => "",
100
+ Array => [],
101
+ Hash => {}
102
+ }
98
103
  self.properties.to_a.map do |c|
99
- # # value ||= self.class.blank_value(c)
100
- blank = self.blank_value(c[1])
101
- unless blank.nil?
102
- hash[c[0]] = blank
103
- end
104
+ blank = blanks[c[1]]
105
+ hash[c[0]] = blank unless blank.nil?
104
106
  end
105
107
  hash.delete(:id)
106
108
  hash
@@ -128,24 +130,21 @@ class RedisModel
128
130
 
129
131
  redis.set "#{self.class}:#{id}:id", id
130
132
  redis.incr "#{self.class}:_meta:count"
131
-
132
- else
133
-
133
+ else
134
134
  self.send("id=", hash[:id])
135
135
  if get(:id).nil?
136
- raise RedisModel::InvalidRecord
136
+ raise RedisModel::RecordNotFound
137
137
  else
138
138
  self.reload
139
139
  end
140
-
141
140
  end
142
141
  end
143
142
 
144
143
 
145
144
  # Custom model inspect in the format of:
146
- # #<MyModel id: "8a80300a9b3251ec4d930f8ab5e381e2", created_at: "2010-08-01T01:32:11+01:00">
145
+ # #<MyModel:8a80300a9b id: "8a80300a9b...", created_at: "2010-08-01T01:32:11+01:00">
147
146
  def inspect
148
- "#<#{self.class} #{self.class.properties.to_a.map{|c| "#{c[0].to_s}: #{get(c[0]).inspect}"}.join(", ")}>"
147
+ "#<#{self.class}:#{self.id} #{self.class.properties.to_a.delete_if{|c| c[0] == :id}.map{|c| "#{c[0].to_s}: #{g=get(c[0]); v=g.inspect; g.class == String && v.size > 10 ? v[0..(v.size-2)]+'..."' : v}"}.join(", ")}>"
149
148
  end
150
149
 
151
150
 
@@ -195,7 +194,7 @@ class RedisModel
195
194
  #
196
195
  # class MyModel < RedisModel
197
196
  # property :name, String
198
- # property :age, Integer
197
+ # property :age, Fixnum
199
198
  # end
200
199
  #
201
200
  def self.property(name, type)
@@ -295,6 +294,7 @@ class RedisModel
295
294
  # Writes a property value to redis, and updates #updated_at if required.
296
295
  def set(property, value)
297
296
  c = self.class.type(property)
297
+ raise RedisModel::PropertyTypeIncorrect if value.class != c
298
298
  value = RedisModel.cast c, value
299
299
  redis.set "#{self.class}:#{id}:#{property}", value
300
300
  @_data[property] = value
@@ -322,15 +322,6 @@ class RedisModel
322
322
  properties[property]
323
323
  end
324
324
 
325
- def self.blank_value(type)
326
- blanks = {
327
- String => "",
328
- Array => [],
329
- Hash => {}
330
- }
331
- return blanks[type]
332
- end
333
-
334
325
 
335
326
  # Keeps track of the properties declared via #property
336
327
  def self.properties
@@ -4,13 +4,19 @@ class ClassMethodTests < Test::Unit::TestCase
4
4
  def setup
5
5
  Person.destroy_all
6
6
  @person1 = Person.new(:name => "ashley", :age => 18)
7
- @person2 = Person.new(:name => "ashley", :age => 18)
7
+ @person2 = Person.new(:name => "ashley", :age => 18)
8
8
  end
9
9
 
10
10
  def test_find
11
11
  assert Person.find(@person1.id).name == @person1.name
12
12
  end
13
13
 
14
+ def test_invalid_find_raises_error
15
+ assert_raises RedisModel::RecordNotFound do
16
+ Person.find("abcd")
17
+ end
18
+ end
19
+
14
20
  def test_destroy_all
15
21
  assert Person.count == 2
16
22
  Person.destroy_all
@@ -29,6 +35,11 @@ class ClassMethodTests < Test::Unit::TestCase
29
35
  assert all[0].name == @person1.name
30
36
  end
31
37
 
38
+ def test_all_when_no_records_exist
39
+ Person.destroy_all
40
+ assert Person.all == []
41
+ end
42
+
32
43
  def test_search
33
44
  Person.search(:age, 19)
34
45
  end
@@ -1,5 +1,5 @@
1
1
  # require 'rubygems'
2
- # # require 'redismodel'
2
+ # require 'redismodel'
3
3
  # require File.dirname(__FILE__) + '/../../lib/redismodel'
4
4
 
5
5
  class Person < RedisModel
@@ -7,7 +7,7 @@ class Person < RedisModel
7
7
  # :port => 5678
8
8
 
9
9
  property :name, String
10
- property :age, Integer
10
+ property :age, Fixnum
11
11
  property :dob, DateTime
12
12
  property :favorite_games, Array
13
13
  property :test_hash, Hash
@@ -14,6 +14,12 @@ class ColumnTypeTests < Test::Unit::TestCase
14
14
  # Person.destroy_all
15
15
  # end
16
16
 
17
+ def test_doesnt_allow_incorrect_types
18
+ assert_raises RedisModel::PropertyTypeIncorrect do
19
+ @person.dob = [1,2,3]
20
+ end
21
+ end
22
+
17
23
  def test_string
18
24
  assert @person.name == "ashley"
19
25
  end
data/test/test_helper.rb CHANGED
@@ -1,5 +1,12 @@
1
1
  require 'stringio'
2
2
  require 'test/unit'
3
- require File.dirname(__FILE__) + '/../lib/redismodel' unless defined? RedisModel
3
+
4
+ if ARGV.include?("g")
5
+ require 'rubygems'
6
+ require 'redismodel'
7
+ else
8
+ require File.dirname(__FILE__) + '/../lib/redismodel' unless defined? RedisModel
9
+ end
10
+
4
11
  Dir.glob("test/models/*.rb").each{|f| require f}
5
12
  Dir.glob("test/*_tests.rb").each{|f| require f}
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 4
9
- version: 0.1.4
8
+ - 5
9
+ version: 0.1.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ashley Williams