baza 0.0.13 → 0.0.14
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.
- checksums.yaml +7 -0
- data/Gemfile +7 -4
- data/Gemfile.lock +84 -48
- data/README.md +186 -0
- data/VERSION +1 -1
- data/baza.gemspec +37 -22
- data/include/db.rb +153 -166
- data/include/dbtime.rb +2 -2
- data/include/driver.rb +9 -0
- data/include/drivers/active_record/active_record.rb +64 -27
- data/include/drivers/mysql/mysql_columns.rb +33 -33
- data/include/drivers/mysql/mysql_indexes.rb +26 -17
- data/include/drivers/mysql/mysql_tables.rb +140 -132
- data/include/drivers/sqlite3/sqlite3_indexes.rb +37 -9
- data/include/drivers/sqlite3/sqlite3_tables.rb +181 -152
- data/include/query_buffer.rb +22 -22
- data/include/revision.rb +70 -70
- data/lib/baza.rb +3 -1
- data/shippable.yml +11 -0
- data/spec/include/drivers/active_record_spec.rb +8 -0
- data/spec/include/drivers/mysql_spec.rb +47 -0
- data/spec/include/drivers/sqlite3_spec.rb +60 -0
- data/spec/info_active_record.rb +37 -0
- data/spec/info_active_record_example.rb +37 -0
- data/spec/info_active_record_shippable.rb +36 -0
- data/spec/info_mysql_example.rb +24 -6
- data/spec/info_mysql_shippable.rb +23 -0
- data/spec/info_sqlite3.rb +23 -15
- data/spec/model_handler_spec.rb +84 -84
- data/spec/spec_helper.rb +6 -6
- data/spec/support/driver_collection.rb +288 -0
- data/spec/support/driver_columns_collection.rb +49 -0
- data/spec/support/driver_indexes_collection.rb +49 -0
- data/spec/support/driver_tables_collection.rb +73 -0
- metadata +100 -102
- data/README.rdoc +0 -136
- data/spec/baza_spec.rb +0 -410
- data/spec/db_spec_encoding_test_file.txt +0 -1
data/spec/model_handler_spec.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require
|
2
|
-
require "tmpdir"
|
1
|
+
require "spec_helper"
|
3
2
|
|
4
3
|
describe "Objects" do
|
5
4
|
it "should be able to cache rows" do
|
@@ -8,13 +7,14 @@ describe "Objects" do
|
|
8
7
|
rescue LoadError
|
9
8
|
require "array_enumerator"
|
10
9
|
end
|
11
|
-
|
10
|
+
|
12
11
|
require "sqlite3" if RUBY_ENGINE != "jruby"
|
13
|
-
|
12
|
+
require "tmpdir"
|
13
|
+
|
14
14
|
$db_path = "#{Dir.tmpdir}/knjrbfw_objects_cache_test.sqlite3"
|
15
15
|
File.unlink($db_path) if File.exists?($db_path)
|
16
16
|
$db = Baza::Db.new(:type => :sqlite3, :path => $db_path, :return_keys => "symbols", :debug => false)
|
17
|
-
|
17
|
+
|
18
18
|
schema = {
|
19
19
|
:tables => {
|
20
20
|
"Group" => {
|
@@ -32,9 +32,9 @@ describe "Objects" do
|
|
32
32
|
}
|
33
33
|
}
|
34
34
|
Baza::Revision.new.init_db(:schema => schema, :db => $db)
|
35
|
-
|
35
|
+
|
36
36
|
class User < Baza::Model; end
|
37
|
-
|
37
|
+
|
38
38
|
$ob = Baza::ModelHandler.new(
|
39
39
|
:db => $db,
|
40
40
|
:datarow => true,
|
@@ -46,7 +46,7 @@ describe "Objects" do
|
|
46
46
|
}
|
47
47
|
}
|
48
48
|
)
|
49
|
-
|
49
|
+
|
50
50
|
$ob.adds(:User, [
|
51
51
|
{:username => "User 1"},
|
52
52
|
{:username => "User 2"},
|
@@ -54,32 +54,32 @@ describe "Objects" do
|
|
54
54
|
{:username => "User 4"},
|
55
55
|
{:username => "User 5"}
|
56
56
|
])
|
57
|
-
|
57
|
+
|
58
58
|
raise "Expected user-ID-cache to be 5 but it wasnt: #{$ob.ids_cache[:User].length}" if $ob.ids_cache[:User].length != 5
|
59
|
-
|
59
|
+
|
60
60
|
user = $ob.get(:User, 4)
|
61
61
|
raise "No user returned." if !user
|
62
62
|
$ob.delete(user)
|
63
63
|
raise "Expected user-ID-cache to be 4 but it wasnt: #{$ob.ids_cache[:User].length} #{$ob.ids_cache}" if $ob.ids_cache[:User].length != 4
|
64
|
-
|
64
|
+
|
65
65
|
$ob.deletes([$ob.get(:User, 1), $ob.get(:User, 2)])
|
66
66
|
raise "Expected user-ID-cache to be 2 but it wasnt: #{$ob.ids_cache[:User].length} #{$ob.ids_cache}" if $ob.ids_cache[:User].length != 2
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
it "should be able to do 'select_col_as_array'" do
|
70
70
|
res = $ob.list(:User, {"select_col_as_array" => "id"}).to_a
|
71
71
|
raise "Expected length of 2 but got: #{res.length}" if res.length != 2
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
it "should work even though stressed by threads (thread-safe)." do
|
75
75
|
userd = []
|
76
76
|
10.upto(25) do |i|
|
77
77
|
userd << {:username => "User #{i}"}
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
$ob.adds(:User, userd)
|
81
81
|
users = $ob.list(:User).to_a
|
82
|
-
|
82
|
+
|
83
83
|
#Stress it to test threadsafety...
|
84
84
|
threads = []
|
85
85
|
0.upto(5) do |tc|
|
@@ -88,39 +88,39 @@ describe "Objects" do
|
|
88
88
|
user = $ob.add(:User, {:username => "User #{tc}-#{ic}"})
|
89
89
|
raise "No user returned." if !user
|
90
90
|
$ob.delete(user)
|
91
|
-
|
91
|
+
|
92
92
|
user1 = $ob.add(:User, {:username => "User #{tc}-#{ic}-1"})
|
93
93
|
user2 = $ob.add(:User, {:username => "User #{tc}-#{ic}-2"})
|
94
94
|
user3 = $ob.add(:User, {:username => "User #{tc}-#{ic}-3"})
|
95
|
-
|
95
|
+
|
96
96
|
raise "Missing user?" if !user1 or !user2 or !user3 or user1.deleted? or user2.deleted? or user3.deleted?
|
97
97
|
$ob.deletes([user1, user2, user3])
|
98
|
-
|
98
|
+
|
99
99
|
count = 0
|
100
100
|
users.each do |user|
|
101
101
|
count += 1
|
102
102
|
user[:username] = "#{user[:username]}." if !user.deleted?
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
raise "Expected at least 15 users but got #{count}." if count != 18
|
106
106
|
end
|
107
107
|
end
|
108
108
|
end
|
109
|
-
|
109
|
+
|
110
110
|
threads.each do |thread|
|
111
111
|
thread.join
|
112
112
|
end
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
it "should be able to skip queries when adding" do
|
116
116
|
class Group < Baza::Model; end
|
117
|
-
|
117
|
+
|
118
118
|
$ob2 = Baza::ModelHandler.new(
|
119
119
|
:db => $db,
|
120
120
|
:datarow => true,
|
121
121
|
:require => false
|
122
122
|
)
|
123
|
-
|
123
|
+
|
124
124
|
threads = []
|
125
125
|
0.upto(5) do
|
126
126
|
threads << Knj::Thread.new do
|
@@ -130,16 +130,16 @@ describe "Objects" do
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
threads.each do |thread|
|
135
135
|
thread.join
|
136
136
|
end
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
it "should delete the temporary database." do
|
140
140
|
File.unlink($db_path) if File.exists?($db_path)
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
#Moved from "knjrbfw_spec.rb"
|
144
144
|
it "should be able to generate a sample SQLite database and add a sample table, with sample columns and with a sample index to it" do
|
145
145
|
$db_path = "#{Knj::Os.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
|
@@ -148,7 +148,7 @@ describe "Objects" do
|
|
148
148
|
:path => $db_path,
|
149
149
|
:index_append_table_name => true
|
150
150
|
)
|
151
|
-
|
151
|
+
|
152
152
|
$db.tables.create("Project", {
|
153
153
|
:columns => [
|
154
154
|
{:name => :id, :type => :int, :autoincr => true, :primarykey => true},
|
@@ -159,7 +159,7 @@ describe "Objects" do
|
|
159
159
|
{:name => :category_id, :columns => [:category_id]}
|
160
160
|
]
|
161
161
|
})
|
162
|
-
|
162
|
+
|
163
163
|
$db.tables.create("Task", {
|
164
164
|
:columns => [
|
165
165
|
{:name => :id, :type => :int, :autoincr => true, :primarykey => true},
|
@@ -171,14 +171,14 @@ describe "Objects" do
|
|
171
171
|
{:name => :project_id, :columns => [:project_id]}
|
172
172
|
]
|
173
173
|
})
|
174
|
-
|
174
|
+
|
175
175
|
$db.tables.create("Person", {
|
176
176
|
:columns => [
|
177
177
|
{:name => :id, :type => :int, :autoincr => true, :primarykey => true},
|
178
178
|
{:name => :name, :type => :varchar}
|
179
179
|
]
|
180
180
|
})
|
181
|
-
|
181
|
+
|
182
182
|
$db.tables.create("Timelog", {
|
183
183
|
:columns => [
|
184
184
|
{:name => :id, :type => :int, :autoincr => true, :primarykey => true},
|
@@ -188,60 +188,60 @@ describe "Objects" do
|
|
188
188
|
:person_id
|
189
189
|
]
|
190
190
|
})
|
191
|
-
|
191
|
+
|
192
192
|
table = $db.tables[:Project]
|
193
|
-
|
193
|
+
|
194
194
|
indexes = table.indexes
|
195
195
|
raise "Could not find the sample-index 'category_id' that should have been created." if !indexes[:Project__category_id]
|
196
|
-
|
197
|
-
|
196
|
+
|
197
|
+
|
198
198
|
#If we insert a row the ID should increase and the name should be the same as inserted (or something is very very wrong)...
|
199
199
|
$db.insert("Project", {
|
200
200
|
"name" => "Test project"
|
201
201
|
})
|
202
|
-
|
202
|
+
|
203
203
|
count = 0
|
204
204
|
$db.q("SELECT * FROM Project") do |d|
|
205
205
|
raise "Somehow name was not 'Test project'" if d[:name] != "Test project"
|
206
206
|
raise "ID was not set?" if d[:id].to_i <= 0
|
207
207
|
count += 1
|
208
208
|
end
|
209
|
-
|
209
|
+
|
210
210
|
raise "Expected count of 1 but it wasnt: #{count}" if count != 1
|
211
211
|
end
|
212
|
-
|
212
|
+
|
213
213
|
it "should be able to automatic generate methods on datarow-classes (has_many, has_one)." do
|
214
214
|
class Project < Baza::Model
|
215
215
|
has_many [
|
216
216
|
{:class => :Task, :col => :project_id, :depends => true}
|
217
217
|
]
|
218
218
|
end
|
219
|
-
|
219
|
+
|
220
220
|
class Task < Baza::Model
|
221
221
|
has_one [
|
222
222
|
{:class => :Person, :required => true},
|
223
223
|
:Project
|
224
224
|
]
|
225
225
|
end
|
226
|
-
|
226
|
+
|
227
227
|
class Person < Baza::Model
|
228
228
|
has_one [:Project]
|
229
|
-
|
229
|
+
|
230
230
|
has_many [
|
231
231
|
{:class => :Timelog, :autozero => true}
|
232
232
|
]
|
233
|
-
|
233
|
+
|
234
234
|
def html
|
235
235
|
return self[:name]
|
236
236
|
end
|
237
237
|
end
|
238
|
-
|
238
|
+
|
239
239
|
class Timelog < Baza::Model
|
240
|
-
|
240
|
+
|
241
241
|
end
|
242
|
-
|
242
|
+
|
243
243
|
$ob = Baza::ModelHandler.new(:db => $db, :datarow => true, :require => false)
|
244
|
-
|
244
|
+
|
245
245
|
$ob.add(:Person, {
|
246
246
|
:name => "Kasper"
|
247
247
|
})
|
@@ -250,58 +250,58 @@ describe "Objects" do
|
|
250
250
|
:person_id => 1,
|
251
251
|
:project_id => 1
|
252
252
|
})
|
253
|
-
|
253
|
+
|
254
254
|
begin
|
255
255
|
$obb.add(:Task, {:name => "Test task"})
|
256
256
|
raise "Method should fail but didnt."
|
257
257
|
rescue
|
258
258
|
#ignore.
|
259
259
|
end
|
260
|
-
|
261
|
-
|
260
|
+
|
261
|
+
|
262
262
|
#Test 'list_invalid_required'.
|
263
263
|
$db.insert(:Task, :name => "Invalid require")
|
264
264
|
id = $db.last_id
|
265
265
|
found = false
|
266
|
-
|
266
|
+
|
267
267
|
$ob.list_invalid_required(:class => :Task) do |d|
|
268
268
|
raise "Expected object ID to be #{id} but it wasnt: #{d[:obj].id}" if d[:obj].id.to_i != id.to_i
|
269
269
|
$ob.delete(d[:obj])
|
270
270
|
found = true
|
271
271
|
end
|
272
|
-
|
272
|
+
|
273
273
|
raise "Expected to find a task but didnt." if !found
|
274
|
-
|
275
|
-
|
274
|
+
|
275
|
+
|
276
276
|
ret_proc = []
|
277
277
|
$ob.list(:Task) do |task|
|
278
278
|
ret_proc << task
|
279
279
|
end
|
280
|
-
|
280
|
+
|
281
281
|
raise "list with proc should return one task but didnt." if ret_proc.length != 1
|
282
|
-
|
283
|
-
|
282
|
+
|
283
|
+
|
284
284
|
project = $ob.get(:Project, 1)
|
285
|
-
|
285
|
+
|
286
286
|
tasks = project.tasks
|
287
287
|
raise "No tasks were found on project?" if tasks.empty?
|
288
|
-
|
289
|
-
|
288
|
+
|
289
|
+
|
290
290
|
ret_proc = []
|
291
291
|
ret_test = project.tasks do |task|
|
292
292
|
ret_proc << task
|
293
293
|
end
|
294
|
-
|
294
|
+
|
295
295
|
raise "When given a block the return should be nil so it doesnt hold weak-ref-objects in memory but it didnt return nil." if ret_test != nil
|
296
296
|
raise "list for project with proc should return one task but didnt (#{ret_proc.length})." if ret_proc.length != 1
|
297
|
-
|
297
|
+
|
298
298
|
person = tasks.first.person
|
299
299
|
project_second = tasks.first.project
|
300
|
-
|
300
|
+
|
301
301
|
raise "Returned object was not a person on task." if !person.is_a?(Person)
|
302
302
|
raise "Returned object was not a project on task." if !project_second.is_a?(Project)
|
303
|
-
|
304
|
-
|
303
|
+
|
304
|
+
|
305
305
|
#Check that has_many-depending is actually working.
|
306
306
|
begin
|
307
307
|
$ob.delete(project)
|
@@ -310,7 +310,7 @@ describe "Objects" do
|
|
310
310
|
#this should happen - it should not possible to delete project 1 because task 1 depends on it."
|
311
311
|
end
|
312
312
|
end
|
313
|
-
|
313
|
+
|
314
314
|
it "should be able to generate lists for inputs" do
|
315
315
|
Knj::Web.inputs([{
|
316
316
|
:title => "Test 3",
|
@@ -320,43 +320,43 @@ describe "Objects" do
|
|
320
320
|
:opts => $ob.list_optshash(:Task)
|
321
321
|
}])
|
322
322
|
end
|
323
|
-
|
323
|
+
|
324
324
|
it "should be able to connect to objects 'no-html' callback and test it." do
|
325
325
|
task = $ob.get(:Task, 1)
|
326
326
|
$ob.events.connect(:no_html) do |event, classname|
|
327
327
|
"[no #{classname.to_s.downcase}]"
|
328
328
|
end
|
329
|
-
|
329
|
+
|
330
330
|
raise "Unexpected person_html from task (should have been 'Kasper'): '#{task.person_html}'." if task.person_html != "Kasper"
|
331
331
|
task.update(:person_id => 0)
|
332
332
|
raise "Unexpected person_html from task (should have been '[no person]')." if task.person_html != "[no person]"
|
333
333
|
end
|
334
|
-
|
334
|
+
|
335
335
|
it "should be able to to multiple additions and delete objects through a buffer" do
|
336
336
|
objs = []
|
337
337
|
0.upto(500) do
|
338
338
|
objs << {:name => :Kasper}
|
339
339
|
end
|
340
|
-
|
340
|
+
|
341
341
|
$ob.adds(:Person, objs)
|
342
342
|
pers_length = $ob.list(:Person, "count" => true)
|
343
|
-
|
343
|
+
|
344
344
|
count = 0
|
345
345
|
$db.q_buffer do |buffer|
|
346
346
|
$ob.list(:Person) do |person|
|
347
347
|
count += 1
|
348
348
|
$ob.delete(person, :db_buffer => buffer)
|
349
349
|
end
|
350
|
-
|
350
|
+
|
351
351
|
buffer.flush
|
352
352
|
end
|
353
|
-
|
353
|
+
|
354
354
|
raise "Expected count to be #{pers_length} but it wasnt: #{count}" if count != pers_length
|
355
|
-
|
355
|
+
|
356
356
|
persons = $ob.list(:Person).to_a
|
357
357
|
raise "Expected persons count to be 0 but it wasnt: #{persons.map{|e| e.data} }" if persons.length > 0
|
358
358
|
end
|
359
|
-
|
359
|
+
|
360
360
|
it "should do autozero when deleting objects" do
|
361
361
|
person1 = $ob.add(:Person, {
|
362
362
|
:name => "Kasper"
|
@@ -364,49 +364,49 @@ describe "Objects" do
|
|
364
364
|
person2 = $ob.add(:Person, {
|
365
365
|
:name => "Charlotte"
|
366
366
|
})
|
367
|
-
|
367
|
+
|
368
368
|
timelog1 = $ob.add(:Timelog, {
|
369
369
|
:person_id => person1.id
|
370
370
|
})
|
371
371
|
timelog2 = $ob.add(:Timelog, {
|
372
372
|
:person_id => person2.id
|
373
373
|
})
|
374
|
-
|
374
|
+
|
375
375
|
$ob.delete(person1)
|
376
|
-
|
376
|
+
|
377
377
|
raise "Expected timelog1's person-ID to be zero but it wasnt: '#{timelog1[:person_id]}'." if timelog1[:person_id].to_i != 0
|
378
378
|
raise "Expected timelog2's person-ID to be #{person2.id} but it wasnt: '#{timelog2[:person_id]}'." if timelog2[:person_id].to_i != person2.id.to_i
|
379
379
|
end
|
380
|
-
|
380
|
+
|
381
381
|
it "should be able to do multiple deletes from ids" do
|
382
382
|
ids = []
|
383
383
|
1.upto(10) do |count|
|
384
384
|
ids << $ob.add(:Person).id
|
385
385
|
end
|
386
|
-
|
386
|
+
|
387
387
|
$ob.delete_ids(:class => :Person, :ids => ids)
|
388
388
|
end
|
389
|
-
|
389
|
+
|
390
390
|
it "get_or_add" do
|
391
391
|
person1 = $ob.add(:Person, {
|
392
392
|
:name => "get_or_add"
|
393
393
|
})
|
394
|
-
|
394
|
+
|
395
395
|
person2 = $ob.get_or_add(:Person, {
|
396
396
|
:name => "get_or_add"
|
397
397
|
})
|
398
|
-
|
398
|
+
|
399
399
|
person2.id.should eql(person1.id)
|
400
400
|
person2[:name].should eql("get_or_add")
|
401
|
-
|
401
|
+
|
402
402
|
person3 = $ob.get_or_add(:Person, {
|
403
403
|
:name => "get_or_add3"
|
404
404
|
})
|
405
|
-
|
405
|
+
|
406
406
|
raise "Failure ID was the same" if person3.id == person2.id
|
407
407
|
person3[:name].should eql("get_or_add3")
|
408
408
|
end
|
409
|
-
|
409
|
+
|
410
410
|
it "should delete the temp database again." do
|
411
411
|
db_path = "#{Knj::Os.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
|
412
412
|
File.unlink(db_path) if File.exists?(db_path)
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require "codeclimate-test-reporter"
|
2
|
+
CodeClimate::TestReporter.start
|
3
|
+
|
4
4
|
require 'baza'
|
5
5
|
|
6
|
-
# Requires supporting files with custom matchers and macros, etc,
|
7
|
-
# in ./support/ and its subdirectories.
|
8
6
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
7
|
|
10
8
|
RSpec.configure do |config|
|
11
|
-
|
9
|
+
config.expect_with :rspec do |c|
|
10
|
+
c.syntax = [:should, :expect]
|
11
|
+
end
|
12
12
|
end
|