strokedb 0.0.2.1 → 0.0.2.2
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/README +18 -20
- data/bench.html +4001 -0
- data/bin/strokedb +14 -0
- data/examples/movies.rb +105 -0
- data/examples/movies2.rb +97 -0
- data/examples/strokewiki/README +28 -0
- data/examples/strokewiki/view/edit.xhtml +27 -0
- data/examples/strokewiki/view/new.xhtml +26 -0
- data/examples/strokewiki/view/pages.xhtml +27 -0
- data/examples/strokewiki/view/show.xhtml +40 -0
- data/examples/strokewiki/view/versions.xhtml +25 -0
- data/examples/strokewiki/wiki.rb +106 -0
- data/examples/todo.rb +92 -0
- data/lib/strokedb.rb +85 -0
- data/lib/{config → strokedb}/config.rb +14 -9
- data/lib/strokedb/console.rb +87 -0
- data/lib/strokedb/core_ext.rb +10 -0
- data/lib/{util/ext → strokedb/core_ext}/blank.rb +1 -1
- data/lib/{util/ext → strokedb/core_ext}/enumerable.rb +0 -0
- data/lib/{util/ext → strokedb/core_ext}/fixnum.rb +0 -0
- data/lib/strokedb/core_ext/float.rb +4 -0
- data/lib/{util/ext → strokedb/core_ext}/hash.rb +0 -0
- data/lib/strokedb/core_ext/infinity.rb +33 -0
- data/lib/strokedb/core_ext/kernel.rb +41 -0
- data/lib/strokedb/core_ext/object.rb +16 -0
- data/lib/{util/ext → strokedb/core_ext}/string.rb +28 -1
- data/lib/strokedb/core_ext/symbol.rb +13 -0
- data/lib/strokedb/data_structures.rb +5 -0
- data/lib/strokedb/data_structures/chunked_skiplist.rb +123 -0
- data/lib/{data_structures → strokedb/data_structures}/inverted_list.rb +0 -0
- data/lib/{data_structures → strokedb/data_structures}/point_query.rb +0 -0
- data/lib/strokedb/data_structures/simple_skiplist.rb +350 -0
- data/lib/{data_structures → strokedb/data_structures}/skiplist.rb +1 -1
- data/lib/{document → strokedb}/document.rb +180 -71
- data/lib/{document → strokedb/document}/callback.rb +0 -0
- data/lib/{document → strokedb/document}/delete.rb +2 -2
- data/lib/strokedb/document/dsl.rb +4 -0
- data/lib/{document → strokedb/document/dsl}/associations.rb +0 -0
- data/lib/{document → strokedb/document/dsl}/coercions.rb +0 -0
- data/lib/strokedb/document/dsl/meta_dsl.rb +7 -0
- data/lib/{document → strokedb/document/dsl}/validations.rb +26 -21
- data/lib/{document → strokedb/document/dsl}/virtualize.rb +0 -0
- data/lib/{document → strokedb/document}/meta.rb +92 -29
- data/lib/{document → strokedb/document}/slot.rb +17 -5
- data/lib/{document → strokedb/document}/util.rb +0 -0
- data/lib/{document → strokedb/document}/versions.rb +2 -2
- data/lib/strokedb/index.rb +2 -0
- data/lib/strokedb/nsurl.rb +24 -0
- data/lib/strokedb/store.rb +149 -0
- data/lib/strokedb/stores.rb +6 -0
- data/lib/{stores → strokedb/stores}/chainable_storage.rb +20 -14
- data/lib/strokedb/stores/file_storage.rb +118 -0
- data/lib/{stores/inverted_list_index → strokedb/stores}/inverted_list_file_storage.rb +50 -0
- data/lib/strokedb/stores/memory_storage.rb +80 -0
- data/lib/{stores → strokedb/stores}/remote_store.rb +10 -4
- data/lib/strokedb/sync.rb +4 -0
- data/lib/{sync → strokedb/sync}/chain_sync.rb +0 -0
- data/lib/{sync → strokedb/sync}/diff.rb +12 -1
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/array.rb +1 -1
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/default.rb +0 -0
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/hash.rb +1 -1
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/string.rb +1 -1
- data/lib/{sync → strokedb/sync}/lamport_timestamp.rb +0 -0
- data/lib/{sync → strokedb/sync}/store_sync.rb +15 -7
- data/lib/strokedb/transaction.rb +78 -0
- data/lib/{util → strokedb}/util.rb +14 -7
- data/lib/strokedb/util/attach_dsl.rb +29 -0
- data/lib/{util → strokedb/util}/blankslate.rb +0 -0
- data/lib/strokedb/util/class_optimization.rb +93 -0
- data/lib/{util → strokedb/util}/inflect.rb +0 -0
- data/lib/strokedb/util/java_util.rb +13 -0
- data/lib/{util → strokedb/util}/lazy_array.rb +0 -0
- data/lib/{util → strokedb/util}/lazy_mapping_array.rb +4 -0
- data/lib/{util → strokedb/util}/lazy_mapping_hash.rb +0 -0
- data/lib/{util → strokedb/util}/serialization.rb +21 -0
- data/lib/strokedb/util/uuid.rb +159 -0
- data/lib/{util → strokedb/util}/xml.rb +0 -0
- data/lib/{view → strokedb}/view.rb +2 -2
- data/lib/strokedb/volumes.rb +5 -0
- data/lib/strokedb/volumes/archive_volume.rb +165 -0
- data/lib/strokedb/volumes/block_volume.rb +169 -0
- data/lib/strokedb/volumes/distributed_pointer.rb +43 -0
- data/lib/strokedb/volumes/fixed_length_skiplist_volume.rb +109 -0
- data/lib/strokedb/volumes/map_volume.rb +268 -0
- data/meta/MANIFEST +175 -0
- data/script/console +2 -70
- data/spec/integration/remote_store_spec.rb +70 -0
- data/spec/integration/search_spec.rb +76 -0
- data/spec/integration/spec_helper.rb +1 -0
- data/spec/lib/spec_helper.rb +1 -0
- data/spec/lib/strokedb/config_spec.rb +250 -0
- data/spec/lib/strokedb/core_ext/blank_spec.rb +20 -0
- data/spec/lib/strokedb/core_ext/extract_spec.rb +42 -0
- data/spec/lib/strokedb/core_ext/float_spec.rb +62 -0
- data/spec/lib/strokedb/core_ext/infinity_spec.rb +40 -0
- data/spec/lib/strokedb/core_ext/spec_helper.rb +1 -0
- data/spec/lib/strokedb/core_ext/string_spec.rb +25 -0
- data/spec/lib/strokedb/core_ext/symbol_spec.rb +8 -0
- data/spec/lib/strokedb/data_structures/chunked_skiplist_spec.rb +144 -0
- data/spec/lib/strokedb/data_structures/inverted_list_spec.rb +172 -0
- data/spec/lib/strokedb/data_structures/simple_skiplist_spec.rb +200 -0
- data/spec/lib/strokedb/data_structures/skiplist_spec.rb +253 -0
- data/spec/lib/strokedb/data_structures/spec_helper.rb +1 -0
- data/spec/lib/strokedb/document/associations_spec.rb +319 -0
- data/spec/lib/strokedb/document/callbacks_spec.rb +134 -0
- data/spec/lib/strokedb/document/coercions_spec.rb +110 -0
- data/spec/lib/strokedb/document/document_spec.rb +1063 -0
- data/spec/lib/strokedb/document/meta_meta_spec.rb +30 -0
- data/spec/lib/strokedb/document/meta_spec.rb +435 -0
- data/spec/lib/strokedb/document/metaslot_spec.rb +43 -0
- data/spec/lib/strokedb/document/slot_spec.rb +130 -0
- data/spec/lib/strokedb/document/spec_helper.rb +1 -0
- data/spec/lib/strokedb/document/validations_spec.rb +1081 -0
- data/spec/lib/strokedb/document/virtualize_spec.rb +80 -0
- data/spec/lib/strokedb/nsurl_spec.rb +73 -0
- data/spec/lib/strokedb/spec_helper.rb +1 -0
- data/spec/lib/strokedb/stores/chained_storages_spec.rb +116 -0
- data/spec/lib/strokedb/stores/spec_helper.rb +1 -0
- data/spec/lib/strokedb/stores/store_spec.rb +201 -0
- data/spec/lib/strokedb/stores/transaction_spec.rb +107 -0
- data/spec/lib/strokedb/sync/chain_sync_spec.rb +43 -0
- data/spec/lib/strokedb/sync/diff_spec.rb +111 -0
- data/spec/lib/strokedb/sync/lamport_timestamp_spec.rb +174 -0
- data/spec/lib/strokedb/sync/slot_diff_spec.rb +164 -0
- data/spec/lib/strokedb/sync/spec_helper.rb +1 -0
- data/spec/lib/strokedb/sync/store_sync_spec.rb +181 -0
- data/spec/lib/strokedb/sync/stroke_diff/array_spec.rb +97 -0
- data/spec/lib/strokedb/sync/stroke_diff/complex_spec.rb +58 -0
- data/spec/lib/strokedb/sync/stroke_diff/hash_spec.rb +144 -0
- data/spec/lib/strokedb/sync/stroke_diff/scalar_spec.rb +23 -0
- data/spec/lib/strokedb/sync/stroke_diff/spec_helper.rb +25 -0
- data/spec/lib/strokedb/sync/stroke_diff/string_spec.rb +61 -0
- data/spec/lib/strokedb/util/attach_dsl_spec.rb +45 -0
- data/spec/lib/strokedb/util/inflect_spec.rb +14 -0
- data/spec/lib/strokedb/util/lazy_array_spec.rb +157 -0
- data/spec/lib/strokedb/util/lazy_mapping_array_spec.rb +174 -0
- data/spec/lib/strokedb/util/lazy_mapping_hash_spec.rb +92 -0
- data/spec/lib/strokedb/util/spec_helper.rb +1 -0
- data/spec/lib/strokedb/util/uuid_spec.rb +46 -0
- data/spec/lib/strokedb/view_spec.rb +228 -0
- data/spec/lib/strokedb/volumes/archive_volume_spec.rb +105 -0
- data/spec/lib/strokedb/volumes/block_volume_spec.rb +100 -0
- data/spec/lib/strokedb/volumes/distributed_pointer_spec.rb +14 -0
- data/spec/lib/strokedb/volumes/fixed_length_skiplist_volume_spec.rb +177 -0
- data/spec/lib/strokedb/volumes/map_volume_spec.rb +172 -0
- data/spec/lib/strokedb/volumes/spec_helper.rb +1 -0
- data/spec/regression/docref_spec.rb +94 -0
- data/spec/regression/meta_spec.rb +23 -0
- data/spec/regression/spec_helper.rb +1 -0
- data/spec/regression/sync_spec.rb +36 -0
- data/spec/spec.opts +7 -0
- data/spec/spec_helper.rb +37 -0
- data/spec/temp/storages/TIMESTAMP +1 -0
- data/spec/temp/storages/UUID +1 -0
- data/spec/temp/storages/database-sync/TIMESTAMP +1 -0
- data/spec/temp/storages/database-sync/UUID +1 -0
- data/spec/temp/storages/database-sync/config +1 -0
- data/spec/temp/storages/database-sync/file/LAST +1 -0
- data/spec/temp/storages/database-sync/file/bd/f6/bdf675e5-8a7b-494e-97f2-f74a14ccd95d.av +0 -0
- data/spec/temp/storages/database-sync/file/uindex.wal +0 -0
- data/spec/temp/storages/database-sync/inverted_list_file/INVERTED_INDEX +1 -0
- data/spec/temp/storages/inverted_list_storage/INVERTED_INDEX +0 -0
- data/strokedb.gemspec +120 -0
- data/task/benchmark.task +9 -0
- data/task/ditz.task +30 -0
- data/task/echoe.rb +17 -0
- data/task/rcov.task +50 -0
- data/task/rdoc.task +10 -0
- data/task/rspec.task +0 -0
- data/vendor/java_inline.rb +106 -0
- data/vendor/rbmodexcl/mrimodexcl.rb +82 -0
- data/vendor/rbmodexcl/rbmodexcl.rb +5 -0
- data/vendor/rbmodexcl/rbxmodexcl.rb +48 -0
- data/vendor/rbmodexcl/spec/unextend_spec.rb +50 -0
- data/vendor/rbmodexcl/spec/uninclude_spec.rb +26 -0
- metadata +271 -79
- data/CONTRIBUTORS +0 -7
- data/CREDITS +0 -13
- data/bin/sdbc +0 -2
- data/lib/init.rb +0 -57
- data/lib/stores/inverted_list_index/inverted_list_index.rb +0 -49
- data/lib/stores/skiplist_store/chunk.rb +0 -119
- data/lib/stores/skiplist_store/chunk_storage.rb +0 -21
- data/lib/stores/skiplist_store/file_chunk_storage.rb +0 -44
- data/lib/stores/skiplist_store/memory_chunk_storage.rb +0 -37
- data/lib/stores/skiplist_store/skiplist_store.rb +0 -217
- data/lib/stores/store.rb +0 -5
- data/lib/sync/stroke_diff/stroke_diff.rb +0 -9
- data/lib/util/ext/object.rb +0 -8
- data/lib/util/java_util.rb +0 -9
- data/lib/util/trigger_partition.rb +0 -136
- data/strokedb.rb +0 -75
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Playlist.has_many :songs association" do
|
|
4
|
+
|
|
5
|
+
before(:each) do
|
|
6
|
+
setup_default_store
|
|
7
|
+
setup_index
|
|
8
|
+
Object.send!(:remove_const,'Playlist') if defined?(Playlist)
|
|
9
|
+
Object.send!(:remove_const,'Song') if defined?(Song)
|
|
10
|
+
Playlist = Meta.new do
|
|
11
|
+
has_many :songs
|
|
12
|
+
end
|
|
13
|
+
Song = Meta.new
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should convert :songs to Song and Playlist to playlist to compute foreign reference slot name" do
|
|
17
|
+
playlist = Playlist.create!
|
|
18
|
+
song = Song.create!(:playlist => playlist)
|
|
19
|
+
playlist.songs.should == [song]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should not fail if Song document has no :playlist slot" do
|
|
23
|
+
playlist = Playlist.create!
|
|
24
|
+
song = Song.create!
|
|
25
|
+
playlist.songs.should be_empty
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should have association owner defined" do
|
|
29
|
+
playlist = Playlist.create!
|
|
30
|
+
song = Song.create!
|
|
31
|
+
playlist.songs.association_owner.should == playlist
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should work well with multiple metas" do
|
|
35
|
+
Object.send!(:remove_const,'RockPlaylist') if defined?(RockPlaylist)
|
|
36
|
+
RockPlaylist = Meta.new do
|
|
37
|
+
has_many :rock_songs, :through => :songs, :conditions => { :genre => 'Rock' }, :foreign_reference => :playlist
|
|
38
|
+
end
|
|
39
|
+
playlist = Playlist.new
|
|
40
|
+
playlist.metas << RockPlaylist
|
|
41
|
+
playlist.save!
|
|
42
|
+
rock_song = Song.new(:genre => 'Rock')
|
|
43
|
+
playlist.songs << rock_song
|
|
44
|
+
playlist.songs.should == [rock_song]
|
|
45
|
+
playlist.rock_songs.should == [rock_song]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "should fetch head versions of associated documents if association owner is a head" do
|
|
49
|
+
playlist = Playlist.create!
|
|
50
|
+
playlist.should be_head
|
|
51
|
+
song = Song.create!(:playlist => playlist)
|
|
52
|
+
song.name = "My song"
|
|
53
|
+
song.save!
|
|
54
|
+
playlist.songs.should == [song]
|
|
55
|
+
playlist.songs.each do |s|
|
|
56
|
+
s.should be_head
|
|
57
|
+
s.should_not be_a_kind_of(VersionedDocument)
|
|
58
|
+
s.should have_slot(:name)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should fetch specific versions of associated documents if association owner is a not a head" do
|
|
63
|
+
pending do
|
|
64
|
+
playlist = Playlist.create!
|
|
65
|
+
song = Song.create!(:playlist => playlist)
|
|
66
|
+
playlist.name = "My playlist"
|
|
67
|
+
playlist.save!
|
|
68
|
+
playlist = playlist.versions.previous
|
|
69
|
+
playlist.should_not be_head
|
|
70
|
+
song.name = "My song"
|
|
71
|
+
song.save!
|
|
72
|
+
song = song.versions.previous
|
|
73
|
+
playlist.songs.should == [song]
|
|
74
|
+
playlist.songs.each do |s|
|
|
75
|
+
s.should_not be_head
|
|
76
|
+
s.should be_a_kind_of(VersionedDocument)
|
|
77
|
+
s.should_not have_slot(:name)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "should fetch head versions of associated documents if association owner wasn't saved when associated doc were created and now it is a head" do
|
|
83
|
+
playlist = Playlist.new
|
|
84
|
+
song = Song.create!(:playlist => playlist)
|
|
85
|
+
song.name = "My song"
|
|
86
|
+
song.save!
|
|
87
|
+
playlist.save!
|
|
88
|
+
playlist.should be_head
|
|
89
|
+
playlist.songs.should == [song]
|
|
90
|
+
playlist.songs.each do |s|
|
|
91
|
+
s.should be_head
|
|
92
|
+
s.should_not be_a_kind_of(VersionedDocument)
|
|
93
|
+
s.should have_slot(:name)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "should fetch head versions of associated documents if association owner wasn't saved when associated doc were created and now it is not a head" do
|
|
98
|
+
pending do
|
|
99
|
+
playlist = Playlist.new
|
|
100
|
+
song = Song.create!(:playlist => playlist)
|
|
101
|
+
song.name = "My song"
|
|
102
|
+
song.save!
|
|
103
|
+
playlist.save!
|
|
104
|
+
playlist.name = "My playlist"
|
|
105
|
+
playlist.save!
|
|
106
|
+
playlist = playlist.versions.previous
|
|
107
|
+
playlist.songs.should == [song]
|
|
108
|
+
playlist.songs.each do |s|
|
|
109
|
+
s.should be_head
|
|
110
|
+
s.should_not be_a_kind_of(VersionedDocument)
|
|
111
|
+
s.should have_slot(:name)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "should be able to filter associated documents" do
|
|
117
|
+
playlist = Playlist.create!
|
|
118
|
+
rock_song = Song.create!(:playlist => playlist, :genre => 'Rock')
|
|
119
|
+
pop_song = Song.create!(:playlist => playlist, :genre => 'Pop')
|
|
120
|
+
playlist.songs.find(:genre => 'Rock').should == [rock_song]
|
|
121
|
+
playlist.songs.find(:genre => 'Pop').should == [pop_song]
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "should be able to instantiate new document with #new" do
|
|
125
|
+
playlist = Playlist.create!
|
|
126
|
+
song = playlist.songs.new(:name => 'My song')
|
|
127
|
+
song.name.should == 'My song'
|
|
128
|
+
song.playlist.should == playlist
|
|
129
|
+
song.should be_a_kind_of(Document)
|
|
130
|
+
song.should be_new
|
|
131
|
+
song.save!
|
|
132
|
+
playlist.songs.should == [song]
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "should be able to instantiate new document with #build" do
|
|
136
|
+
# should be the same at the above
|
|
137
|
+
playlist = Playlist.create!
|
|
138
|
+
song = playlist.songs.build(:name => 'My song')
|
|
139
|
+
song.name.should == 'My song'
|
|
140
|
+
song.playlist.should == playlist
|
|
141
|
+
song.should be_a_kind_of(Document)
|
|
142
|
+
song.should be_new
|
|
143
|
+
song.save!
|
|
144
|
+
playlist.songs.should == [song]
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "should be able to create new document" do
|
|
148
|
+
playlist = Playlist.create!
|
|
149
|
+
song = playlist.songs.create!(:name => 'My song')
|
|
150
|
+
song.name.should == 'My song'
|
|
151
|
+
song.playlist.should == playlist
|
|
152
|
+
song.should be_a_kind_of(Document)
|
|
153
|
+
song.should_not be_new
|
|
154
|
+
playlist.songs.should == [song]
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
describe "Namespace::Playlist.has_many :songs association" do
|
|
160
|
+
|
|
161
|
+
before(:each) do
|
|
162
|
+
setup_default_store
|
|
163
|
+
setup_index
|
|
164
|
+
Object.send!(:remove_const,'Namespace') if defined?(Namespace)
|
|
165
|
+
Namespace = Module.new
|
|
166
|
+
Namespace.send!(:remove_const,'Playlist') if defined?(Namespace::Playlist)
|
|
167
|
+
Namespace.send!(:remove_const,'Song') if defined?(Namespace::Song)
|
|
168
|
+
Namespace::Playlist = Meta.new do
|
|
169
|
+
has_many :songs
|
|
170
|
+
end
|
|
171
|
+
Namespace::Song = Meta.new
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
it "should convert :songs to Song and Playlist to playlist to compute foreign reference slot name" do
|
|
175
|
+
playlist = Namespace::Playlist.create!
|
|
176
|
+
song = Namespace::Song.create!(:playlist => playlist)
|
|
177
|
+
playlist.songs.should == [song]
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
describe "Playlist.has_many :rock_songs, :through => :songs, :conditions => { :genre => 'Rock' } association" do
|
|
184
|
+
|
|
185
|
+
before(:each) do
|
|
186
|
+
setup_default_store
|
|
187
|
+
setup_index
|
|
188
|
+
Object.send!(:remove_const,'Playlist') if defined?(Playlist)
|
|
189
|
+
Object.send!(:remove_const,'Song') if defined?(Song)
|
|
190
|
+
Playlist = Meta.new do
|
|
191
|
+
has_many :rock_songs, :through => :songs, :conditions => { :genre => 'Rock' }
|
|
192
|
+
end
|
|
193
|
+
Song = Meta.new
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it "should convert :songs to Song and Playlist to playlist to compute foreign reference slot name" do
|
|
197
|
+
playlist = Playlist.create!
|
|
198
|
+
rock_song = Song.create!(:playlist => playlist, :genre => 'Rock')
|
|
199
|
+
pop_song = Song.create!(:playlist => playlist, :genre => 'Pop')
|
|
200
|
+
playlist.rock_songs.should == [rock_song]
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
describe "Playlist.has_many :songs, :foreign_reference => :belongs_to_playlist association" do
|
|
206
|
+
|
|
207
|
+
before(:each) do
|
|
208
|
+
setup_default_store
|
|
209
|
+
setup_index
|
|
210
|
+
Object.send!(:remove_const,'Playlist') if defined?(Playlist)
|
|
211
|
+
Object.send!(:remove_const,'Song') if defined?(Song)
|
|
212
|
+
Playlist = Meta.new do
|
|
213
|
+
has_many :songs, :foreign_reference => :belongs_to_playlist
|
|
214
|
+
end
|
|
215
|
+
Song = Meta.new
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
it "should convert :songs to Song and use foreign_reference to compute foreign reference slot name" do
|
|
219
|
+
playlist = Playlist.create!
|
|
220
|
+
song = Song.create!(:belongs_to_playlist => playlist)
|
|
221
|
+
playlist.songs.should == [song]
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
describe "Playlist.has_many :all_songs, :through => :songs association" do
|
|
227
|
+
|
|
228
|
+
before(:each) do
|
|
229
|
+
setup_default_store
|
|
230
|
+
setup_index
|
|
231
|
+
Object.send!(:remove_const,'Playlist') if defined?(Playlist)
|
|
232
|
+
Object.send!(:remove_const,'Song') if defined?(Song)
|
|
233
|
+
|
|
234
|
+
Playlist = Meta.new do
|
|
235
|
+
has_many :all_songs, :through => :songs
|
|
236
|
+
end
|
|
237
|
+
Song = Meta.new
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it "should use through's :songs to find out Song and convert Playlist to playlist" do
|
|
241
|
+
playlist = Playlist.create!
|
|
242
|
+
song = Song.create!(:playlist => playlist)
|
|
243
|
+
playlist.all_songs.should == [song]
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
describe "Playlist.has_many :authors, :through => [:songs,:authors] association" do
|
|
249
|
+
|
|
250
|
+
before(:each) do
|
|
251
|
+
setup_default_store
|
|
252
|
+
setup_index
|
|
253
|
+
Object.send!(:remove_const,'Playlist') if defined?(Playlist)
|
|
254
|
+
Object.send!(:remove_const,'Song') if defined?(Song)
|
|
255
|
+
|
|
256
|
+
Playlist = Meta.new do
|
|
257
|
+
has_many :authors, :through => [:songs,:author]
|
|
258
|
+
end
|
|
259
|
+
Song = Meta.new
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "should use through's :songs to find out Song and convert Playlist to playlist" do
|
|
263
|
+
playlist = Playlist.create!
|
|
264
|
+
song = Song.create!(:playlist => playlist, :author => "John Doe")
|
|
265
|
+
playlist.authors.should == [song.author]
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
it "should not fail if Song document has no :author slot" do
|
|
269
|
+
playlist = Playlist.create!
|
|
270
|
+
song = Song.create!(:playlist => playlist)
|
|
271
|
+
playlist.authors.should be_empty
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
describe "Playlist.has_many :songs, :extend => MyExt association" do
|
|
277
|
+
before(:each) do
|
|
278
|
+
setup_default_store
|
|
279
|
+
setup_index
|
|
280
|
+
Object.send!(:remove_const,'Playlist') if defined?(Playlist)
|
|
281
|
+
Object.send!(:remove_const,'Song') if defined?(Song)
|
|
282
|
+
Object.send!(:remove_const,'MyExt') if defined?(MyExt)
|
|
283
|
+
MyExt = Module.new do
|
|
284
|
+
end
|
|
285
|
+
Playlist = Meta.new do
|
|
286
|
+
has_many :songs, :extend => MyExt
|
|
287
|
+
end
|
|
288
|
+
Song = Meta.new
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
it "should extend result with MyExt" do
|
|
292
|
+
playlist = Playlist.create!
|
|
293
|
+
playlist.songs.should be_a_kind_of(MyExt)
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
describe "Playlist.has_many :songs do .. end association" do
|
|
299
|
+
before(:each) do
|
|
300
|
+
setup_default_store
|
|
301
|
+
setup_index
|
|
302
|
+
Object.send!(:remove_const,'Playlist') if defined?(Playlist)
|
|
303
|
+
Object.send!(:remove_const,'Song') if defined?(Song)
|
|
304
|
+
Playlist = Meta.new do
|
|
305
|
+
has_many :songs do
|
|
306
|
+
def some_method
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
Song = Meta.new
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
it "should extend result with given block" do
|
|
314
|
+
playlist = Playlist.create!
|
|
315
|
+
playlist.songs.should be_a_kind_of(Playlist::HasManySongs)
|
|
316
|
+
playlist.songs.should respond_to(:some_method)
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
describe "Meta module with on_initialization callback" do
|
|
2
|
+
|
|
3
|
+
before(:each) do
|
|
4
|
+
setup_default_store
|
|
5
|
+
setup_index
|
|
6
|
+
|
|
7
|
+
Object.send!(:remove_const,'SomeName') if defined?(SomeName)
|
|
8
|
+
SomeName = Meta.new do
|
|
9
|
+
on_initialization do |obj|
|
|
10
|
+
Kernel.send!(:on_initialization_called,obj.new?)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should receive this callback on meta instantiation" do
|
|
16
|
+
Kernel.should_receive(:on_initialization_called).with(true)
|
|
17
|
+
doc = SomeName.new
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should be a sole meta receiving this callback when adding metas dynamically" do
|
|
21
|
+
Object.send!(:remove_const,'SomeOtherName') if defined?(SomeOtherName)
|
|
22
|
+
SomeOtherName = Meta.new do
|
|
23
|
+
on_initialization do |obj|
|
|
24
|
+
Kernel.send!(:other_on_initialization_called,obj.new?)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
Kernel.should_receive(:other_on_initialization_called).with(true).once
|
|
28
|
+
doc = SomeOtherName.new
|
|
29
|
+
Kernel.should_receive(:on_initialization_called).with(true).once
|
|
30
|
+
doc.metas << SomeName
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
describe "Meta module with on_load callback" do
|
|
37
|
+
|
|
38
|
+
before(:each) do
|
|
39
|
+
setup_default_store
|
|
40
|
+
setup_index
|
|
41
|
+
Object.send!(:remove_const,'SomeName') if defined?(SomeName)
|
|
42
|
+
SomeName = Meta.new do
|
|
43
|
+
on_load do |obj|
|
|
44
|
+
Kernel.send!(:on_load_called,obj.new?)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should not receive this callback on meta instantiation" do
|
|
50
|
+
Kernel.should_not_receive(:on_load_called)
|
|
51
|
+
doc = SomeName.new
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should receive this callback on document load" do
|
|
55
|
+
doc = SomeName.create!
|
|
56
|
+
Kernel.should_receive(:on_load_called).with(false)
|
|
57
|
+
d = SomeName.find(doc.uuid)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe "Meta module with before_save callback" do
|
|
64
|
+
|
|
65
|
+
before(:each) do
|
|
66
|
+
setup_default_store
|
|
67
|
+
setup_index
|
|
68
|
+
|
|
69
|
+
Object.send!(:remove_const,'SomeName') if defined?(SomeName)
|
|
70
|
+
SomeName = Meta.new do
|
|
71
|
+
before_save do |obj|
|
|
72
|
+
Kernel.send!(:before_save_called,obj.new?)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should initiate callback on Document#save! (before actually saving it)" do
|
|
78
|
+
s = SomeName.new
|
|
79
|
+
Kernel.should_receive(:before_save_called).with(true)
|
|
80
|
+
s.save!
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
describe "Meta module with after_save callback" do
|
|
86
|
+
|
|
87
|
+
before(:each) do
|
|
88
|
+
setup_default_store
|
|
89
|
+
setup_index
|
|
90
|
+
|
|
91
|
+
Object.send!(:remove_const,'SomeName') if defined?(SomeName)
|
|
92
|
+
SomeName = Meta.new do
|
|
93
|
+
after_save do |obj|
|
|
94
|
+
Kernel.send!(:after_save_called,obj.new?)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "should initiate callback on Document#save! (after actually saving it)" do
|
|
100
|
+
s = SomeName.new
|
|
101
|
+
Kernel.should_receive(:after_save_called).with(false)
|
|
102
|
+
s.save!
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
describe "Meta module with on_new_document callback" do
|
|
109
|
+
|
|
110
|
+
before(:each) do
|
|
111
|
+
setup_default_store
|
|
112
|
+
setup_index
|
|
113
|
+
|
|
114
|
+
Object.send!(:remove_const,'SomeName') if defined?(SomeName)
|
|
115
|
+
SomeName = Meta.new do
|
|
116
|
+
on_new_document do |obj|
|
|
117
|
+
Kernel.send!(:on_new_document,obj.new?)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "should initiate callback on Document#new" do
|
|
123
|
+
Kernel.should_receive(:on_new_document).with(true)
|
|
124
|
+
s = SomeName.new
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "should not initiate callback on loaded Document" do
|
|
128
|
+
Kernel.should_receive(:on_new_document).with(true).once
|
|
129
|
+
s = SomeName.new
|
|
130
|
+
s.save!
|
|
131
|
+
s.reload
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|