knjrbfw 0.0.35 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.35
1
+ 0.0.36
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{knjrbfw}
8
- s.version = "0.0.35"
8
+ s.version = "0.0.36"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kasper Johansen"]
12
- s.date = %q{2012-05-19}
12
+ s.date = %q{2012-05-21}
13
13
  s.description = %q{Including stuff for HTTP, SSH and much more.}
14
14
  s.email = %q{k@spernj.org}
15
15
  s.extra_rdoc_files = [
@@ -166,16 +166,19 @@ Gem::Specification.new do |s|
166
166
  "lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb",
167
167
  "lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb",
168
168
  "lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb",
169
+ "lib/knj/knjdb/drivers/mysql/knjdb_mysql_sqlspecs.rb",
169
170
  "lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb",
170
171
  "lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb",
171
172
  "lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb",
172
173
  "lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb",
174
+ "lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_sqlspecs.rb",
173
175
  "lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb",
174
176
  "lib/knj/knjdb/libknjdb.rb",
175
177
  "lib/knj/knjdb/libknjdb_java_sqlite3.rb",
176
178
  "lib/knj/knjdb/libknjdb_row.rb",
177
179
  "lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb",
178
180
  "lib/knj/knjdb/revision.rb",
181
+ "lib/knj/knjdb/sqlspecs.rb",
179
182
  "lib/knj/kvm.rb",
180
183
  "lib/knj/libqt.rb",
181
184
  "lib/knj/libqt_window.rb",
@@ -201,15 +201,22 @@ class Knj::Datarow
201
201
  return @ob.get_try(self, colname, classname)
202
202
  end
203
203
 
204
- methodname_html = "#{methodname.to_s}_html".to_sym
204
+ methodname_html = "#{methodname}_html".to_sym
205
205
  define_method(methodname_html) do |*args|
206
- obj = self.send(methodname)
206
+ obj = self.__send__(methodname)
207
207
  return @ob.events.call(:no_html, classname) if !obj
208
208
 
209
209
  raise "Class '#{classname}' does not have a 'html'-method." if !obj.respond_to?(:html)
210
210
  return obj.html(*args)
211
211
  end
212
212
 
213
+ methodname_name = "#{methodname}_name".to_sym
214
+ define_method(methodname_name) do |*args|
215
+ obj = self.__send__(methodname)
216
+ return @ob.events.call(:no_name, classname) if !obj
217
+ return obj.name(*args)
218
+ end
219
+
213
220
  self.joined_tables(
214
221
  classname => {
215
222
  :where => {
@@ -27,7 +27,7 @@ module Knj::Gtk2
27
27
  elsif paras.is_a?(String) or paras.is_a?(Integer)
28
28
  msg = paras
29
29
  else
30
- raise "Cant handle the parameters: " + paras.class.to_s
30
+ raise "Cant handle the parameters: '#{paras.class.name}'."
31
31
  end
32
32
 
33
33
  type = "info" if !type
@@ -81,13 +81,13 @@ module Knj::Gtk2
81
81
  if element.respond_to?("id") and element.respond_to?("title")
82
82
  tv.append([count.to_s, element.title])
83
83
  else
84
- raise "Could not handle object in array: " + element.class.to_s
84
+ raise "Could not handle object in array: '#{element.class.name}'."
85
85
  end
86
86
 
87
87
  count += 1
88
88
  end
89
89
  else
90
- raise "Unhandeled class: " + items.class.to_s
90
+ raise "Unhandeled class: '#{items.class.name}'."
91
91
  end
92
92
 
93
93
  sw = Gtk::ScrolledWindow.new
@@ -95,7 +95,7 @@ module Knj::Gtk2
95
95
 
96
96
  box.pack_start(sw)
97
97
  else
98
- raise "No such mode: " + type
98
+ raise "No such mode: '#{type}'."
99
99
  end
100
100
 
101
101
  if button1 and button2
@@ -104,12 +104,12 @@ module Knj::Gtk2
104
104
  dialog = Gtk::Dialog.new(title, nil, Gtk::Dialog::MODAL, button1)
105
105
  end
106
106
 
107
- if image
108
- box.pack_start(image)
109
- end
107
+ box.pack_start(image) if image
110
108
 
111
109
  if msg
112
- box.pack_start(Gtk::Label.new(msg))
110
+ label = Gtk::Label.new(msg)
111
+ label.selectable = true
112
+ box.pack_start(label)
113
113
  end
114
114
 
115
115
  box.spacing = 15
@@ -123,7 +123,23 @@ module Knj::Gtk2
123
123
  tv.grab_focus
124
124
  end
125
125
 
126
- response = dialog.run
126
+ if paras.is_a?(Hash) and paras["transient_for"]
127
+ dialog.transient_for = paras["transient_for"]
128
+ end
129
+
130
+ do_run = true
131
+ do_run = false if paras.is_a?(Hash) and paras.key?("run") and !paras["run"]
132
+
133
+ if do_run
134
+ response = dialog.run
135
+ else
136
+ #Connect the one button to close the window.
137
+ dialog.children[0].children[1].children[0].signal_connect("clicked") do
138
+ dialog.destroy
139
+ end
140
+
141
+ return false
142
+ end
127
143
 
128
144
  if type == "list"
129
145
  sel = tv.sel
@@ -153,7 +169,7 @@ module Knj::Gtk2
153
169
  elsif response == Gtk::Dialog::RESPONSE_CLOSE or response == Gtk::Dialog::RESPONSE_DELETE_EVENT
154
170
  return close_sig
155
171
  else
156
- raise "Unknown response: " + response.to_s
172
+ raise "Unknown response: '#{response}'."
157
173
  end
158
174
  end
159
175
 
@@ -191,7 +207,7 @@ module Knj::Gtk2
191
207
  elsif item["name"][0..2] == "che"
192
208
  item["type"] = "check"
193
209
  else
194
- raise "Could not figure out type for: " + item["name"]
210
+ raise "Could not figure out type for: '#{item["name"]}'."
195
211
  end
196
212
  end
197
213
 
@@ -238,7 +254,7 @@ module Knj::Gtk2
238
254
  "object" => cb
239
255
  }
240
256
  else
241
- raise "Unknown type: " + item["type"]
257
+ raise "Unknown type: '#{item["type"]}'."
242
258
  end
243
259
 
244
260
 
@@ -286,7 +302,7 @@ module Knj::Gtk2
286
302
  sel = object.sel
287
303
  return sel["text"]
288
304
  else
289
- raise "Unknown object: #{object.class.name}"
305
+ raise "Unknown object: '#{object.class.name}'."
290
306
  end
291
307
  end
292
308
  end
@@ -12,6 +12,7 @@ module Knj::Gtk2::Tv
12
12
  columns.each do |col_title|
13
13
  renderer = Gtk::CellRendererText.new
14
14
  col = Gtk::TreeViewColumn.new(col_title, renderer, :text => count)
15
+ col.resizable = true
15
16
  tv.append_column(col)
16
17
  count += 1
17
18
  end
@@ -1,6 +1,3 @@
1
- require "#{$knjpath}web"
2
- require "socket"
3
-
4
1
  #This class tries to emulate a browser in Ruby without any visual stuff. Remember cookies, keep sessions alive, reset connections according to keep-alive rules and more.
5
2
  #===Examples
6
3
  # Knj::Http2.new(:host => "www.somedomain.com", :port => 80, :ssl => false, :debug => false) do |http|
@@ -16,6 +13,8 @@ class Knj::Http2
16
13
  attr_reader :cookies, :args
17
14
 
18
15
  def initialize(args = {})
16
+ require "#{$knjpath}web"
17
+
19
18
  args = {:host => args} if args.is_a?(String)
20
19
  raise "Arguments wasnt a hash." if !args.is_a?(Hash)
21
20
 
@@ -99,6 +98,7 @@ class Knj::Http2
99
98
 
100
99
  #Reconnects to the host.
101
100
  def reconnect
101
+ require "socket"
102
102
  print "Http2: Reconnect.\n" if @debug
103
103
 
104
104
  #Reset variables.
@@ -272,13 +272,13 @@ class Knj::Http2
272
272
 
273
273
  if val.class.name == "Tempfile" and val.respond_to?("original_filename")
274
274
  praw << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{val.original_filename}\";#{@nl}"
275
- praw << "Content-Length: #{val.bytesize}#{@nl}"
275
+ praw << "Content-Length: #{val.to_s.bytesize}#{@nl}"
276
276
  elsif val.is_a?(Hash) and val[:filename]
277
277
  praw << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{val[:filename]}\";#{@nl}"
278
- praw << "Content-Length: #{val[:content].bytesize}#{@nl}"
278
+ praw << "Content-Length: #{val[:content].to_s.bytesize}#{@nl}"
279
279
  else
280
280
  praw << "Content-Disposition: form-data; name=\"#{key}\";#{@nl}"
281
- praw << "Content-Length: #{val.bytesize}#{@nl}"
281
+ praw << "Content-Length: #{val.to_s.bytesize}#{@nl}"
282
282
  end
283
283
 
284
284
  praw << "Content-Type: text/plain#{@nl}"
@@ -0,0 +1,5 @@
1
+ class KnjDB_mysql::Sqlspecs < Knj::Db::Sqlspecs
2
+ def strftime(val, colstr)
3
+ return "DATE_FORMAT(#{colstr}, '#{val}')"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class KnjDB_sqlite3::Sqlspecs < Knj::Db::Sqlspecs
2
+ def strftime(val, col_str)
3
+ return "STRFTIME('#{val}', SUBSTR(#{col_str}, 0, 20))"
4
+ end
5
+ end
@@ -299,6 +299,9 @@ class Knj::Db
299
299
  sql << ", "
300
300
  end
301
301
 
302
+ #Convert dates to valid dbstr.
303
+ value = self.date_out(value) if value.is_a?(Knj::Datet) or value.is_a?(Time)
304
+
302
305
  sql << "#{driver.escape_col}#{key.to_s}#{driver.escape_col} = "
303
306
  sql << "#{driver.escape_val}#{driver.escape(value.to_s)}#{driver.escape_val}"
304
307
  end
@@ -596,11 +599,29 @@ class Knj::Db
596
599
  return @enc_col
597
600
  end
598
601
 
602
+ #Returns a string which can be used in SQL with the current driver.
603
+ #===Examples
604
+ # str = db.date_out(Time.now) #=> "2012-05-20 22:06:09"
599
605
  def date_out(date_obj = Knj::Datet.new, args = {})
606
+ conn_exec do |driver|
607
+ if driver.respond_to?(:date_out)
608
+ return driver.date_out(date_obj, args)
609
+ end
610
+ end
611
+
600
612
  return Knj::Datet.in(date_obj).dbstr(args)
601
613
  end
602
614
 
615
+ #Takes a valid date-db-string and converts it into a Knj::Datet.
616
+ #===Examples
617
+ # db.date_in('2012-05-20 22:06:09') #=> 2012-05-20 22:06:09 +0200
603
618
  def date_in(date_obj)
619
+ conn_exec do |driver|
620
+ if driver.respond_to?(:date_in)
621
+ return driver.date_in(date_obj)
622
+ end
623
+ end
624
+
604
625
  return Knj::Datet.in(date_obj)
605
626
  end
606
627
 
@@ -642,6 +663,17 @@ class Knj::Db
642
663
  return @indexes
643
664
  end
644
665
 
666
+ def sqlspecs
667
+ if !@sqlspecs
668
+ require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_sqlspecs" if (!@opts.key?(:require) or @opts[:require])
669
+ @sqlspecs = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Sqlspecs).new(
670
+ :db => self
671
+ )
672
+ end
673
+
674
+ return @sqlspecs
675
+ end
676
+
645
677
  #Proxies the method to the driver.
646
678
  #
647
679
  #===Examples
@@ -0,0 +1,5 @@
1
+ class Knj::Db::Sqlspecs
2
+ def initialize(args)
3
+ @args = args
4
+ end
5
+ end
@@ -23,6 +23,7 @@ class Knj::Objects
23
23
  #Set up various events.
24
24
  @events = Knj::Event_handler.new
25
25
  @events.add_event(:name => :no_html, :connections_max => 1)
26
+ @events.add_event(:name => :no_name, :connections_max => 1)
26
27
  @events.add_event(:name => :no_date, :connections_max => 1)
27
28
  @events.add_event(:name => :missing_class, :connections_max => 1)
28
29
  @events.add_event(:name => :require_class, :connections_max => 1)
@@ -333,7 +333,7 @@ class Knj::Objects
333
333
  sql_where << " AND DATE_FORMAT(#{table}`#{db.esc_col(match[1])}`, '%d %m %Y') = DATE_FORMAT('#{db.esc(val.dbstr)}', '%d %m %Y')"
334
334
  end
335
335
  elsif match[2] == "month"
336
- sql_where << " AND DATE_FORMAT(#{table}`#{db.esc_col(match[1])}`, '%m %Y') = DATE_FORMAT('#{db.esc(val.dbstr)}', '%m %Y')"
336
+ sql_where << " AND #{db.sqlspecs.strftime("%m %Y", "#{table}`#{db.esc_col(match[1])}`")} = #{db.sqlspecs.strftime("%m %Y", "'#{db.esc(val.dbstr)}'")}"
337
337
  elsif match[2] == "year"
338
338
  sql_where << " AND DATE_FORMAT(#{table}`#{db.esc_col(match[1])}`, '%Y') = DATE_FORMAT('#{db.esc(val.dbstr)}', '%Y')"
339
339
  elsif match[2] == "from" or match[2] == "above"
@@ -260,4 +260,29 @@ module Knj::Strings
260
260
  return parts[0].to_s
261
261
  end
262
262
  end
263
+
264
+ #Returns a human readable time-string from a given number of seconds.
265
+ def self.secs_to_human_time_str(secs)
266
+ secs = secs.to_i
267
+ hours = (secs.to_f / 3600.0).floor.to_i
268
+ secs = secs - (hours * 3600)
269
+
270
+ mins = (secs.to_f / 60).floor.to_i
271
+ secs = secs - (mins * 60)
272
+
273
+ return "#{"%02d" % hours}:#{"%02d" % mins}:#{"%02d" % secs}"
274
+ end
275
+
276
+ #Turns a human readable time-string into a number of seconds.
277
+ def self.human_time_str_to_secs(str)
278
+ match = str.match(/^\s*(\d+)\s*:\s*(\d+)\s*:\s*(\d+)\s*/)
279
+ raise "Could not match string: '#{str}'." if !match
280
+
281
+ hours = match[1].to_i
282
+ minutes = match[2].to_i
283
+ secs = match[3].to_i
284
+
285
+ total = (hours * 3600) + (minutes * 60) + secs
286
+ return total
287
+ end
263
288
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: knjrbfw
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.35
5
+ version: 0.0.36
6
6
  platform: ruby
7
7
  authors:
8
8
  - Kasper Johansen
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-05-19 00:00:00 +02:00
13
+ date: 2012-05-21 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -260,16 +260,19 @@ files:
260
260
  - lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb
261
261
  - lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb
262
262
  - lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb
263
+ - lib/knj/knjdb/drivers/mysql/knjdb_mysql_sqlspecs.rb
263
264
  - lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb
264
265
  - lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb
265
266
  - lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb
266
267
  - lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb
268
+ - lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_sqlspecs.rb
267
269
  - lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb
268
270
  - lib/knj/knjdb/libknjdb.rb
269
271
  - lib/knj/knjdb/libknjdb_java_sqlite3.rb
270
272
  - lib/knj/knjdb/libknjdb_row.rb
271
273
  - lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb
272
274
  - lib/knj/knjdb/revision.rb
275
+ - lib/knj/knjdb/sqlspecs.rb
273
276
  - lib/knj/kvm.rb
274
277
  - lib/knj/libqt.rb
275
278
  - lib/knj/libqt_window.rb
@@ -371,7 +374,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
371
374
  requirements:
372
375
  - - ">="
373
376
  - !ruby/object:Gem::Version
374
- hash: 2601154118778035133
377
+ hash: -15958701086613038
375
378
  segments:
376
379
  - 0
377
380
  version: "0"