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,273 @@
|
|
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 Controller
|
6
|
+
# TODO:
|
7
|
+
# * fix caching, see todos below
|
8
|
+
# FILTER = [ :cached, :default ] unless defined?(FILTER)
|
9
|
+
FILTER = [ :default ] unless defined?(FILTER)
|
10
|
+
|
11
|
+
class << self
|
12
|
+
|
13
|
+
# Resolve an absolute path in the application by passing it to each
|
14
|
+
# element of Ramaze::Controller::FILTER.
|
15
|
+
# If an element does not respond to call it will be sent to self
|
16
|
+
# instead, in either case with path as argument.
|
17
|
+
|
18
|
+
def resolve(path, routed = false)
|
19
|
+
@routed = routed
|
20
|
+
|
21
|
+
FILTER.each do |filter|
|
22
|
+
answer = if filter.respond_to?(:call)
|
23
|
+
filter.call(path)
|
24
|
+
else
|
25
|
+
send(filter.to_s, path)
|
26
|
+
end
|
27
|
+
return answer if answer
|
28
|
+
end
|
29
|
+
|
30
|
+
raise_no_filter(path)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Default element of FILTER.
|
34
|
+
# Looks up the path in Cache.resolved and returns it if found.
|
35
|
+
|
36
|
+
def cached(path)
|
37
|
+
if found = Cache.resolved[path]
|
38
|
+
if found.respond_to?(:relaxed_hash)
|
39
|
+
return found.dup
|
40
|
+
else
|
41
|
+
Log.warn("Found faulty `#{path}' in Cache.resolved, deleting it for sanity.")
|
42
|
+
Cache.resolved.delete path
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
# Default element of FILTER.
|
50
|
+
# The default handler that tries to find the best match for the given
|
51
|
+
# path in terms of Controller/method/template and given arguments.
|
52
|
+
# If a match is found it will be cached for further use.
|
53
|
+
|
54
|
+
def default(path)
|
55
|
+
mapping = Global.mapping
|
56
|
+
controllers = Global.controllers
|
57
|
+
|
58
|
+
raise_no_controller(path) if controllers.empty? or mapping.empty?
|
59
|
+
|
60
|
+
# TODO:
|
61
|
+
# * following code is dangerous (DoS):
|
62
|
+
# patterns = Cache.patterns[path] ||= pattern_for(path)
|
63
|
+
|
64
|
+
first_controller = nil
|
65
|
+
|
66
|
+
# Look through the possible ways of interpreting the path until we find
|
67
|
+
# one that matches an existing controller action.
|
68
|
+
patterns_for(path) do |controller, method, params|
|
69
|
+
if controller = mapping[controller]
|
70
|
+
first_controller ||= controller
|
71
|
+
|
72
|
+
action = controller.resolve_action(method, *params)
|
73
|
+
next unless action
|
74
|
+
|
75
|
+
template = action.template
|
76
|
+
|
77
|
+
valid_action =
|
78
|
+
if Action.stack.size > 0 || Global.actionless_templates
|
79
|
+
action.method or (params.empty? && template)
|
80
|
+
else
|
81
|
+
action.method
|
82
|
+
end
|
83
|
+
|
84
|
+
if valid_action
|
85
|
+
# TODO:
|
86
|
+
# * dangerous as well
|
87
|
+
# Cache.resolved[path] = action
|
88
|
+
return action
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
if !@routed and new_path = Route.resolve(path)
|
94
|
+
Log.dev("Routing from `#{path}' to `#{new_path}'")
|
95
|
+
return resolve(new_path, true)
|
96
|
+
end
|
97
|
+
|
98
|
+
raise_no_action(first_controller, path) if first_controller
|
99
|
+
raise_no_controller(path)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Try to produce an Action from the given path and paremters with the
|
103
|
+
# appropiate template if one exists.
|
104
|
+
|
105
|
+
def resolve_action(path, *parameter)
|
106
|
+
path, parameter = path.to_s, parameter.map{|e| e.to_s}
|
107
|
+
# Use ancestral_trait so if template is set in superclass, it is still found.
|
108
|
+
if info = ancestral_trait["#{path}_template"]
|
109
|
+
template = info[:file]
|
110
|
+
unless template
|
111
|
+
controller, action = info.values_at :controller, :action
|
112
|
+
# Controller may not have been explicitly set, in which case use self.
|
113
|
+
controller ||= self
|
114
|
+
template = controller.resolve_template(action)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
method, params = resolve_method(path, *parameter)
|
119
|
+
|
120
|
+
if method or parameter.empty?
|
121
|
+
template ||= resolve_template(path)
|
122
|
+
end
|
123
|
+
|
124
|
+
action =
|
125
|
+
Action.create :path => path,
|
126
|
+
:method => method,
|
127
|
+
:params => params,
|
128
|
+
:template => template,
|
129
|
+
:controller => self
|
130
|
+
return false unless action.valid_rest?
|
131
|
+
action
|
132
|
+
end
|
133
|
+
|
134
|
+
# Search the #template_paths for a fitting template for path.
|
135
|
+
# Only the first found possibility for the generated glob is returned.
|
136
|
+
|
137
|
+
def resolve_template(path)
|
138
|
+
path = path.to_s
|
139
|
+
path_converted = path.split('__').inject{|s,v| s/v}
|
140
|
+
possible_paths = [path, path_converted].compact
|
141
|
+
|
142
|
+
paths = template_paths.map{|pa| possible_paths.map{|a| pa/a } }.flatten.uniq
|
143
|
+
glob = "{#{paths.join(',')}}.{#{extension_order.join(',')}}"
|
144
|
+
|
145
|
+
Dir[glob].first
|
146
|
+
end
|
147
|
+
|
148
|
+
# Composes an array with the template-paths to look up in the right order.
|
149
|
+
# Usually this is composed of Global.view_root and the mapping of the
|
150
|
+
# controller.
|
151
|
+
|
152
|
+
def template_paths
|
153
|
+
if paths = view_root
|
154
|
+
paths
|
155
|
+
else
|
156
|
+
view_root(Global.view_root / Global.mapping.invert[self])
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# Based on methodname and arity, tries to find the right method on
|
161
|
+
# current controller.
|
162
|
+
def resolve_method(name, *params)
|
163
|
+
cam = cached_action_methods
|
164
|
+
|
165
|
+
if cam.include?(name)
|
166
|
+
method = name
|
167
|
+
else
|
168
|
+
name = name.gsub(/__/, '/')
|
169
|
+
method = name if cam.include?(name)
|
170
|
+
end
|
171
|
+
|
172
|
+
if method
|
173
|
+
arity = instance_method(method).arity
|
174
|
+
if arity < 0 or params.size == arity
|
175
|
+
return method, params
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
return nil, []
|
180
|
+
end
|
181
|
+
|
182
|
+
# List or create a list of action methods to be cached
|
183
|
+
|
184
|
+
def cached_action_methods
|
185
|
+
Cache.action_methods[self] ||= action_methods
|
186
|
+
end
|
187
|
+
|
188
|
+
# methodnames that may be used for current controller.
|
189
|
+
def action_methods
|
190
|
+
ancs = relevant_ancestors + action_modules
|
191
|
+
ancs.reverse.inject [] do |meths, anc|
|
192
|
+
meths +
|
193
|
+
anc.public_instance_methods(false).map{|im| im.to_s } -
|
194
|
+
anc.private_instance_methods(false).map{|im| im.to_s }
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# Array of all modules (so including Ramaze helpers) that are included in
|
199
|
+
# this controller and where the module is also in the Helper::LOOKUP set.
|
200
|
+
# Hence this is the included modules whose public methods may be exposed
|
201
|
+
# as actions of this controller.
|
202
|
+
def action_modules
|
203
|
+
Helper::LOOKUP.find_all {|mod| self.include?(mod)}
|
204
|
+
end
|
205
|
+
|
206
|
+
# Iterator that yields potential ways in which a given path could be mapped
|
207
|
+
# to controller, action and params. It produces them in strict order, with
|
208
|
+
# longest controller path favoured, then longest action path.
|
209
|
+
|
210
|
+
def patterns_for path
|
211
|
+
# Split into fragments, and remove empty ones (which split may have output).
|
212
|
+
# The to_s is vital as sometimes we are passed an array.
|
213
|
+
fragments = path.to_s.split '/'
|
214
|
+
fragments.delete ''
|
215
|
+
|
216
|
+
# Work through all the possible splits of controller and 'the rest' (action
|
217
|
+
# + params) starting with longest possible controller.
|
218
|
+
fragments.length.downto(0) do |ca_split|
|
219
|
+
controller = '/' + fragments[0...ca_split].join('/')
|
220
|
+
|
221
|
+
# Work on the remaining portion, generating all the action/params splits.
|
222
|
+
fragments.length.downto(ca_split) do |ap_split|
|
223
|
+
action = fragments[ca_split...ap_split].join '__'
|
224
|
+
params = fragments[ap_split..-1]
|
225
|
+
if action.empty?
|
226
|
+
yield controller, 'index', params
|
227
|
+
else
|
228
|
+
yield controller, "#{action}__index", params
|
229
|
+
yield controller, action, params
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
# Uses custom defined engines and all available engines and throws it
|
236
|
+
# against the extensions for the template to find the most likely
|
237
|
+
# templating-engine to use ordered by priority and likelyhood.
|
238
|
+
def extension_order
|
239
|
+
t_extensions = Template::ENGINES
|
240
|
+
all_extensions = t_extensions.values.flatten
|
241
|
+
|
242
|
+
if engine = trait[:engine]
|
243
|
+
c_extensions = t_extensions.select{|k,v| k == engine}.map{|k,v| v}.flatten
|
244
|
+
return (c_extensions + all_extensions).uniq
|
245
|
+
end
|
246
|
+
|
247
|
+
all_extensions
|
248
|
+
end
|
249
|
+
|
250
|
+
# Raises Ramaze::Error::NoFilter
|
251
|
+
# TODO:
|
252
|
+
# * is this called at all for anybody?
|
253
|
+
# I think everybody has filters.
|
254
|
+
|
255
|
+
def raise_no_filter(path)
|
256
|
+
raise Ramaze::Error::NoFilter, "No Filter found for `#{path}'"
|
257
|
+
end
|
258
|
+
|
259
|
+
# Raises Ramaze::Error::NoController
|
260
|
+
|
261
|
+
def raise_no_controller(path)
|
262
|
+
raise Ramaze::Error::NoController, "No Controller found for `#{path}'"
|
263
|
+
end
|
264
|
+
|
265
|
+
# Raises Ramaze::Error::NoAction
|
266
|
+
|
267
|
+
def raise_no_action(controller, path)
|
268
|
+
STATE[:controller] = controller
|
269
|
+
raise Ramaze::Error::NoAction, "No Action found for `#{path}' on #{controller}"
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
@@ -0,0 +1,280 @@
|
|
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/helper'
|
5
|
+
require 'ramaze/template'
|
6
|
+
require 'ramaze/action'
|
7
|
+
|
8
|
+
require 'ramaze/controller/resolve'
|
9
|
+
require 'ramaze/controller/error'
|
10
|
+
|
11
|
+
module Ramaze
|
12
|
+
|
13
|
+
# The Controller is responsible for combining and rendering actions.
|
14
|
+
|
15
|
+
class Controller
|
16
|
+
include Helper::Methods
|
17
|
+
|
18
|
+
helper :redirect, :link, :sendfile, :flash, :cgi, :partial
|
19
|
+
|
20
|
+
# Whether or not to map this controller on startup automatically
|
21
|
+
|
22
|
+
trait[:automap] ||= true
|
23
|
+
|
24
|
+
# Place to map the Controller to, this is something like '/' or '/foo'
|
25
|
+
|
26
|
+
trait[:map] ||= nil
|
27
|
+
|
28
|
+
# Caches patterns for the given path.
|
29
|
+
|
30
|
+
trait :pattern_cache => Hash.new{|h,k| h[k] = Controller.pattern_for(k) }
|
31
|
+
|
32
|
+
class << self
|
33
|
+
# When Controller is subclassed the resulting class is placed in
|
34
|
+
# Global.controllers and a new trait :actions_cached is set on it.
|
35
|
+
|
36
|
+
def inherited controller
|
37
|
+
controller.trait :actions_cached => {}
|
38
|
+
Global.controllers << controller
|
39
|
+
if map = controller.mapping
|
40
|
+
Log.dev("mapping #{map} => #{controller}")
|
41
|
+
Global.mapping[map] ||= controller
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# called from Ramaze.startup, adds Cache.actions and Cache.patterns, walks
|
46
|
+
# all controllers subclassed so far and adds them to the Global.mapping if
|
47
|
+
# they are not assigned yet.
|
48
|
+
|
49
|
+
def startup options = {}
|
50
|
+
Log.dev("found Controllers: #{Global.controllers.inspect}")
|
51
|
+
|
52
|
+
check_path("Public root: '%s' doesn't exist", Global.public_root)
|
53
|
+
check_path("View root: '%s' doesn't exist", Global.view_root)
|
54
|
+
|
55
|
+
require 'ramaze/controller/main' if Global.mapping.empty?
|
56
|
+
|
57
|
+
Log.debug("mapped Controllers: #{Global.mapping.inspect}")
|
58
|
+
end
|
59
|
+
|
60
|
+
# checks paths for existance and logs a warning if it doesn't exist yet.
|
61
|
+
|
62
|
+
def check_path(message, *paths)
|
63
|
+
paths.each do |path|
|
64
|
+
Log.warn(message % path) unless File.directory?(path)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# if trait[:automap] is set and controller is not in Global.mapping yet
|
69
|
+
# this will build a new default mapping-point, MainController is put
|
70
|
+
# at '/' by default.
|
71
|
+
|
72
|
+
def mapping
|
73
|
+
global_mapping = Global.mapping.invert[self]
|
74
|
+
return global_mapping if global_mapping
|
75
|
+
if ancestral_trait[:automap] && self.to_s !~ /#<Class:/
|
76
|
+
name = self.to_s.gsub('Controller', '').gsub('::', '/').clone
|
77
|
+
name == 'Main' ? '/' : "/#{name.snake_case}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Map Controller to the given syms or strings.
|
82
|
+
# Replaces old mappings.
|
83
|
+
# If you want to _add_ a mapping, just modify Global.mapping.
|
84
|
+
|
85
|
+
def map(*syms)
|
86
|
+
Global.mapping.delete_if{|k,v| v == self}
|
87
|
+
|
88
|
+
syms.compact.each do |sym|
|
89
|
+
Global.mapping[sym.to_s] = self
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Returns the Controller at a mapped path.
|
94
|
+
|
95
|
+
def at(mapping)
|
96
|
+
Global.mapping[mapping.to_s]
|
97
|
+
end
|
98
|
+
|
99
|
+
# Define a layout for all actions on this controller
|
100
|
+
#
|
101
|
+
# Example:
|
102
|
+
# class Foo < Ramaze::Controller
|
103
|
+
# layout :foo
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# This defines the action :foo to be layout of the controller and will
|
107
|
+
# render the layout after any other action has been rendered, assigns
|
108
|
+
# @content to the result of the action and then goes on rendering
|
109
|
+
# the layout-action where @content may or may not be used, returning
|
110
|
+
# whatever the layout returns.
|
111
|
+
|
112
|
+
def layout(*meth_or_hash)
|
113
|
+
if meth_or_hash.empty?
|
114
|
+
trait[:layout] ||= ( ancestral_trait[:layout] || {:all => nil, :deny => Set.new} ).dup
|
115
|
+
else
|
116
|
+
meth_or_hash = meth_or_hash.first
|
117
|
+
if meth_or_hash.respond_to?(:to_hash)
|
118
|
+
meth_or_hash.each do |layout_name, *actions|
|
119
|
+
actions.flatten.each do |action|
|
120
|
+
layout[action.to_s] = layout_name
|
121
|
+
end
|
122
|
+
end
|
123
|
+
else
|
124
|
+
layout[:all] = meth_or_hash
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Deny layout for passed names of actions.
|
130
|
+
# Name should be name of the method or template without extension, as
|
131
|
+
# String or Symbol
|
132
|
+
#
|
133
|
+
# Usage:
|
134
|
+
# class MainController < Ramaze::Controller
|
135
|
+
# deny_layout :atom
|
136
|
+
#
|
137
|
+
# def atom
|
138
|
+
# "I won't have layout"
|
139
|
+
# end
|
140
|
+
# end
|
141
|
+
|
142
|
+
def deny_layout(*actions)
|
143
|
+
actions.each do |action|
|
144
|
+
layout[:deny] << action.to_s
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# Define a view_root for Controller, returns the current view_root
|
149
|
+
# if no argument is given.
|
150
|
+
# Runs every given path through Controller::check_path
|
151
|
+
|
152
|
+
def view_root *args
|
153
|
+
return @view_root if args.empty?
|
154
|
+
|
155
|
+
check_path("#{self}.view_root: '%s' doesn't exist", *args)
|
156
|
+
@view_root = args.flatten
|
157
|
+
end
|
158
|
+
|
159
|
+
# This is used for template rerouting, takes action, optionally a
|
160
|
+
# controller and action to route to.
|
161
|
+
#
|
162
|
+
# Usage:
|
163
|
+
# class MainController
|
164
|
+
# template :index, OtherController, :list
|
165
|
+
# template :foo, :bar
|
166
|
+
# template :bar, :file => '/absolute/path'
|
167
|
+
# template :baz, :file => 'relative/path'
|
168
|
+
# template :abc, :controller => OtherController
|
169
|
+
# template :xyz, :controller => OtherController, :action => 'list'
|
170
|
+
#
|
171
|
+
# def index
|
172
|
+
# 'will use template from OtherController#list'
|
173
|
+
# end
|
174
|
+
#
|
175
|
+
# def foo
|
176
|
+
# 'will use template from self#bar'
|
177
|
+
# end
|
178
|
+
#
|
179
|
+
# def bar
|
180
|
+
# 'will use template from /absolute/path'
|
181
|
+
# end
|
182
|
+
#
|
183
|
+
# def baz
|
184
|
+
# 'will use template from relative/path'
|
185
|
+
# end
|
186
|
+
#
|
187
|
+
# def abc
|
188
|
+
# 'will use template from OtherController#index'
|
189
|
+
# end
|
190
|
+
#
|
191
|
+
# def xyz
|
192
|
+
# 'will use template from OtherController#list'
|
193
|
+
# end
|
194
|
+
# end
|
195
|
+
|
196
|
+
def template(this, *argv)
|
197
|
+
case argv.first
|
198
|
+
when Hash
|
199
|
+
options, *ignored = argv
|
200
|
+
controller = options[:controller] || options['controller']
|
201
|
+
action = options[:action] || options['action']
|
202
|
+
file = options[:file] || options['file']
|
203
|
+
info = {}
|
204
|
+
if file
|
205
|
+
file = file.to_s
|
206
|
+
unless Pathname(file).absolute?
|
207
|
+
root = [view_root || Global.view_root].flatten.first
|
208
|
+
file = File.join(root, file)
|
209
|
+
end
|
210
|
+
info[:file] = file
|
211
|
+
else
|
212
|
+
controller ||= self
|
213
|
+
action = (action || 'index').to_s
|
214
|
+
info[:controller] = controller
|
215
|
+
info[:action] = action
|
216
|
+
end
|
217
|
+
trait "#{this}_template" => info
|
218
|
+
else
|
219
|
+
# Only explicitly set the controller to use, if it was explicitly given.
|
220
|
+
# This helps ensure that template mappings still work in subclasses
|
221
|
+
# of this controller.
|
222
|
+
first, second, *ignored = argv
|
223
|
+
if second
|
224
|
+
trait "#{this}_template" => {:controller => first, :action => second}
|
225
|
+
else
|
226
|
+
trait "#{this}_template" => {:action => first}
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
# This is a method to specify the templating engine for your controller.
|
232
|
+
# It basically just is sugar for:
|
233
|
+
# trait :engine => Haml
|
234
|
+
#
|
235
|
+
# Usage:
|
236
|
+
# class MainController < Ramaze::Controller
|
237
|
+
# engine :Haml
|
238
|
+
# end
|
239
|
+
|
240
|
+
def engine(name)
|
241
|
+
name = Template.const_get(name)
|
242
|
+
rescue NameError => ex
|
243
|
+
Log.warn ex
|
244
|
+
Log.warn "Try to use passed engine directly"
|
245
|
+
ensure
|
246
|
+
trait :engine => name
|
247
|
+
end
|
248
|
+
|
249
|
+
# Return Controller of current Action
|
250
|
+
|
251
|
+
def current
|
252
|
+
action = Action.current
|
253
|
+
action.instance || action.controller
|
254
|
+
end
|
255
|
+
|
256
|
+
# Entering point for Dispatcher, first Controller::resolve(path) and then
|
257
|
+
# renders the resulting Action.
|
258
|
+
|
259
|
+
def handle path
|
260
|
+
action = resolve(path)
|
261
|
+
STATE[:controller] = action.controller
|
262
|
+
action.render
|
263
|
+
end
|
264
|
+
|
265
|
+
def relevant_ancestors(parent = Ramaze::Controller)
|
266
|
+
ancestors.select do |anc|
|
267
|
+
anc.ancestors.include?(parent)
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
private
|
273
|
+
|
274
|
+
# Simplistic render, rerouting to Controller.handle(*args)
|
275
|
+
|
276
|
+
def render *args
|
277
|
+
self.class.handle(*args)
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|