Pistos-ramaze 2008.09
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/README.markdown +481 -0
- data/Rakefile +228 -0
- data/benchmark/results.txt +131 -0
- data/benchmark/run.rb +362 -0
- data/benchmark/suite/minimal.rb +13 -0
- data/benchmark/suite/no_informer.rb +9 -0
- data/benchmark/suite/no_sessions.rb +10 -0
- data/benchmark/suite/no_template.rb +9 -0
- data/benchmark/suite/simple.rb +7 -0
- data/benchmark/suite/template_amrita2.rb +17 -0
- data/benchmark/suite/template_builder.rb +12 -0
- data/benchmark/suite/template_erubis.rb +10 -0
- data/benchmark/suite/template_ezamar.rb +10 -0
- data/benchmark/suite/template_haml.rb +15 -0
- data/benchmark/suite/template_liquid.rb +13 -0
- data/benchmark/suite/template_markaby.rb +11 -0
- data/benchmark/suite/template_nagoro.rb +10 -0
- data/benchmark/suite/template_redcloth.rb +15 -0
- data/benchmark/suite/template_tenjin.rb +10 -0
- data/benchmark/test.rb +35 -0
- data/bin/ramaze +80 -0
- data/doc/AUTHORS +29 -0
- data/doc/CHANGELOG +19530 -0
- data/doc/COPYING +56 -0
- data/doc/FAQ +92 -0
- data/doc/GPL +339 -0
- data/doc/INSTALL +92 -0
- data/doc/LEGAL +26 -0
- data/doc/TODO +29 -0
- data/doc/meta/announcement.txt +99 -0
- data/doc/meta/configuration.txt +163 -0
- data/doc/meta/internals.txt +278 -0
- data/doc/meta/users.kml +64 -0
- data/doc/readme_chunks/appendix.txt +10 -0
- data/doc/readme_chunks/examples.txt +38 -0
- data/doc/readme_chunks/features.txt +148 -0
- data/doc/readme_chunks/getting_help.txt +5 -0
- data/doc/readme_chunks/getting_started.txt +18 -0
- data/doc/readme_chunks/installing.txt +92 -0
- data/doc/readme_chunks/introduction.txt +18 -0
- data/doc/readme_chunks/principles.txt +56 -0
- data/doc/readme_chunks/thanks.txt +59 -0
- data/doc/tutorial/todolist.html +742 -0
- data/doc/tutorial/todolist.mkd +787 -0
- data/examples/app/auth/auth.rb +54 -0
- data/examples/app/auth/template/layout.haml +20 -0
- data/examples/app/auth/template/login.haml +16 -0
- data/examples/app/blog/README +3 -0
- data/examples/app/blog/controller/main.rb +29 -0
- data/examples/app/blog/model/entry.rb +30 -0
- data/examples/app/blog/public/styles/blog.css +132 -0
- data/examples/app/blog/spec/blog.rb +87 -0
- data/examples/app/blog/start.rb +7 -0
- data/examples/app/blog/view/edit.xhtml +17 -0
- data/examples/app/blog/view/index.xhtml +17 -0
- data/examples/app/blog/view/layout.xhtml +11 -0
- data/examples/app/blog/view/new.xhtml +16 -0
- data/examples/app/chat/model/history.rb +36 -0
- data/examples/app/chat/model/message.rb +7 -0
- data/examples/app/chat/public/css/chat.css +13 -0
- data/examples/app/chat/public/js/chat.js +22 -0
- data/examples/app/chat/public/js/jquery.js +3436 -0
- data/examples/app/chat/start.rb +40 -0
- data/examples/app/chat/view/chat.xhtml +9 -0
- data/examples/app/chat/view/index.xhtml +7 -0
- data/examples/app/chat/view/layout.xhtml +13 -0
- data/examples/app/localization/start.rb +35 -0
- data/examples/app/rapaste/Rakefile +34 -0
- data/examples/app/rapaste/controller/paste.rb +101 -0
- data/examples/app/rapaste/model/paste.rb +58 -0
- data/examples/app/rapaste/public/css/active4d.css +114 -0
- data/examples/app/rapaste/public/css/all_hallows_eve.css +72 -0
- data/examples/app/rapaste/public/css/amy.css +147 -0
- data/examples/app/rapaste/public/css/blackboard.css +88 -0
- data/examples/app/rapaste/public/css/brilliance_black.css +605 -0
- data/examples/app/rapaste/public/css/brilliance_dull.css +599 -0
- data/examples/app/rapaste/public/css/cobalt.css +149 -0
- data/examples/app/rapaste/public/css/dawn.css +121 -0
- data/examples/app/rapaste/public/css/display.css +197 -0
- data/examples/app/rapaste/public/css/eiffel.css +121 -0
- data/examples/app/rapaste/public/css/espresso_libre.css +109 -0
- data/examples/app/rapaste/public/css/idle.css +62 -0
- data/examples/app/rapaste/public/css/iplastic.css +80 -0
- data/examples/app/rapaste/public/css/lazy.css +73 -0
- data/examples/app/rapaste/public/css/mac_classic.css +123 -0
- data/examples/app/rapaste/public/css/magicwb_amiga.css +104 -0
- data/examples/app/rapaste/public/css/pastels_on_dark.css +188 -0
- data/examples/app/rapaste/public/css/slush_poppies.css +85 -0
- data/examples/app/rapaste/public/css/spacecadet.css +51 -0
- data/examples/app/rapaste/public/css/sunburst.css +180 -0
- data/examples/app/rapaste/public/css/twilight.css +137 -0
- data/examples/app/rapaste/public/css/zenburnesque.css +91 -0
- data/examples/app/rapaste/public/js/jquery.js +11 -0
- data/examples/app/rapaste/spec/rapaste.rb +51 -0
- data/examples/app/rapaste/start.rb +25 -0
- data/examples/app/rapaste/view/copy.xhtml +10 -0
- data/examples/app/rapaste/view/index.xhtml +9 -0
- data/examples/app/rapaste/view/layout.xhtml +25 -0
- data/examples/app/rapaste/view/list.xhtml +29 -0
- data/examples/app/rapaste/view/search.xhtml +41 -0
- data/examples/app/rapaste/view/view.xhtml +37 -0
- data/examples/app/sourceview/public/coderay.css +104 -0
- data/examples/app/sourceview/public/images/file.gif +0 -0
- data/examples/app/sourceview/public/images/folder.gif +0 -0
- data/examples/app/sourceview/public/images/tv-collapsable-last.gif +0 -0
- data/examples/app/sourceview/public/images/tv-collapsable.gif +0 -0
- data/examples/app/sourceview/public/images/tv-expandable-last.gif +0 -0
- data/examples/app/sourceview/public/images/tv-expandable.gif +0 -0
- data/examples/app/sourceview/public/images/tv-item-last.gif +0 -0
- data/examples/app/sourceview/public/images/tv-item.gif +0 -0
- data/examples/app/sourceview/public/jquery.js +11 -0
- data/examples/app/sourceview/public/jquery.treeview.css +48 -0
- data/examples/app/sourceview/public/jquery.treeview.js +223 -0
- data/examples/app/sourceview/public/sourceview.js +52 -0
- data/examples/app/sourceview/sourceview.rb +77 -0
- data/examples/app/sourceview/template/index.haml +59 -0
- data/examples/app/todolist/README +1 -0
- data/examples/app/todolist/public/favicon.ico +0 -0
- data/examples/app/todolist/public/js/jquery.js +1923 -0
- data/examples/app/todolist/public/ramaze.png +0 -0
- data/examples/app/todolist/spec/todolist.rb +132 -0
- data/examples/app/todolist/src/controller/main.rb +70 -0
- data/examples/app/todolist/src/element/page.rb +31 -0
- data/examples/app/todolist/src/model.rb +14 -0
- data/examples/app/todolist/start.rb +11 -0
- data/examples/app/todolist/template/index.xhtml +17 -0
- data/examples/app/todolist/template/new.xhtml +7 -0
- data/examples/app/upload/start.rb +19 -0
- data/examples/app/upload/view/index.xhtml +25 -0
- data/examples/app/whywiki/spec/whywiki.rb +58 -0
- data/examples/app/whywiki/start.rb +46 -0
- data/examples/app/whywiki/template/edit.xhtml +14 -0
- data/examples/app/whywiki/template/show.xhtml +18 -0
- data/examples/app/wikore/spec/wikore.rb +111 -0
- data/examples/app/wikore/src/controller.rb +80 -0
- data/examples/app/wikore/src/model.rb +53 -0
- data/examples/app/wikore/start.rb +9 -0
- data/examples/app/wikore/template/index.xhtml +8 -0
- data/examples/app/wiktacular/README +2 -0
- data/examples/app/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
- data/examples/app/wiktacular/mkd/link/current.mkd +1 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
- data/examples/app/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
- data/examples/app/wiktacular/mkd/main/current.mkd +2 -0
- data/examples/app/wiktacular/mkd/markdown/current.mkd +3 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
- data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
- data/examples/app/wiktacular/mkd/testing/current.mkd +17 -0
- data/examples/app/wiktacular/public/favicon.ico +0 -0
- data/examples/app/wiktacular/public/screen.css +72 -0
- data/examples/app/wiktacular/spec/wiktacular.rb +157 -0
- data/examples/app/wiktacular/src/controller.rb +55 -0
- data/examples/app/wiktacular/src/model.rb +102 -0
- data/examples/app/wiktacular/start.rb +8 -0
- data/examples/app/wiktacular/template/edit.xhtml +6 -0
- data/examples/app/wiktacular/template/html_layout.xhtml +27 -0
- data/examples/app/wiktacular/template/index.xhtml +9 -0
- data/examples/app/wiktacular/template/new.xhtml +6 -0
- data/examples/basic/element.rb +45 -0
- data/examples/basic/gestalt.rb +27 -0
- data/examples/basic/hello.rb +15 -0
- data/examples/basic/layout.rb +28 -0
- data/examples/basic/linking.rb +29 -0
- data/examples/basic/simple.rb +56 -0
- data/examples/helpers/cache.rb +31 -0
- data/examples/helpers/form_with_sequel.rb +24 -0
- data/examples/helpers/httpdigest.rb +50 -0
- data/examples/helpers/identity.rb +18 -0
- data/examples/helpers/nitro_form.rb +23 -0
- data/examples/helpers/paginate.rb +71 -0
- data/examples/helpers/provide.rb +23 -0
- data/examples/helpers/rest.rb +28 -0
- data/examples/helpers/simple_captcha.rb +29 -0
- data/examples/misc/css.rb +37 -0
- data/examples/misc/facebook.rb +159 -0
- data/examples/misc/memleak_detector.rb +32 -0
- data/examples/misc/nagoro_element.rb +43 -0
- data/examples/misc/ramaise.rb +132 -0
- data/examples/misc/rapp.rb +45 -0
- data/examples/misc/sequel_scaffolding.rb +34 -0
- data/examples/misc/simple_auth.rb +35 -0
- data/examples/templates/template/external.amrita +19 -0
- data/examples/templates/template/external.haml +22 -0
- data/examples/templates/template/external.liquid +28 -0
- data/examples/templates/template/external.mab +30 -0
- data/examples/templates/template/external.nag +28 -0
- data/examples/templates/template/external.redcloth +19 -0
- data/examples/templates/template/external.rem +30 -0
- data/examples/templates/template/external.rhtml +28 -0
- data/examples/templates/template/external.tenjin +28 -0
- data/examples/templates/template/external.xsl +57 -0
- data/examples/templates/template/external.zmr +28 -0
- data/examples/templates/template_amrita2.rb +74 -0
- data/examples/templates/template_erubis.rb +53 -0
- data/examples/templates/template_ezamar.rb +50 -0
- data/examples/templates/template_haml.rb +50 -0
- data/examples/templates/template_liquid.rb +65 -0
- data/examples/templates/template_markaby.rb +58 -0
- data/examples/templates/template_nagoro.rb +51 -0
- data/examples/templates/template_redcloth.rb +59 -0
- data/examples/templates/template_remarkably.rb +55 -0
- data/examples/templates/template_tenjin.rb +53 -0
- data/examples/templates/template_xslt.rb +49 -0
- data/lib/proto/controller/init.rb +10 -0
- data/lib/proto/controller/main.rb +20 -0
- data/lib/proto/model/init.rb +4 -0
- data/lib/proto/public/css/ramaze_error.css +90 -0
- data/lib/proto/public/dispatch.fcgi +11 -0
- data/lib/proto/public/favicon.ico +0 -0
- data/lib/proto/public/js/jquery.js +3549 -0
- data/lib/proto/public/ramaze.png +0 -0
- data/lib/proto/spec/main.rb +25 -0
- data/lib/proto/start.rb +8 -0
- data/lib/proto/start.ru +16 -0
- data/lib/proto/view/error.xhtml +64 -0
- data/lib/proto/view/index.xhtml +34 -0
- data/lib/proto/view/page.xhtml +27 -0
- data/lib/ramaze/action/render.rb +191 -0
- data/lib/ramaze/action.rb +153 -0
- data/lib/ramaze/adapter/base.rb +128 -0
- data/lib/ramaze/adapter/cgi.rb +20 -0
- data/lib/ramaze/adapter/ebb.rb +18 -0
- data/lib/ramaze/adapter/evented_mongrel.rb +7 -0
- data/lib/ramaze/adapter/fake.rb +12 -0
- data/lib/ramaze/adapter/fcgi.rb +18 -0
- data/lib/ramaze/adapter/lsws.rb +19 -0
- data/lib/ramaze/adapter/mongrel.rb +21 -0
- data/lib/ramaze/adapter/scgi.rb +18 -0
- data/lib/ramaze/adapter/swiftiplied_mongrel.rb +7 -0
- data/lib/ramaze/adapter/thin.rb +17 -0
- data/lib/ramaze/adapter/webrick.rb +43 -0
- data/lib/ramaze/adapter.rb +97 -0
- data/lib/ramaze/cache/memcached.rb +69 -0
- data/lib/ramaze/cache/memory.rb +6 -0
- data/lib/ramaze/cache/yaml_store.rb +68 -0
- data/lib/ramaze/cache.rb +113 -0
- data/lib/ramaze/contrib/auto_params/get_args.rb +58 -0
- data/lib/ramaze/contrib/auto_params.rb +135 -0
- data/lib/ramaze/contrib/email.rb +84 -0
- data/lib/ramaze/contrib/facebook/facebook.rb +171 -0
- data/lib/ramaze/contrib/facebook.rb +23 -0
- data/lib/ramaze/contrib/file_cache.rb +65 -0
- data/lib/ramaze/contrib/gems.rb +78 -0
- data/lib/ramaze/contrib/gettext/mo.rb +155 -0
- data/lib/ramaze/contrib/gettext/parser.rb +46 -0
- data/lib/ramaze/contrib/gettext/po.rb +109 -0
- data/lib/ramaze/contrib/gettext.rb +113 -0
- data/lib/ramaze/contrib/gzip_filter.rb +69 -0
- data/lib/ramaze/contrib/maruku_uv.rb +59 -0
- data/lib/ramaze/contrib/profiling.rb +36 -0
- data/lib/ramaze/contrib/rest.rb +17 -0
- data/lib/ramaze/contrib/sequel/create_join.rb +25 -0
- data/lib/ramaze/contrib/sequel/fill.rb +12 -0
- data/lib/ramaze/contrib/sequel/form_field.rb +129 -0
- data/lib/ramaze/contrib/sequel/image.rb +198 -0
- data/lib/ramaze/contrib/sequel/relation.rb +82 -0
- data/lib/ramaze/contrib/sequel_cache.rb +92 -0
- data/lib/ramaze/contrib.rb +82 -0
- data/lib/ramaze/controller/error.rb +46 -0
- data/lib/ramaze/controller/main.rb +2 -0
- data/lib/ramaze/controller/resolve.rb +273 -0
- data/lib/ramaze/controller.rb +280 -0
- data/lib/ramaze/current/request.rb +205 -0
- data/lib/ramaze/current/response.rb +39 -0
- data/lib/ramaze/current/session/flash.rb +87 -0
- data/lib/ramaze/current/session/hash.rb +66 -0
- data/lib/ramaze/current/session.rb +181 -0
- data/lib/ramaze/current.rb +110 -0
- data/lib/ramaze/dispatcher/action.rb +48 -0
- data/lib/ramaze/dispatcher/directory.rb +119 -0
- data/lib/ramaze/dispatcher/error.rb +108 -0
- data/lib/ramaze/dispatcher/file.rb +95 -0
- data/lib/ramaze/dispatcher.rb +145 -0
- data/lib/ramaze/error.rb +24 -0
- data/lib/ramaze/gestalt.rb +124 -0
- data/lib/ramaze/helper/aspect.rb +106 -0
- data/lib/ramaze/helper/auth.rb +125 -0
- data/lib/ramaze/helper/cache.rb +140 -0
- data/lib/ramaze/helper/cgi.rb +39 -0
- data/lib/ramaze/helper/flash.rb +59 -0
- data/lib/ramaze/helper/form.rb +281 -0
- data/lib/ramaze/helper/formatting.rb +158 -0
- data/lib/ramaze/helper/gestalt.rb +15 -0
- data/lib/ramaze/helper/gravatar.rb +15 -0
- data/lib/ramaze/helper/httpdigest.rb +59 -0
- data/lib/ramaze/helper/identity.rb +119 -0
- data/lib/ramaze/helper/link.rb +122 -0
- data/lib/ramaze/helper/markaby.rb +31 -0
- data/lib/ramaze/helper/maruku.rb +7 -0
- data/lib/ramaze/helper/nitroform.rb +14 -0
- data/lib/ramaze/helper/pager.rb +366 -0
- data/lib/ramaze/helper/paginate.rb +234 -0
- data/lib/ramaze/helper/partial.rb +105 -0
- data/lib/ramaze/helper/redirect.rb +82 -0
- data/lib/ramaze/helper/rest.rb +43 -0
- data/lib/ramaze/helper/sendfile.rb +16 -0
- data/lib/ramaze/helper/sequel.rb +55 -0
- data/lib/ramaze/helper/simple_captcha.rb +31 -0
- data/lib/ramaze/helper/stack.rb +77 -0
- data/lib/ramaze/helper/tagz.rb +19 -0
- data/lib/ramaze/helper/thread.rb +17 -0
- data/lib/ramaze/helper/ultraviolet.rb +44 -0
- data/lib/ramaze/helper/user.rb +110 -0
- data/lib/ramaze/helper/xhtml.rb +23 -0
- data/lib/ramaze/helper.rb +79 -0
- data/lib/ramaze/log/analogger.rb +40 -0
- data/lib/ramaze/log/growl.rb +38 -0
- data/lib/ramaze/log/hub.rb +41 -0
- data/lib/ramaze/log/informer.rb +128 -0
- data/lib/ramaze/log/knotify.rb +28 -0
- data/lib/ramaze/log/logger.rb +26 -0
- data/lib/ramaze/log/logging.rb +89 -0
- data/lib/ramaze/log/syslog.rb +51 -0
- data/lib/ramaze/log/xosd.rb +92 -0
- data/lib/ramaze/log.rb +27 -0
- data/lib/ramaze/option/dsl.rb +45 -0
- data/lib/ramaze/option/holder.rb +131 -0
- data/lib/ramaze/option/merger.rb +108 -0
- data/lib/ramaze/option.rb +156 -0
- data/lib/ramaze/reloader.rb +186 -0
- data/lib/ramaze/route.rb +97 -0
- data/lib/ramaze/setup.rb +50 -0
- data/lib/ramaze/snippets/array/put_within.rb +44 -0
- data/lib/ramaze/snippets/binding/locals.rb +25 -0
- data/lib/ramaze/snippets/blankslate.rb +7 -0
- data/lib/ramaze/snippets/dictionary.rb +504 -0
- data/lib/ramaze/snippets/divide.rb +20 -0
- data/lib/ramaze/snippets/fiber.rb +63 -0
- data/lib/ramaze/snippets/kernel/constant.rb +41 -0
- data/lib/ramaze/snippets/kernel/pretty_inspect.rb +21 -0
- data/lib/ramaze/snippets/metaid.rb +17 -0
- data/lib/ramaze/snippets/numeric/filesize_format.rb +32 -0
- data/lib/ramaze/snippets/numeric/time.rb +63 -0
- data/lib/ramaze/snippets/object/__dir__.rb +29 -0
- data/lib/ramaze/snippets/object/acquire.rb +40 -0
- data/lib/ramaze/snippets/object/instance_variable_defined.rb +19 -0
- data/lib/ramaze/snippets/object/pretty.rb +16 -0
- data/lib/ramaze/snippets/object/scope.rb +18 -0
- data/lib/ramaze/snippets/object/traits.rb +76 -0
- data/lib/ramaze/snippets/ordered_set.rb +51 -0
- data/lib/ramaze/snippets/proc/locals.rb +19 -0
- data/lib/ramaze/snippets/ramaze/caller_info.rb +30 -0
- data/lib/ramaze/snippets/ramaze/caller_lines.rb +51 -0
- data/lib/ramaze/snippets/ramaze/deprecated.rb +20 -0
- data/lib/ramaze/snippets/ramaze/fiber.rb +24 -0
- data/lib/ramaze/snippets/ramaze/state.rb +86 -0
- data/lib/ramaze/snippets/ramaze/struct.rb +45 -0
- data/lib/ramaze/snippets/string/camel_case.rb +21 -0
- data/lib/ramaze/snippets/string/color.rb +31 -0
- data/lib/ramaze/snippets/string/each.rb +19 -0
- data/lib/ramaze/snippets/string/end_with.rb +20 -0
- data/lib/ramaze/snippets/string/esc.rb +34 -0
- data/lib/ramaze/snippets/string/ord.rb +21 -0
- data/lib/ramaze/snippets/string/snake_case.rb +21 -0
- data/lib/ramaze/snippets/string/start_with.rb +19 -0
- data/lib/ramaze/snippets/string/unindent.rb +28 -0
- data/lib/ramaze/snippets/thread/into.rb +18 -0
- data/lib/ramaze/snippets.rb +22 -0
- data/lib/ramaze/spec/helper/bacon.rb +7 -0
- data/lib/ramaze/spec/helper/browser.rb +88 -0
- data/lib/ramaze/spec/helper/mock_http.rb +63 -0
- data/lib/ramaze/spec/helper/pretty_output.rb +82 -0
- data/lib/ramaze/spec/helper/requester.rb +63 -0
- data/lib/ramaze/spec/helper/simple_http.rb +434 -0
- data/lib/ramaze/spec/helper/snippets.rb +14 -0
- data/lib/ramaze/spec/helper.rb +135 -0
- data/lib/ramaze/spec.rb +1 -0
- data/lib/ramaze/store/default.rb +109 -0
- data/lib/ramaze/template/amrita2.rb +45 -0
- data/lib/ramaze/template/builder.rb +28 -0
- data/lib/ramaze/template/erubis.rb +41 -0
- data/lib/ramaze/template/ezamar/element.rb +169 -0
- data/lib/ramaze/template/ezamar/engine.rb +76 -0
- data/lib/ramaze/template/ezamar/morpher.rb +135 -0
- data/lib/ramaze/template/ezamar/render_partial.rb +31 -0
- data/lib/ramaze/template/ezamar/textpow.syntax +34 -0
- data/lib/ramaze/template/ezamar.rb +42 -0
- data/lib/ramaze/template/haml.rb +37 -0
- data/lib/ramaze/template/liquid.rb +36 -0
- data/lib/ramaze/template/markaby.rb +52 -0
- data/lib/ramaze/template/maruku.rb +34 -0
- data/lib/ramaze/template/nagoro.rb +52 -0
- data/lib/ramaze/template/none.rb +14 -0
- data/lib/ramaze/template/redcloth.rb +25 -0
- data/lib/ramaze/template/remarkably.rb +38 -0
- data/lib/ramaze/template/sass.rb +37 -0
- data/lib/ramaze/template/tagz.rb +79 -0
- data/lib/ramaze/template/tenjin.rb +74 -0
- data/lib/ramaze/template/xslt.rb +100 -0
- data/lib/ramaze/template.rb +87 -0
- data/lib/ramaze/tool/create.rb +48 -0
- data/lib/ramaze/tool/daemonize.rb +37 -0
- data/lib/ramaze/tool/localize.rb +202 -0
- data/lib/ramaze/tool/mime.rb +35 -0
- data/lib/ramaze/tool/mime_types.yaml +615 -0
- data/lib/ramaze/tool/project_creator.rb +110 -0
- data/lib/ramaze/tool/record.rb +6 -0
- data/lib/ramaze/tool.rb +9 -0
- data/lib/ramaze/trinity.rb +16 -0
- data/lib/ramaze/version.rb +6 -0
- data/lib/ramaze.rb +133 -0
- data/lib/vendor/bacon.rb +323 -0
- data/rake_tasks/conf.rake +71 -0
- data/rake_tasks/coverage.rake +46 -0
- data/rake_tasks/gem.rake +74 -0
- data/rake_tasks/git.rake +41 -0
- data/rake_tasks/maintenance.rake +386 -0
- data/rake_tasks/metric.rake +24 -0
- data/rake_tasks/release.rake +76 -0
- data/rake_tasks/spec.rake +61 -0
- data/ramaze.gemspec +773 -0
- data/spec/contrib/auto_params.rb +121 -0
- data/spec/contrib/profiling.rb +29 -0
- data/spec/contrib/sequel/fill.rb +47 -0
- data/spec/examples/caching.rb +19 -0
- data/spec/examples/css.rb +15 -0
- data/spec/examples/element.rb +15 -0
- data/spec/examples/hello.rb +11 -0
- data/spec/examples/linking.rb +18 -0
- data/spec/examples/simple.rb +45 -0
- data/spec/examples/simple_auth.rb +32 -0
- data/spec/examples/templates/template_amrita2.rb +16 -0
- data/spec/examples/templates/template_erubis.rb +23 -0
- data/spec/examples/templates/template_ezamar.rb +23 -0
- data/spec/examples/templates/template_haml.rb +23 -0
- data/spec/examples/templates/template_liquid.rb +29 -0
- data/spec/examples/templates/template_markaby.rb +23 -0
- data/spec/examples/templates/template_redcloth.rb +28 -0
- data/spec/examples/templates/template_remarkably.rb +23 -0
- data/spec/examples/templates/template_tenjin.rb +28 -0
- data/spec/helper.rb +3 -0
- data/spec/ramaze/action/basics.rb +36 -0
- data/spec/ramaze/action/cache.rb +87 -0
- data/spec/ramaze/action/file_cache.rb +70 -0
- data/spec/ramaze/action/layout.rb +190 -0
- data/spec/ramaze/action/render.rb +31 -0
- data/spec/ramaze/action/view/bar.xhtml +1 -0
- data/spec/ramaze/action/view/instancevars/layout.xhtml +1 -0
- data/spec/ramaze/action/view/other_wrapper.xhtml +1 -0
- data/spec/ramaze/action/view/single_wrapper.xhtml +1 -0
- data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
- data/spec/ramaze/adapter/ebb.rb +12 -0
- data/spec/ramaze/adapter/mongrel.rb +12 -0
- data/spec/ramaze/adapter/record.rb +31 -0
- data/spec/ramaze/adapter/webrick.rb +12 -0
- data/spec/ramaze/adapter.rb +49 -0
- data/spec/ramaze/cache.rb +140 -0
- data/spec/ramaze/controller/actionless_templates.rb +32 -0
- data/spec/ramaze/controller/resolve.rb +32 -0
- data/spec/ramaze/controller/subclass.rb +36 -0
- data/spec/ramaze/controller/template_resolving.rb +113 -0
- data/spec/ramaze/controller/view/bar.xhtml +1 -0
- data/spec/ramaze/controller/view/base/another.xhtml +1 -0
- data/spec/ramaze/controller/view/greet.xhtml +1 -0
- data/spec/ramaze/controller/view/list.xhtml +1 -0
- data/spec/ramaze/controller/view/other/greet/other.xhtml +1 -0
- data/spec/ramaze/controller/view/other_wrapper.xhtml +1 -0
- data/spec/ramaze/controller.rb +180 -0
- data/spec/ramaze/current/request.rb +30 -0
- data/spec/ramaze/current/session.rb +97 -0
- data/spec/ramaze/dispatcher/directory.rb +55 -0
- data/spec/ramaze/dispatcher/file.rb +60 -0
- data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
- data/spec/ramaze/dispatcher/public/file name.txt +1 -0
- data/spec/ramaze/dispatcher/public/test_download.css +141 -0
- data/spec/ramaze/dispatcher.rb +31 -0
- data/spec/ramaze/element.rb +107 -0
- data/spec/ramaze/error.rb +94 -0
- data/spec/ramaze/gestalt.rb +131 -0
- data/spec/ramaze/helper/aspect.rb +101 -0
- data/spec/ramaze/helper/auth.rb +66 -0
- data/spec/ramaze/helper/cache.rb +160 -0
- data/spec/ramaze/helper/cgi.rb +43 -0
- data/spec/ramaze/helper/file.rb +18 -0
- data/spec/ramaze/helper/flash.rb +133 -0
- data/spec/ramaze/helper/form.rb +118 -0
- data/spec/ramaze/helper/formatting.rb +54 -0
- data/spec/ramaze/helper/link.rb +124 -0
- data/spec/ramaze/helper/pager.rb +99 -0
- data/spec/ramaze/helper/partial.rb +88 -0
- data/spec/ramaze/helper/redirect.rb +112 -0
- data/spec/ramaze/helper/simple_captcha.rb +22 -0
- data/spec/ramaze/helper/stack.rb +73 -0
- data/spec/ramaze/helper/user.rb +43 -0
- data/spec/ramaze/helper/view/locals.xhtml +1 -0
- data/spec/ramaze/helper/view/loop.xhtml +4 -0
- data/spec/ramaze/helper/view/num.xhtml +1 -0
- data/spec/ramaze/helper/view/partial.xhtml +1 -0
- data/spec/ramaze/helper/view/recursive.xhtml +8 -0
- data/spec/ramaze/helper/view/recursive_local_ivars.xhtml +7 -0
- data/spec/ramaze/helper/view/recursive_locals.xhtml +7 -0
- data/spec/ramaze/helper/view/test_template.xhtml +1 -0
- data/spec/ramaze/localize.rb +89 -0
- data/spec/ramaze/log/informer.rb +72 -0
- data/spec/ramaze/log/syslog.rb +73 -0
- data/spec/ramaze/morpher.rb +111 -0
- data/spec/ramaze/params.rb +157 -0
- data/spec/ramaze/public/error404.xhtml +1 -0
- data/spec/ramaze/public/favicon.ico +0 -0
- data/spec/ramaze/public/ramaze.png +0 -0
- data/spec/ramaze/public/test_download.css +141 -0
- data/spec/ramaze/request/ebb.rb +9 -0
- data/spec/ramaze/request/mongrel.rb +9 -0
- data/spec/ramaze/request/thin.rb +9 -0
- data/spec/ramaze/request/webrick.rb +5 -0
- data/spec/ramaze/request.rb +185 -0
- data/spec/ramaze/rewrite/file.css +1 -0
- data/spec/ramaze/rewrite.rb +36 -0
- data/spec/ramaze/route.rb +131 -0
- data/spec/ramaze/session.rb +94 -0
- data/spec/ramaze/store/default.rb +71 -0
- data/spec/ramaze/struct.rb +47 -0
- data/spec/ramaze/template/amrita2/external.amrita +6 -0
- data/spec/ramaze/template/amrita2/sum.amrita +1 -0
- data/spec/ramaze/template/amrita2.rb +50 -0
- data/spec/ramaze/template/builder/external.rxml +3 -0
- data/spec/ramaze/template/builder.rb +51 -0
- data/spec/ramaze/template/erubis/sum.rhtml +1 -0
- data/spec/ramaze/template/erubis.rb +41 -0
- data/spec/ramaze/template/ezamar/another/long/action.zmr +1 -0
- data/spec/ramaze/template/ezamar/combined.zmr +1 -0
- data/spec/ramaze/template/ezamar/file_only.zmr +1 -0
- data/spec/ramaze/template/ezamar/index.zmr +1 -0
- data/spec/ramaze/template/ezamar/nested.zmr +1 -0
- data/spec/ramaze/template/ezamar/other__index.xhtml +1 -0
- data/spec/ramaze/template/ezamar/some__long__action.zmr +1 -0
- data/spec/ramaze/template/ezamar/sum.zmr +1 -0
- data/spec/ramaze/template/ezamar.rb +63 -0
- data/spec/ramaze/template/haml/index.haml +5 -0
- data/spec/ramaze/template/haml/locals.haml +2 -0
- data/spec/ramaze/template/haml/with_vars.haml +4 -0
- data/spec/ramaze/template/haml.rb +66 -0
- data/spec/ramaze/template/liquid/index.liquid +1 -0
- data/spec/ramaze/template/liquid/products.liquid +45 -0
- data/spec/ramaze/template/liquid.rb +99 -0
- data/spec/ramaze/template/markaby/external.mab +8 -0
- data/spec/ramaze/template/markaby/sum.mab +1 -0
- data/spec/ramaze/template/markaby.rb +61 -0
- data/spec/ramaze/template/nagoro/another/long/action.nag +1 -0
- data/spec/ramaze/template/nagoro/combined.nag +1 -0
- data/spec/ramaze/template/nagoro/file_only.nag +1 -0
- data/spec/ramaze/template/nagoro/index.nag +1 -0
- data/spec/ramaze/template/nagoro/nested.nag +1 -0
- data/spec/ramaze/template/nagoro/some__long__action.nag +1 -0
- data/spec/ramaze/template/nagoro/sum.nag +1 -0
- data/spec/ramaze/template/nagoro.rb +64 -0
- data/spec/ramaze/template/ramaze/external.test +1 -0
- data/spec/ramaze/template/redcloth/external.redcloth +1 -0
- data/spec/ramaze/template/redcloth.rb +38 -0
- data/spec/ramaze/template/remarkably/external.rem +8 -0
- data/spec/ramaze/template/remarkably/sum.rem +1 -0
- data/spec/ramaze/template/remarkably.rb +58 -0
- data/spec/ramaze/template/sass/file.css.sass +5 -0
- data/spec/ramaze/template/sass.rb +69 -0
- data/spec/ramaze/template/tagz/external.tagz +8 -0
- data/spec/ramaze/template/tagz/sum.tagz +1 -0
- data/spec/ramaze/template/tagz.rb +62 -0
- data/spec/ramaze/template/tenjin/external.tenjin +1 -0
- data/spec/ramaze/template/tenjin.rb +47 -0
- data/spec/ramaze/template/xslt/concat_words.xsl +16 -0
- data/spec/ramaze/template/xslt/index.xsl +14 -0
- data/spec/ramaze/template/xslt/products.xsl +32 -0
- data/spec/ramaze/template/xslt/ruby_version.xsl +14 -0
- data/spec/ramaze/template/xslt.rb +90 -0
- data/spec/ramaze/template.rb +128 -0
- data/spec/snippets/array/put_within.rb +33 -0
- data/spec/snippets/binding/locals.rb +9 -0
- data/spec/snippets/divide.rb +19 -0
- data/spec/snippets/kernel/constant.rb +23 -0
- data/spec/snippets/numeric/filesize_format.rb +12 -0
- data/spec/snippets/numeric/time.rb +12 -0
- data/spec/snippets/object/__dir__.rb +8 -0
- data/spec/snippets/object/acquire.rb +71 -0
- data/spec/snippets/ordered_set.rb +63 -0
- data/spec/snippets/ramaze/caller_info.rb +39 -0
- data/spec/snippets/ramaze/caller_lines.rb +30 -0
- data/spec/snippets/string/camel_case.rb +25 -0
- data/spec/snippets/string/color.rb +11 -0
- data/spec/snippets/string/snake_case.rb +24 -0
- data/spec/snippets/string/unindent.rb +43 -0
- data/spec/snippets/thread/into.rb +20 -0
- metadata +823 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
module Ramaze
|
5
|
+
class Dispatcher
|
6
|
+
|
7
|
+
# This dispatcher is responsible for relaying requests to Controller::handle
|
8
|
+
# and filtering the results using FILTER.
|
9
|
+
|
10
|
+
class Action
|
11
|
+
|
12
|
+
# The response is passed to each filter by sending .call(response) to it.
|
13
|
+
|
14
|
+
FILTER = OrderedSet[
|
15
|
+
# Ramaze::Tool::Localize,
|
16
|
+
] unless defined?(FILTER)
|
17
|
+
|
18
|
+
class << self
|
19
|
+
include Trinity
|
20
|
+
|
21
|
+
# Takes path, asks Controller to handle it and builds a response on
|
22
|
+
# success. The response is then passed to each member of FILTER for
|
23
|
+
# post-processing.
|
24
|
+
|
25
|
+
def call(path)
|
26
|
+
log(path)
|
27
|
+
|
28
|
+
catch(:respond) {
|
29
|
+
response.write Controller.handle(path)
|
30
|
+
}
|
31
|
+
|
32
|
+
FILTER.each{|f| f.call(response)}
|
33
|
+
response
|
34
|
+
rescue Ramaze::Error => ex
|
35
|
+
ex
|
36
|
+
end
|
37
|
+
|
38
|
+
def log(path)
|
39
|
+
case path
|
40
|
+
when *Global.boring
|
41
|
+
else
|
42
|
+
Log.info("Dynamic request from #{request.ip}: #{request.request_uri}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
module Ramaze
|
5
|
+
class Dispatcher
|
6
|
+
|
7
|
+
# Generates a directory listing, see Ramaze::Controller::Directory for more
|
8
|
+
# information and how to create your own directory listing page
|
9
|
+
class Directory
|
10
|
+
class << self
|
11
|
+
|
12
|
+
# Entry point from Dispatcher::filter.
|
13
|
+
# Just a forwarder to build_listing, automatticly exiting if there is
|
14
|
+
# an error (defined by returning false in build_listing)
|
15
|
+
def call(path)
|
16
|
+
if Global.list_directories
|
17
|
+
response = build_listing(path)
|
18
|
+
Response.current.build(*response) if response
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Makes a request for http://yourserver/dirlist/path and returns the
|
23
|
+
# result. Due to this method, you can overwrite the action and create your
|
24
|
+
# own page. See Ramaze::Controller::Directory for more.
|
25
|
+
def build_listing(path)
|
26
|
+
dir = ::File.expand_path(Global.public_root/::File.expand_path(path, '/'))
|
27
|
+
|
28
|
+
if ::File.directory?(dir)
|
29
|
+
Log.debug("Serving directory listing: #{dir}")
|
30
|
+
Session.current.drop! if Session.current
|
31
|
+
|
32
|
+
status = Ramaze::STATUS_CODE['OK']
|
33
|
+
header = {'Content-Type' => "text/html"}
|
34
|
+
body = list_for(dir)
|
35
|
+
[body, status, header]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Nicely formatted listing for given path, template is "stolen" from
|
40
|
+
# lighttpd
|
41
|
+
def list_for(path)
|
42
|
+
root = ::File.expand_path(Global.public_root)
|
43
|
+
display = path.gsub(/^#{Regexp.escape(root)}\/?/, '/')
|
44
|
+
wrapper =
|
45
|
+
%(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
46
|
+
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
47
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
48
|
+
<head>
|
49
|
+
<title>Directory listing of #{display}</title>
|
50
|
+
|
51
|
+
<style type="text/css"> /*<![CDATA[*/ a, a:active {text-decoration: none; color: blue;} a:visited {color: #48468F;} a:hover, a:focus {text-decoration: underline; color: red;} body {background-color: #F5F5F5;} h2 {margin-bottom: 12px;} table {margin-left: 12px;} th, td { font-family: "Courier New", Courier, monospace; font-size: 10pt; text-align: left;} th { font-weight: bold; padding-right: 14px; padding-bottom: 3px;} td {padding-right: 14px;} td.s, th.s {text-align: right;} div.list { background-color: white; border-top: 1px solid #646464; border-bottom: 1px solid #646464; padding-top: 10px; padding-bottom: 14px;} div.foot { font-family: "Courier New", Courier, monospace; font-size: 10pt; color: #787878; padding-top: 4px;} /*]]>*/ </style>
|
52
|
+
</head>
|
53
|
+
<body>
|
54
|
+
<h2>Directory listing of #{display}</h2>
|
55
|
+
<div class="list">
|
56
|
+
<table summary="Directory Listing" cellpadding="0" cellspacing="0">
|
57
|
+
<thead>
|
58
|
+
<tr>
|
59
|
+
<th class="n">Name</th>
|
60
|
+
<th class="m">Last Modified</th>
|
61
|
+
<th class="s">Size</th>
|
62
|
+
<th class="t">Type</th>
|
63
|
+
</tr>
|
64
|
+
</thead>
|
65
|
+
<tbody>
|
66
|
+
<tr>
|
67
|
+
<td class="n"><a href="#{display/'..'}/">Parent Directory</a>/</td>
|
68
|
+
<td class="m"> </td>
|
69
|
+
<td class="s">- </td>
|
70
|
+
<td class="t">Directory</td>
|
71
|
+
</tr>
|
72
|
+
%s
|
73
|
+
%s
|
74
|
+
</tbody>
|
75
|
+
</table>
|
76
|
+
</div>
|
77
|
+
<div class="foot">%s</div>
|
78
|
+
</body>
|
79
|
+
</html>
|
80
|
+
)
|
81
|
+
|
82
|
+
dirs, files = Dir[path/'*'].partition{|file| ::File.directory?(file) }
|
83
|
+
dir_body, file_body = [], []
|
84
|
+
|
85
|
+
dirs.sort.each do |dir|
|
86
|
+
basename = ::File.basename(dir)
|
87
|
+
dir_body << %[<tr>
|
88
|
+
<td class="n"><a href="#{display/basename}">#{basename}/</a></td>
|
89
|
+
<td class="m"> </td>
|
90
|
+
<td class="s">- </td>
|
91
|
+
<td class="t">Directory</td>
|
92
|
+
</tr>]
|
93
|
+
end
|
94
|
+
|
95
|
+
time_format = "%Y-%b-%d %H:%M:%S"
|
96
|
+
files.sort.each do |file|
|
97
|
+
basename = ::File.basename(file)
|
98
|
+
time = ::File.mtime(file).strftime(time_format)
|
99
|
+
size = ::File.size(file).filesize_format
|
100
|
+
mime = Tool::MIME.type_for(file)
|
101
|
+
file_body << %[<tr>
|
102
|
+
<td class="n"><a href="#{display/basename}">#{basename}</a></td>
|
103
|
+
<td class="m">#{time}</td>
|
104
|
+
<td class="s">#{size}</td>
|
105
|
+
<td class="t">#{mime}</td>
|
106
|
+
</tr>]
|
107
|
+
end
|
108
|
+
|
109
|
+
version = "ramaze/#{Ramaze::VERSION}"
|
110
|
+
wrapper % [
|
111
|
+
dir_body. join("\n "),
|
112
|
+
file_body.join("\n "),
|
113
|
+
version
|
114
|
+
]
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
module Ramaze
|
5
|
+
class Dispatcher
|
6
|
+
|
7
|
+
# Last resort dispatcher, tries to recover as much information as possible
|
8
|
+
# from the past request and takes the appropiate actions.
|
9
|
+
#
|
10
|
+
# You can configure it over the HANDLE_ERROR constant or by defining error
|
11
|
+
# actions in your controllers.
|
12
|
+
|
13
|
+
class Error
|
14
|
+
|
15
|
+
# The class of exception is matched when an error occurs and the status
|
16
|
+
# code is set. The absolute URLs are used as fallback in case of a total
|
17
|
+
# failure.
|
18
|
+
HANDLE_ERROR = {
|
19
|
+
Exception => [ 500, '/error' ],
|
20
|
+
Ramaze::Error::NoAction => [ 404, '/error' ],
|
21
|
+
Ramaze::Error::NoController => [ 404, '/error' ],
|
22
|
+
}
|
23
|
+
|
24
|
+
class << self
|
25
|
+
trait :last_error => nil
|
26
|
+
|
27
|
+
# Takes exception, of metainfo only :controller is used at the moment.
|
28
|
+
# Then goes on to try and find the correct response status and path.
|
29
|
+
# In case metainfo has a controller we try to get the action for the
|
30
|
+
# path on it, dispatching there if we find one.
|
31
|
+
# Otherwise a plain-text error message is set as response.
|
32
|
+
def call(error, metainfo = {})
|
33
|
+
log_error(error)
|
34
|
+
|
35
|
+
STATE[:exception] = error
|
36
|
+
response = Response.current
|
37
|
+
|
38
|
+
key = error.class.ancestors.find{|a| HANDLE_ERROR[a]}
|
39
|
+
status, path = *HANDLE_ERROR[key || Exception]
|
40
|
+
status ||= 500
|
41
|
+
|
42
|
+
if controller = metainfo[:controller]
|
43
|
+
newpath = (controller.mapping + path).squeeze('/')
|
44
|
+
action_response = Dispatcher::Action.call(newpath)
|
45
|
+
case action_response
|
46
|
+
when Ramaze::Error
|
47
|
+
Log.debug("No custom error page found on #{controller}, going to #{path}")
|
48
|
+
else
|
49
|
+
action_response.status = status
|
50
|
+
return action_response
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
if path and error.message !~ /`#{path}'/
|
55
|
+
response.status = status
|
56
|
+
return Dispatcher.dispatch_to(path)
|
57
|
+
else
|
58
|
+
response.build(error.message, status)
|
59
|
+
end
|
60
|
+
rescue Object => ex
|
61
|
+
Log.error(ex)
|
62
|
+
begin
|
63
|
+
m = ex.message
|
64
|
+
c = ex.class
|
65
|
+
b = [ex.backtrace].flatten.join("\n")
|
66
|
+
body = <<-html
|
67
|
+
==== Error ====\n
|
68
|
+
#{ m } (#{ c })
|
69
|
+
#{ b }\n
|
70
|
+
==== Request ====\n
|
71
|
+
#{ Request.current.pretty }\n
|
72
|
+
==== Request ====\n
|
73
|
+
#{ Response.current.pretty }\n
|
74
|
+
==== Session ====\n
|
75
|
+
#{ Session.current.pretty }\n
|
76
|
+
==== Global ====\n
|
77
|
+
#{ Global.pretty }\n
|
78
|
+
html
|
79
|
+
response['Content-Type'] = 'text/plain'
|
80
|
+
response.build(body.unindent, status)
|
81
|
+
rescue Object
|
82
|
+
raise
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Only logs new errors with full backtrace, repeated errors are shown
|
87
|
+
# only with their message.
|
88
|
+
def log_error error
|
89
|
+
error_message = error.message
|
90
|
+
|
91
|
+
if trait[:last_error] == error_message or error.is_a? Ramaze::Error::NoAction
|
92
|
+
Log.error(error_message)
|
93
|
+
else
|
94
|
+
trait[:last_error] = error_message
|
95
|
+
Log.error(error)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Handle to current exception.
|
100
|
+
# Only works inside request/response cycle.
|
101
|
+
def current
|
102
|
+
STATE[:exception]
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
require "time"
|
5
|
+
require 'digest/md5'
|
6
|
+
|
7
|
+
module Ramaze
|
8
|
+
class Dispatcher
|
9
|
+
|
10
|
+
# First of the dispatchers, looks up the public path and serves the
|
11
|
+
# file if found.
|
12
|
+
|
13
|
+
class File
|
14
|
+
# These names are checked for serving from public directory.
|
15
|
+
# They take priority over Actions which comes later in the FILTER
|
16
|
+
INDICES = %w[index.htm index.xhtml index.html index]
|
17
|
+
|
18
|
+
class << self
|
19
|
+
include Trinity
|
20
|
+
|
21
|
+
# Entry point from Dispatcher::filter.
|
22
|
+
# searches for the file and builds a response with status 200 if found.
|
23
|
+
|
24
|
+
def call(path)
|
25
|
+
return unless file = open_file(Rack::Utils.unescape(path))
|
26
|
+
Session.current.drop! if Session.current
|
27
|
+
if file == :NotModified
|
28
|
+
return response.build([], STATUS_CODE['Not Modified'])
|
29
|
+
end
|
30
|
+
response.build(file, STATUS_CODE['OK'])
|
31
|
+
end
|
32
|
+
|
33
|
+
# returns file-handle with the open file on success, setting the
|
34
|
+
# Content-Type as found in Tool::MIME
|
35
|
+
|
36
|
+
def open_file(path)
|
37
|
+
file = resolve_path(path)
|
38
|
+
|
39
|
+
if ::File.file?(file)
|
40
|
+
return unless in_public?(file)
|
41
|
+
response['Content-Type'] = Tool::MIME.type_for(file) unless ::File.extname(file).empty?
|
42
|
+
mtime = ::File.mtime(file)
|
43
|
+
response['Last-Modified'] = mtime.httpdate
|
44
|
+
response['ETag']= Digest::MD5.hexdigest(file+mtime.to_s).inspect
|
45
|
+
if modified_since = request.env['HTTP_IF_MODIFIED_SINCE']
|
46
|
+
return :NotModified unless Time.parse(modified_since) < mtime
|
47
|
+
elsif match = request.env['HTTP_IF_NONE_MATCH']
|
48
|
+
# Should be a unique string enclosed in ""
|
49
|
+
# To avoiding more file reading we use mtime and filepath
|
50
|
+
# we could throw in inode and size for more uniqueness
|
51
|
+
return :NotModified if response['ETag']==match
|
52
|
+
end
|
53
|
+
log(file)
|
54
|
+
::File.open(file, 'rb')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# If path matches a directory in public_root, return that directory path, unless
|
59
|
+
# there is an index file in that directory, in which case return path for that.
|
60
|
+
# If path is not a directory, simply return given path in public_root.
|
61
|
+
# Either way, the returned path always starts with public_root.
|
62
|
+
|
63
|
+
def resolve_path(path)
|
64
|
+
joined = ::File.join(Global.public_root, path)
|
65
|
+
|
66
|
+
if ::File.directory?(joined)
|
67
|
+
Dir[joined/"{#{INDICES.join(',')}}"].first || joined
|
68
|
+
else
|
69
|
+
joined
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Determine whether a path is in the public directory for better
|
74
|
+
# security.
|
75
|
+
def in_public?(path)
|
76
|
+
expand(path).start_with?(expand(Global.public_root))
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def expand(path)
|
82
|
+
::File.expand_path(path)
|
83
|
+
end
|
84
|
+
|
85
|
+
def log(file)
|
86
|
+
case file
|
87
|
+
when *Global.boring
|
88
|
+
else
|
89
|
+
Log.debug("Serving static: #{file}")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
require 'ramaze/error'
|
5
|
+
require 'ramaze/tool/mime'
|
6
|
+
|
7
|
+
require 'ramaze/dispatcher/action'
|
8
|
+
require 'ramaze/dispatcher/error'
|
9
|
+
require 'ramaze/dispatcher/file'
|
10
|
+
require 'ramaze/dispatcher/directory'
|
11
|
+
|
12
|
+
module Ramaze
|
13
|
+
|
14
|
+
# The Dispatcher receives requests from adapters and sets up the proper environment
|
15
|
+
# to process them and respond.
|
16
|
+
|
17
|
+
class Dispatcher
|
18
|
+
def initialize(*args)
|
19
|
+
Dispatcher.call(*args)
|
20
|
+
end
|
21
|
+
|
22
|
+
# requests are passed to every
|
23
|
+
FILTER = OrderedSet[ Dispatcher::File, Dispatcher::Action ]
|
24
|
+
|
25
|
+
# Response codes to cache the output of for repeated requests.
|
26
|
+
trait :shielded => [ STATUS_CODE["Not Found"] ]
|
27
|
+
|
28
|
+
class << self
|
29
|
+
include Trinity
|
30
|
+
|
31
|
+
# Entry point for Adapter#respond, takes a Rack::Request and
|
32
|
+
# Rack::Response, sets up the environment and the goes on to dispatch
|
33
|
+
# for the given path from rack_request.
|
34
|
+
#
|
35
|
+
# +env+ will be ignored, it's just for compatibility with rack middleware
|
36
|
+
def call(env = nil)
|
37
|
+
path = request.path_info.squeeze('/')
|
38
|
+
path.sub!(/^#{Regexp.escape(Global.prefix)}/, '/')
|
39
|
+
path.squeeze!('/')
|
40
|
+
|
41
|
+
if new_path = Rewrite.resolve(path)
|
42
|
+
path = new_path
|
43
|
+
Log.dev("Rewriting `#{path}' to `#{path}'")
|
44
|
+
end
|
45
|
+
|
46
|
+
case path
|
47
|
+
when *Global.ignore
|
48
|
+
unless ::File.exist?(Dispatcher::File.resolve_path(path))
|
49
|
+
return response.build(Global.ignore_body, Global.ignore_status)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
general_dispatch path
|
54
|
+
rescue Object => exception
|
55
|
+
error(exception)
|
56
|
+
end
|
57
|
+
alias handle call
|
58
|
+
|
59
|
+
# protects against recursive dispatch and reassigns the path_info in the
|
60
|
+
# request, the rest of the request is kept intact.
|
61
|
+
def dispatch_to(path)
|
62
|
+
if request.path_info == path
|
63
|
+
if error = STATE[:exception]
|
64
|
+
raise error
|
65
|
+
else
|
66
|
+
raise "Recursive redirect from #{path} to #{path}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
request.path_info = path
|
70
|
+
general_dispatch path
|
71
|
+
end
|
72
|
+
|
73
|
+
# splits up the dispatch based on Global.shield
|
74
|
+
def general_dispatch(path)
|
75
|
+
if Global.shield
|
76
|
+
shielded_dispatch path
|
77
|
+
else
|
78
|
+
dispatch path
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Protects somewhat against hammering of erroring paths, since error-pages
|
83
|
+
# take a while to build in the default mode it is possible to decrease
|
84
|
+
# overall speed quite a bit by hitting Ramaze with such paths.
|
85
|
+
# shielded_dispatch checks the path and caches erronous responses so they
|
86
|
+
# won't be recreated but simply pushed out again without stopping at the
|
87
|
+
# Controller.
|
88
|
+
# Please note that this is just minor protection and the best option is to
|
89
|
+
# create a performant error-page instead.
|
90
|
+
def shielded_dispatch(path)
|
91
|
+
shield_cache = Cache.shield
|
92
|
+
handled = shield_cache[path]
|
93
|
+
return handled if handled
|
94
|
+
|
95
|
+
dispatched = dispatch(path)
|
96
|
+
|
97
|
+
unless trait[:shielded].include?(dispatched.status)
|
98
|
+
dispatched
|
99
|
+
else
|
100
|
+
shield_cache[path] = dispatched
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# filters the path until a response or redirect is thrown or a filter is
|
105
|
+
# successful, builds a response from the returned hash in case of throws.
|
106
|
+
def dispatch(path)
|
107
|
+
catch(:respond){
|
108
|
+
redirected = catch(:redirect){
|
109
|
+
filter(path)
|
110
|
+
throw(:respond)
|
111
|
+
}
|
112
|
+
response.build(*redirected)
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
# Calls .call(path) on every object in Dispatcher::FILTER until one
|
117
|
+
# returns something else than false/nil.
|
118
|
+
|
119
|
+
def filter(path)
|
120
|
+
result = nil
|
121
|
+
FILTER.each do |dispatcher|
|
122
|
+
result = dispatcher.call(path)
|
123
|
+
return result if result and not result.respond_to?(:exception)
|
124
|
+
end
|
125
|
+
|
126
|
+
error(result, :path => path)
|
127
|
+
end
|
128
|
+
|
129
|
+
def error(obj, meta = {})
|
130
|
+
controller = STATE[:controller]
|
131
|
+
meta[:controller] ||= controller if controller
|
132
|
+
|
133
|
+
if Global.error_page
|
134
|
+
Dispatcher::Error.call(obj, meta)
|
135
|
+
else
|
136
|
+
message = "No action for '#{meta[:path]}'"
|
137
|
+
message << " on '#{Rack::Utils.escape_html(controller)}'" if controller
|
138
|
+
|
139
|
+
raise(obj) if obj.respond_to?(:message)
|
140
|
+
raise(Ramaze::Error, message)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
data/lib/ramaze/error.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
module Ramaze
|
5
|
+
|
6
|
+
# The general Namespace for Ramazes Errorclasses
|
7
|
+
|
8
|
+
class Error < StandardError
|
9
|
+
# No action found on Controller
|
10
|
+
class NoAction < Error; end
|
11
|
+
|
12
|
+
# No Controller found for request
|
13
|
+
class NoFilter < Error; end
|
14
|
+
|
15
|
+
# No Controller found for request
|
16
|
+
class NoController < Error; end
|
17
|
+
|
18
|
+
# Wrong parameter count for action
|
19
|
+
class WrongParameterCount < Error; end
|
20
|
+
|
21
|
+
# Error while transformation in template
|
22
|
+
class Template < Error; end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
=begin rdoc
|
5
|
+
Example:
|
6
|
+
|
7
|
+
require 'ramaze'
|
8
|
+
require 'ramaze/gestalt'
|
9
|
+
|
10
|
+
page = Ramaze::Gestalt.build{
|
11
|
+
title = 'Hello, World!'
|
12
|
+
|
13
|
+
html do
|
14
|
+
head{ title(title) }
|
15
|
+
body do
|
16
|
+
h1(title)
|
17
|
+
p 'I count to 10'
|
18
|
+
('1'..'10').each do |count|
|
19
|
+
div(:style => 'width: 25px; height: 25px'){ count }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
}
|
24
|
+
=end
|
25
|
+
|
26
|
+
module Ramaze
|
27
|
+
|
28
|
+
# Gestalt is the custom HTML/XML builder for Ramaze, based on a very simple
|
29
|
+
# DSL it will build your markup.
|
30
|
+
|
31
|
+
class Gestalt
|
32
|
+
attr_accessor :out
|
33
|
+
|
34
|
+
# The default way to start building your markup.
|
35
|
+
# Takes a block and returns the markup.
|
36
|
+
#
|
37
|
+
# Example:
|
38
|
+
# html =
|
39
|
+
# Gestalt.build do
|
40
|
+
# html do
|
41
|
+
# head do
|
42
|
+
# title "Hello, World!"
|
43
|
+
# end
|
44
|
+
# body do
|
45
|
+
# h1 "Hello, World!"
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
|
51
|
+
def self.build(&block)
|
52
|
+
self.new(&block).to_s
|
53
|
+
end
|
54
|
+
|
55
|
+
# Gestalt.new is like ::build but will return itself.
|
56
|
+
# you can either access #out or .to_s it, which will
|
57
|
+
# return the actual markup.
|
58
|
+
#
|
59
|
+
# Useful for distributed building of one page.
|
60
|
+
|
61
|
+
def initialize(&block)
|
62
|
+
@out = []
|
63
|
+
instance_eval(&block) if block_given?
|
64
|
+
end
|
65
|
+
|
66
|
+
# catching all the tags. passing it to _gestalt_build_tag
|
67
|
+
|
68
|
+
def method_missing(meth, *args, &block)
|
69
|
+
_gestalt_call_tag meth, args, &block
|
70
|
+
end
|
71
|
+
|
72
|
+
# workaround for Kernel#p to make <p /> tags possible.
|
73
|
+
|
74
|
+
def p(*args, &block)
|
75
|
+
_gestalt_call_tag :p, args, &block
|
76
|
+
end
|
77
|
+
|
78
|
+
def _gestalt_call_tag(name, args, &block)
|
79
|
+
if args.size == 1 and args[0].kind_of? Hash
|
80
|
+
# args are just attributes, children in block...
|
81
|
+
_gestalt_build_tag name, args[0], &block
|
82
|
+
else
|
83
|
+
# no attributes, but text
|
84
|
+
_gestalt_build_tag name, {}, args, &block
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# build a tag for `name`, using `args` and an optional block that
|
89
|
+
# will be yielded
|
90
|
+
|
91
|
+
def _gestalt_build_tag(name, attr = {}, text = [])
|
92
|
+
@out << "<#{name}"
|
93
|
+
@out << attr.map{|k,v| %[ #{k}="#{_gestalt_escape_entities(v)}"] }.join
|
94
|
+
if text != [] or block_given?
|
95
|
+
@out << ">"
|
96
|
+
@out << _gestalt_escape_entities([text].join)
|
97
|
+
if block_given?
|
98
|
+
text = yield
|
99
|
+
@out << text.to_str if text != @out and text.respond_to?(:to_str)
|
100
|
+
end
|
101
|
+
@out << "</#{name}>"
|
102
|
+
else
|
103
|
+
@out << ' />'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def _gestalt_escape_entities(s)
|
108
|
+
s.to_s.gsub(/&/, '&').
|
109
|
+
gsub(/"/, '"').
|
110
|
+
gsub(/'/, ''').
|
111
|
+
gsub(/</, '<').
|
112
|
+
gsub(/>/, '>')
|
113
|
+
end
|
114
|
+
|
115
|
+
def tag(name, *args, &block)
|
116
|
+
_gestalt_call_tag(name.to_s, args, &block)
|
117
|
+
end
|
118
|
+
|
119
|
+
def to_s
|
120
|
+
@out.join
|
121
|
+
end
|
122
|
+
alias to_str to_s
|
123
|
+
end
|
124
|
+
end
|