knjrbfw 0.0.68 → 0.0.69
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/Gemfile.lock +1 -0
- data/VERSION +1 -1
- data/knjrbfw.gemspec +2 -3
- data/lib/knj/datarow.rb +17 -5
- data/lib/knj/objects.rb +19 -7
- data/lib/knj/process.rb +1 -1
- data/spec/objects_spec.rb +39 -0
- metadata +3 -4
- data/spec/threadsafe_spec.rb +0 -57
data/Gemfile.lock
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.69
|
data/knjrbfw.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{knjrbfw}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.69"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = %q{2012-07-
|
12
|
+
s.date = %q{2012-07-27}
|
13
13
|
s.description = %q{Including stuff for HTTP, SSH and much more.}
|
14
14
|
s.email = %q{k@spernj.org}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -265,7 +265,6 @@ Gem::Specification.new do |s|
|
|
265
265
|
"spec/process_spec.rb",
|
266
266
|
"spec/spec_helper.rb",
|
267
267
|
"spec/strings_spec.rb",
|
268
|
-
"spec/threadsafe_spec.rb",
|
269
268
|
"spec/web_spec.rb",
|
270
269
|
"testfiles/image.jpg"
|
271
270
|
]
|
data/lib/knj/datarow.rb
CHANGED
@@ -48,7 +48,6 @@ class Knj::Datarow
|
|
48
48
|
# ]
|
49
49
|
# end
|
50
50
|
def self.depending_data
|
51
|
-
@depending_data = [] if !@depending_data
|
52
51
|
return @depending_data
|
53
52
|
end
|
54
53
|
|
@@ -67,10 +66,13 @@ class Knj::Datarow
|
|
67
66
|
# ]
|
68
67
|
# end
|
69
68
|
def self.autodelete_data
|
70
|
-
@autodelete_data = [] if !@autodelete_data
|
71
69
|
return @autodelete_data
|
72
70
|
end
|
73
71
|
|
72
|
+
def self.autozero_data
|
73
|
+
return @autozero_data
|
74
|
+
end
|
75
|
+
|
74
76
|
#This helps various parts of the framework determine if this is a datarow class without requiring it.
|
75
77
|
#===Examples
|
76
78
|
# print "This is a knj-object." if obj.respond_to?("is_knj?")
|
@@ -111,7 +113,7 @@ class Knj::Datarow
|
|
111
113
|
colname = hval
|
112
114
|
when :method
|
113
115
|
methodname = hval
|
114
|
-
when :depends, :autodelete, :where
|
116
|
+
when :depends, :autodelete, :autozero, :where
|
115
117
|
#ignore
|
116
118
|
else
|
117
119
|
raise "Invalid key for 'has_many': '#{hkey}'."
|
@@ -121,14 +123,24 @@ class Knj::Datarow
|
|
121
123
|
colname = "#{self.name.to_s.split("::").last.to_s.downcase}_id".to_sym if colname.to_s.empty?
|
122
124
|
|
123
125
|
if val[:depends]
|
124
|
-
|
126
|
+
@depending_data = [] if !@depending_data
|
127
|
+
@depending_data << {
|
125
128
|
:colname => colname,
|
126
129
|
:classname => classname
|
127
130
|
}
|
128
131
|
end
|
129
132
|
|
130
133
|
if val[:autodelete]
|
131
|
-
|
134
|
+
@autodelete_data = [] if !@autodelete_data
|
135
|
+
@autodelete_data << {
|
136
|
+
:colname => colname,
|
137
|
+
:classname => classname
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
141
|
+
if val[:autozero]
|
142
|
+
@autozero_data = [] if !@autozero_data
|
143
|
+
@autozero_data << {
|
132
144
|
:colname => colname,
|
133
145
|
:classname => classname
|
134
146
|
}
|
data/lib/knj/objects.rb
CHANGED
@@ -793,17 +793,29 @@ class Knj::Objects
|
|
793
793
|
|
794
794
|
if @args[:datarow]
|
795
795
|
#If autodelete is set by 'has_many'-method, go through it and delete the various objects first.
|
796
|
-
object.class.autodelete_data
|
797
|
-
|
798
|
-
self.
|
796
|
+
if autodelete_data = object.class.autodelete_data
|
797
|
+
autodelete_data.each do |adel_data|
|
798
|
+
self.list(adel_data[:classname], {adel_data[:colname].to_s => object.id}) do |obj_del|
|
799
|
+
self.delete(obj_del, args)
|
800
|
+
end
|
799
801
|
end
|
800
802
|
end
|
801
803
|
|
802
804
|
#If depend is set by 'has_many'-method, check if any objects exists and raise error if so.
|
803
|
-
object.class.depending_data
|
804
|
-
|
805
|
-
|
806
|
-
|
805
|
+
if dep_datas = object.class.depending_data
|
806
|
+
dep_datas.each do |dep_data|
|
807
|
+
if obj = self.get_by(dep_data[:classname], {dep_data[:colname].to_s => object.id})
|
808
|
+
raise "Cannot delete <#{object.class.name}:#{object.id}> because <#{obj.class.name}:#{obj.id}> depends on it."
|
809
|
+
end
|
810
|
+
end
|
811
|
+
end
|
812
|
+
|
813
|
+
#If autozero is set by 'has_many'-method, check if any objects exists and set the ID to zero.
|
814
|
+
if autozero_datas = object.class.autozero_data
|
815
|
+
autozero_datas.each do |zero_data|
|
816
|
+
self.list(zero_data[:classname], {zero_data[:colname].to_s => object.id}) do |obj_zero|
|
817
|
+
obj_zero[zero_data[:colname].to_sym] = 0
|
818
|
+
end
|
807
819
|
end
|
808
820
|
end
|
809
821
|
|
data/lib/knj/process.rb
CHANGED
@@ -199,7 +199,7 @@ class Knj::Process
|
|
199
199
|
buffer_done = false
|
200
200
|
|
201
201
|
begin
|
202
|
-
buffer_answers =
|
202
|
+
buffer_answers = Tsafe.std_array #JRuby needs the threadsafety.
|
203
203
|
buffer_thread = Knj::Thread.new do
|
204
204
|
loop do
|
205
205
|
arr = buffer_answers.shift(200)
|
data/spec/objects_spec.rb
CHANGED
@@ -174,6 +174,16 @@ describe "Objects" do
|
|
174
174
|
]
|
175
175
|
})
|
176
176
|
|
177
|
+
$db.tables.create("Timelog", {
|
178
|
+
"columns" => [
|
179
|
+
{"name" => "id", "type" => "int", "autoincr" => true, "primarykey" => true},
|
180
|
+
{"name" => "person_id", "type" => "int"}
|
181
|
+
],
|
182
|
+
"indexes" => [
|
183
|
+
"person_id"
|
184
|
+
]
|
185
|
+
})
|
186
|
+
|
177
187
|
table = $db.tables["Project"]
|
178
188
|
|
179
189
|
indexes = table.indexes
|
@@ -212,11 +222,19 @@ describe "Objects" do
|
|
212
222
|
class Person < Knj::Datarow
|
213
223
|
has_one [:Project]
|
214
224
|
|
225
|
+
has_many [
|
226
|
+
{:class => :Timelog, :autozero => true}
|
227
|
+
]
|
228
|
+
|
215
229
|
def html
|
216
230
|
return self[:name]
|
217
231
|
end
|
218
232
|
end
|
219
233
|
|
234
|
+
class Timelog < Knj::Datarow
|
235
|
+
|
236
|
+
end
|
237
|
+
|
220
238
|
$ob = Knj::Objects.new(:db => $db, :datarow => true, :require => false)
|
221
239
|
|
222
240
|
$ob.add(:Person, {
|
@@ -334,6 +352,27 @@ describe "Objects" do
|
|
334
352
|
raise "Expected persons count to be 0 but it wasnt: #{persons.map{|e| e.data} }" if persons.length > 0
|
335
353
|
end
|
336
354
|
|
355
|
+
it "should do autozero when deleting objects" do
|
356
|
+
person1 = $ob.add(:Person, {
|
357
|
+
:name => "Kasper"
|
358
|
+
})
|
359
|
+
person2 = $ob.add(:Person, {
|
360
|
+
:name => "Charlotte"
|
361
|
+
})
|
362
|
+
|
363
|
+
timelog1 = $ob.add(:Timelog, {
|
364
|
+
:person_id => person1.id
|
365
|
+
})
|
366
|
+
timelog2 = $ob.add(:Timelog, {
|
367
|
+
:person_id => person2.id
|
368
|
+
})
|
369
|
+
|
370
|
+
$ob.delete(person1)
|
371
|
+
|
372
|
+
raise "Expected timelog1's person-ID to be zero but it wasnt: '#{timelog1[:person_id]}'." if timelog1[:person_id].to_i != 0
|
373
|
+
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
|
374
|
+
end
|
375
|
+
|
337
376
|
it "should delete the temp database again." do
|
338
377
|
db_path = "#{Knj::Os.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
|
339
378
|
File.unlink(db_path) if File.exists?(db_path)
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: knjrbfw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.69
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-27 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -370,7 +370,6 @@ files:
|
|
370
370
|
- spec/process_spec.rb
|
371
371
|
- spec/spec_helper.rb
|
372
372
|
- spec/strings_spec.rb
|
373
|
-
- spec/threadsafe_spec.rb
|
374
373
|
- spec/web_spec.rb
|
375
374
|
- testfiles/image.jpg
|
376
375
|
has_rdoc: true
|
@@ -387,7 +386,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
387
386
|
requirements:
|
388
387
|
- - ">="
|
389
388
|
- !ruby/object:Gem::Version
|
390
|
-
hash: -
|
389
|
+
hash: -3747368515681482900
|
391
390
|
segments:
|
392
391
|
- 0
|
393
392
|
version: "0"
|
data/spec/threadsafe_spec.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe "Threadsafe" do
|
4
|
-
it "should be able to spawn threadsafe proxy-objects" do
|
5
|
-
require "knjrbfw"
|
6
|
-
|
7
|
-
arr = Knj::Threadsafe::Proxy.new(:obj => {})
|
8
|
-
|
9
|
-
0.upto(5) do |i|
|
10
|
-
arr[i] = i
|
11
|
-
end
|
12
|
-
|
13
|
-
Knj::Thread.new do
|
14
|
-
arr.each do |key, val|
|
15
|
-
res = key + val
|
16
|
-
sleep 0.1
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
5.upto(10) do |i|
|
21
|
-
arr[i] = i
|
22
|
-
sleep 0.1
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should be able to spawn special classes" do
|
27
|
-
require "knjrbfw"
|
28
|
-
|
29
|
-
#Create new synchronized hash.
|
30
|
-
arr = Knj::Threadsafe::Synced_hash.new
|
31
|
-
|
32
|
-
#Make sure we get the right results.
|
33
|
-
arr[1] = 2
|
34
|
-
|
35
|
-
res = arr[1]
|
36
|
-
raise "Expected 2 but got '#{res}'." if res != 2
|
37
|
-
|
38
|
-
#Set some values to test with.
|
39
|
-
0.upto(5) do |i|
|
40
|
-
arr[i] = i
|
41
|
-
end
|
42
|
-
|
43
|
-
#Try to call through each through a thread and then also try to set new values, which normally would crash the hash.
|
44
|
-
Knj::Thread.new do
|
45
|
-
arr.each do |key, val|
|
46
|
-
res = key + val
|
47
|
-
sleep 0.1
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
#This should not crash it, since they should wait for each other.
|
52
|
-
5.upto(10) do |i|
|
53
|
-
arr[i] = i
|
54
|
-
sleep 0.1
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|