relaxdb 0.3.5 → 0.5

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.
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