IOWA 1.0.0

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 (502) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTORS +14 -0
  3. data/README.md +23 -0
  4. data/RELEASE_NOTES +77 -0
  5. data/ToDo +21 -0
  6. data/components/CRUDList/CRUDList.html +13 -0
  7. data/components/CRUDList/CRUDList.iwa +136 -0
  8. data/components/Content/Content.html +0 -0
  9. data/components/Content/Content.iwa +143 -0
  10. data/components/Content/example/README +9 -0
  11. data/components/Content/example/cgi/iowa.cgi +10 -0
  12. data/components/Content/example/demo.rb +30 -0
  13. data/components/Content/example/doc/index.html +7 -0
  14. data/components/Content/example/iowa/Content.html +1 -0
  15. data/components/Content/example/iowa/Content.iwa +1 -0
  16. data/components/Content/example/iowa/Main.html +6 -0
  17. data/components/Content/example/iowa/Main.iwa +3 -0
  18. data/components/Content/example/iowa/_content/body +7 -0
  19. data/components/Content/example/iowa/_content/body2 +3 -0
  20. data/components/Content/example/iowa/_content/title +2 -0
  21. data/components/Content/example/iowa/app.cnf +8 -0
  22. data/components/Content/example/iowa/app.rb +8 -0
  23. data/components/Content/example/webrick.rb +38 -0
  24. data/components/Include/Include.html +1 -0
  25. data/components/Include/Include.iwa +30 -0
  26. data/components/Include/readme +5 -0
  27. data/components/JumpTo/JumpTo.html +8 -0
  28. data/components/JumpTo/JumpTo.iwa +8 -0
  29. data/components/JumpTo/readme +6 -0
  30. data/doc/Architecture.txt +6 -0
  31. data/doc/History.txt +33 -0
  32. data/doc/StandardDispatcher.txt +19 -0
  33. data/examples/blog/README +1 -0
  34. data/examples/hello_world/README +17 -0
  35. data/examples/hello_world/htdocs/hello_world_html.html +24 -0
  36. data/examples/hello_world/htdocs/hello_world_ruby.html +41 -0
  37. data/examples/hello_world/iowa/HelloWorld.html +14 -0
  38. data/examples/hello_world/iowa/HelloWorld.iwa +31 -0
  39. data/examples/hello_world/iowa/Index.html +16 -0
  40. data/examples/hello_world/iowa/Index.iwa +5 -0
  41. data/examples/hello_world/iowa/iowa_hello_world.cnf +19 -0
  42. data/examples/hello_world/iowa/iowa_hello_world.rb +5 -0
  43. data/examples/hello_world/iowa/mapfile.cnf +6 -0
  44. data/examples/hw1/iowa/Main.html +1 -0
  45. data/examples/hw1/iowa/README +9 -0
  46. data/examples/hw1/iowa/hw.rb +4 -0
  47. data/examples/hw2/iowa/Main.html +10 -0
  48. data/examples/hw2/iowa/Main.iwa +7 -0
  49. data/examples/hw2/iowa/README +16 -0
  50. data/examples/hw2/iowa/hw.rb +4 -0
  51. data/examples/hw3/iowa/Main.html +11 -0
  52. data/examples/hw3/iowa/Main.iwa +7 -0
  53. data/examples/hw3/iowa/README +22 -0
  54. data/examples/hw3/iowa/hw.rb +4 -0
  55. data/examples/hw4/iowa/Greetings.html +10 -0
  56. data/examples/hw4/iowa/Greetings.iwa +9 -0
  57. data/examples/hw4/iowa/Main.html +12 -0
  58. data/examples/hw4/iowa/Main.iwa +10 -0
  59. data/examples/hw4/iowa/README +28 -0
  60. data/examples/hw4/iowa/hw.rb +4 -0
  61. data/examples/hw5/iowa/Footer.html +2 -0
  62. data/examples/hw5/iowa/Greetings.html +4 -0
  63. data/examples/hw5/iowa/Greetings.iwa +12 -0
  64. data/examples/hw5/iowa/Header.html +6 -0
  65. data/examples/hw5/iowa/Main.html +12 -0
  66. data/examples/hw5/iowa/Main.iwa +13 -0
  67. data/examples/hw5/iowa/README +16 -0
  68. data/examples/hw5/iowa/hw.rb +4 -0
  69. data/examples/template_server/iowa/Content.iwa +121 -0
  70. data/examples/template_server/iowa/Content.view +0 -0
  71. data/examples/template_server/iowa/DBContentDispatcher.rb +112 -0
  72. data/examples/template_server/iowa/DBContentPage.html +3 -0
  73. data/examples/template_server/iowa/DBContentPage.iwa +85 -0
  74. data/examples/template_server/iowa/app.cnf +13 -0
  75. data/examples/template_server/iowa/app.rb +5 -0
  76. data/ext/Classifier/classifier.c +256 -0
  77. data/ext/Classifier/ext_help.h +14 -0
  78. data/ext/Classifier/extconf.rb +5 -0
  79. data/ext/Classifier/tst.h +40 -0
  80. data/ext/Classifier/tst_cleanup.c +24 -0
  81. data/ext/Classifier/tst_delete.c +146 -0
  82. data/ext/Classifier/tst_grow_node_free_list.c +38 -0
  83. data/ext/Classifier/tst_init.c +41 -0
  84. data/ext/Classifier/tst_insert.c +192 -0
  85. data/ext/Classifier/tst_search.c +68 -0
  86. data/ext/http11/README +11 -0
  87. data/ext/http11/ext_help.h +15 -0
  88. data/ext/http11/extconf.rb +5 -0
  89. data/ext/http11/http11.c +534 -0
  90. data/ext/http11/http11.c.dif +422 -0
  91. data/ext/http11/http11_parser.c +1243 -0
  92. data/ext/http11/http11_parser.c.dif +193 -0
  93. data/ext/http11/http11_parser.h +49 -0
  94. data/ext/http11/http11_parser.h.dif +20 -0
  95. data/ext/http11/http11_parser.rl +192 -0
  96. data/ext/httpmachine/Makefile +149 -0
  97. data/ext/httpmachine/extconf.rb +33 -0
  98. data/ext/httpmachine/http.cpp +430 -0
  99. data/ext/httpmachine/http.h +156 -0
  100. data/ext/httpmachine/rubyhttp.cpp +165 -0
  101. data/external/mime-types/LICENCE +18 -0
  102. data/external/mime-types/README +46 -0
  103. data/external/mime-types/doc/classes/MIME.html +120 -0
  104. data/external/mime-types/doc/classes/MIME/InvalidContentType.html +119 -0
  105. data/external/mime-types/doc/classes/MIME/Type.html +866 -0
  106. data/external/mime-types/doc/classes/MIME/Type.src/M000010.html +22 -0
  107. data/external/mime-types/doc/classes/MIME/Type.src/M000011.html +18 -0
  108. data/external/mime-types/doc/classes/MIME/Type.src/M000012.html +19 -0
  109. data/external/mime-types/doc/classes/MIME/Type.src/M000013.html +18 -0
  110. data/external/mime-types/doc/classes/MIME/Type.src/M000014.html +26 -0
  111. data/external/mime-types/doc/classes/MIME/Type.src/M000015.html +33 -0
  112. data/external/mime-types/doc/classes/MIME/Type.src/M000016.html +27 -0
  113. data/external/mime-types/doc/classes/MIME/Type.src/M000017.html +35 -0
  114. data/external/mime-types/doc/classes/MIME/Type.src/M000018.html +34 -0
  115. data/external/mime-types/doc/classes/MIME/Type.src/M000019.html +24 -0
  116. data/external/mime-types/doc/classes/MIME/Type.src/M000020.html +38 -0
  117. data/external/mime-types/doc/classes/MIME/Type.src/M000021.html +22 -0
  118. data/external/mime-types/doc/classes/MIME/Type.src/M000022.html +18 -0
  119. data/external/mime-types/doc/classes/MIME/Type.src/M000023.html +18 -0
  120. data/external/mime-types/doc/classes/MIME/Type.src/M000024.html +18 -0
  121. data/external/mime-types/doc/classes/MIME/Type.src/M000025.html +18 -0
  122. data/external/mime-types/doc/classes/MIME/Type.src/M000026.html +18 -0
  123. data/external/mime-types/doc/classes/MIME/Type.src/M000027.html +18 -0
  124. data/external/mime-types/doc/classes/MIME/Type.src/M000028.html +18 -0
  125. data/external/mime-types/doc/classes/MIME/Type.src/M000029.html +18 -0
  126. data/external/mime-types/doc/classes/MIME/Type.src/M000030.html +19 -0
  127. data/external/mime-types/doc/classes/MIME/Type.src/M000031.html +26 -0
  128. data/external/mime-types/doc/classes/MIME/Types.html +459 -0
  129. data/external/mime-types/doc/classes/MIME/Types.src/M000001.html +19 -0
  130. data/external/mime-types/doc/classes/MIME/Types.src/M000002.html +32 -0
  131. data/external/mime-types/doc/classes/MIME/Types.src/M000003.html +21 -0
  132. data/external/mime-types/doc/classes/MIME/Types.src/M000004.html +18 -0
  133. data/external/mime-types/doc/classes/MIME/Types.src/M000005.html +26 -0
  134. data/external/mime-types/doc/classes/MIME/Types.src/M000006.html +18 -0
  135. data/external/mime-types/doc/classes/MIME/Types.src/M000007.html +18 -0
  136. data/external/mime-types/doc/classes/MIME/Types.src/M000008.html +18 -0
  137. data/external/mime-types/doc/classes/MIME/Types.src/M000009.html +18 -0
  138. data/external/mime-types/doc/created.rid +1 -0
  139. data/external/mime-types/doc/files/ChangeLog.html +320 -0
  140. data/external/mime-types/doc/files/README.html +145 -0
  141. data/external/mime-types/doc/files/lib/mime/types_rb.html +101 -0
  142. data/external/mime-types/doc/fr_class_index.html +30 -0
  143. data/external/mime-types/doc/fr_file_index.html +29 -0
  144. data/external/mime-types/doc/fr_method_index.html +57 -0
  145. data/external/mime-types/doc/index.html +24 -0
  146. data/external/mime-types/doc/rdoc-style.css +208 -0
  147. data/external/mime-types/lib/mime/types.rb +1558 -0
  148. data/external/package.rb +672 -0
  149. data/external/test_support.rb +95 -0
  150. data/external/tmail/README +7 -0
  151. data/external/tmail/tmail.rb +4 -0
  152. data/external/tmail/tmail/address.rb +222 -0
  153. data/external/tmail/tmail/base64.rb +52 -0
  154. data/external/tmail/tmail/compat.rb +39 -0
  155. data/external/tmail/tmail/config.rb +50 -0
  156. data/external/tmail/tmail/encode.rb +447 -0
  157. data/external/tmail/tmail/header.rb +895 -0
  158. data/external/tmail/tmail/info.rb +14 -0
  159. data/external/tmail/tmail/loader.rb +1 -0
  160. data/external/tmail/tmail/mail.rb +869 -0
  161. data/external/tmail/tmail/mailbox.rb +386 -0
  162. data/external/tmail/tmail/mbox.rb +1 -0
  163. data/external/tmail/tmail/net.rb +260 -0
  164. data/external/tmail/tmail/obsolete.rb +123 -0
  165. data/external/tmail/tmail/parser.rb +1475 -0
  166. data/external/tmail/tmail/parser.y +372 -0
  167. data/external/tmail/tmail/port.rb +356 -0
  168. data/external/tmail/tmail/scanner.rb +17 -0
  169. data/external/tmail/tmail/scanner_r.rb +243 -0
  170. data/external/tmail/tmail/stringio.rb +256 -0
  171. data/external/tmail/tmail/textutils.rb +197 -0
  172. data/external/tmail/tmail/tmail.rb +1 -0
  173. data/external/tmail/tmail/utils.rb +23 -0
  174. data/external/win32-process/README +133 -0
  175. data/external/win32-process/lib/win32/process.rb +561 -0
  176. data/external/windows-pr/README +145 -0
  177. data/external/windows-pr/doc/conversion_guide.txt +25 -0
  178. data/external/windows-pr/lib/windows/clipboard.rb +72 -0
  179. data/external/windows-pr/lib/windows/console.rb +323 -0
  180. data/external/windows-pr/lib/windows/device_io.rb +88 -0
  181. data/external/windows-pr/lib/windows/directory.rb +80 -0
  182. data/external/windows-pr/lib/windows/error.rb +313 -0
  183. data/external/windows-pr/lib/windows/eventlog.rb +120 -0
  184. data/external/windows-pr/lib/windows/file.rb +349 -0
  185. data/external/windows-pr/lib/windows/filesystem.rb +16 -0
  186. data/external/windows-pr/lib/windows/handle.rb +31 -0
  187. data/external/windows-pr/lib/windows/library.rb +76 -0
  188. data/external/windows-pr/lib/windows/limits.rb +13 -0
  189. data/external/windows-pr/lib/windows/memory.rb +117 -0
  190. data/external/windows-pr/lib/windows/msvcrt/buffer.rb +48 -0
  191. data/external/windows-pr/lib/windows/msvcrt/file.rb +18 -0
  192. data/external/windows-pr/lib/windows/msvcrt/string.rb +46 -0
  193. data/external/windows-pr/lib/windows/national.rb +557 -0
  194. data/external/windows-pr/lib/windows/path.rb +296 -0
  195. data/external/windows-pr/lib/windows/pipe.rb +77 -0
  196. data/external/windows-pr/lib/windows/process.rb +171 -0
  197. data/external/windows-pr/lib/windows/registry.rb +238 -0
  198. data/external/windows-pr/lib/windows/security.rb +89 -0
  199. data/external/windows-pr/lib/windows/service.rb +183 -0
  200. data/external/windows-pr/lib/windows/shell.rb +88 -0
  201. data/external/windows-pr/lib/windows/sound.rb +52 -0
  202. data/external/windows-pr/lib/windows/synchronize.rb +161 -0
  203. data/external/windows-pr/lib/windows/system_info.rb +70 -0
  204. data/external/windows-pr/lib/windows/unicode.rb +138 -0
  205. data/external/windows-pr/lib/windows/window.rb +22 -0
  206. data/iowa.gemspec +45 -0
  207. data/microprojects/DiskCache/LICENSE +28 -0
  208. data/microprojects/DiskCache/README +17 -0
  209. data/microprojects/DiskCache/external/package.rb +608 -0
  210. data/microprojects/DiskCache/external/test_support.rb +8 -0
  211. data/microprojects/DiskCache/setup.rb +22 -0
  212. data/microprojects/DiskCache/src/iowa/Association.rb +67 -0
  213. data/microprojects/DiskCache/src/iowa/Constants.rb +159 -0
  214. data/microprojects/DiskCache/src/iowa/DiskStore.rb +377 -0
  215. data/microprojects/DiskCache/src/iowa/Hash.rb +63 -0
  216. data/microprojects/DiskCache/src/iowa/Lockfile.rb +575 -0
  217. data/microprojects/DiskCache/src/iowa/Mutex.rb +142 -0
  218. data/microprojects/DiskCache/src/iowa/caches/DiskCache.rb +605 -0
  219. data/microprojects/DiskCache/src/iowa/caches/LRUCache.rb +287 -0
  220. data/microprojects/DiskCache/test/TC_DiskCache.rb +218 -0
  221. data/microprojects/LRUCache/LICENSE +28 -0
  222. data/microprojects/LRUCache/README +13 -0
  223. data/microprojects/LRUCache/external/package.rb +608 -0
  224. data/microprojects/LRUCache/external/test_support.rb +8 -0
  225. data/microprojects/LRUCache/setup.rb +22 -0
  226. data/microprojects/LRUCache/src/iowa/Association.rb +57 -0
  227. data/microprojects/LRUCache/src/iowa/Constants.rb +159 -0
  228. data/microprojects/LRUCache/src/iowa/Hash.rb +63 -0
  229. data/microprojects/LRUCache/src/iowa/Mutex.rb +129 -0
  230. data/microprojects/LRUCache/src/iowa/caches/LRUCache.rb +287 -0
  231. data/microprojects/LRUCache/test/TC_LRUCache.rb +65 -0
  232. data/microprojects/LinkedList/LICENSE +28 -0
  233. data/microprojects/LinkedList/README +13 -0
  234. data/microprojects/LinkedList/external/package.rb +608 -0
  235. data/microprojects/LinkedList/external/test_support.rb +8 -0
  236. data/microprojects/LinkedList/setup.rb +22 -0
  237. data/microprojects/LinkedList/src/iowa/LinkedList.rb +165 -0
  238. data/microprojects/LinkedList/test/TC_LinkedList.rb +42 -0
  239. data/microprojects/README +8 -0
  240. data/setup.rb +116 -0
  241. data/share/iowa/app_skeleton/Main.html +8 -0
  242. data/share/iowa/app_skeleton/Main.iwa +15 -0
  243. data/share/iowa/app_skeleton/app.cnf +48 -0
  244. data/share/iowa/app_skeleton/app.rb +58 -0
  245. data/share/iowa/app_skeleton/models/model.rb +49 -0
  246. data/src/ihc.rb +223 -0
  247. data/src/iowa.cgi +29 -0
  248. data/src/iowa.rb +637 -0
  249. data/src/iowa/AbstractCache.rb +96 -0
  250. data/src/iowa/AcceptLanguage.rb +76 -0
  251. data/src/iowa/Application.rb +928 -0
  252. data/src/iowa/ApplicationStats.rb +72 -0
  253. data/src/iowa/Association.rb +67 -0
  254. data/src/iowa/BindingsParser.rb +62 -0
  255. data/src/iowa/Breakpoint.rb +273 -0
  256. data/src/iowa/CSS.rb +564 -0
  257. data/src/iowa/Client.rb +192 -0
  258. data/src/iowa/Component.rb +405 -0
  259. data/src/iowa/ComponentProxy.rb +26 -0
  260. data/src/iowa/Config.rb +21 -0
  261. data/src/iowa/Constants.rb +226 -0
  262. data/src/iowa/Context.rb +218 -0
  263. data/src/iowa/ContextLogger.rb +16 -0
  264. data/src/iowa/DbPool.rb +222 -0
  265. data/src/iowa/DetachedComponent.rb +18 -0
  266. data/src/iowa/Dispatcher.rb +27 -0
  267. data/src/iowa/DynamicElements.rb +471 -0
  268. data/src/iowa/Element.rb +100 -0
  269. data/src/iowa/Email.rb +287 -0
  270. data/src/iowa/Extensions/AllExtensions.rb +4 -0
  271. data/src/iowa/Extensions/Class.rb +94 -0
  272. data/src/iowa/Extensions/Date.rb +88 -0
  273. data/src/iowa/Extensions/DateTime.rb +88 -0
  274. data/src/iowa/Extensions/Hash.rb +22 -0
  275. data/src/iowa/Extensions/Kernel.rb +6 -0
  276. data/src/iowa/Extensions/Numeric.rb +47 -0
  277. data/src/iowa/Extensions/Object.rb +11 -0
  278. data/src/iowa/Extensions/String.rb +60 -0
  279. data/src/iowa/Extensions/Time.rb +89 -0
  280. data/src/iowa/Extensions/TimeExtensions.rb +6 -0
  281. data/src/iowa/Form.rb +368 -0
  282. data/src/iowa/Hash.rb +85 -0
  283. data/src/iowa/ISAAC.rb +175 -0
  284. data/src/iowa/ImageSize.rb +279 -0
  285. data/src/iowa/IowaComponentMixins.rb +7 -0
  286. data/src/iowa/JSON-lexer.rb +296 -0
  287. data/src/iowa/JSON-objects.rb +201 -0
  288. data/src/iowa/KeyValueCoding.rb +91 -0
  289. data/src/iowa/LinkedList.rb +175 -0
  290. data/src/iowa/Loader.rb +22 -0
  291. data/src/iowa/Lockfile.rb +575 -0
  292. data/src/iowa/Logger.rb +74 -0
  293. data/src/iowa/Monkey.rb +20 -0
  294. data/src/iowa/Mutex.rb +142 -0
  295. data/src/iowa/Policy.rb +70 -0
  296. data/src/iowa/Pool.rb +243 -0
  297. data/src/iowa/PrettyException.rb +1091 -0
  298. data/src/iowa/Request.rb +244 -0
  299. data/src/iowa/Response.rb +133 -0
  300. data/src/iowa/Session.rb +354 -0
  301. data/src/iowa/SessionStats.rb +78 -0
  302. data/src/iowa/String.rb +65 -0
  303. data/src/iowa/Tag.rb +101 -0
  304. data/src/iowa/TemplateParser.rb +236 -0
  305. data/src/iowa/Util.rb +314 -0
  306. data/src/iowa/Webcache.rb +122 -0
  307. data/src/iowa/caches/BiLevelCache.rb +65 -0
  308. data/src/iowa/caches/ClassLimitedCache.rb +67 -0
  309. data/src/iowa/caches/DiskCache.rb +609 -0
  310. data/src/iowa/caches/DiskStore.rb +380 -0
  311. data/src/iowa/caches/LRUCache-alternative.rb +155 -0
  312. data/src/iowa/caches/LRUCache.rb +290 -0
  313. data/src/iowa/caches/SimpleLRUCache.rb +112 -0
  314. data/src/iowa/dispatchers/StandardDispatcher.rb +396 -0
  315. data/src/iowa/dispatchers/StandardDispatcherWithClassifier.rb +93 -0
  316. data/src/iowa/js/iowa_jsonrpc.js +381 -0
  317. data/src/iowa/js/jsonrpc.js +187 -0
  318. data/src/iowa/js/jsonrpc_async.js +261 -0
  319. data/src/iowa/loaders/DiskLoader.rb +50 -0
  320. data/src/iowa/loggers/Analogger.rb +54 -0
  321. data/src/iowa/loggers/AsyncLogger.rb +54 -0
  322. data/src/iowa/loggers/BitBucket.rb +38 -0
  323. data/src/iowa/loggers/Log4R.rb +13 -0
  324. data/src/iowa/loggers/Log4rLogger.rb +48 -0
  325. data/src/iowa/loggers/Logger.rb +29 -0
  326. data/src/iowa/loggers/RubyLogger.rb +9 -0
  327. data/src/iowa/pools/DBConnectionPool.rb +53 -0
  328. data/src/iowa/request/Apache.rb +90 -0
  329. data/src/iowa/request/EMHybrid.rb +59 -0
  330. data/src/iowa/request/ENV.rb +80 -0
  331. data/src/iowa/request/FCGI.rb +68 -0
  332. data/src/iowa/request/HTTPMachine.rb +75 -0
  333. data/src/iowa/request/Mongrel.rb +68 -0
  334. data/src/iowa/request/WEBrick.rb +48 -0
  335. data/src/iowa/version.rb +3 -0
  336. data/src/iowa/webrick/HTTPServer.rb +43 -0
  337. data/src/iowa/webrick/WEBrickServlet.rb +28 -0
  338. data/src/iowa_fcgi_handler.rb +101 -0
  339. data/src/iowa_httpmachine.rb +141 -0
  340. data/src/iowa_hybrid.rb +193 -0
  341. data/src/iowa_hybrid_cluster.rb +231 -0
  342. data/src/iowa_mongrel.rb +136 -0
  343. data/src/iowa_webrick.rb +194 -0
  344. data/src/iowa_webrick_legacy.rb +104 -0
  345. data/src/mod_iowa.rb +104 -0
  346. data/tcss.rb +61 -0
  347. data/test/README.windows +12 -0
  348. data/test/TC_AcceptLanguage.rb +61 -0
  349. data/test/TC_AppConfig.rb +43 -0
  350. data/test/TC_AppConfig/cgi/iowa.cgi +7 -0
  351. data/test/TC_AppConfig/doc/index.html +1 -0
  352. data/test/TC_AppConfig/iowa/Main.html +4 -0
  353. data/test/TC_AppConfig/iowa/Main.iwa +17 -0
  354. data/test/TC_AppConfig/iowa/README +1 -0
  355. data/test/TC_AppConfig/iowa/app.cnf +19 -0
  356. data/test/TC_AppConfig/iowa/app.rb +8 -0
  357. data/test/TC_AppConfig/webrick.rb +38 -0
  358. data/test/TC_Association.rb +29 -0
  359. data/test/TC_BiLevelCache.rb +71 -0
  360. data/test/TC_CGI_Adaptor.rb +55 -0
  361. data/test/TC_CGI_Adaptor/cgi/iowa.cgi +7 -0
  362. data/test/TC_CGI_Adaptor/doc/index.html +1 -0
  363. data/test/TC_CGI_Adaptor/iowa/Main.html +8 -0
  364. data/test/TC_CGI_Adaptor/iowa/Main.iwa +14 -0
  365. data/test/TC_CGI_Adaptor/iowa/README +1 -0
  366. data/test/TC_CGI_Adaptor/iowa/app.cnf +8 -0
  367. data/test/TC_CGI_Adaptor/iowa/app.rb +8 -0
  368. data/test/TC_CGI_Adaptor/webrick.rb +38 -0
  369. data/test/TC_CSS.rb +660 -0
  370. data/test/TC_ClassLimitedCache.rb +89 -0
  371. data/test/TC_Classifier.rb +80 -0
  372. data/test/TC_DbPool.rb +127 -0
  373. data/test/TC_DiskCache.rb +218 -0
  374. data/test/TC_Hybrid.rb +58 -0
  375. data/test/TC_Hybrid/doc/thing.txt +1 -0
  376. data/test/TC_Hybrid/iowa/Main.html +3 -0
  377. data/test/TC_Hybrid/iowa/Main.iwa +7 -0
  378. data/test/TC_Hybrid/iowa/NewPage.html +1 -0
  379. data/test/TC_Hybrid/iowa/NewPage.iwa +5 -0
  380. data/test/TC_Hybrid/iowa/app.cnf +10 -0
  381. data/test/TC_Hybrid/iowa/app.rb +5 -0
  382. data/test/TC_IOWAFunctions/doc/Ajax1.html +1 -0
  383. data/test/TC_IOWAFunctions/doc/Ajax1.iwa +1 -0
  384. data/test/TC_IOWAFunctions/doc/index.html +1 -0
  385. data/test/TC_IOWAFunctions/doc/js/dojo.js +9686 -0
  386. data/test/TC_IOWAFunctions/iowa/Ajax1.html +40 -0
  387. data/test/TC_IOWAFunctions/iowa/Ajax1.iwa +23 -0
  388. data/test/TC_IOWAFunctions/iowa/AjaxWidget.iwa +19 -0
  389. data/test/TC_IOWAFunctions/iowa/AjaxWidget.view +22 -0
  390. data/test/TC_IOWAFunctions/iowa/DanielTest.html +9 -0
  391. data/test/TC_IOWAFunctions/iowa/DanielTest.iwa +10 -0
  392. data/test/TC_IOWAFunctions/iowa/IntervalWidget.html +1 -0
  393. data/test/TC_IOWAFunctions/iowa/IntervalWidget.iwa +14 -0
  394. data/test/TC_IOWAFunctions/iowa/Main.html +1 -0
  395. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.html +12 -0
  396. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.iwa +24 -0
  397. data/test/TC_IOWAFunctions/iowa/RPCResponse.iwa +7 -0
  398. data/test/TC_IOWAFunctions/iowa/RPCResponse.view +1 -0
  399. data/test/TC_IOWAFunctions/iowa/Repeat1.iwa +31 -0
  400. data/test/TC_IOWAFunctions/iowa/Repeat1.view +9 -0
  401. data/test/TC_IOWAFunctions/iowa/Repeat2.iwa +32 -0
  402. data/test/TC_IOWAFunctions/iowa/Repeat2.view +11 -0
  403. data/test/TC_IOWAFunctions/iowa/Repeat3.iwa +44 -0
  404. data/test/TC_IOWAFunctions/iowa/Repeat3.view +18 -0
  405. data/test/TC_IOWAFunctions/iowa/TesCon.html +1 -0
  406. data/test/TC_IOWAFunctions/iowa/TesCon.iwa +5 -0
  407. data/test/TC_IOWAFunctions/iowa/app.cnf +19 -0
  408. data/test/TC_IOWAFunctions/iowa/app.rb +9 -0
  409. data/test/TC_IOWAFunctions/iowa/mapfile.cnf +8 -0
  410. data/test/TC_ISAAC.rb +52 -0
  411. data/test/TC_ImageSize.rb +84 -0
  412. data/test/TC_ImageSize/img.bmp +0 -0
  413. data/test/TC_ImageSize/img.gif +0 -0
  414. data/test/TC_ImageSize/img.jpg +0 -0
  415. data/test/TC_ImageSize/img.pcx +0 -0
  416. data/test/TC_ImageSize/img.pgm +7144 -0
  417. data/test/TC_ImageSize/img.png +0 -0
  418. data/test/TC_ImageSize/img.ppm +0 -0
  419. data/test/TC_ImageSize/img.psd +0 -0
  420. data/test/TC_ImageSize/img.tiff +0 -0
  421. data/test/TC_ImageSize/img.xbm +22 -0
  422. data/test/TC_KeyValueCoding.rb +35 -0
  423. data/test/TC_LRUCache.rb +296 -0
  424. data/test/TC_LinkedList.rb +46 -0
  425. data/test/TC_Lockfile.rb +106 -0
  426. data/test/TC_Minimal.rb +45 -0
  427. data/test/TC_Minimal/app.cnf +8 -0
  428. data/test/TC_Minimal/cgi-bin/iowa.cgi +11 -0
  429. data/test/TC_Minimal/doc/index.html +1 -0
  430. data/test/TC_Minimal/iowa/Main.html +1 -0
  431. data/test/TC_Minimal/iowa/README +1 -0
  432. data/test/TC_Minimal/iowa/app.rb +3 -0
  433. data/test/TC_Minimal/webrick.rb +38 -0
  434. data/test/TC_Mongrel.rb +58 -0
  435. data/test/TC_Mongrel/doc/thing.txt +1 -0
  436. data/test/TC_Mongrel/iowa/Main.html +3 -0
  437. data/test/TC_Mongrel/iowa/Main.iwa +7 -0
  438. data/test/TC_Mongrel/iowa/NewPage.html +1 -0
  439. data/test/TC_Mongrel/iowa/NewPage.iwa +5 -0
  440. data/test/TC_Mongrel/iowa/app.cnf +10 -0
  441. data/test/TC_Mongrel/iowa/app.rb +5 -0
  442. data/test/TC_NoSubclass.rb +56 -0
  443. data/test/TC_NoSubclass/cgi/iowa.cgi +7 -0
  444. data/test/TC_NoSubclass/doc/index.html +1 -0
  445. data/test/TC_NoSubclass/iowa/Main.html +8 -0
  446. data/test/TC_NoSubclass/iowa/Main.iwa +14 -0
  447. data/test/TC_NoSubclass/iowa/README +1 -0
  448. data/test/TC_NoSubclass/iowa/app.cnf +8 -0
  449. data/test/TC_NoSubclass/iowa/app.rb +5 -0
  450. data/test/TC_NoSubclass/webrick.rb +38 -0
  451. data/test/TC_Pool.rb +139 -0
  452. data/test/TC_RenderedCache/doc/thing.txt +1 -0
  453. data/test/TC_RenderedCache/iowa/BigPage.html +1 -0
  454. data/test/TC_RenderedCache/iowa/BigPage.iwa +12 -0
  455. data/test/TC_RenderedCache/iowa/Main.html +3 -0
  456. data/test/TC_RenderedCache/iowa/Main.iwa +7 -0
  457. data/test/TC_RenderedCache/iowa/NewPage.html +1 -0
  458. data/test/TC_RenderedCache/iowa/NewPage.iwa +11 -0
  459. data/test/TC_RenderedCache/iowa/app.cnf +13 -0
  460. data/test/TC_RenderedCache/iowa/app.rb +5 -0
  461. data/test/TC_RenderedCache/iowa/mapfile.map +4 -0
  462. data/test/TC_ResourceURL.rb +73 -0
  463. data/test/TC_ResourceURL/iowa/Main.html +2 -0
  464. data/test/TC_ResourceURL/iowa/Main.iwa +10 -0
  465. data/test/TC_ResourceURL/iowa/app.cnf +10 -0
  466. data/test/TC_ResourceURL/iowa/app.rb +5 -0
  467. data/test/TC_SimpleDetached.rb +41 -0
  468. data/test/TC_StandardDispatcher.rb +362 -0
  469. data/test/TC_StandardDispatcherWithClassifier.rb +358 -0
  470. data/test/TC_String.rb +24 -0
  471. data/test/TC_Tag.rb +41 -0
  472. data/test/TC_Webrick.rb +56 -0
  473. data/test/TC_Webrick/doc/thing.txt +1 -0
  474. data/test/TC_Webrick/iowa/Main.html +3 -0
  475. data/test/TC_Webrick/iowa/Main.iwa +7 -0
  476. data/test/TC_Webrick/iowa/NewPage.html +1 -0
  477. data/test/TC_Webrick/iowa/NewPage.iwa +5 -0
  478. data/test/TC_Webrick/iowa/app.cnf +10 -0
  479. data/test/TC_Webrick/iowa/app.rb +5 -0
  480. data/test/tc_template.rb +15 -0
  481. data/test/tests.conf +19 -0
  482. data/utils/CVS/Entries +3 -0
  483. data/utils/CVS/Repository +1 -0
  484. data/utils/CVS/Root +1 -0
  485. data/utils/QuickCert-1.0.2.tar.gz +0 -0
  486. data/utils/QuickCert-1.0.2/InstalledFiles +7 -0
  487. data/utils/QuickCert-1.0.2/MANIFEST +10 -0
  488. data/utils/QuickCert-1.0.2/Makefile +15 -0
  489. data/utils/QuickCert-1.0.2/README +56 -0
  490. data/utils/QuickCert-1.0.2/bin/QuickCert +355 -0
  491. data/utils/QuickCert-1.0.2/config.save +12 -0
  492. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/README +60 -0
  493. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_c.rb +26 -0
  494. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_s.rb +35 -0
  495. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/qc_config +21 -0
  496. data/utils/QuickCert-1.0.2/lib/QuickCert/defaults.rb +28 -0
  497. data/utils/QuickCert-1.0.2/setup.rb +1312 -0
  498. data/utils/iowa_apps +422 -0
  499. data/utils/smtp_sink.rb +9 -0
  500. data/utils/startup_template.cnf +27 -0
  501. data/utils/startup_template.rb +73 -0
  502. metadata +551 -0
@@ -0,0 +1,100 @@
1
+ module Iowa
2
+
3
+ # Superclass for all Iowa elements. An element is something that looks
4
+ # like an HTML tag, and is in many cases named like an HTML tag, but
5
+ # that implements some sort of dynamic behavior.
6
+
7
+ class Element
8
+
9
+ ElementClasses={Celement => Element}
10
+ def Element.inherited(subclass)
11
+ if subclass.name[0,33] == 'Iowa::Application::ContentClasses'
12
+ ElementClasses[subclass.name.sub(/Iowa::Application::ContentClasses::/,C_empty).downcase] = subclass
13
+ else
14
+ ElementClasses[subclass.name.split(ClassSeparator).last.downcase] = subclass
15
+ end
16
+ end
17
+
18
+ def Element.newElement(classname, name, bindings, attributes, namespace = nil)
19
+ if name == CBodyContent
20
+ BodyContent.new(name, bindings, attributes)
21
+ else
22
+ klass = nil
23
+ if namespace
24
+ # Is there a more efficient way to do this?
25
+ cn = (namespace.gsub(/Iowa::Application::ContentClasses(::)*/,C_empty).split(ClassSeparator)[0..-2] << classname).join(ClassSeparator)
26
+ klass = ElementClasses[cn.downcase] if ElementClasses.has_key? cn.downcase
27
+ end
28
+ klass ||= ElementClasses[classname.downcase]
29
+
30
+ begin
31
+ unless klass.ancestors.include?(Iowa::Component)
32
+ klass.new(name, bindings, attributes)
33
+ else
34
+ ComponentProxy.new(klass, name, bindings, attributes)
35
+ end
36
+ rescue Exception => ex
37
+ raise "unknown Element type: #{classname}\n<br />#{ex}<br/>\n#{ex.backtrace}"
38
+
39
+ end
40
+ end
41
+ end
42
+
43
+ attr_accessor :name, :children, :raw_template, :raw_bindings, :attributes
44
+
45
+ def initialize(name, bindings, attributes, raw_template = nil, raw_bindings = nil)
46
+ @name = name
47
+ @raw_template = raw_template
48
+ @raw_bindings = raw_bindings
49
+ @attributes = attributes
50
+ @bindings = {}
51
+ @cached_associations = {}
52
+ defaultBindings()
53
+
54
+ bindings.each do |key,val|
55
+ @bindings[key]=val
56
+ end
57
+
58
+ @children = []
59
+ end
60
+
61
+ def self; self; end
62
+
63
+ def cached_associations
64
+ @cached_associations
65
+ end
66
+
67
+ def addChild(child)
68
+ @children.push child
69
+ end
70
+
71
+ def each(&b)
72
+ @children.each(&b)
73
+ end
74
+
75
+ def defaultBindings
76
+ end
77
+
78
+ def handleChildren(method, context)
79
+ context.pushElement
80
+ for child in @children
81
+ context.nextElement!
82
+ child.__send__(method, context)
83
+ end
84
+ context.popElement
85
+ end
86
+
87
+ def handleRequestOrResponse(method, context)
88
+ handleChildren(method, context) if @children.length > 0
89
+ end
90
+
91
+ def handleRequest(context)
92
+ handleRequestOrResponse(:handleRequest, context)
93
+ end
94
+
95
+ def handleResponse(context)
96
+ handleRequestOrResponse(:handleResponse, context)
97
+ end
98
+ end
99
+
100
+ end
@@ -0,0 +1,287 @@
1
+ if RUBY_VERSION =~ /^1\.8/
2
+ require 'tmail'
3
+ else
4
+ require 'mail'
5
+ end
6
+
7
+ require 'net/smtp'
8
+ require 'forwardable'
9
+
10
+ module Iowa
11
+ # A specialized component that lets one easily create and send customize
12
+ # email. An instance of Iowa::Email can send itself, or can return a text
13
+ # representation suitable for piping into some other sending system.
14
+ class Email < Component
15
+ extend Forwardable
16
+ def_delegators('@mail_obj','to','to=','from','from=','subject','subject=','date','date=','mime_version','mime_version=','content_type','content_type=','body','body=','cc','cc=','bcc','bcc=','reply_to','reply_to=','sender','sender=','message_id','message_id=','in_reply_to','in_reply_to=','references','references=','transfer_encoding','transfer_encoding=','disposition','disposition=')
17
+
18
+ attr_accessor :has_mimetypes, :mail_obj, :smtp_account, :smtp_password, :smtp_connection, :attachments
19
+
20
+ class Attachment < Hash
21
+ def preamble
22
+ r = ''
23
+ if self[:attachment_type] == :as_content
24
+ r << "Content-Type: #{self[:content_type]}\r\n"
25
+ r << "Content-Transfer-Encoding: bit\r\n"
26
+ else
27
+ r << "Content-Type: #{self[:content_type]}; name=#{self[:filename]}\r\n"
28
+ r << "Content-Transfer-Encoding: base64\r\n"
29
+ r << "Content-Disposition: attachment; filename=#{self[:filename]}\r\n"
30
+ end
31
+ r
32
+ end
33
+ end
34
+
35
+ def initialize(name, bindings, attributes, parent)
36
+ super(name,bindings,attributes,parent)
37
+ email_init
38
+ end
39
+
40
+ def unique_id
41
+ t = Time.now
42
+ [sprintf('%08x',Iowa.app.rand(2147483647)),
43
+ sprintf('%02x',t.to_i),
44
+ sprintf('%02x',t.usec),
45
+ sprintf('%08x',Iowa.app.rand(2147483647))].join
46
+ end
47
+
48
+ def mime_boundary
49
+ "iowa_mime_part_#{unique_id}"
50
+ end
51
+
52
+ def boundary
53
+ @boundary ||= mime_boundary
54
+ @boundary
55
+ end
56
+
57
+ def naive_mimetype_checker(fn)
58
+ filename = File.basename(fn).downcase
59
+ case filename
60
+ when /\.jp(e?)g$/
61
+ ['image/jpg']
62
+ when /\.gif$/
63
+ ['image/gif']
64
+ when /\.htm?l$/
65
+ ['text/html']
66
+ when /\.png$/
67
+ ['image/png']
68
+ when /\.txt$/
69
+ ['text/plain']
70
+ when /\.zip$/
71
+ ['application/zip']
72
+ else
73
+ ['application/data']
74
+ end
75
+ end
76
+
77
+ def check_mimetype(filename)
78
+ if has_mimetypes?
79
+ r = MIME::Types.type_for(filename)
80
+ else
81
+ r = naive_mimetype_checker(filename)
82
+ end
83
+
84
+ r.length > 0 ? r[0] : 'application/data'
85
+ end
86
+
87
+ def attach_file(file_or_handle, email_filename, attachment_type = nil)
88
+ # Use MIME::Types to get the type for the filename
89
+ # (use email_filename for this), if it is availble.
90
+ # If it is not, then fallback to a naive internal
91
+ # routine.
92
+ unless has_mimetypes
93
+ begin
94
+ require 'mime/types'
95
+ has_mimetypes = true
96
+ rescue Exception
97
+ has_mimetypes = false
98
+ end
99
+ end
100
+ mimetype = check_mimetype(email_filename)
101
+ fh = file_or_handle.kind_of?(File) ?
102
+ file_or_handle : File.new(file_or_handle)
103
+ unless attachment_type
104
+ if /^text\//.match(mimetype)
105
+ attachment_type = :as_content
106
+ else
107
+ attachment_type = :as_attachment
108
+ end
109
+ end
110
+ attach_content(fh.readlines.join,mimetype,email_filename,attachment_type)
111
+ end
112
+
113
+ def attach_content(content, content_type, email_filename=nil, attachment_type=:as_attachment)
114
+ # Attach the given content, with the given type.
115
+ # It'd be cool if there were code that could guess
116
+ # the MIME type based on the content itself, if a
117
+ # type were not given.
118
+ @boundary = mime_boundary unless @boundary
119
+ unless @attachments
120
+ @attachments = []
121
+ end
122
+ unless email_filename
123
+ @attach_name_count ||= 0
124
+ @attach_name_count += 1
125
+ email_filename = "file_#{@attach_name_count}"
126
+ end
127
+ attachment = {
128
+ :content_type => content_type,
129
+ :filename => File.basename(email_filename),
130
+ :content => content,
131
+ :attachment_type => attachment_type}
132
+ end
133
+
134
+ def mime_preamble
135
+ "\r\nThis is a multi-part message in MIME format.\r\n\r\n"
136
+ end
137
+
138
+ def email_init(params = {})
139
+ @body_generated_flag = false
140
+ @mail_obj = ::Mail.new unless mail_obj
141
+ self.subject = " "
142
+ self.content_type = 'text/plain' unless self.content_type
143
+ if h = self.class.instance_variable_get('@additional_headers')
144
+ h.each do |k,v|
145
+ @mail_obj[k] = v
146
+ end
147
+ end
148
+ [:smtp_server, :smtp_port, :helo_domain, :authentication, :smtp_account, :smtp_password, :recipients, :to, :from, :subject, :date, :sent_on, :mime_version, :content_type, :body, :cc, :bcc, :reply_to, :sender, :message_id, :in_reply_to, :references, :transfer_encoding, :disposition].each do |param|
149
+ if p = self.class.instance_variable_get("@#{param}")
150
+ self.__send__("#{param}=", p)
151
+ end
152
+ self.__send__("#{param}=", params[param])if params.has_key?(param)
153
+ params.delete(param)
154
+ end
155
+ params.each {|k,v| self[k] = v}
156
+ end
157
+
158
+ remove_method(:body)
159
+ def body
160
+ generate_body unless body_generated?
161
+ mail_obj.body
162
+ end
163
+
164
+ def preamble
165
+ generate_body unless body_generated?
166
+ mail_obj.preamble
167
+ end
168
+
169
+ def epilogue
170
+ generate_body unless body_generated?
171
+ mail_obj.epilogue
172
+ end
173
+
174
+ def multipart?
175
+ generate_body unless body_generated?
176
+ mail_obj.multipart?
177
+ end
178
+
179
+ def body_generated?
180
+ @body_generated_flag
181
+ end
182
+
183
+ def recipients
184
+ mail_obj.to
185
+ end
186
+
187
+ def recipients=(recip_list)
188
+ mail_obj.to = recip_list
189
+ end
190
+
191
+ def smtp_server
192
+ @smtp_server.nil? ? "smtp.#{Socket.gethostname}" : @smtp_server
193
+ end
194
+
195
+ def smtp_server=(server)
196
+ @smtp_server = server
197
+ end
198
+
199
+ def smtp_port
200
+ @smtp_port.nil? ? 25 : @smtp_port
201
+ end
202
+
203
+ def smtp_port=(port)
204
+ @smtp_port = port
205
+ end
206
+
207
+ def helo_domain
208
+ @helo_domain.nil? ? Socket.gethostname : @helo_comain
209
+ end
210
+
211
+ def helo_domain=(domain)
212
+ @helo_domain = domain
213
+ end
214
+
215
+ def authentication
216
+ @authentication
217
+ end
218
+
219
+ def authentication=(value)
220
+ @authentication = case value.to_s
221
+ when 'plain'
222
+ :plain
223
+ when 'login'
224
+ :login
225
+ when 'cram_md5'
226
+ :cram_md5
227
+ else
228
+ @authentication
229
+ end
230
+ end
231
+
232
+ def sent_on
233
+ date
234
+ end
235
+
236
+ def sent_on=(value)
237
+ self.date = value
238
+ end
239
+
240
+ def [](key)
241
+ mail_obj[key]
242
+ end
243
+
244
+ def []=(key,value)
245
+ mail_obj[key] = value
246
+ end
247
+
248
+ def generate_body
249
+ @body_generated_flag = true
250
+ email_context = Iowa::Context.new(session.context.request,Iowa::Response.new)
251
+ email_context.sessionID = session.context.sessionID
252
+ email_context.requestID = session.requestCount
253
+ handleResponse(email_context)
254
+ self.body = email_context.response_buffer
255
+ end
256
+
257
+ def encoded
258
+ mail_obj.encoded
259
+ end
260
+
261
+ def send
262
+ if @attachments
263
+ content_type = 'multipart/mime'
264
+ mime_version = '1.0'
265
+ end
266
+ generate_body unless body_generated?
267
+ if RUBY_VERSION =~ /^1\.8/
268
+ if smtp_connection
269
+ smtp_connection.send_message(mail_obj.encoded, from, recipients)
270
+ else
271
+ args = []
272
+ args.push smtp_account if smtp_account
273
+ args.push smtp_password if smtp_password
274
+ args.push authentication if authentication
275
+ Net::SMTP.start(smtp_server, smtp_port, helo_domain, *args) {|smtp| smtp.send_message(mail_obj.encoded, from, recipients) }
276
+ end
277
+ else
278
+ @mail_obj.delivery_method(:smtp, :address => self.smtp_server, :port => self.smtp_port)
279
+ @mail_obj.deliver
280
+ end
281
+ rescue Exception => e
282
+ Logger['iowa_log'].info "EMAIL SEND FAILED: #{e}\n#{e.backtrace.join("\n")}"
283
+ end
284
+ alias :send_email :send
285
+
286
+ end
287
+ end
@@ -0,0 +1,4 @@
1
+ require 'iowa/Extensions/TimeExtensions'
2
+ require 'iowa/Extensions/Class'
3
+ require 'iowa/Extensions/Object'
4
+ require 'iowa/Extensions/Hash'
@@ -0,0 +1,94 @@
1
+ class Class
2
+ # Return an array containing each of the subclasses of the class.
3
+ # Accepts an optional true/false argument (defaults to false).
4
+ # If false, only returns classes that can currently be instantiated.
5
+ # If true, returns all classes that currently exist.
6
+ def subclasses(all = false)
7
+ found = Hash.new
8
+ ObjectSpace.each_object(Class) do |klass|
9
+ next unless klass.ancestors.include?(self)
10
+ next if (klass == self) or found.has_key?(klass)
11
+ unless all
12
+ if class_exists?(klass)
13
+ found[klass] = true
14
+ end
15
+ else
16
+ found[klass] = true
17
+ end
18
+ end
19
+ found.keys
20
+ end
21
+
22
+ # Removes constant definitions for all subclasses of the current class.
23
+ def remove_subclasses
24
+ self.subclasses.each do |klass|
25
+ front = klass.name
26
+ if /::/.match(front)
27
+ front,back = parts(klass.name)
28
+ front_class = front.split('::').inject(Object) { |o,n| o.const_get n }
29
+ front_class.__send__(:remove_const, back)
30
+ else
31
+ Object.__send__(:remove_const, front)
32
+ end
33
+ end
34
+ nil
35
+ end
36
+
37
+ # Removes the current class, and all subclasses if true is passed as
38
+ # an argument.
39
+ def remove(all = false)
40
+ remove_subclasses if all
41
+ Object.__send__(:remove_const, self.name)
42
+ nil
43
+ end
44
+
45
+ def Class.remove_subclasses(superclass, all = false)
46
+ superclass.remove_subclasses(all)
47
+ end
48
+
49
+ def Class.remove(superclass, all = false)
50
+ superclass.remove(all)
51
+ end
52
+
53
+ def Class.class_by_name(name)
54
+ name.split('::').inject(Object) { |o,n| o.const_get n }
55
+ end
56
+
57
+ def Class.new_by_name(name, *args)
58
+ clean_name = String.new(name.untaint)
59
+ obj = nil
60
+ begin
61
+ obj = Class.class_by_name(clean_name).new(*args)
62
+ rescue Exception => e
63
+ begin
64
+ require clean_name
65
+ obj = Class.class_by_name(clean_name).new(*args)
66
+ rescue Exception
67
+ raise "Unable to create object for class #{clean_name}: #{e}" unless obj
68
+ end
69
+ end
70
+ obj
71
+ end
72
+
73
+ private
74
+
75
+ def parts(path)
76
+ pieces = path.split('::')
77
+ back = pieces.pop
78
+ front = pieces.join('::')
79
+ [front,back]
80
+ end
81
+
82
+ def class_exists?(klass)
83
+ front = klass.name
84
+ if /::/.match(front)
85
+ front, back = parts(front)
86
+ front_class = front.split('::').inject(Object) { |o,n| o.const_get n }
87
+ front_class.constants.include?(back)
88
+ else
89
+ Object.constants.include?(front)
90
+ end
91
+ rescue Exception
92
+ nil
93
+ end
94
+ end