thorero-core 0.9.4.6

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 (275) hide show
  1. data/LICENSE +20 -0
  2. data/README +21 -0
  3. data/Rakefile +352 -0
  4. data/TODO +0 -0
  5. data/bin/merb +12 -0
  6. data/bin/merb-specs +5 -0
  7. data/docs/bootloading.dox +58 -0
  8. data/docs/documentation_standards +40 -0
  9. data/docs/merb-core-call-stack-diagram.mmap +0 -0
  10. data/docs/merb-core-call-stack-diagram.pdf +0 -0
  11. data/docs/merb-core-call-stack-diagram.png +0 -0
  12. data/docs/new_render_api +51 -0
  13. data/lib/merb-core.rb +603 -0
  14. data/lib/merb-core/autoload.rb +32 -0
  15. data/lib/merb-core/bootloader.rb +708 -0
  16. data/lib/merb-core/config.rb +303 -0
  17. data/lib/merb-core/constants.rb +43 -0
  18. data/lib/merb-core/controller/abstract_controller.rb +578 -0
  19. data/lib/merb-core/controller/exceptions.rb +302 -0
  20. data/lib/merb-core/controller/merb_controller.rb +256 -0
  21. data/lib/merb-core/controller/mime.rb +106 -0
  22. data/lib/merb-core/controller/mixins/authentication.rb +87 -0
  23. data/lib/merb-core/controller/mixins/controller.rb +290 -0
  24. data/lib/merb-core/controller/mixins/render.rb +481 -0
  25. data/lib/merb-core/controller/mixins/responder.rb +472 -0
  26. data/lib/merb-core/controller/template.rb +254 -0
  27. data/lib/merb-core/core_ext.rb +8 -0
  28. data/lib/merb-core/core_ext/kernel.rb +319 -0
  29. data/lib/merb-core/dispatch/cookies.rb +91 -0
  30. data/lib/merb-core/dispatch/dispatcher.rb +278 -0
  31. data/lib/merb-core/dispatch/exceptions.html.erb +303 -0
  32. data/lib/merb-core/dispatch/request.rb +603 -0
  33. data/lib/merb-core/dispatch/router.rb +179 -0
  34. data/lib/merb-core/dispatch/router/behavior.rb +867 -0
  35. data/lib/merb-core/dispatch/router/cached_proc.rb +52 -0
  36. data/lib/merb-core/dispatch/router/route.rb +321 -0
  37. data/lib/merb-core/dispatch/session.rb +78 -0
  38. data/lib/merb-core/dispatch/session/cookie.rb +168 -0
  39. data/lib/merb-core/dispatch/session/memcached.rb +184 -0
  40. data/lib/merb-core/dispatch/session/memory.rb +241 -0
  41. data/lib/merb-core/dispatch/worker.rb +28 -0
  42. data/lib/merb-core/gem_ext/erubis.rb +77 -0
  43. data/lib/merb-core/logger.rb +202 -0
  44. data/lib/merb-core/plugins.rb +59 -0
  45. data/lib/merb-core/rack.rb +21 -0
  46. data/lib/merb-core/rack/adapter.rb +44 -0
  47. data/lib/merb-core/rack/adapter/ebb.rb +25 -0
  48. data/lib/merb-core/rack/adapter/evented_mongrel.rb +26 -0
  49. data/lib/merb-core/rack/adapter/fcgi.rb +17 -0
  50. data/lib/merb-core/rack/adapter/irb.rb +118 -0
  51. data/lib/merb-core/rack/adapter/mongrel.rb +26 -0
  52. data/lib/merb-core/rack/adapter/runner.rb +28 -0
  53. data/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +26 -0
  54. data/lib/merb-core/rack/adapter/thin.rb +39 -0
  55. data/lib/merb-core/rack/adapter/thin_turbo.rb +24 -0
  56. data/lib/merb-core/rack/adapter/webrick.rb +36 -0
  57. data/lib/merb-core/rack/application.rb +18 -0
  58. data/lib/merb-core/rack/handler/mongrel.rb +97 -0
  59. data/lib/merb-core/rack/middleware.rb +26 -0
  60. data/lib/merb-core/rack/middleware/path_prefix.rb +31 -0
  61. data/lib/merb-core/rack/middleware/profiler.rb +19 -0
  62. data/lib/merb-core/rack/middleware/static.rb +45 -0
  63. data/lib/merb-core/server.rb +252 -0
  64. data/lib/merb-core/tasks/audit.rake +68 -0
  65. data/lib/merb-core/tasks/merb.rb +1 -0
  66. data/lib/merb-core/tasks/merb_rake_helper.rb +12 -0
  67. data/lib/merb-core/test.rb +11 -0
  68. data/lib/merb-core/test/helpers.rb +9 -0
  69. data/lib/merb-core/test/helpers/controller_helper.rb +8 -0
  70. data/lib/merb-core/test/helpers/multipart_request_helper.rb +175 -0
  71. data/lib/merb-core/test/helpers/request_helper.rb +344 -0
  72. data/lib/merb-core/test/helpers/route_helper.rb +33 -0
  73. data/lib/merb-core/test/helpers/view_helper.rb +121 -0
  74. data/lib/merb-core/test/matchers.rb +9 -0
  75. data/lib/merb-core/test/matchers/controller_matchers.rb +319 -0
  76. data/lib/merb-core/test/matchers/route_matchers.rb +136 -0
  77. data/lib/merb-core/test/matchers/view_matchers.rb +335 -0
  78. data/lib/merb-core/test/run_specs.rb +47 -0
  79. data/lib/merb-core/test/tasks/spectasks.rb +68 -0
  80. data/lib/merb-core/test/test_ext/hpricot.rb +32 -0
  81. data/lib/merb-core/test/test_ext/object.rb +14 -0
  82. data/lib/merb-core/test/test_ext/string.rb +14 -0
  83. data/lib/merb-core/vendor/facets.rb +2 -0
  84. data/lib/merb-core/vendor/facets/dictionary.rb +433 -0
  85. data/lib/merb-core/vendor/facets/inflect.rb +345 -0
  86. data/lib/merb-core/version.rb +11 -0
  87. data/spec/private/config/adapter_spec.rb +32 -0
  88. data/spec/private/config/config_spec.rb +202 -0
  89. data/spec/private/config/environment_spec.rb +13 -0
  90. data/spec/private/config/spec_helper.rb +1 -0
  91. data/spec/private/core_ext/kernel_spec.rb +169 -0
  92. data/spec/private/dispatch/bootloader_spec.rb +24 -0
  93. data/spec/private/dispatch/cookies_spec.rb +107 -0
  94. data/spec/private/dispatch/dispatch_spec.rb +35 -0
  95. data/spec/private/dispatch/fixture/app/controllers/application.rb +4 -0
  96. data/spec/private/dispatch/fixture/app/controllers/exceptions.rb +27 -0
  97. data/spec/private/dispatch/fixture/app/controllers/foo.rb +21 -0
  98. data/spec/private/dispatch/fixture/app/helpers/global_helpers.rb +8 -0
  99. data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +37 -0
  100. data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +216 -0
  101. data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +38 -0
  102. data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +40 -0
  103. data/spec/private/dispatch/fixture/app/views/foo/bar.html.erb +0 -0
  104. data/spec/private/dispatch/fixture/app/views/layout/application.html.erb +11 -0
  105. data/spec/private/dispatch/fixture/config/black_hole.rb +12 -0
  106. data/spec/private/dispatch/fixture/config/environments/development.rb +6 -0
  107. data/spec/private/dispatch/fixture/config/environments/production.rb +5 -0
  108. data/spec/private/dispatch/fixture/config/environments/test.rb +6 -0
  109. data/spec/private/dispatch/fixture/config/init.rb +45 -0
  110. data/spec/private/dispatch/fixture/config/rack.rb +11 -0
  111. data/spec/private/dispatch/fixture/config/router.rb +35 -0
  112. data/spec/private/dispatch/fixture/log/merb_test.log +1874 -0
  113. data/spec/private/dispatch/fixture/public/images/merb.jpg +0 -0
  114. data/spec/private/dispatch/fixture/public/merb.fcgi +4 -0
  115. data/spec/private/dispatch/fixture/public/stylesheets/master.css +119 -0
  116. data/spec/private/dispatch/route_params_spec.rb +24 -0
  117. data/spec/private/dispatch/session_mixin_spec.rb +47 -0
  118. data/spec/private/dispatch/spec_helper.rb +1 -0
  119. data/spec/private/plugins/plugin_spec.rb +166 -0
  120. data/spec/private/rack/application_spec.rb +49 -0
  121. data/spec/private/router/behavior_spec.rb +60 -0
  122. data/spec/private/router/fixture/log/merb_test.log +139 -0
  123. data/spec/private/router/route_spec.rb +414 -0
  124. data/spec/private/router/router_spec.rb +175 -0
  125. data/spec/private/vendor/facets/plural_spec.rb +564 -0
  126. data/spec/private/vendor/facets/singular_spec.rb +489 -0
  127. data/spec/public/DEFINITIONS +11 -0
  128. data/spec/public/abstract_controller/controllers/alt_views/layout/application.erb +1 -0
  129. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_string_controller_layout.erb +1 -0
  130. data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_template_controller_layout.erb +1 -0
  131. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/index.erb +1 -0
  132. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/show.erb +1 -0
  133. data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
  134. data/spec/public/abstract_controller/controllers/alt_views/partial/basic_partial_with_multiple_roots/_partial.erb +1 -0
  135. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_and_custom_location/index.erb +1 -0
  136. data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_inherited/index.erb +1 -0
  137. data/spec/public/abstract_controller/controllers/cousins.rb +41 -0
  138. data/spec/public/abstract_controller/controllers/display.rb +54 -0
  139. data/spec/public/abstract_controller/controllers/filters.rb +193 -0
  140. data/spec/public/abstract_controller/controllers/helpers.rb +41 -0
  141. data/spec/public/abstract_controller/controllers/partial.rb +121 -0
  142. data/spec/public/abstract_controller/controllers/render.rb +113 -0
  143. data/spec/public/abstract_controller/controllers/views/helpers/capture/index.erb +1 -0
  144. data/spec/public/abstract_controller/controllers/views/helpers/capture_eq/index.erb +1 -0
  145. data/spec/public/abstract_controller/controllers/views/helpers/capture_with_args/index.erb +1 -0
  146. data/spec/public/abstract_controller/controllers/views/helpers/concat/index.erb +1 -0
  147. data/spec/public/abstract_controller/controllers/views/layout/alt.erb +1 -0
  148. data/spec/public/abstract_controller/controllers/views/layout/custom.erb +1 -0
  149. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object/index.erb +1 -0
  150. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object_with_action/new.erb +1 -0
  151. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template/index.erb +1 -0
  152. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_app_layout/index.erb +0 -0
  153. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_custom_layout/index.erb +1 -0
  154. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
  155. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/show.erb +1 -0
  156. data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_two_throw_contents/index.erb +1 -0
  157. data/spec/public/abstract_controller/controllers/views/partial/another_directory/_partial.erb +1 -0
  158. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/_partial.erb +1 -0
  159. data/spec/public/abstract_controller/controllers/views/partial/basic_partial/index.erb +1 -0
  160. data/spec/public/abstract_controller/controllers/views/partial/basic_partial_with_multiple_roots/index.erb +1 -0
  161. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_first.erb +1 -0
  162. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_second.erb +1 -0
  163. data/spec/public/abstract_controller/controllers/views/partial/nested_partial/index.erb +1 -0
  164. data/spec/public/abstract_controller/controllers/views/partial/partial_in_another_directory/index.erb +1 -0
  165. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/_collection.erb +1 -0
  166. data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/index.erb +1 -0
  167. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/_collection.erb +1 -0
  168. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/index.erb +1 -0
  169. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/_collection.erb +1 -0
  170. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/index.erb +1 -0
  171. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/_collection.erb +1 -0
  172. data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/index.erb +1 -0
  173. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/_variables.erb +1 -0
  174. data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/index.erb +1 -0
  175. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/_both.erb +1 -0
  176. data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/index.erb +1 -0
  177. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/_partial.erb +1 -0
  178. data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/index.erb +1 -0
  179. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/_with_partial.erb +1 -0
  180. data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/index.erb +1 -0
  181. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/_with_partial.erb +1 -0
  182. data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/index.erb +1 -0
  183. data/spec/public/abstract_controller/controllers/views/partial/with_partial/_with_partial.erb +1 -0
  184. data/spec/public/abstract_controller/controllers/views/partial/with_partial/index.erb +1 -0
  185. data/spec/public/abstract_controller/controllers/views/test_display/foo.html.erb +1 -0
  186. data/spec/public/abstract_controller/controllers/views/test_render/foo.html.erb +0 -0
  187. data/spec/public/abstract_controller/controllers/views/wonderful/index.erb +1 -0
  188. data/spec/public/abstract_controller/display_spec.rb +33 -0
  189. data/spec/public/abstract_controller/filter_spec.rb +106 -0
  190. data/spec/public/abstract_controller/helper_spec.rb +21 -0
  191. data/spec/public/abstract_controller/partial_spec.rb +61 -0
  192. data/spec/public/abstract_controller/render_spec.rb +90 -0
  193. data/spec/public/abstract_controller/spec_helper.rb +31 -0
  194. data/spec/public/boot_loader/boot_loader_spec.rb +33 -0
  195. data/spec/public/boot_loader/spec_helper.rb +1 -0
  196. data/spec/public/controller/authentication_spec.rb +103 -0
  197. data/spec/public/controller/base_spec.rb +36 -0
  198. data/spec/public/controller/controllers/authentication.rb +45 -0
  199. data/spec/public/controller/controllers/base.rb +36 -0
  200. data/spec/public/controller/controllers/display.rb +118 -0
  201. data/spec/public/controller/controllers/redirect.rb +30 -0
  202. data/spec/public/controller/controllers/responder.rb +93 -0
  203. data/spec/public/controller/controllers/url.rb +7 -0
  204. data/spec/public/controller/controllers/views/layout/custom.html.erb +1 -0
  205. data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +1 -0
  206. data/spec/public/controller/controllers/views/layout/custom_arg.json.erb +1 -0
  207. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.html.erb +1 -0
  208. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.xml.erb +1 -0
  209. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.html.erb +1 -0
  210. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.xml.erb +1 -0
  211. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/index.html.erb +1 -0
  212. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/no_layout.html.erb +1 -0
  213. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +1 -0
  214. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/html_default/index.html.erb +1 -0
  215. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/layout/custom.html.erb +1 -0
  216. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.html.erb +1 -0
  217. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.xml.erb +1 -0
  218. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.html.erb +1 -0
  219. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.js.erb +1 -0
  220. data/spec/public/controller/display_spec.rb +84 -0
  221. data/spec/public/controller/redirect_spec.rb +27 -0
  222. data/spec/public/controller/responder_spec.rb +163 -0
  223. data/spec/public/controller/spec_helper.rb +11 -0
  224. data/spec/public/controller/url_spec.rb +180 -0
  225. data/spec/public/core/merb_core_spec.rb +45 -0
  226. data/spec/public/core_ext/class_spec.rb +91 -0
  227. data/spec/public/core_ext/fixtures/core_ext_dependency.rb +2 -0
  228. data/spec/public/core_ext/kernel_spec.rb +9 -0
  229. data/spec/public/core_ext/spec_helper.rb +1 -0
  230. data/spec/public/directory_structure/directory/app/controllers/application.rb +3 -0
  231. data/spec/public/directory_structure/directory/app/controllers/base.rb +13 -0
  232. data/spec/public/directory_structure/directory/app/controllers/custom.rb +19 -0
  233. data/spec/public/directory_structure/directory/app/views/base/template.html.erb +1 -0
  234. data/spec/public/directory_structure/directory/app/views/wonderful/template.erb +1 -0
  235. data/spec/public/directory_structure/directory/config/router.rb +3 -0
  236. data/spec/public/directory_structure/directory/log/merb_test.log +562 -0
  237. data/spec/public/directory_structure/directory_spec.rb +44 -0
  238. data/spec/public/logger/logger_spec.rb +181 -0
  239. data/spec/public/logger/spec_helper.rb +1 -0
  240. data/spec/public/reloading/directory/app/controllers/application.rb +3 -0
  241. data/spec/public/reloading/directory/app/controllers/reload.rb +6 -0
  242. data/spec/public/reloading/directory/config/init.rb +2 -0
  243. data/spec/public/reloading/directory/log/merb_test.log +138 -0
  244. data/spec/public/reloading/reload_spec.rb +103 -0
  245. data/spec/public/request/multipart_spec.rb +41 -0
  246. data/spec/public/request/request_spec.rb +228 -0
  247. data/spec/public/router/default_spec.rb +21 -0
  248. data/spec/public/router/deferred_spec.rb +22 -0
  249. data/spec/public/router/fixation_spec.rb +27 -0
  250. data/spec/public/router/fixture/log/merb_test.log +1556 -0
  251. data/spec/public/router/namespace_spec.rb +113 -0
  252. data/spec/public/router/nested_matches_spec.rb +97 -0
  253. data/spec/public/router/nested_resources_spec.rb +41 -0
  254. data/spec/public/router/resource_spec.rb +37 -0
  255. data/spec/public/router/resources_spec.rb +82 -0
  256. data/spec/public/router/spec_helper.rb +90 -0
  257. data/spec/public/router/special_spec.rb +61 -0
  258. data/spec/public/router/string_spec.rb +61 -0
  259. data/spec/public/template/template_spec.rb +104 -0
  260. data/spec/public/template/templates/error.html.erb +2 -0
  261. data/spec/public/template/templates/template.html.erb +1 -0
  262. data/spec/public/template/templates/template.html.myt +1 -0
  263. data/spec/public/test/controller_matchers_spec.rb +402 -0
  264. data/spec/public/test/controllers/controller_assertion_mock.rb +7 -0
  265. data/spec/public/test/controllers/dispatch_controller.rb +11 -0
  266. data/spec/public/test/controllers/spec_helper_controller.rb +38 -0
  267. data/spec/public/test/multipart_request_helper_spec.rb +159 -0
  268. data/spec/public/test/multipart_upload_text_file.txt +1 -0
  269. data/spec/public/test/request_helper_spec.rb +221 -0
  270. data/spec/public/test/route_helper_spec.rb +71 -0
  271. data/spec/public/test/route_matchers_spec.rb +162 -0
  272. data/spec/public/test/view_helper_spec.rb +96 -0
  273. data/spec/public/test/view_matchers_spec.rb +183 -0
  274. data/spec/spec_helper.rb +68 -0
  275. metadata +542 -0
@@ -0,0 +1,28 @@
1
+ module Merb
2
+ class Worker
3
+
4
+ attr_accessor :thread
5
+
6
+ def initialize
7
+ @thread = Thread.new { loop { process_queue } }
8
+ end
9
+
10
+ def process_queue
11
+ begin
12
+ while blk = Merb::Dispatcher.work_queue.pop
13
+ # we've been blocking on the queue waiting for an item sleeping.
14
+ # when someone pushes an item it wakes up this thread so we
15
+ # immediately pass execution to the scheduler so we don't
16
+ # accidentally run this block before the action finishes
17
+ # it's own processing
18
+ Thread.pass
19
+ blk.call
20
+ end
21
+ rescue Exception => e
22
+ Merb.logger.warn! %Q!Worker Thread Crashed with Exception:\n#{Merb.exception(e)}\nRestarting Worker Thread!
23
+ retry
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,77 @@
1
+ require 'erubis'
2
+ module Erubis
3
+ module Basic::Converter
4
+ def convert_input(src, input)
5
+ pat = @pattern
6
+ regexp = pat.nil? || pat == '<% %>' ? DEFAULT_REGEXP : pattern_regexp(pat)
7
+ pos = 0
8
+ is_bol = true # is beginning of line
9
+ input.scan(regexp) do |indicator, code, tailch, rspace|
10
+ match = Regexp.last_match()
11
+ len = match.begin(0) - pos
12
+ text = input[pos, len]
13
+ pos = match.end(0)
14
+ ch = indicator ? indicator[0] : nil
15
+ lspace = ch == ?= ? nil : detect_spaces_at_bol(text, is_bol)
16
+ is_bol = rspace ? true : false
17
+ add_text(src, text) if text && !text.empty?
18
+ ## * when '<%= %>', do nothing
19
+ ## * when '<% %>' or '<%# %>', delete spaces iff only spaces are around '<% %>'
20
+ if ch == ?= # <%= %>
21
+ rspace = nil if tailch && !tailch.empty?
22
+ add_text(src, lspace) if lspace
23
+ add_expr(src, code, indicator)
24
+ add_text(src, rspace) if rspace
25
+ elsif ch == ?\# # <%# %>
26
+ n = code.count("\n") + (rspace ? 1 : 0)
27
+ if @trim && lspace && rspace
28
+ add_stmt(src, "\n" * n)
29
+ else
30
+ add_text(src, lspace) if lspace
31
+ add_stmt(src, "\n" * n)
32
+ add_text(src, rspace) if rspace
33
+ end
34
+ elsif ch == ?% # <%% %>
35
+ s = "#{lspace}#{@prefix||='<%'}#{code}#{tailch}#{@postfix||='%>'}#{rspace}"
36
+ add_text(src, s)
37
+ else # <% %>
38
+ if @trim && lspace && rspace
39
+ if respond_to?(:add_stmt2)
40
+ add_stmt2(src, "#{lspace}#{code}#{rspace}", tailch)
41
+ else
42
+ add_stmt(src, "#{lspace}#{code}#{rspace}")
43
+ end
44
+ else
45
+ add_text(src, lspace) if lspace
46
+ if respond_to?(:add_stmt2)
47
+ add_stmt2(src, code, tailch)
48
+ else
49
+ add_stmt(src, code)
50
+ end
51
+ add_text(src, rspace) if rspace
52
+ end
53
+ end
54
+ end
55
+ #rest = $' || input # ruby1.8
56
+ rest = pos == 0 ? input : input[pos..-1] # ruby1.9
57
+ add_text(src, rest)
58
+ end
59
+
60
+ end
61
+
62
+ class MEruby < Erubis::Eruby
63
+ include PercentLineEnhancer
64
+ include StringBufferEnhancer
65
+ end
66
+
67
+ # Loads a file, runs it through Erubis and parses it as YAML.
68
+ #
69
+ # ===== Parameters
70
+ # file<String>:: The name of the file to load.
71
+ # binding<Binding>::
72
+ # The binding to use when evaluating the ERB tags. Defaults to the current
73
+ # binding.
74
+ def self.load_yaml_file(file, binding = binding)
75
+ YAML::load(Erubis::MEruby.new(IO.read(File.expand_path(file))).result(binding))
76
+ end
77
+ end
@@ -0,0 +1,202 @@
1
+ require "time" # httpdate
2
+ # ==== Public Merb Logger API
3
+ #
4
+ # To replace an existing logger with a new one:
5
+ # Merb::Logger.set_log(log{String, IO},level{Symbol, String})
6
+ #
7
+ # Available logging levels are
8
+ # Merb::Logger::{ Fatal, Error, Warn, Info, Debug }
9
+ #
10
+ # Logging via:
11
+ # Merb.logger.fatal(message<String>,&block)
12
+ # Merb.logger.error(message<String>,&block)
13
+ # Merb.logger.warn(message<String>,&block)
14
+ # Merb.logger.info(message<String>,&block)
15
+ # Merb.logger.debug(message<String>,&block)
16
+ #
17
+ # Logging with autoflush:
18
+ # Merb.logger.fatal!(message<String>,&block)
19
+ # Merb.logger.error!(message<String>,&block)
20
+ # Merb.logger.warn!(message<String>,&block)
21
+ # Merb.logger.info!(message<String>,&block)
22
+ # Merb.logger.debug!(message<String>,&block)
23
+ #
24
+ # Flush the buffer to
25
+ # Merb.logger.flush
26
+ #
27
+ # Remove the current log object
28
+ # Merb.logger.close
29
+ #
30
+ # ==== Private Merb Logger API
31
+ #
32
+ # To initialize the logger you create a new object, proxies to set_log.
33
+ # Merb::Logger.new(log{String, IO},level{Symbol, String})
34
+ module Merb
35
+
36
+ class << self
37
+ attr_accessor :logger
38
+ end
39
+
40
+ class Logger
41
+
42
+ attr_accessor :level
43
+ attr_accessor :delimiter
44
+ attr_accessor :auto_flush
45
+ attr_reader :buffer
46
+ attr_reader :log
47
+ attr_reader :init_args
48
+
49
+ # ==== Notes
50
+ # Ruby (standard) logger levels:
51
+ # :fatal:: An unhandleable error that results in a program crash
52
+ # :error:: A handleable error condition
53
+ # :warn:: A warning
54
+ # :info:: generic (useful) information about system operation
55
+ # :debug:: low-level information for developers
56
+ Levels =
57
+ {
58
+ :fatal => 7,
59
+ :error => 6,
60
+ :warn => 4,
61
+ :info => 3,
62
+ :debug => 0
63
+ } unless const_defined?(:Levels)
64
+
65
+ private
66
+
67
+ # Readies a log for writing.
68
+ #
69
+ # ==== Parameters
70
+ # log<IO, String>:: Either an IO object or a name of a logfile.
71
+ def initialize_log(log)
72
+ close if @log # be sure that we don't leave open files laying around.
73
+
74
+ if log.respond_to?(:write)
75
+ @log = log
76
+ elsif File.exist?(log)
77
+ @log = open(log, (File::WRONLY | File::APPEND))
78
+ @log.sync = true
79
+ else
80
+ FileUtils.mkdir_p(File.dirname(log)) unless File.directory?(File.dirname(log))
81
+ @log = open(log, (File::WRONLY | File::APPEND | File::CREAT))
82
+ @log.sync = true
83
+ @log.write("#{Time.now.httpdate} #{delimiter} info #{delimiter} Logfile created\n")
84
+ end
85
+ end
86
+
87
+ public
88
+
89
+ # To initialize the logger you create a new object, proxies to set_log.
90
+ #
91
+ # ==== Parameters
92
+ # *args:: Arguments to create the log from. See set_logs for specifics.
93
+ def initialize(*args)
94
+ @init_args = args
95
+ set_log(*args)
96
+ end
97
+
98
+ # Replaces an existing logger with a new one.
99
+ #
100
+ # ==== Parameters
101
+ # log<IO, String>:: Either an IO object or a name of a logfile.
102
+ # log_level<~to_sym>::
103
+ # The log level from, e.g. :fatal or :info. Defaults to :error in the
104
+ # production environment and :debug otherwise.
105
+ # delimiter<String>::
106
+ # Delimiter to use between message sections. Defaults to " ~ ".
107
+ # auto_flush<Boolean>::
108
+ # Whether the log should automatically flush after new messages are
109
+ # added. Defaults to false.
110
+ def set_log(log, log_level = nil, delimiter = " ~ ", auto_flush = false)
111
+ if log_level && Levels[log_level.to_sym]
112
+ @level = Levels[log_level.to_sym]
113
+ elsif Merb.environment == "production"
114
+ @level = Levels[:warn]
115
+ else
116
+ @level = Levels[:debug]
117
+ end
118
+ @buffer = []
119
+ @delimiter = delimiter
120
+ @auto_flush = auto_flush
121
+
122
+ initialize_log(log)
123
+
124
+ Merb.logger = self
125
+ end
126
+
127
+ # Flush the entire buffer to the log object.
128
+ def flush
129
+ return unless @buffer.size > 0
130
+ @log.write(@buffer.slice!(0..-1).to_s)
131
+ end
132
+
133
+ # Close and remove the current log object.
134
+ def close
135
+ flush
136
+ @log.close if @log.respond_to?(:close) && !@log.tty?
137
+ @log = nil
138
+ end
139
+
140
+ # Appends a message to the log. The methods yield to an optional block and
141
+ # the output of this block will be appended to the message.
142
+ #
143
+ # ==== Parameters
144
+ # string<String>:: The message to be logged. Defaults to nil.
145
+ #
146
+ # ==== Returns
147
+ # String:: The resulting message added to the log file.
148
+ def <<(string = nil)
149
+ message = ""
150
+ message << delimiter
151
+ message << string if string
152
+ message << "\n" unless message[-1] == ?\n
153
+ @buffer << message
154
+ flush if @auto_flush
155
+
156
+ message
157
+ end
158
+ alias :push :<<
159
+
160
+ # Generate the logging methods for Merb.logger for each log level.
161
+ Levels.each_pair do |name, number|
162
+ class_eval <<-LEVELMETHODS, __FILE__, __LINE__
163
+
164
+ # Appends a message to the log if the log level is at least as high as
165
+ # the log level of the logger.
166
+ #
167
+ # ==== Parameters
168
+ # string<String>:: The message to be logged. Defaults to nil.
169
+ #
170
+ # ==== Returns
171
+ # self:: The logger object for chaining.
172
+ def #{name}(message = nil)
173
+ self << message if #{number} >= level
174
+ self
175
+ end
176
+
177
+ # Appends a message to the log if the log level is at least as high as
178
+ # the log level of the logger. The bang! version of the method also auto
179
+ # flushes the log buffer to disk.
180
+ #
181
+ # ==== Parameters
182
+ # string<String>:: The message to be logged. Defaults to nil.
183
+ #
184
+ # ==== Returns
185
+ # self:: The logger object for chaining.
186
+ def #{name}!(message = nil)
187
+ self << message if #{number} >= level
188
+ flush if #{number} >= level
189
+ self
190
+ end
191
+
192
+ # ==== Returns
193
+ # Boolean:: True if this level will be logged by this logger.
194
+ def #{name}?
195
+ #{number} >= level
196
+ end
197
+ LEVELMETHODS
198
+ end
199
+
200
+ end
201
+
202
+ end
@@ -0,0 +1,59 @@
1
+ module Merb
2
+
3
+ module Plugins
4
+
5
+ # ==== Returns
6
+ # Hash::
7
+ # The configuration loaded from Merb.root / "config/plugins.yml" or, if
8
+ # the load fails, an empty hash whose default value is another Hash.
9
+ def self.config
10
+ @config ||= begin
11
+ # this is so you can do Merb.plugins.config[:helpers][:awesome] = "bar"
12
+ config_hash = Hash.new {|h,k| h[k] = {}}
13
+ file = Merb.root / "config" / "plugins.yml"
14
+ config_hash.merge((File.exists?(file) && YAML.load_file(file)) || {})
15
+ end
16
+ end
17
+
18
+ # ==== Returns
19
+ # Array(String):: All Rakefile load paths Merb uses for plugins.
20
+ def self.rakefiles
21
+ Merb.rakefiles
22
+ end
23
+
24
+ # ==== Returns
25
+ # Array(String):: All Generator load paths Merb uses for plugins.
26
+ def self.generators
27
+ Merb.generators
28
+ end
29
+
30
+ # ==== Parameters
31
+ # *rakefiles:: Rakefiles to add to the list of plugin Rakefiles.
32
+ #
33
+ # ==== Notes
34
+ #
35
+ # This is a recommended way to register your plugin's Raketasks
36
+ # in Merb.
37
+ #
38
+ # ==== Examples
39
+ # From merb_sequel plugin:
40
+ #
41
+ # if defined(Merb::Plugins)
42
+ # Merb::Plugins.add_rakefiles "merb_sequel" / "merbtasks"
43
+ # end
44
+ def self.add_rakefiles(*rakefiles)
45
+ Merb.add_rakefiles *rakefiles
46
+ end
47
+
48
+ # ==== Parameters
49
+ # *generators:: Generator paths to add to the list of plugin generators.
50
+ #
51
+ # ==== Notes
52
+ #
53
+ # This is the recommended way to register your plugin's generators
54
+ # in Merb.
55
+ def self.add_generators(*generators)
56
+ Merb.add_generators *generators
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,21 @@
1
+ require 'rack'
2
+ module Merb
3
+ module Rack
4
+ autoload :Application, 'merb-core' / 'rack' / 'application'
5
+ autoload :Adapter, 'merb-core' / 'rack' / 'adapter'
6
+ autoload :Ebb, 'merb-core' / 'rack' / 'adapter' / 'ebb'
7
+ autoload :EventedMongrel, 'merb-core' / 'rack' / 'adapter' / 'evented_mongrel'
8
+ autoload :FastCGI, 'merb-core' / 'rack' / 'adapter' / 'fcgi'
9
+ autoload :Irb, 'merb-core' / 'rack' / 'adapter' / 'irb'
10
+ autoload :Middleware, 'merb-core' / 'rack' / 'middleware'
11
+ autoload :Mongrel, 'merb-core' / 'rack' / 'adapter' / 'mongrel'
12
+ autoload :Runner, 'merb-core' / 'rack' / 'adapter' / 'runner'
13
+ autoload :SwiftipliedMongrel, 'merb-core' / 'rack' / 'adapter' / 'swiftiplied_mongrel'
14
+ autoload :Thin, 'merb-core' / 'rack' / 'adapter' / 'thin'
15
+ autoload :ThinTurbo, 'merb-core' / 'rack' / 'adapter' / 'thin_turbo'
16
+ autoload :WEBrick, 'merb-core' / 'rack' / 'adapter' / 'webrick'
17
+ autoload :PathPrefix, 'merb-core' / 'rack' / 'middleware' / 'path_prefix'
18
+ autoload :Static, 'merb-core' / 'rack' / 'middleware' / 'static'
19
+ autoload :Profiler, 'merb-core' / 'rack' / 'middleware' / 'profiler'
20
+ end # Rack
21
+ end # Merb
@@ -0,0 +1,44 @@
1
+ module Merb
2
+
3
+ module Rack
4
+
5
+ class Adapter
6
+
7
+ class << self
8
+ # ==== Parameters
9
+ # id<String>:: The identifier of the Rack adapter class to retrieve.
10
+ #
11
+ # ==== Returns.
12
+ # Class:: The adapter class.
13
+ def get(id)
14
+ Object.full_const_get(@adapters[id])
15
+ end
16
+
17
+ # Registers a new Rack adapter.
18
+ #
19
+ # ==== Parameters
20
+ # ids<Array>:: Identifiers by which this adapter is recognized by.
21
+ # adapter_class<Class>:: The Rack adapter class.
22
+ def register(ids, adapter_class)
23
+ @adapters ||= Hash.new
24
+ ids.each { |id| @adapters[id] = "Merb::Rack::#{adapter_class}" }
25
+ end
26
+ end # class << self
27
+
28
+ end # Adapter
29
+
30
+ # Register some Rack adapters
31
+ Adapter.register %w{ebb}, :Ebb
32
+ Adapter.register %w{emongrel}, :EventedMongrel
33
+ Adapter.register %w{fastcgi fcgi}, :FastCGI
34
+ Adapter.register %w{irb}, :Irb
35
+ Adapter.register %w{mongrel}, :Mongrel
36
+ Adapter.register %w{runner}, :Runner
37
+ Adapter.register %w{smongrel swift}, :SwiftipliedMongrel
38
+ Adapter.register %w{thin}, :Thin
39
+ Adapter.register %w{thin-turbo}, :ThinTurbo
40
+ Adapter.register %w{webrick}, :WEBrick
41
+
42
+ end # Rack
43
+ end # Merb
44
+
@@ -0,0 +1,25 @@
1
+ require 'ebb'
2
+ module Merb
3
+
4
+ module Rack
5
+
6
+ class Ebb
7
+ # start an Ebb server on given host and port.
8
+
9
+ # ==== Parameters
10
+ # opts<Hash>:: Options for Ebb (see below).
11
+ #
12
+ # ==== Options (opts)
13
+ # :host<String>:: The hostname that Ebb should serve.
14
+ # :port<Fixnum>:: The port Ebb should bind to.
15
+ # :app:: The application
16
+ def self.start(opts={})
17
+ Merb.logger.warn!("Using Ebb adapter")
18
+ Merb::Dispatcher.use_mutex = false
19
+ th = Thread.new { ::Ebb.start_server(opts[:app], opts) }
20
+ Merb::Server.change_privilege
21
+ th.join
22
+ end
23
+ end
24
+ end
25
+ end