knjrbfw 0.0.7 → 0.0.8

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 (65) hide show
  1. data/Gemfile +3 -1
  2. data/VERSION +1 -1
  3. data/knjrbfw.gemspec +14 -4
  4. data/lib/knj/amixer.rb +148 -0
  5. data/lib/knj/arrayext.rb +14 -5
  6. data/lib/knj/autoload.rb +63 -57
  7. data/lib/knj/autoload/backups/facets_dictionary.rb +2 -2
  8. data/lib/knj/autoload/erubis.rb +2 -0
  9. data/lib/knj/cmd_gen.rb +71 -0
  10. data/lib/knj/compiler.rb +2 -2
  11. data/lib/knj/datarow.rb +138 -38
  12. data/lib/knj/datestamp.rb +2 -2
  13. data/lib/knj/datet.rb +72 -17
  14. data/lib/knj/erb/include.rb +5 -5
  15. data/lib/knj/errors.rb +4 -1
  16. data/lib/knj/eruby.rb +25 -11
  17. data/lib/knj/event_filemod.rb +27 -26
  18. data/lib/knj/event_handler.rb +8 -8
  19. data/lib/knj/exchangerates.rb +1 -1
  20. data/lib/knj/facebook_connect.rb +37 -0
  21. data/lib/knj/gettext_threadded.rb +4 -3
  22. data/lib/knj/google_sitemap.rb +1 -1
  23. data/lib/knj/hash_methods.rb +1 -1
  24. data/lib/knj/http.rb +35 -19
  25. data/lib/knj/http2.rb +249 -0
  26. data/lib/knj/image.rb +128 -0
  27. data/lib/knj/jruby-gtk2/gtk2.rb +1 -1
  28. data/lib/knj/knj.rb +1 -1
  29. data/lib/knj/knj_controller.rb +0 -2
  30. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +3 -3
  31. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +11 -11
  32. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +2 -2
  33. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +71 -14
  34. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +17 -14
  35. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +5 -5
  36. data/lib/knj/knjdb/libknjdb.rb +33 -16
  37. data/lib/knj/knjdb/libknjdb_row.rb +8 -8
  38. data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +1 -1
  39. data/lib/knj/mount.rb +6 -6
  40. data/lib/knj/mutexcl.rb +2 -2
  41. data/lib/knj/objects.rb +286 -73
  42. data/lib/knj/opts.rb +11 -4
  43. data/lib/knj/os.rb +16 -3
  44. data/lib/knj/php.rb +73 -26
  45. data/lib/knj/php_parser/php_parser.rb +1 -77
  46. data/lib/knj/retry.rb +4 -4
  47. data/lib/knj/rhodes/rhodes.rb +106 -0
  48. data/lib/knj/sshrobot/sshrobot.rb +1 -1
  49. data/lib/knj/strings.rb +72 -0
  50. data/lib/knj/sysuser.rb +1 -1
  51. data/lib/knj/tests/test_http2.rb +18 -0
  52. data/lib/knj/thread.rb +1 -5
  53. data/lib/knj/thread2.rb +3 -3
  54. data/lib/knj/threadhandler.rb +2 -2
  55. data/lib/knj/threadpool.rb +4 -4
  56. data/lib/knj/translations.rb +2 -17
  57. data/lib/knj/unix_proc.rb +3 -3
  58. data/lib/knj/web.rb +156 -77
  59. data/lib/knj/webscripts/image.rhtml +22 -3
  60. data/lib/knj/x11vnc.rb +3 -3
  61. data/spec/amixer_spec.rb +27 -0
  62. data/spec/knjrbfw_spec.rb +70 -12
  63. data/testfiles/image.jpg +0 -0
  64. metadata +32 -14
  65. data/Gemfile.lock +0 -32
@@ -207,8 +207,8 @@ class KnjDB_mysql::Tables::Table
207
207
 
208
208
  def create_indexes(index_arr)
209
209
  index_arr.each do |index_data|
210
- raise "No name was given." if !index_data.has_key?("name") or index_data["name"].strip.length <= 0
211
- raise "No columns was given on index #{index_data["name"]}." if index_data["columns"].empty?
210
+ raise "No name was given." if !index_data.key?("name") or index_data["name"].strip.length <= 0
211
+ raise "No columns was given on index: '#{index_data["name"]}'." if !index_data["columns"] or index_data["columns"].empty?
212
212
 
213
213
  sql = "CREATE INDEX #{@db.escape_col}#{@db.esc_col(index_data["name"])}#{@db.escape_col} ON #{@db.escape_table}#{@db.esc_table(self.name)}#{@db.escape_table} ("
214
214
 
@@ -12,11 +12,23 @@ class KnjDB_sqlite3
12
12
  @knjdb = knjdb_ob
13
13
  @path = @knjdb.opts[:path] if @knjdb.opts[:path]
14
14
  @path = @knjdb.opts["path"] if @knjdb.opts["path"]
15
- @symbolize = true if !@knjdb.opts.has_key?(:return_keys) or @knjdb.opts[:return_keys] == "symbols"
15
+ @symbolize = true if !@knjdb.opts.key?(:return_keys) or @knjdb.opts[:return_keys] == "symbols"
16
16
 
17
+ @knjdb.opts[:subtype] = "java" if !@knjdb.opts.key?(:subtype) and RUBY_ENGINE == "jruby"
17
18
  raise "No path was given." if !@path
18
19
 
19
- if @knjdb.opts[:subtype] == "rhodes"
20
+ if @knjdb.opts[:subtype] == "java"
21
+ if @knjdb.opts[:sqlite_driver]
22
+ require @knjdb.opts[:sqlite_driver]
23
+ else
24
+ require "#{File.dirname(__FILE__)}/../../sqlitejdbc-v056.jar"
25
+ end
26
+
27
+ require "java"
28
+ import "org.sqlite.JDBC"
29
+ @conn = java.sql.DriverManager::getConnection("jdbc:sqlite:#{@knjdb.opts[:path]}")
30
+ @stat = @conn.createStatement
31
+ elsif @knjdb.opts[:subtype] == "rhodes"
20
32
  @conn = SQLite3::Database.new(@path, @path)
21
33
  else
22
34
  @conn = SQLite3::Database.open(@path)
@@ -28,16 +40,24 @@ class KnjDB_sqlite3
28
40
  def query(string)
29
41
  begin
30
42
  if @knjdb.opts[:subtype] == "rhodes"
31
- res = @conn.execute(string, string)
43
+ return KnjDB_sqlite3_result.new(self, @conn.execute(string, string))
44
+ elsif @knjdb.opts[:subtype] == "java"
45
+ begin
46
+ return KnjDB_sqlite3_result_java.new(self, @stat.executeQuery(string))
47
+ rescue java.sql.SQLException => e
48
+ if e.message == "java.sql.SQLException: query does not return ResultSet"
49
+ return KnjDB_sqlite3_result_java.new(self, nil)
50
+ else
51
+ raise e
52
+ end
53
+ end
32
54
  else
33
- res = @conn.execute(string)
55
+ return KnjDB_sqlite3_result.new(self, @conn.execute(string))
34
56
  end
35
- rescue Exception => e
36
- print "SQL: #{string}\n"
37
- raise e
57
+ rescue => e
58
+ #Add SQL to the error message.
59
+ raise e.class, "#{e.message}\n\nSQL: #{string}"
38
60
  end
39
-
40
- return KnjDB_sqlite3_result.new(self, res)
41
61
  end
42
62
 
43
63
  def escape(string)
@@ -65,23 +85,60 @@ class KnjDB_sqlite3
65
85
  end
66
86
  end
67
87
 
88
+ class KnjDB_sqlite3_result_java
89
+ def initialize(driver, rs)
90
+ @index = 0
91
+ retkeys = driver.knjdb.opts[:return_keys]
92
+
93
+ if rs
94
+ metadata = rs.getMetaData
95
+ columns_count = metadata.getColumnCount
96
+
97
+ @rows = []
98
+ while rs.next
99
+ row_data = {}
100
+ for i in (1..columns_count)
101
+ col_name = metadata.getColumnName(i)
102
+ col_name = col_name.to_s.to_sym if retkeys == "symbols"
103
+ row_data[col_name] = rs.getString(i)
104
+ end
105
+
106
+ @rows << row_data
107
+ end
108
+ end
109
+ end
110
+
111
+ def fetch
112
+ return false if !@rows
113
+ ret = @rows[@index]
114
+ return false if !ret
115
+ @index += 1
116
+ return ret
117
+ end
118
+ end
119
+
68
120
  class KnjDB_sqlite3_result
69
121
  def initialize(driver, result_array)
70
122
  @result_array = result_array
71
123
  @index = 0
72
- @retkeys = driver.knjdb.opts[:return_keys]
124
+
125
+ if driver.knjdb.opts[:return_keys] == "symbols"
126
+ @symbols = true
127
+ else
128
+ @symbols = false
129
+ end
73
130
  end
74
131
 
75
132
  def fetch
76
- tha_return = @result_array[@index]
77
- return false if !tha_return
133
+ result_hash = @result_array[@index]
134
+ return false if !result_hash
78
135
  @index += 1
79
136
 
80
137
  ret = {}
81
- tha_return.each do |key, val|
138
+ result_hash.each do |key, val|
82
139
  if Knj::Php::is_numeric(key)
83
140
  #do nothing.
84
- elsif @retkeys == "symbols" and !key.is_a?(Symbol)
141
+ elsif @symbols and !key.is_a?(Symbol)
85
142
  ret[key.to_sym] = val
86
143
  else
87
144
  ret[key] = val
@@ -11,23 +11,26 @@ class KnjDB_sqlite3::Columns
11
11
  raise "No type given." if !data["type"]
12
12
  type = data["type"]
13
13
 
14
- data["maxlength"] = 255 if type == "varchar" and !data.has_key?("maxlength")
14
+ if type == "enum"
15
+ type = "varchar"
16
+ data.delete("maxlength")
17
+ end
18
+
19
+ data["maxlength"] = 255 if type == "varchar" and !data.key?("maxlength")
15
20
  type = "integer" if @db.int_types.index(type) and (data["autoincr"] or data["primarykey"])
16
21
 
17
22
  sql = "`#{data["name"]}` #{type}"
18
23
  sql += "(#{data["maxlength"]})" if data["maxlength"] and !data["autoincr"]
19
- sql += "(11)" if !data.has_key?("maxlength") and !data["autoincr"]
24
+ sql += "(11)" if !data.key?("maxlength") and !data["autoincr"]
20
25
  sql += " PRIMARY KEY" if data["primarykey"]
21
- sql += " NOT NULL" if !data["null"] and data.has_key?("null")
26
+ sql += " NOT NULL" if !data["null"] and data.key?("null")
22
27
 
23
- if data.has_key?("default_func")
28
+ if data.key?("default_func")
24
29
  sql += " DEFAULT #{data["default_func"]}"
25
- elsif data.has_key?("default") and data["default"] != false
26
- sql += " DEFAULT '#{@driver.escape(data["default"])}'"
30
+ elsif data.key?("default") and data["default"] != false
31
+ sql += " DEFAULT '#{@db.escape(data["default"])}'"
27
32
  end
28
33
 
29
- sql += " COMMENT '#{@driver.escape(data["comment"])}'" if data.has_key?("comment")
30
-
31
34
  return sql
32
35
  end
33
36
  end
@@ -132,12 +135,12 @@ class KnjDB_sqlite3::Columns::Column
132
135
  def change(data)
133
136
  newdata = data.clone
134
137
 
135
- newdata["name"] = self.name if !newdata.has_key?("name")
136
- newdata["type"] = self.type if !newdata.has_key?("type")
137
- newdata["maxlength"] = self.maxlength if !newdata.has_key?("maxlength") and self.maxlength
138
- newdata["null"] = self.null? if !newdata.has_key?("null")
139
- newdata["default"] = self.default if !newdata.has_key?("default")
140
- newdata.delete("primarykey") if newdata.has_key?("primarykey")
138
+ newdata["name"] = self.name if !newdata.key?("name")
139
+ newdata["type"] = self.type if !newdata.key?("type")
140
+ newdata["maxlength"] = self.maxlength if !newdata.key?("maxlength") and self.maxlength
141
+ newdata["null"] = self.null? if !newdata.key?("null")
142
+ newdata["default"] = self.default if !newdata.key?("default")
143
+ newdata.delete("primarykey") if newdata.key?("primarykey")
141
144
 
142
145
  @type = nil
143
146
  @maxlength = nil
@@ -80,7 +80,7 @@ class KnjDB_sqlite3::Tables::Table
80
80
  @db.cols
81
81
  @list = {}
82
82
 
83
- q_cols = @db.query("PRAGMA table_info(#{self.name})")
83
+ q_cols = @db.query("PRAGMA table_info(`#{@driver.esc_table(self.name)}`)")
84
84
  while d_cols = q_cols.fetch
85
85
  @list[d_cols[:name]] = KnjDB_sqlite3::Columns::Column.new(
86
86
  :table => self,
@@ -96,7 +96,7 @@ class KnjDB_sqlite3::Tables::Table
96
96
 
97
97
  def create_columns(col_arr)
98
98
  col_arr.each do |col_data|
99
- #if col_data.has_key?("after")
99
+ #if col_data.key?("after")
100
100
  # self.create_column_programmatic(col_data)
101
101
  #else
102
102
  @db.query("ALTER TABLE `#{self.name}` ADD COLUMN #{@db.cols.data_sql(col_data)};")
@@ -175,7 +175,7 @@ class KnjDB_sqlite3::Tables::Table
175
175
  sql += ", " if !first
176
176
  first = false if first
177
177
 
178
- if args.has_key?("alter_columns") and args["alter_columns"][name.to_s]
178
+ if args.key?("alter_columns") and args["alter_columns"][name.to_s]
179
179
  sql += @db.cols.data_sql(args["alter_columns"][name.to_s])
180
180
  else
181
181
  sql += @db.cols.data_sql(col.data)
@@ -227,7 +227,7 @@ class KnjDB_sqlite3::Tables::Table
227
227
  @db.indexes
228
228
  @indexes_list = {}
229
229
 
230
- q_indexes = @db.query("PRAGMA index_list(`#{self.name}`)")
230
+ q_indexes = @db.query("PRAGMA index_list(`#{@driver.esc_table(self.name)}`)")
231
231
  while d_indexes = q_indexes.fetch
232
232
  if @db.opts[:index_append_table_name]
233
233
  match_name = d_indexes[:name].match(/__(.+)$/)
@@ -257,7 +257,7 @@ class KnjDB_sqlite3::Tables::Table
257
257
 
258
258
  def create_indexes(index_arr)
259
259
  index_arr.each do |index_data|
260
- raise "No name was given." if !index_data.has_key?("name") or index_data["name"].strip.length <= 0
260
+ raise "No name was given." if !index_data.key?("name") or index_data["name"].strip.length <= 0
261
261
  raise "No columns was given on index #{index_data["name"]}." if index_data["columns"].empty?
262
262
 
263
263
  name = index_data["name"]
@@ -26,12 +26,10 @@ class Knj::Db
26
26
  @opts[key.to_sym] = val
27
27
  end
28
28
 
29
- if @opts[:type] == "sqlite3" and RUBY_PLATFORM == "java"
30
- @opts[:type] = "java_sqlite3"
31
- elsif @opts[:type] == "mysql" and RUBY_PLATFORM == "java"
29
+ if RUBY_PLATFORM == "java"
32
30
  @opts[:subtype] = "java"
33
31
  elsif @opts[:type] == "sqlite3" and RUBY_PLATFORM.index("mswin32") != nil
34
- @opts[:type] = "sqlite3_ironruby"
32
+ @opts[:subtype] = "ironruby"
35
33
  end
36
34
 
37
35
  self.connect
@@ -67,7 +65,7 @@ class Knj::Db
67
65
  fpaths.each do |fpath|
68
66
  rpath = "#{File.dirname(__FILE__)}/#{fpath}"
69
67
 
70
- if (!@opts.has_key?(:require) or @opts[:require]) and File.exists?(rpath)
68
+ if (!@opts.key?(:require) or @opts[:require]) and File.exists?(rpath)
71
69
  require rpath
72
70
  break
73
71
  end
@@ -88,7 +86,7 @@ class Knj::Db
88
86
  def free_thread
89
87
  tid = self.__id__
90
88
 
91
- if Thread.current[:knjdb] and Thread.current[:knjdb].has_key?(tid)
89
+ if Thread.current[:knjdb] and Thread.current[:knjdb].key?(tid)
92
90
  db = Thread.current[:knjdb][tid]
93
91
  Thread.current[:knjdb].delete(tid)
94
92
  @conns.free(db) if @conns
@@ -112,7 +110,7 @@ class Knj::Db
112
110
  table_args = nil
113
111
  table_args = args["tables"][table["name"].to_s] if args and args["tables"] and args["tables"][table["name"].to_s]
114
112
  next if table_args and table_args["skip"]
115
- table.delete("indexes") if table.has_key?("indexes") and args["skip_indexes"]
113
+ table.delete("indexes") if table.key?("indexes") and args["skip_indexes"]
116
114
  db.tables.create(table["name"], table)
117
115
 
118
116
  limit_from = 0
@@ -309,7 +307,7 @@ class Knj::Db
309
307
  if Thread.current[:knjdb]
310
308
  tid = self.__id__
311
309
 
312
- if Thread.current[:knjdb].has_key?(tid)
310
+ if Thread.current[:knjdb].key?(tid)
313
311
  yield(Thread.current[:knjdb][tid])
314
312
  return nil
315
313
  end
@@ -325,9 +323,18 @@ class Knj::Db
325
323
  @conns.free(conn)
326
324
  end
327
325
  elsif @conn
328
- @mutex.synchronize do
329
- yield(@conn)
330
- return nil
326
+ begin
327
+ @mutex.synchronize do
328
+ yield(@conn)
329
+ return nil
330
+ end
331
+ rescue ThreadError => e
332
+ if e.message != "deadlock; recursive locking"
333
+ yield(@conn)
334
+ return nil
335
+ else
336
+ raise e
337
+ end
331
338
  end
332
339
  end
333
340
 
@@ -390,8 +397,18 @@ class Knj::Db
390
397
  return @enc_table
391
398
  end
392
399
 
393
- def date_out(date_obj)
394
- return Knj::Datet.in(date_obj).dbstr
400
+ def enc_col
401
+ if !@enc_col
402
+ conn_exec do |driver|
403
+ @enc_col = driver.escape_col
404
+ end
405
+ end
406
+
407
+ return @enc_col
408
+ end
409
+
410
+ def date_out(date_obj = Knj::Datet.new, args = {})
411
+ return Knj::Datet.in(date_obj).dbstr(args)
395
412
  end
396
413
 
397
414
  def date_in(date_obj)
@@ -401,7 +418,7 @@ class Knj::Db
401
418
  def tables
402
419
  conn_exec do |driver|
403
420
  if !driver.tables
404
- require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_tables" if (!@opts.has_key?(:require) or @opts[:require])
421
+ require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_tables" if (!@opts.key?(:require) or @opts[:require])
405
422
  driver.tables = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Tables).new(
406
423
  :driver => driver,
407
424
  :db => self
@@ -414,7 +431,7 @@ class Knj::Db
414
431
 
415
432
  def cols
416
433
  if !@cols
417
- require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_columns" if (!@opts.has_key?(:require) or @opts[:require])
434
+ require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_columns" if (!@opts.key?(:require) or @opts[:require])
418
435
  @cols = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Columns).new(
419
436
  :driver => @conn,
420
437
  :db => self
@@ -426,7 +443,7 @@ class Knj::Db
426
443
 
427
444
  def indexes
428
445
  if !@indexes
429
- require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_indexes" if (!@opts.has_key?(:require) or @opts[:require])
446
+ require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_indexes" if (!@opts.key?(:require) or @opts[:require])
430
447
  @indexes = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Indexes).new(
431
448
  :driver => @conn,
432
449
  :db => self
@@ -43,7 +43,7 @@ class Knj::Db_row
43
43
  end
44
44
 
45
45
  def ob
46
- return @args[:objects] if @args.has_key?(:objects)
46
+ return @args[:objects] if @args.key?(:objects)
47
47
  return $ob if $ob and $ob.is_a?(Knj::Objects)
48
48
  return false
49
49
  end
@@ -83,18 +83,18 @@ class Knj::Db_row
83
83
  end
84
84
 
85
85
  def has_key?(key)
86
- return @data.has_key?(key.to_sym)
86
+ return @data.key?(key.to_sym)
87
87
  end
88
88
 
89
89
  def [](key)
90
90
  raise "No valid key given." if !key
91
91
  raise "No data was loaded on the object? Maybe you are trying to call a deleted object?" if !@data
92
92
 
93
- if @data.has_key?(key)
93
+ if @data.key?(key)
94
94
  return @data[key]
95
- elsif @data.has_key?(key.to_sym)
95
+ elsif @data.key?(key.to_sym)
96
96
  return @data[key.to_sym]
97
- elsif @data.has_key?(key.to_s)
97
+ elsif @data.key?(key.to_s)
98
98
  return @data[key.to_s]
99
99
  end
100
100
 
@@ -115,9 +115,9 @@ class Knj::Db_row
115
115
  return @data[@args[:col_title].to_sym]
116
116
  end
117
117
 
118
- if @data.has_key?(:title)
118
+ if @data.key?(:title)
119
119
  return @data[:title]
120
- elsif @data.has_key?(:name)
120
+ elsif @data.key?(:name)
121
121
  return @data[:name]
122
122
  end
123
123
 
@@ -136,7 +136,7 @@ class Knj::Db_row
136
136
 
137
137
  def method_missing(*args)
138
138
  func_name = args[0].to_s
139
- if match = func_name.match(/^(\S+)\?$/) and @data.has_key?(match[1].to_sym)
139
+ if match = func_name.match(/^(\S+)\?$/) and @data.key?(match[1].to_sym)
140
140
  if @data[match[1].to_sym] == "1" or @data[match[1].to_sym] == "yes"
141
141
  return true
142
142
  elsif @data[match[1].to_sym] == "0" or @data[match[1].to_sym] == "no"
@@ -37,7 +37,7 @@ class Knj
37
37
  end
38
38
 
39
39
  def [](key)
40
- if (!@data.has_key?(key))
40
+ if (!@data.key?(key))
41
41
  raise "No such key: '" + key + "'"
42
42
  end
43
43
 
@@ -13,8 +13,8 @@ class Knj::Mount
13
13
  #raise "The folder doesnt exist?" if !File.exists?(folder_to)
14
14
 
15
15
  add = true
16
- add = false if args.has_key?("to") and args["to"] != folder_to
17
- add = false if args.has_key?("from") and args["from"] != folder_from
16
+ add = false if args.key?("to") and args["to"] != folder_to
17
+ add = false if args.key?("from") and args["from"] != folder_from
18
18
 
19
19
  if args["from_search"]
20
20
  Knj::Strings.searchstring(args["from_search"]).each do |str|
@@ -43,11 +43,11 @@ class Knj::Mount
43
43
 
44
44
  def self.mount(args)
45
45
  cmd = "mount"
46
- cmd += " -t #{Knj::Strings.unixsafe(args["type"])}" if args.has_key?("type")
46
+ cmd += " -t #{Knj::Strings.unixsafe(args["type"])}" if args.key?("type")
47
47
  cmd += " --bind" if args["bind"]
48
48
  cmd += " #{Knj::Strings.unixsafe(args["from"])} #{Knj::Strings.unixsafe(args["to"])}"
49
49
 
50
- if args.has_key?("opts")
50
+ if args.key?("opts")
51
51
  raise "opts argument must be an array." if !args["opts"].is_a?(Array)
52
52
 
53
53
  cmd += "-O "
@@ -85,7 +85,7 @@ class Knj::Mount
85
85
  end
86
86
 
87
87
  def [](key)
88
- raise "Invalid key: #{key}." if !@data.has_key?(key)
88
+ raise "Invalid key: #{key}." if !@data.key?(key)
89
89
  return @data[key]
90
90
  end
91
91
 
@@ -96,7 +96,7 @@ class Knj::Mount
96
96
  alias :umount :unmount
97
97
 
98
98
  def access?(args = {})
99
- args["timeout"] = 2 if !args.has_key?("timeout")
99
+ args["timeout"] = 2 if !args.key?("timeout")
100
100
  access = false
101
101
 
102
102
  begin