relaxdb 0.3.5 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/README.textile +21 -23
  2. data/Rakefile +2 -7
  3. data/docs/spec_results.html +5 -5
  4. data/lib/more/grapher.rb +1 -1
  5. data/lib/relaxdb.rb +3 -5
  6. data/lib/relaxdb/all_delegator.rb +19 -13
  7. data/lib/relaxdb/document.rb +150 -218
  8. data/lib/relaxdb/extlib.rb +7 -1
  9. data/lib/relaxdb/migration.rb +11 -8
  10. data/lib/relaxdb/net_http_server.rb +19 -1
  11. data/lib/relaxdb/paginator.rb +30 -11
  12. data/lib/relaxdb/query.rb +1 -1
  13. data/lib/relaxdb/{belongs_to_proxy.rb → references_proxy.rb} +3 -3
  14. data/lib/relaxdb/relaxdb.rb +87 -7
  15. data/lib/relaxdb/server.rb +8 -2
  16. data/lib/relaxdb/taf2_curb_server.rb +2 -1
  17. data/lib/relaxdb/uuid_generator.rb +38 -2
  18. data/lib/relaxdb/view_by_delegator.rb +34 -0
  19. data/lib/relaxdb/view_object.rb +1 -1
  20. data/lib/relaxdb/view_uploader.rb +16 -2
  21. data/lib/relaxdb/views.rb +23 -55
  22. data/readme.rb +3 -3
  23. data/spec/all_delegator_spec.rb +52 -0
  24. data/spec/callbacks_spec.rb +4 -4
  25. data/spec/derived_properties_spec.rb +4 -4
  26. data/spec/design_doc_spec.rb +2 -2
  27. data/spec/doc_inheritable_spec.rb +2 -2
  28. data/spec/document_spec.rb +47 -25
  29. data/spec/migration_spec.rb +12 -10
  30. data/spec/qpaginate_spec.rb +88 -0
  31. data/spec/query_spec.rb +2 -2
  32. data/spec/references_proxy_spec.rb +94 -0
  33. data/spec/relaxdb_spec.rb +29 -21
  34. data/spec/server_spec.rb +4 -3
  35. data/spec/spec_helper.rb +1 -0
  36. data/spec/spec_models.rb +48 -57
  37. data/spec/uuid_generator_spec.rb +34 -0
  38. data/spec/view_by_spec.rb +62 -54
  39. data/spec/view_docs_by_spec.rb +85 -0
  40. metadata +38 -27
  41. data/lib/more/atomic_bulk_save_support.rb +0 -18
  42. data/lib/relaxdb/has_many_proxy.rb +0 -101
  43. data/lib/relaxdb/has_one_proxy.rb +0 -42
  44. data/lib/relaxdb/references_many_proxy.rb +0 -97
  45. data/spec/belongs_to_spec.rb +0 -124
  46. data/spec/has_many_spec.rb +0 -202
  47. data/spec/has_one_spec.rb +0 -123
  48. data/spec/references_many_spec.rb +0 -173
  49. data/spec/view_spec.rb +0 -23
data/spec/has_one_spec.rb DELETED
@@ -1,123 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
- require File.dirname(__FILE__) + '/spec_models.rb'
3
-
4
- describe RelaxDB::HasOneProxy do
5
-
6
- before(:each) do
7
- setup_test_db
8
- end
9
-
10
- describe "has_one" do
11
-
12
- it "should return nil when accessed before assignment" do
13
- p = Photo.new
14
- p.rating.should == nil
15
- end
16
-
17
- it "should be establishable via a constructor attribute" do
18
- r = Rating.new
19
- p = Photo.new :rating => r
20
- p.rating.should == r
21
- end
22
-
23
- it "should be establishable via assignment" do
24
- p = Photo.new
25
- r = Rating.new
26
- p.rating = r
27
- p.rating.should == r
28
- end
29
-
30
- it "should return the same object on repeated invocations" do
31
- p = Photo.new.save
32
- p.rating = Rating.new
33
- p = RelaxDB.load(p._id)
34
- p.rating.object_id.should == p.rating.object_id
35
- end
36
-
37
- it "should be preserved across load / save boundary" do
38
- r = Rating.new
39
- p = Photo.new(:rating => r).save
40
- p = RelaxDB.load p._id
41
- p.rating.should == r
42
- end
43
-
44
- it "should be able reference itself via its child" do
45
- r = Rating.new
46
- p = Photo.new(:rating => r).save
47
- p = RelaxDB.load p._id
48
- p.rating.photo.should == p
49
- end
50
-
51
- it "should work with MultiWordClassNames" do
52
- c = MultiWordChild.new
53
- m = MultiWordClass.new(:multi_word_child => c).save
54
- m = RelaxDB.load m._id
55
- m.multi_word_child.should == c
56
- end
57
-
58
- describe "#=" do
59
-
60
- it "should create a reference from the child to the parent" do
61
- p = Photo.new
62
- r = Rating.new
63
- p.rating = r
64
- r.photo.should == p
65
- end
66
-
67
- it "should save the assigned object" do
68
- p = Photo.new
69
- r = Rating.new
70
- p.rating = r
71
- r.should_not be_unsaved
72
- end
73
-
74
- it "will not save the parent" do
75
- p = Photo.new
76
- r = Rating.new
77
- p.rating = r
78
- p.should be_unsaved
79
- end
80
-
81
- it "should set the target to nil when nil is assigned" do
82
- p = Photo.new
83
- p.rating = nil
84
- p.rating.should be_nil
85
- end
86
-
87
- it "should nullify any existing relationship in the database" do
88
- p = Photo.new
89
- r = Rating.new
90
- p.rating = r
91
- p.rating = nil
92
- RelaxDB.load(r._id).photo.should be_nil
93
- end
94
-
95
- it "should nullify any existing relationship on a known in-memory object" do
96
- p = Photo.new
97
- r = Rating.new
98
- p.rating = r
99
- p.rating = nil
100
- r.photo.should be_nil
101
- end
102
-
103
- it "will not nullify any existing relationship on unknown in-memory objects" do
104
- p = Photo.new.save
105
- r = Rating.new
106
- p.rating = r
107
- r_copy = RelaxDB.load(r._id)
108
- p.rating = nil
109
- r_copy.photo.should_not be_nil
110
- end
111
-
112
- it "will not throw an error when the rhs fails validation" do
113
- d = Dysfunctional.new.save
114
- f = Failure.new
115
- d.failure = f
116
- d.failure.should == f
117
- end
118
-
119
- end
120
-
121
- end
122
-
123
- end
@@ -1,173 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
- require File.dirname(__FILE__) + '/spec_models.rb'
3
-
4
- describe RelaxDB::ReferencesManyProxy do
5
-
6
- before(:all) do
7
- setup_test_db
8
- end
9
-
10
- describe "references_many" do
11
-
12
- it "should preserve the relationships across the save / load boundary" do
13
- p = Photo.new
14
- t = Tag.new
15
- t.photos << p
16
-
17
- p = RelaxDB.load p._id
18
- p.tags.size.should == 1
19
- p.tags[0].should == t
20
-
21
- t = RelaxDB.load t._id
22
- t.photos.size.should == 1
23
- t.photos[0].should == p
24
- end
25
-
26
- it "should issue only a single request to resolve the relationship" do
27
- p, t = Photo.new, Tag.new
28
- p.tags << t
29
-
30
- # Create the views
31
- p.tags.map { |t| t._id }
32
-
33
- p = RelaxDB.load p._id
34
- RelaxDB.db.get_count = 0
35
- p.tags.map { |t| t._id }
36
- p.tags.map { |t| t._id }
37
- RelaxDB.db.get_count.should == 1
38
- end
39
-
40
- it "should not resolve the relationship when an object is instantiated" do
41
- p, t = Photo.new, Tag.new
42
- p.tags << t
43
-
44
- RelaxDB.db.get_count = 0
45
- p = RelaxDB.load p._id
46
- RelaxDB.db.get_count.should == 1
47
- end
48
-
49
- it "should make the ids available as a property" do
50
- p, t = Photo.new, Tag.new
51
- p.tags << t
52
-
53
- p.tags_ids.should == [t._id]
54
- end
55
-
56
- describe "#=" do
57
- it "should not be invoked" do
58
- end
59
- end
60
-
61
- describe "#<<" do
62
-
63
- it "should set the relationship on both sides" do
64
- p = Photo.new(:name => "photo")
65
- t = Tag.new(:name => "tag")
66
- p.tags << t
67
-
68
- p.tags.size.should == 1
69
- p.tags[0].name.should == "tag"
70
-
71
- t.photos.size.should == 1
72
- t.photos[0].name.should == "photo"
73
- end
74
-
75
- it "should not create duplicates when the same object is added more than once" do
76
- p = Photo.new
77
- t = Tag.new
78
- p.tags << t << t
79
- p.tags.size.should == 1
80
- end
81
-
82
- it "should not create duplicates when reciprocal objects are added from opposite sides" do
83
- p = Photo.new
84
- t = Tag.new
85
- p.tags << t
86
- t.photos << p
87
- p.tags.size.should == 1
88
- t.photos.size.should == 1
89
- end
90
-
91
- it "will resolve the reciprocal relationship" do
92
- # Create the views
93
- p, t = Photo.new, Tag.new
94
- p.tags << t
95
-
96
- p, t = Photo.new, Tag.new
97
- RelaxDB.db.get_count = 0
98
- p.tags << t
99
- RelaxDB.db.get_count.should == 2
100
- end
101
-
102
- end
103
-
104
- describe "#delete" do
105
-
106
- it "should nullify relationship on both sides" do
107
- p = Photo.new
108
- t = Tag.new
109
- p.tags << t
110
-
111
- p.tags.delete(t)
112
- p.tags.should be_empty
113
- t.photos.should be_empty
114
- end
115
-
116
- end
117
-
118
- describe "owner#destroy" do
119
-
120
- it "should remove its membership from its peers in memory" do
121
- p = Photo.new
122
- t = Tag.new
123
- p.tags << t
124
-
125
- p.destroy!
126
- t.photos.size.should == 0
127
- end
128
-
129
- it "should remove its membership from its peers in CouchDB" do
130
- p = Photo.new
131
- t = Tag.new
132
- p.tags << t
133
-
134
- p.destroy!
135
- RelaxDB.load(t._id).photos.should be_empty
136
- end
137
-
138
- end
139
-
140
- # Leaving this test as a reminder of problems with all.destroy and a self referential
141
- # references_many
142
- #
143
- # This test more complex than it needs to be to prove the point
144
- # It also serves as a proof of a self referential references_many, but there are better places for that
145
- # it "all.destroy should play nice with self referential references_many" do
146
- # u1 = TwitterUser.new(:name => "u1")
147
- # u2 = TwitterUser.new(:name => "u2")
148
- # u3 = TwitterUser.new(:name => "u3")
149
- #
150
- # u1.followers << u2
151
- # u1.followers << u3
152
- # u3.leaders << u2
153
- #
154
- # u1f = u1.followers.map { |u| u.name }
155
- # u1f.sort.should == ["u2", "u3"]
156
- # u1.leaders.should be_empty
157
- #
158
- # u2.leaders.size.should == 1
159
- # u2.leaders[0].name.should == "u1"
160
- # u2.followers.size.should == 1
161
- # u2.followers[0].name.should == "u3"
162
- #
163
- # u3l = u3.leaders.map { |u| u.name }
164
- # u3l.sort.should == ["u1", "u2"]
165
- # u3.followers.should be_empty
166
- #
167
- # TwitterUser.all.destroy!
168
- # TwitterUser.all.should be_empty
169
- # end
170
-
171
- end
172
-
173
- end
data/spec/view_spec.rb DELETED
@@ -1,23 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
- require File.dirname(__FILE__) + '/spec_models.rb'
3
-
4
- describe RelaxDB::View do
5
-
6
- describe "exists" do
7
-
8
- before(:each) do
9
- create_test_db
10
- end
11
-
12
- it "should return nil if a view doesnt exist" do
13
- RelaxDB::ViewCreator.all([Atom]).should_not be_exists
14
- end
15
-
16
- it "should return the view if it exits" do
17
- RelaxDB::ViewCreator.all([Atom]).save
18
- RelaxDB::ViewCreator.all([Atom]).should be_exists
19
- end
20
-
21
- end
22
-
23
- end