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.
- data/LICENSE +20 -0
- data/README +21 -0
- data/Rakefile +352 -0
- data/TODO +0 -0
- data/bin/merb +12 -0
- data/bin/merb-specs +5 -0
- data/docs/bootloading.dox +58 -0
- data/docs/documentation_standards +40 -0
- data/docs/merb-core-call-stack-diagram.mmap +0 -0
- data/docs/merb-core-call-stack-diagram.pdf +0 -0
- data/docs/merb-core-call-stack-diagram.png +0 -0
- data/docs/new_render_api +51 -0
- data/lib/merb-core.rb +603 -0
- data/lib/merb-core/autoload.rb +32 -0
- data/lib/merb-core/bootloader.rb +708 -0
- data/lib/merb-core/config.rb +303 -0
- data/lib/merb-core/constants.rb +43 -0
- data/lib/merb-core/controller/abstract_controller.rb +578 -0
- data/lib/merb-core/controller/exceptions.rb +302 -0
- data/lib/merb-core/controller/merb_controller.rb +256 -0
- data/lib/merb-core/controller/mime.rb +106 -0
- data/lib/merb-core/controller/mixins/authentication.rb +87 -0
- data/lib/merb-core/controller/mixins/controller.rb +290 -0
- data/lib/merb-core/controller/mixins/render.rb +481 -0
- data/lib/merb-core/controller/mixins/responder.rb +472 -0
- data/lib/merb-core/controller/template.rb +254 -0
- data/lib/merb-core/core_ext.rb +8 -0
- data/lib/merb-core/core_ext/kernel.rb +319 -0
- data/lib/merb-core/dispatch/cookies.rb +91 -0
- data/lib/merb-core/dispatch/dispatcher.rb +278 -0
- data/lib/merb-core/dispatch/exceptions.html.erb +303 -0
- data/lib/merb-core/dispatch/request.rb +603 -0
- data/lib/merb-core/dispatch/router.rb +179 -0
- data/lib/merb-core/dispatch/router/behavior.rb +867 -0
- data/lib/merb-core/dispatch/router/cached_proc.rb +52 -0
- data/lib/merb-core/dispatch/router/route.rb +321 -0
- data/lib/merb-core/dispatch/session.rb +78 -0
- data/lib/merb-core/dispatch/session/cookie.rb +168 -0
- data/lib/merb-core/dispatch/session/memcached.rb +184 -0
- data/lib/merb-core/dispatch/session/memory.rb +241 -0
- data/lib/merb-core/dispatch/worker.rb +28 -0
- data/lib/merb-core/gem_ext/erubis.rb +77 -0
- data/lib/merb-core/logger.rb +202 -0
- data/lib/merb-core/plugins.rb +59 -0
- data/lib/merb-core/rack.rb +21 -0
- data/lib/merb-core/rack/adapter.rb +44 -0
- data/lib/merb-core/rack/adapter/ebb.rb +25 -0
- data/lib/merb-core/rack/adapter/evented_mongrel.rb +26 -0
- data/lib/merb-core/rack/adapter/fcgi.rb +17 -0
- data/lib/merb-core/rack/adapter/irb.rb +118 -0
- data/lib/merb-core/rack/adapter/mongrel.rb +26 -0
- data/lib/merb-core/rack/adapter/runner.rb +28 -0
- data/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +26 -0
- data/lib/merb-core/rack/adapter/thin.rb +39 -0
- data/lib/merb-core/rack/adapter/thin_turbo.rb +24 -0
- data/lib/merb-core/rack/adapter/webrick.rb +36 -0
- data/lib/merb-core/rack/application.rb +18 -0
- data/lib/merb-core/rack/handler/mongrel.rb +97 -0
- data/lib/merb-core/rack/middleware.rb +26 -0
- data/lib/merb-core/rack/middleware/path_prefix.rb +31 -0
- data/lib/merb-core/rack/middleware/profiler.rb +19 -0
- data/lib/merb-core/rack/middleware/static.rb +45 -0
- data/lib/merb-core/server.rb +252 -0
- data/lib/merb-core/tasks/audit.rake +68 -0
- data/lib/merb-core/tasks/merb.rb +1 -0
- data/lib/merb-core/tasks/merb_rake_helper.rb +12 -0
- data/lib/merb-core/test.rb +11 -0
- data/lib/merb-core/test/helpers.rb +9 -0
- data/lib/merb-core/test/helpers/controller_helper.rb +8 -0
- data/lib/merb-core/test/helpers/multipart_request_helper.rb +175 -0
- data/lib/merb-core/test/helpers/request_helper.rb +344 -0
- data/lib/merb-core/test/helpers/route_helper.rb +33 -0
- data/lib/merb-core/test/helpers/view_helper.rb +121 -0
- data/lib/merb-core/test/matchers.rb +9 -0
- data/lib/merb-core/test/matchers/controller_matchers.rb +319 -0
- data/lib/merb-core/test/matchers/route_matchers.rb +136 -0
- data/lib/merb-core/test/matchers/view_matchers.rb +335 -0
- data/lib/merb-core/test/run_specs.rb +47 -0
- data/lib/merb-core/test/tasks/spectasks.rb +68 -0
- data/lib/merb-core/test/test_ext/hpricot.rb +32 -0
- data/lib/merb-core/test/test_ext/object.rb +14 -0
- data/lib/merb-core/test/test_ext/string.rb +14 -0
- data/lib/merb-core/vendor/facets.rb +2 -0
- data/lib/merb-core/vendor/facets/dictionary.rb +433 -0
- data/lib/merb-core/vendor/facets/inflect.rb +345 -0
- data/lib/merb-core/version.rb +11 -0
- data/spec/private/config/adapter_spec.rb +32 -0
- data/spec/private/config/config_spec.rb +202 -0
- data/spec/private/config/environment_spec.rb +13 -0
- data/spec/private/config/spec_helper.rb +1 -0
- data/spec/private/core_ext/kernel_spec.rb +169 -0
- data/spec/private/dispatch/bootloader_spec.rb +24 -0
- data/spec/private/dispatch/cookies_spec.rb +107 -0
- data/spec/private/dispatch/dispatch_spec.rb +35 -0
- data/spec/private/dispatch/fixture/app/controllers/application.rb +4 -0
- data/spec/private/dispatch/fixture/app/controllers/exceptions.rb +27 -0
- data/spec/private/dispatch/fixture/app/controllers/foo.rb +21 -0
- data/spec/private/dispatch/fixture/app/helpers/global_helpers.rb +8 -0
- data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +37 -0
- data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +216 -0
- data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +38 -0
- data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +40 -0
- data/spec/private/dispatch/fixture/app/views/foo/bar.html.erb +0 -0
- data/spec/private/dispatch/fixture/app/views/layout/application.html.erb +11 -0
- data/spec/private/dispatch/fixture/config/black_hole.rb +12 -0
- data/spec/private/dispatch/fixture/config/environments/development.rb +6 -0
- data/spec/private/dispatch/fixture/config/environments/production.rb +5 -0
- data/spec/private/dispatch/fixture/config/environments/test.rb +6 -0
- data/spec/private/dispatch/fixture/config/init.rb +45 -0
- data/spec/private/dispatch/fixture/config/rack.rb +11 -0
- data/spec/private/dispatch/fixture/config/router.rb +35 -0
- data/spec/private/dispatch/fixture/log/merb_test.log +1874 -0
- data/spec/private/dispatch/fixture/public/images/merb.jpg +0 -0
- data/spec/private/dispatch/fixture/public/merb.fcgi +4 -0
- data/spec/private/dispatch/fixture/public/stylesheets/master.css +119 -0
- data/spec/private/dispatch/route_params_spec.rb +24 -0
- data/spec/private/dispatch/session_mixin_spec.rb +47 -0
- data/spec/private/dispatch/spec_helper.rb +1 -0
- data/spec/private/plugins/plugin_spec.rb +166 -0
- data/spec/private/rack/application_spec.rb +49 -0
- data/spec/private/router/behavior_spec.rb +60 -0
- data/spec/private/router/fixture/log/merb_test.log +139 -0
- data/spec/private/router/route_spec.rb +414 -0
- data/spec/private/router/router_spec.rb +175 -0
- data/spec/private/vendor/facets/plural_spec.rb +564 -0
- data/spec/private/vendor/facets/singular_spec.rb +489 -0
- data/spec/public/DEFINITIONS +11 -0
- data/spec/public/abstract_controller/controllers/alt_views/layout/application.erb +1 -0
- data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_string_controller_layout.erb +1 -0
- data/spec/public/abstract_controller/controllers/alt_views/layout/merb/test/fixtures/abstract/render_template_controller_layout.erb +1 -0
- data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/display_object_with_multiple_roots/show.erb +1 -0
- data/spec/public/abstract_controller/controllers/alt_views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/alt_views/partial/basic_partial_with_multiple_roots/_partial.erb +1 -0
- data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_and_custom_location/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/alt_views/render_template_multiple_roots_inherited/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/cousins.rb +41 -0
- data/spec/public/abstract_controller/controllers/display.rb +54 -0
- data/spec/public/abstract_controller/controllers/filters.rb +193 -0
- data/spec/public/abstract_controller/controllers/helpers.rb +41 -0
- data/spec/public/abstract_controller/controllers/partial.rb +121 -0
- data/spec/public/abstract_controller/controllers/render.rb +113 -0
- data/spec/public/abstract_controller/controllers/views/helpers/capture/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/helpers/capture_eq/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/helpers/capture_with_args/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/helpers/concat/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/layout/alt.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/layout/custom.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/display_object_with_action/new.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_app_layout/index.erb +0 -0
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_custom_layout/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_template_multiple_roots/show.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/merb/test/fixtures/abstract/render_two_throw_contents/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/another_directory/_partial.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/basic_partial/_partial.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/basic_partial/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/basic_partial_with_multiple_roots/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_first.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/nested_partial/_second.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/nested_partial/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_in_another_directory/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/_collection.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_both/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/_collection.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/_collection.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_as/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/_collection.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_collections_and_counter/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/_variables.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_locals/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/_both.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/partial_with_with_and_locals/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/_partial.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/with_absolute_partial/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/_with_partial.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/with_as_partial/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/_with_partial.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/with_nil_partial/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/with_partial/_with_partial.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/partial/with_partial/index.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/test_display/foo.html.erb +1 -0
- data/spec/public/abstract_controller/controllers/views/test_render/foo.html.erb +0 -0
- data/spec/public/abstract_controller/controllers/views/wonderful/index.erb +1 -0
- data/spec/public/abstract_controller/display_spec.rb +33 -0
- data/spec/public/abstract_controller/filter_spec.rb +106 -0
- data/spec/public/abstract_controller/helper_spec.rb +21 -0
- data/spec/public/abstract_controller/partial_spec.rb +61 -0
- data/spec/public/abstract_controller/render_spec.rb +90 -0
- data/spec/public/abstract_controller/spec_helper.rb +31 -0
- data/spec/public/boot_loader/boot_loader_spec.rb +33 -0
- data/spec/public/boot_loader/spec_helper.rb +1 -0
- data/spec/public/controller/authentication_spec.rb +103 -0
- data/spec/public/controller/base_spec.rb +36 -0
- data/spec/public/controller/controllers/authentication.rb +45 -0
- data/spec/public/controller/controllers/base.rb +36 -0
- data/spec/public/controller/controllers/display.rb +118 -0
- data/spec/public/controller/controllers/redirect.rb +30 -0
- data/spec/public/controller/controllers/responder.rb +93 -0
- data/spec/public/controller/controllers/url.rb +7 -0
- data/spec/public/controller/controllers/views/layout/custom.html.erb +1 -0
- data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +1 -0
- data/spec/public/controller/controllers/views/layout/custom_arg.json.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_and_local_provides/index.xml.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/class_provides/index.xml.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/index.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template/no_layout.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/html_default/index.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/layout/custom.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/local_provides/index.xml.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/multi_provides/index.js.erb +1 -0
- data/spec/public/controller/display_spec.rb +84 -0
- data/spec/public/controller/redirect_spec.rb +27 -0
- data/spec/public/controller/responder_spec.rb +163 -0
- data/spec/public/controller/spec_helper.rb +11 -0
- data/spec/public/controller/url_spec.rb +180 -0
- data/spec/public/core/merb_core_spec.rb +45 -0
- data/spec/public/core_ext/class_spec.rb +91 -0
- data/spec/public/core_ext/fixtures/core_ext_dependency.rb +2 -0
- data/spec/public/core_ext/kernel_spec.rb +9 -0
- data/spec/public/core_ext/spec_helper.rb +1 -0
- data/spec/public/directory_structure/directory/app/controllers/application.rb +3 -0
- data/spec/public/directory_structure/directory/app/controllers/base.rb +13 -0
- data/spec/public/directory_structure/directory/app/controllers/custom.rb +19 -0
- data/spec/public/directory_structure/directory/app/views/base/template.html.erb +1 -0
- data/spec/public/directory_structure/directory/app/views/wonderful/template.erb +1 -0
- data/spec/public/directory_structure/directory/config/router.rb +3 -0
- data/spec/public/directory_structure/directory/log/merb_test.log +562 -0
- data/spec/public/directory_structure/directory_spec.rb +44 -0
- data/spec/public/logger/logger_spec.rb +181 -0
- data/spec/public/logger/spec_helper.rb +1 -0
- data/spec/public/reloading/directory/app/controllers/application.rb +3 -0
- data/spec/public/reloading/directory/app/controllers/reload.rb +6 -0
- data/spec/public/reloading/directory/config/init.rb +2 -0
- data/spec/public/reloading/directory/log/merb_test.log +138 -0
- data/spec/public/reloading/reload_spec.rb +103 -0
- data/spec/public/request/multipart_spec.rb +41 -0
- data/spec/public/request/request_spec.rb +228 -0
- data/spec/public/router/default_spec.rb +21 -0
- data/spec/public/router/deferred_spec.rb +22 -0
- data/spec/public/router/fixation_spec.rb +27 -0
- data/spec/public/router/fixture/log/merb_test.log +1556 -0
- data/spec/public/router/namespace_spec.rb +113 -0
- data/spec/public/router/nested_matches_spec.rb +97 -0
- data/spec/public/router/nested_resources_spec.rb +41 -0
- data/spec/public/router/resource_spec.rb +37 -0
- data/spec/public/router/resources_spec.rb +82 -0
- data/spec/public/router/spec_helper.rb +90 -0
- data/spec/public/router/special_spec.rb +61 -0
- data/spec/public/router/string_spec.rb +61 -0
- data/spec/public/template/template_spec.rb +104 -0
- data/spec/public/template/templates/error.html.erb +2 -0
- data/spec/public/template/templates/template.html.erb +1 -0
- data/spec/public/template/templates/template.html.myt +1 -0
- data/spec/public/test/controller_matchers_spec.rb +402 -0
- data/spec/public/test/controllers/controller_assertion_mock.rb +7 -0
- data/spec/public/test/controllers/dispatch_controller.rb +11 -0
- data/spec/public/test/controllers/spec_helper_controller.rb +38 -0
- data/spec/public/test/multipart_request_helper_spec.rb +159 -0
- data/spec/public/test/multipart_upload_text_file.txt +1 -0
- data/spec/public/test/request_helper_spec.rb +221 -0
- data/spec/public/test/route_helper_spec.rb +71 -0
- data/spec/public/test/route_matchers_spec.rb +162 -0
- data/spec/public/test/view_helper_spec.rb +96 -0
- data/spec/public/test/view_matchers_spec.rb +183 -0
- data/spec/spec_helper.rb +68 -0
- 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
|