knjrbfw 0.0.23 → 0.0.24
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/VERSION +1 -1
- data/knjrbfw.gemspec +7 -4
- data/lib/knj/autoload.rb +1 -61
- data/lib/knj/datarow.rb +7 -10
- data/lib/knj/datarow_custom.rb +12 -2
- data/lib/knj/datet.rb +107 -0
- data/lib/knj/eruby.rb +21 -12
- data/lib/knj/gettext_threadded.rb +1 -1
- data/lib/knj/http2.rb +27 -9
- data/lib/knj/image.rb +10 -0
- data/lib/knj/includes/require_info.rb +3 -3
- data/lib/knj/knj.rb +16 -9
- data/lib/knj/knj_controller.rb +10 -1
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +26 -9
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +11 -8
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +5 -0
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +83 -26
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +3 -3
- data/lib/knj/knjdb/libknjdb.rb +19 -20
- data/lib/knj/knjdb/revision.rb +9 -2
- data/lib/knj/kvm.rb +100 -0
- data/lib/knj/locale_strings.rb +32 -3
- data/lib/knj/locales.rb +1 -4
- data/lib/knj/memory_analyzer.rb +335 -0
- data/lib/knj/objects/objects_sqlhelper.rb +2 -2
- data/lib/knj/objects.rb +44 -11
- data/lib/knj/opts.rb +8 -8
- data/lib/knj/os.rb +13 -0
- data/lib/knj/php.rb +18 -33
- data/lib/knj/process.rb +3 -0
- data/lib/knj/process_meta.rb +1 -1
- data/lib/knj/rhodes/mutex.rb +2 -1
- data/lib/knj/rhodes/rhodes.js +5 -1
- data/lib/knj/rhodes/rhodes.rb +15 -15
- data/lib/knj/rhodes/youtube_embed.erb +12 -0
- data/lib/knj/rhodes/youtube_open.erb +45 -0
- data/lib/knj/strings.rb +2 -1
- data/lib/knj/translations.rb +3 -3
- data/lib/knj/unix_proc.rb +15 -4
- data/lib/knj/web.rb +17 -247
- data/lib/knj/webscripts/image.rhtml +9 -3
- data/lib/knj/wref.rb +109 -70
- data/spec/datet_spec.rb +30 -0
- data/spec/http2_spec.rb +23 -0
- data/spec/php_spec.rb +3 -0
- metadata +20 -17
- data/lib/knj/rhodes/delegate.rb +0 -414
- data/lib/knj/rhodes/weakref.rb +0 -80
data/lib/knj/wref.rb
CHANGED
@@ -1,40 +1,55 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#A weak-reference that wont bite you in the ass like the one in Ruby 1.9.
|
1
|
+
#A simple weak-reference framework with mapping. Only handles the referencing of objects.
|
4
2
|
class Knj::Wref
|
5
|
-
attr_reader :class_name, :id
|
6
|
-
|
7
|
-
#Yields debug-output for every weak-ref that is alive.
|
8
|
-
def self.debug_wrefs
|
9
|
-
ObjectSpace.each_object(Knj::Wref) do |wref|
|
10
|
-
begin
|
11
|
-
obj = wref.get
|
12
|
-
rescue WeakRef::RefError
|
13
|
-
yield("str" => "Dead wref: #{wref.class_name} (#{wref.id})", "alive" => false, "wref" => wref)
|
14
|
-
next
|
15
|
-
end
|
16
|
-
|
17
|
-
yield("str" => "Alive wref: #{wref.class_name} (#{wref.id})", "alive" => true, "wref" => wref, "obj" => obj)
|
18
|
-
end
|
19
|
-
end
|
3
|
+
attr_reader :class_name, :id
|
20
4
|
|
21
5
|
def initialize(obj)
|
22
|
-
@weakref = WeakRef.new(obj)
|
23
|
-
@class_name = obj.class.name.to_sym
|
24
6
|
@id = obj.__id__
|
7
|
+
|
8
|
+
if RUBY_ENGINE == "jruby"
|
9
|
+
@weakref = java.lang.ref.WeakReference.new(obj)
|
10
|
+
else
|
11
|
+
@class_name = obj.class.name.to_sym
|
12
|
+
|
13
|
+
if obj.respond_to?("__object_unique_id__")
|
14
|
+
@unique_id = obj.__object_unique_id__
|
15
|
+
end
|
16
|
+
end
|
25
17
|
end
|
26
18
|
|
27
|
-
#Returns the object that this weak reference holds or throws
|
19
|
+
#Returns the object that this weak reference holds or throws Knj::Wref::Recycled.
|
28
20
|
def get
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
21
|
+
begin
|
22
|
+
raise Knj::Wref::Recycled if !@class_name or !@id
|
23
|
+
|
24
|
+
if RUBY_ENGINE == "jruby"
|
25
|
+
obj = @weakref.get
|
26
|
+
|
27
|
+
if obj == nil
|
28
|
+
raise Knj::Wref::Recycled
|
29
|
+
else
|
30
|
+
return obj
|
31
|
+
end
|
32
|
+
else
|
33
|
+
obj = ObjectSpace._id2ref(@id)
|
34
|
+
end
|
35
|
+
|
36
|
+
#Some times this class-name will be nil for some reason - knj
|
37
|
+
obj_class_name = obj.class.name
|
38
|
+
|
39
|
+
if !obj_class_name or @class_name != obj_class_name.to_sym or @id != obj.__id__
|
40
|
+
raise Knj::Wref::Recycled
|
41
|
+
end
|
42
|
+
|
43
|
+
if @unique_id
|
44
|
+
if !obj.respond_to?("__object_unique_id__") or obj.__object_unique_id__ != @unique_id
|
45
|
+
raise Knj::Wref::Recycled
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
return obj
|
50
|
+
rescue RangeError, TypeError
|
51
|
+
raise Knj::Wref::Recycled
|
35
52
|
end
|
36
|
-
|
37
|
-
return obj
|
38
53
|
end
|
39
54
|
|
40
55
|
#Returns true if the reference is still alive.
|
@@ -42,18 +57,11 @@ class Knj::Wref
|
|
42
57
|
begin
|
43
58
|
self.get
|
44
59
|
return true
|
45
|
-
rescue
|
60
|
+
rescue Knj::Wref::Recycled
|
46
61
|
return false
|
47
62
|
end
|
48
63
|
end
|
49
64
|
|
50
|
-
#Removes all data from this object.
|
51
|
-
def destroy
|
52
|
-
@weakref = nil
|
53
|
-
@class_name = nil
|
54
|
-
@id = nil
|
55
|
-
end
|
56
|
-
|
57
65
|
#Make Wref compatible with the normal WeakRef.
|
58
66
|
alias weakref_alive? alive?
|
59
67
|
alias __getobj__ get
|
@@ -62,34 +70,36 @@ end
|
|
62
70
|
class Knj::Wref_map
|
63
71
|
def initialize(args = nil)
|
64
72
|
@map = {}
|
65
|
-
|
66
|
-
|
67
|
-
#Unsets everything to free up memory.
|
68
|
-
def destroy
|
69
|
-
@map.clear
|
70
|
-
@map = nil
|
73
|
+
@ids = {}
|
74
|
+
@mutex = Mutex.new
|
71
75
|
end
|
72
76
|
|
73
77
|
#Sets a new object in the map with a given ID.
|
74
78
|
def set(id, obj)
|
75
|
-
|
79
|
+
wref = Knj::Wref.new(obj)
|
80
|
+
|
81
|
+
@mutex.synchronize do
|
82
|
+
@map[id] = wref
|
83
|
+
@ids[obj.__id__] = id
|
84
|
+
end
|
85
|
+
|
86
|
+
#JRuby cant handle this atm... Dunno why...
|
87
|
+
if RUBY_ENGINE != "jruby"
|
88
|
+
ObjectSpace.define_finalizer(obj, self.method("delete_by_id"))
|
89
|
+
end
|
90
|
+
|
76
91
|
return nil
|
77
92
|
end
|
78
93
|
|
79
94
|
#Returns a object by ID or raises a RefError.
|
80
95
|
def get(id)
|
81
|
-
raise WeakRef::RefError if !@map.key?(id)
|
82
|
-
|
83
96
|
begin
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
@map[id].destroy
|
88
|
-
rescue NoMethodError
|
89
|
-
#happens if the object already got destroyed by another thread - ignore.
|
97
|
+
@mutex.synchronize do
|
98
|
+
raise Knj::Wref::Recycled if !@map.key?(id)
|
99
|
+
return @map[id].get
|
90
100
|
end
|
91
|
-
|
92
|
-
|
101
|
+
rescue Knj::Wref::Recycled => e
|
102
|
+
self.delete(id)
|
93
103
|
raise e
|
94
104
|
end
|
95
105
|
end
|
@@ -98,17 +108,22 @@ class Knj::Wref_map
|
|
98
108
|
def get!(id)
|
99
109
|
begin
|
100
110
|
return self.get(id)
|
101
|
-
rescue
|
111
|
+
rescue Knj::Wref::Recycled
|
102
112
|
return nil
|
103
113
|
end
|
104
114
|
end
|
105
115
|
|
106
|
-
#Scans the whole map and removes dead references.
|
116
|
+
#Scans the whole map and removes dead references. After the implementation of automatic clean-up by using ObjectSpace.define_finalizer, there should be no reason to call this method.
|
107
117
|
def clean
|
108
|
-
|
118
|
+
keys = nil
|
119
|
+
@mutex.synchronize do
|
120
|
+
keys = @map.keys
|
121
|
+
end
|
122
|
+
|
123
|
+
keys.each do |key|
|
109
124
|
begin
|
110
125
|
self.get(key) #this will remove the key if the object no longer exists.
|
111
|
-
rescue
|
126
|
+
rescue Knj::Wref::Recycled
|
112
127
|
#ignore.
|
113
128
|
end
|
114
129
|
end
|
@@ -118,39 +133,63 @@ class Knj::Wref_map
|
|
118
133
|
|
119
134
|
#Returns true if a given key exists and the object it holds is alive.
|
120
135
|
def valid?(key)
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
136
|
+
@mutex.synchronize do
|
137
|
+
return false if !@map.key?(key)
|
138
|
+
|
139
|
+
begin
|
140
|
+
@map[key].get
|
141
|
+
return true
|
142
|
+
rescue Knj::Wref::Recycled
|
143
|
+
return false
|
144
|
+
end
|
128
145
|
end
|
129
146
|
end
|
130
147
|
|
131
148
|
#Returns true if the given key exists in the hash.
|
132
149
|
def key?(key)
|
133
|
-
|
150
|
+
@mutex.synchronize do
|
151
|
+
return @map.key?(key)
|
152
|
+
end
|
134
153
|
end
|
135
154
|
|
136
155
|
#Returns the length of the hash. This may not be true since invalid objects is also counted.
|
137
156
|
def length
|
138
|
-
|
157
|
+
@mutex.synchronize do
|
158
|
+
return @map.length
|
159
|
+
end
|
139
160
|
end
|
140
161
|
|
141
162
|
#Cleans the hash and returns the length. This is slower but more accurate than the ordinary length that just returns the hash-length.
|
142
163
|
def length_valid
|
143
164
|
self.clean
|
144
|
-
|
165
|
+
|
166
|
+
@mutex.synchronize do
|
167
|
+
return @map.length
|
168
|
+
end
|
145
169
|
end
|
146
170
|
|
147
171
|
#Deletes a key in the hash.
|
148
172
|
def delete(key)
|
149
|
-
@
|
173
|
+
@mutex.synchronize do
|
174
|
+
wref = @map[key]
|
175
|
+
@ids.delete(wref.id) if wref
|
176
|
+
@map.delete(key)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
#This method is supposed to remove objects when finalizer is called by ObjectSpace.
|
181
|
+
def delete_by_id(object_id)
|
182
|
+
@mutex.synchronize do
|
183
|
+
id = @ids[object_id]
|
184
|
+
@map.delete(id)
|
185
|
+
@ids.delete(object_id)
|
186
|
+
end
|
150
187
|
end
|
151
188
|
|
152
189
|
#Make it hash-compatible.
|
153
190
|
alias has_key? key?
|
154
191
|
alias [] get
|
155
192
|
alias []= set
|
156
|
-
end
|
193
|
+
end
|
194
|
+
|
195
|
+
class Knj::Wref::Recycled < RuntimeError; end
|
data/spec/datet_spec.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Datet" do
|
4
|
+
it "should be able to make ago-strings" do
|
5
|
+
require "knj/datet"
|
6
|
+
|
7
|
+
time = Time.at(Time.now.to_i - 5)
|
8
|
+
datet = Knj::Datet.in(time)
|
9
|
+
res = datet.ago_str
|
10
|
+
raise "Expected '5 seconds ago' but got: '#{res}'." if res != "5 seconds ago"
|
11
|
+
|
12
|
+
|
13
|
+
time = Time.at(Time.now.to_i - 1800)
|
14
|
+
datet = Knj::Datet.in(time)
|
15
|
+
res = datet.ago_str
|
16
|
+
raise "Expected '30 minutes ago' but got: '#{res}'." if res != "30 minutes ago"
|
17
|
+
|
18
|
+
|
19
|
+
time = Time.at(Time.now.to_i - 60)
|
20
|
+
datet = Knj::Datet.in(time)
|
21
|
+
res = datet.ago_str
|
22
|
+
raise "Expected '1 minute ago' but got: '#{res}'." if res != "1 minute ago"
|
23
|
+
|
24
|
+
|
25
|
+
time = Time.at(Time.now.to_i - 48 * 3600)
|
26
|
+
datet = Knj::Datet.in(time)
|
27
|
+
res = datet.ago_str
|
28
|
+
raise "Expected '48 hours ago' but got: '#{res}'." if res != "48 hours ago"
|
29
|
+
end
|
30
|
+
end
|
data/spec/http2_spec.rb
CHANGED
@@ -1,6 +1,29 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "Http2" do
|
4
|
+
it "should be able to recursively parse post-data-hashes." do
|
5
|
+
require "knj/http2"
|
6
|
+
|
7
|
+
res = Knj::Http2.post_convert_data(
|
8
|
+
"test1" => "test2"
|
9
|
+
)
|
10
|
+
raise "Expected 'test1=test2' but got: '#{res}'." if res != "test1=test2"
|
11
|
+
|
12
|
+
res = Knj::Http2.post_convert_data(
|
13
|
+
"test1" => [1, 2, 3]
|
14
|
+
)
|
15
|
+
raise "Expected 'test1=1%3D12%3D23%3D3' but got: '#{res}'." if res != "test1=1%3D12%3D23%3D3"
|
16
|
+
|
17
|
+
res = Knj::Http2.post_convert_data(
|
18
|
+
"test1" => {
|
19
|
+
"order" => {
|
20
|
+
[:Bnet_profile, "profile_id"] => 5
|
21
|
+
}
|
22
|
+
}
|
23
|
+
)
|
24
|
+
raise "Expected 'test1=order%3D1%25253DBnet_profile2%25253Dprofile_id%253D5' but got: '#{res}'." if res != "test1=order%3D1%25253DBnet_profile2%25253Dprofile_id%253D5"
|
25
|
+
end
|
26
|
+
|
4
27
|
it "should be able to do multipart-requests." do
|
5
28
|
require "knj/http2"
|
6
29
|
require "knj/php"
|
data/spec/php_spec.rb
CHANGED
@@ -49,6 +49,9 @@ describe "Php" do
|
|
49
49
|
|
50
50
|
res = Knj::Php.substr("test_kasper", 1, 3)
|
51
51
|
raise "substr should have returned 'est' but didnt: '#{res}'." if res != "est"
|
52
|
+
|
53
|
+
res = Knj::Php.substr("test_kasper", 0, -3)
|
54
|
+
raise "substr should have returned 'test_kas' but didnt: '#{res}'." if res != "test_kas"
|
52
55
|
end
|
53
56
|
|
54
57
|
it "parse_str" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knjrbfw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.24
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-26 00:00:00.000000000 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
17
|
-
requirement: &
|
17
|
+
requirement: &21050060 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 2.3.0
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *21050060
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: bundler
|
28
|
-
requirement: &
|
28
|
+
requirement: &21049480 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 1.0.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *21049480
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: jeweler
|
39
|
-
requirement: &
|
39
|
+
requirement: &21048860 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 1.6.3
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *21048860
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rcov
|
50
|
-
requirement: &
|
50
|
+
requirement: &21035140 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *21035140
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: sqlite3
|
61
|
-
requirement: &
|
61
|
+
requirement: &21034540 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: '0'
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *21034540
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rmagick
|
72
|
-
requirement: &
|
72
|
+
requirement: &21033380 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *21033380
|
81
81
|
description: Including stuff for HTTP, SSH and much more.
|
82
82
|
email: k@spernj.org
|
83
83
|
executables: []
|
@@ -242,6 +242,7 @@ files:
|
|
242
242
|
- lib/knj/knjdb/libknjdb_row.rb
|
243
243
|
- lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb
|
244
244
|
- lib/knj/knjdb/revision.rb
|
245
|
+
- lib/knj/kvm.rb
|
245
246
|
- lib/knj/libqt.rb
|
246
247
|
- lib/knj/libqt_window.rb
|
247
248
|
- lib/knj/locale_strings.rb
|
@@ -249,6 +250,7 @@ files:
|
|
249
250
|
- lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb
|
250
251
|
- lib/knj/mail.rb
|
251
252
|
- lib/knj/mailobj.rb
|
253
|
+
- lib/knj/memory_analyzer.rb
|
252
254
|
- lib/knj/mount.rb
|
253
255
|
- lib/knj/mutexcl.rb
|
254
256
|
- lib/knj/notify.rb
|
@@ -269,11 +271,11 @@ files:
|
|
269
271
|
- lib/knj/process_meta.rb
|
270
272
|
- lib/knj/rand.rb
|
271
273
|
- lib/knj/retry.rb
|
272
|
-
- lib/knj/rhodes/delegate.rb
|
273
274
|
- lib/knj/rhodes/mutex.rb
|
274
275
|
- lib/knj/rhodes/rhodes.js
|
275
276
|
- lib/knj/rhodes/rhodes.rb
|
276
|
-
- lib/knj/rhodes/
|
277
|
+
- lib/knj/rhodes/youtube_embed.erb
|
278
|
+
- lib/knj/rhodes/youtube_open.erb
|
277
279
|
- lib/knj/rsvgbin.rb
|
278
280
|
- lib/knj/scripts/degulesider.rb
|
279
281
|
- lib/knj/scripts/filesearch.rb
|
@@ -313,6 +315,7 @@ files:
|
|
313
315
|
- lib/knjrbfw.rb
|
314
316
|
- spec/amixer_spec.rb
|
315
317
|
- spec/cmd_parser_spec.rb
|
318
|
+
- spec/datet_spec.rb
|
316
319
|
- spec/db_spec.rb
|
317
320
|
- spec/db_spec_encoding_test_file.txt
|
318
321
|
- spec/http2_spec.rb
|
@@ -340,7 +343,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
340
343
|
version: '0'
|
341
344
|
segments:
|
342
345
|
- 0
|
343
|
-
hash: -
|
346
|
+
hash: -24942371531002618
|
344
347
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
345
348
|
none: false
|
346
349
|
requirements:
|