knjrbfw 0.0.3

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 (208) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +14 -0
  4. data/Gemfile.lock +32 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +19 -0
  7. data/Rakefile +49 -0
  8. data/VERSION +1 -0
  9. data/lib/knj/.gitignore +1 -0
  10. data/lib/knj/arrayext.rb +157 -0
  11. data/lib/knj/autoload/activesupport.rb +2 -0
  12. data/lib/knj/autoload/backups/facets_dictionary.rb +430 -0
  13. data/lib/knj/autoload/backups/parsedate.rb +53 -0
  14. data/lib/knj/autoload/backups/ping.rb +64 -0
  15. data/lib/knj/autoload/cinch.rb +2 -0
  16. data/lib/knj/autoload/erubis.rb +6 -0
  17. data/lib/knj/autoload/facebooker.rb +3 -0
  18. data/lib/knj/autoload/facets_dictionary.rb +7 -0
  19. data/lib/knj/autoload/gd2.rb +2 -0
  20. data/lib/knj/autoload/gettext.rb +9 -0
  21. data/lib/knj/autoload/gtk2.rb +5 -0
  22. data/lib/knj/autoload/json_autoload.rb +7 -0
  23. data/lib/knj/autoload/magick.rb +6 -0
  24. data/lib/knj/autoload/mysql.rb +6 -0
  25. data/lib/knj/autoload/parsedate.rb +1 -0
  26. data/lib/knj/autoload/ping.rb +64 -0
  27. data/lib/knj/autoload/rexml.rb +12 -0
  28. data/lib/knj/autoload/soap.rb +3 -0
  29. data/lib/knj/autoload/sqlite3.rb +6 -0
  30. data/lib/knj/autoload/tmail.rb +6 -0
  31. data/lib/knj/autoload/twitter.rb +2 -0
  32. data/lib/knj/autoload/xmlsimple.rb +6 -0
  33. data/lib/knj/autoload/zip.rb +6 -0
  34. data/lib/knj/autoload.rb +136 -0
  35. data/lib/knj/compiler.rb +53 -0
  36. data/lib/knj/cpufreq.rb +40 -0
  37. data/lib/knj/datarow.rb +256 -0
  38. data/lib/knj/datestamp.rb +91 -0
  39. data/lib/knj/datet.rb +448 -0
  40. data/lib/knj/degulesider.rb +46 -0
  41. data/lib/knj/erb/apache_knjerb.conf +8 -0
  42. data/lib/knj/erb/cache/README +1 -0
  43. data/lib/knj/erb/erb.rb +21 -0
  44. data/lib/knj/erb/erb_1.9.rb +13 -0
  45. data/lib/knj/erb/erb_cache_clean.rb +20 -0
  46. data/lib/knj/erb/erb_fcgi.rb +44 -0
  47. data/lib/knj/erb/erb_fcgi_1.9.rb +44 -0
  48. data/lib/knj/erb/erb_fcgi_jruby.rb +7 -0
  49. data/lib/knj/erb/erb_jruby.rb +22 -0
  50. data/lib/knj/erb/include.rb +248 -0
  51. data/lib/knj/errors.rb +19 -0
  52. data/lib/knj/eruby.rb +224 -0
  53. data/lib/knj/event_filemod.rb +53 -0
  54. data/lib/knj/event_handler.rb +69 -0
  55. data/lib/knj/exchangerates.rb +39 -0
  56. data/lib/knj/ext/webrick.rb +31 -0
  57. data/lib/knj/filesystem.rb +8 -0
  58. data/lib/knj/fs/drivers/filesystem.rb +14 -0
  59. data/lib/knj/fs/drivers/ftp.rb +33 -0
  60. data/lib/knj/fs/drivers/ssh.rb +28 -0
  61. data/lib/knj/fs/fs.rb +36 -0
  62. data/lib/knj/gettext_fallback.rb +17 -0
  63. data/lib/knj/gettext_threadded.rb +77 -0
  64. data/lib/knj/google_sitemap.rb +59 -0
  65. data/lib/knj/gtk2.rb +277 -0
  66. data/lib/knj/gtk2_cb.rb +85 -0
  67. data/lib/knj/gtk2_menu.rb +57 -0
  68. data/lib/knj/gtk2_statuswindow.rb +64 -0
  69. data/lib/knj/gtk2_tv.rb +63 -0
  70. data/lib/knj/hash_methods.rb +37 -0
  71. data/lib/knj/http.rb +190 -0
  72. data/lib/knj/includes/appserver_cli.rb +39 -0
  73. data/lib/knj/ip2location.rb +22 -0
  74. data/lib/knj/ironruby-gtk2/button.rb +19 -0
  75. data/lib/knj/ironruby-gtk2/dialog.rb +44 -0
  76. data/lib/knj/ironruby-gtk2/entry.rb +9 -0
  77. data/lib/knj/ironruby-gtk2/gdk_event.rb +3 -0
  78. data/lib/knj/ironruby-gtk2/gdk_eventbutton.rb +13 -0
  79. data/lib/knj/ironruby-gtk2/gdk_pixbuf.rb +11 -0
  80. data/lib/knj/ironruby-gtk2/gladexml.rb +104 -0
  81. data/lib/knj/ironruby-gtk2/glib.rb +15 -0
  82. data/lib/knj/ironruby-gtk2/gtk2.rb +148 -0
  83. data/lib/knj/ironruby-gtk2/gtk_builder.rb +31 -0
  84. data/lib/knj/ironruby-gtk2/gtk_cellrenderertext.rb +5 -0
  85. data/lib/knj/ironruby-gtk2/gtk_combobox.rb +19 -0
  86. data/lib/knj/ironruby-gtk2/gtk_filechooserbutton.rb +5 -0
  87. data/lib/knj/ironruby-gtk2/gtk_liststore.rb +18 -0
  88. data/lib/knj/ironruby-gtk2/gtk_menu.rb +5 -0
  89. data/lib/knj/ironruby-gtk2/gtk_menuitem.rb +7 -0
  90. data/lib/knj/ironruby-gtk2/gtk_statusicon.rb +8 -0
  91. data/lib/knj/ironruby-gtk2/gtk_treeiter.rb +24 -0
  92. data/lib/knj/ironruby-gtk2/gtk_treeselection.rb +16 -0
  93. data/lib/knj/ironruby-gtk2/gtk_treeview.rb +19 -0
  94. data/lib/knj/ironruby-gtk2/gtk_treeviewcolumn.rb +32 -0
  95. data/lib/knj/ironruby-gtk2/iconsize.rb +3 -0
  96. data/lib/knj/ironruby-gtk2/image.rb +15 -0
  97. data/lib/knj/ironruby-gtk2/label.rb +19 -0
  98. data/lib/knj/ironruby-gtk2/stock.rb +4 -0
  99. data/lib/knj/ironruby-gtk2/tests/test.glade +15 -0
  100. data/lib/knj/ironruby-gtk2/tests/test_2.rb +22 -0
  101. data/lib/knj/ironruby-gtk2/tests/test_ironruby_window.rb +47 -0
  102. data/lib/knj/ironruby-gtk2/vbox.rb +5 -0
  103. data/lib/knj/ironruby-gtk2/window.rb +23 -0
  104. data/lib/knj/jruby-gtk2/builder/test_builder.glade +43 -0
  105. data/lib/knj/jruby-gtk2/builder/test_builder.rb +19 -0
  106. data/lib/knj/jruby-gtk2/builder/test_builder.ui +43 -0
  107. data/lib/knj/jruby-gtk2/builder.rb +27 -0
  108. data/lib/knj/jruby-gtk2/cellrenderertext.rb +12 -0
  109. data/lib/knj/jruby-gtk2/checkbutton.rb +3 -0
  110. data/lib/knj/jruby-gtk2/combobox.rb +29 -0
  111. data/lib/knj/jruby-gtk2/dialog.rb +44 -0
  112. data/lib/knj/jruby-gtk2/eventbutton.rb +21 -0
  113. data/lib/knj/jruby-gtk2/gladexml.rb +99 -0
  114. data/lib/knj/jruby-gtk2/gtk-4.0.jar +0 -0
  115. data/lib/knj/jruby-gtk2/gtk2.rb +246 -0
  116. data/lib/knj/jruby-gtk2/hbox.rb +10 -0
  117. data/lib/knj/jruby-gtk2/iconsize.rb +5 -0
  118. data/lib/knj/jruby-gtk2/image.rb +10 -0
  119. data/lib/knj/jruby-gtk2/liststore.rb +56 -0
  120. data/lib/knj/jruby-gtk2/menu.rb +40 -0
  121. data/lib/knj/jruby-gtk2/progressbar.rb +12 -0
  122. data/lib/knj/jruby-gtk2/statusicon.rb +8 -0
  123. data/lib/knj/jruby-gtk2/stock.rb +8 -0
  124. data/lib/knj/jruby-gtk2/tests/test_glade_window.glade +163 -0
  125. data/lib/knj/jruby-gtk2/tests/test_glade_window.rb +47 -0
  126. data/lib/knj/jruby-gtk2/tests/test_normal_window.rb +17 -0
  127. data/lib/knj/jruby-gtk2/tests/test_trayicon.png +0 -0
  128. data/lib/knj/jruby-gtk2/tests/test_trayicon.rb +18 -0
  129. data/lib/knj/jruby-gtk2/treeview.rb +105 -0
  130. data/lib/knj/jruby-gtk2/vbox.rb +12 -0
  131. data/lib/knj/jruby-gtk2/window.rb +11 -0
  132. data/lib/knj/jruby_compiler.rb +14 -0
  133. data/lib/knj/knj.rb +19 -0
  134. data/lib/knj/knj_controller.rb +13 -0
  135. data/lib/knj/knjdb/dbtime.rb +30 -0
  136. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +327 -0
  137. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +130 -0
  138. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +30 -0
  139. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +255 -0
  140. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +93 -0
  141. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +151 -0
  142. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb +29 -0
  143. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +300 -0
  144. data/lib/knj/knjdb/libknjdb.rb +438 -0
  145. data/lib/knj/knjdb/libknjdb_java_sqlite3.rb +83 -0
  146. data/lib/knj/knjdb/libknjdb_row.rb +149 -0
  147. data/lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb +69 -0
  148. data/lib/knj/knjdb/mysql-connector-java-5.1.13-bin.jar +0 -0
  149. data/lib/knj/knjdb/sqlitejdbc-v056.jar +0 -0
  150. data/lib/knj/libqt.rb +75 -0
  151. data/lib/knj/libqt_window.rb +10 -0
  152. data/lib/knj/locale_strings.rb +3 -0
  153. data/lib/knj/locales.rb +54 -0
  154. data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +56 -0
  155. data/lib/knj/mail.rb +75 -0
  156. data/lib/knj/mailobj.rb +82 -0
  157. data/lib/knj/mount.rb +115 -0
  158. data/lib/knj/notify.rb +13 -0
  159. data/lib/knj/nvidia_settings.rb +45 -0
  160. data/lib/knj/objects.rb +731 -0
  161. data/lib/knj/opts.rb +38 -0
  162. data/lib/knj/os.rb +158 -0
  163. data/lib/knj/php.rb +717 -0
  164. data/lib/knj/php_parser/arguments.rb +5 -0
  165. data/lib/knj/php_parser/functions.rb +97 -0
  166. data/lib/knj/php_parser/php_parser.rb +99 -0
  167. data/lib/knj/php_parser/tests/test.rb +12 -0
  168. data/lib/knj/php_parser/tests/test_function.php +8 -0
  169. data/lib/knj/php_parser/tests/test_function_run.rb +19 -0
  170. data/lib/knj/power_manager.rb +31 -0
  171. data/lib/knj/rand.rb +10 -0
  172. data/lib/knj/retry.rb +71 -0
  173. data/lib/knj/rhodes/mutex.rb +11 -0
  174. data/lib/knj/rhodes/rhodes.js +3 -0
  175. data/lib/knj/rhodes/rhodes.rb +11 -0
  176. data/lib/knj/rsvgbin.rb +20 -0
  177. data/lib/knj/scripts/degulesider.rb +12 -0
  178. data/lib/knj/scripts/filesearch.rb +51 -0
  179. data/lib/knj/scripts/ip2location.rb +12 -0
  180. data/lib/knj/scripts/keepalive.rb +6 -0
  181. data/lib/knj/scripts/svn_merge.rb +29 -0
  182. data/lib/knj/scripts/upgrade_knjrbfw_checker.rb +41 -0
  183. data/lib/knj/sms.rb +54 -0
  184. data/lib/knj/sshrobot/sshrobot.rb +93 -0
  185. data/lib/knj/strings.rb +65 -0
  186. data/lib/knj/sysuser.rb +27 -0
  187. data/lib/knj/tests/compiler/compiler_test.rb +13 -0
  188. data/lib/knj/tests/compiler/compiler_test_file.rb +62 -0
  189. data/lib/knj/tests/test_degulesider.rb +11 -0
  190. data/lib/knj/tests/test_mount.rb +30 -0
  191. data/lib/knj/tests/test_retry.rb +30 -0
  192. data/lib/knj/thread.rb +32 -0
  193. data/lib/knj/thread2.rb +47 -0
  194. data/lib/knj/threadhandler.rb +130 -0
  195. data/lib/knj/threadpool.rb +177 -0
  196. data/lib/knj/translations.rb +139 -0
  197. data/lib/knj/unix_proc.rb +82 -0
  198. data/lib/knj/web.rb +932 -0
  199. data/lib/knj/webscripts/image.rhtml +82 -0
  200. data/lib/knj/win.rb +4 -0
  201. data/lib/knj/win_registry.rb +60 -0
  202. data/lib/knj/win_tightvnc.rb +127 -0
  203. data/lib/knj/x11vnc.rb +48 -0
  204. data/lib/knj/youtube.rb +38 -0
  205. data/lib/knjrbfw.rb +4 -0
  206. data/spec/knjrbfw_spec.rb +269 -0
  207. data/spec/spec_helper.rb +12 -0
  208. metadata +336 -0
@@ -0,0 +1,248 @@
1
+ class ERuby
2
+ def self.load_settings
3
+ @settings_loaded = true
4
+ @inseq_cache = false
5
+ @inseq_rbc = false
6
+ @java_compile = false
7
+
8
+ if RUBY_PLATFORM == "java"
9
+ @java_compile = true
10
+ @java_factory = javax.script.ScriptEngineManager.new
11
+ @java_engine = @java_factory.getEngineByName("jruby")
12
+ @eruby_java_cache = {}
13
+ elsif RUBY_VERSION.slice(0..2) == "1.9" and RubyVM::InstructionSequence.respond_to?(:compile_file)
14
+ @eruby_rbyte = {}
15
+ @inseq_cache = true
16
+
17
+ if RubyVM::InstructionSequence.respond_to?(:load)
18
+ @inseq_rbc = true
19
+ end
20
+ end
21
+
22
+ @inseq_rbc = false #this is not possible yet in Ruby... maybe in 1.9.3?
23
+ end
24
+
25
+ def self.import(filename)
26
+ ERuby.load_settings if !@settings_loaded
27
+
28
+ filename = File.expand_path(filename)
29
+ pwd = Dir.pwd
30
+ Dir.chdir(File.dirname(filename))
31
+
32
+ fpath = "#{KnjEruby.filepath}/cache/#{filename.gsub("/", "_").gsub(".", "_")}"
33
+ pi = Knj::Php.pathinfo(filename)
34
+ cachename = fpath + ".cache"
35
+
36
+ filetime = File.mtime(filename)
37
+ cacheexists = File.exists?(cachename)
38
+ cachetime = File.mtime(cachename) if File.exists?(cachename)
39
+
40
+ if !cacheexists or filetime > cachetime
41
+ KnjEruby.load_file(File.basename(filename), {:cachename => cachename})
42
+ cachetime = File.mtime(cachename)
43
+ reload_cache = true
44
+ end
45
+
46
+ if @java_compile
47
+ if !@eruby_java_cache[cachename] or reload_cache
48
+ #@eruby_java_cache[cachename] = @java_engine.compile(File.read(cachename))
49
+ @eruby_java_cache[cachename] = File.read(cachename)
50
+ end
51
+
52
+ #@eruby_java_cache[cachename].eval
53
+ eval(@eruby_java_cache[cachename])
54
+ elsif @inseq_cache
55
+ if @inseq_rbc
56
+ bytepath = pi["dirname"] + "/" + pi["basename"] + ".rbc"
57
+ byteexists = File.exists?(bytepath)
58
+ bytetime = File.mtime(bytepath) if File.exists?(bytepath)
59
+
60
+ if !File.exists?(bytepath) or cachetime > bytetime
61
+ res = RubyVM::InstructionSequence.compile_file(filename)
62
+ data = Marshal.dump(res.to_a)
63
+ File.open(bytepath, "w+") do |fp|
64
+ fp.write(data)
65
+ end
66
+ end
67
+ end
68
+
69
+ if @inseq_rbc
70
+ res = Marshal.load(File.read(bytepath))
71
+ RubyVM::InstructionSequence.load(res).eval
72
+ else
73
+ if !@eruby_rbyte[cachename] or reload_cache
74
+ @eruby_rbyte[cachename] = RubyVM::InstructionSequence.new(File.read(cachename))
75
+ #@eruby_rbyte[cachename] = RubyVM::InstructionSequence.compile_file(cachename)
76
+ @eruby_rbyte[cachename].eval
77
+ else
78
+ _buf = ""
79
+ @eruby_rbyte[cachename].eval
80
+ if _buf
81
+ print _buf
82
+ end
83
+ end
84
+ end
85
+ else
86
+ eruby = KnjEruby.load_file(File.basename(filename), {:cachename => cachename})
87
+ print eruby.evaluate
88
+ end
89
+
90
+ Dir.chdir(pwd)
91
+ end
92
+ end
93
+
94
+ class KnjEruby < Erubis::Eruby
95
+ include Erubis::StdoutEnhancer
96
+
97
+ @headers = [
98
+ ["Content-Type", "text/html; charset=utf-8"]
99
+ ]
100
+ @filepath = File.dirname(Knj::Os::realpath(__FILE__))
101
+ @connects = {}
102
+
103
+ def self.fcgi=(newvalue); @fcgi = newvalue; end
104
+ def self.fcgi; return @fcgi; end
105
+ def self.connects; return @connects; end
106
+ def self.headers; return @headers; end
107
+
108
+ def self.print_headers(args = {})
109
+ header_str = ""
110
+
111
+ @headers.each do |header|
112
+ header_str += "#{header[0]}: #{header[1]}\n"
113
+ end
114
+
115
+ header_str += "\n"
116
+ self.reset_headers if @fcgi
117
+ return header_str
118
+ end
119
+
120
+ def self.has_status_header?
121
+ @headers.each do |header|
122
+ if header[0] == "Status"
123
+ return true
124
+ end
125
+ end
126
+
127
+ return false
128
+ end
129
+
130
+ def self.reset_connects
131
+ @connects = {}
132
+ end
133
+
134
+ def self.reset_headers
135
+ @headers = [
136
+ ["Content-Type", "text/html; charset=utf-8"]
137
+ ]
138
+ end
139
+
140
+ def self.header(key, value)
141
+ @headers << [key, value]
142
+ end
143
+
144
+ def self.filepath
145
+ return @filepath
146
+ end
147
+
148
+ def self.connect(signal, &block)
149
+ @connects[signal] = [] if !@connects[signal]
150
+ @connects[signal] << block
151
+ end
152
+
153
+ def self.printcont(tmp_out, args = {})
154
+ if @fcgi
155
+ @fcgi.print self.print_headers
156
+ tmp_out.rewind
157
+ @fcgi.print tmp_out.read.to_s
158
+ else
159
+ if args[:io] and !args[:custom_io]
160
+ old_out = $stdout
161
+ $stdout = args[:io]
162
+ elsif !args[:custom_io]
163
+ $stdout = STDOUT
164
+ end
165
+
166
+ if !args[:custom_io]
167
+ print self.print_headers if !args.has_key?(:with_headers) or args[:with_headers]
168
+ tmp_out.rewind
169
+ print tmp_out.read
170
+ end
171
+ end
172
+ end
173
+
174
+ def self.load_return(filename, args = {})
175
+ if !args[:io]
176
+ retio = StringIO.new
177
+ args[:io] = retio
178
+ end
179
+
180
+ @args = args
181
+ KnjEruby.load(filename, args)
182
+
183
+ if !args[:custom_io]
184
+ retio.rewind
185
+ return retio.read
186
+ end
187
+ end
188
+
189
+ def self.load(filename, args = {})
190
+ begin
191
+ if !args[:custom_io]
192
+ tmp_out = StringIO.new
193
+ $stdout = tmp_out
194
+ end
195
+
196
+ ERuby.import(filename)
197
+
198
+ if KnjEruby.connects["exit"]
199
+ KnjEruby.connects["exit"].each do |block|
200
+ block.call
201
+ end
202
+ end
203
+
204
+ KnjEruby.printcont(tmp_out, args)
205
+ rescue SystemExit => e
206
+ KnjEruby.printcont(tmp_out, args)
207
+ rescue Exception => e
208
+ begin
209
+ if KnjEruby.connects["error"]
210
+ KnjEruby.connects["error"].each do |block|
211
+ block.call(e)
212
+ end
213
+ end
214
+ rescue SystemExit => e
215
+ exit
216
+ rescue Exception => e
217
+ #An error occurred while trying to run the on-error-block - show this as an normal error.
218
+ print "\n\n<pre>\n\n"
219
+ print "<b>#{CGI.escapeHTML(e.class.name)}: #{CGI.escapeHTML(e.message)}</b>\n\n"
220
+
221
+ #Lets hide all the stuff in what is not the users files to make it easier to debug.
222
+ bt = e.backtrace
223
+ #to = bt.length - 9
224
+ #bt = bt[0..to]
225
+
226
+ bt.each do |line|
227
+ print CGI.escapeHTML(line) + "\n"
228
+ end
229
+
230
+ print "</pre>"
231
+ end
232
+
233
+ print "\n\n<pre>\n\n"
234
+ print "<b>#{CGI.escapeHTML(e.class.name)}: #{CGI.escapeHTML(e.message)}</b>\n\n"
235
+
236
+ #Lets hide all the stuff in what is not the users files to make it easier to debug.
237
+ bt = e.backtrace
238
+ to = bt.length - 9
239
+ bt = bt[0..to]
240
+
241
+ bt.each do |line|
242
+ print CGI.escapeHTML(line) + "\n"
243
+ end
244
+
245
+ KnjEruby.printcont(tmp_out, args)
246
+ end
247
+ end
248
+ end
data/lib/knj/errors.rb ADDED
@@ -0,0 +1,19 @@
1
+ module Knj::Errors
2
+ class Notice < StandardError; end
3
+ class NotFound < StandardError; end
4
+ class InvalidData < StandardError; end
5
+ class Retry < StandardError; end
6
+ class NoAccess < StandardError; end
7
+
8
+ def self.error_str(err, args = {})
9
+ if args[:html]
10
+ str += "<b>#{err.class.name}</b>: #{err.message}<br />\n<br />\n"
11
+ str += err.backtrace.join("<br />\n")
12
+ else
13
+ str = "#{err.class.name}: #{err.message}\n\n"
14
+ str += err.backtrace.join("\n")
15
+ end
16
+
17
+ return str
18
+ end
19
+ end
data/lib/knj/eruby.rb ADDED
@@ -0,0 +1,224 @@
1
+ class Knj::Eruby
2
+ attr_reader :fcgi
3
+ attr_reader :connects, :headers
4
+
5
+ def initialize(args = {})
6
+ @args = args
7
+
8
+ require "tmpdir"
9
+ @tmpdir = "#{Dir.tmpdir}/knj_erb"
10
+ Dir.mkdir(@tmpdir) if !File.exists?(@tmpdir)
11
+
12
+
13
+ #This argument can be used if a shared cache should be used to speed up performance.
14
+ if @args[:cache_hash]
15
+ @cache = @args[:cache_hash]
16
+ else
17
+ @cache = {}
18
+ end
19
+
20
+ if RUBY_PLATFORM == "java"
21
+ #@cache_mode = :code_eval
22
+ @cache_mode = :compile_knj
23
+ elsif RUBY_VERSION.slice(0..2) == "1.9" and RubyVM::InstructionSequence.respond_to?(:compile_file)
24
+ @cache_mode = :inseq
25
+ #@cache_mode = :compile_knj
26
+ end
27
+
28
+ if @cache_mode == :compile_knj
29
+ @compiler = Knj::Compiler.new(:cache_hash => @cache)
30
+ end
31
+
32
+ self.reset_headers
33
+ self.reset_connects
34
+ end
35
+
36
+ def import(filename)
37
+ Dir.mkdir(@tmpdir) if !File.exists?(@tmpdir)
38
+ filename = File.expand_path(filename)
39
+ raise "File does not exist: #{filename}" if !File.exists?(filename)
40
+ filetime = File.mtime(filename)
41
+ cachename = "#{@tmpdir}/#{filename.gsub("/", "_").gsub(".", "_")}.cache"
42
+ cachetime = File.mtime(cachename) if File.exists?(cachename)
43
+
44
+ begin
45
+ if !File.exists?(cachename) or filetime > cachetime
46
+ Knj::Eruby::Handler.load_file(filename, {:cachename => cachename})
47
+ cachetime = File.mtime(cachename)
48
+ reload_cache = true
49
+ elsif !@cache.has_key?(cachename)
50
+ reload_cache = true
51
+ end
52
+
53
+ case @cache_mode
54
+ when :compile_knj
55
+ @compiler.eval_file(:filepath => cachename, :fileident => filename)
56
+ when :code_eval
57
+ @cache[cachename] = File.read(cachename) if reload_cache
58
+ eval(@cache[cachename], nil, filename)
59
+ when :inseq
60
+ if reload_cache or @cache[cachename][:time] < cachetime
61
+ @cache[cachename] = {
62
+ :inseq => RubyVM::InstructionSequence.compile(File.read(cachename), filename, nil, 1),
63
+ :time => Time.new
64
+ }
65
+ end
66
+
67
+ @cache[cachename][:inseq].eval
68
+ else
69
+ loaded_content = Knj::Eruby::Handler.load_file(filename, {:cachename => cachename})
70
+ print loaded_content.evaluate
71
+ end
72
+ rescue SystemExit
73
+ #do nothing.
74
+ rescue Exception => e
75
+ self.handle_error(e)
76
+ end
77
+ end
78
+
79
+ def destroy
80
+ @connects.clear if @connects.is_a?(Hash)
81
+ @headers.clear if @headers.is_a?(Array)
82
+
83
+ @cache.clear if @cache.is_a?(Hash) and @args and !@args.has_key?(:cache_hash)
84
+ @args.clear if @args.is_a?(Hash)
85
+ @args = nil
86
+ @cache = nil
87
+ @connects = nil
88
+ @headers = nil
89
+ end
90
+
91
+ def print_headers(args = {})
92
+ header_str = ""
93
+
94
+ @headers.each do |header|
95
+ header_str += "#{header[0]}: #{header[1]}\n"
96
+ end
97
+
98
+ header_str += "\n"
99
+ self.reset_headers if @fcgi
100
+ return header_str
101
+ end
102
+
103
+ def has_status_header?
104
+ @headers.each do |header|
105
+ return true if header[0] == "Status"
106
+ end
107
+
108
+ return false
109
+ end
110
+
111
+ def reset_connects
112
+ @connects = {}
113
+ end
114
+
115
+ def reset_headers
116
+ @headers = []
117
+ end
118
+
119
+ def header(key, value)
120
+ @headers << [key, value]
121
+ end
122
+
123
+ def connect(signal, &block)
124
+ @connects[signal] = [] if !@connects.has_key?(signal)
125
+ @connects[signal] << block
126
+ end
127
+
128
+ def printcont(tmp_out, args = {})
129
+ if @fcgi
130
+ @fcgi.print self.print_headers
131
+ tmp_out.rewind
132
+ @fcgi.print tmp_out.read.to_s
133
+ else
134
+ if args[:io] and !args[:custom_io]
135
+ old_out = $stdout
136
+ $stdout = args[:io]
137
+ elsif !args[:custom_io]
138
+ $stdout = STDOUT
139
+ end
140
+
141
+ if !args[:custom_io]
142
+ print self.print_headers if !args.has_key?(:with_headers) or args[:with_headers]
143
+ tmp_out.rewind
144
+ print tmp_out.read
145
+ end
146
+ end
147
+ end
148
+
149
+ def load_return(filename, args = {})
150
+ if !args[:io]
151
+ retio = StringIO.new
152
+ args[:io] = retio
153
+ end
154
+
155
+ self.load_filename(filename, args)
156
+
157
+ if !args[:custom_io]
158
+ retio.rewind
159
+ return retio.read
160
+ end
161
+ end
162
+
163
+ def load_filename(filename, args = {})
164
+ begin
165
+ if !args[:custom_io]
166
+ tmp_out = StringIO.new
167
+ $stdout = tmp_out
168
+ end
169
+
170
+ self.import(filename)
171
+
172
+ if @connects["exit"]
173
+ @connects["exit"].each do |block|
174
+ block.call
175
+ end
176
+ end
177
+
178
+ self.printcont(tmp_out, args)
179
+ rescue SystemExit => e
180
+ self.printcont(tmp_out, args)
181
+ rescue Exception => e
182
+ self.handle_error(e)
183
+ self.printcont(tmp_out, args)
184
+ end
185
+ end
186
+
187
+ def handle_error(e)
188
+ begin
189
+ if @connects and @connects.has_key?("error")
190
+ @connects["error"].each do |block|
191
+ block.call(e)
192
+ end
193
+ end
194
+ rescue SystemExit => e
195
+ exit
196
+ rescue Exception => e
197
+ #An error occurred while trying to run the on-error-block - show this as an normal error.
198
+ print "\n\n<pre>\n\n"
199
+ print "<b>#{CGI.escapeHTML(e.class.name)}: #{CGI.escapeHTML(e.message)}</b>\n\n"
200
+
201
+ #Lets hide all the stuff in what is not the users files to make it easier to debug.
202
+ bt = e.backtrace
203
+ #to = bt.length - 9
204
+ #bt = bt[0..to]
205
+
206
+ bt.each do |line|
207
+ print CGI.escapeHTML(line) + "\n"
208
+ end
209
+
210
+ print "</pre>"
211
+ end
212
+
213
+ print "\n\n<pre>\n\n"
214
+ print "<b>#{CGI.escapeHTML(e.class.name)}: #{CGI.escapeHTML(e.message)}</b>\n\n"
215
+
216
+ e.backtrace.each do |line|
217
+ print CGI.escapeHTML(line) + "\n"
218
+ end
219
+ end
220
+ end
221
+
222
+ class Knj::Eruby::Handler < Erubis::Eruby
223
+ include Erubis::StdoutEnhancer
224
+ end
@@ -0,0 +1,53 @@
1
+ class Knj::Event_filemod
2
+ attr_reader :args
3
+
4
+ def initialize(args, &block)
5
+ @args = args
6
+ @run = true
7
+
8
+ @args[:wait] = 1 if !@args.has_key?(:wait)
9
+
10
+ @mtimes = {}
11
+ args[:paths].each do |path|
12
+ @mtimes[path] = File.mtime(path)
13
+ end
14
+
15
+ Knj::Thread.new do
16
+ while @run do
17
+ break if !@args or !@args[:paths] or @args[:paths].empty?
18
+
19
+ @args[:paths].clone.each do |path|
20
+ changed = false
21
+
22
+ if @mtimes and !@mtimes.has_key?(path) and @mtimes.is_a?(Hash)
23
+ @mtimes[path] = File.mtime(path)
24
+ end
25
+
26
+ begin
27
+ newdate = File.mtime(path)
28
+ rescue Errno::ENOENT
29
+ #file does not exist.
30
+ changed = true
31
+ end
32
+
33
+ if !changed and newdate and @mtimes and newdate > @mtimes[path]
34
+ changed = true
35
+ end
36
+
37
+ if changed
38
+ block.call(self, path)
39
+ @args[:paths].delete(path) if @args and @args[:break_when_changed]
40
+ end
41
+ end
42
+
43
+ sleep @args[:wait] if @args and @run
44
+ end
45
+ end
46
+ end
47
+
48
+ def destroy
49
+ @mtimes = {}
50
+ @run = false
51
+ @args = nil
52
+ end
53
+ end
@@ -0,0 +1,69 @@
1
+ class Knj::Event_handler
2
+ def initialize(args = {})
3
+ @args = args
4
+ @events = {}
5
+ end
6
+
7
+ def add_event(event)
8
+ raise "No name given." if !event[:name]
9
+
10
+ @events[event[:name]] = [] if !@events.has_key?(event[:name])
11
+ @events[event[:name]] = {
12
+ :event => event,
13
+ :callbacks => {},
14
+ :callbacks_count => 0
15
+ }
16
+ end
17
+
18
+ def add_events(*events)
19
+ events.each do |event|
20
+ self.add_event(:name => event)
21
+ end
22
+ end
23
+
24
+ def connect(name, &block)
25
+ raise "No such event." if !@events.has_key?(name)
26
+
27
+ event = @events[name]
28
+
29
+ if event[:event].has_key?(:connections_max) and event[:callbacks].length >= event[:event][:connections_max].to_i
30
+ raise "The event '#{name}' has reached its maximum connections of '#{event[:event][:connections_max]}'"
31
+ end
32
+
33
+ event[:callbacks_count] += 1
34
+ count = event[:callbacks_count]
35
+ event[:callbacks][count] = {
36
+ :block => block
37
+ }
38
+
39
+ return count
40
+ end
41
+
42
+ def disconnect(name, callback_id)
43
+ raise "No such event: '#{name}'." if !@events.has_key?(name)
44
+ raise "No such connection: '#{name}' --> '#{callback_id}'" if !@events[name].has_key?(callback_id)
45
+ @events[name][callback_id].clear
46
+ @events[name].delete(callback_id)
47
+ end
48
+
49
+ def count_connects(name)
50
+ raise "No such event." if !@events.has_key?(name)
51
+ return @events[name][:callbacks].length
52
+ end
53
+
54
+ def connected?(name)
55
+ raise "No such event." if !@events.has_key?(name)
56
+ return !@events[name][:callbacks].empty?
57
+ end
58
+
59
+ def call(name, *args)
60
+ raise "No such event: '#{name}'." if !@events.has_key?(name)
61
+ event = @events[name]
62
+ ret = nil
63
+ event[:callbacks].clone.each do |callback_id, callback_hash|
64
+ ret = callback_hash[:block].call(name, *args)
65
+ end
66
+
67
+ return ret
68
+ end
69
+ end
@@ -0,0 +1,39 @@
1
+ class Knj::Exchangerates
2
+ attr_reader :rates
3
+
4
+ def initialize(args = {})
5
+ @rates = {}
6
+ end
7
+
8
+ def base=(data)
9
+ @base = data[:locale].to_s
10
+ self.add_rate(data)
11
+ end
12
+
13
+ def add_rate(data)
14
+ if !data[:locale] or data[:locale].to_s.length <= 0
15
+ raise "Invalid locale given."
16
+ end
17
+
18
+ @rates[data[:locale].to_s] = data
19
+ end
20
+
21
+ def value(locale, floatval)
22
+ floatval = floatval.to_f
23
+ locale = locale.to_s
24
+
25
+ raise "No such locale: '#{locale}' in '#{@rates.keys.join(",")}'." if !@rates.has_key?(locale)
26
+
27
+ base_rate = @rates[@base][:rate].to_f
28
+ cur_rate = @rates[locale][:rate].to_f
29
+
30
+ if base_rate == cur_rate
31
+ return floatval
32
+ elsif cur_rate < base_rate
33
+ diff = 1 + (base_rate - cur_rate)
34
+ return floatval * diff
35
+ else
36
+ return floatval / cur_rate
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ class WEBrick::HTTPRequest
2
+ #Function to clean up memory - knj.
3
+ def destroy
4
+ arr_hash = [@cookies, @accept, @accept_charset, @accept_encoding, @accept_language, @attributes]
5
+ arr_hash.each do |val|
6
+ if val and (val.is_a?(Array) or val.is_a?(Hash))
7
+ val.clear
8
+ end
9
+ end
10
+
11
+ @config = nil
12
+ @cookies = nil
13
+ @accept = nil
14
+ end
15
+ end
16
+
17
+ class WEBrick::HTTPResponse
18
+ #Function to clean up memory - knj.
19
+ def destroy
20
+ arr_hash = [@cookies, @header]
21
+ arr_hash.each do |val|
22
+ if val and (val.is_a?(Array) or val.is_a?(Hash))
23
+ val.clear
24
+ end
25
+ end
26
+
27
+ @config = nil
28
+ @header = nil
29
+ @cookies = nil
30
+ end
31
+ end
@@ -0,0 +1,8 @@
1
+ class Knj::Filesystem
2
+ def self.copy(args)
3
+ FileUtils.rm(args[:to]) if args[:replace] and File.exists?(args[:to])
4
+ FileUtils.cp(args[:from], args[:to])
5
+ mod = File.lstat(args[:from]).mode & 0777
6
+ File.chmod(mod, args[:to])
7
+ end
8
+ end
@@ -0,0 +1,14 @@
1
+ class Knj::Fs::Filesystem
2
+ def self.args
3
+ return [
4
+ {
5
+ "title" => "Path",
6
+ "name" => "texpath"
7
+ }
8
+ ]
9
+ end
10
+
11
+ def initialize(args)
12
+ @args = args
13
+ end
14
+ end