knjrbfw 0.0.72 → 0.0.74

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +4 -0
  3. data/VERSION +1 -1
  4. data/knjrbfw.gemspec +4 -3
  5. data/lib/knj/arrayext.rb +7 -5
  6. data/lib/knj/datarow.rb +6 -0
  7. data/lib/knj/datarow_custom.rb +4 -0
  8. data/lib/knj/datestamp.rb +4 -4
  9. data/lib/knj/degulesider.rb +1 -1
  10. data/lib/knj/erb/include.rb +1 -1
  11. data/lib/knj/fs/fs.rb +3 -3
  12. data/lib/knj/gtk2_menu.rb +1 -1
  13. data/lib/knj/hash_methods.rb +9 -0
  14. data/lib/knj/iotop.rb +1 -1
  15. data/lib/knj/ironruby-gtk2/gladexml.rb +1 -1
  16. data/lib/knj/jruby-gtk2/gladexml.rb +1 -1
  17. data/lib/knj/jruby-gtk2/tests/test_glade_window.rb +1 -1
  18. data/lib/knj/knj.rb +2 -2
  19. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +1 -1
  20. data/lib/knj/knjdb/libknjdb.rb +2 -2
  21. data/lib/knj/knjdb/libknjdb_row.rb +4 -0
  22. data/lib/knj/locales.rb +1 -1
  23. data/lib/knj/notify.rb +1 -1
  24. data/lib/knj/objects.rb +4 -4
  25. data/lib/knj/objects/objects_sqlhelper.rb +1 -1
  26. data/lib/knj/php_parser/php_parser.rb +1 -1
  27. data/lib/knj/php_parser/tests/test.rb +2 -2
  28. data/lib/knj/power_manager.rb +1 -1
  29. data/lib/knj/process.rb +1 -0
  30. data/lib/knj/scripts/ip2location.rb +2 -2
  31. data/lib/knj/scripts/php_to_rb_helper.rb +6 -6
  32. data/lib/knj/scripts/process_meta_exec.rb +1 -1
  33. data/lib/knj/sms.rb +3 -3
  34. data/lib/knj/strings.rb +3 -1
  35. data/lib/knj/table_writer.rb +4 -4
  36. data/lib/knj/tests/test_degulesider.rb +1 -1
  37. data/lib/knj/tests/test_http2.rb +1 -1
  38. data/lib/knj/tests/test_mount.rb +1 -1
  39. data/lib/knj/tests/test_retry.rb +1 -1
  40. data/lib/knj/unix_proc.rb +5 -0
  41. data/lib/knj/web.rb +11 -9
  42. data/spec/cmd_parser_spec.rb +2 -2
  43. data/spec/process_spec.rb +1 -1
  44. data/spec/web_spec.rb +1 -1
  45. metadata +23 -14
  46. data/lib/knj/php.rb +0 -978
  47. data/spec/php_spec.rb +0 -98
@@ -159,12 +159,12 @@ end
159
159
 
160
160
  #Replace various forms of foreach'es.
161
161
  cont.scan(/((\s+?)foreach\s*\((.+?)\s+as\s+\$(#{regexes["var"]}?)\s+=>\s+\$(#{regexes["var"]}?)\)\s*{(\s+?))/i) do |match|
162
- rb_str = "#{match[1]}Knj::Php.foreach(#{match[2]}) do |$#{match[3]}, $#{match[4]}|#{match[5]}"
162
+ rb_str = "#{match[1]}Php4r.foreach(#{match[2]}) do |$#{match[3]}, $#{match[4]}|#{match[5]}"
163
163
  cont = cont.gsub(match[0], rb_str)
164
164
  end
165
165
 
166
166
  cont.scan(/((\s+?)foreach\s*\((.+?)\s+as\s+\$(#{regexes["var"]}?)\s*\)\s*{(\s+?))/i) do |match|
167
- rb_str = "#{match[1]}Knj::Php.foreach(#{match[2]}) do |$#{match[3]}|#{match[4]}"
167
+ rb_str = "#{match[1]}Php4r.foreach(#{match[2]}) do |$#{match[3]}|#{match[4]}"
168
168
  cont = cont.gsub(match[0], rb_str)
169
169
  end
170
170
 
@@ -327,7 +327,7 @@ replaces = {
327
327
  ";\n" => "\n"
328
328
  }
329
329
 
330
- pinfo = Knj::Php.pathinfo(options[:file])
330
+ pinfo = Php4r.pathinfo(options[:file])
331
331
 
332
332
  if options.key?(:tags) and !options[:tags]
333
333
  rbfname = "#{pinfo["basename"]}.rb"
@@ -354,7 +354,7 @@ end
354
354
 
355
355
  funcs_skip = [:foreach]
356
356
  funcs_remove = [:session_start]
357
- funcs_all = funcs_skip | Knj::Php.instance_methods
357
+ funcs_all = funcs_skip | Php4r.instance_methods
358
358
 
359
359
  funcs_all.each do |method_name|
360
360
  next if funcs_skip.index(method_name) != nil
@@ -362,7 +362,7 @@ funcs_all.each do |method_name|
362
362
  if funcs_remove.index(method_name) != nil
363
363
  cont = cont.gsub(match[0], "#{match[1]}#removal of func: #{method_name}(")
364
364
  else
365
- cont = cont.gsub(match[0], "#{match[1]}Knj::Php.#{method_name}(")
365
+ cont = cont.gsub(match[0], "#{match[1]}Php4r.#{method_name}(")
366
366
  end
367
367
  end
368
368
  end
@@ -371,6 +371,6 @@ if pinfo["dirname"].to_s.length > 0
371
371
  rbfname = "#{pinfo["dirname"]}/#{rbfname}"
372
372
  end
373
373
 
374
- Knj::Php.file_put_contents(rbfname, cont)
374
+ Php4r.file_put_contents(rbfname, cont)
375
375
  #require "#{Dir.pwd}/#{rbfname}"
376
376
  #print cont
@@ -130,7 +130,7 @@ objects = {}
130
130
  elsif obj["type"] == "process_data"
131
131
  d.answer("type" => "process_data_success", "pid" => Process.pid)
132
132
  else
133
- raise "Didnt know how to handle hash: '#{Knj::Php.print_r(obj, true)}'."
133
+ raise "Didnt know how to handle hash: '#{Php4r.print_r(obj, true)}'."
134
134
  end
135
135
  else
136
136
  raise "Unknown object: '#{obj.class.name}'."
@@ -30,10 +30,10 @@ class Knj::Sms
30
30
 
31
31
  result = @soap.SendMessage({
32
32
  "cellphone" => @opts[:user],
33
- "password" => Knj::Php.md5(@opts[:pass]),
33
+ "password" => Php4r.md5(@opts[:pass]),
34
34
  "smsTo" => {"string" => number},
35
35
  "smscontents" => msg,
36
- "sendDate" => Knj::Php.date("Y-m-d"),
36
+ "sendDate" => Php4r.date("Y-m-d"),
37
37
  "deliveryReport" => "0",
38
38
  "fromNumber" => @opts[:user]
39
39
  })
@@ -45,7 +45,7 @@ class Knj::Sms
45
45
  @db.insert("outbox", {
46
46
  "number" => number,
47
47
  "text" => msg,
48
- "insertdate" => Knj::Php.date("Y-m-d H:i:s")
48
+ "insertdate" => Php4r.date("Y-m-d H:i:s")
49
49
  })
50
50
  else
51
51
  raise "Not supported: " + @type
@@ -1,5 +1,7 @@
1
1
  #encoding: utf-8
2
2
 
3
+ require "php4r"
4
+
3
5
  #This module contains various methods to escape, change or treat strings.
4
6
  module Knj::Strings
5
7
  #Returns a string that is safe to use on the command line.
@@ -121,7 +123,7 @@ module Knj::Strings
121
123
 
122
124
  #Returns 'Yes' or 'No' based on a value. The value can be 0, 1, yes, no, true or false.
123
125
  def self.yn_str(value, str_yes = "Yes", str_no = "No")
124
- value = value.to_i if Knj::Php.is_numeric(value)
126
+ value = value.to_i if Php4r.is_numeric(value)
125
127
  value_s = value.to_s
126
128
 
127
129
  if value.is_a?(Integer)
@@ -59,9 +59,9 @@ class Knj::Table_writer
59
59
  val = arr[key]
60
60
 
61
61
  if val.is_a?(Hash) and val["type"] == "decimal"
62
- arr[key] = Knj::Php.number_format(val["value"], @args["amount_decimals"], @args["amount_dsep"], @args["amount_tsep"])
62
+ arr[key] = Php4r.number_format(val["value"], @args["amount_decimals"], @args["amount_dsep"], @args["amount_tsep"])
63
63
  elsif val.is_a?(Hash) and val["type"] == "date"
64
- arr[key] = Knj::Php.date(@args["date_format"], val["value"])
64
+ arr[key] = Php4r.date(@args["date_format"], val["value"])
65
65
  end
66
66
  end
67
67
 
@@ -72,9 +72,9 @@ class Knj::Table_writer
72
72
  col_count = 0
73
73
  arr.each do |val|
74
74
  if val.is_a?(Hash) and val["type"] == "decimal"
75
- @ws[@row, col_count] = Knj::Php.number_format(val["value"], @args["amount_decimals"], @args["amount_dsep"], @args["amount_tsep"])
75
+ @ws[@row, col_count] = Php4r.number_format(val["value"], @args["amount_decimals"], @args["amount_dsep"], @args["amount_tsep"])
76
76
  elsif val.is_a?(Hash) and val["type"] == "date"
77
- @ws[@row, col_count] = Knj::Php.date(@args["date_format"], val["value"])
77
+ @ws[@row, col_count] = Php4r.date(@args["date_format"], val["value"])
78
78
  else
79
79
  @ws[@row, col_count] = val
80
80
  end
@@ -7,4 +7,4 @@ results = dgs.search(
7
7
  :where => "Engvej 3, 4970 Rødby"
8
8
  )
9
9
 
10
- Knj::Php.print_r(results)
10
+ Php4r.print_r(results)
@@ -15,4 +15,4 @@ resp = http.get(:url => "/?show=login")
15
15
  http = Http2.new(:host => "mexico.balance4u.com", :port => 443, :ssl => true)
16
16
  resp = http.get(:url => "/")
17
17
 
18
- Knj::Php.print_r(http.cookies)
18
+ Php4r.print_r(http.cookies)
@@ -6,7 +6,7 @@ require "../autoload"
6
6
  print "Listing all mounts.\n"
7
7
  mounts = Knj::Mount.list
8
8
  mounts.each do |mount|
9
- Knj::Php.print_r(mount.data)
9
+ Php4r.print_r(mount.data)
10
10
  print "Access: #{mount.access?}\n\n"
11
11
  end
12
12
 
@@ -27,4 +27,4 @@ end
27
27
 
28
28
  #print "Error 1 was a #{result[0][:error].class.to_s} with the message: #{result[0][:error].message.to_s}\n"
29
29
 
30
- Knj::Php.print_r(result)
30
+ Php4r.print_r(result)
@@ -140,6 +140,11 @@ class Knj::Unix_proc
140
140
  Process.kill(9, @data["pid"].to_i)
141
141
  end
142
142
 
143
+ #Hash-compatible.
144
+ def to_h
145
+ return @data.clone
146
+ end
147
+
143
148
  #Tries to kill the process gently, waits a couple of secs to check if the process is actually dead, then sends -9 kill signals.
144
149
  def kill_ensure(args = {})
145
150
  begin
@@ -1,3 +1,5 @@
1
+ require "php4r"
2
+
1
3
  class Knj::Web
2
4
  #Parses URI and returns hash with data.
3
5
  def self.parse_uri(str)
@@ -128,7 +130,7 @@ class Knj::Web
128
130
  secname = try.to_s
129
131
  end
130
132
 
131
- secname = secname.to_sym if args[:syms] and secname.is_a?(String) and !Knj::Php.is_numeric(secname)
133
+ secname = secname.to_sym if args[:syms] and secname.is_a?(String) and !Php4r.is_numeric(secname)
132
134
  return [secname, secname_empty]
133
135
  end
134
136
 
@@ -179,12 +181,12 @@ class Knj::Web
179
181
  #Header way
180
182
  if !@alert_sent
181
183
  if args[:perm]
182
- Knj::Php.header("Status: 301 Moved Permanently")
184
+ Php4r.header("Status: 301 Moved Permanently")
183
185
  else
184
- Knj::Php.header("Status: 303 See Other")
186
+ Php4r.header("Status: 303 See Other")
185
187
  end
186
188
 
187
- Knj::Php.header("Location: #{string}")
189
+ Php4r.header("Location: #{string}")
188
190
  end
189
191
 
190
192
  print "<script type=\"text/javascript\">location.href=\"#{string}\";</script>" if do_js
@@ -285,7 +287,7 @@ class Knj::Web
285
287
  if cback.is_a?(Method)
286
288
  value = cback.call(value)
287
289
  elsif cback.is_a?(Array)
288
- value = Knj::Php.call_user_func(args[:value_func], value)
290
+ value = Php4r.call_user_func(args[:value_func], value)
289
291
  elsif cback.is_a?(Proc)
290
292
  value = cback.call(value)
291
293
  else
@@ -378,7 +380,7 @@ class Knj::Web
378
380
 
379
381
  if args[:type] == :textarea
380
382
  if args.key?(:height)
381
- if Knj::Php.is_numeric(args[:height])
383
+ if Php4r.is_numeric(args[:height])
382
384
  css["height"] = "#{args[:height]}px"
383
385
  else
384
386
  css["height"] = args[:height]
@@ -438,7 +440,7 @@ class Knj::Web
438
440
  elsif args[:type] == :textshow or args[:type] == :info
439
441
  html << value.to_s
440
442
  elsif args[:type] == :plain
441
- html << "#{Knj::Php.nl2br(Knj::Web.html(value))}"
443
+ html << "#{Php4r.nl2br(Knj::Web.html(value))}"
442
444
  elsif args[:type] == :editarea
443
445
  css["width"] = "100%"
444
446
  css["height"] = args[:height] if args.key?(:height)
@@ -456,7 +458,7 @@ class Knj::Web
456
458
 
457
459
  html << "<script type=\"text/javascript\">"
458
460
  html << "function knj_web_init_#{args[:name]}(){"
459
- html << "editAreaLoader.init(#{Knj::Php.json_encode(jshash)});"
461
+ html << "editAreaLoader.init(#{Php4r.json_encode(jshash)});"
460
462
  html << "}"
461
463
  html << "</script>"
462
464
  elsif args[:type] == :numeric
@@ -824,7 +826,7 @@ class Knj::Web
824
826
  def self.html_args(h)
825
827
  str = ""
826
828
  h.each do |key, val|
827
- str << "&#{Knj::Php.urlencode(key)}=#{Knj::Php.urlencode(val)}"
829
+ str << "&#{Php4r.urlencode(key)}=#{Php4r.urlencode(val)}"
828
830
  end
829
831
 
830
832
  return str
@@ -4,7 +4,7 @@ describe "Cmd_parser" do
4
4
  it "should be able to parse various strings" do
5
5
  require "knjrbfw"
6
6
  require "knj/cmd_parser"
7
- require "knj/php"
7
+ require "php4r"
8
8
 
9
9
  strs = [
10
10
  "-rw-r--r-- 1 admin administ 186.3M Aug 30 18:09 b4u_synoptik_2011_08_30_17_57_32.sql.gz\n",
@@ -18,7 +18,7 @@ describe "Cmd_parser" do
18
18
  res = Knj::Cmd_parser.lsl(str)
19
19
 
20
20
  res.each do |file|
21
- raise "Byte was not numeric in: '#{str}'." if !Knj::Php.is_numeric(file[:size])
21
+ raise "Byte was not numeric in: '#{str}'." if !Php4r.is_numeric(file[:size])
22
22
  end
23
23
  end
24
24
  end
@@ -108,6 +108,6 @@ describe "Process" do
108
108
  end
109
109
 
110
110
  #this can be used for debugging.
111
- #Knj::Php.print_r(results)
111
+ #Php4r.print_r(results)
112
112
  end
113
113
  end
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "Web" do
4
4
  it "should be able to parse url and generate hashes" do
5
- require "knj/php"
5
+ require "php4r"
6
6
  require "knj/web"
7
7
 
8
8
  url = "first=test&#{Knj::Web.urlenc("second[trala][]")}=1&#{Knj::Web.urlenc("second[trala][]")}=2&#{Knj::Web.urlenc("second[trala][]")}=3"
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: knjrbfw
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.72
5
+ version: 0.0.74
6
6
  platform: ruby
7
7
  authors:
8
8
  - Kasper Johansen
@@ -58,8 +58,19 @@ dependencies:
58
58
  prerelease: false
59
59
  version_requirements: *id004
60
60
  - !ruby/object:Gem::Dependency
61
- name: rspec
61
+ name: php4r
62
62
  requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ requirement: &id006 !ruby/object:Gem::Requirement
63
74
  none: false
64
75
  requirements:
65
76
  - - ~>
@@ -67,10 +78,10 @@ dependencies:
67
78
  version: 2.3.0
68
79
  type: :development
69
80
  prerelease: false
70
- version_requirements: *id005
81
+ version_requirements: *id006
71
82
  - !ruby/object:Gem::Dependency
72
83
  name: bundler
73
- requirement: &id006 !ruby/object:Gem::Requirement
84
+ requirement: &id007 !ruby/object:Gem::Requirement
74
85
  none: false
75
86
  requirements:
76
87
  - - ">="
@@ -78,10 +89,10 @@ dependencies:
78
89
  version: 1.0.0
79
90
  type: :development
80
91
  prerelease: false
81
- version_requirements: *id006
92
+ version_requirements: *id007
82
93
  - !ruby/object:Gem::Dependency
83
94
  name: jeweler
84
- requirement: &id007 !ruby/object:Gem::Requirement
95
+ requirement: &id008 !ruby/object:Gem::Requirement
85
96
  none: false
86
97
  requirements:
87
98
  - - ~>
@@ -89,10 +100,10 @@ dependencies:
89
100
  version: 1.6.3
90
101
  type: :development
91
102
  prerelease: false
92
- version_requirements: *id007
103
+ version_requirements: *id008
93
104
  - !ruby/object:Gem::Dependency
94
105
  name: sqlite3
95
- requirement: &id008 !ruby/object:Gem::Requirement
106
+ requirement: &id009 !ruby/object:Gem::Requirement
96
107
  none: false
97
108
  requirements:
98
109
  - - ">="
@@ -100,10 +111,10 @@ dependencies:
100
111
  version: "0"
101
112
  type: :development
102
113
  prerelease: false
103
- version_requirements: *id008
114
+ version_requirements: *id009
104
115
  - !ruby/object:Gem::Dependency
105
116
  name: rmagick
106
- requirement: &id009 !ruby/object:Gem::Requirement
117
+ requirement: &id010 !ruby/object:Gem::Requirement
107
118
  none: false
108
119
  requirements:
109
120
  - - ">="
@@ -111,7 +122,7 @@ dependencies:
111
122
  version: "0"
112
123
  type: :development
113
124
  prerelease: false
114
- version_requirements: *id009
125
+ version_requirements: *id010
115
126
  description: Including stuff for HTTP, SSH and much more.
116
127
  email: k@spernj.org
117
128
  executables: []
@@ -303,7 +314,6 @@ files:
303
314
  - lib/knj/objects/objects_sqlhelper.rb
304
315
  - lib/knj/opts.rb
305
316
  - lib/knj/os.rb
306
- - lib/knj/php.rb
307
317
  - lib/knj/php_parser/arguments.rb
308
318
  - lib/knj/php_parser/functions.rb
309
319
  - lib/knj/php_parser/php_parser.rb
@@ -364,7 +374,6 @@ files:
364
374
  - spec/db_spec_encoding_test_file.txt
365
375
  - spec/knjrbfw_spec.rb
366
376
  - spec/objects_spec.rb
367
- - spec/php_spec.rb
368
377
  - spec/process_meta_spec.rb
369
378
  - spec/process_spec.rb
370
379
  - spec/spec_helper.rb
@@ -385,7 +394,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
385
394
  requirements:
386
395
  - - ">="
387
396
  - !ruby/object:Gem::Version
388
- hash: 1397295611010009906
397
+ hash: -1092444068000497155
389
398
  segments:
390
399
  - 0
391
400
  version: "0"
@@ -1,978 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Knj::Php
4
- def is_numeric(n) Float n rescue false end
5
-
6
- def call_user_func(*paras)
7
- if paras[0].is_a?(String)
8
- send_paras = [paras[0].to_sym]
9
- send_paras << paras[1] if paras[1]
10
- send(*send_paras)
11
- elsif paras[0].is_a?(Array)
12
- send_paras = [paras[0][1].to_sym]
13
- send_paras << paras[1] if paras[1]
14
- paras[0][0].send(*send_paras)
15
- else
16
- raise "Unknown user-func: '#{paras[0].class.name}'."
17
- end
18
- end
19
-
20
- def method_exists(obj, method_name)
21
- return obj.respond_to?(method_name.to_s)
22
- end
23
-
24
- def is_a(obj, classname)
25
- classname = classname.to_s
26
- classname = "#{classname[0..0].upcase}#{classname[1..999]}"
27
-
28
- if obj.is_a?(classname)
29
- return true
30
- end
31
-
32
- return false
33
- end
34
-
35
- def print_r(argument, ret = false, count = 1)
36
- retstr = ""
37
- cstr = argument.class.to_s
38
- supercl = argument.class.superclass
39
- superstr = supercl.to_s if supercl
40
-
41
- valids = ["Apache::Table", "CGI", "Hash", "Knj::Datarow", "Knj::Datarow_custom", "Knj::Db_row", "Knj::Hash_methods", "Knjappserver::Session_accessor", "SQLite3::ResultSet::HashWithTypes"]
42
-
43
- if Knj::Strings.is_a?(argument, valids) or argument.respond_to?(:to_hash)
44
- if argument.respond_to?(:to_hash)
45
- argument_use = argument.to_hash
46
- else
47
- argument_use = argument
48
- end
49
-
50
- retstr << "#{argument.class.name}{\n"
51
- argument_use.each do |pair|
52
- i = 0
53
- while(i < count)
54
- retstr << " "
55
- i += 1
56
- end
57
-
58
- if pair[0].is_a?(Symbol)
59
- keystr = ":#{pair[0].to_s}"
60
- else
61
- keystr = pair[0].to_s
62
- end
63
-
64
- retstr << "[#{keystr}] => "
65
- retstr << Knj::Php.print_r(pair[1], true, count + 1).to_s
66
- end
67
-
68
- i = 0
69
- while(i < count - 1)
70
- retstr << " "
71
- i += 1
72
- end
73
-
74
- retstr << "}\n"
75
- elsif cstr == "Dictionary"
76
- retstr << "#{argument.class.name}{\n"
77
- argument.each do |key, val|
78
- i = 0
79
- while(i < count)
80
- retstr << " "
81
- i += 1
82
- end
83
-
84
- if key.is_a?(Symbol)
85
- keystr = ":#{key.to_s}"
86
- else
87
- keystr = key.to_s
88
- end
89
-
90
- retstr << "[#{keystr}] => "
91
- retstr << Knj::Php.print_r(val, true, count + 1).to_s
92
- end
93
-
94
- i = 0
95
- while(i < count - 1)
96
- retstr << " "
97
- i += 1
98
- end
99
-
100
- retstr << "}\n"
101
- elsif argument.is_a?(MatchData) or argument.is_a?(Array) or cstr == "Array" or supercl.is_a?(Array)
102
- retstr << "#{argument.class.name}{\n"
103
-
104
- arr_count = 0
105
- argument.to_a.each do |i|
106
- i_spaces = 0
107
- while(i_spaces < count)
108
- retstr << " "
109
- i_spaces += 1
110
- end
111
-
112
- retstr << "[#{arr_count}] => "
113
- retstr << Knj::Php.print_r(i, true, count + 1).to_s
114
- arr_count += 1
115
- end
116
-
117
- i_spaces = 0
118
- while(i_spaces < count - 1)
119
- retstr << " "
120
- i_spaces += 1
121
- end
122
-
123
- retstr << "}\n"
124
- elsif cstr == "WEBrick::HTTPUtils::FormData"
125
- retstr << "{#{argument.class.to_s}}"
126
- elsif argument.is_a?(String) or argument.is_a?(Integer) or argument.is_a?(Fixnum) or argument.is_a?(Float)
127
- retstr << argument.to_s + "\n"
128
- elsif argument.is_a?(Symbol)
129
- retstr << ":#{argument.to_s}\n"
130
- elsif argument.is_a?(Exception)
131
- retstr << "#\{#{argument.class.to_s}: #{argument.message}}\n"
132
- elsif cstr == "Knj::Unix_proc"
133
- retstr << "#{argument.class.name}::data - "
134
- retstr << Knj::Php.print_r(argument.data, true, count).to_s
135
- elsif cstr == "Thread"
136
- retstr << "#{argument.class.name} - "
137
-
138
- hash = {}
139
- argument.keys.each do |key|
140
- hash[key] = argument[key]
141
- end
142
-
143
- retstr << Knj::Php.print_r(hash, true, count).to_s
144
- elsif cstr == "Class"
145
- retstr << "#{argument.class.to_s} - "
146
- hash = {"name" => argument.name}
147
- retstr << Knj::Php.print_r(hash, true, count).to_s
148
- elsif cstr == "URI::Generic"
149
- retstr << "#{argument.class.to_s}{\n"
150
- methods = [:host, :port, :scheme, :path]
151
- count += 1
152
- methods.each do |method|
153
- i_spaces = 0
154
- while(i_spaces < count - 1)
155
- retstr << " "
156
- i_spaces += 1
157
- end
158
-
159
- retstr << "#{method}: #{argument.send(method)}\n"
160
- end
161
-
162
- count -= 1
163
-
164
- i = 0
165
- while(i < count - 1)
166
- retstr << " "
167
- i += 1
168
- end
169
-
170
- retstr << "}\n"
171
- elsif cstr == "Time" or cstr == "Datet"
172
- argument = argument.time if cstr == "Datet"
173
- retstr << "#{cstr}::#{"%04d" % argument.year}-#{"%02d" % argument.month}-#{"%02d" % argument.day} #{"%02d" % argument.hour}:#{"%02d" % argument.min}:#{"%02d" % argument.sec}\n"
174
- else
175
- #print argument.to_s, "\n"
176
- retstr << "Unknown class: '#{cstr}' with superclass '#{supercl}'.\n"
177
- end
178
-
179
- if ret.is_a?(TrueClass)
180
- return retstr
181
- else
182
- print retstr
183
- end
184
- end
185
-
186
- def gtext(string)
187
- return GetText._(string)
188
- end
189
-
190
- def gettext(string)
191
- return GetText._(string)
192
- end
193
-
194
- #Returns the number as a formatted string.
195
- def number_format(number, precision = 2, seperator = ".", delimiter = ",")
196
- number = number.to_f if !number.is_a?(Float)
197
- precision = precision.to_i
198
- return sprintf("%.#{precision.to_s}f", number).gsub(".", seperator) if number < 1 and number > -1
199
-
200
- number = sprintf("%.#{precision.to_s}f", number).split(".")
201
-
202
- str = ""
203
- number[0].reverse.scan(/(.{1,3})/) do |match|
204
- if match[0] == "-"
205
- #This happens if the number is a negative number and we have reaches the minus-sign.
206
- str << match[0]
207
- else
208
- str << delimiter if str.length > 0
209
- str << match[0]
210
- end
211
- end
212
-
213
- str = str.reverse
214
- if precision > 0
215
- str << "#{seperator}#{number[1]}"
216
- end
217
-
218
- return str
219
- end
220
-
221
- def ucwords(string)
222
- return string.to_s.split(" ").select{|w| w.capitalize! or w }.join(" ")
223
- end
224
-
225
- def strtoupper(str)
226
- return str.to_s.upcase
227
- end
228
-
229
- def strtolower(str)
230
- return str.to_s.downcase
231
- end
232
-
233
- def htmlspecialchars(string)
234
- return Knj::Web.html(string)
235
- end
236
-
237
- def http_build_query(obj)
238
- return self.http_build_query_rec("", obj)
239
- end
240
-
241
- def http_build_query_rec(orig_key, obj, first = true)
242
- url = ""
243
- first_ele = true
244
-
245
- if obj.is_a?(Array)
246
- ele_count = 0
247
-
248
- obj.each do |val|
249
- orig_key_str = "#{orig_key}[#{ele_count}]"
250
- val = "#<Model::#{val.table}::#{val.id}>" if val.respond_to?("is_knj?")
251
-
252
- if val.is_a?(Hash) or val.is_a?(Array)
253
- url << self.http_build_query_rec(orig_key_str, val, false)
254
- else
255
- url << "&" if !first or !first_ele
256
- url << "#{Knj::Web.urlenc(orig_key_str)}=#{Knj::Web.urlenc(val)}"
257
- end
258
-
259
- first_ele = false if first_ele
260
- ele_count += 1
261
- end
262
- elsif obj.is_a?(Hash)
263
- obj.each do |key, val|
264
- if first
265
- orig_key_str = key
266
- else
267
- orig_key_str = "#{orig_key}[#{key}]"
268
- end
269
-
270
- val = "#<Model::#{val.table}::#{val.id}>" if val.respond_to?("is_knj?")
271
-
272
- if val.is_a?(Hash) or val.is_a?(Array)
273
- url << self.http_build_query_rec(orig_key_str, val, false)
274
- else
275
- url << "&" if !first or !first_ele
276
- url << "#{Knj::Web.urlenc(orig_key_str)}=#{Knj::Web.urlenc(val)}"
277
- end
278
-
279
- first_ele = false if first_ele
280
- end
281
- else
282
- raise "Unknown class: '#{obj.class.name}'."
283
- end
284
-
285
- return url
286
- end
287
-
288
- def isset(var)
289
- return false if var == nil or var == false
290
- return true
291
- end
292
-
293
- def strpos(haystack, needle)
294
- return false if !haystack
295
- return false if !haystack.to_s.include?(needle)
296
- return haystack.index(needle)
297
- end
298
-
299
- def substr(string, from, to = nil)
300
- #If 'to' is not given it should be the total length of the string.
301
- if to == nil
302
- to = string.length
303
- end
304
-
305
- #The behaviour with a negative 'to' is not the same as in PHP. Hack it!
306
- if to < 0
307
- to = string.length + to
308
- end
309
-
310
- #Cut the string.
311
- string = "#{string[from.to_i, to.to_i]}"
312
-
313
- #Sometimes the encoding will no longer be valid. Fix that if that is the case.
314
- if !string.valid_encoding? and Knj::Php.class_exists("Iconv")
315
- string = Iconv.conv("UTF-8//IGNORE", "UTF-8", "#{string} ")[0..-2]
316
- end
317
-
318
- #Return the cut string.
319
- return string
320
- end
321
-
322
- def md5(string)
323
- require "digest"
324
- return Digest::MD5.hexdigest(string.to_s)
325
- end
326
-
327
- def header(headerstr)
328
- match = headerstr.to_s.match(/(.*): (.*)/)
329
- if match
330
- key = match[1]
331
- value = match[2]
332
- else
333
- #HTTP/1.1 404 Not Found
334
-
335
- match_status = headerstr.to_s.match(/^HTTP\/[0-9\.]+ ([0-9]+) (.+)$/)
336
- if match_status
337
- key = "Status"
338
- value = match_status[1] + " " + match_status[2]
339
- else
340
- raise "Couldnt parse header."
341
- end
342
- end
343
-
344
- _kas.header(key, value) #This is for knjAppServer - knj.
345
- return true
346
- end
347
-
348
- def nl2br(string)
349
- return string.to_s.gsub("\n", "<br />\n")
350
- end
351
-
352
- def urldecode(string)
353
- return Knj::Web.urldec(string)
354
- end
355
-
356
- def urlencode(string)
357
- return Knj::Web.urlenc(string)
358
- end
359
-
360
- def parse_str(str, hash)
361
- res = Knj::Web.parse_urlquery(str, {:urldecode => true})
362
- res.each do |key, val|
363
- hash[key] = val
364
- end
365
- end
366
-
367
- def file_put_contents(filepath, content)
368
- File.open(filepath.untaint, "w") do |file|
369
- file.write(content)
370
- end
371
- end
372
-
373
- def file_get_contents(filepath)
374
- filepath = filepath.to_s
375
-
376
- if http_match = filepath.match(/^http(s|):\/\/([A-z_\d\.]+)(|:(\d+))(\/(.+))$/)
377
- port = http_match[4].to_i if http_match[4].to_s.length > 0
378
-
379
- args = {
380
- :host => http_match[2]
381
- }
382
-
383
- if http_match[1] == "s"
384
- args[:ssl] = true
385
- args[:validate] = false
386
-
387
- if !port
388
- port = 443
389
- end
390
- end
391
-
392
- args[:port] = port if port
393
-
394
- require "http2"
395
- Http2.new(args) do |http|
396
- return http.get(http_match[5]).body
397
- end
398
- end
399
-
400
- return File.read(filepath.untaint)
401
- end
402
-
403
- def is_file(filepath)
404
- begin
405
- if File.file?(filepath)
406
- return true
407
- end
408
- rescue
409
- return false
410
- end
411
-
412
- return false
413
- end
414
-
415
- def is_dir(filepath)
416
- begin
417
- return true if File.directory?(filepath)
418
- rescue
419
- return false
420
- end
421
-
422
- return false
423
- end
424
-
425
- def unlink(filepath)
426
- FileUtils.rm(filepath)
427
- end
428
-
429
- def file_exists(filepath)
430
- return true if File.exists?(filepath.to_s.untaint)
431
- return false
432
- end
433
-
434
- def strtotime(date_string, cur = nil)
435
- if !cur
436
- cur = Time.new
437
- else
438
- cur = Time.at(cur)
439
- end
440
-
441
- date_string = date_string.to_s.downcase
442
-
443
- if date_string.match(/[0-9]+-[0-9]+-[0-9]+/i)
444
- begin
445
- return Time.local(*ParseDate.parsedate(date_string)).to_i
446
- rescue
447
- return 0
448
- end
449
- end
450
-
451
- date_string.scan(/((\+|-)([0-9]+) (\S+))/) do |match|
452
- timestr = match[3]
453
- number = match[2].to_i
454
- mathval = match[1]
455
- add = nil
456
-
457
- if timestr == "years" or timestr == "year"
458
- add = ((number.to_i * 3600) * 24) * 365
459
- elsif timestr == "months" or timestr == "month"
460
- add = ((number.to_i * 3600) * 24) * 30
461
- elsif timestr == "weeks" or timestr == "week"
462
- add = (number.to_i * 3600) * 24 * 7
463
- elsif timestr == "days" or timestr == "day"
464
- add = (number.to_i * 3600) * 24
465
- elsif timestr == "hours" or timestr == "hour"
466
- add = number.to_i * 3600
467
- elsif timestr == "minutes" or timestr == "minute" or timestr == "min" or timestr == "mints"
468
- add = number.to_i * 60
469
- elsif timestr == "seconds" or timestr == "second" or timestr == "sec" or timestr == "secs"
470
- add = number.to_i
471
- end
472
-
473
- if mathval == "+"
474
- cur += add
475
- elsif mathval == "-"
476
- cur -= add
477
- end
478
- end
479
-
480
- return cur.to_i
481
- end
482
-
483
- def class_exists(classname)
484
- begin
485
- Kernel.const_get(classname)
486
- return true
487
- rescue
488
- return false
489
- end
490
- end
491
-
492
- def html_entity_decode(string)
493
- string = Knj::Web.html(string)
494
- string = string.gsub("&oslash;", "ø").gsub("&aelig;", "æ").gsub("&aring;", "å").gsub("&euro;", "€").gsub("#39;", "'").gsub("&amp;", "&").gsub("&gt;", ">").gsub("&lt;", "<").gsub("&quot;", '"').gsub("&#039;", "'")
495
- return string
496
- end
497
-
498
- def strip_tags(htmlstr)
499
- htmlstr.scan(/(<([\/A-z]+).*?>)/) do |match|
500
- htmlstr = htmlstr.gsub(match[0], "")
501
- end
502
-
503
- return htmlstr.gsub("&nbsp;", " ")
504
- end
505
-
506
- def die(msg)
507
- print msg
508
- exit
509
- end
510
-
511
- def opendir(dirpath)
512
- res = {:files => [], :index => 0}
513
- Dir.foreach(dirpath) do |file|
514
- res[:files] << file
515
- end
516
-
517
- return res
518
- end
519
-
520
- def readdir(res)
521
- ret = res[:files][res[:index]] if res[:files].index(res[:index]) != nil
522
- return false if !ret
523
- res[:index] += 1
524
- return ret
525
- end
526
-
527
- def fopen(filename, mode)
528
- begin
529
- return File.open(filename, mode)
530
- rescue
531
- return false
532
- end
533
- end
534
-
535
- def fwrite(fp, str)
536
- begin
537
- fp.print str
538
- rescue
539
- return false
540
- end
541
-
542
- return true
543
- end
544
-
545
- def fputs(fp, str)
546
- begin
547
- fp.print str
548
- rescue
549
- return false
550
- end
551
-
552
- return true
553
- end
554
-
555
- def fread(fp, length = 4096)
556
- return fp.read(length)
557
- end
558
-
559
- def fgets(fp, length = 4096)
560
- return fp.read(length)
561
- end
562
-
563
- def fclose(fp)
564
- fp.close
565
- end
566
-
567
- def move_uploaded_file(tmp_path, new_path)
568
- FileUtils.mv(tmp_path.untaint, new_path.untaint)
569
- end
570
-
571
- def utf8_encode(str)
572
- str = str.to_s if str.respond_to?("to_s")
573
-
574
- if str.respond_to?("encode")
575
- begin
576
- return str.encode("iso-8859-1", "utf-8")
577
- rescue Encoding::InvalidByteSequenceError
578
- #ignore - try iconv
579
- end
580
- end
581
-
582
- require "iconv"
583
-
584
- begin
585
- return Iconv.conv("iso-8859-1", "utf-8", str.to_s)
586
- rescue
587
- return Iconv.conv("iso-8859-1//ignore", "utf-8", "#{str} ").slice(0..-2)
588
- end
589
- end
590
-
591
- def utf8_decode(str)
592
- str = str.to_s if str.respond_to?(:to_s)
593
- require "iconv" if RUBY_PLATFORM == "java" #This fixes a bug in JRuby where Iconv otherwise would not be detected.
594
-
595
- if str.respond_to?(:encode)
596
- begin
597
- return str.encode("utf-8", "iso-8859-1")
598
- rescue Encoding::InvalidByteSequenceError
599
- #ignore - try iconv
600
- end
601
- end
602
-
603
- require "iconv"
604
-
605
- begin
606
- return Iconv.conv("utf-8", "iso-8859-1", str.to_s)
607
- rescue
608
- return Iconv.conv("utf-8//ignore", "iso-8859-1", str.to_s)
609
- end
610
- end
611
-
612
- def setcookie(cname, cvalue, expire = nil, domain = nil)
613
- args = {
614
- "name" => cname,
615
- "value" => cvalue,
616
- "path" => "/"
617
- }
618
- args["expires"] = Time.at(expire) if expire
619
- args["domain"] = domain if domain
620
-
621
- _kas.cookie(args)
622
- return status
623
- end
624
-
625
- #This method is only here for convertion support - it doesnt do anything.
626
- def session_start
627
-
628
- end
629
-
630
- def explode(expl, strexp)
631
- return strexp.to_s.split(expl)
632
- end
633
-
634
- def dirname(filename)
635
- File.dirname(filename)
636
- end
637
-
638
- def chdir(dirname)
639
- Dir.chdir(dirname)
640
- end
641
-
642
- def include_once(filename)
643
- require filename
644
- end
645
-
646
- def require_once(filename)
647
- require filename
648
- end
649
-
650
- def echo(string)
651
- print string
652
- end
653
-
654
- def msgbox(title, msg, type)
655
- Knj::Gtk2.msgbox(msg, type, title)
656
- end
657
-
658
- def count(array)
659
- return array.length
660
- end
661
-
662
- def json_encode(obj)
663
- if Knj::Php.class_exists("Rho")
664
- return Rho::JSON.generate(obj)
665
- elsif Knj::Php.class_exists("JSON")
666
- return JSON.generate(obj)
667
- else
668
- raise "Could not figure out which JSON lib to use."
669
- end
670
- end
671
-
672
- def json_decode(data, as_array = false)
673
- #FIXME: Should be able to return as object, which will break all projects using it without second argument...
674
-
675
- raise "String was not given to 'Knj::Php.json_decode'." if !data.is_a?(String)
676
-
677
- if Knj::Php.class_exists("Rho")
678
- return Rho::JSON.parse(data)
679
- elsif Knj::Php.class_exists("JSON")
680
- return JSON.parse(data)
681
- else
682
- raise "Could not figure out which JSON lib to use."
683
- end
684
- end
685
-
686
- def time
687
- return Time.now.to_i
688
- end
689
-
690
- def microtime(get_as_float = false)
691
- microtime = Time.now.to_f
692
-
693
- return microtime if get_as_float
694
-
695
- splitted = microtime.to_s.split(",")
696
- return "#{splitted[0]} #{splitted[1]}"
697
- end
698
-
699
- def mktime(hour = nil, min = nil, sec = nil, date = nil, month = nil, year = nil, is_dst = -1)
700
- cur_time = Time.new
701
-
702
- hour = cur_time.hour if hour == nil
703
- min = cur_time.min if min == nil
704
- sec = cur_time.sec if sec == nil
705
- date = cur_time.day if date == nil
706
- month = cur_time.month if month == nil
707
- year = cur_time.year if year == nil
708
-
709
- new_time = Datet.in("#{year.to_s}-#{month.to_s}-#{date.to_s} #{hour.to_s}:#{min.to_s}:#{sec.to_s}")
710
- return new_time.to_i
711
- end
712
-
713
- def date(date_format, date_input = nil)
714
- if date_input == nil
715
- date_object = Time.now
716
- elsif Knj::Php.is_numeric(date_input)
717
- date_object = Time.at(date_input.to_i)
718
- elsif date_input.is_a?(Datet)
719
- date_object = date_input.time
720
- elsif date_input.is_a?(Time)
721
- date_object = date_input
722
- else
723
- raise "Unknown date given: '#{date_input}', '#{date_input.class.name}'."
724
- end
725
-
726
- date_format = date_format.gsub("Y", "%Y").gsub("y", "%y").gsub("m", "%m").gsub("d", "%d").gsub("H", "%H").gsub("i", "%M").gsub("s", "%S")
727
- return date_object.strftime(date_format)
728
- end
729
-
730
- def basename(filepath)
731
- splitted = filepath.to_s.split("/").last
732
- return false if !splitted
733
-
734
- ret = splitted.split(".")
735
- ret.delete(ret.last)
736
- return ret.join(".")
737
- end
738
-
739
- def base64_encode(str)
740
- #The strict-encode wont do corrupt newlines...
741
- if Base64.respond_to?("strict_encode64")
742
- return Base64.strict_encode64(str.to_s)
743
- else
744
- return Base64.encode64(str.to_s)
745
- end
746
- end
747
-
748
- def base64_decode(str)
749
- return Base64.decode64(str.to_s)
750
- end
751
-
752
- def pathinfo(filepath)
753
- filepath = filepath.to_s
754
-
755
- dirname = File.dirname(filepath)
756
- dirname = "" if dirname == "."
757
-
758
- return {
759
- "dirname" => dirname,
760
- "basename" => self.basename(filepath),
761
- "extension" => filepath.split(".").last,
762
- "filename" => filepath.split("/").last
763
- }
764
- end
765
-
766
- def realpath(pname)
767
- require "pathname"
768
-
769
- begin
770
- return Pathname.new(pname.to_s).realpath.to_s
771
- rescue => e
772
- return false
773
- end
774
- end
775
-
776
- # Returns the scripts current memory usage.
777
- def memory_get_usage
778
- # FIXME: This only works on Linux at the moment, since we are doing this by command line - knj.
779
- memory_usage = `ps -o rss= -p #{Process.pid}`.to_i * 1024
780
- return memory_usage
781
- end
782
-
783
- # Should return the peak usage of the running script, but I have found no way to detect this... Instead returns the currently memory usage.
784
- def memory_get_peak_usage
785
- return self.memory_get_usage
786
- end
787
-
788
- def ip2long(ip)
789
- return IPAddr.new(ip).to_i
790
- end
791
-
792
- # Execute an external program and display raw output.
793
- def passthru(cmd)
794
- if RUBY_ENGINE == "jruby"
795
- IO.popen4(cmd) do |pid, stdin, stdout, stderr|
796
- tout = Thread.new do
797
- begin
798
- stdout.sync = true
799
- stdout.each do |str|
800
- $stdout.print str
801
- end
802
- rescue => e
803
- $stdout.print Knj::Errors.error_str(e)
804
- end
805
- end
806
-
807
- terr = Thread.new do
808
- begin
809
- stderr.sync = true
810
- stderr.each do |str|
811
- $stderr.print str
812
- end
813
- rescue => e
814
- $stderr.print Knj::Errors.error_str(e)
815
- end
816
- end
817
-
818
- tout.join
819
- terr.join
820
- end
821
- else
822
- require "open3"
823
- Open3.popen3(cmd) do |stdin, stdout, stderr|
824
- tout = Thread.new do
825
- begin
826
- stdout.sync = true
827
- stdout.each do |str|
828
- $stdout.print str
829
- end
830
- rescue => e
831
- $stdout.print Knj::Errors.error_str(e)
832
- end
833
- end
834
-
835
- terr = Thread.new do
836
- begin
837
- stderr.sync = true
838
- stderr.each do |str|
839
- $stderr.print str
840
- end
841
- rescue => e
842
- $stderr.print Knj::Errors.error_str(e)
843
- end
844
- end
845
-
846
- tout.join
847
- terr.join
848
- end
849
- end
850
-
851
- return nil
852
- end
853
-
854
- # Thanks to this link for the following functions: http://snippets.dzone.com/posts/show/4509
855
- def long2ip(long)
856
- ip = []
857
- 4.times do |i|
858
- ip.push(long.to_i & 255)
859
- long = long.to_i >> 8
860
- end
861
-
862
- ip.reverse.join(".")
863
- end
864
-
865
- def gzcompress(str, level = 3)
866
- require "zlib"
867
-
868
- zstream = Zlib::Deflate.new
869
- gzip_str = zstream.deflate(str.to_s, Zlib::FINISH)
870
- zstream.close
871
-
872
- return gzip_str
873
- end
874
-
875
- def gzuncompress(str, length = 0)
876
- require "zlib"
877
-
878
- zstream = Zlib::Inflate.new
879
- plain_str = zstream.inflate(str.to_s)
880
- zstream.finish
881
- zstream.close
882
-
883
- return plain_str.to_s
884
- end
885
-
886
- #Sort methods.
887
- def ksort(hash)
888
- nhash = hash.sort do |a, b|
889
- a[0] <=> b[0]
890
- end
891
-
892
- newhash = {}
893
- nhash.each do |val|
894
- newhash[val[0]] = val[1][0]
895
- end
896
-
897
- return newhash
898
- end
899
-
900
- #Foreach emulator.
901
- def foreach(element, &block)
902
- raise "No or unsupported block given." if !block.respond_to?(:call) or !block.respond_to?(:arity)
903
- arity = block.arity
904
- cname = element.class.name.to_s
905
-
906
- if element.is_a?(Array) or cname == "Array_enumerator"
907
- element.each_index do |key|
908
- if arity == 2
909
- block.call(key, element[key])
910
- elsif arity == 1
911
- block.call(element[key])
912
- else
913
- raise "Unknown arity: '#{arity}'."
914
- end
915
- end
916
- elsif element.is_a?(Hash)
917
- element.each do |key, val|
918
- if arity == 2
919
- block.call(key, val)
920
- elsif arity == 1
921
- block.call(val)
922
- else
923
- raise "Unknown arity: '#{arity}'."
924
- end
925
- end
926
- else
927
- raise "Unknown element: '#{element.class.name}'."
928
- end
929
- end
930
-
931
- #Array-function emulator.
932
- def array(*ele)
933
- return {} if ele.length <= 0
934
-
935
- if ele.length == 1 and ele.first.is_a?(Hash)
936
- return ele.first
937
- end
938
-
939
- return ele
940
- end
941
-
942
- def array_key_exists(key, arr)
943
- if arr.is_a?(Hash)
944
- return arr.key?(key)
945
- elsif arr.is_a?(Array)
946
- return true if arr.index(key) != nil
947
- return false
948
- else
949
- raise "Unknown type of argument: '#{arr.class.name}'."
950
- end
951
- end
952
-
953
- def empty(obj)
954
- if obj.respond_to?("empty?")
955
- return obj.empty?
956
- elsif obj == nil
957
- return true
958
- else
959
- raise "Dont know how to handle object on 'empty': '#{obj.class.name}'."
960
- end
961
- end
962
-
963
- def trim(argument)
964
- return argument.to_s.strip
965
- end
966
-
967
- def serialize(argument)
968
- require "php_serialize" #gem: php-serialize
969
- return PHP.serialize(argument)
970
- end
971
-
972
- def unserialize(argument)
973
- require "php_serialize" #gem: php-serialize
974
- return PHP.unserialize(argument.to_s)
975
- end
976
-
977
- module_function(*instance_methods)
978
- end