wee 0.10.0 → 2.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 (369) hide show
  1. data/README.rdoc +127 -0
  2. data/Rakefile +11 -32
  3. data/doc/rdoc/classes/Array.html +28 -24
  4. data/doc/rdoc/classes/Hash.html +28 -24
  5. data/doc/rdoc/classes/Object.html +37 -84
  6. data/doc/rdoc/classes/String.html +89 -21
  7. data/doc/rdoc/classes/Struct.html +32 -82
  8. data/doc/rdoc/classes/Wee.html +285 -86
  9. data/doc/rdoc/classes/Wee/AnswerDecoration.html +111 -48
  10. data/doc/rdoc/classes/Wee/{Context.html → AnswerDecoration/Answer.html} +61 -51
  11. data/doc/rdoc/classes/Wee/Application.html +161 -322
  12. data/doc/rdoc/classes/Wee/Application/SessionCache.html +162 -0
  13. data/doc/rdoc/classes/Wee/Brush.html +147 -62
  14. data/doc/rdoc/classes/{Enumerable.html → Wee/Brush/ActionInputTag.html} +68 -41
  15. data/doc/rdoc/classes/Wee/Brush/AnchorTag.html +150 -100
  16. data/doc/rdoc/classes/Wee/Brush/CheckboxTag.html +132 -46
  17. data/doc/rdoc/classes/Wee/Brush/FileUploadTag.html +63 -41
  18. data/doc/rdoc/classes/Wee/Brush/FormTag.html +184 -78
  19. data/doc/rdoc/classes/Wee/Brush/GenericEncodedTextBrush.html +48 -65
  20. data/doc/rdoc/classes/Wee/Brush/GenericSingleTagBrush.html +83 -37
  21. data/doc/rdoc/classes/Wee/Brush/GenericTagBrush.html +334 -310
  22. data/doc/rdoc/classes/Wee/Brush/GenericTextBrush.html +74 -54
  23. data/doc/rdoc/classes/Wee/Brush/HiddenInputTag.html +58 -43
  24. data/doc/rdoc/classes/Wee/Brush/ImageButtonTag.html +64 -74
  25. data/doc/rdoc/classes/Wee/Brush/ImageTag.html +109 -86
  26. data/doc/rdoc/classes/Wee/Brush/InputTag.html +205 -45
  27. data/doc/rdoc/classes/Wee/Brush/JavascriptTag.html +96 -34
  28. data/doc/rdoc/classes/Wee/Brush/Page.html +129 -67
  29. data/doc/rdoc/classes/Wee/{Utils/LRUCache.html → Brush/PasswordInputTag.html} +65 -38
  30. data/doc/rdoc/classes/Wee/Brush/RadioButtonTag.html +132 -78
  31. data/doc/rdoc/classes/Wee/Brush/{RadioButtonTag/RadioGroup.html → RadioGroup.html} +91 -53
  32. data/doc/rdoc/classes/Wee/Brush/SelectListTag.html +301 -127
  33. data/doc/rdoc/classes/Wee/Brush/SelectOptionTag.html +96 -33
  34. data/doc/rdoc/classes/Wee/Brush/SubmitButtonTag.html +59 -44
  35. data/doc/rdoc/classes/Wee/Brush/TableDataTag.html +94 -57
  36. data/doc/rdoc/classes/Wee/Brush/TableHeaderTag.html +96 -33
  37. data/doc/rdoc/classes/Wee/Brush/TableRowTag.html +181 -121
  38. data/doc/rdoc/classes/Wee/Brush/TableTag.html +94 -32
  39. data/doc/rdoc/classes/Wee/Brush/TextAreaTag.html +257 -71
  40. data/doc/rdoc/classes/Wee/Brush/TextInputTag.html +58 -43
  41. data/doc/rdoc/classes/Wee/CallAnswerMixin.html +289 -0
  42. data/doc/rdoc/classes/Wee/CallbackMixin.html +233 -0
  43. data/doc/rdoc/classes/Wee/CallbackRegistry.html +179 -155
  44. data/doc/rdoc/classes/Wee/Callbacks.html +262 -0
  45. data/doc/rdoc/classes/Wee/Component.html +228 -779
  46. data/doc/rdoc/classes/Wee/Decoration.html +144 -159
  47. data/doc/rdoc/classes/Wee/DecorationMixin.html +340 -0
  48. data/doc/rdoc/classes/Wee/Delegate.html +119 -76
  49. data/doc/rdoc/classes/Wee/DupReplaceSnapshotMixin.html +64 -47
  50. data/doc/rdoc/classes/Wee/ErrorResponse.html +59 -62
  51. data/doc/rdoc/classes/Wee/FormDecoration.html +51 -37
  52. data/doc/rdoc/classes/Wee/GenericResponse.html +60 -35
  53. data/doc/rdoc/classes/Wee/HtmlCanvas.html +1000 -602
  54. data/doc/rdoc/classes/Wee/HtmlDocument.html +288 -0
  55. data/doc/rdoc/classes/Wee/HtmlWriter.html +227 -126
  56. data/doc/rdoc/classes/Wee/IdGenerator.html +60 -31
  57. data/doc/rdoc/classes/Wee/IdGenerator/Secure.html +282 -0
  58. data/doc/rdoc/classes/Wee/{SimpleIdGenerator.html → IdGenerator/Sequential.html} +76 -49
  59. data/doc/rdoc/classes/Wee/JQuery.html +221 -0
  60. data/doc/rdoc/classes/Wee/LRUCache.html +514 -0
  61. data/doc/rdoc/classes/Wee/LRUCache/Item.html +158 -0
  62. data/doc/rdoc/classes/Wee/ObjectSnapshotMixin.html +187 -0
  63. data/doc/rdoc/classes/Wee/PageDecoration.html +88 -59
  64. data/doc/rdoc/classes/Wee/Presenter.html +124 -704
  65. data/doc/rdoc/classes/Wee/RedirectResponse.html +64 -33
  66. data/doc/rdoc/classes/Wee/RefreshResponse.html +59 -44
  67. data/doc/rdoc/classes/Wee/Renderer.html +234 -54
  68. data/doc/rdoc/classes/Wee/Request.html +151 -286
  69. data/doc/rdoc/classes/Wee/Response.html +29 -212
  70. data/doc/rdoc/classes/Wee/Session.html +585 -360
  71. data/doc/rdoc/classes/Wee/{StateHolder.html → Session/AbortCallbackProcessing.html} +67 -40
  72. data/doc/rdoc/classes/Wee/Session/MutexSerializer.html +166 -0
  73. data/doc/rdoc/classes/{Cache/Strategy/LFU/Item.html → Wee/Session/Page.html} +26 -27
  74. data/doc/rdoc/classes/Wee/Session/ThreadSerializer.html +219 -0
  75. data/doc/rdoc/classes/Wee/State.html +307 -0
  76. data/doc/rdoc/classes/{Cache/Strategy/LRU/Item.html → Wee/State/Snapshot.html} +26 -27
  77. data/doc/rdoc/classes/{Cache/Strategy/Unbounded/Item.html → Wee/State/SnapshotIVars.html} +26 -27
  78. data/doc/rdoc/classes/Wee/StructSnapshotMixin.html +183 -0
  79. data/doc/rdoc/classes/Wee/WrapperDecoration.html +101 -35
  80. data/doc/rdoc/created.rid +1 -1
  81. data/doc/rdoc/files/README_rdoc.html +243 -0
  82. data/doc/rdoc/files/lib/wee/application_rb.html +22 -30
  83. data/doc/rdoc/files/lib/wee/{page_rb.html → call_answer_rb.html} +14 -25
  84. data/doc/rdoc/files/lib/wee/callback_rb.html +12 -29
  85. data/doc/rdoc/files/lib/wee/component_rb.html +22 -27
  86. data/doc/rdoc/files/lib/wee/decoration_rb.html +19 -20
  87. data/doc/rdoc/files/lib/wee/{idgen_rb.html → html_brushes_rb.html} +14 -25
  88. data/doc/rdoc/files/lib/wee/html_canvas_rb.html +15 -23
  89. data/doc/rdoc/files/lib/wee/{abstractsession_rb.html → html_document_rb.html} +17 -25
  90. data/doc/rdoc/files/lib/wee/html_writer_rb.html +15 -23
  91. data/doc/rdoc/files/lib/wee/{webrick_rb.html → id_generator_rb.html} +19 -25
  92. data/doc/rdoc/files/lib/wee/{core/page_rb.html → jquery/jquery_rb.html} +14 -25
  93. data/doc/rdoc/files/lib/wee/{state_registry_rb.html → jquery_rb.html} +17 -27
  94. data/doc/rdoc/files/lib/{cache/cache_rb.html → wee/lru_cache_rb.html} +14 -25
  95. data/doc/rdoc/files/lib/wee/presenter_rb.html +12 -34
  96. data/doc/rdoc/files/lib/wee/{holder_rb.html → renderer_rb.html} +14 -25
  97. data/doc/rdoc/files/lib/wee/request_rb.html +18 -32
  98. data/doc/rdoc/files/lib/wee/response_rb.html +17 -24
  99. data/doc/rdoc/files/lib/wee/session_rb.html +21 -23
  100. data/doc/rdoc/files/lib/wee/state_rb.html +90 -0
  101. data/doc/rdoc/files/lib/wee_rb.html +48 -40
  102. data/doc/rdoc/fr_class_index.html +111 -75
  103. data/doc/rdoc/fr_file_index.html +46 -76
  104. data/doc/rdoc/fr_method_index.html +473 -480
  105. data/doc/rdoc/index.html +6 -9
  106. data/doc/rdoc/rdoc-style.css +210 -119
  107. data/examples/ObjectSpaceBrowser.rb +33 -23
  108. data/examples/ajax.rb +71 -0
  109. data/examples/continuations.rb +28 -0
  110. data/examples/demo.rb +92 -36
  111. data/examples/demo/calculator.rb +63 -0
  112. data/examples/demo/calendar.rb +42 -55
  113. data/examples/demo/counter.rb +38 -0
  114. data/{lib/wee/examples → examples/demo}/editable_counter.rb +11 -6
  115. data/examples/demo/example.rb +28 -24
  116. data/examples/demo/file_upload.rb +19 -0
  117. data/{lib/wee/components → examples/demo}/messagebox.rb +3 -3
  118. data/examples/demo/radio.rb +33 -0
  119. data/{lib/wee/examples → examples/demo}/window.rb +15 -10
  120. data/examples/hw.rb +3 -4
  121. data/{lib/wee/components → examples}/pager.rb +14 -14
  122. data/lib/wee.rb +48 -25
  123. data/lib/wee/application.rb +69 -131
  124. data/lib/wee/call_answer.rb +118 -0
  125. data/lib/wee/callback.rb +88 -0
  126. data/lib/wee/component.rb +141 -0
  127. data/lib/wee/decoration.rb +242 -0
  128. data/lib/wee/html_brushes.rb +725 -0
  129. data/lib/wee/html_canvas.rb +241 -0
  130. data/lib/wee/html_document.rb +45 -0
  131. data/lib/wee/html_writer.rb +71 -0
  132. data/lib/wee/id_generator.rb +70 -0
  133. data/lib/wee/jquery.rb +1 -0
  134. data/lib/wee/jquery/jquery.rb +17 -0
  135. data/lib/wee/jquery/public/jquery-1.3.2.min.js +19 -0
  136. data/lib/wee/jquery/public/wee-jquery.js +19 -0
  137. data/lib/wee/lru_cache.rb +89 -0
  138. data/lib/wee/presenter.rb +43 -0
  139. data/lib/wee/renderer.rb +65 -0
  140. data/lib/wee/request.rb +37 -113
  141. data/lib/wee/response.rb +43 -70
  142. data/lib/wee/session.rb +304 -113
  143. data/lib/wee/state.rb +85 -0
  144. data/test/component_spec.rb +17 -0
  145. data/wee.gemspec +4 -3
  146. metadata +249 -452
  147. data/ChangeLog +0 -657
  148. data/INSTALL +0 -17
  149. data/README +0 -272
  150. data/TODO +0 -142
  151. data/benchmark/Centrino1300/result.2000.counter.action +0 -45
  152. data/benchmark/Centrino1300/result.2000.counter.render +0 -43
  153. data/benchmark/Centrino1300/result.2000.filehandler +0 -43
  154. data/benchmark/Centrino600/result.2000.counter.action +0 -47
  155. data/benchmark/Centrino600/result.2000.counter.render +0 -45
  156. data/benchmark/Centrino600/result.2000.filehandler +0 -43
  157. data/benchmark/Makefile +0 -53
  158. data/benchmark/counter.rb +0 -77
  159. data/benchmark/filehandler.rb +0 -6
  160. data/benchmark/report_req.rb +0 -12
  161. data/bin/wee +0 -100
  162. data/doc/rdoc/classes/ActionView.html +0 -107
  163. data/doc/rdoc/classes/ActionView/Base.html +0 -133
  164. data/doc/rdoc/classes/Cache.html +0 -126
  165. data/doc/rdoc/classes/Cache/StorageCache.html +0 -320
  166. data/doc/rdoc/classes/Cache/Strategy.html +0 -128
  167. data/doc/rdoc/classes/Cache/Strategy/CapacityBounded.html +0 -269
  168. data/doc/rdoc/classes/Cache/Strategy/LFU.html +0 -238
  169. data/doc/rdoc/classes/Cache/Strategy/LRU.html +0 -238
  170. data/doc/rdoc/classes/Cache/Strategy/Unbounded.html +0 -225
  171. data/doc/rdoc/classes/LiteralMethod.html +0 -196
  172. data/doc/rdoc/classes/Main.html +0 -289
  173. data/doc/rdoc/classes/OgApplication.html +0 -126
  174. data/doc/rdoc/classes/OgScaffolder.html +0 -827
  175. data/doc/rdoc/classes/OgScaffolder/Editor.html +0 -565
  176. data/doc/rdoc/classes/OgSession.html +0 -172
  177. data/doc/rdoc/classes/Recipe.html +0 -113
  178. data/doc/rdoc/classes/Wee/AbstractSession.html +0 -502
  179. data/doc/rdoc/classes/Wee/Brush/ActionCallbackMixin.html +0 -148
  180. data/doc/rdoc/classes/Wee/Brush/ActionMixin.html +0 -146
  181. data/doc/rdoc/classes/Wee/Brush/ActionURLCallbackMixin.html +0 -154
  182. data/doc/rdoc/classes/Wee/Brush/AssignMixin.html +0 -141
  183. data/doc/rdoc/classes/Wee/Brush/CallbackMixin.html +0 -141
  184. data/doc/rdoc/classes/Wee/Brush/InputCallbackMixin.html +0 -148
  185. data/doc/rdoc/classes/Wee/Brush/SelectListTag/SelectListCallback.html +0 -158
  186. data/doc/rdoc/classes/Wee/Brush/ToCallback.html +0 -146
  187. data/doc/rdoc/classes/Wee/Callback.html +0 -231
  188. data/doc/rdoc/classes/Wee/CallbackStream.html +0 -227
  189. data/doc/rdoc/classes/Wee/Canvas.html +0 -235
  190. data/doc/rdoc/classes/Wee/CanvasMixin.html +0 -225
  191. data/doc/rdoc/classes/Wee/Component/OnAnswer.html +0 -153
  192. data/doc/rdoc/classes/Wee/ComponentDispatcher.html +0 -289
  193. data/doc/rdoc/classes/Wee/ComponentRunner.html +0 -321
  194. data/doc/rdoc/classes/Wee/ErrorPage.html +0 -175
  195. data/doc/rdoc/classes/Wee/Examples.html +0 -114
  196. data/doc/rdoc/classes/Wee/Examples/Calculator.html +0 -319
  197. data/doc/rdoc/classes/Wee/Examples/Counter.html +0 -289
  198. data/doc/rdoc/classes/Wee/Examples/EditableCounter.html +0 -210
  199. data/doc/rdoc/classes/Wee/Examples/Window.html +0 -346
  200. data/doc/rdoc/classes/Wee/FastCGIAdaptor.html +0 -227
  201. data/doc/rdoc/classes/Wee/Helper.html +0 -148
  202. data/doc/rdoc/classes/Wee/HtmlCanvasRenderer.html +0 -1230
  203. data/doc/rdoc/classes/Wee/LiteralMethodCallback.html +0 -198
  204. data/doc/rdoc/classes/Wee/LoginDecoration.html +0 -261
  205. data/doc/rdoc/classes/Wee/Md5IdGenerator.html +0 -181
  206. data/doc/rdoc/classes/Wee/MessageBox.html +0 -180
  207. data/doc/rdoc/classes/Wee/MethodCallback.html +0 -193
  208. data/doc/rdoc/classes/Wee/Nitro.html +0 -114
  209. data/doc/rdoc/classes/Wee/Nitro/ControllerClassMixin.html +0 -192
  210. data/doc/rdoc/classes/Wee/Nitro/ControllerMixin.html +0 -345
  211. data/doc/rdoc/classes/Wee/Nitro/FormTag.html +0 -155
  212. data/doc/rdoc/classes/Wee/Nitro/HtmlCanvasRenderer.html +0 -178
  213. data/doc/rdoc/classes/Wee/Page.html +0 -115
  214. data/doc/rdoc/classes/Wee/PagelessApplication.html +0 -154
  215. data/doc/rdoc/classes/Wee/PagelessComponentDriver.html +0 -296
  216. data/doc/rdoc/classes/Wee/PagelessRequest.html +0 -208
  217. data/doc/rdoc/classes/Wee/PagelessSession.html +0 -359
  218. data/doc/rdoc/classes/Wee/Pager.html +0 -534
  219. data/doc/rdoc/classes/Wee/Rails.html +0 -114
  220. data/doc/rdoc/classes/Wee/Rails/ControllerClassMixin.html +0 -192
  221. data/doc/rdoc/classes/Wee/Rails/ControllerMixin.html +0 -342
  222. data/doc/rdoc/classes/Wee/Rails/FormTag.html +0 -155
  223. data/doc/rdoc/classes/Wee/Rails/HtmlCanvasRenderer.html +0 -177
  224. data/doc/rdoc/classes/Wee/RenderingContext.html +0 -283
  225. data/doc/rdoc/classes/Wee/RequestHandler.html +0 -341
  226. data/doc/rdoc/classes/Wee/Snapshot.html +0 -211
  227. data/doc/rdoc/classes/Wee/StateRegistry.html +0 -434
  228. data/doc/rdoc/classes/Wee/StateRegistry/Snapshot.html +0 -320
  229. data/doc/rdoc/classes/Wee/StateRegistry/WithObject.html +0 -153
  230. data/doc/rdoc/classes/Wee/Utils.html +0 -300
  231. data/doc/rdoc/classes/Wee/ValueHolder.html +0 -220
  232. data/doc/rdoc/classes/Wee/WEBrickAdaptor.html +0 -368
  233. data/doc/rdoc/files/INSTALL.html +0 -130
  234. data/doc/rdoc/files/README.html +0 -471
  235. data/doc/rdoc/files/lib/wee/adaptors/fastcgi_rb.html +0 -108
  236. data/doc/rdoc/files/lib/wee/adaptors/nitro_rb.html +0 -101
  237. data/doc/rdoc/files/lib/wee/adaptors/rails_rb.html +0 -101
  238. data/doc/rdoc/files/lib/wee/adaptors/webrick_rb.html +0 -108
  239. data/doc/rdoc/files/lib/wee/component_ext_rb.html +0 -101
  240. data/doc/rdoc/files/lib/wee/components/component_dispatcher_rb.html +0 -108
  241. data/doc/rdoc/files/lib/wee/components/form_decoration_rb.html +0 -101
  242. data/doc/rdoc/files/lib/wee/components/login_decoration_rb.html +0 -101
  243. data/doc/rdoc/files/lib/wee/components/messagebox_rb.html +0 -101
  244. data/doc/rdoc/files/lib/wee/components/page_decoration_rb.html +0 -101
  245. data/doc/rdoc/files/lib/wee/components/pager_rb.html +0 -101
  246. data/doc/rdoc/files/lib/wee/components/wrapper_decoration_rb.html +0 -101
  247. data/doc/rdoc/files/lib/wee/components_rb.html +0 -114
  248. data/doc/rdoc/files/lib/wee/context_rb.html +0 -101
  249. data/doc/rdoc/files/lib/wee/continuation/core/component_rb.html +0 -101
  250. data/doc/rdoc/files/lib/wee/continuation/session_rb.html +0 -108
  251. data/doc/rdoc/files/lib/wee/continuation_rb.html +0 -116
  252. data/doc/rdoc/files/lib/wee/core/callback_rb.html +0 -115
  253. data/doc/rdoc/files/lib/wee/core/component_rb.html +0 -108
  254. data/doc/rdoc/files/lib/wee/core/componentrunner_rb.html +0 -110
  255. data/doc/rdoc/files/lib/wee/core/context_rb.html +0 -101
  256. data/doc/rdoc/files/lib/wee/core/decoration_rb.html +0 -133
  257. data/doc/rdoc/files/lib/wee/core/idgen_rb.html +0 -101
  258. data/doc/rdoc/files/lib/wee/core/presenter_rb.html +0 -112
  259. data/doc/rdoc/files/lib/wee/core/renderer_rb.html +0 -107
  260. data/doc/rdoc/files/lib/wee/core/snapshot_rb.html +0 -113
  261. data/doc/rdoc/files/lib/wee/core/valueholder_rb.html +0 -110
  262. data/doc/rdoc/files/lib/wee/core_ext_rb.html +0 -101
  263. data/doc/rdoc/files/lib/wee/core_rb.html +0 -124
  264. data/doc/rdoc/files/lib/wee/databases/og/application_rb.html +0 -101
  265. data/doc/rdoc/files/lib/wee/databases/og/old_scaffolder_rb.html +0 -101
  266. data/doc/rdoc/files/lib/wee/databases/og/scaffolder_rb.html +0 -115
  267. data/doc/rdoc/files/lib/wee/databases/og/session_rb.html +0 -101
  268. data/doc/rdoc/files/lib/wee/databases/og_rb.html +0 -111
  269. data/doc/rdoc/files/lib/wee/examples/calculator_rb.html +0 -107
  270. data/doc/rdoc/files/lib/wee/examples/counter_rb.html +0 -101
  271. data/doc/rdoc/files/lib/wee/examples/editable_counter_rb.html +0 -114
  272. data/doc/rdoc/files/lib/wee/examples/window_rb.html +0 -101
  273. data/doc/rdoc/files/lib/wee/idgen/md5_rb.html +0 -115
  274. data/doc/rdoc/files/lib/wee/idgen/simple_rb.html +0 -107
  275. data/doc/rdoc/files/lib/wee/pageless/application_rb.html +0 -108
  276. data/doc/rdoc/files/lib/wee/pageless/request_rb.html +0 -101
  277. data/doc/rdoc/files/lib/wee/pageless/session_rb.html +0 -109
  278. data/doc/rdoc/files/lib/wee/pageless_rb.html +0 -110
  279. data/doc/rdoc/files/lib/wee/renderer/html/brushes_rb.html +0 -101
  280. data/doc/rdoc/files/lib/wee/renderer/html/canvas_rb.html +0 -108
  281. data/doc/rdoc/files/lib/wee/renderer/html/writer_rb.html +0 -108
  282. data/doc/rdoc/files/lib/wee/rendering/html/brushes_rb.html +0 -101
  283. data/doc/rdoc/files/lib/wee/rendering/html/canvas_rb.html +0 -101
  284. data/doc/rdoc/files/lib/wee/rendering/html/writer_rb.html +0 -108
  285. data/doc/rdoc/files/lib/wee/requesthandler_rb.html +0 -101
  286. data/doc/rdoc/files/lib/wee/skeleton/og/components/main_rb.html +0 -101
  287. data/doc/rdoc/files/lib/wee/skeleton/og/conf/db_rb.html +0 -114
  288. data/doc/rdoc/files/lib/wee/skeleton/og/models/recipe_rb.html +0 -101
  289. data/doc/rdoc/files/lib/wee/skeleton/og/run_rb.html +0 -115
  290. data/doc/rdoc/files/lib/wee/skeleton/simple/components/main_rb.html +0 -101
  291. data/doc/rdoc/files/lib/wee/skeleton/simple/run_rb.html +0 -111
  292. data/doc/rdoc/files/lib/wee/snapshot_ext_rb.html +0 -101
  293. data/doc/rdoc/files/lib/wee/snapshot_rb.html +0 -107
  294. data/doc/rdoc/files/lib/wee/stuff_rb.html +0 -144
  295. data/doc/rdoc/files/lib/wee/template_rb.html +0 -101
  296. data/doc/rdoc/files/lib/wee/utils/autoreload_rb.html +0 -101
  297. data/doc/rdoc/files/lib/wee/utils/cache_rb.html +0 -108
  298. data/doc/rdoc/files/lib/wee/utils/helper_rb.html +0 -101
  299. data/doc/rdoc/files/lib/wee/utils_rb.html +0 -110
  300. data/examples/ajax/ajax.js +0 -444
  301. data/examples/ajax/ajax.rb +0 -31
  302. data/examples/cc.rb +0 -74
  303. data/examples/dispatcher.rb +0 -37
  304. data/examples/draw.rb +0 -94
  305. data/examples/live-update.rb +0 -45
  306. data/examples/nitro/run.rb +0 -42
  307. data/examples/og-test.rb +0 -60
  308. data/examples/radio.rb +0 -44
  309. data/examples/test.rb +0 -39
  310. data/install.rb +0 -14
  311. data/lib/cache/cache.rb +0 -167
  312. data/lib/wee/abstractsession.rb +0 -96
  313. data/lib/wee/adaptors/fastcgi.rb +0 -76
  314. data/lib/wee/adaptors/nitro.rb +0 -155
  315. data/lib/wee/adaptors/rails.rb +0 -154
  316. data/lib/wee/adaptors/webrick.rb +0 -89
  317. data/lib/wee/components.rb +0 -7
  318. data/lib/wee/components/component_dispatcher.rb +0 -46
  319. data/lib/wee/components/form_decoration.rb +0 -7
  320. data/lib/wee/components/login_decoration.rb +0 -35
  321. data/lib/wee/components/page_decoration.rb +0 -14
  322. data/lib/wee/components/wrapper_decoration.rb +0 -7
  323. data/lib/wee/continuation.rb +0 -5
  324. data/lib/wee/continuation/core/component.rb +0 -56
  325. data/lib/wee/continuation/session.rb +0 -64
  326. data/lib/wee/core.rb +0 -16
  327. data/lib/wee/core/callback.rb +0 -121
  328. data/lib/wee/core/component.rb +0 -356
  329. data/lib/wee/core/componentrunner.rb +0 -73
  330. data/lib/wee/core/context.rb +0 -27
  331. data/lib/wee/core/decoration.rb +0 -138
  332. data/lib/wee/core/idgen.rb +0 -5
  333. data/lib/wee/core/page.rb +0 -1
  334. data/lib/wee/core/presenter.rb +0 -100
  335. data/lib/wee/core/renderer.rb +0 -23
  336. data/lib/wee/core/snapshot.rb +0 -21
  337. data/lib/wee/core/valueholder.rb +0 -19
  338. data/lib/wee/core_ext.rb +0 -122
  339. data/lib/wee/databases/og.rb +0 -4
  340. data/lib/wee/databases/og/application.rb +0 -3
  341. data/lib/wee/databases/og/old_scaffolder.rb +0 -98
  342. data/lib/wee/databases/og/scaffolder.rb +0 -255
  343. data/lib/wee/databases/og/session.rb +0 -9
  344. data/lib/wee/examples/calculator.rb +0 -70
  345. data/lib/wee/examples/counter.rb +0 -33
  346. data/lib/wee/idgen/md5.rb +0 -21
  347. data/lib/wee/idgen/sequential.rb +0 -11
  348. data/lib/wee/pageless.rb +0 -3
  349. data/lib/wee/pageless/application.rb +0 -13
  350. data/lib/wee/pageless/request.rb +0 -27
  351. data/lib/wee/pageless/session.rb +0 -74
  352. data/lib/wee/renderer/html/brushes.rb +0 -667
  353. data/lib/wee/renderer/html/canvas.rb +0 -265
  354. data/lib/wee/renderer/html/writer.rb +0 -80
  355. data/lib/wee/requesthandler.rb +0 -81
  356. data/lib/wee/skeleton/og/README +0 -38
  357. data/lib/wee/skeleton/og/components/main.rb +0 -20
  358. data/lib/wee/skeleton/og/conf/db.rb +0 -8
  359. data/lib/wee/skeleton/og/models/recipe.rb +0 -5
  360. data/lib/wee/skeleton/og/run.rb +0 -23
  361. data/lib/wee/skeleton/simple/README +0 -32
  362. data/lib/wee/skeleton/simple/components/main.rb +0 -25
  363. data/lib/wee/skeleton/simple/run.rb +0 -12
  364. data/lib/wee/snapshot_ext.rb +0 -41
  365. data/lib/wee/template.rb +0 -42
  366. data/lib/wee/utils.rb +0 -5
  367. data/lib/wee/utils/autoreload.rb +0 -56
  368. data/lib/wee/utils/cache.rb +0 -7
  369. data/lib/wee/utils/helper.rb +0 -51
@@ -1,150 +1,341 @@
1
- require 'wee/abstractsession'
1
+ require 'thread'
2
+ require 'wee/lru_cache'
3
+ require 'wee/id_generator'
4
+ require 'wee/renderer'
2
5
 
3
- class Wee::Session < Wee::AbstractSession
6
+ module Wee
4
7
 
5
- attr_accessor :component_runner
6
- attr_accessor :page_store
8
+ class Session
7
9
 
8
- def initialize(&block)
9
- super()
10
- setup(&block)
11
- end
12
-
13
- def current_callbacks
14
- @page.callbacks
15
- end
16
-
17
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
18
- # :section: Request processing/handling
19
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20
-
21
- protected
22
-
23
- def setup(&block)
24
- @idgen = Wee::SequentialIdGenerator.new
25
-
26
- with_session do
27
- block.call(self) if block
28
- raise ArgumentError, "No component runner specified" if @component_runner.nil?
29
- raise ArgumentError, "No page_store specified" if @page_store.nil?
30
-
31
- @initial_snapshot = @component_runner.snapshot
10
+ #
11
+ # The default serializer, when no continuation are going to be used.
12
+ # Ensures that only one request of the same session is executed at
13
+ # the same time.
14
+ #
15
+ class MutexSerializer < Mutex
16
+ def call(env)
17
+ synchronize { env['wee.session'].call(env) }
18
+ end
32
19
  end
33
- end
34
20
 
35
- # The main routine where the request is processed.
21
+ #
22
+ # This serializer ensures that all requests of a session are
23
+ # executed within the same thread. This is required if continuations
24
+ # are going to be used.
25
+ #
26
+ # You can run multiple sessions within the same ThreadSerializer, or
27
+ # allocate one ThreadSerializer (and as such one Thread) per session
28
+ # as you want.
29
+ #
30
+ class ThreadSerializer
31
+ def initialize
32
+ @in, @out = Queue.new, Queue.new
33
+ @thread = Thread.new {
34
+ Thread.abort_on_exception = true
35
+ while true
36
+ env = @in.pop
37
+ @out.push(env['wee.session'].call(env))
38
+ end
39
+ }
40
+ end
41
+
42
+ def call(env)
43
+ @in.push(env)
44
+ @out.pop
45
+ end
46
+ end
36
47
 
37
- def process_request
38
- if @context.request.page_id.nil?
48
+ class Page < Struct.new(:id, :state, :callbacks); end
39
49
 
40
- # No page_id was specified in the URL. This means that we start with a
41
- # fresh component and a fresh page_id, then redirect to render itself.
50
+ class AbortCallbackProcessing < Exception
51
+ attr_reader :response
52
+ def initialize(response)
53
+ @response = response
54
+ end
55
+ end
42
56
 
43
- handle_new_page
57
+ #
58
+ # The (application-wide) unique id of this session.
59
+ #
60
+ attr_accessor :id
44
61
 
45
- elsif @page = @page_store.fetch(@context.request.page_id, false)
62
+ #
63
+ # Points to the Wee::Application object this session belongs to.
64
+ #
65
+ attr_accessor :application
46
66
 
47
- # A valid page_id was specified and the corresponding page exists.
67
+ #
68
+ # Expire the session after this number of seconds of inactivity. If this
69
+ # value is +nil+, the Session will never expire due to inactivity.
70
+ # (but still may expire for example due to <i>max_lifetime</i>).
71
+ #
72
+ # Default: <tt>1800</tt> seconds (30 minutes)
73
+ #
74
+ attr_accessor :expire_after
48
75
 
49
- handle_existing_page
76
+ #
77
+ # The maximum lifetime of this session in seconds. A value of +nil+ means
78
+ # infinite lifetime.
79
+ #
80
+ # Default: <tt>nil</tt> (infinite lifetime)
81
+ #
82
+ attr_accessor :max_lifetime
50
83
 
51
- else
84
+ #
85
+ # The maximum number of requests this session is allowed to serve.
86
+ # A value of +nil+ means no limitation.
87
+ #
88
+ # Default: <tt>nil</tt> (infinite number of requests)
89
+ #
90
+ attr_accessor :max_requests
52
91
 
53
- # A page_id was specified in the URL, but there's no page for it in the
54
- # page store. Either the page has timed out, or an invalid page_id was
55
- # specified.
92
+ #
93
+ # Creates a new session.
94
+ #
95
+ def initialize(root_component, serializer=nil, page_cache_capacity=20)
96
+ @root_component = root_component
97
+ @page_cache = Wee::LRUCache.new(page_cache_capacity)
98
+ @page_ids = Wee::IdGenerator::Sequential.new
99
+ @current_page = nil
100
+
101
+ @running = true
102
+
103
+ @expire_after = 30*60
104
+ @max_lifetime = nil
105
+ @max_requests = nil
106
+
107
+ @last_access = @creation_time = Time.now
108
+ @request_count = 0
109
+
110
+ @serializer = serializer || MutexSerializer.new
111
+ end
56
112
 
57
- handle_invalid_page
113
+ #
114
+ # Terminates the session.
115
+ #
116
+ # This will usually not immediatly terminate the session from running, but
117
+ # further requests will not be answered.
118
+ #
119
+ def terminate
120
+ @running = false
121
+ end
58
122
 
123
+ #
124
+ # Queries whether the session is still alive.
125
+ #
126
+ def alive?
127
+ now = Time.now
128
+ return false if not @running
129
+ return false if @expire_after and now - @last_access > @expire_after
130
+ return false if @max_lifetime and now - @creation_time > @max_lifetime
131
+ return false if @max_requests and @request_count >= @max_requests
132
+ return true
59
133
  end
60
- end
61
134
 
62
- def handle_new_page
63
- handle_new_page_view(@context, @initial_snapshot)
64
- end
135
+ #
136
+ # Queries whether the session is dead.
137
+ #
138
+ def dead?
139
+ not alive?
140
+ end
65
141
 
66
- def handle_existing_page
67
- @page.snapshot.restore if @context.request.page_id != @snapshot_page_id
142
+ #
143
+ # Returns some statistics
144
+ #
145
+ def statistics
146
+ now = Time.now
147
+ {
148
+ :last_access => @last_access, # The time when this session was last accessed
149
+ :inactivity => now - @last_access, # The number of seconds of inactivity
150
+ :creation_time => @creation_time, # The time at which this session was created
151
+ :lifetime => now - @creation_time, # The lifetime of this session in seconds
152
+ :request_count => @request_count # The number of requests served by this session
153
+ }
154
+ end
155
+
156
+ #
157
+ # Returns the current session (thread-local).
158
+ #
159
+ def self.current
160
+ Thread.current[:wee_session] || (raise "Not in session")
161
+ end
68
162
 
69
- p @context.request.fields if $DEBUG
163
+ #
164
+ # Handles a web request.
165
+ #
166
+ def call(env)
167
+ if env['wee.session']
168
+ # we are already serialized
169
+ raise if env['wee.session'] != self
170
+ begin
171
+ Thread.current[:wee_session] = self
172
+ @request_count += 1
173
+ @last_access = Time.now
174
+ awake
175
+ response = handle(env)
176
+ sleep
177
+ return response
178
+ ensure
179
+ Thread.current[:wee_session] = nil
180
+ end
181
+ else
182
+ env['wee.session'] = self
183
+ @serializer.call(env)
184
+ end
185
+ end
70
186
 
71
- if @context.request.render?
72
- handle_render_phase
73
- else
74
- handle_callback_phase
187
+ #
188
+ # Send a premature response
189
+ #
190
+ def send_response(response)
191
+ raise AbortCallbackProcessing.new(response)
75
192
  end
76
- end
77
193
 
78
- def handle_invalid_page
79
- # TODO:: Display an "invalid page or page timed out" message, which
80
- # forwards to /app/session-id
81
- raise "Not yet implemented"
82
- end
194
+ protected
83
195
 
84
- def handle_render_phase
85
- # No action/inputs were specified -> render page
86
196
  #
87
- # 1. Reset the action/input fields (as they are regenerated in the
88
- # rendering process).
89
- # 2. Render the page (respond).
90
- # 3. Store the page back into the store
91
-
92
- @page = create_page(@page.snapshot) # remove all action/input handlers
93
- respond(@context, @page.callbacks) # render
94
- @page_store[@context.request.page_id] = @page # store
95
- end
197
+ # Is called before <i>process_request</i> is invoked.
198
+ #
199
+ # Can be used e.g. to setup a database connection.
200
+ #
201
+ def awake
202
+ end
96
203
 
97
- def handle_callback_phase
98
- # Actions/inputs were specified.
99
204
  #
100
- # We process the request and invoke actions/inputs. Then we generate a
101
- # new page view.
205
+ # Is called after <i>process_request</i> is run.
206
+ #
207
+ # Can be used e.g. to release a database connection.
208
+ #
209
+ def sleep
210
+ end
102
211
 
103
- callback_stream = Wee::CallbackStream.new(@page.callbacks, @context.request.fields)
104
- premature_response = @component_runner.process_callbacks(callback_stream)
212
+ #
213
+ # The main routine where the request is processed.
214
+ #
215
+ def handle(env)
216
+ request = Wee::Request.new(env)
217
+ @request = request # CONTINUATIONS!
218
+ page = @page_cache.fetch(request.page_id)
219
+
220
+ if page
221
+ if page != @current_page
222
+ @current_page = nil
223
+ page.state.restore
224
+ @current_page = page
225
+ end
226
+
227
+ if request.render?
228
+ return render(request, page).finish
229
+ else # request.action?
230
+ return action(request, page).finish
231
+ end
232
+ else
233
+ #
234
+ # either no or invalid page_id specified. reset to initial state (or
235
+ # create initial state if no such exists yet)
236
+ #
237
+ @initial_state ||= take_snapshot()
238
+ new_page = Page.new(@page_ids.next, @initial_state, nil)
239
+ @page_cache[new_page.id] = new_page
240
+
241
+ url = request.build_url(:page_id => new_page.id)
242
+ if request.page_id
243
+ return Wee::RefreshResponse.new("Invalid or expired page", url).finish
244
+ else
245
+ return Wee::RedirectResponse.new(url).finish
246
+ end
247
+ end
248
+ ensure
249
+ @request = nil
250
+ end
105
251
 
106
- post_callbacks_hook()
252
+ def render_ajax_proc(block, component)
253
+ proc {
254
+ r = component.renderer_class.new
255
+ r.session = self
256
+ r.request = @request
257
+ r.response = Wee::Response.new
258
+ r.document = Wee::HtmlDocument.new
259
+ r.callbacks = @page.callbacks
260
+ r.current_component = component
261
+
262
+ begin
263
+ block.call(r)
264
+ ensure
265
+ r.close
266
+ end
267
+
268
+ r.response << r.document.to_s
269
+ send_response(r.response)
270
+ }
271
+ end
107
272
 
108
- if premature_response
109
- # replace existing page with new snapshot
110
- @page.snapshot = @component_runner.snapshot
111
- @page_store[@context.request.page_id] = @page
112
- @snapshot_page_id = @context.request.page_id
273
+ public :render_ajax_proc
113
274
 
114
- # and send response
115
- set_response(@context, premature_response)
116
- else
117
- handle_new_page_view(@context)
118
- end
119
- end
275
+ def render(request, page)
276
+ r = Wee::Renderer.new
277
+ r.session = self
278
+ r.request = request
279
+ r.response = Wee::GenericResponse.new
280
+ r.document = Wee::HtmlDocument.new
281
+ r.callbacks = Wee::Callbacks.new
120
282
 
121
- def handle_new_page_view(context, snapshot=nil)
122
- new_page_id = @idgen.next.to_s
123
- new_page = create_page(snapshot || @component_runner.snapshot)
124
- @page_store[new_page_id] = new_page
125
- @snapshot_page_id = new_page_id
126
- redirect_url = context.request.build_url(:page_id => new_page_id)
127
- set_response(context, Wee::RedirectResponse.new(redirect_url))
128
- end
283
+ begin
284
+ @root_component.decoration.render_on(r)
285
+ ensure
286
+ r.close
287
+ end
129
288
 
130
- def respond(context, callbacks)
131
- pre_respond_hook
132
- set_response(context, Wee::GenericResponse.new('text/html', ''))
133
- rctx = Wee::RenderingContext.new(context, callbacks, Wee::HtmlWriter.new(context.response.content))
134
- @component_runner.render(rctx)
135
- end
289
+ r.response << r.document.to_s
136
290
 
137
- def pre_respond_hook
138
- end
291
+ page.callbacks = r.callbacks
292
+ return r.response
293
+ end
139
294
 
140
- def post_callbacks_hook
141
- end
295
+ def action(request, page)
296
+ @current_page = nil
297
+
298
+ begin
299
+ @page = page # CONTINUATIONS!
300
+ page.callbacks.with_triggered(request.fields) do
301
+ @root_component.decoration.process_callbacks(page.callbacks)
302
+ end
303
+ rescue AbortCallbackProcessing => abort
304
+ page = @page # CONTINUATIONS!
305
+ if abort.response
306
+ #
307
+ # replace the state of the current page
308
+ #
309
+ @current_page = page
310
+ page.state = take_snapshot()
311
+ @page_cache[page.id] = page
312
+ return abort.response
313
+ else
314
+ # pass on - this is a premature response from Component#call
315
+ end
316
+ end
317
+ request = @request # CONTINUATIONS!
318
+
319
+ #
320
+ # create new page (state)
321
+ #
322
+ new_page = Page.new(@page_ids.next, take_snapshot(), nil)
323
+ @page_cache[new_page.id] = new_page
324
+ @current_page = new_page
325
+
326
+ url = request.build_url(:page_id => new_page.id)
327
+ return Wee::RedirectResponse.new(url)
328
+ end
142
329
 
143
- # Return a new Wee::Page object with the given snapshot assigned.
330
+ #
331
+ # This method takes a snapshot from the current state of the root component
332
+ # and returns it.
333
+ #
334
+ def take_snapshot
335
+ @root_component.decoration.backtrack(state = Wee::State.new)
336
+ return state.freeze
337
+ end
144
338
 
145
- def create_page(snapshot)
146
- idgen = Wee::SequentialIdGenerator.new
147
- page = Wee::Page.new(snapshot, Wee::CallbackRegistry.new(idgen))
148
- end
339
+ end # class Session
149
340
 
150
- end
341
+ end # module Wee