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,205 @@
|
|
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 'rack/request'
|
5
|
+
|
6
|
+
module Ramaze
|
7
|
+
|
8
|
+
# The purpose of this class is to act as a simple wrapper for Rack::Request
|
9
|
+
# and provide some convinient methods for our own use.
|
10
|
+
|
11
|
+
class Request < ::Rack::Request
|
12
|
+
class << self
|
13
|
+
|
14
|
+
# get the current request out of STATE[:request]
|
15
|
+
#
|
16
|
+
# You can call this from everywhere with Ramaze::Request.current
|
17
|
+
|
18
|
+
def current() Current.request end
|
19
|
+
end
|
20
|
+
|
21
|
+
# you can access the original @request via this method_missing,
|
22
|
+
# first it tries to match your method with any of the HTTP parameters
|
23
|
+
# then, in case that fails, it will relay to @request
|
24
|
+
|
25
|
+
def method_missing meth, *args
|
26
|
+
key = meth.to_s.upcase
|
27
|
+
return env[key] if env.has_key?(key)
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
31
|
+
def request_uri
|
32
|
+
env['REQUEST_URI'] || path_info
|
33
|
+
end
|
34
|
+
|
35
|
+
def ip
|
36
|
+
if addr = env['HTTP_X_FORWARDED_FOR']
|
37
|
+
addr.split(',').last.strip
|
38
|
+
else
|
39
|
+
env['REMOTE_ADDR']
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Request is from a local network?
|
44
|
+
# Checks both IPv4 and IPv6
|
45
|
+
|
46
|
+
ipv4 = %w[ 127.0.0.1/32 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 ]
|
47
|
+
ipv6 = %w[ fc00::/7 fe80::/10 fec0::/10 ::1 ]
|
48
|
+
LOCAL = (ipv4 + ipv6).map{|a| IPAddr.new(a)} unless defined?(LOCAL)
|
49
|
+
|
50
|
+
# --
|
51
|
+
# Mongrel somehow puts together multiple IPs when proxy is involved.
|
52
|
+
# ++
|
53
|
+
|
54
|
+
def local_net?(address = ip)
|
55
|
+
addr = IPAddr.new(address)
|
56
|
+
LOCAL.find{|range| range.include?(addr) }
|
57
|
+
rescue ArgumentError => ex
|
58
|
+
raise ArgumentError, ex unless ex.message == 'invalid address'
|
59
|
+
end
|
60
|
+
|
61
|
+
def [](key, *rest)
|
62
|
+
return params[key.to_s] if rest.empty?
|
63
|
+
[key, *rest].map{|k| params[k.to_s] }
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_ivs(*args)
|
67
|
+
instance = Action.current.instance
|
68
|
+
args.each do |arg|
|
69
|
+
next unless value = self[arg]
|
70
|
+
instance.instance_variable_set("@#{arg}", value)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
unless method_defined?(:rack_params)
|
75
|
+
alias rack_params params
|
76
|
+
|
77
|
+
# Wrapping Request#params to support a one-level hash notation.
|
78
|
+
# It doesn't support anything really fancy, so be conservative in its use.
|
79
|
+
#
|
80
|
+
# See if following provides something useful for us:
|
81
|
+
# http://redhanded.hobix.com/2006/01/25.html
|
82
|
+
#
|
83
|
+
# Example Usage:
|
84
|
+
#
|
85
|
+
# # Template:
|
86
|
+
#
|
87
|
+
# <form action="/paste">
|
88
|
+
# <input type="text" name="paste[name]" />
|
89
|
+
# <input type="text" name="paste[syntax]" />
|
90
|
+
# <input type="submit" />
|
91
|
+
# </form>
|
92
|
+
#
|
93
|
+
# # In your Controller:
|
94
|
+
#
|
95
|
+
# def paste
|
96
|
+
# name, syntax = request['paste'].values_at('name', 'syntax')
|
97
|
+
# paste = Paste.create_with(:name => name, :syntax => syntax)
|
98
|
+
# redirect '/'
|
99
|
+
# end
|
100
|
+
#
|
101
|
+
# # Or, easier:
|
102
|
+
#
|
103
|
+
# def paste
|
104
|
+
# paste = Paste.create_with(request['paste'])
|
105
|
+
# redirect '/'
|
106
|
+
# end
|
107
|
+
|
108
|
+
def params
|
109
|
+
return {} if put?
|
110
|
+
return @ramaze_params if @ramaze_params
|
111
|
+
|
112
|
+
begin
|
113
|
+
@rack_params ||= rack_params
|
114
|
+
rescue EOFError => ex
|
115
|
+
@rack_params = {}
|
116
|
+
Log.error(ex)
|
117
|
+
end
|
118
|
+
|
119
|
+
@ramaze_params = {}
|
120
|
+
|
121
|
+
@rack_params.each do |key, value|
|
122
|
+
if key =~ /^(.*?)(\[.*\])/
|
123
|
+
prim, nested = $~.captures
|
124
|
+
ref = @ramaze_params
|
125
|
+
|
126
|
+
keys = nested.scan(/\[([^\]]+)\]/).flatten
|
127
|
+
keys.unshift prim
|
128
|
+
|
129
|
+
keys.each_with_index do |k, i|
|
130
|
+
if i + 1 >= keys.size
|
131
|
+
ref[k] = value
|
132
|
+
else
|
133
|
+
# in case the value is a string we cannot let it be ref next
|
134
|
+
# time, so throw it away
|
135
|
+
if ref[k].is_a?(String)
|
136
|
+
ref = ref[k] = {}
|
137
|
+
else
|
138
|
+
ref = ref[k] ||= {}
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
else
|
143
|
+
@ramaze_params[key] = value
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
@ramaze_params
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Interesting HTTP variables from env
|
152
|
+
|
153
|
+
def http_vars
|
154
|
+
env.reject{ |k,v|
|
155
|
+
k.to_s !~ /USER|HOST|REQUEST|REMOTE|FORWARD|REFER|PATH|QUERY|VERSION|KEEP|CACHE/
|
156
|
+
}
|
157
|
+
end
|
158
|
+
|
159
|
+
def to_s
|
160
|
+
p, c, e = params.inspect, cookies.inspect, http_vars.inspect
|
161
|
+
%{#<Ramaze::Request params=#{p} cookies=#{c} env=#{e}>}
|
162
|
+
end
|
163
|
+
alias inspect to_s
|
164
|
+
|
165
|
+
def pretty_print pp
|
166
|
+
p, c, e = params, cookies, http_vars
|
167
|
+
pp.object_group(self){
|
168
|
+
{ 'params' => params,
|
169
|
+
'cookies' => cookies,
|
170
|
+
'env' => http_vars }.each do |name, hash|
|
171
|
+
pp.breakable
|
172
|
+
pp.text " @#{name}="
|
173
|
+
pp.nest(name.length+3){ pp.pp_hash hash }
|
174
|
+
end
|
175
|
+
}
|
176
|
+
end
|
177
|
+
|
178
|
+
# Answers with a subset of request.params with only the key/value pairs for
|
179
|
+
# which you pass the keys.
|
180
|
+
# Valid keys are objects that respond to :to_s
|
181
|
+
#
|
182
|
+
# Example:
|
183
|
+
# request.params
|
184
|
+
# # => {'name' => 'jason', 'age' => '45', 'job' => 'lumberjack'}
|
185
|
+
# request.sub('name')
|
186
|
+
# # => {'name' => 'jason'}
|
187
|
+
# request.sub(:name, :job)
|
188
|
+
# # => {'name' => 'jason', 'job' => 'lumberjack'}
|
189
|
+
|
190
|
+
def subset(*keys)
|
191
|
+
keys = keys.map{|k| k.to_s }
|
192
|
+
params.reject{|k,v| not keys.include?(k) }
|
193
|
+
end
|
194
|
+
|
195
|
+
def domain(path = '/')
|
196
|
+
scheme = env['rack.url_scheme'] || 'http'
|
197
|
+
host = env['HTTP_HOST']
|
198
|
+
URI("#{scheme}://#{host}#{path}")
|
199
|
+
end
|
200
|
+
|
201
|
+
def locales
|
202
|
+
env['HTTP_ACCEPT_LANGUAGE'].to_s.split(/(?:,|;q=[\d.,]+)/)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
@@ -0,0 +1,39 @@
|
|
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 Response < Rack::Response
|
6
|
+
class << self
|
7
|
+
# Alias for Current::response
|
8
|
+
def current() Current.response end
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(body = [], status = 200, header = {}, &block)
|
12
|
+
header['Content-Type'] ||= Global.content_type
|
13
|
+
header['Accept-Charset'] = Global.accept_charset if Global.accept_charset
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
# Build/replace this responses data
|
18
|
+
def build(new_body = body, status = status, header = header)
|
19
|
+
header.each do |key, value|
|
20
|
+
self[key] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
self.body, self.status = new_body, status
|
24
|
+
end
|
25
|
+
|
26
|
+
def body=(obj)
|
27
|
+
if obj.respond_to?(:stat)
|
28
|
+
@length = obj.stat.size
|
29
|
+
@body = obj
|
30
|
+
elsif obj.respond_to?(:size)
|
31
|
+
@body = []
|
32
|
+
@length = 0
|
33
|
+
write(obj)
|
34
|
+
else
|
35
|
+
raise(ArgumentError, "Invalid body: %p" % obj)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Ramaze
|
2
|
+
class Session
|
3
|
+
# The purpose of this class is to act as a unifier of the previous
|
4
|
+
# and current flash.
|
5
|
+
#
|
6
|
+
# Flash means pairs of keys and values that are held only over one
|
7
|
+
# request/response cycle. So you can assign a key/value in the current
|
8
|
+
# session and retrieve it in the current and following request.
|
9
|
+
#
|
10
|
+
# Please see the FlashHelper for details on the usage as you won't need
|
11
|
+
# to touch this class at all.
|
12
|
+
class Flash
|
13
|
+
include Enumerable
|
14
|
+
|
15
|
+
def initialize sess
|
16
|
+
@session = sess
|
17
|
+
end
|
18
|
+
|
19
|
+
# iterate over the combined session
|
20
|
+
def each(&block)
|
21
|
+
combined.each(&block)
|
22
|
+
end
|
23
|
+
|
24
|
+
# the current session[:FLASH_PREVIOUS]
|
25
|
+
def previous
|
26
|
+
session[:FLASH_PREVIOUS] || {}
|
27
|
+
end
|
28
|
+
|
29
|
+
# the current session[:FLASH]
|
30
|
+
def current
|
31
|
+
session[:FLASH] ||= {}
|
32
|
+
end
|
33
|
+
|
34
|
+
# combined key/value pairs of previous and current
|
35
|
+
# current keys overshadow the old ones.
|
36
|
+
def combined
|
37
|
+
previous.merge(current)
|
38
|
+
end
|
39
|
+
|
40
|
+
# flash[key] in your Controller
|
41
|
+
def [](key)
|
42
|
+
combined[key]
|
43
|
+
end
|
44
|
+
|
45
|
+
# flash[key] = value in your Controller
|
46
|
+
def []=(key, value)
|
47
|
+
prev = session[:FLASH] || {}
|
48
|
+
prev[key] = value
|
49
|
+
session[:FLASH] = prev
|
50
|
+
end
|
51
|
+
|
52
|
+
# Inspects the combined SessionFlash
|
53
|
+
|
54
|
+
def inspect
|
55
|
+
combined.inspect
|
56
|
+
end
|
57
|
+
|
58
|
+
# Delete a key
|
59
|
+
|
60
|
+
def delete(key)
|
61
|
+
current.delete(key)
|
62
|
+
end
|
63
|
+
|
64
|
+
# check if combined is empty
|
65
|
+
|
66
|
+
def empty?
|
67
|
+
combined.empty?
|
68
|
+
end
|
69
|
+
|
70
|
+
def merge!(hash)
|
71
|
+
current.merge!(hash)
|
72
|
+
end
|
73
|
+
|
74
|
+
def merge(hash)
|
75
|
+
current.merge(hash)
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
# Associated session object
|
81
|
+
|
82
|
+
def session
|
83
|
+
@session
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Ramaze
|
2
|
+
class Session
|
3
|
+
|
4
|
+
# The Session::Hash acts as the wrapper for a simple Hash
|
5
|
+
#
|
6
|
+
# Its purpose is to notify the underlying cache, in which the sessions
|
7
|
+
# are stored, about updates.
|
8
|
+
class Hash
|
9
|
+
|
10
|
+
# Sets @hash to an empty Hash
|
11
|
+
|
12
|
+
def initialize sess
|
13
|
+
@session = sess
|
14
|
+
@hash = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
# relays all the methods to the @hash and updates the session_cache in
|
18
|
+
# Session.current.sessions if anything changes.
|
19
|
+
|
20
|
+
def method_missing(*args, &block)
|
21
|
+
old = @hash.dup
|
22
|
+
result = @hash.send(*args, &block)
|
23
|
+
unless old == @hash
|
24
|
+
Cache.sessions[@session.session_id] = self
|
25
|
+
end
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
# Calls #inspect on the wrapped @hash
|
30
|
+
|
31
|
+
def inspect
|
32
|
+
@hash.inspect
|
33
|
+
end
|
34
|
+
|
35
|
+
# Use client side session variables
|
36
|
+
|
37
|
+
def client
|
38
|
+
Request.current['session.client'] ||= unmarshal(Request.current.cookies["#{Session::SESSION_KEY}-client"]) || {}
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# Marshal a session hash into safe cookie data. Include an integrity hash.
|
44
|
+
def marshal(session)
|
45
|
+
data = [ Marshal.dump(session) ].pack('m').chop
|
46
|
+
"#{data}--#{generate_digest(data)}"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Unmarshal cookie data to a hash and verify its integrity.
|
50
|
+
def unmarshal(cookie)
|
51
|
+
if cookie
|
52
|
+
data, digest = cookie.split('--')
|
53
|
+
return nil unless digest == generate_digest(data)
|
54
|
+
Marshal.load(data.unpack('m').first)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Generate the inline SHA512 message digest. Larger (128 bytes) than SHA256
|
59
|
+
# (64 bytes) or RMD160 (40 bytes), but small relative to the 4096 byte
|
60
|
+
# max cookie size.
|
61
|
+
def generate_digest(data)
|
62
|
+
Digest::SHA512.hexdigest "#{data}#{Session.trait[:secret]}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,181 @@
|
|
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
|
5
|
+
require 'digest/sha2'
|
6
|
+
rescue LoadError
|
7
|
+
require 'digest/sha1'
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'ramaze/current/session/flash'
|
11
|
+
require 'ramaze/current/session/hash'
|
12
|
+
|
13
|
+
module Ramaze
|
14
|
+
|
15
|
+
# The purpose of Session is to hold key/value pairs like a Hash for a series
|
16
|
+
# of # request/response cycles from the same client.
|
17
|
+
#
|
18
|
+
# The persistence is achieved by setting a cookie with the session_id to
|
19
|
+
# the client, which is then passed back and forth until the cookie is either
|
20
|
+
# deleted or expires.
|
21
|
+
|
22
|
+
class Session
|
23
|
+
# The unique id for the current session which is also passed on to the cookie.
|
24
|
+
|
25
|
+
attr_accessor :session_id
|
26
|
+
|
27
|
+
# This variable holds the current SessionFlash
|
28
|
+
|
29
|
+
attr_accessor :flash
|
30
|
+
|
31
|
+
# Flag whether or not to drop this session on the floor
|
32
|
+
|
33
|
+
attr_accessor :dropped
|
34
|
+
|
35
|
+
# secret salt for client-side session data
|
36
|
+
|
37
|
+
trait :secret => 'change_me_please_123'
|
38
|
+
|
39
|
+
# the key used for the cookie
|
40
|
+
|
41
|
+
SESSION_KEY = '_ramaze_session_id' unless defined?(SESSION_KEY)
|
42
|
+
|
43
|
+
# Holds counter for IPs
|
44
|
+
|
45
|
+
IP_COUNT = ::Hash.new{|h,k| h[k] = OrderedSet.new} unless defined?(IP_COUNT)
|
46
|
+
|
47
|
+
# Limit the number of sessions one IP is allowed to hold.
|
48
|
+
|
49
|
+
IP_COUNT_LIMIT = 1000 unless defined?(IP_COUNT_LIMIT)
|
50
|
+
|
51
|
+
# Holds the default cookie used for sessions
|
52
|
+
|
53
|
+
COOKIE = { :path => '/' } unless defined?(COOKIE)
|
54
|
+
|
55
|
+
# Shortcut for Current.session
|
56
|
+
def self.current
|
57
|
+
Current.session
|
58
|
+
end
|
59
|
+
|
60
|
+
# called from Ramaze::startup and adds Cache.sessions if cookies are
|
61
|
+
# enabled
|
62
|
+
|
63
|
+
def self.startup(options = {})
|
64
|
+
Cache.add(:sessions) if Global.sessions
|
65
|
+
end
|
66
|
+
|
67
|
+
# retrieve a specific session given a session id
|
68
|
+
|
69
|
+
def self.[](sess_id)
|
70
|
+
Session.new(sess_id)
|
71
|
+
end
|
72
|
+
|
73
|
+
# generate a random (and hopefully unique) id for the current session.
|
74
|
+
#
|
75
|
+
# It consists of the current time, the current request, the current PID of
|
76
|
+
# ruby and object_id of this instance.
|
77
|
+
#
|
78
|
+
# All this is joined by some calls to Kernel#rand and returned as a
|
79
|
+
# Digest::SHA256::hexdigest
|
80
|
+
|
81
|
+
def self.random_key
|
82
|
+
h = [
|
83
|
+
Time.now.to_f.to_s, rand,
|
84
|
+
Current.request.hash, rand,
|
85
|
+
Process.pid, rand,
|
86
|
+
object_id, rand
|
87
|
+
].join
|
88
|
+
Digest::SHA256.hexdigest(h)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Initialize a new Session, requires the original Rack::Request instance
|
92
|
+
# given to us from Dispatcher#setup_environment.
|
93
|
+
#
|
94
|
+
# sets @session_id and @session_flash
|
95
|
+
|
96
|
+
def initialize(sess_or_request = Current.request)
|
97
|
+
return unless Global.sessions
|
98
|
+
|
99
|
+
if sess_or_request.is_a?(Request)
|
100
|
+
request = sess_or_request
|
101
|
+
@session_id = request.cookies[SESSION_KEY] || Session.random_key
|
102
|
+
else
|
103
|
+
request = nil
|
104
|
+
@session_id = sess_or_request
|
105
|
+
end
|
106
|
+
|
107
|
+
unless IP_COUNT.nil? or request.nil?
|
108
|
+
ip = request.ip
|
109
|
+
IP_COUNT[ip] << @session_id
|
110
|
+
sessions.delete(IP_COUNT[ip].shift) if IP_COUNT[ip].size > IP_COUNT_LIMIT
|
111
|
+
end
|
112
|
+
|
113
|
+
@flash = Session::Flash.new(self)
|
114
|
+
@current = nil
|
115
|
+
@dropped = false
|
116
|
+
end
|
117
|
+
|
118
|
+
# relay all messages we don't understand to the currently active session
|
119
|
+
|
120
|
+
def method_missing(*args, &block)
|
121
|
+
current.send(*args, &block)
|
122
|
+
end
|
123
|
+
|
124
|
+
# answers with the currently active session, which is set unless it is
|
125
|
+
# existing already, the session itself is an instance of SessionHash
|
126
|
+
|
127
|
+
def current
|
128
|
+
unless @current
|
129
|
+
@current = ( sessions[session_id] ||= Session::Hash.new(self) )
|
130
|
+
end
|
131
|
+
@current
|
132
|
+
end
|
133
|
+
|
134
|
+
# shortcut to Cache.sessions
|
135
|
+
|
136
|
+
def sessions
|
137
|
+
Cache.sessions
|
138
|
+
end
|
139
|
+
|
140
|
+
# Inspect on Session.current
|
141
|
+
|
142
|
+
def inspect
|
143
|
+
current.inspect
|
144
|
+
end
|
145
|
+
|
146
|
+
# don't finish this session
|
147
|
+
|
148
|
+
def drop!
|
149
|
+
self.dropped = true
|
150
|
+
end
|
151
|
+
|
152
|
+
# at the end of a request delete the current[:FLASH] and assign it to
|
153
|
+
# current[:FLASH_PREVIOUS]
|
154
|
+
#
|
155
|
+
# this is needed so flash can iterate over requests
|
156
|
+
# and always just keep the current and previous key/value pairs.
|
157
|
+
#
|
158
|
+
# finalizes the session and assigns the key to the response via
|
159
|
+
# set_cookie.
|
160
|
+
|
161
|
+
def finish
|
162
|
+
return unless Global.sessions
|
163
|
+
return if dropped
|
164
|
+
|
165
|
+
old = current.delete(:FLASH)
|
166
|
+
current[:FLASH_PREVIOUS] = old if old
|
167
|
+
|
168
|
+
request, response = Current.request, Current.response
|
169
|
+
|
170
|
+
hash = {:value => session_id}.merge(COOKIE)
|
171
|
+
response.set_cookie(SESSION_KEY, hash)
|
172
|
+
|
173
|
+
# set client side session cookie
|
174
|
+
if val = request['session.client'] and
|
175
|
+
(!val.empty? or request.cookies["#{SESSION_KEY}-client"])
|
176
|
+
cookie = hash.merge(:value => marshal(val))
|
177
|
+
response.set_cookie("#{SESSION_KEY}-client", cookie)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'ramaze/current/request'
|
2
|
+
require 'ramaze/current/response'
|
3
|
+
require 'ramaze/current/session'
|
4
|
+
|
5
|
+
module Ramaze
|
6
|
+
class Current
|
7
|
+
include Trinity
|
8
|
+
extend Trinity
|
9
|
+
|
10
|
+
def initialize(app)
|
11
|
+
@app = app
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
setup(env)
|
16
|
+
before_call
|
17
|
+
record
|
18
|
+
|
19
|
+
@app.call(env)
|
20
|
+
finish
|
21
|
+
ensure
|
22
|
+
after_call
|
23
|
+
end
|
24
|
+
|
25
|
+
def record
|
26
|
+
return unless filter = Global.record
|
27
|
+
request = Current.request
|
28
|
+
Record << request if filter.call(request)
|
29
|
+
end
|
30
|
+
|
31
|
+
def setup(env)
|
32
|
+
self.request = Request.new(env)
|
33
|
+
self.response = Response.new
|
34
|
+
self.session = Session.new
|
35
|
+
end
|
36
|
+
|
37
|
+
def finish
|
38
|
+
session.finish if session
|
39
|
+
response.finish
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.call(env)
|
43
|
+
end
|
44
|
+
|
45
|
+
def before_call
|
46
|
+
end
|
47
|
+
|
48
|
+
def after_call
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
__END__
|
53
|
+
|
54
|
+
module Current
|
55
|
+
class << self
|
56
|
+
include Trinity
|
57
|
+
|
58
|
+
def call(env)
|
59
|
+
setup(env)
|
60
|
+
before_call
|
61
|
+
|
62
|
+
if filter = Global.record
|
63
|
+
request = Current.request
|
64
|
+
Record << request if filter[request]
|
65
|
+
end
|
66
|
+
|
67
|
+
Dispatcher.handle
|
68
|
+
|
69
|
+
finish
|
70
|
+
ensure
|
71
|
+
after_call
|
72
|
+
end
|
73
|
+
|
74
|
+
def setup(env)
|
75
|
+
self.request = Request.new(env)
|
76
|
+
self.response = Response.new
|
77
|
+
self.session = Session.new
|
78
|
+
end
|
79
|
+
|
80
|
+
def finish
|
81
|
+
session.finish if session
|
82
|
+
response.finish
|
83
|
+
end
|
84
|
+
|
85
|
+
def before(&block)
|
86
|
+
@before = block_given? ? block : @before
|
87
|
+
end
|
88
|
+
|
89
|
+
def before_call
|
90
|
+
return unless before
|
91
|
+
before.call
|
92
|
+
rescue Object => e
|
93
|
+
Ramaze::Log.error e
|
94
|
+
raise e
|
95
|
+
end
|
96
|
+
|
97
|
+
def after(&block)
|
98
|
+
@after = block_given? ? block : @after
|
99
|
+
end
|
100
|
+
|
101
|
+
def after_call
|
102
|
+
return unless after
|
103
|
+
after.call
|
104
|
+
rescue Object => e
|
105
|
+
Ramaze::Log.error e
|
106
|
+
raise e
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|