redismodel 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/redismodel.rb +211 -214
  2. data/test/models/person.rb +1 -1
  3. metadata +3 -3
data/lib/redismodel.rb CHANGED
@@ -76,244 +76,241 @@ class RedisModel
76
76
  end
77
77
 
78
78
 
79
- class Model
80
- # Local cache of the data
81
- attr_accessor :_data
79
+ # Local cache of the data
80
+ attr_accessor :_data
82
81
 
83
- def redis
84
- self.class.redis
85
- end
86
-
87
-
88
- def generate_uniq_token
89
- "#{MD5.hexdigest("#{self.class.to_s.downcase}-#{self.object_id}-#{rand**rand}-#{Time.now.to_f}")}"
90
- end
91
-
92
-
93
- # Creates a new object. If `{:id => "..."}` is passed, it'll attempt to recover the record
94
- # from the redis DB. If it can't find such a record, it'll raise RedisModel::RecordNotFound
95
- def initialize(hash={})
96
- @_data = {}
97
- if hash[:id].nil?
98
-
99
- self.send("id=", generate_uniq_token)
100
- unless self.class.properties[:created_at].nil?
101
- set :created_at, DateTime.now
102
- end
103
- hash.to_a.each do |property|
104
- begin
105
- self.send("#{property[0]}=", property[1])
106
- rescue
107
- end
82
+ def redis
83
+ self.class.redis
84
+ end
85
+
86
+
87
+ def generate_uniq_token
88
+ "#{MD5.hexdigest("#{self.class.to_s.downcase}-#{self.object_id}-#{rand**rand}-#{Time.now.to_f}")}"
89
+ end
90
+
91
+
92
+ # Creates a new object. If `{:id => "..."}` is passed, it'll attempt to recover the record
93
+ # from the redis DB. If it can't find such a record, it'll raise RedisModel::RecordNotFound
94
+ def initialize(hash={})
95
+ @_data = {}
96
+ if hash[:id].nil?
97
+
98
+ self.send("id=", generate_uniq_token)
99
+ unless self.class.properties[:created_at].nil?
100
+ set :created_at, DateTime.now
101
+ end
102
+ hash.to_a.each do |property|
103
+ begin
104
+ self.send("#{property[0]}=", property[1])
105
+ rescue
108
106
  end
109
- redis.set "#{self.class}:#{id}:id", id
110
- redis.incr "#{self.class}:_meta:count"
111
-
107
+ end
108
+ redis.set "#{self.class}:#{id}:id", id
109
+ redis.incr "#{self.class}:_meta:count"
110
+
111
+ else
112
+
113
+ self.send("id=", hash[:id])
114
+ if get(:id).nil?
115
+ raise RedisModel::InvalidRecord
112
116
  else
113
-
114
- self.send("id=", hash[:id])
115
- if get(:id).nil?
116
- raise RedisModel::InvalidRecord
117
- else
118
- self.reload
119
- end
120
-
117
+ self.reload
121
118
  end
119
+
122
120
  end
123
-
124
-
125
- # Custom model inspect in the format of:
126
- # #<MyModel id: "8a80300a9b3251ec4d930f8ab5e381e2", created_at: "2010-08-01T01:32:11+01:00">
127
- def inspect
128
- "#<#{self.class} #{self.class.properties.to_a.map{|c| "#{c[0].to_s}: #{get(c[0]).inspect}"}.join(", ")}>"
129
- end
130
-
131
-
132
- # Updates all keys from redis
133
- def reload
134
- self.class.properties.each do |property|
135
- self.get(property)
136
- end
137
- self
121
+ end
122
+
123
+
124
+ # Custom model inspect in the format of:
125
+ # #<MyModel id: "8a80300a9b3251ec4d930f8ab5e381e2", created_at: "2010-08-01T01:32:11+01:00">
126
+ def inspect
127
+ "#<#{self.class} #{self.class.properties.to_a.map{|c| "#{c[0].to_s}: #{get(c[0]).inspect}"}.join(", ")}>"
128
+ end
129
+
130
+
131
+ # Updates all keys from redis
132
+ def reload
133
+ self.class.properties.each do |property|
134
+ self.get(property)
138
135
  end
139
-
140
-
141
- # Permamently deletes all traces of the record, and
142
- # decrements the model count
143
- def destroy
144
- redis.keys("#{self.class}:#{id}:*").each do |key|
145
- redis.del key
146
- end
147
- redis.decr "#{self.class}:_meta:count"
136
+ self
137
+ end
138
+
139
+
140
+ # Permamently deletes all traces of the record, and
141
+ # decrements the model count
142
+ def destroy
143
+ redis.keys("#{self.class}:#{id}:*").each do |key|
144
+ redis.del key
148
145
  end
149
-
150
-
151
- def id
152
- @_data['id']
146
+ redis.decr "#{self.class}:_meta:count"
147
+ end
148
+
149
+
150
+ def id
151
+ @_data['id']
152
+ end
153
+
154
+
155
+ # Setter and getter for the config. Example:
156
+ #
157
+ # class MyModel < RedisModel
158
+ # config :host => "1.2.3.4",
159
+ # :port => 5678
160
+ # end
161
+ #
162
+ def self.config(hash=nil)
163
+ @_config ||= DEFAULT_CONFIG
164
+ if hash.nil?
165
+ return @_config
166
+ else
167
+ @_config = @_config.merge(hash)
168
+ return true
153
169
  end
154
-
155
-
156
- # Setter and getter for the config. Example:
157
- #
158
- # class MyModel < RedisModel::Model
159
- # config :host => "1.2.3.4",
160
- # :port => 5678
161
- # end
162
- #
163
- def self.config(hash=nil)
164
- @_config ||= DEFAULT_CONFIG
165
- if hash.nil?
166
- return @_config
167
- else
168
- @_config = @_config.merge(hash)
169
- return true
170
+ end
171
+
172
+
173
+ # Defines a new property. Example:
174
+ #
175
+ # class MyModel < RedisModel
176
+ # property :name, String
177
+ # property :age, Integer
178
+ # end
179
+ #
180
+ def self.property(name, type)
181
+ properties[:id] = String unless properties[:id]
182
+ properties[name] = type
183
+ class_eval do
184
+ define_method("#{name}=") do |str|
185
+ set(name, str)
170
186
  end
171
- end
172
-
173
-
174
- # Defines a new property. Example:
175
- #
176
- # class MyModel < RedisModel::Model
177
- # property :name, String
178
- # property :age, Integer
179
- # end
180
- #
181
- def self.property(name, type)
182
- properties[:id] = String unless properties[:id]
183
- properties[name] = type
184
- class_eval do
185
- define_method("#{name}=") do |str|
186
- set(name, str)
187
- end
188
-
189
- if type == Array || type == Hash
190
- proxy = (type == Array) ? ArrayProxy : HashProxy
191
- define_method(name) do
192
- value = get(name)
193
- return value if value.is_a?(proxy)
194
- value.tap do |value|
195
- value.extend(proxy).instance_variable_set(:@__model__, self)
196
- value.extend(proxy).instance_variable_set(:@__property__, name)
197
- end
198
- end
199
- else
200
- define_method(name) do
201
- get(name)
187
+
188
+ if type == Array || type == Hash
189
+ proxy = (type == Array) ? ArrayProxy : HashProxy
190
+ define_method(name) do
191
+ value = get(name)
192
+ return value if value.is_a?(proxy)
193
+ value.tap do |value|
194
+ value.extend(proxy).instance_variable_set(:@__model__, self)
195
+ value.extend(proxy).instance_variable_set(:@__property__, name)
202
196
  end
203
197
  end
204
-
205
- eval "def self.find_by_#{name.to_s}(str); self.search('#{name.to_s}', str); end"
206
- end
207
- end
208
-
209
-
210
- # Returns all records
211
- def self.all
212
- arr = []
213
- redis.keys("#{klass}:*:id").each do |key|
214
- arr << klass.find( key.split(":")[1] )
198
+ else
199
+ define_method(name) do
200
+ get(name)
201
+ end
215
202
  end
216
- arr.sort_by{|m| m.send( DEFAULT_CONFIG[:default_sort] )}
203
+
204
+ eval "def self.find_by_#{name.to_s}(str); self.search('#{name.to_s}', str); end"
217
205
  end
218
-
219
-
220
- # Finds a record from it's id
221
- def self.find(id)
222
- object = klass.new(:id => id)
206
+ end
207
+
208
+
209
+ # Returns all records
210
+ def self.all
211
+ arr = []
212
+ redis.keys("#{klass}:*:id").each do |key|
213
+ arr << klass.find( key.split(":")[1] )
223
214
  end
224
-
225
-
226
- # Returns all records where the value of `property` matches `str`
227
- def self.search(property, value)
228
- arr = []
229
- self.all.each do |record|
230
- if record.send(property) == value
231
- arr << record
232
- end
215
+ arr.sort_by{|m| m.send( DEFAULT_CONFIG[:default_sort] )}
216
+ end
217
+
218
+
219
+ # Finds a record from it's id
220
+ def self.find(id)
221
+ object = klass.new(:id => id)
222
+ end
223
+
224
+
225
+ # Returns all records where the value of `property` matches `str`
226
+ def self.search(property, value)
227
+ arr = []
228
+ self.all.each do |record|
229
+ if record.send(property) == value
230
+ arr << record
233
231
  end
234
- arr
235
232
  end
236
-
233
+ arr
234
+ end
235
+
237
236
 
238
- # Permamently deletes all records for the model
239
- def self.destroy_all
240
- redis.keys("#{klass}:*").each do |key|
241
- redis.del key
242
- end
243
- true
237
+ # Permamently deletes all records for the model
238
+ def self.destroy_all
239
+ redis.keys("#{klass}:*").each do |key|
240
+ redis.del key
244
241
  end
242
+ true
243
+ end
245
244
 
246
-
247
- # Destroys all records with the ids passed
248
- def self.destroy(*ids)
249
- ids.each do |id|
250
- klass.find(id).destroy
251
- end
252
- end
253
-
254
-
255
- # Returns the number of records for the model
256
- def self.count
257
- redis.get("#{klass}:_meta:count").to_i
245
+
246
+ # Destroys all records with the ids passed
247
+ def self.destroy(*ids)
248
+ ids.each do |id|
249
+ klass.find(id).destroy
258
250
  end
251
+ end
252
+
253
+
254
+ # Returns the number of records for the model
255
+ def self.count
256
+ redis.get("#{klass}:_meta:count").to_i
257
+ end
259
258
 
260
259
 
261
- # Saves the Redis database to disk
262
- def self.save!
263
- redis.bgsave == "Background saving started"
264
- end
260
+ # Saves the Redis database to disk
261
+ def self.save!
262
+ redis.bgsave == "Background saving started"
263
+ end
265
264
 
266
265
 
267
- protected
268
-
269
- # Writes a property value to redis, and updates #updated_at if required.
270
- def set(property, value)
271
- c = self.class.type(property)
272
- value = RedisModel.cast c, value
273
- redis.set "#{self.class}:#{id}:#{property}", value
274
- @_data[property] = value
275
-
276
- unless property == :updated_at && !self.class.properties[:updated_at].nil?
277
- set :updated_at, DateTime.now
278
- end
279
- end
280
-
281
- # Fetches the value of `property` from redis
282
- def get(property)
283
- c = self.class.type(property)
284
- value = RedisModel.cast c, redis.get("#{self.class}:#{id}:#{property}")
285
- @_data[property] = value
286
- end
287
-
288
-
289
- # Returns the class of the extended model
290
- def self.klass
291
- @klass ||= self.ancestors.first
292
- end
293
-
294
-
295
- # Returns the property class declared in #property above
296
- def self.type(property)
297
- properties[property]
298
- end
299
-
300
-
301
- # Keeps track of the properties declared via #property
302
- def self.properties
303
- @_properties ||= {}
304
- end
305
-
306
-
307
-
308
- # Alias for RedisModel#connection
309
- def self.redis
310
- RedisModel.connection(klass)
311
- end
312
-
313
-
314
- def id=(str)
315
- @_data['id'] = str
266
+ protected
267
+
268
+ # Writes a property value to redis, and updates #updated_at if required.
269
+ def set(property, value)
270
+ c = self.class.type(property)
271
+ value = RedisModel.cast c, value
272
+ redis.set "#{self.class}:#{id}:#{property}", value
273
+ @_data[property] = value
274
+
275
+ unless property == :updated_at && !self.class.properties[:updated_at].nil?
276
+ set :updated_at, DateTime.now
316
277
  end
317
-
278
+ end
279
+
280
+ # Fetches the value of `property` from redis
281
+ def get(property)
282
+ c = self.class.type(property)
283
+ value = RedisModel.cast c, redis.get("#{self.class}:#{id}:#{property}")
284
+ @_data[property] = value
285
+ end
286
+
287
+
288
+ # Returns the class of the extended model
289
+ def self.klass
290
+ @klass ||= self.ancestors.first
291
+ end
292
+
293
+
294
+ # Returns the property class declared in #property above
295
+ def self.type(property)
296
+ properties[property]
297
+ end
298
+
299
+
300
+ # Keeps track of the properties declared via #property
301
+ def self.properties
302
+ @_properties ||= {}
303
+ end
304
+
305
+
306
+
307
+ # Alias for RedisModel#connection
308
+ def self.redis
309
+ RedisModel.connection(klass)
310
+ end
311
+
312
+
313
+ def id=(str)
314
+ @_data['id'] = str
318
315
  end
319
316
  end
@@ -1,4 +1,4 @@
1
- class Person < RedisModel::Model
1
+ class Person < RedisModel
2
2
  # config :host => "1.2.3.4",
3
3
  # :port => 5678
4
4
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 0
9
- version: 0.1.0
8
+ - 1
9
+ version: 0.1.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ashley Williams
@@ -31,7 +31,7 @@ dependencies:
31
31
  version: 2.0.4
32
32
  type: :runtime
33
33
  version_requirements: *id001
34
- description: Syncs ruby objects with Redis
34
+ description: Syncs you ruby objects to Redis
35
35
  email: a.j.r.williams@gmail.com
36
36
  executables: []
37
37