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.
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: