ohm 0.0.32 → 0.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/test/indices_test.rb CHANGED
@@ -33,7 +33,7 @@ class IndicesTest < Test::Unit::TestCase
33
33
 
34
34
  context "A model with an indexed attribute" do
35
35
  setup do
36
- @user1 = User.create(:email => "foo")
36
+ @user1 = User.create(:email => "foo", :activation_code => "bar")
37
37
  @user2 = User.create(:email => "bar")
38
38
  @user3 = User.create(:email => "baz qux")
39
39
  end
@@ -42,6 +42,22 @@ class IndicesTest < Test::Unit::TestCase
42
42
  assert_equal @user1, User.find(:email => "foo").first
43
43
  end
44
44
 
45
+ should "avoid intersections with the all collection" do
46
+ assert_equal "IndicesTest::User:email:#{Ohm::Model.encode "foo"}", User.find(:email => "foo").key.to_s
47
+
48
+ assert_equal "~:IndicesTest::User:email:Zm9v+IndicesTest::User:activation_code:",
49
+ User.find(:email => "foo").find(:activation_code => "").key.to_s
50
+
51
+ assert_equal "~:IndicesTest::User:email:Zm9v+IndicesTest::User:activation_code:+IndicesTest::User:working_days:",
52
+ User.find(:email => "foo").find(:activation_code => "").find(:working_days => "").key.to_s
53
+ end
54
+
55
+ should "use a special namespace for set operations" do
56
+ assert_match /^~:/, User.find(:email => "foo", :activation_code => "bar").key.to_s
57
+
58
+ assert Ohm.redis.keys("~:*").size > 0
59
+ end
60
+
45
61
  should "raise if the field is not indexed" do
46
62
  assert_raises(Ohm::Model::IndexNotFound) do
47
63
  User.find(:sandunga => "foo")
@@ -57,28 +73,18 @@ class IndicesTest < Test::Unit::TestCase
57
73
  @user1.email = "baz"
58
74
  @user1.save
59
75
 
60
- assert_equal [], User.find(:email => "foo")
61
- assert_equal [@user1], User.find(:email => "baz")
76
+ assert_equal [], User.find(:email => "foo").all
77
+ assert_equal [@user1], User.find(:email => "baz").all
62
78
  end
63
79
 
64
80
  should "remove from the index after deleting" do
65
81
  @user2.delete
66
82
 
67
- assert_equal [], User.find(:email => "bar")
83
+ assert_equal [], User.find(:email => "bar").all
68
84
  end
69
85
 
70
86
  should "work with attributes that contain spaces" do
71
- assert_equal [@user3], User.find(:email => "baz qux")
72
- end
73
-
74
- should "not allow to manually clear an index" do
75
- assert_raise Ohm::Model::CannotDeleteIndex do
76
- User.find(:email => "bar").clear
77
- end
78
-
79
- assert_raise Ohm::Model::CannotDeleteIndex do
80
- User.find(:email => "bar").find(:email => "baz").clear
81
- end
87
+ assert_equal [@user3], User.find(:email => "baz qux").all
82
88
  end
83
89
  end
84
90
 
@@ -91,7 +97,7 @@ class IndicesTest < Test::Unit::TestCase
91
97
 
92
98
  should "allow indexing by an arbitrary attribute" do
93
99
  assert_equal [@user1, @user2], User.find(:email_provider => "gmail.com").to_a.sort_by { |u| u.id }
94
- assert_equal [@user3], User.find(:email_provider => "yahoo.com")
100
+ assert_equal [@user3], User.find(:email_provider => "yahoo.com").all
95
101
  end
96
102
 
97
103
  should "allow indexing by an attribute that is lazily set" do
@@ -122,7 +128,7 @@ class IndicesTest < Test::Unit::TestCase
122
128
  should "remove the indices when the object changes" do
123
129
  @user2.working_days.delete "Mon"
124
130
  @user2.save
125
- assert_equal [@user1], User.find(:working_days => "Mon")
131
+ assert_equal [@user1], User.find(:working_days => "Mon").all
126
132
  end
127
133
  end
128
134
 
@@ -146,12 +152,12 @@ class IndicesTest < Test::Unit::TestCase
146
152
  end
147
153
 
148
154
  should "intersect multiple sets of results" do
149
- assert_equal [@event1], Event.find(:timeline => 1, :days => [1, 2])
150
- assert_equal [@event1], Event.find(:timeline => 1).find(:days => [1, 2])
155
+ assert_equal [@event1], Event.find(:timeline => 1, :days => [1, 2]).all
156
+ assert_equal [@event1], Event.find(:timeline => 1).find(:days => [1, 2]).all
151
157
  end
152
158
 
153
159
  should "compute the difference between sets" do
154
- assert_equal [@event2], Event.find(:timeline => 1).except(:days => 1)
160
+ assert_equal [@event2], Event.find(:timeline => 1).except(:days => 1).all
155
161
  end
156
162
 
157
163
  should "raise if the argument is not an index" do
@@ -162,7 +168,7 @@ class IndicesTest < Test::Unit::TestCase
162
168
 
163
169
  should "work with strings that generate a new line when encoded" do
164
170
  user = User.create(:email => "foo@bar", :update => "CORRECTED - UPDATE 2-Suspected US missile strike kills 5 in Pakistan")
165
- assert_equal [user], User.find(:update => "CORRECTED - UPDATE 2-Suspected US missile strike kills 5 in Pakistan")
171
+ assert_equal [user], User.find(:update => "CORRECTED - UPDATE 2-Suspected US missile strike kills 5 in Pakistan").all
166
172
  end
167
173
  end
168
174
 
data/test/model_test.rb CHANGED
@@ -96,6 +96,13 @@ class TestRedis < Test::Unit::TestCase
96
96
  assert event.update(:location => nil)
97
97
  assert_equal nil, Meetup[event.id].location
98
98
  end
99
+
100
+ should "delete the attribute if set to an empty string" do
101
+ event = Meetup.create(:name => "Ruby Tuesday", :location => "Los Angeles")
102
+ assert_equal "Los Angeles", Meetup[event.id].location
103
+ assert event.update(:location => "")
104
+ assert_equal nil, Meetup[event.id].location
105
+ end
99
106
  end
100
107
 
101
108
  context "Model definition" do
@@ -331,7 +338,7 @@ class TestRedis < Test::Unit::TestCase
331
338
  Person.create :name => "B"
332
339
  Person.create :name => "A"
333
340
 
334
- assert_equal "A", Person.all.sort_by(:name, :get => "Person:*:name", :order => "ALPHA").first
341
+ assert_equal "A", Person.all.sort_by(:name, :get => :name, :order => "ALPHA").first
335
342
  end
336
343
  end
337
344
 
@@ -360,62 +367,59 @@ class TestRedis < Test::Unit::TestCase
360
367
 
361
368
  context "Attributes of type Set" do
362
369
  setup do
370
+ Ohm.flush
371
+
372
+ @person1 = Person.create(:name => "Albert")
373
+ @person2 = Person.create(:name => "Bertrand")
374
+ @person3 = Person.create(:name => "Charles")
375
+
363
376
  @event = Event.new
364
377
  @event.name = "Ruby Tuesday"
365
378
  end
366
379
 
367
380
  should "not be available if the model is new" do
368
381
  assert_raise Ohm::Model::MissingID do
369
- @event.attendees << 1
382
+ @event.attendees << Person.new
370
383
  end
371
384
  end
372
385
 
373
386
  should "remove an element if sent :delete" do
374
387
  @event.create
375
- @event.attendees << "1"
376
- @event.attendees << "2"
377
- @event.attendees << "3"
388
+ @event.attendees << @person1
389
+ @event.attendees << @person2
390
+ @event.attendees << @person3
378
391
  assert_equal ["1", "2", "3"], @event.attendees.raw.sort
379
- @event.attendees.delete("2")
392
+ @event.attendees.delete(@person2)
380
393
  assert_equal ["1", "3"], Event[@event.id].attendees.raw.sort
381
394
  end
382
395
 
383
396
  should "return true if the set includes some member" do
384
397
  @event.create
385
- @event.attendees << "1"
386
- @event.attendees << "2"
387
- @event.attendees << "3"
388
- assert @event.attendees.include?("2")
389
- assert_equal false, @event.attendees.include?("4")
398
+ @event.attendees << @person1
399
+ @event.attendees << @person2
400
+ assert @event.attendees.include?(@person2)
401
+ assert !@event.attendees.include?(@person3)
390
402
  end
391
403
 
392
- should "return instances of the passed model if the call to all includes a class" do
393
- @event.create
394
- @person = Person.create :name => "albert"
395
- @event.attendees << @person.id
396
-
397
- assert_equal [@person], @event.attendees.all
398
- end
399
-
400
- should "insert the model instance id instead of the object if using add" do
404
+ should "return instances of the passed model" do
401
405
  @event.create
402
- @person = Person.create :name => "albert"
403
- @event.attendees.add(@person)
406
+ @event.attendees << @person1
404
407
 
405
- assert_equal [@person.id.to_s], @event.attendees.raw
408
+ assert_equal [@person1], @event.attendees.all
409
+ assert_equal @person1, @event.attendees[0]
406
410
  end
407
411
 
408
412
  should "return the size of the set" do
409
413
  @event.create
410
- @event.attendees << "1"
411
- @event.attendees << "2"
412
- @event.attendees << "3"
414
+ @event.attendees << @person1
415
+ @event.attendees << @person2
416
+ @event.attendees << @person3
413
417
  assert_equal 3, @event.attendees.size
414
418
  end
415
419
 
416
420
  should "empty the set" do
417
421
  @event.create
418
- @event.attendees << "1"
422
+ @event.attendees << @person1
419
423
 
420
424
  @event.attendees.clear
421
425
 
@@ -424,21 +428,23 @@ class TestRedis < Test::Unit::TestCase
424
428
 
425
429
  should "replace the values in the set" do
426
430
  @event.create
427
- @event.attendees << "1"
431
+ @event.attendees << @person1
428
432
 
429
- @event.attendees.replace(["2", "3"])
433
+ assert_equal [@person1], @event.attendees.all
430
434
 
431
- assert_equal ["2", "3"], @event.attendees.raw.sort
435
+ @event.attendees.replace([@person2, @person3])
436
+
437
+ assert_equal [@person2, @person3], @event.attendees.sort
432
438
  end
433
439
 
434
440
  should "filter elements" do
435
441
  @event.create
436
- @event.attendees.add(Person.create(:name => "Albert"))
437
- @event.attendees.add(Person.create(:name => "Marie"))
442
+ @event.attendees.add(@person1)
443
+ @event.attendees.add(@person2)
438
444
 
439
- assert_equal ["1"], @event.attendees.find(:initial => "A").raw
440
- assert_equal ["2"], @event.attendees.find(:initial => "M").raw
441
- assert_equal [], @event.attendees.find(:initial => "Z").raw
445
+ assert_equal [@person1], @event.attendees.find(:initial => "A").all
446
+ assert_equal [@person2], @event.attendees.find(:initial => "B").all
447
+ assert_equal [], @event.attendees.find(:initial => "Z").all
442
448
  end
443
449
  end
444
450
 
@@ -528,7 +534,7 @@ class TestRedis < Test::Unit::TestCase
528
534
  should "replace the values in the list" do
529
535
  @post.comments.replace(["1", "2"])
530
536
 
531
- assert_equal ["1", "2"], @post.comments.raw
537
+ assert_equal ["1", "2"], @post.comments
532
538
  end
533
539
 
534
540
  should "add models" do
@@ -542,26 +548,46 @@ class TestRedis < Test::Unit::TestCase
542
548
 
543
549
  @post.related.add(another_post)
544
550
 
545
- assert @post.related.include?(another_post.id)
546
- assert !@post.related.include?("-1")
551
+ assert @post.related.include?(another_post)
552
+ assert !@post.related.include?(Post.create)
547
553
  end
548
554
  end
549
555
 
550
556
  context "Applying arbitrary transformations" do
551
557
  require "date"
552
558
 
559
+ class MyActiveRecordModel
560
+ def self.find(id)
561
+ return new if id.to_i == 1
562
+ end
563
+
564
+ def id
565
+ 1
566
+ end
567
+
568
+ def ==(other)
569
+ id == other.id
570
+ end
571
+ end
572
+
553
573
  class Calendar < Ohm::Model
554
574
  list :holidays, lambda { |v| Date.parse(v) }
575
+ list :subscribers, lambda { |id| MyActiveRecordModel.find(id) }
555
576
  end
556
577
 
557
578
  setup do
558
579
  @calendar = Calendar.create
559
- @calendar.holidays << "2009-05-25"
560
- @calendar.holidays << "2009-07-09"
580
+ @calendar.holidays.raw << "2009-05-25"
581
+ @calendar.holidays.raw << "2009-07-09"
582
+
583
+ @calendar.subscribers << MyActiveRecordModel.find(1)
561
584
  end
562
585
 
563
586
  should "apply a transformation" do
564
- assert_equal [Date.new(2009, 5, 25), Date.new(2009, 7, 9)], @calendar.holidays
587
+ assert_equal [Date.new(2009, 5, 25), Date.new(2009, 7, 9)], @calendar.holidays.all
588
+
589
+ assert_equal ["1"], @calendar.subscribers.raw.all
590
+ assert_equal [MyActiveRecordModel.find(1)], @calendar.subscribers.all
565
591
  end
566
592
  end
567
593
 
@@ -581,10 +607,10 @@ class TestRedis < Test::Unit::TestCase
581
607
  context "Sorting lists and sets by model attributes" do
582
608
  setup do
583
609
  @event = Event.create(:name => "Ruby Tuesday")
584
- @event.attendees << Person.create(:name => "D").id
585
- @event.attendees << Person.create(:name => "C").id
586
- @event.attendees << Person.create(:name => "B").id
587
- @event.attendees << Person.create(:name => "A").id
610
+ @event.attendees << Person.create(:name => "D")
611
+ @event.attendees << Person.create(:name => "C")
612
+ @event.attendees << Person.create(:name => "B")
613
+ @event.attendees << Person.create(:name => "A")
588
614
  end
589
615
 
590
616
  should "sort the model instances by the values provided" do
@@ -710,4 +736,114 @@ class TestRedis < Test::Unit::TestCase
710
736
  assert_equal "Foobar", Baz[baz.id].name
711
737
  end
712
738
  end
739
+
740
+ context "References to other objects" do
741
+ class ::Note < Ohm::Model
742
+ attribute :content
743
+ reference :source, Post
744
+ end
745
+
746
+ class ::Editor < Ohm::Model
747
+ attribute :name
748
+ reference :post, Post
749
+ end
750
+
751
+ class ::Post < Ohm::Model
752
+ reference :author, Person
753
+ collection :notes, Note, :source
754
+ collection :editors, Editor
755
+ end
756
+
757
+ setup do
758
+ @post = Post.create
759
+ end
760
+
761
+ context "a reference to another object" do
762
+ should "return an instance of Person if author_id has a valid id" do
763
+ @post.author_id = Person.create(:name => "Albert").id
764
+ @post.save
765
+ assert_equal "Albert", Post[@post.id].author.name
766
+ end
767
+
768
+ should "assign author_id if author is sent a valid instance" do
769
+ @post.author = Person.create(:name => "Albert")
770
+ @post.save
771
+ assert_equal "Albert", Post[@post.id].author.name
772
+ end
773
+
774
+ should "assign nil if nil is passed to author" do
775
+ @post.author = nil
776
+ @post.save
777
+ assert_nil Post[@post.id].author
778
+ end
779
+
780
+ should "be cached in an instance variable" do
781
+ @author = Person.create(:name => "Albert")
782
+ @post.update(:author => @author)
783
+
784
+ assert_equal @author, @post.author
785
+ assert @post.author.object_id == @post.author.object_id
786
+
787
+ @post.update(:author => Person.create(:name => "Bertrand"))
788
+
789
+ assert_equal "Bertrand", @post.author.name
790
+ assert @post.author.object_id == @post.author.object_id
791
+
792
+ @post.update(:author_id => Person.create(:name => "Charles").id)
793
+
794
+ assert_equal "Charles", @post.author.name
795
+ end
796
+ end
797
+
798
+ context "a collection of other objects" do
799
+ setup do
800
+ @note = Note.create(:content => "Interesting stuff", :source => @post)
801
+ end
802
+
803
+ should "return a set of notes" do
804
+ assert_equal @note.source, @post
805
+ assert_equal @note, @post.notes.first
806
+ end
807
+
808
+ should "default to the current class name" do
809
+ @editor = Editor.create(:name => "Albert", :post => @post)
810
+
811
+ assert_equal @editor, @post.editors.first
812
+ end
813
+ end
814
+ end
815
+
816
+ context "Models connected to different databases" do
817
+ class ::Car < Ohm::Model
818
+ attribute :name
819
+ end
820
+
821
+ class ::Make < Ohm::Model
822
+ attribute :name
823
+ end
824
+
825
+ setup do
826
+ Car.connect(:port => 6381, :db => 2)
827
+ end
828
+
829
+ teardown do
830
+ Car.db.flushdb
831
+ end
832
+
833
+ should "save to the selected database" do
834
+ car = Car.create(:name => "Twingo")
835
+ make = Make.create(:name => "Renault")
836
+
837
+ assert_equal 1, Make.db.instance_variable_get("@db")
838
+ assert_equal 2, Car.db.instance_variable_get("@db")
839
+
840
+ assert_equal car, Car[1]
841
+ assert_equal make, Make[1]
842
+
843
+ Make.db.flushdb
844
+
845
+ assert_equal car, Car[1]
846
+ assert_nil Make[1]
847
+ end
848
+ end
713
849
  end
data/test/redis_test.rb CHANGED
@@ -398,7 +398,7 @@ class RedisTest < Test::Unit::TestCase
398
398
  assert_equal "11", @r.zscore("league", "foo")
399
399
 
400
400
  @r.set "bar", "2"
401
- assert_raises do
401
+ assert_raises(RuntimeError) do
402
402
  @r.zincrby "bar", 2, "baz"
403
403
  end
404
404
  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.32
4
+ version: 0.0.33
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: 2010-01-13 00:00:00 -03:00
13
+ date: 2010-03-03 00:00:00 -03:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -25,7 +25,9 @@ extensions: []
25
25
  extra_rdoc_files: []
26
26
 
27
27
  files:
28
+ - lib/ohm/collection.rb
28
29
  - lib/ohm/compat-1.8.6.rb
30
+ - lib/ohm/key.rb
29
31
  - lib/ohm/redis.rb
30
32
  - lib/ohm/validations.rb
31
33
  - lib/ohm.rb