tinkit 0.0.0
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/LICENSE +176 -0
- data/README +11 -0
- data/Rakefile +75 -0
- data/lib/glue_envs/couchrest/couchrest_attachment_handler.rb +260 -0
- data/lib/glue_envs/couchrest/couchrest_files_mgr.rb +198 -0
- data/lib/glue_envs/couchrest_glue_env.rb +536 -0
- data/lib/glue_envs/files_mgr_base.rb +51 -0
- data/lib/glue_envs/filesystem/filesystem_files_mgr.rb +187 -0
- data/lib/glue_envs/filesystem_glue_env.rb +395 -0
- data/lib/glue_envs/mysql/mysql_files_mgr.rb +175 -0
- data/lib/glue_envs/mysql_glue_env.rb +428 -0
- data/lib/glue_envs/sdb_s3/sdb_s3_files_mgr.rb +314 -0
- data/lib/glue_envs/sdb_s3_glue_env.rb +248 -0
- data/lib/helpers/camel.rb +21 -0
- data/lib/helpers/filesystem_helpers.rb +27 -0
- data/lib/helpers/hash_helpers.rb +74 -0
- data/lib/helpers/log_helper.rb +34 -0
- data/lib/helpers/mime_types_new.rb +126 -0
- data/lib/helpers/old_more_open_struct.rb +28 -0
- data/lib/helpers/require_helper.rb +45 -0
- data/lib/helpers/tk_escape.rb +17 -0
- data/lib/midas/bufs_data_structure.rb +84 -0
- data/lib/midas/node_element_operations.rb +264 -0
- data/lib/tinkit.rb +38 -0
- data/lib/tinkit_base_node.rb +733 -0
- data/lib/tinkit_node_factory.rb +47 -0
- data/spec/couchrest_files_mgr_spec.rb +551 -0
- data/spec/couchrest_glue_spec.rb +246 -0
- data/spec/filesystem_files_mgr_spec.rb +236 -0
- data/spec/filesystem_glue_spec.rb +243 -0
- data/spec/filesystem_helpers_spec.rb +42 -0
- data/spec/helpers/bufs_node_builder.rb +17 -0
- data/spec/helpers/bufs_sample_dataset.rb +160 -0
- data/spec/helpers/bufs_test_environments.rb +81 -0
- data/spec/helpers/tmp_view_cleaner.rb +15 -0
- data/spec/lib_helpers/tk_escape_spec.rb +45 -0
- data/spec/mysql_files_mgr_spec.rb +250 -0
- data/spec/mysql_glue_spec.rb +214 -0
- data/spec/node_element_operations_spec.rb +392 -0
- data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec1.rb +82 -0
- data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec2.rb +68 -0
- data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec3.rb +80 -0
- data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec4.rb +110 -0
- data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec5.rb +84 -0
- data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec6.rb +83 -0
- data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec7.rb +101 -0
- data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec8.rb +92 -0
- data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec_all.rb +266 -0
- data/spec/sdb_s3_glue_spec.rb +230 -0
- data/spec/tinkit_node_factory_spec.rb +1108 -0
- metadata +114 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
#require helper for cleaner require statements
|
2
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '../../lib/helpers/require_helper')
|
3
|
+
require Tinkit.glue 'sdb_s3/sdb_s3_files_mgr'
|
4
|
+
|
5
|
+
include SdbS3Interface
|
6
|
+
GlueEnvMock = Struct.new(:user_datastore_location)
|
7
|
+
|
8
|
+
describe FilesMgr, "Setup and intialization" do
|
9
|
+
before(:all) do
|
10
|
+
|
11
|
+
@glue_env_mock = GlueEnvMock.new("attachment_spec__node_loc")
|
12
|
+
@node_key = :_id
|
13
|
+
|
14
|
+
file1_data = "Example File1\nJust some text"
|
15
|
+
file2_data = "Example File2\nJust some more text"
|
16
|
+
file1_fname = "/tmp/example_file1.txt"
|
17
|
+
file2_fname = "/tmp/example_file2.txt"
|
18
|
+
files = {file1_fname => file1_data, file2_fname => file2_data}
|
19
|
+
files.each do |fname, data|
|
20
|
+
File.open(fname, 'w'){|f| f.write(data)}
|
21
|
+
end
|
22
|
+
@file_datas = [{:src_filename => file1_fname}, {:src_filename => file2_fname}]
|
23
|
+
@node1_data = {:_id => 'spec_test1', :data => 'stuff1'}
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should initialize" do
|
27
|
+
node_key_value = @node1_data[@node_key]
|
28
|
+
attach_handler = FilesMgr.new(@glue_env_mock, node_key_value)
|
29
|
+
buck_prefix = FilesMgr::BucketNamespacePrefix
|
30
|
+
node_loc = @glue_env_mock.user_datastore_location
|
31
|
+
check_bucket_location = "#{buck_prefix}_#{node_loc}"
|
32
|
+
#the below will sometimes fail due to AWS
|
33
|
+
attach_handler.bucket_name.should == check_bucket_location
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe FilesMgr, "Basic Operations" do
|
38
|
+
before(:all) do
|
39
|
+
@file1_fname = "/tmp/example_file1.txt"
|
40
|
+
@file2_fname = "/tmp/example_file2.txt"
|
41
|
+
f1_bname = File.basename(@file1_fname)
|
42
|
+
f2_bname = File.basename(@file2_fname)
|
43
|
+
@file_stored_data = { f1_bname => File.open(@file1_fname, 'rb'){|f| f.read},
|
44
|
+
f2_bname =>File.open(@file2_fname, 'rb'){|f| f.read} }
|
45
|
+
@glue_env_mock = GlueEnvMock.new("attachment_spec__node_loc")
|
46
|
+
@node_key = :_id
|
47
|
+
@file_datas = [{:src_filename => @file1_fname}, {:src_filename => @file2_fname}]
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
before(:each) do
|
52
|
+
@node1_data = {:_id => 'spec_test1', :data => 'stuff1'}
|
53
|
+
node_key_value = @node1_data[@node_key]
|
54
|
+
@attach_handler = FilesMgr.new(@glue_env_mock, node_key_value)
|
55
|
+
@attach_handler.subtract_files(nil, :all)
|
56
|
+
end
|
57
|
+
|
58
|
+
after(:each) do
|
59
|
+
@attach_handler.destroy_file_container
|
60
|
+
end
|
61
|
+
|
62
|
+
it "8) should delete all (subtract_all) files" do
|
63
|
+
node = nil
|
64
|
+
@attach_handler.add(node, @file_datas)
|
65
|
+
|
66
|
+
#create some more attachments
|
67
|
+
del_data = {}
|
68
|
+
del_data["del_data1"] = "my life will be short"
|
69
|
+
del_data["del_data2"] = "alas too short"
|
70
|
+
|
71
|
+
#add the attachments
|
72
|
+
del_data.each do |name, data|
|
73
|
+
@attach_handler.add_raw_data(node, name, "text/plain", data, Time.now.to_s)
|
74
|
+
end
|
75
|
+
|
76
|
+
#verify it's there
|
77
|
+
del_data.each do |name, data|
|
78
|
+
stored_data = @attach_handler.get_raw_data(node, name)
|
79
|
+
stored_data.should == data
|
80
|
+
end
|
81
|
+
|
82
|
+
#delete it all
|
83
|
+
@attach_handler.subtract(node, :all)
|
84
|
+
|
85
|
+
#verify it's not there
|
86
|
+
|
87
|
+
del_data.each do |name, data|
|
88
|
+
stored_data = @attach_handler.get_raw_data(node, name)
|
89
|
+
stored_data.should be_nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,266 @@
|
|
1
|
+
#require helper for cleaner require statements
|
2
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '../../lib/helpers/require_helper')
|
3
|
+
require Tinkit.glue 'sdb_s3/sdb_s3_files_mgr'
|
4
|
+
|
5
|
+
include SdbS3Interface
|
6
|
+
GlueEnvMock = Struct.new(:user_datastore_location)
|
7
|
+
|
8
|
+
describe FilesMgr, "Setup and intialization" do
|
9
|
+
before(:all) do
|
10
|
+
|
11
|
+
@glue_env_mock = GlueEnvMock.new("attachment_spec__node_loc")
|
12
|
+
@node_key = :_id
|
13
|
+
|
14
|
+
file1_data = "Example File1\nJust some text"
|
15
|
+
file2_data = "Example File2\nJust some more text"
|
16
|
+
file1_fname = "/tmp/example_file1.txt"
|
17
|
+
file2_fname = "/tmp/example_file2.txt"
|
18
|
+
files = {file1_fname => file1_data, file2_fname => file2_data}
|
19
|
+
files.each do |fname, data|
|
20
|
+
File.open(fname, 'w'){|f| f.write(data)}
|
21
|
+
end
|
22
|
+
@file_datas = [{:src_filename => file1_fname}, {:src_filename => file2_fname}]
|
23
|
+
@node1_data = {:_id => 'spec_test1', :data => 'stuff1'}
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should initialize" do
|
27
|
+
node_key_value = @node1_data[@node_key]
|
28
|
+
attach_handler = FilesMgr.new(@glue_env_mock, node_key_value)
|
29
|
+
buck_prefix = FilesMgr::BucketNamespacePrefix
|
30
|
+
node_loc = @glue_env_mock.user_datastore_location
|
31
|
+
check_bucket_location = "#{buck_prefix}_#{node_loc}"
|
32
|
+
#the below will sometimes fail due to AWS
|
33
|
+
attach_handler.bucket_name.should == check_bucket_location
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe FilesMgr, "Basic Operations" do
|
38
|
+
before(:all) do
|
39
|
+
@file1_fname = "/tmp/example_file1.txt"
|
40
|
+
@file2_fname = "/tmp/example_file2.txt"
|
41
|
+
f1_bname = File.basename(@file1_fname)
|
42
|
+
f2_bname = File.basename(@file2_fname)
|
43
|
+
@file_stored_data = { f1_bname => File.open(@file1_fname, 'rb'){|f| f.read},
|
44
|
+
f2_bname =>File.open(@file2_fname, 'rb'){|f| f.read} }
|
45
|
+
@glue_env_mock = GlueEnvMock.new("attachment_spec__node_loc")
|
46
|
+
@node_key = :_id
|
47
|
+
@file_datas = [{:src_filename => @file1_fname}, {:src_filename => @file2_fname}]
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
before(:each) do
|
52
|
+
@node1_data = {:_id => 'spec_test1', :data => 'stuff1'}
|
53
|
+
node_key_value = @node1_data[@node_key]
|
54
|
+
@attach_handler = FilesMgr.new(@glue_env_mock, node_key_value)
|
55
|
+
@attach_handler.subtract_files(nil, :all)
|
56
|
+
end
|
57
|
+
|
58
|
+
after(:each) do
|
59
|
+
@attach_handler.destroy_file_container
|
60
|
+
end
|
61
|
+
|
62
|
+
it "1) should add and retrieve files" do
|
63
|
+
node = nil
|
64
|
+
#@attach_handler.subtract_files(:all)
|
65
|
+
#Test that buckets/files don't exist on AWS
|
66
|
+
@file_datas.each do |file_data|
|
67
|
+
file_basename = File.basename(file_data[:src_filename])
|
68
|
+
data = @attach_handler.get_raw_data(node, file_basename)
|
69
|
+
data.should be_nil
|
70
|
+
end
|
71
|
+
|
72
|
+
#Add the Files
|
73
|
+
@attach_handler.add(node, @file_datas)
|
74
|
+
|
75
|
+
#Get the files and verify data
|
76
|
+
@file_datas.each do |file_data|
|
77
|
+
file_basename = File.basename(file_data[:src_filename])
|
78
|
+
data = @attach_handler.get_raw_data(node, file_basename)
|
79
|
+
data.should == @file_stored_data[file_basename]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it "2) should list attachment files" do
|
84
|
+
node = nil
|
85
|
+
@attach_handler.add(node, @file_datas)
|
86
|
+
files = @attach_handler.list(node)
|
87
|
+
files.sort.should == @file_stored_data.keys.sort
|
88
|
+
end
|
89
|
+
|
90
|
+
it "3) should list metadata" do
|
91
|
+
node = nil
|
92
|
+
@attach_handler.add(node, @file_datas)
|
93
|
+
md = @attach_handler.get_attachments_metadata(nil)
|
94
|
+
md.should_not == nil
|
95
|
+
@file_datas.each do |file_data|
|
96
|
+
file_basename = File.basename(file_data[:src_filename])
|
97
|
+
each_md = md[file_basename]
|
98
|
+
each_md.should_not == nil
|
99
|
+
each_md.keys.should include :content_type
|
100
|
+
each_md.keys.should include :file_modified
|
101
|
+
|
102
|
+
file_basename = File.basename(file_data[:src_filename])
|
103
|
+
md[file_basename][:content_type].should =~ /^text\/plain/
|
104
|
+
time_str = md[file_basename][:file_modified]
|
105
|
+
Time.parse(time_str).should > Time.now - 1 #should have been modified less than a second ago
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it "4) should be well behaved adding more files" do
|
110
|
+
node = nil
|
111
|
+
@attach_handler.add(node, @file_datas)
|
112
|
+
|
113
|
+
|
114
|
+
#Get the original files and verify data
|
115
|
+
@file_datas.each do |file_data|
|
116
|
+
file_basename = File.basename(file_data[:src_filename])
|
117
|
+
data = @attach_handler.get_raw_data(node, file_basename)
|
118
|
+
data.should == @file_stored_data[file_basename]
|
119
|
+
end
|
120
|
+
|
121
|
+
#create some more files
|
122
|
+
file1_data = "Example File1\nNEW!! text"
|
123
|
+
file3_data = "Example File3\nYet more text"
|
124
|
+
file4_data = "Example File4\nand more text"
|
125
|
+
file3_fname = "/tmp/example_file3.txt"
|
126
|
+
file4_fname = "/tmp/example_file4.txt"
|
127
|
+
files = {@file1_fname => file1_data, file3_fname => file3_data, file4_fname => file4_data}
|
128
|
+
files.each do |fname, data|
|
129
|
+
File.open(fname, 'w'){|f| f.write(data)}
|
130
|
+
end
|
131
|
+
file1_data.should == File.open(@file1_fname){|f| f.read}
|
132
|
+
@file_datas2 = [{:src_filename => @file1_fname},
|
133
|
+
{:src_filename => file3_fname},
|
134
|
+
{:src_filename => file4_fname}]
|
135
|
+
|
136
|
+
#add them
|
137
|
+
@attach_handler.add(node, @file_datas2)
|
138
|
+
|
139
|
+
#Check the unchanged file (file2)
|
140
|
+
file2_basename = File.basename(@file2_fname)
|
141
|
+
data2 = @attach_handler.get_raw_data(node, file2_basename)
|
142
|
+
data2.should == @file_stored_data[file2_basename]
|
143
|
+
|
144
|
+
#Get the changed files and verify it is the new data
|
145
|
+
file1_basename = File.basename(@file1_fname)
|
146
|
+
data1 = @attach_handler.get_raw_data(node, file1_basename)
|
147
|
+
data1.should == file1_data
|
148
|
+
|
149
|
+
file3_basename = File.basename(file3_fname)
|
150
|
+
data3 = @attach_handler.get_raw_data(node, file3_basename)
|
151
|
+
data3.should == file3_data
|
152
|
+
|
153
|
+
file4_basename = File.basename(file4_fname)
|
154
|
+
data4 = @attach_handler.get_raw_data(node, file4_basename)
|
155
|
+
data4.should == file4_data
|
156
|
+
end
|
157
|
+
|
158
|
+
it "5) should delete (subtract) files" do
|
159
|
+
node = nil
|
160
|
+
@attach_handler.add(node, @file_datas)
|
161
|
+
|
162
|
+
files_to_delete = [@file1_fname, @file2_fname]
|
163
|
+
|
164
|
+
#they should exist in the node
|
165
|
+
files_to_delete.each do |fname|
|
166
|
+
file_basename = File.basename(fname)
|
167
|
+
data = @attach_handler.get_raw_data(node, file_basename)
|
168
|
+
data.should match /^Example File/
|
169
|
+
end
|
170
|
+
|
171
|
+
basenames_to_delete = files_to_delete.map{|f| File.basename(f)}
|
172
|
+
@attach_handler.subtract(node, basenames_to_delete)
|
173
|
+
|
174
|
+
files_to_delete.each do |fname|
|
175
|
+
file_basename = File.basename(fname)
|
176
|
+
data = @attach_handler.get_raw_data(node, file_basename)
|
177
|
+
data.should be_nil
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
it "6) should delete (subtract) files" do
|
182
|
+
node = nil
|
183
|
+
@attach_handler.add(node, @file_datas)
|
184
|
+
|
185
|
+
files_to_delete = [@file1_fname, @file2_fname]
|
186
|
+
#they should exist in the node
|
187
|
+
files_to_delete.each do |fname|
|
188
|
+
file_basename = File.basename(fname)
|
189
|
+
data = @attach_handler.get_raw_data(node, file_basename)
|
190
|
+
data.should match /^Example File/
|
191
|
+
end
|
192
|
+
|
193
|
+
basenames_to_delete = files_to_delete.map{|f| File.basename(f)}
|
194
|
+
@attach_handler.subtract(node, basenames_to_delete)
|
195
|
+
|
196
|
+
files_to_delete.each do |fname|
|
197
|
+
file_basename = File.basename(fname)
|
198
|
+
data = @attach_handler.get_raw_data(node, file_basename)
|
199
|
+
data.should be_nil
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
it "7) should add attachments from the raw data" do
|
204
|
+
node = nil
|
205
|
+
@attach_handler.add(node, @file_datas)
|
206
|
+
|
207
|
+
raw_data = "Example File3\nYet more text"
|
208
|
+
content_type = "text/plain"
|
209
|
+
modified_at = Time.now.to_s
|
210
|
+
att_name = "example_raw_data.txt"
|
211
|
+
|
212
|
+
#Add the Raw Data
|
213
|
+
@attach_handler.add_raw_data(node, att_name, content_type, raw_data, modified_at)
|
214
|
+
|
215
|
+
#Get the files and verify data
|
216
|
+
|
217
|
+
data = @attach_handler.get_raw_data(node, att_name)
|
218
|
+
all_metadata = @attach_handler.get_attachments_metadata(node)
|
219
|
+
all_metadata.should_not be_nil
|
220
|
+
|
221
|
+
attachment_metadata = all_metadata[att_name]
|
222
|
+
|
223
|
+
data.should == raw_data
|
224
|
+
|
225
|
+
#THESE TESTS FAIL
|
226
|
+
#TODO: There is a metadata issue here, but not in general
|
227
|
+
#something strange about metadata being requested like this
|
228
|
+
#it might have to do with the retries?
|
229
|
+
#attachment_metadata.should_not be_nil
|
230
|
+
#att_md = attachment_metadata
|
231
|
+
#att_md[:content_type].should == content_type
|
232
|
+
#att_md[:file_modified].should == modified_at
|
233
|
+
end
|
234
|
+
|
235
|
+
it "8) should delete all (subtract_all) files" do
|
236
|
+
node = nil
|
237
|
+
@attach_handler.add(node, @file_datas)
|
238
|
+
|
239
|
+
#create some more attachments
|
240
|
+
del_data = {}
|
241
|
+
del_data["del_data1"] = "my life will be short"
|
242
|
+
del_data["del_data2"] = "alas too short"
|
243
|
+
|
244
|
+
#add the attachments
|
245
|
+
del_data.each do |name, data|
|
246
|
+
@attach_handler.add_raw_data(node, name, "text/plain", data, Time.now.to_s)
|
247
|
+
end
|
248
|
+
|
249
|
+
#verify it's there
|
250
|
+
del_data.each do |name, data|
|
251
|
+
stored_data = @attach_handler.get_raw_data(node, name)
|
252
|
+
stored_data.should == data
|
253
|
+
end
|
254
|
+
|
255
|
+
#delete it all
|
256
|
+
@attach_handler.subtract(node, :all)
|
257
|
+
|
258
|
+
#verify it's not there
|
259
|
+
|
260
|
+
del_data.each do |name, data|
|
261
|
+
stored_data = @attach_handler.get_raw_data(node, name)
|
262
|
+
stored_data.should be_nil
|
263
|
+
end
|
264
|
+
end
|
265
|
+
#it "should add delete then re-add an object"
|
266
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
#require helper for cleaner require statements
|
2
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '../lib/helpers/require_helper')
|
3
|
+
|
4
|
+
require Tinkit.glue 'sdb_s3_glue_env'
|
5
|
+
|
6
|
+
describe SdbS3Env::GlueEnv, "Initialization" do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
env = {:host => nil, :path => 'test_domain', :user_id => 'init_test_user'}
|
10
|
+
@persist_env = {:name => 'sdb_s3_glue_test', :env => env}
|
11
|
+
key_fields = {:required_keys => [:id],
|
12
|
+
:primary_key => :id }
|
13
|
+
@data_model_bindings = {:key_fields => key_fields, :views => nil}
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should initialize properly" do
|
17
|
+
sdb_glue_obj = SdbS3Env::GlueEnv.new(@persist_env, @data_model_bindings)
|
18
|
+
sdb_glue_obj.user_id.should == @persist_env[:env][:user_id]
|
19
|
+
sdb_glue_obj.required_instance_keys.should == @data_model_bindings[:key_fields][:required_keys]
|
20
|
+
sdb_glue_obj.required_save_keys.should == @data_model_bindings[:key_fields][:required_keys]
|
21
|
+
sdb_glue_obj.node_key.should == @data_model_bindings[:key_fields][:primary_key]
|
22
|
+
sdb_glue_obj.metadata_keys.should == [sdb_glue_obj.version_key,
|
23
|
+
sdb_glue_obj.namespace_key]
|
24
|
+
path = @persist_env[:env][:path]
|
25
|
+
sdb_glue_obj.user_datastore_location.should == "#{path}__#{sdb_glue_obj.user_id}"
|
26
|
+
sdb_glue_obj._files_mgr_class.class.should_not == nil #temp test
|
27
|
+
sdb_glue_obj.views.should_not == nil #temp test
|
28
|
+
sdb_glue_obj.moab_data.should_not == nil #temp test
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
describe SdbS3Env::GlueEnv, "Persistent Layer Basic Operations" do
|
34
|
+
|
35
|
+
before(:each) do
|
36
|
+
env = {:host => nil, :path => 'test_domain', :user_id => 'init_test_user'}
|
37
|
+
@persist_env = {:env => env}
|
38
|
+
key_fields = {:required_keys => [:id],
|
39
|
+
:primary_key => :id }
|
40
|
+
@data_model_bindings = {:key_fields => key_fields, :views => nil}
|
41
|
+
@sdb_glue_obj = SdbS3Env::GlueEnv.new(@persist_env, @data_model_bindings)
|
42
|
+
end
|
43
|
+
|
44
|
+
after(:each) do
|
45
|
+
domain = @sdb_glue_obj.model_save_params[:domain]
|
46
|
+
sdb = @sdb_glue_obj.model_save_params[:sdb]
|
47
|
+
sdb.delete_domain(domain)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should persist data and be able to retrieve it" do
|
51
|
+
#:id was defined as the primary key
|
52
|
+
data1 = {:id => "test_id1", :data => "test data"}
|
53
|
+
empty_data = @sdb_glue_obj.get(data1[:id]) #hasn't been saved yet
|
54
|
+
empty_data.should == nil
|
55
|
+
@sdb_glue_obj.save(data1)
|
56
|
+
#Don't use native get_attributes, use obj's get, it will block until save is finished
|
57
|
+
persisted_data = @sdb_glue_obj.get(data1[:id])
|
58
|
+
persisted_data.should_not == nil
|
59
|
+
persisted_data[:id].should == data1[:id]
|
60
|
+
persisted_data[:data].should == data1[:data]
|
61
|
+
end
|
62
|
+
|
63
|
+
#it "should be able to delete data" do
|
64
|
+
# data1 = {:id => "test_id1", :data => "test data1"}
|
65
|
+
# data2 = {:id => "test_id2", :data => "test data2"}
|
66
|
+
# @sdb_glue_obj.save(data1)
|
67
|
+
# @sdb_glue_obj.save(data2)
|
68
|
+
#
|
69
|
+
#
|
70
|
+
#end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe SdbS3Env::GlueEnv, "Persistent Layer Collection Operations" do
|
74
|
+
|
75
|
+
before(:each) do
|
76
|
+
env = {:host => nil, :path => 'test_domain', :user_id => 'init_test_user'}
|
77
|
+
@persist_env = {:env => env}
|
78
|
+
key_fields = {:required_keys => [:id],
|
79
|
+
:primary_key => :id }
|
80
|
+
@data_model_bindings = {:key_fields => key_fields, :views => nil}
|
81
|
+
@sdb_glue_obj = SdbS3Env::GlueEnv.new(@persist_env, @data_model_bindings)
|
82
|
+
end
|
83
|
+
|
84
|
+
after(:each) do
|
85
|
+
domain = @sdb_glue_obj.model_save_params[:domain]
|
86
|
+
sdb = @sdb_glue_obj.model_save_params[:sdb]
|
87
|
+
sdb.delete_domain(domain)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should be able to query all" do
|
91
|
+
data1 = {:id => "test_id1", :data => "test data1"}
|
92
|
+
data2 = {:id => "test_id2", :data => "test data2"}
|
93
|
+
@sdb_glue_obj.save(data1)
|
94
|
+
@sdb_glue_obj.save(data2)
|
95
|
+
|
96
|
+
results = @sdb_glue_obj.query_all
|
97
|
+
results.each do |raw_data|
|
98
|
+
case raw_data[:id]
|
99
|
+
when "test_id1"
|
100
|
+
raw_data[:data].should == "test data1"
|
101
|
+
when "test_id2"
|
102
|
+
raw_data[:data].should == "test data2"
|
103
|
+
else
|
104
|
+
raise "Unknown dataset"
|
105
|
+
end#case
|
106
|
+
end#each
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should be able to find matching data" do
|
110
|
+
data1 = {:id => "test_id1", :data => "test data1", :tags => ['a', 'b', 'c']}
|
111
|
+
data2 = {:id => "test_id2", :data => "test data2", :tags => ['c', 'd', 'e']}
|
112
|
+
data3 = {:id => "test_id3", :data => "test data2", :tags => ['c', 'b', 'z']}
|
113
|
+
data_list = [data1, data2, data3]
|
114
|
+
data_list.each {|data| @sdb_glue_obj.save(data)}
|
115
|
+
|
116
|
+
result1 = @sdb_glue_obj.find_nodes_where(:id, :equals, "test_id1")
|
117
|
+
result1.size.should == 1
|
118
|
+
result1.first[:id].should == "test_id1"
|
119
|
+
|
120
|
+
result2 = @sdb_glue_obj.find_nodes_where(:id, :equals, "oops")
|
121
|
+
result2.should be_empty
|
122
|
+
|
123
|
+
result3 = @sdb_glue_obj.find_nodes_where(:data, :equals, "test data2")
|
124
|
+
result3.size.should == 2
|
125
|
+
["test_id2", "test_id3"].should include result3.first[:id]
|
126
|
+
["test_id2", "test_id3"].should include result3.last[:id]
|
127
|
+
|
128
|
+
result4 = @sdb_glue_obj.find_nodes_where(:tags, :equals, ['c', 'd', 'e'])
|
129
|
+
result4.size.should == 1
|
130
|
+
result4.first[:id].should == "test_id2"
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should be able to find containting data" do
|
134
|
+
data1 = {:id => "test_id1", :data => "test data1", :tags => ['a', 'b', 'c']}
|
135
|
+
data2 = {:id => "test_id2", :data => "test data2", :tags => ['c', 'd', 'e']}
|
136
|
+
data3 = {:id => "test_id3", :data => "test data2", :tags => ['c', 'b', 'z']}
|
137
|
+
data_list = [data1, data2, data3]
|
138
|
+
data_list.each {|data| @sdb_glue_obj.save(data)}
|
139
|
+
|
140
|
+
result1 = @sdb_glue_obj.find_nodes_where(:id, :contains, "test_id2")
|
141
|
+
result1.size.should == 1
|
142
|
+
result1.first[:id].should == "test_id2"
|
143
|
+
|
144
|
+
result2 = @sdb_glue_obj.find_nodes_where(:tags, :contains, "c")
|
145
|
+
result2.size.should == 3
|
146
|
+
|
147
|
+
result3 = @sdb_glue_obj.find_nodes_where(:tags, :contains, "b")
|
148
|
+
result3.size.should == 2
|
149
|
+
["test_id1", "test_id3"].should include result3.first[:id]
|
150
|
+
["test_id1", "test_id3"].should include result3.last[:id]
|
151
|
+
|
152
|
+
result4 = @sdb_glue_obj.find_nodes_where(:tags, :contains, "oops")
|
153
|
+
result4.should be_empty
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should be able to delete node data" do
|
157
|
+
data1 = {:id => "test_id1", :data => "keep me"}
|
158
|
+
data2 = {:id => "test_id2", :data => "delete me"}
|
159
|
+
@sdb_glue_obj.save(data1)
|
160
|
+
@sdb_glue_obj.save(data2)
|
161
|
+
|
162
|
+
results = @sdb_glue_obj.query_all
|
163
|
+
results.each do |raw_data|
|
164
|
+
case raw_data[:id]
|
165
|
+
when "test_id1"
|
166
|
+
raw_data[:data].should == "keep me"
|
167
|
+
when "test_id2"
|
168
|
+
raw_data[:data].should == "delete me"
|
169
|
+
else
|
170
|
+
raise "Unknown dataset"
|
171
|
+
end#case
|
172
|
+
end#each
|
173
|
+
|
174
|
+
model_metadata = {:id => "test_id2"}
|
175
|
+
@sdb_glue_obj.destroy_node(model_metadata)
|
176
|
+
|
177
|
+
results = @sdb_glue_obj.query_all
|
178
|
+
results.each do |raw_data|
|
179
|
+
case raw_data[:id]
|
180
|
+
when "test_id1"
|
181
|
+
raw_data[:data].should == "keep me"
|
182
|
+
when "test_id2"
|
183
|
+
raise "Oops should have been deleted"
|
184
|
+
else
|
185
|
+
raise "Unknown dataset"
|
186
|
+
end#case
|
187
|
+
end#each
|
188
|
+
end
|
189
|
+
|
190
|
+
it "should be able to delete in bulk" do
|
191
|
+
data1 = {:id => "test_id1", :data => "delete me"}
|
192
|
+
data2 = {:id => "test_id2", :data => "keep me"}
|
193
|
+
data3 = {:id => "test_id3", :data => "delete me too"}
|
194
|
+
@sdb_glue_obj.save(data1)
|
195
|
+
@sdb_glue_obj.save(data2)
|
196
|
+
@sdb_glue_obj.save(data3)
|
197
|
+
|
198
|
+
results = @sdb_glue_obj.query_all
|
199
|
+
results.each do |raw_data|
|
200
|
+
case raw_data[:id]
|
201
|
+
when "test_id1"
|
202
|
+
raw_data[:data].should == "delete me"
|
203
|
+
when "test_id2"
|
204
|
+
raw_data[:data].should == "keep me"
|
205
|
+
when "test_id3"
|
206
|
+
raw_data[:data].should == "delete me too"
|
207
|
+
else
|
208
|
+
raise "Unknown dataset"
|
209
|
+
end#case
|
210
|
+
end#each
|
211
|
+
|
212
|
+
raw_rcds_to_delete = [data1, data3]
|
213
|
+
@sdb_glue_obj.destroy_bulk(raw_rcds_to_delete)
|
214
|
+
|
215
|
+
results = @sdb_glue_obj.query_all
|
216
|
+
results.each do |raw_data|
|
217
|
+
case raw_data[:id]
|
218
|
+
when "test_id1"
|
219
|
+
raise "Oops should have been deleted"
|
220
|
+
when "test_id2"
|
221
|
+
raw_data[:data].should == "keep me"
|
222
|
+
when "test_id3"
|
223
|
+
raise "Oops should have been deleted"
|
224
|
+
else
|
225
|
+
raise "Unknown dataset"
|
226
|
+
end#case
|
227
|
+
end#each
|
228
|
+
end#it
|
229
|
+
end
|
230
|
+
|