knjrbfw 0.0.23 → 0.0.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/VERSION +1 -1
  2. data/knjrbfw.gemspec +7 -4
  3. data/lib/knj/autoload.rb +1 -61
  4. data/lib/knj/datarow.rb +7 -10
  5. data/lib/knj/datarow_custom.rb +12 -2
  6. data/lib/knj/datet.rb +107 -0
  7. data/lib/knj/eruby.rb +21 -12
  8. data/lib/knj/gettext_threadded.rb +1 -1
  9. data/lib/knj/http2.rb +27 -9
  10. data/lib/knj/image.rb +10 -0
  11. data/lib/knj/includes/require_info.rb +3 -3
  12. data/lib/knj/knj.rb +16 -9
  13. data/lib/knj/knj_controller.rb +10 -1
  14. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +26 -9
  15. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +11 -8
  16. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +5 -0
  17. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +83 -26
  18. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +3 -3
  19. data/lib/knj/knjdb/libknjdb.rb +19 -20
  20. data/lib/knj/knjdb/revision.rb +9 -2
  21. data/lib/knj/kvm.rb +100 -0
  22. data/lib/knj/locale_strings.rb +32 -3
  23. data/lib/knj/locales.rb +1 -4
  24. data/lib/knj/memory_analyzer.rb +335 -0
  25. data/lib/knj/objects/objects_sqlhelper.rb +2 -2
  26. data/lib/knj/objects.rb +44 -11
  27. data/lib/knj/opts.rb +8 -8
  28. data/lib/knj/os.rb +13 -0
  29. data/lib/knj/php.rb +18 -33
  30. data/lib/knj/process.rb +3 -0
  31. data/lib/knj/process_meta.rb +1 -1
  32. data/lib/knj/rhodes/mutex.rb +2 -1
  33. data/lib/knj/rhodes/rhodes.js +5 -1
  34. data/lib/knj/rhodes/rhodes.rb +15 -15
  35. data/lib/knj/rhodes/youtube_embed.erb +12 -0
  36. data/lib/knj/rhodes/youtube_open.erb +45 -0
  37. data/lib/knj/strings.rb +2 -1
  38. data/lib/knj/translations.rb +3 -3
  39. data/lib/knj/unix_proc.rb +15 -4
  40. data/lib/knj/web.rb +17 -247
  41. data/lib/knj/webscripts/image.rhtml +9 -3
  42. data/lib/knj/wref.rb +109 -70
  43. data/spec/datet_spec.rb +30 -0
  44. data/spec/http2_spec.rb +23 -0
  45. data/spec/php_spec.rb +3 -0
  46. metadata +20 -17
  47. data/lib/knj/rhodes/delegate.rb +0 -414
  48. data/lib/knj/rhodes/weakref.rb +0 -80
data/lib/knj/wref.rb CHANGED
@@ -1,40 +1,55 @@
1
- require "weakref"
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, :map, :map_id, :spawned
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 WeakRef::RefError.
19
+ #Returns the object that this weak reference holds or throws Knj::Wref::Recycled.
28
20
  def get
29
- obj = @weakref.__getobj__ if @weakref
30
-
31
- #The class-check is because ID's can be reused in Ruby 1.9 which breaks the normal WeakRef-implementation.
32
- if !@weakref or @class_name != obj.class.name.to_sym or @id != obj.__id__
33
- self.destroy
34
- raise WeakRef::RefError
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 WeakRef::RefError
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
- end
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
- @map[id] = Knj::Wref.new(obj)
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
- return @map[id].get
85
- rescue WeakRef::RefError => e
86
- begin
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
- @map.delete(id)
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 WeakRef::RefError
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
- @map.keys.each do |key|
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 WeakRef::RefError
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
- return false if !@map.key?(key)
122
-
123
- begin
124
- @map[key].get
125
- return true
126
- rescue WeakRef::RefError
127
- return false
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
- return @map.key?(key)
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
- return @map.length
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
- return @map.length
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
- @map.delete(key)
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
@@ -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.23
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-03-16 00:00:00.000000000 +01:00
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: &19017160 !ruby/object:Gem::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: *19017160
25
+ version_requirements: *21050060
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
28
- requirement: &19015640 !ruby/object:Gem::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: *19015640
36
+ version_requirements: *21049480
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: jeweler
39
- requirement: &19014340 !ruby/object:Gem::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: *19014340
47
+ version_requirements: *21048860
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rcov
50
- requirement: &19011420 !ruby/object:Gem::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: *19011420
58
+ version_requirements: *21035140
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: sqlite3
61
- requirement: &18984160 !ruby/object:Gem::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: *18984160
69
+ version_requirements: *21034540
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rmagick
72
- requirement: &18981880 !ruby/object:Gem::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: *18981880
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/weakref.rb
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: -4483091133869871339
346
+ hash: -24942371531002618
344
347
  required_rubygems_version: !ruby/object:Gem::Requirement
345
348
  none: false
346
349
  requirements: