ohm 0.0.24 → 0.0.25

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/lib/ohm.rb +30 -2
  2. data/test/model_test.rb +27 -0
  3. data/test/search_test.rb +42 -0
  4. metadata +3 -2
data/lib/ohm.rb CHANGED
@@ -180,6 +180,10 @@ module Ohm
180
180
  def size
181
181
  db.llen(key)
182
182
  end
183
+
184
+ def inspect
185
+ "#<List: #{raw.inspect}>"
186
+ end
183
187
  end
184
188
 
185
189
  # Represents a Redis set.
@@ -243,6 +247,7 @@ module Ohm
243
247
  # end
244
248
  # end
245
249
  def filter(hash, &block)
250
+ raise ArgumentError, "filter expects a block" unless block_given?
246
251
  apply(:sinterstore, keys(hash).push(key), &block)
247
252
  end
248
253
 
@@ -255,6 +260,7 @@ module Ohm
255
260
  # events = search_results.all
256
261
  # end
257
262
  def search(hash, &block)
263
+ raise ArgumentError, "search expects a block" unless block_given?
258
264
  apply(:sunionstore, keys(hash), &block)
259
265
  end
260
266
 
@@ -265,11 +271,15 @@ module Ohm
265
271
  # Apply a redis operation on a collection of sets. Note that
266
272
  # the resulting set is removed inmediatly after use.
267
273
  def apply(operation, source, &block)
268
- target = source.join(operation.to_s)
274
+ target = source.uniq.join("+")
269
275
  db.send(operation, target, *source)
270
276
  set = self.class.new(db, target, model)
271
277
  block.call(set)
272
- set.delete!
278
+ set.delete! if source.size > 1
279
+ end
280
+
281
+ def inspect
282
+ "#<Set: #{raw.inspect}>"
273
283
  end
274
284
 
275
285
  private
@@ -397,6 +407,10 @@ module Ohm
397
407
  new(:id => id) if exists?(id)
398
408
  end
399
409
 
410
+ def self.to_proc
411
+ Proc.new { |id| self[id] }
412
+ end
413
+
400
414
  def self.all
401
415
  @all ||= Attributes::Set.new(db, key(:all), self)
402
416
  end
@@ -557,6 +571,20 @@ module Ohm
557
571
  self
558
572
  end
559
573
 
574
+ def inspect
575
+ everything = (attributes + collections + counters).map do |att|
576
+ value = begin
577
+ send(att)
578
+ rescue ModelIsNew
579
+ nil
580
+ end
581
+
582
+ [att, value.inspect]
583
+ end
584
+
585
+ "#<#{self.class}:#{id || "?"} #{everything.map {|e| e.join("=") }.join(" ")}>"
586
+ end
587
+
560
588
  protected
561
589
 
562
590
  def key(*args)
@@ -112,6 +112,10 @@ class TestRedis < Test::Unit::TestCase
112
112
  assert_equal 1, User[1].id
113
113
  assert_equal "albert@example.com", User[1].email
114
114
  end
115
+
116
+ should "allow to map ids to models" do
117
+ assert_equal [User[1]], [1].map(&User)
118
+ end
115
119
  end
116
120
 
117
121
  context "Updating a user" do
@@ -526,4 +530,27 @@ class TestRedis < Test::Unit::TestCase
526
530
  assert_not_equal @user, OpenStruct.new(:key => @user.send(:key))
527
531
  end
528
532
  end
533
+
534
+ context "Debugging" do
535
+ class ::Bar < Ohm::Model
536
+ attribute :name
537
+ counter :visits
538
+ set :friends
539
+ list :comments
540
+ end
541
+
542
+ should "provide a meaningful inspect" do
543
+ bar = Bar.new
544
+
545
+ assert_equal "#<Bar:? name=nil friends=nil comments=nil visits=0>", bar.inspect
546
+
547
+ bar.update(:name => "Albert")
548
+ bar.friends << 1
549
+ bar.friends << 2
550
+ bar.comments << "A"
551
+ bar.incr(:visits)
552
+
553
+ assert_equal %Q{#<Bar:#{bar.id} name="Albert" friends=#<Set: ["1", "2"]> comments=#<List: ["A"]> visits=1>}, Bar[bar.id].inspect
554
+ end
555
+ end
529
556
  end
@@ -0,0 +1,42 @@
1
+ require File.join(File.dirname(__FILE__), "test_helper")
2
+
3
+ class SearchTest < Test::Unit::TestCase
4
+ setup do
5
+ Ohm.flush
6
+ end
7
+
8
+ class Lane < Ohm::Model
9
+ attribute :lane_type
10
+
11
+ index :lane_type
12
+
13
+ def to_s
14
+ lane_type.capitalize
15
+ end
16
+
17
+ def validate
18
+ assert_unique :lane_type
19
+ end
20
+
21
+ def error_messages
22
+ errors.present do |e|
23
+ e.on [:lane_type, :not_unique], "The lane type #{lane_type} is already in use"
24
+ end
25
+ end
26
+ end
27
+
28
+ context "A model with an indexed attribute" do
29
+ setup do
30
+ @results = []
31
+ @subresults = []
32
+ Lane.search(:lane_type => "email") { |sr| @results << sr.size }
33
+ Lane.create(:lane_type => "email")
34
+ Lane.search(:lane_type => "email") { |sr| @results << sr.size }
35
+ Lane.search(:lane_type => "email") { |sr| @results << sr.size }
36
+ end
37
+
38
+ should "be able to find by the given attribute" do
39
+ assert_equal [0, 1, 1], @results
40
+ end
41
+ end
42
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ohm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.24
4
+ version: 0.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michel Martens
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-09-25 00:00:00 -03:00
13
+ date: 2009-10-07 00:00:00 -03:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -40,6 +40,7 @@ files:
40
40
  - test/model_test.rb
41
41
  - test/mutex_test.rb
42
42
  - test/redis_test.rb
43
+ - test/search_test.rb
43
44
  - test/test_helper.rb
44
45
  - test/validations_test.rb
45
46
  - test/test.conf