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,564 @@
1
+ require 'iowa/LinkedList'
2
+ require 'iowa/caches/LRUCache'
3
+ require 'thread'
4
+
5
+ class Numeric
6
+ def px;Iowa::CSS::PX.new(self);end
7
+ def pt;Iowa::CSS::PT.new(self);end
8
+ def em;Iowa::CSS::EM.new(self);end
9
+ def in;Iowa::CSS::IN.new(self);end
10
+ def mm;Iowa::CSS::MM.new(self);end
11
+ def pct;Iowa::CSS::PCT.new(self);end
12
+ end
13
+
14
+ module Iowa
15
+
16
+ # Iowa::CSS implements a CSS DSL in Ruby. It tries to stick as
17
+ # closely to CSS syntax as it can, so that any learning curve is
18
+ # minimized.
19
+
20
+ class CSS
21
+ undef :p
22
+ undef :display
23
+
24
+ C0 = '0'.freeze unless const_defined?(:C0)
25
+ C1 = '1'.freeze unless const_defined?(:C1)
26
+ C_slash = '/'.freeze unless const_defined?(:C_slash)
27
+
28
+ # Any of the attributes in this list are fat attributes. A fat
29
+ # attribute is one can can take multiple modifiers (such as
30
+ # font-color, font-size, font-weight, etc...) in a block.
31
+ #
32
+ # font {
33
+ # color 'green'
34
+ # size 12.px
35
+ # }
36
+
37
+ FatAttributeList = {
38
+ :background => true,
39
+ :border => true,
40
+ :font => true,
41
+ :list => true,
42
+ :list_style => true,
43
+ :margin => true,
44
+ :outline => true,
45
+ :padding => true,
46
+ :text => true
47
+ } unless const_defined?(:FatAttributeList)
48
+
49
+ # This Iowa::LinkedList subclass fine tunes the iteration order, the
50
+ # to_s generation, and allows missing methods to be handled so that it
51
+ # will work to store CSS items defined by the DSL.
52
+
53
+ class CSSList < Iowa::LinkedList
54
+ undef :display
55
+
56
+ # Reverses the iteration order from the regular LinkedList.
57
+ def each
58
+ n = @tail
59
+ while (n = n.prev_node) and n != @head
60
+ yield(n.key,n.value)
61
+ end
62
+ end
63
+
64
+ # Generates a string representation of the CSSList.
65
+
66
+ def to_s
67
+ r = ''
68
+ each do |key, value|
69
+ r << value.to_s
70
+ end
71
+ r
72
+ end
73
+
74
+ # method_missing is handled to allow setting arbitrary attributes.
75
+
76
+ def method_missing(key,*args)
77
+ if args.length > 0
78
+ self[key] = args.first
79
+ else
80
+ self[key].value
81
+ end
82
+ end
83
+ end
84
+
85
+ # Simple class to represent a conditional fingerprint.
86
+
87
+ class Fingerprint
88
+ def initialize(fingerprint)
89
+ @fingerprint = fingerprint
90
+ end
91
+
92
+ def fingerprint=(val)
93
+ @fingerprint = val
94
+ end
95
+
96
+ def fingerprint
97
+ @fingerprint
98
+ end
99
+
100
+ def to_s
101
+ @fingerprint.to_s
102
+ end
103
+ end
104
+
105
+ # A Condition is used to implement an if/then/else replacement for the
106
+ # CSS DSL. The replacement allows the system to remember the
107
+ # conditions so that they can be checked later without executing all
108
+ # of the statements in the code.
109
+
110
+ class Condition < CSSList
111
+ attr_accessor :next_condition
112
+
113
+ def initialize(condition, context = nil, parent = nil, skip = false)
114
+ @condition = condition
115
+ @context = context
116
+ @skip = skip
117
+ @result = condition.call(context)
118
+ parent.next_condition = self if parent
119
+ super()
120
+ end
121
+
122
+ def then(&blk)
123
+ if !@skip and @result
124
+ t = []
125
+ eval("lambda {|x| x.replace [@output]}",blk).call(t)
126
+ output = t.first
127
+ parent = output.last
128
+ yield
129
+ end
130
+ self
131
+ end
132
+
133
+ def elsif(&condition)
134
+ Condition.new(condition,@context,self,@result)
135
+ end
136
+
137
+ def else(fp = C1, &blk)
138
+ # This lets one specify a fingerprint for an else.
139
+ condition = lambda {|context| fp}
140
+ Condition.new(condition,@context,self,@result)
141
+ # and then handle it...
142
+ if !@skip and !@result
143
+ t = []
144
+ eval("lambda {|x| x.replace [@output]}",blk).call(t)
145
+ output = t.first
146
+ parent = output.last
147
+ yield
148
+ end
149
+ end
150
+
151
+ def fingerprint(context = nil)
152
+ fp = (_ = @condition.call(context)) ?
153
+ (_.is_a?(Fingerprint) ? [_] : [C1]) :
154
+ [C0]
155
+ fp += next_condition.fingerprint(context) if next_condition
156
+ fp
157
+ end
158
+
159
+ def to_s(prefix = nil)
160
+ super()
161
+ end
162
+ end
163
+
164
+ class Selector < CSSList
165
+
166
+ def self.method_missing(ctype,*args,&blk)
167
+ t = []
168
+ if blk
169
+ eval("lambda {|x| x.replace [@output]}",blk).call(t)
170
+ output = t.first
171
+ parent = output.last
172
+ obj = self.new(ctype,*args)
173
+ parent.push obj
174
+ output.push obj
175
+ yield
176
+ output.pop
177
+ else
178
+ self.new(ctype,*args)
179
+ end
180
+ end
181
+
182
+ def initialize(selector,*args)
183
+ @selector = selector == :_ ? '' : selector
184
+ @suffix = ''
185
+
186
+ args.each do |arg|
187
+ process_selector_option(arg,@suffix)
188
+ end
189
+
190
+ super()
191
+ end
192
+
193
+ def process_selector_option(arg,buffer)
194
+ if arg.is_a?(::Symbol)
195
+ buffer << ":#{arg}"
196
+ elsif arg.is_a?(::Hash)
197
+ arg.each do |k,v|
198
+ if k == :lang
199
+ buffer << ":lang(#{v})"
200
+ elsif k == :not
201
+ buffer << ":not("
202
+ process_selector_option(v,buffer)
203
+ buffer << ")"
204
+ end
205
+ end
206
+ elsif arg.is_a?(::Array)
207
+ arg.each do |v|
208
+ process_selector_option(v,buffer)
209
+ end
210
+ else
211
+ buffer << "[#{arg}]"
212
+ end
213
+ end
214
+
215
+ def token
216
+ ' '
217
+ end
218
+
219
+ def separator
220
+ ''
221
+ end
222
+
223
+ def to_s(prefix = '')
224
+ r = ''
225
+ section = ''
226
+ ws = prefix.match(/^(\s*)/)[1]
227
+ each do |key,value|
228
+ section << "#{value.to_s("#{ws} ")}" if value.respond_to?(:is_attribute?)
229
+ end
230
+ tok = (prefix =~ /^\s*$/ and token == ' ') ? '' : token
231
+ if section != ''
232
+ r << "#{prefix}#{tok}#{@selector}#{@suffix} {\n#{section}#{ws}}\n"
233
+ end
234
+ each do |key,value|
235
+ r << value.to_s("#{prefix}#{tok}#{@selector}#{@suffix}#{separator}") unless value.respond_to?(:is_attribute?)
236
+ end
237
+ r
238
+ end
239
+
240
+ def url(u)
241
+ "url(\"#{u}\")"
242
+ end
243
+
244
+ end
245
+
246
+ class Tag < Selector; end
247
+
248
+ class Pseudo < Selector
249
+ def token
250
+ ':'
251
+ end
252
+
253
+ def separator
254
+ ''
255
+ end
256
+ end
257
+
258
+ class Literal_
259
+ def initialize(text)
260
+ @text = text
261
+ end
262
+
263
+ def to_s(prefix = '')
264
+ @text
265
+ end
266
+ end
267
+
268
+ class Class < Selector
269
+ def token
270
+ '.'
271
+ end
272
+
273
+ def separator
274
+ ' '
275
+ end
276
+ end
277
+
278
+ class Id < Selector
279
+ def token
280
+ '#'
281
+ end
282
+
283
+ def separator
284
+ ' '
285
+ end
286
+ end
287
+
288
+ class Child < Selector
289
+ def token
290
+ ' > '
291
+ end
292
+
293
+ def separator
294
+ ''
295
+ end
296
+ end
297
+
298
+ class Adjacent < Selector
299
+ def token
300
+ ' + '
301
+ end
302
+
303
+ def separator
304
+ ''
305
+ end
306
+ end
307
+
308
+ class Indirect < Selector
309
+ def token
310
+ ' ~ '
311
+ end
312
+
313
+ def separator
314
+ ''
315
+ end
316
+ end
317
+
318
+ class Attribute
319
+ attr_accessor :key, :value
320
+
321
+ def is_attribute?; true; end
322
+
323
+ def initialize(k = '', v = '')
324
+ @key = k
325
+ @value = v
326
+ end
327
+
328
+ def []=(k,v)
329
+ @key = k
330
+ @value = v
331
+ end
332
+
333
+ def to_s(ws = '')
334
+ "#{ws}#{CSS::correct_for_css(@key)}: #{CSS::correct_for_css(@value)};\n"
335
+ end
336
+ end
337
+
338
+ class FatAttribute < CSSList
339
+
340
+ def is_attribute?; true; end
341
+
342
+ def initialize(atype)
343
+ @prefix = atype.to_s.downcase.intern
344
+ super()
345
+ end
346
+
347
+ def method_missing(meth,*args)
348
+ if args.empty?
349
+ self[meth].value
350
+ else
351
+ self[meth.to_s.sub('=','').intern] = args.length > 1 ? args : args.first
352
+ end
353
+ end
354
+
355
+ def to_s(ws = '')
356
+ r = ''
357
+ each do |k,v|
358
+ r << "#{ws}#{CSS::correct_for_css(@prefix)}-#{CSS::correct_for_css(k)}: #{CSS::correct_for_css(v.value)};\n"
359
+ end
360
+ r
361
+ end
362
+ end
363
+
364
+ class ApplesAndOrangesException < Exception; end
365
+
366
+ class Units
367
+ def to_f
368
+ @value
369
+ end
370
+
371
+ def initialize(v)
372
+ @value = v.to_f
373
+ end
374
+
375
+ def unit
376
+ @unit ||= self.class.name.split('::').last.downcase
377
+ end
378
+
379
+ def to_s
380
+ "#{@value}#{unit}"
381
+ end
382
+
383
+ def method_missing(meth,*args)
384
+ if args.detect {|a| (self.class != a.class and MutuallyExclusiveUnits.include?(a.class))}
385
+ raise ApplesAndOrangesException
386
+ else
387
+ r = @value.send(meth,*args)
388
+ r.is_a?(::Float) ? self.class.new(r) : r
389
+ end
390
+ end
391
+ end
392
+
393
+ class PX < Units; end
394
+ class PT < Units; end
395
+ class EM < Units; end
396
+ class IN < Units; end
397
+ class MM < Units; end
398
+ class PCT < Units
399
+ def to_s
400
+ "#{@value}%"
401
+ end
402
+ end
403
+
404
+ MutuallyExclusiveUnits = [PX,PT,EM,IN,MM,PCT]
405
+
406
+
407
+ attr_accessor :output
408
+
409
+ def initialize(css = nil,with_cache = false)
410
+ @mutex = Mutex.new
411
+ @output = [CSSList.new]
412
+ @conditions = []
413
+ if with_cache
414
+ initialize_cache(with_cache == true ? {:maxsize => 10} : with_cache)
415
+ else
416
+ @cache = nil
417
+ end
418
+ @css = css
419
+ end
420
+
421
+ def initialize_cache(*args)
422
+ @cache = Iowa::Caches::LRUCache.new(*args)
423
+ end
424
+
425
+ def clear_output
426
+ @output = [CSSList.new]
427
+ end
428
+
429
+ def on_condition(&blk)
430
+ cond = Condition.new(blk,@context)
431
+ @conditions << cond
432
+ cond
433
+ end
434
+
435
+ def condition_fingerprint
436
+ fp = ''
437
+ @conditions.each {|c| fp << c.fingerprint(@context).join(C_slash) << '|'}
438
+ fp[0..-2]
439
+ end
440
+
441
+ def parse(css = '', context = nil)
442
+ @mutex.lock
443
+ @css = css
444
+ @context = context
445
+ @conditions = []
446
+ clear_output
447
+ eval(css)
448
+ if @cache
449
+ @cache[condition_fingerprint] = to_s
450
+ end
451
+ @context = nil
452
+ @mutex.unlock
453
+ end
454
+
455
+ def render(context = nil)
456
+ @mutex.lock
457
+ r = nil
458
+ @context = context
459
+ if @cache and fp = condition_fingerprint and @cache.include?(fp)
460
+ r = @cache[fp]
461
+ else
462
+ @conditions = []
463
+ clear_output
464
+ eval(@css)
465
+ r = to_s
466
+ if @cache
467
+ @cache[condition_fingerprint] = r
468
+ end
469
+ @context = nil
470
+ end
471
+ @mutex.unlock
472
+ r
473
+ end
474
+
475
+ def to_s
476
+ @output.first.to_s
477
+ end
478
+
479
+ def self.correct_for_css(t)
480
+ text = t.to_s
481
+ text.gsub!('_','-') unless text =~ /['"`]/
482
+ #if text.index(' ')
483
+ # text = "\"#{text}\""
484
+ #end
485
+ text
486
+ end
487
+
488
+ def method_missing(tag,*args)
489
+ if block_given?
490
+ parent = @output.last
491
+ tagkey = "#{tag}//#{args.join('/')}"
492
+ if parent.has_key?(tagkey)
493
+ selector = parent[tagkey]
494
+ else
495
+ selector = FatAttributeList.has_key?(tag) ? FatAttribute.new(tag) : Selector.new(tag,*args)
496
+ parent[tagkey] = selector
497
+ end
498
+ @output.push selector
499
+ yield
500
+ @output.pop
501
+ selector
502
+ else
503
+ @output.last[tag] = Attribute.new(tag,args.collect {|x| CSS::correct_for_css(x)}.join(','))
504
+ end
505
+ end
506
+
507
+ def universal
508
+ parent = @output.last
509
+ selector = Selector.new(:*)
510
+ parent[:*] = selector
511
+ @output.push selector
512
+ yield
513
+ @output.pop
514
+ end
515
+
516
+ def Group(*args)
517
+ selectors = []
518
+ if block_given?
519
+ args.reverse.each do |sel|
520
+ parent = @output.last
521
+ parent.push sel
522
+ @output.push sel
523
+ yield
524
+ @output.pop
525
+ selectors << sel
526
+ end
527
+ end
528
+ selectors
529
+ end
530
+
531
+ def Literal(arg)
532
+ lit = Literal_.new(arg)
533
+ @output.last[lit.object_id] = lit
534
+ end
535
+
536
+ class Media < CSSList
537
+ def self.method_missing(media_type,&blk)
538
+ t = []
539
+ eval("lambda {|x| x.replace [@output]}",blk).call(t)
540
+ output = t.first
541
+ parent = output.last
542
+ media = self.new(media_type)
543
+ parent.push media
544
+ output.push media
545
+ yield
546
+ output.pop
547
+ end
548
+
549
+ def initialize(media_type)
550
+ @media_type = media_type
551
+ super()
552
+ end
553
+
554
+ def to_s
555
+ r = "@media #{@media_type} {\n"
556
+ each do |key,value|
557
+ r << value.to_s(' ')
558
+ end
559
+ r << "}\n"
560
+ end
561
+ end
562
+
563
+ end
564
+ end