ramaze 0.3.9.1 → 2023.01.06
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.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/README.md +125 -0
- data/Rakefile +13 -186
- data/bin/ramaze +4 -149
- data/examples/app/auth/layout/auth.xhtml +25 -0
- data/examples/app/auth/start.rb +25 -0
- data/examples/app/auth/view/index.xhtml +4 -0
- data/examples/app/auth/view/login.xhtml +20 -0
- data/examples/app/auth/view/secret.xhtml +1 -0
- data/examples/app/blog/app.rb +23 -0
- data/examples/app/blog/config.ru +19 -0
- data/examples/app/blog/controller/init.rb +30 -0
- data/examples/app/blog/controller/posts.rb +223 -0
- data/examples/app/blog/controller/users.rb +152 -0
- data/examples/app/blog/layout/default.xhtml +61 -0
- data/examples/app/blog/migrations/01_create_schema.rb +50 -0
- data/examples/app/blog/model/comment.rb +42 -0
- data/examples/app/blog/model/init.rb +44 -0
- data/examples/app/blog/model/post.rb +33 -0
- data/examples/app/blog/model/user.rb +100 -0
- data/examples/app/blog/public/css/grid.css +107 -0
- data/examples/app/blog/public/css/layout.css +203 -0
- data/examples/app/blog/public/css/reset.css +123 -0
- data/examples/app/blog/public/css/text.css +109 -0
- data/examples/app/blog/public/dispatch.fcgi +11 -0
- data/examples/app/blog/public/favicon.ico +0 -0
- data/examples/app/blog/public/images/bg.png +0 -0
- data/examples/app/blog/start.rb +20 -0
- data/examples/app/blog/view/feed.xhtml +23 -0
- data/examples/app/blog/view/form.xhtml +11 -0
- data/examples/app/blog/view/index.xhtml +44 -0
- data/examples/app/blog/view/users/form.xhtml +12 -0
- data/examples/app/blog/view/users/index.xhtml +30 -0
- data/examples/app/blog/view/users/login.xhtml +8 -0
- data/examples/app/blog/view/view.xhtml +68 -0
- data/examples/app/chat/layout/default.xhtml +13 -0
- data/examples/app/chat/model/history.rb +38 -0
- data/examples/app/chat/model/message.rb +7 -0
- data/examples/app/chat/public/css/chat.css +9 -0
- data/examples/app/chat/public/js/chat.js +28 -0
- data/{lib/proto → examples/app/chat}/public/js/jquery.js +75 -15
- data/examples/app/chat/start.rb +39 -0
- data/examples/app/chat/view/chat.xhtml +9 -0
- data/examples/app/chat/view/index.xhtml +7 -0
- data/examples/app/localization/locale/de.yaml +5 -0
- data/examples/app/localization/locale/en.yaml +5 -0
- data/examples/app/localization/locale/ja.yaml +5 -0
- data/examples/app/localization/start.rb +48 -0
- data/examples/app/todolist/controller/init.rb +11 -0
- data/examples/app/todolist/controller/task.rb +39 -0
- data/examples/app/todolist/layout/default.xhtml +14 -0
- data/examples/app/todolist/model/init.rb +14 -0
- data/examples/app/todolist/model/task.rb +39 -0
- data/examples/app/todolist/public/css/screen.css +63 -0
- data/examples/app/todolist/start.rb +7 -0
- data/examples/app/todolist/view/index.xhtml +29 -0
- data/examples/{upload → app/upload}/start.rb +7 -3
- data/examples/app/whywiki/spec/whywiki.rb +56 -0
- data/examples/{whywiki → app/whywiki}/start.rb +10 -9
- data/examples/{whywiki/template → app/whywiki/view}/edit.xhtml +2 -2
- data/examples/app/whywiki/view/show.xhtml +20 -0
- data/examples/{wikore → app/wikore}/spec/wikore.rb +7 -9
- data/examples/{wikore → app/wikore}/src/controller.rb +9 -11
- data/examples/{wikore → app/wikore}/src/model.rb +11 -13
- data/examples/app/wikore/start.rb +9 -0
- data/examples/{wiktacular/template/html_layout.xhtml → app/wiktacular/layout/application.xhtml} +1 -1
- data/examples/{wiktacular → app/wiktacular}/mkd/main/2007-07-20_19-21-12.mkd +1 -1
- 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/{wiktacular → app/wiktacular}/mkd/markdown/current.mkd +2 -2
- data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
- data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-20_19-43-50.mkd +2 -2
- data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-46-01.mkd +11 -11
- data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-46-32.mkd +12 -12
- data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-47-08.mkd +16 -16
- data/examples/{wiktacular → app/wiktacular}/mkd/testing/2007-07-21_18-47-54.mkd +16 -16
- data/examples/{wiktacular → app/wiktacular}/mkd/testing/current.mkd +16 -16
- data/examples/{wiktacular → app/wiktacular}/spec/wiktacular.rb +39 -40
- data/examples/{wiktacular → app/wiktacular}/src/controller.rb +18 -18
- data/examples/{wiktacular → app/wiktacular}/src/model.rb +30 -14
- data/examples/{wiktacular → app/wiktacular}/start.rb +1 -1
- data/examples/{wiktacular/template → app/wiktacular/view}/edit.xhtml +2 -2
- data/examples/{wiktacular/template → app/wiktacular/view}/new.xhtml +1 -1
- data/examples/{element.rb → basic/element.rb} +5 -3
- data/examples/basic/gestalt.rb +26 -0
- data/examples/basic/hello.rb +14 -0
- data/examples/{layout.rb → basic/layout.rb} +2 -2
- data/examples/basic/linking.rb +29 -0
- data/examples/basic/partial.rb +26 -0
- data/examples/{simple.rb → basic/simple.rb} +9 -12
- data/examples/{caching.rb → helpers/cache.rb} +9 -7
- data/examples/helpers/paginate.rb +71 -0
- data/examples/helpers/rest.rb +28 -0
- data/examples/helpers/simple_captcha.rb +29 -0
- data/examples/{css.rb → misc/css.rb} +6 -12
- data/examples/misc/memleak_detector.rb +37 -0
- data/examples/misc/nagoro_element.rb +43 -0
- data/examples/{ramaise.rb → misc/ramaise.rb} +2 -2
- data/examples/misc/rapp.rb +56 -0
- data/examples/misc/sequel_scaffolding.rb +45 -0
- data/examples/misc/serve_directory.rb +6 -0
- data/examples/templates/template_erubis.rb +9 -10
- data/examples/templates/template_ezamar.rb +8 -7
- data/examples/templates/template_haml.rb +7 -8
- data/examples/templates/template_liquid.rb +20 -19
- data/examples/templates/template_markaby.rb +6 -7
- data/examples/templates/template_mustache.rb +70 -0
- data/examples/templates/template_nagoro.rb +6 -7
- data/examples/templates/template_redcloth.rb +8 -9
- data/examples/templates/template_remarkably.rb +8 -9
- data/examples/templates/template_tenjin.rb +10 -15
- data/examples/templates/{template → view}/external.haml +4 -4
- data/examples/templates/{template → view}/external.mab +4 -4
- data/examples/templates/view/external.mt +29 -0
- data/examples/templates/{template → view}/external.nag +4 -4
- data/examples/templates/{template → view}/external.redcloth +4 -4
- data/examples/templates/{template → view}/external.rem +4 -4
- data/examples/templates/{template → view}/external.rhtml +6 -6
- data/examples/templates/{template → view}/external.tenjin +4 -4
- data/examples/templates/{template → view}/external.zmr +6 -6
- data/guide/AUTHORS +80 -0
- data/guide/CHANGELOG +20210 -0
- data/guide/LICENSE +19 -0
- data/guide/_static/logo.png +0 -0
- data/guide/_static/logo.svg +49 -0
- data/guide/css/common.css +20 -0
- data/guide/general/cache.md +168 -0
- data/guide/general/configuration.md +169 -0
- data/guide/general/contributing.md +182 -0
- data/guide/general/controllers.md +210 -0
- data/guide/general/helpers.md +89 -0
- data/guide/general/installation.md +59 -0
- data/guide/general/logging.md +96 -0
- data/guide/general/middlewares.md +111 -0
- data/guide/general/models.md +79 -0
- data/{doc/readme_chunks/principles.txt → guide/general/principles.md} +15 -17
- data/guide/general/ramaze_command.md +110 -0
- data/guide/general/routes.md +82 -0
- data/guide/general/sessions.md +210 -0
- data/guide/general/special_thanks.md +69 -0
- data/guide/general/testing.md +228 -0
- data/guide/general/upgrading.md +85 -0
- data/guide/general/views.md +335 -0
- data/lib/proto/Gemfile +4 -0
- data/lib/proto/README.md +35 -0
- data/lib/proto/Rakefile +1 -0
- data/lib/proto/app.rb +9 -0
- data/lib/proto/config.ru +19 -0
- data/lib/proto/controller/init.rb +18 -0
- data/lib/proto/controller/main.rb +13 -10
- data/lib/proto/layout/default.xhtml +57 -0
- data/lib/proto/public/css/grid.css +107 -0
- data/lib/proto/public/css/layout.css +81 -0
- data/lib/proto/public/css/reset.css +123 -0
- data/lib/proto/public/css/text.css +109 -0
- data/lib/proto/public/favicon.ico +0 -0
- data/lib/proto/public/images/bg.png +0 -0
- data/lib/proto/spec/helper.rb +39 -0
- data/lib/proto/task/ramaze.rake +57 -0
- data/lib/proto/view/index.xhtml +36 -25
- data/lib/ramaze/app.rb +198 -0
- data/lib/ramaze/bin/create.rb +92 -0
- data/lib/ramaze/bin/runner.rb +127 -0
- data/lib/ramaze/cache/lru.rb +88 -0
- data/lib/ramaze/cache/memcache.rb +219 -0
- data/lib/ramaze/cache/moneta.rb +143 -0
- data/lib/ramaze/cache/redis.rb +163 -0
- data/lib/ramaze/cache/sequel.rb +373 -0
- data/lib/ramaze/cache.rb +42 -82
- data/lib/ramaze/controller/default.rb +25 -0
- data/lib/ramaze/controller.rb +184 -224
- data/lib/ramaze/current.rb +17 -68
- data/lib/ramaze/default_middleware.rb +24 -0
- data/lib/ramaze/files.rb +59 -0
- data/lib/ramaze/gestalt.rb +95 -63
- data/lib/ramaze/helper/auth.rb +107 -107
- data/lib/ramaze/helper/bench.rb +51 -0
- data/lib/ramaze/helper/blue_form.rb +683 -0
- data/lib/ramaze/helper/cache.rb +108 -130
- data/lib/ramaze/helper/csrf.rb +191 -0
- data/lib/ramaze/helper/email.rb +116 -0
- data/lib/ramaze/helper/erector.rb +113 -0
- data/lib/ramaze/helper/flash.rb +42 -39
- data/lib/ramaze/helper/formatting.rb +200 -35
- data/lib/ramaze/helper/gestalt.rb +49 -0
- data/lib/ramaze/helper/gravatar.rb +75 -0
- data/lib/ramaze/helper/identity.rb +93 -68
- data/lib/ramaze/helper/layout.rb +128 -0
- data/lib/ramaze/helper/link.rb +52 -119
- data/lib/ramaze/helper/localize.rb +143 -0
- data/lib/ramaze/helper/markaby.rb +26 -24
- data/lib/ramaze/helper/maruku.rb +15 -6
- data/lib/ramaze/helper/paginate.rb +315 -0
- data/lib/ramaze/helper/remarkably.rb +14 -0
- data/lib/ramaze/helper/request_accessor.rb +20 -0
- data/lib/ramaze/helper/send_file.rb +34 -0
- data/lib/ramaze/helper/simple_captcha.rb +61 -0
- data/lib/ramaze/helper/stack.rb +72 -62
- data/lib/ramaze/helper/tagz.rb +13 -12
- data/lib/ramaze/helper/thread.rb +25 -0
- data/lib/ramaze/helper/upload.rb +525 -0
- data/lib/ramaze/helper/user.rb +260 -39
- data/lib/ramaze/helper/xhtml.rb +122 -0
- data/lib/ramaze/helper.rb +8 -79
- data/lib/ramaze/log/hub.rb +41 -32
- data/lib/ramaze/log/informer.rb +128 -104
- data/lib/ramaze/log/logger.rb +25 -15
- data/lib/ramaze/log/logging.rb +46 -27
- data/lib/ramaze/log/rotatinginformer.rb +237 -0
- data/lib/ramaze/log/syslog.rb +57 -31
- data/lib/ramaze/log.rb +16 -15
- data/lib/ramaze/reloader/watch_inotify.rb +84 -0
- data/lib/ramaze/reloader/watch_stat.rb +58 -0
- data/lib/ramaze/reloader.rb +212 -0
- data/lib/ramaze/request.rb +126 -0
- data/lib/ramaze/response.rb +67 -0
- data/lib/ramaze/snippets/object/__dir__.rb +25 -0
- data/lib/ramaze/snippets/ramaze/deprecated.rb +23 -0
- data/lib/ramaze/snippets/string/camel_case.rb +17 -14
- data/lib/ramaze/snippets/string/color.rb +27 -24
- data/lib/ramaze/snippets/string/esc.rb +25 -25
- data/lib/ramaze/snippets/string/snake_case.rb +16 -13
- data/lib/ramaze/snippets/string/unindent.rb +24 -11
- data/lib/ramaze/snippets.rb +21 -6
- data/lib/ramaze/spec/bacon.rb +44 -0
- data/lib/ramaze/spec/helper/bacon.rb +4 -4
- data/lib/ramaze/spec/helper/pretty_output.rb +9 -1
- data/lib/ramaze/spec/helper/snippets.rb +11 -1
- data/lib/ramaze/spec/helper/template_examples.rb +22 -0
- data/lib/ramaze/version.rb +4 -13
- data/lib/ramaze/view/erector.rb +116 -0
- data/lib/ramaze/view/erubis.rb +26 -0
- data/lib/ramaze/view/ezamar.rb +27 -0
- data/lib/ramaze/view/gestalt.rb +20 -0
- data/lib/ramaze/view/haml.rb +27 -0
- data/lib/ramaze/view/liquid.rb +99 -0
- data/lib/ramaze/view/lokar.rb +18 -0
- data/lib/ramaze/view/mustache.rb +46 -0
- data/lib/ramaze/view/nagoro/render_partial.rb +32 -0
- data/lib/ramaze/view/nagoro.rb +44 -0
- data/lib/ramaze/view/remarkably.rb +22 -0
- data/lib/ramaze/view/sass.rb +22 -0
- data/lib/ramaze/view/slim.rb +43 -0
- data/lib/ramaze/view/slippers.rb +51 -0
- data/lib/ramaze/view/tagz.rb +67 -0
- data/lib/ramaze/view/tenjin.rb +32 -0
- data/lib/ramaze/view.rb +35 -0
- data/lib/ramaze.rb +60 -100
- data/lib/vendor/route_exceptions.rb +42 -0
- data/ramaze.gemspec +61 -0
- data/spec/examples/caching.rb +5 -8
- data/spec/examples/css.rb +3 -4
- data/spec/examples/element.rb +4 -4
- data/spec/examples/hello.rb +4 -5
- data/spec/examples/linking.rb +3 -4
- data/spec/examples/misc/sequel_scaffolding.rb +18 -0
- data/spec/examples/simple.rb +3 -8
- data/spec/examples/templates/template_erubis.rb +8 -18
- data/spec/examples/templates/template_ezamar.rb +9 -19
- data/spec/examples/templates/template_haml.rb +8 -20
- data/spec/examples/templates/template_liquid.rb +8 -24
- data/spec/examples/templates/template_markaby.rb +10 -19
- data/spec/examples/templates/template_mustache.rb +13 -0
- data/spec/examples/templates/template_nagoro.rb +13 -0
- data/spec/examples/templates/template_remarkably.rb +8 -18
- data/spec/examples/templates/template_tenjin.rb +8 -23
- data/spec/examples/todolist.rb +33 -0
- data/spec/helper.rb +14 -3
- data/spec/ramaze/action/render.rb +9 -17
- data/spec/ramaze/action/view/other_wrapper.erb +1 -0
- data/spec/ramaze/action/view/sub/sub_wrapper.xhtml +1 -0
- data/spec/ramaze/app/location.rb +43 -0
- data/spec/ramaze/app.rb +50 -0
- data/spec/ramaze/bin/app/config.ru +11 -0
- data/spec/ramaze/bin/create.rb +28 -0
- data/spec/ramaze/bin/runner.rb +30 -0
- data/spec/ramaze/cache/lru.rb +48 -0
- data/spec/ramaze/cache/memcache.rb +69 -0
- data/spec/ramaze/cache/moneta.rb +53 -0
- data/spec/ramaze/cache/redis.rb +58 -0
- data/spec/ramaze/cache/sequel.rb +60 -0
- data/spec/ramaze/controller/actionless_templates.rb +16 -12
- data/spec/ramaze/controller/lonely_mapping.rb +18 -0
- data/spec/ramaze/controller/mapping.rb +63 -0
- data/spec/ramaze/controller/provide_inheritance.rb +40 -0
- data/spec/ramaze/controller/resolve.rb +9 -11
- data/spec/ramaze/controller/subclass.rb +22 -7
- data/spec/ramaze/controller/template_resolving.rb +23 -61
- data/spec/ramaze/controller/view/bar.xhtml +1 -0
- data/spec/ramaze/controller/view/base/another.xhtml +1 -0
- data/spec/ramaze/dispatcher/directory.rb +61 -33
- data/spec/ramaze/dispatcher/file.rb +65 -47
- data/spec/ramaze/error.rb +54 -64
- data/spec/ramaze/files/public_1/plain.txt +1 -0
- data/spec/ramaze/files/public_2/rich.txt +1 -0
- data/spec/ramaze/files.rb +30 -0
- data/spec/ramaze/gestalt.rb +28 -21
- data/spec/ramaze/helper/auth.rb +47 -29
- data/spec/ramaze/helper/bench.rb +21 -0
- data/spec/ramaze/helper/blue_form.rb +807 -0
- data/spec/ramaze/helper/cache.rb +65 -84
- data/spec/ramaze/helper/csrf.rb +64 -0
- data/spec/ramaze/helper/email.rb +69 -0
- data/spec/ramaze/helper/flash.rb +22 -101
- data/spec/ramaze/helper/formatting.rb +100 -6
- data/spec/ramaze/helper/gestalt.rb +18 -0
- data/spec/ramaze/helper/gravatar.rb +43 -0
- data/spec/ramaze/helper/layout/alternative.xhtml +5 -0
- data/spec/ramaze/helper/layout/default.xhtml +5 -0
- data/spec/ramaze/helper/layout.rb +109 -0
- data/spec/ramaze/helper/link.rb +48 -102
- data/spec/ramaze/helper/localize.rb +65 -0
- data/spec/ramaze/helper/maruku.rb +22 -0
- data/spec/ramaze/helper/paginate.rb +304 -0
- data/spec/ramaze/helper/request_accessor.rb +22 -0
- data/spec/ramaze/helper/simple_captcha.rb +45 -0
- data/spec/ramaze/helper/stack.rb +54 -41
- data/spec/ramaze/helper/upload.rb +150 -0
- data/spec/ramaze/helper/uploads/text_1.txt +1 -0
- data/spec/ramaze/helper/uploads/text_2.txt +1 -0
- data/spec/ramaze/helper/user.rb +63 -20
- data/spec/ramaze/helper/xhtml.rb +54 -0
- data/spec/ramaze/log/informer.rb +30 -28
- data/spec/ramaze/log/logging.rb +66 -0
- data/spec/ramaze/log/syslog.rb +89 -4
- data/spec/ramaze/params.rb +12 -16
- data/spec/ramaze/request.rb +51 -160
- data/spec/ramaze/rewrite/file.css +1 -0
- data/spec/ramaze/session/lru.rb +58 -0
- data/spec/ramaze/session/memcache.rb +66 -0
- data/spec/ramaze/session/redis.rb +63 -0
- data/spec/ramaze/session/sequel.rb +62 -0
- data/spec/ramaze/view/erector/external_view.erector +5 -0
- data/spec/ramaze/view/erector/index.erector +5 -0
- data/spec/ramaze/view/erector/layout.erector +13 -0
- data/spec/ramaze/view/erector/tables.erector +23 -0
- data/spec/ramaze/view/erector/view.erector +6 -0
- data/spec/ramaze/view/erector.rb +68 -0
- data/spec/ramaze/view/erubis/external.rhtml +8 -0
- data/spec/ramaze/view/erubis/sum.rhtml +1 -0
- data/spec/ramaze/view/erubis.rb +73 -0
- data/spec/ramaze/view/ezamar/external.zmr +8 -0
- data/spec/ramaze/view/ezamar/sum.zmr +1 -0
- data/spec/ramaze/view/ezamar.rb +73 -0
- data/spec/ramaze/view/gestalt/external.ges +8 -0
- data/spec/ramaze/view/gestalt.rb +94 -0
- data/spec/ramaze/view/haml/external.haml +5 -0
- data/spec/ramaze/view/haml/sum.haml +2 -0
- data/spec/ramaze/view/haml.rb +114 -0
- data/spec/ramaze/view/liquid/external.liquid +8 -0
- data/spec/ramaze/view/liquid/sum.liquid +1 -0
- data/spec/ramaze/view/liquid.rb +73 -0
- data/spec/ramaze/view/lokar/external.lok +8 -0
- data/spec/ramaze/view/lokar/sum.lok +1 -0
- data/spec/ramaze/view/lokar.rb +78 -0
- data/spec/ramaze/view/mustache/external.mt +8 -0
- data/spec/ramaze/view/mustache/sum.mt +1 -0
- data/spec/ramaze/view/mustache.rb +77 -0
- data/spec/ramaze/view/nagoro/external.nag +8 -0
- data/spec/ramaze/view/nagoro/sum.nag +1 -0
- data/spec/ramaze/view/nagoro.rb +78 -0
- data/spec/ramaze/view/remarkably.rb +49 -0
- data/spec/ramaze/view/sass.rb +73 -0
- data/spec/ramaze/view/slim/external.slim +5 -0
- data/spec/ramaze/view/slim/external_vars.slim +5 -0
- data/spec/ramaze/view/slim.rb +49 -0
- data/spec/ramaze/view/slippers/external.st +8 -0
- data/spec/ramaze/view/slippers/sum.st +1 -0
- data/spec/ramaze/view/slippers.rb +49 -0
- data/spec/ramaze/{template → view}/tagz.rb +20 -31
- data/spec/ramaze/view/tenjin/external.rbhtml +8 -0
- data/spec/ramaze/view/tenjin/sum.rbhtml +1 -0
- data/spec/ramaze/view/tenjin.rb +57 -0
- data/spec/ramaze/view.rb +36 -0
- data/spec/snippets/object/__dir__.rb +17 -0
- data/spec/snippets/ramaze/lru_hash.rb +88 -0
- data/spec/snippets/string/camel_case.rb +4 -1
- data/spec/snippets/string/color.rb +4 -1
- data/spec/snippets/string/snake_case.rb +4 -1
- data/spec/snippets/string/unindent.rb +10 -1
- data/tasks/authors.rake +17 -0
- data/tasks/bacon.rake +81 -0
- data/tasks/changelog.rake +20 -0
- data/tasks/gems.rake +15 -0
- data/tasks/release.rake +38 -0
- data/tasks/todo.rake +31 -0
- data/tasks/yard.rake +13 -0
- metadata +813 -714
- data/doc/AUTHORS +0 -25
- data/doc/CHANGELOG +0 -5757
- data/doc/COPYING +0 -56
- data/doc/FAQ +0 -92
- data/doc/GPL +0 -339
- data/doc/INSTALL +0 -34
- data/doc/LEGAL +0 -26
- data/doc/ProjectInfo +0 -53
- data/doc/README +0 -435
- data/doc/TODO +0 -29
- data/doc/meta/announcement.txt +0 -126
- data/doc/meta/configuration.txt +0 -162
- data/doc/meta/internals.txt +0 -278
- data/doc/meta/users.kml +0 -64
- data/doc/migrate/1110_to_1111.txt +0 -131
- data/doc/readme_chunks/appendix.txt +0 -10
- data/doc/readme_chunks/examples.txt +0 -38
- data/doc/readme_chunks/features.txt +0 -148
- data/doc/readme_chunks/getting_help.txt +0 -5
- data/doc/readme_chunks/getting_started.txt +0 -18
- data/doc/readme_chunks/installing.txt +0 -46
- data/doc/readme_chunks/introduction.txt +0 -18
- data/doc/readme_chunks/thanks.txt +0 -59
- data/doc/tutorial/todolist.html +0 -816
- data/doc/tutorial/todolist.mkd +0 -736
- data/examples/auth/auth.rb +0 -54
- data/examples/auth/template/layout.haml +0 -20
- data/examples/auth/template/login.haml +0 -16
- data/examples/blog/README +0 -3
- data/examples/blog/controller/main.rb +0 -29
- data/examples/blog/model/entry.rb +0 -30
- data/examples/blog/public/styles/blog.css +0 -132
- data/examples/blog/spec/blog.rb +0 -87
- data/examples/blog/start.rb +0 -7
- data/examples/blog/view/edit.xhtml +0 -17
- data/examples/blog/view/index.xhtml +0 -17
- data/examples/blog/view/layout.xhtml +0 -11
- data/examples/blog/view/new.xhtml +0 -16
- data/examples/hello.rb +0 -15
- data/examples/linking.rb +0 -29
- data/examples/memleak_detector.rb +0 -32
- data/examples/nitro_form.rb +0 -23
- data/examples/rammit/spec/rammit.rb +0 -30
- data/examples/rammit/src/controller/main.rb +0 -3
- data/examples/rammit/src/controller/page.rb +0 -16
- data/examples/rammit/src/model.rb +0 -33
- data/examples/rammit/start.rb +0 -8
- data/examples/rammit/template/index.xhtml +0 -14
- data/examples/rammit/template/page/view.xhtml +0 -4
- data/examples/rapaste/Rakefile +0 -35
- data/examples/rapaste/controller/paste.rb +0 -94
- data/examples/rapaste/model/paste.rb +0 -55
- data/examples/rapaste/public/css/active4d.css +0 -114
- data/examples/rapaste/public/css/all_hallows_eve.css +0 -72
- data/examples/rapaste/public/css/amy.css +0 -147
- data/examples/rapaste/public/css/blackboard.css +0 -88
- data/examples/rapaste/public/css/brilliance_black.css +0 -605
- data/examples/rapaste/public/css/brilliance_dull.css +0 -599
- data/examples/rapaste/public/css/cobalt.css +0 -149
- data/examples/rapaste/public/css/dawn.css +0 -121
- data/examples/rapaste/public/css/display.css +0 -197
- data/examples/rapaste/public/css/eiffel.css +0 -121
- data/examples/rapaste/public/css/espresso_libre.css +0 -109
- data/examples/rapaste/public/css/idle.css +0 -62
- data/examples/rapaste/public/css/iplastic.css +0 -80
- data/examples/rapaste/public/css/lazy.css +0 -73
- data/examples/rapaste/public/css/mac_classic.css +0 -123
- data/examples/rapaste/public/css/magicwb_amiga.css +0 -104
- data/examples/rapaste/public/css/pastels_on_dark.css +0 -188
- data/examples/rapaste/public/css/slush_poppies.css +0 -85
- data/examples/rapaste/public/css/spacecadet.css +0 -51
- data/examples/rapaste/public/css/sunburst.css +0 -180
- data/examples/rapaste/public/css/twilight.css +0 -137
- data/examples/rapaste/public/css/zenburnesque.css +0 -91
- data/examples/rapaste/public/js/jquery.js +0 -11
- data/examples/rapaste/spec/rapaste.rb +0 -49
- data/examples/rapaste/start.rb +0 -24
- data/examples/rapaste/view/copy.xhtml +0 -10
- data/examples/rapaste/view/index.xhtml +0 -9
- data/examples/rapaste/view/layout.xhtml +0 -25
- data/examples/rapaste/view/list.xhtml +0 -29
- data/examples/rapaste/view/search.xhtml +0 -41
- data/examples/rapaste/view/view.xhtml +0 -37
- data/examples/simple_auth.rb +0 -23
- data/examples/sourceview/public/coderay.css +0 -104
- data/examples/sourceview/public/images/file.gif +0 -0
- data/examples/sourceview/public/images/folder.gif +0 -0
- data/examples/sourceview/public/images/tv-collapsable-last.gif +0 -0
- data/examples/sourceview/public/images/tv-collapsable.gif +0 -0
- data/examples/sourceview/public/images/tv-expandable-last.gif +0 -0
- data/examples/sourceview/public/images/tv-expandable.gif +0 -0
- data/examples/sourceview/public/images/tv-item-last.gif +0 -0
- data/examples/sourceview/public/images/tv-item.gif +0 -0
- data/examples/sourceview/public/jquery.js +0 -11
- data/examples/sourceview/public/jquery.treeview.css +0 -48
- data/examples/sourceview/public/jquery.treeview.js +0 -223
- data/examples/sourceview/public/sourceview.js +0 -52
- data/examples/sourceview/sourceview.rb +0 -77
- data/examples/sourceview/template/index.haml +0 -59
- data/examples/templates/template/external.amrita +0 -19
- data/examples/templates/template/external.xsl +0 -57
- data/examples/templates/template_amrita2.rb +0 -74
- data/examples/templates/template_xslt.rb +0 -49
- data/examples/todolist/README +0 -1
- data/examples/todolist/public/js/jquery.js +0 -1923
- data/examples/todolist/public/ramaze.png +0 -0
- data/examples/todolist/spec/todolist.rb +0 -132
- data/examples/todolist/src/controller/main.rb +0 -70
- data/examples/todolist/src/element/page.rb +0 -31
- data/examples/todolist/src/model.rb +0 -14
- data/examples/todolist/start.rb +0 -11
- data/examples/todolist/template/index.xhtml +0 -17
- data/examples/todolist/template/new.xhtml +0 -7
- data/examples/whywiki/spec/whywiki.rb +0 -58
- data/examples/whywiki/template/show.xhtml +0 -18
- data/examples/wikore/start.rb +0 -9
- data/examples/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +0 -2
- data/examples/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +0 -2
- data/examples/wiktacular/mkd/main/current.mkd +0 -2
- data/examples/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +0 -2
- data/lib/proto/public/css/ramaze_error.css +0 -90
- data/lib/proto/public/dispatch.fcgi +0 -11
- data/lib/proto/public/ramaze.png +0 -0
- data/lib/proto/spec/main.rb +0 -24
- data/lib/proto/start.rb +0 -8
- data/lib/proto/start.ru +0 -8
- data/lib/proto/view/error.xhtml +0 -64
- data/lib/proto/view/page.xhtml +0 -15
- data/lib/ramaze/action/render.rb +0 -163
- data/lib/ramaze/action.rb +0 -136
- data/lib/ramaze/adapter/base.rb +0 -59
- data/lib/ramaze/adapter/cgi.rb +0 -24
- data/lib/ramaze/adapter/ebb.rb +0 -32
- data/lib/ramaze/adapter/evented_mongrel.rb +0 -7
- data/lib/ramaze/adapter/fcgi.rb +0 -24
- data/lib/ramaze/adapter/lsws.rb +0 -23
- data/lib/ramaze/adapter/mongrel.rb +0 -25
- data/lib/ramaze/adapter/scgi.rb +0 -22
- data/lib/ramaze/adapter/swiftiplied_mongrel.rb +0 -7
- data/lib/ramaze/adapter/thin.rb +0 -22
- data/lib/ramaze/adapter/webrick.rb +0 -52
- data/lib/ramaze/adapter.rb +0 -101
- data/lib/ramaze/cache/memcached.rb +0 -70
- data/lib/ramaze/cache/memory.rb +0 -6
- data/lib/ramaze/cache/yaml_store.rb +0 -68
- data/lib/ramaze/contrib/auto_params/get_args.rb +0 -57
- data/lib/ramaze/contrib/auto_params.rb +0 -135
- data/lib/ramaze/contrib/email.rb +0 -84
- data/lib/ramaze/contrib/facebook/facebook.rb +0 -171
- data/lib/ramaze/contrib/facebook.rb +0 -23
- data/lib/ramaze/contrib/file_cache.rb +0 -65
- data/lib/ramaze/contrib/gettext/mo.rb +0 -155
- data/lib/ramaze/contrib/gettext/parser.rb +0 -46
- data/lib/ramaze/contrib/gettext/po.rb +0 -109
- data/lib/ramaze/contrib/gettext.rb +0 -113
- data/lib/ramaze/contrib/gzip_filter.rb +0 -56
- data/lib/ramaze/contrib/profiling.rb +0 -36
- data/lib/ramaze/contrib/route.rb +0 -22
- data/lib/ramaze/contrib/sequel/fill.rb +0 -12
- data/lib/ramaze/contrib/sequel_cache.rb +0 -92
- data/lib/ramaze/contrib.rb +0 -82
- data/lib/ramaze/controller/error.rb +0 -46
- data/lib/ramaze/controller/main.rb +0 -2
- data/lib/ramaze/controller/resolve.rb +0 -234
- data/lib/ramaze/current/request.rb +0 -181
- data/lib/ramaze/current/response.rb +0 -19
- data/lib/ramaze/current/session/flash.rb +0 -67
- data/lib/ramaze/current/session/hash.rb +0 -65
- data/lib/ramaze/current/session.rb +0 -153
- data/lib/ramaze/dispatcher/action.rb +0 -40
- data/lib/ramaze/dispatcher/directory.rb +0 -116
- data/lib/ramaze/dispatcher/error.rb +0 -108
- data/lib/ramaze/dispatcher/file.rb +0 -87
- data/lib/ramaze/dispatcher.rb +0 -124
- data/lib/ramaze/error.rb +0 -24
- data/lib/ramaze/global/dsl.rb +0 -39
- data/lib/ramaze/global/globalstruct.rb +0 -147
- data/lib/ramaze/global.rb +0 -116
- data/lib/ramaze/helper/aspect.rb +0 -100
- data/lib/ramaze/helper/cgi.rb +0 -43
- data/lib/ramaze/helper/inform.rb +0 -40
- data/lib/ramaze/helper/nitroform.rb +0 -14
- data/lib/ramaze/helper/pager.rb +0 -366
- data/lib/ramaze/helper/partial.rb +0 -96
- data/lib/ramaze/helper/redirect.rb +0 -73
- data/lib/ramaze/helper/sendfile.rb +0 -18
- data/lib/ramaze/helper/sequel.rb +0 -52
- data/lib/ramaze/inform.rb +0 -4
- data/lib/ramaze/log/analogger.rb +0 -37
- data/lib/ramaze/log/growl.rb +0 -35
- data/lib/ramaze/log/knotify.rb +0 -25
- data/lib/ramaze/log/xosd.rb +0 -88
- data/lib/ramaze/route.rb +0 -84
- data/lib/ramaze/snippets/array/put_within.rb +0 -37
- data/lib/ramaze/snippets/binding/locals.rb +0 -13
- data/lib/ramaze/snippets/dictionary.rb +0 -504
- data/lib/ramaze/snippets/divide.rb +0 -20
- data/lib/ramaze/snippets/kernel/__dir__.rb +0 -23
- data/lib/ramaze/snippets/kernel/acquire.rb +0 -39
- data/lib/ramaze/snippets/kernel/aquire.rb +0 -1
- data/lib/ramaze/snippets/kernel/constant.rb +0 -26
- data/lib/ramaze/snippets/kernel/pretty_inspect.rb +0 -15
- data/lib/ramaze/snippets/metaid.rb +0 -17
- data/lib/ramaze/snippets/numeric/filesize_format.rb +0 -19
- data/lib/ramaze/snippets/object/pretty.rb +0 -6
- data/lib/ramaze/snippets/object/scope.rb +0 -11
- data/lib/ramaze/snippets/object/thread_accessor.rb +0 -5
- data/lib/ramaze/snippets/object/traits.rb +0 -76
- data/lib/ramaze/snippets/ordered_set.rb +0 -36
- data/lib/ramaze/snippets/proc/locals.rb +0 -11
- data/lib/ramaze/snippets/ramaze/caller_info.rb +0 -30
- data/lib/ramaze/snippets/ramaze/caller_lines.rb +0 -51
- data/lib/ramaze/snippets/ramaze/thread_accessor.rb +0 -44
- data/lib/ramaze/snippets/string/each.rb +0 -8
- data/lib/ramaze/snippets/string/ord.rb +0 -15
- data/lib/ramaze/snippets/string/start_with.rb +0 -7
- data/lib/ramaze/snippets/struct/fill.rb +0 -23
- data/lib/ramaze/snippets/struct/values_at.rb +0 -23
- data/lib/ramaze/snippets/symbol/to_proc.rb +0 -24
- data/lib/ramaze/snippets/thread/into.rb +0 -18
- data/lib/ramaze/sourcereload.rb +0 -169
- data/lib/ramaze/spec/helper/browser.rb +0 -88
- data/lib/ramaze/spec/helper/mock_http.rb +0 -69
- data/lib/ramaze/spec/helper/requester.rb +0 -49
- data/lib/ramaze/spec/helper/simple_http.rb +0 -434
- data/lib/ramaze/spec/helper.rb +0 -122
- data/lib/ramaze/spec.rb +0 -1
- data/lib/ramaze/store/default.rb +0 -109
- data/lib/ramaze/template/amrita2.rb +0 -44
- data/lib/ramaze/template/builder.rb +0 -28
- data/lib/ramaze/template/erubis.rb +0 -35
- data/lib/ramaze/template/ezamar/element.rb +0 -169
- data/lib/ramaze/template/ezamar/engine.rb +0 -76
- data/lib/ramaze/template/ezamar/morpher.rb +0 -135
- data/lib/ramaze/template/ezamar/render_partial.rb +0 -31
- data/lib/ramaze/template/ezamar.rb +0 -42
- data/lib/ramaze/template/haml.rb +0 -37
- data/lib/ramaze/template/liquid.rb +0 -36
- data/lib/ramaze/template/markaby.rb +0 -52
- data/lib/ramaze/template/nagoro.rb +0 -51
- data/lib/ramaze/template/none.rb +0 -14
- data/lib/ramaze/template/redcloth.rb +0 -24
- data/lib/ramaze/template/remarkably.rb +0 -38
- data/lib/ramaze/template/sass.rb +0 -37
- data/lib/ramaze/template/tagz.rb +0 -79
- data/lib/ramaze/template/tenjin.rb +0 -34
- data/lib/ramaze/template/xslt.rb +0 -96
- data/lib/ramaze/template.rb +0 -81
- data/lib/ramaze/tool/create.rb +0 -74
- data/lib/ramaze/tool/localize.rb +0 -162
- data/lib/ramaze/tool/mime.rb +0 -25
- data/lib/ramaze/tool/mime_types.yaml +0 -615
- data/lib/ramaze/tool/record.rb +0 -6
- data/lib/ramaze/tool.rb +0 -9
- data/lib/ramaze/trinity.rb +0 -13
- data/lib/vendor/bacon.rb +0 -323
- data/rake_tasks/conf.rake +0 -73
- data/rake_tasks/coverage.rake +0 -46
- data/rake_tasks/darcs.rake +0 -5
- data/rake_tasks/gem.rake +0 -43
- data/rake_tasks/maintenance.rake +0 -384
- data/rake_tasks/spec.rake +0 -62
- data/spec/contrib/auto_params.rb +0 -121
- data/spec/contrib/profiling.rb +0 -26
- data/spec/contrib/route.rb +0 -36
- data/spec/contrib/sequel/fill.rb +0 -47
- data/spec/examples/simple_auth.rb +0 -32
- data/spec/examples/templates/template_amrita2.rb +0 -16
- data/spec/examples/templates/template_redcloth.rb +0 -28
- data/spec/ramaze/action/basics.rb +0 -36
- data/spec/ramaze/action/cache.rb +0 -43
- data/spec/ramaze/action/layout.rb +0 -190
- data/spec/ramaze/adapter/mongrel.rb +0 -12
- data/spec/ramaze/adapter/record.rb +0 -31
- data/spec/ramaze/adapter/webrick.rb +0 -12
- data/spec/ramaze/adapter.rb +0 -22
- data/spec/ramaze/cache.rb +0 -73
- data/spec/ramaze/controller.rb +0 -177
- data/spec/ramaze/current/request.rb +0 -30
- data/spec/ramaze/current/session.rb +0 -97
- data/spec/ramaze/dispatcher.rb +0 -31
- data/spec/ramaze/element.rb +0 -107
- data/spec/ramaze/helper/aspect.rb +0 -92
- data/spec/ramaze/helper/cgi.rb +0 -43
- data/spec/ramaze/helper/file.rb +0 -18
- data/spec/ramaze/helper/pager.rb +0 -99
- data/spec/ramaze/helper/partial.rb +0 -76
- data/spec/ramaze/helper/redirect.rb +0 -112
- data/spec/ramaze/localize.rb +0 -67
- data/spec/ramaze/morpher.rb +0 -111
- data/spec/ramaze/public/error404.xhtml +0 -1
- data/spec/ramaze/request/mongrel.rb +0 -9
- data/spec/ramaze/request/thin.rb +0 -9
- data/spec/ramaze/request/webrick.rb +0 -5
- data/spec/ramaze/route.rb +0 -130
- data/spec/ramaze/session.rb +0 -94
- data/spec/ramaze/store/default.rb +0 -71
- data/spec/ramaze/template/amrita2/external.amrita +0 -6
- data/spec/ramaze/template/amrita2/sum.amrita +0 -1
- data/spec/ramaze/template/amrita2.rb +0 -50
- data/spec/ramaze/template/builder/external.rxml +0 -3
- data/spec/ramaze/template/builder.rb +0 -55
- data/spec/ramaze/template/erubis/sum.rhtml +0 -1
- data/spec/ramaze/template/erubis.rb +0 -41
- data/spec/ramaze/template/ezamar/another/long/action.zmr +0 -1
- data/spec/ramaze/template/ezamar/combined.zmr +0 -1
- data/spec/ramaze/template/ezamar/file_only.zmr +0 -1
- data/spec/ramaze/template/ezamar/index.zmr +0 -1
- data/spec/ramaze/template/ezamar/nested.zmr +0 -1
- data/spec/ramaze/template/ezamar/other__index.xhtml +0 -1
- data/spec/ramaze/template/ezamar/some__long__action.zmr +0 -1
- data/spec/ramaze/template/ezamar/sum.zmr +0 -1
- data/spec/ramaze/template/ezamar.rb +0 -63
- data/spec/ramaze/template/haml/index.haml +0 -5
- data/spec/ramaze/template/haml/locals.haml +0 -2
- data/spec/ramaze/template/haml/with_vars.haml +0 -4
- data/spec/ramaze/template/haml.rb +0 -66
- data/spec/ramaze/template/liquid/index.liquid +0 -1
- data/spec/ramaze/template/liquid/products.liquid +0 -45
- data/spec/ramaze/template/liquid.rb +0 -99
- data/spec/ramaze/template/markaby/external.mab +0 -8
- data/spec/ramaze/template/markaby/sum.mab +0 -1
- data/spec/ramaze/template/markaby.rb +0 -61
- data/spec/ramaze/template/nagoro/another/long/action.nag +0 -1
- data/spec/ramaze/template/nagoro/combined.nag +0 -1
- data/spec/ramaze/template/nagoro/file_only.nag +0 -1
- data/spec/ramaze/template/nagoro/index.nag +0 -1
- data/spec/ramaze/template/nagoro/nested.nag +0 -1
- data/spec/ramaze/template/nagoro/some__long__action.nag +0 -1
- data/spec/ramaze/template/nagoro/sum.nag +0 -1
- data/spec/ramaze/template/nagoro.rb +0 -64
- data/spec/ramaze/template/redcloth/external.redcloth +0 -1
- data/spec/ramaze/template/redcloth.rb +0 -38
- data/spec/ramaze/template/remarkably.rb +0 -58
- data/spec/ramaze/template/sass.rb +0 -69
- data/spec/ramaze/template/tenjin/external.tenjin +0 -1
- data/spec/ramaze/template/tenjin.rb +0 -49
- data/spec/ramaze/template/xslt/concat_words.xsl +0 -16
- data/spec/ramaze/template/xslt/index.xsl +0 -14
- data/spec/ramaze/template/xslt/products.xsl +0 -32
- data/spec/ramaze/template/xslt/ruby_version.xsl +0 -14
- data/spec/ramaze/template/xslt.rb +0 -90
- data/spec/ramaze/template.rb +0 -128
- data/spec/snippets/array/put_within.rb +0 -33
- data/spec/snippets/divide.rb +0 -19
- data/spec/snippets/kernel/__dir__.rb +0 -8
- data/spec/snippets/kernel/acquire.rb +0 -71
- data/spec/snippets/kernel/constant.rb +0 -23
- data/spec/snippets/numeric/filesize_format.rb +0 -12
- data/spec/snippets/ordered_set.rb +0 -63
- data/spec/snippets/ramaze/caller_info.rb +0 -39
- data/spec/snippets/ramaze/caller_lines.rb +0 -30
- data/spec/snippets/struct/fill.rb +0 -26
- data/spec/snippets/struct/values_at.rb +0 -44
- data/spec/snippets/symbol/to_proc.rb +0 -13
- data/spec/snippets/thread/into.rb +0 -20
- /data/examples/{todolist → app/todolist}/public/favicon.ico +0 -0
- /data/examples/{upload → app/upload}/view/index.xhtml +0 -0
- /data/examples/{wikore/template → app/wikore/view}/index.xhtml +0 -0
- /data/examples/{wiktacular → app/wiktacular}/README +0 -0
- /data/examples/{wiktacular → app/wiktacular}/mkd/link/2007-07-20_19-45-51.mkd +0 -0
- /data/examples/{wiktacular → app/wiktacular}/mkd/link/current.mkd +0 -0
- /data/examples/{wiktacular → app/wiktacular}/mkd/main/2007-07-20_16-31-33.mkd +0 -0
- /data/examples/{wiktacular → app/wiktacular}/public/favicon.ico +0 -0
- /data/examples/{wiktacular → app/wiktacular}/public/screen.css +0 -0
- /data/examples/{wiktacular/template → app/wiktacular/view}/index.xhtml +0 -0
- /data/examples/{identity.rb → helpers/identity.rb} +0 -0
- /data/examples/{facebook.rb → misc/facebook.rb} +0 -0
- /data/examples/templates/{template → view}/external.liquid +0 -0
- /data/spec/ramaze/action/{template → view}/bar.xhtml +0 -0
- /data/spec/ramaze/action/{template → view}/instancevars/layout.xhtml +0 -0
- /data/spec/ramaze/action/{template → view}/other_wrapper.xhtml +0 -0
- /data/spec/ramaze/action/{template → view}/single_wrapper.xhtml +0 -0
- /data/spec/ramaze/action/{template/sub/sub_wrapper.xhtml → view/sub/sub_wrapper.erb} +0 -0
- /data/spec/ramaze/controller/{template → view}/greet.xhtml +0 -0
- /data/spec/ramaze/controller/{template → view}/list.xhtml +0 -0
- /data/spec/ramaze/controller/{template → view}/other/greet/other.xhtml +0 -0
- /data/spec/ramaze/controller/{template → view}/other_wrapper.xhtml +0 -0
- /data/spec/ramaze/helper/{template → view}/locals.xhtml +0 -0
- /data/spec/ramaze/helper/{template → view}/loop.xhtml +0 -0
- /data/spec/ramaze/helper/{template → view}/num.xhtml +0 -0
- /data/spec/ramaze/helper/{template → view}/partial.xhtml +0 -0
- /data/spec/ramaze/helper/{template → view}/recursive.xhtml +0 -0
- /data/spec/ramaze/helper/{template → view}/recursive_local_ivars.xhtml +0 -0
- /data/spec/ramaze/helper/{template → view}/recursive_locals.xhtml +0 -0
- /data/spec/ramaze/helper/{template → view}/test_template.xhtml +0 -0
- /data/spec/ramaze/{template → view}/remarkably/external.rem +0 -0
- /data/spec/ramaze/{template → view}/remarkably/sum.rem +0 -0
- /data/spec/ramaze/{template → view}/sass/file.css.sass +0 -0
- /data/spec/ramaze/{template → view}/tagz/external.tagz +0 -0
- /data/spec/ramaze/{template → view}/tagz/sum.tagz +0 -0
@@ -1,67 +0,0 @@
|
|
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
|
-
def each(&block)
|
15
|
-
combined.each(&block)
|
16
|
-
end
|
17
|
-
|
18
|
-
# the current session[:FLASH_PREVIOUS]
|
19
|
-
def previous
|
20
|
-
session[:FLASH_PREVIOUS] || {}
|
21
|
-
end
|
22
|
-
|
23
|
-
# the current session[:FLASH]
|
24
|
-
def current
|
25
|
-
session[:FLASH] ||= {}
|
26
|
-
end
|
27
|
-
|
28
|
-
# combined key/value pairs of previous and current
|
29
|
-
# current keys overshadow the old ones.
|
30
|
-
def combined
|
31
|
-
previous.merge(current)
|
32
|
-
end
|
33
|
-
|
34
|
-
# flash[key] in your Controller
|
35
|
-
def [](key)
|
36
|
-
combined[key]
|
37
|
-
end
|
38
|
-
|
39
|
-
# flash[key] = value in your Controller
|
40
|
-
def []=(key, value)
|
41
|
-
prev = session[:FLASH] || {}
|
42
|
-
prev[key] = value
|
43
|
-
session[:FLASH] = prev
|
44
|
-
end
|
45
|
-
|
46
|
-
# Inspects the combined SessionFlash
|
47
|
-
|
48
|
-
def inspect
|
49
|
-
combined.inspect
|
50
|
-
end
|
51
|
-
|
52
|
-
# Delete a key
|
53
|
-
|
54
|
-
def delete(key)
|
55
|
-
current.delete(key)
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
# Session.current or {}
|
61
|
-
|
62
|
-
def session
|
63
|
-
Current.session || {}
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,65 +0,0 @@
|
|
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
|
13
|
-
@hash = {}
|
14
|
-
end
|
15
|
-
|
16
|
-
# relays all the methods to the @hash and updates the session_cache in
|
17
|
-
# Session.current.sessions if anything changes.
|
18
|
-
|
19
|
-
def method_missing(*args, &block)
|
20
|
-
old = @hash.dup
|
21
|
-
result = @hash.send(*args, &block)
|
22
|
-
unless old == @hash
|
23
|
-
Cache.sessions[Current.session.session_id] = self
|
24
|
-
end
|
25
|
-
result
|
26
|
-
end
|
27
|
-
|
28
|
-
# Calls #inspect on the wrapped @hash
|
29
|
-
|
30
|
-
def inspect
|
31
|
-
@hash.inspect
|
32
|
-
end
|
33
|
-
|
34
|
-
# Use client side session variables
|
35
|
-
|
36
|
-
def client
|
37
|
-
Request.current['session.client'] ||= unmarshal(Request.current.cookies["#{Session::SESSION_KEY}-client"]) || {}
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
# Marshal a session hash into safe cookie data. Include an integrity hash.
|
43
|
-
def marshal(session)
|
44
|
-
data = [ Marshal.dump(session) ].pack('m').chop
|
45
|
-
"#{data}--#{generate_digest(data)}"
|
46
|
-
end
|
47
|
-
|
48
|
-
# Unmarshal cookie data to a hash and verify its integrity.
|
49
|
-
def unmarshal(cookie)
|
50
|
-
if cookie
|
51
|
-
data, digest = cookie.split('--')
|
52
|
-
return nil unless digest == generate_digest(data)
|
53
|
-
Marshal.load(data.unpack('m').first)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
# Generate the inline SHA512 message digest. Larger (128 bytes) than SHA256
|
58
|
-
# (64 bytes) or RMD160 (40 bytes), but small relative to the 4096 byte
|
59
|
-
# max cookie size.
|
60
|
-
def generate_digest(data)
|
61
|
-
Digest::SHA512.hexdigest "#{data}#{Session.trait[:secret]}"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,153 +0,0 @@
|
|
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
|
-
if RUBY_VERSION >= "1.9.0"
|
5
|
-
require 'digest/sha1'
|
6
|
-
else
|
7
|
-
require 'digest/sha2'
|
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
|
-
# secret salt for client-side session data
|
32
|
-
|
33
|
-
trait :secret => 'change_me_please_123'
|
34
|
-
|
35
|
-
# the key used for the cookie
|
36
|
-
|
37
|
-
SESSION_KEY = '_ramaze_session_id' unless defined?(SESSION_KEY)
|
38
|
-
|
39
|
-
# Holds counter for IPs
|
40
|
-
|
41
|
-
IP_COUNT = ::Hash.new{|h,k| h[k] = OrderedSet.new} unless defined?(IP_COUNT)
|
42
|
-
|
43
|
-
# Limit the number of sessions one IP is allowed to hold.
|
44
|
-
|
45
|
-
IP_COUNT_LIMIT = 1000 unless defined?(IP_COUNT_LIMIT)
|
46
|
-
|
47
|
-
# Holds the default cookie used for sessions
|
48
|
-
|
49
|
-
COOKIE = { :path => '/' }
|
50
|
-
|
51
|
-
class << self
|
52
|
-
def current
|
53
|
-
Current.session
|
54
|
-
end
|
55
|
-
|
56
|
-
# called from Ramaze::startup and adds Cache.sessions if cookies are
|
57
|
-
# enabled
|
58
|
-
|
59
|
-
def startup(options = {})
|
60
|
-
Cache.add(:sessions) if Global.sessions
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# Initialize a new Session, requires the original Rack::Request instance
|
65
|
-
# given to us from Dispatcher#setup_environment.
|
66
|
-
#
|
67
|
-
# sets @session_id and @session_flash
|
68
|
-
|
69
|
-
def initialize(request = Current.request)
|
70
|
-
return unless Global.sessions
|
71
|
-
@session_id = (request.cookies[SESSION_KEY] || random_key)
|
72
|
-
|
73
|
-
unless IP_COUNT.nil?
|
74
|
-
ip = request.ip
|
75
|
-
IP_COUNT[ip] << @session_id
|
76
|
-
sessions.delete(IP_COUNT[ip].shift) if IP_COUNT[ip].size > IP_COUNT_LIMIT
|
77
|
-
end
|
78
|
-
|
79
|
-
@flash = Ramaze::Session::Flash.new
|
80
|
-
end
|
81
|
-
|
82
|
-
# relay all messages we don't understand to the currently active session
|
83
|
-
|
84
|
-
def method_missing(*args, &block)
|
85
|
-
current.send(*args, &block)
|
86
|
-
end
|
87
|
-
|
88
|
-
# answers with the currently active session, which is set unless it is
|
89
|
-
# existing already, the session itself is an instance of SessionHash
|
90
|
-
|
91
|
-
def current
|
92
|
-
sessions[session_id] ||= Session::Hash.new
|
93
|
-
end
|
94
|
-
|
95
|
-
# shortcut to Cache.sessions
|
96
|
-
|
97
|
-
def sessions
|
98
|
-
Cache.sessions
|
99
|
-
end
|
100
|
-
|
101
|
-
# generate a random (and hopefully unique) id for the current session.
|
102
|
-
#
|
103
|
-
# It consists of the current time, the current request, the current PID of
|
104
|
-
# ruby and object_id of this instance.
|
105
|
-
#
|
106
|
-
# All this is joined by some calls to Kernel#rand and returned as a
|
107
|
-
# Digest::SHA256::hexdigest
|
108
|
-
|
109
|
-
def random_key
|
110
|
-
h = [
|
111
|
-
Time.now.to_f.to_s, rand,
|
112
|
-
Current.request.hash, rand,
|
113
|
-
Process.pid, rand,
|
114
|
-
object_id, rand
|
115
|
-
].join
|
116
|
-
Digest::SHA256.hexdigest(h)
|
117
|
-
end
|
118
|
-
|
119
|
-
# Inspect on Session.current
|
120
|
-
|
121
|
-
def inspect
|
122
|
-
current.inspect
|
123
|
-
end
|
124
|
-
|
125
|
-
# at the end of a request delete the current[:FLASH] and assign it to
|
126
|
-
# current[:FLASH_PREVIOUS]
|
127
|
-
#
|
128
|
-
# this is needed so flash can iterate over requests
|
129
|
-
# and always just keep the current and previous key/value pairs.
|
130
|
-
#
|
131
|
-
# finalizes the session and assigns the key to the response via
|
132
|
-
# set_cookie.
|
133
|
-
|
134
|
-
def finish
|
135
|
-
return unless Global.sessions
|
136
|
-
|
137
|
-
old = current.delete(:FLASH)
|
138
|
-
current[:FLASH_PREVIOUS] = old if old
|
139
|
-
|
140
|
-
request, response = Current.request, Current.response
|
141
|
-
|
142
|
-
hash = {:value => session_id}.merge(COOKIE)
|
143
|
-
response.set_cookie(SESSION_KEY, hash)
|
144
|
-
|
145
|
-
# set client side session cookie
|
146
|
-
if val = request['session.client'] and
|
147
|
-
(!val.empty? or request.cookies["#{SESSION_KEY}-client"])
|
148
|
-
cookie = hash.merge(:value => marshal(val))
|
149
|
-
response.set_cookie("#{SESSION_KEY}-client", cookie)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
@@ -1,40 +0,0 @@
|
|
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
|
-
module Dispatcher
|
6
|
-
|
7
|
-
# This dispatcher is responsible for relaying requests to Controller::handle
|
8
|
-
# and filtering the results using FILTER.
|
9
|
-
|
10
|
-
class Action
|
11
|
-
|
12
|
-
# The response is passed to each filter by sending .call(response) to it.
|
13
|
-
|
14
|
-
FILTER = OrderedSet.new(
|
15
|
-
# Ramaze::Tool::Localize,
|
16
|
-
) unless defined?(FILTER)
|
17
|
-
|
18
|
-
class << self
|
19
|
-
include Trinity
|
20
|
-
|
21
|
-
# Takes path, asks Controller to handle it and builds a response on
|
22
|
-
# success. The response is then passed to each member of FILTER for
|
23
|
-
# post-processing.
|
24
|
-
|
25
|
-
def process(path)
|
26
|
-
Log.info("Dynamic request from #{request.ip}: #{request.request_uri}")
|
27
|
-
|
28
|
-
catch(:respond) {
|
29
|
-
body = Controller.handle(path)
|
30
|
-
response = Response.current.build(body)
|
31
|
-
}
|
32
|
-
FILTER.each{|f| f.call(response)}
|
33
|
-
response
|
34
|
-
rescue Ramaze::Error => ex
|
35
|
-
ex
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,116 +0,0 @@
|
|
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
|
-
module Dispatcher
|
6
|
-
|
7
|
-
# Generates a directory listing, see Ramaze::Controller::Directory for more
|
8
|
-
# information and how to create your own directory listing page
|
9
|
-
class Directory
|
10
|
-
class << self
|
11
|
-
|
12
|
-
# Entry point from Dispatcher::filter.
|
13
|
-
# Just a forwarder to build_listing, automatticly exiting if there is
|
14
|
-
# an error (defined by returning false in build_listing)
|
15
|
-
def process(path)
|
16
|
-
if Global.list_directories
|
17
|
-
response = build_listing(path)
|
18
|
-
Response.current.build(*response) if response
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
# Makes a request for http://yourserver/dirlist/path and returns the
|
23
|
-
# result. Due to this method, you can overwrite the action and create your
|
24
|
-
# own page. See Ramaze::Controller::Directory for more.
|
25
|
-
def build_listing(path)
|
26
|
-
dir = ::File.expand_path(Global.public_root/::File.expand_path(path, '/'))
|
27
|
-
|
28
|
-
if ::File.directory?(dir)
|
29
|
-
Log.debug("Serving directory listing: #{dir}")
|
30
|
-
|
31
|
-
status = Ramaze::STATUS_CODE['OK']
|
32
|
-
header = {'Content-Type' => "text/html"}
|
33
|
-
body = list_for(dir)
|
34
|
-
[body, status, header]
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def list_for(path)
|
39
|
-
root = ::File.expand_path(Global.public_root)
|
40
|
-
display = path.gsub(/^#{Regexp.escape(root)}\/?/, '/')
|
41
|
-
wrapper =
|
42
|
-
%(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
43
|
-
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
44
|
-
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
45
|
-
<head>
|
46
|
-
<title>Directory listing of #{display}</title>
|
47
|
-
|
48
|
-
<style type="text/css"> /*<![CDATA[*/ a, a:active {text-decoration: none; color: blue;} a:visited {color: #48468F;} a:hover, a:focus {text-decoration: underline; color: red;} body {background-color: #F5F5F5;} h2 {margin-bottom: 12px;} table {margin-left: 12px;} th, td { font-family: "Courier New", Courier, monospace; font-size: 10pt; text-align: left;} th { font-weight: bold; padding-right: 14px; padding-bottom: 3px;} td {padding-right: 14px;} td.s, th.s {text-align: right;} div.list { background-color: white; border-top: 1px solid #646464; border-bottom: 1px solid #646464; padding-top: 10px; padding-bottom: 14px;} div.foot { font-family: "Courier New", Courier, monospace; font-size: 10pt; color: #787878; padding-top: 4px;} /*]]>*/ </style>
|
49
|
-
</head>
|
50
|
-
<body>
|
51
|
-
<h2>Directory listing of #{display}</h2>
|
52
|
-
<div class="list">
|
53
|
-
<table summary="Directory Listing" cellpadding="0" cellspacing="0">
|
54
|
-
<thead>
|
55
|
-
<tr>
|
56
|
-
<th class="n">Name</th>
|
57
|
-
<th class="m">Last Modified</th>
|
58
|
-
<th class="s">Size</th>
|
59
|
-
<th class="t">Type</th>
|
60
|
-
</tr>
|
61
|
-
</thead>
|
62
|
-
<tbody>
|
63
|
-
<tr>
|
64
|
-
<td class="n"><a href="#{display/'..'}/">Parent Directory</a>/</td>
|
65
|
-
<td class="m"> </td>
|
66
|
-
<td class="s">- </td>
|
67
|
-
<td class="t">Directory</td>
|
68
|
-
</tr>
|
69
|
-
%s
|
70
|
-
%s
|
71
|
-
</tbody>
|
72
|
-
</table>
|
73
|
-
</div>
|
74
|
-
<div class="foot">%s</div>
|
75
|
-
</body>
|
76
|
-
</html>
|
77
|
-
)
|
78
|
-
|
79
|
-
dirs, files = Dir[path/'*'].partition{|file| ::File.directory?(file) }
|
80
|
-
dir_body, file_body = [], []
|
81
|
-
|
82
|
-
dirs.sort.each do |dir|
|
83
|
-
basename = ::File.basename(dir)
|
84
|
-
dir_body << %[<tr>
|
85
|
-
<td class="n"><a href="#{display/basename}">#{basename}/</a></td>
|
86
|
-
<td class="m"> </td>
|
87
|
-
<td class="s">- </td>
|
88
|
-
<td class="t">Directory</td>
|
89
|
-
</tr>]
|
90
|
-
end
|
91
|
-
|
92
|
-
time_format = "%Y-%b-%d %H:%M:%S"
|
93
|
-
files.sort.each do |file|
|
94
|
-
basename = ::File.basename(file)
|
95
|
-
time = ::File.mtime(file).strftime(time_format)
|
96
|
-
size = ::File.size(file).filesize_format
|
97
|
-
mime = Tool::MIME.type_for(file)
|
98
|
-
file_body << %[<tr>
|
99
|
-
<td class="n"><a href="#{display/basename}">#{basename}</a></td>
|
100
|
-
<td class="m">#{time}</td>
|
101
|
-
<td class="s">#{size}</td>
|
102
|
-
<td class="t">#{mime}</td>
|
103
|
-
</tr>]
|
104
|
-
end
|
105
|
-
|
106
|
-
version = "ramaze/#{Ramaze::VERSION}"
|
107
|
-
wrapper % [
|
108
|
-
dir_body. join("\n "),
|
109
|
-
file_body.join("\n "),
|
110
|
-
version
|
111
|
-
]
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
@@ -1,108 +0,0 @@
|
|
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
|
-
module Dispatcher
|
6
|
-
|
7
|
-
# Last resort dispatcher, tries to recover as much information as possible
|
8
|
-
# from the past request and takes the appropiate actions.
|
9
|
-
#
|
10
|
-
# You can configure it over the HANDLE_ERROR constant or by defining error
|
11
|
-
# actions in your controllers.
|
12
|
-
|
13
|
-
class Error
|
14
|
-
|
15
|
-
# The class of exception is matched when an error occurs and the status
|
16
|
-
# code is set. The absolute URLs are used as fallback in case of a total
|
17
|
-
# failure.
|
18
|
-
HANDLE_ERROR = {
|
19
|
-
Exception => [ 500, '/error' ],
|
20
|
-
Ramaze::Error::NoAction => [ 404, '/error' ],
|
21
|
-
Ramaze::Error::NoController => [ 404, '/error' ],
|
22
|
-
}
|
23
|
-
|
24
|
-
class << self
|
25
|
-
trait :last_error => nil
|
26
|
-
|
27
|
-
# Takes exception, of metainfo only :controller is used at the moment.
|
28
|
-
# Then goes on to try and find the correct response status and path.
|
29
|
-
# In case metainfo has a controller we try to get the action for the
|
30
|
-
# path on it, dispatching there if we find one.
|
31
|
-
# Otherwise a plain-text error message is set as response.
|
32
|
-
def process(error, metainfo = {})
|
33
|
-
log_error(error)
|
34
|
-
|
35
|
-
Thread.current[:exception] = error
|
36
|
-
response = Response.current
|
37
|
-
|
38
|
-
key = error.class.ancestors.find{|a| HANDLE_ERROR[a]}
|
39
|
-
status, path = *HANDLE_ERROR[key || Exception]
|
40
|
-
status ||= 500
|
41
|
-
|
42
|
-
if controller = metainfo[:controller]
|
43
|
-
newpath = (controller.mapping + path).squeeze('/')
|
44
|
-
action_response = Dispatcher::Action.process(newpath)
|
45
|
-
case action_response
|
46
|
-
when Ramaze::Error
|
47
|
-
Log.debug("No custom error page found on #{controller}, going to #{path}")
|
48
|
-
else
|
49
|
-
action_response.status = status
|
50
|
-
return action_response
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
if path and Global.error_page and error.message !~ /`#{path}'/
|
55
|
-
response.status = status
|
56
|
-
return Dispatcher.dispatch_to(path)
|
57
|
-
else
|
58
|
-
response.build(error.message, status)
|
59
|
-
end
|
60
|
-
rescue Object => ex
|
61
|
-
Log.error(ex)
|
62
|
-
begin
|
63
|
-
m = ex.message
|
64
|
-
c = ex.class
|
65
|
-
b = (ex.backtrace || []).join("\n")
|
66
|
-
body = <<-html
|
67
|
-
==== Error ====\n
|
68
|
-
#{ m } (#{ c })
|
69
|
-
#{ b }\n
|
70
|
-
==== Request ====\n
|
71
|
-
#{ Request.current.pretty }\n
|
72
|
-
==== Request ====\n
|
73
|
-
#{ Response.current.pretty }\n
|
74
|
-
==== Session ====\n
|
75
|
-
#{ Session.current.pretty }\n
|
76
|
-
==== Global ====\n
|
77
|
-
#{ Global.pretty }\n
|
78
|
-
html
|
79
|
-
response['Content-Type'] = 'text/plain'
|
80
|
-
response.build(body.unindent, status)
|
81
|
-
rescue Object
|
82
|
-
raise
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Only logs new errors with full backtrace, repeated errors are shown
|
87
|
-
# only with their message.
|
88
|
-
def log_error error
|
89
|
-
error_message = error.message
|
90
|
-
|
91
|
-
if trait[:last_error] == error_message or error.is_a? Ramaze::Error::NoAction
|
92
|
-
Log.error(error_message)
|
93
|
-
else
|
94
|
-
trait[:last_error] = error_message
|
95
|
-
Log.error(error)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# Handle to current exception.
|
100
|
-
# Only works inside request/response cycle.
|
101
|
-
def current
|
102
|
-
Thread.current[:exception]
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
2
|
-
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
-
|
4
|
-
require "time"
|
5
|
-
require 'digest/md5'
|
6
|
-
|
7
|
-
module Ramaze
|
8
|
-
module Dispatcher
|
9
|
-
|
10
|
-
# First of the dispatchers, looks up the public path and serves the
|
11
|
-
# file if found.
|
12
|
-
|
13
|
-
class File
|
14
|
-
# These names are checked for serving from public directory.
|
15
|
-
# They take priority over Actions which comes later in the FILTER
|
16
|
-
INDICES = %w[index.htm index.xhtml index.html index]
|
17
|
-
|
18
|
-
class << self
|
19
|
-
include Trinity
|
20
|
-
|
21
|
-
# Entry point from Dispatcher::filter.
|
22
|
-
# searches for the file and builds a response with status 200 if found.
|
23
|
-
|
24
|
-
def process(path)
|
25
|
-
return unless file = open_file(CGI.unescape(path))
|
26
|
-
if file == :NotModified
|
27
|
-
return response.build([], STATUS_CODE['Not Modified'])
|
28
|
-
end
|
29
|
-
response.build(file, STATUS_CODE['OK'])
|
30
|
-
end
|
31
|
-
|
32
|
-
# returns file-handle with the open file on success, setting the
|
33
|
-
# Content-Type as found in Tool::MIME
|
34
|
-
|
35
|
-
def open_file(path)
|
36
|
-
file = resolve_path(path)
|
37
|
-
|
38
|
-
if ::File.file?(file) or ::File.file?(file=file/'index')
|
39
|
-
return unless in_public?(file)
|
40
|
-
response['Content-Type'] = Tool::MIME.type_for(file) unless ::File.extname(file).empty?
|
41
|
-
mtime = ::File.mtime(file)
|
42
|
-
response['Last-Modified'] = mtime.httpdate
|
43
|
-
response['ETag']= Digest::MD5.hexdigest(file+mtime.to_s).inspect
|
44
|
-
if modified_since = request.env['HTTP_IF_MODIFIED_SINCE']
|
45
|
-
return :NotModified unless Time.parse(modified_since) < mtime
|
46
|
-
elsif match = request.env['HTTP_IF_NONE_MATCH']
|
47
|
-
# Should be a unique string enclosed in ""
|
48
|
-
# To avoiding more file reading we use mtime and filepath
|
49
|
-
# we could throw in inode and size for more uniqueness
|
50
|
-
return :NotModified if response['ETag']==match
|
51
|
-
end
|
52
|
-
log(file)
|
53
|
-
::File.open(file, 'rb')
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def resolve_path(path)
|
58
|
-
joined = ::File.join(Global.public_root, path)
|
59
|
-
|
60
|
-
if ::File.directory?(joined)
|
61
|
-
Dir[joined/"{#{INDICES.join(',')}}"].first || joined
|
62
|
-
else
|
63
|
-
joined
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def in_public?(path)
|
68
|
-
expand(path).start_with?(expand(Global.public_root))
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
def expand(path)
|
74
|
-
::File.expand_path(path)
|
75
|
-
end
|
76
|
-
|
77
|
-
def log(file)
|
78
|
-
case file
|
79
|
-
when *Global.boring
|
80
|
-
else
|
81
|
-
Log.debug("Serving static: #{file}")
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|