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
@@ -0,0 +1,223 @@
|
|
1
|
+
##
|
2
|
+
# The Posts controller is used to display a list of all the posts that have been
|
3
|
+
# added as well as providing a way of adding, removing and updating posts.
|
4
|
+
#
|
5
|
+
# @since 26-09-2011
|
6
|
+
#
|
7
|
+
class Posts < BaseController
|
8
|
+
map '/'
|
9
|
+
|
10
|
+
# Sets the content type and view name based on the extension in the URL. For
|
11
|
+
# example, a request to /posts/feed.rss would render the view feed.rss.xhtml
|
12
|
+
# and set the content type to application/rss+xml.
|
13
|
+
provide(:atom, :type => 'application/atom+xml') do |action, body|
|
14
|
+
# Disable the layout.
|
15
|
+
action.layout = false
|
16
|
+
|
17
|
+
# Let's make sure the body is actually rendered. Using "return" would cause
|
18
|
+
# a local jumper error.
|
19
|
+
body
|
20
|
+
end
|
21
|
+
|
22
|
+
# These methods require the user to be logged in. If this isn't the case the
|
23
|
+
# user will be redirected back to the previous page and a message is
|
24
|
+
# displayed.
|
25
|
+
before(:edit, :new, :save, :delete) do
|
26
|
+
# "unless logged_in?" is the same as "if !logged_in?" but in my opinion is a
|
27
|
+
# bit nicer to the eyes.
|
28
|
+
unless logged_in?
|
29
|
+
flash[:error] = 'You need to be logged in to view that page'
|
30
|
+
|
31
|
+
# Posts.r() is a method that generates a route to a given method and a set
|
32
|
+
# of parameters. Calling #to_s on this object would produce a string
|
33
|
+
# containing a URL. For example, Posts.r(:edit, 10).to_s would result in
|
34
|
+
# "/edit/10".
|
35
|
+
redirect(Posts.r(:index))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Shows an overview of all the posts that have been added. These posts are
|
41
|
+
# paginated using the Paginate helper.
|
42
|
+
#
|
43
|
+
# @since 26-09-2011
|
44
|
+
#
|
45
|
+
def index
|
46
|
+
@posts = paginate(Post.eager(:comments, :user))
|
47
|
+
@title = 'Posts'
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Returns a list of all posts as either an RSS feed or an Atom feed.
|
52
|
+
#
|
53
|
+
# @since 27-09-2011
|
54
|
+
#
|
55
|
+
def feed
|
56
|
+
@posts = Post.all
|
57
|
+
|
58
|
+
render_view(:feed)
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Shows a single post along with all it's comments.
|
63
|
+
#
|
64
|
+
# @since 26-09-2011
|
65
|
+
# @param [Fixnum] id The ID of the post to view.
|
66
|
+
#
|
67
|
+
def view(id)
|
68
|
+
@post = Post[id]
|
69
|
+
|
70
|
+
if @post.nil?
|
71
|
+
flash[:error] = 'The specified post is invalid'
|
72
|
+
redirect_referrer
|
73
|
+
end
|
74
|
+
|
75
|
+
@title = @post.title
|
76
|
+
@created_at = @post.created_at.strftime('%Y-%m-%d')
|
77
|
+
@new_comment = flash[:form_data] || Comment.new
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Allows users to create a new post, given the user is logged in.
|
82
|
+
#
|
83
|
+
# @since 26-09-2011
|
84
|
+
#
|
85
|
+
def new
|
86
|
+
@post = flash[:form_data] || Post.new
|
87
|
+
@title = 'New post'
|
88
|
+
|
89
|
+
render_view(:form)
|
90
|
+
end
|
91
|
+
|
92
|
+
##
|
93
|
+
# Allows a user to edit an existing blog post.
|
94
|
+
#
|
95
|
+
# @since 26-09-2011
|
96
|
+
# @param [Fixnum] id The ID of the blog post to edit.
|
97
|
+
#
|
98
|
+
def edit(id)
|
99
|
+
@post = flash[:form_data] || Post[id]
|
100
|
+
|
101
|
+
# Make sure the post is valid
|
102
|
+
if @post.nil?
|
103
|
+
flash[:error] = 'The specified post is invalid'
|
104
|
+
redirect_referrer
|
105
|
+
end
|
106
|
+
|
107
|
+
@title = "Edit #{@post.title}"
|
108
|
+
|
109
|
+
render_view(:form)
|
110
|
+
end
|
111
|
+
|
112
|
+
##
|
113
|
+
# Adds a new comment to an existing post and redirects the user back to the
|
114
|
+
# post.
|
115
|
+
#
|
116
|
+
# @since 27-09-2011
|
117
|
+
#
|
118
|
+
def add_comment
|
119
|
+
data = request.subset(:post_id, :username, :comment)
|
120
|
+
comment = Comment.new
|
121
|
+
|
122
|
+
# If the user is logged in the user_id field should be set instead of the
|
123
|
+
# username field.
|
124
|
+
if logged_in?
|
125
|
+
data.delete('username')
|
126
|
+
data['user_id'] = user.id
|
127
|
+
end
|
128
|
+
|
129
|
+
begin
|
130
|
+
comment.update(data)
|
131
|
+
flash[:success] = 'The comment has been added'
|
132
|
+
rescue => e
|
133
|
+
Ramaze::Log.error(e)
|
134
|
+
|
135
|
+
flash[:form_errors] = comment.errors
|
136
|
+
flash[:error] = 'The comment could not be added'
|
137
|
+
end
|
138
|
+
|
139
|
+
redirect_referrer
|
140
|
+
end
|
141
|
+
|
142
|
+
##
|
143
|
+
# Saves the changes made by Posts#edit() and Posts#new(). While these two
|
144
|
+
# methods could have their own methods for saving the data the entire process
|
145
|
+
# is almost identical and thus this would be somewhat useless.
|
146
|
+
#
|
147
|
+
# @since 26-09-2011
|
148
|
+
#
|
149
|
+
def save
|
150
|
+
# Fetch the POST data to use for a new Post object or for updating an
|
151
|
+
# existing one.
|
152
|
+
data = request.subset(:title, :body)
|
153
|
+
id = request.params['id']
|
154
|
+
data['user_id'] = user.id
|
155
|
+
|
156
|
+
# If an ID is given it's assumed the user wants to edit an existing post,
|
157
|
+
# otherwise a new one will be created.
|
158
|
+
if !id.nil? and !id.empty?
|
159
|
+
post = Post[id]
|
160
|
+
|
161
|
+
# Let's make sure the post is valid
|
162
|
+
if post.nil?
|
163
|
+
flash[:error] = 'The specified post is invalid'
|
164
|
+
redirect_referrer
|
165
|
+
end
|
166
|
+
|
167
|
+
success = 'The post has been updated'
|
168
|
+
error = 'The post could not be updated'
|
169
|
+
# Create a new post
|
170
|
+
else
|
171
|
+
post = Post.new
|
172
|
+
success = 'The post has been created'
|
173
|
+
error = 'The post could not be created'
|
174
|
+
end
|
175
|
+
|
176
|
+
# Now that we have a Post object and the messages to display it's time to
|
177
|
+
# actually insert/update the data. This is wrapped in a begin/rescue block
|
178
|
+
# so that any errors can be handled nicely.
|
179
|
+
begin
|
180
|
+
# Post#update() can be used for both new objects and existing ones. In
|
181
|
+
# case the object doesn't exist in the database it will be automatically
|
182
|
+
# created.
|
183
|
+
post.update(data)
|
184
|
+
|
185
|
+
flash[:success] = success
|
186
|
+
|
187
|
+
# Redirect the user back to the correct page.
|
188
|
+
redirect(Posts.r(:edit, post.id))
|
189
|
+
rescue => e
|
190
|
+
Ramaze::Log.error(e)
|
191
|
+
|
192
|
+
# Store the submitted data and the errors. The errors are used by
|
193
|
+
# BlueForm, the form data is used so that the user doesn't have to
|
194
|
+
# re-enter all data every time something goes wrong.
|
195
|
+
flash[:form_data] = post
|
196
|
+
flash[:form_errors] = post.errors
|
197
|
+
flash[:error] = error
|
198
|
+
|
199
|
+
redirect_referrer
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
##
|
204
|
+
# Removes a single post from the database.
|
205
|
+
#
|
206
|
+
# @since 26-09-2011
|
207
|
+
# @param [Fixnum] id The ID of the post to remove.
|
208
|
+
#
|
209
|
+
def delete(id)
|
210
|
+
# The call is wrapped in a begin/rescue block so any errors can be handled
|
211
|
+
# properly. Without this the user would bump into a nasty stack trace and
|
212
|
+
# probably would have no clue as to what's going on.
|
213
|
+
begin
|
214
|
+
Post.filter(:id => id).destroy
|
215
|
+
flash[:success] = 'The specified post has been removed'
|
216
|
+
rescue => e
|
217
|
+
Ramaze::Log.error(e.message)
|
218
|
+
flash[:error] = 'The specified post could not be removed'
|
219
|
+
end
|
220
|
+
|
221
|
+
redirect(Posts.r(:index))
|
222
|
+
end
|
223
|
+
end # Posts
|
@@ -0,0 +1,152 @@
|
|
1
|
+
##
|
2
|
+
# The Users controller is used for managing users and allowing existing users to
|
3
|
+
# log in.
|
4
|
+
#
|
5
|
+
# @since 26-09-2011
|
6
|
+
#
|
7
|
+
class Users < BaseController
|
8
|
+
map '/users'
|
9
|
+
|
10
|
+
# The user has to be logged in in order to access this controller. The only
|
11
|
+
# exception is the login() method.
|
12
|
+
before_all do
|
13
|
+
if action.method.to_sym != :login and !logged_in?
|
14
|
+
flash[:error] = 'You need to be logged in to view that page'
|
15
|
+
redirect(Users.r(:login))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Shows an overview of all the users that have been added to the database.
|
21
|
+
#
|
22
|
+
# @since 27-09-2011
|
23
|
+
#
|
24
|
+
def index
|
25
|
+
@users = paginate(User)
|
26
|
+
@title = 'Users'
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Allows users to add another user to the database.
|
31
|
+
#
|
32
|
+
# @since 27-09-2011
|
33
|
+
#
|
34
|
+
def new
|
35
|
+
@user = flash[:form_data] || User.new
|
36
|
+
@title = 'New user'
|
37
|
+
|
38
|
+
render_view(:form)
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# Edits an existing user. If the specified user ID is invalid the user is
|
43
|
+
# redirected back to the previous page.
|
44
|
+
#
|
45
|
+
# @since 27-09-2011
|
46
|
+
# @param [Fixnum] id The ID of the user to edit.
|
47
|
+
#
|
48
|
+
def edit(id)
|
49
|
+
@user = flash[:form_data] || User[id]
|
50
|
+
|
51
|
+
if @user.nil?
|
52
|
+
flash[:error] = 'The specified user is invalid'
|
53
|
+
redirect_referrer
|
54
|
+
end
|
55
|
+
|
56
|
+
@title = "Edit #{@user.username}"
|
57
|
+
|
58
|
+
render_view(:form)
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Saves the changes made by Users#new() and Users#edit(). Just like
|
63
|
+
# Posts#save() this method is used for both methods since the actions required
|
64
|
+
# for adding/updating the data is pretty much identical.
|
65
|
+
#
|
66
|
+
# @since 27-09-2011
|
67
|
+
#
|
68
|
+
def save
|
69
|
+
data = request.subset(:username, :password)
|
70
|
+
id = request.params['id']
|
71
|
+
|
72
|
+
if !id.nil? and !id.empty?
|
73
|
+
user = User[id]
|
74
|
+
|
75
|
+
if user.nil?
|
76
|
+
flash[:error] = 'The specified user is invalid'
|
77
|
+
redirect_referrer
|
78
|
+
end
|
79
|
+
|
80
|
+
success = 'The user has been updated'
|
81
|
+
error = 'The user could not be updated'
|
82
|
+
else
|
83
|
+
user = User.new
|
84
|
+
success = 'The user has been added'
|
85
|
+
error = 'The user could not be added'
|
86
|
+
end
|
87
|
+
|
88
|
+
begin
|
89
|
+
user.update(data)
|
90
|
+
|
91
|
+
flash[:success] = success
|
92
|
+
redirect(Users.r(:edit, user.id))
|
93
|
+
rescue => e
|
94
|
+
Ramaze::Log.error(e)
|
95
|
+
|
96
|
+
flash[:error] = error
|
97
|
+
flash[:form_errors] = user.errors
|
98
|
+
flash[:form_data] = user
|
99
|
+
|
100
|
+
redirect_referrer
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
##
|
105
|
+
# Deletes a single user and redirects the user back to the overview.
|
106
|
+
#
|
107
|
+
# @since 27-09-2011
|
108
|
+
# @param [Fixnum] id The ID of the user to delete.
|
109
|
+
#
|
110
|
+
def delete(id)
|
111
|
+
begin
|
112
|
+
User.filter(:id => id).destroy
|
113
|
+
flash[:success] = 'The specified user has been removed'
|
114
|
+
rescue => e
|
115
|
+
Ramaze::Log.error(e)
|
116
|
+
flash[:error] = 'The specified user could not be removed'
|
117
|
+
end
|
118
|
+
|
119
|
+
redirect_referrer
|
120
|
+
end
|
121
|
+
|
122
|
+
##
|
123
|
+
# Allows a user to log in. Once logged in the user is able to manage existing
|
124
|
+
# users and edit posts.
|
125
|
+
#
|
126
|
+
# @since 27-09-2011
|
127
|
+
#
|
128
|
+
def login
|
129
|
+
if request.post?
|
130
|
+
if user_login(request.subset('username', 'password'))
|
131
|
+
flash[:success] = 'You have been logged in'
|
132
|
+
redirect(Posts.r(:index))
|
133
|
+
else
|
134
|
+
flash[:error] = 'You could not be logged in'
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
@title = 'Login'
|
139
|
+
end
|
140
|
+
|
141
|
+
##
|
142
|
+
# Logs the user out and destroys the session.
|
143
|
+
#
|
144
|
+
# @since 27-09-2011
|
145
|
+
#
|
146
|
+
def logout
|
147
|
+
user_logout
|
148
|
+
session.clear
|
149
|
+
flash[:success] = 'You have been logged out'
|
150
|
+
redirect(Users.r(:login))
|
151
|
+
end
|
152
|
+
end # Users
|
@@ -0,0 +1,61 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
|
6
|
+
<title>#{@title}</title>
|
7
|
+
|
8
|
+
#{css('reset')}
|
9
|
+
#{css('grid')}
|
10
|
+
#{css('layout')}
|
11
|
+
#{css('text')}
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
<div class="container">
|
15
|
+
<div id="container" class="row">
|
16
|
+
<!-- Top part, contains the navigation menu -->
|
17
|
+
<div id="top" class="grid_12">
|
18
|
+
<header class="grid_6">
|
19
|
+
<h1>#{@title}</h1>
|
20
|
+
</header>
|
21
|
+
|
22
|
+
<nav class="grid_6 last">
|
23
|
+
<ul class="clearfix">
|
24
|
+
<li>#{Posts.a('Posts', :index)}</li>
|
25
|
+
|
26
|
+
<?r if logged_in? ?>
|
27
|
+
|
28
|
+
<li>#{Users.a('Users', :index)}</li>
|
29
|
+
<li>#{Users.a('Logout', :logout)}</li>
|
30
|
+
|
31
|
+
<?r else ?>
|
32
|
+
|
33
|
+
<li>#{Users.a('Login', :login)}</li>
|
34
|
+
|
35
|
+
<?r end ?>
|
36
|
+
</ul>
|
37
|
+
</nav>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
<?r [:success, :error].each do |type| ?>
|
41
|
+
<?r if flash[type] ?>
|
42
|
+
<div class="message grid_12 #{type}">
|
43
|
+
<p>#{flash[type]}</p>
|
44
|
+
</div>
|
45
|
+
<?r end ?>
|
46
|
+
<?r end ?>
|
47
|
+
|
48
|
+
<div id="content" class="grid_12">
|
49
|
+
#{@content}
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
<footer id="footer">
|
54
|
+
<p>
|
55
|
+
Ramaze is free software and is licensed under the Ruby
|
56
|
+
license.
|
57
|
+
</p>
|
58
|
+
</footer>
|
59
|
+
</div>
|
60
|
+
</body>
|
61
|
+
</html>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# For more information on Sequel migrations see the following page:
|
2
|
+
# http://sequel.rubyforge.org/rdoc/files/doc/migration_rdoc.html
|
3
|
+
Sequel.migration do
|
4
|
+
# The up() method and block is used to update a database to the current
|
5
|
+
# migration.
|
6
|
+
up do
|
7
|
+
create_table(:users) do
|
8
|
+
primary_key :id
|
9
|
+
|
10
|
+
String :username, :null => false
|
11
|
+
String :password, :null => false
|
12
|
+
end
|
13
|
+
|
14
|
+
create_table(:posts) do
|
15
|
+
primary_key :id
|
16
|
+
|
17
|
+
String :title, :null => false
|
18
|
+
String :body , :null => false, :text => true
|
19
|
+
|
20
|
+
Time :created_at
|
21
|
+
Time :updated_at
|
22
|
+
|
23
|
+
foreign_key :user_id, :users, :on_update => :cascade,
|
24
|
+
:on_delete => :cascade, :key => :id
|
25
|
+
end
|
26
|
+
|
27
|
+
create_table(:comments) do
|
28
|
+
primary_key :id
|
29
|
+
|
30
|
+
String :username, :null => true
|
31
|
+
String :comment , :null => false, :text => true
|
32
|
+
|
33
|
+
Time :created_at
|
34
|
+
|
35
|
+
foreign_key :post_id, :posts, :on_update => :cascade,
|
36
|
+
:on_delete => :cascade, :key => :id
|
37
|
+
|
38
|
+
foreign_key :user_id, :users, :on_update => :cascade,
|
39
|
+
:on_delete => :cascade, :key => :id
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# The down() method and block is used to revert the changes introduced by the
|
44
|
+
# up() block.
|
45
|
+
down do
|
46
|
+
drop_table(:comments)
|
47
|
+
drop_table(:posts)
|
48
|
+
drop_table(:users)
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
##
|
2
|
+
# The Comment model is used for creating and managing comments.
|
3
|
+
#
|
4
|
+
# @since 26-09-2011
|
5
|
+
#
|
6
|
+
class Comment < Sequel::Model
|
7
|
+
plugin :timestamps, :create => :created_at, :update => :updated_at
|
8
|
+
|
9
|
+
# A comment can belong to only one post and one user
|
10
|
+
many_to_one :post
|
11
|
+
many_to_one :user
|
12
|
+
|
13
|
+
##
|
14
|
+
# Validates a comment before saving it to the database.
|
15
|
+
#
|
16
|
+
# @since 26-09-2011
|
17
|
+
#
|
18
|
+
def validate
|
19
|
+
validates_presence(:comment)
|
20
|
+
|
21
|
+
# Comments can either have user ID or a custom name. The user ID is only set
|
22
|
+
# when the user is logged in.
|
23
|
+
unless self.user_id
|
24
|
+
validates_presence(:username)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Gets the name of the author from either an associated user or the "name"
|
30
|
+
# field.
|
31
|
+
#
|
32
|
+
# @since 26-09-2011
|
33
|
+
# @return [String]
|
34
|
+
#
|
35
|
+
def username
|
36
|
+
if user and user.username
|
37
|
+
return user.username
|
38
|
+
else
|
39
|
+
return super
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end # Comment
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Configure Sequel. This example uses a SQLite3 database with it's encoding set
|
2
|
+
# to UTF-8. The :test option is used to confirm that the database connection is
|
3
|
+
# valid before it's actually being used. In this case the connection returned by
|
4
|
+
# Sequel.connect is stored in a constant called "DB" but you're free to store it
|
5
|
+
# wherever you want.
|
6
|
+
DB = Sequel.connect(
|
7
|
+
:adapter => 'sqlite',
|
8
|
+
:database => __DIR__('../database.db'),
|
9
|
+
:test => true,
|
10
|
+
:encoding => 'utf8'
|
11
|
+
)
|
12
|
+
|
13
|
+
# The validation_helpers plugin is required if you want to use the #validate()
|
14
|
+
# method in your model in combination with easy to use methods such as
|
15
|
+
# validates_presence().
|
16
|
+
Sequel::Model.plugin(:validation_helpers)
|
17
|
+
|
18
|
+
# The migration extension is needed in order to run migrations.
|
19
|
+
Sequel.extension(:migration)
|
20
|
+
|
21
|
+
# The pagination extension is needed by Ramaze::Helper::Paginate.
|
22
|
+
Sequel.extension(:pagination)
|
23
|
+
|
24
|
+
# Migrate the database
|
25
|
+
Sequel::Migrator.run(DB, __DIR__('../migrations'))
|
26
|
+
|
27
|
+
# Time to load all the models now that Sequel is set up.
|
28
|
+
require __DIR__('comment')
|
29
|
+
require __DIR__('post')
|
30
|
+
require __DIR__('user')
|
31
|
+
|
32
|
+
# Insert the default user if this hasn't already been done so.
|
33
|
+
unless User[:username => 'admin']
|
34
|
+
User.create(:username => 'admin', :password => 'admin')
|
35
|
+
end
|
36
|
+
|
37
|
+
# Insert a default post if no posts have been added.
|
38
|
+
if Post.all.empty?
|
39
|
+
Post.create(
|
40
|
+
:title => 'Example Post',
|
41
|
+
:body => 'This is a post that uses Markdown!',
|
42
|
+
:user_id => User[:username => 'admin'].id
|
43
|
+
)
|
44
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
##
|
2
|
+
# The Post class is a model that's used for managing posts. The corresponding
|
3
|
+
# table is called "posts". For more information on how Sequel works see the
|
4
|
+
# following page: http://sequel.rubyforge.org/documentation.html
|
5
|
+
#
|
6
|
+
# @since 26-09-2011
|
7
|
+
#
|
8
|
+
class Post < Sequel::Model
|
9
|
+
# The timestamps plugin is used to automatically fill two database columns
|
10
|
+
# with the dates and times on which an object was created and when it was
|
11
|
+
# modified.
|
12
|
+
plugin :timestamps, :create => :created_at, :update => :updated_at
|
13
|
+
|
14
|
+
# Multiple posts can only belong to a single user.
|
15
|
+
many_to_one :user
|
16
|
+
one_to_many :comments
|
17
|
+
|
18
|
+
##
|
19
|
+
# Post#validate() is called whenever an instance of this class is saved or
|
20
|
+
# updated. For more information on what you can do with this method see the
|
21
|
+
# following page:
|
22
|
+
# http://sequel.rubyforge.org/rdoc/files/doc/validations_rdoc.html
|
23
|
+
#
|
24
|
+
# If you're used to working with ActiveRecord it's important to remember that
|
25
|
+
# these validation methods can't be used in a model's class declaration, they
|
26
|
+
# have to be placed inside the #validate() method.
|
27
|
+
#
|
28
|
+
# @since 26-09-2011
|
29
|
+
#
|
30
|
+
def validate
|
31
|
+
validates_presence([:title, :body])
|
32
|
+
end
|
33
|
+
end # Post
|
@@ -0,0 +1,100 @@
|
|
1
|
+
##
|
2
|
+
# The User model is user for retrieving and authenticating users. This
|
3
|
+
# application uses bcrypt to hash the passwords. For more information on bcrypt
|
4
|
+
# see the following pages:
|
5
|
+
#
|
6
|
+
# * http://codahale.com/how-to-safely-store-a-password/
|
7
|
+
# * http://yorickpeterse.com/articles/use-bcrypt-fool/
|
8
|
+
# * https://github.com/codahale/bcrypt-ruby
|
9
|
+
#
|
10
|
+
# @since 26-09-2011
|
11
|
+
#
|
12
|
+
class User < Sequel::Model
|
13
|
+
# A user can have any number of posts and comments.
|
14
|
+
one_to_many :posts
|
15
|
+
one_to_many :comments
|
16
|
+
|
17
|
+
##
|
18
|
+
# User.authenticate() is used to authenticate a user. Each request the User
|
19
|
+
# helper calls this method to see if the currently logged in user is a valid
|
20
|
+
# user. Once called this methods queries the database and returns a valid User
|
21
|
+
# object in case the specified details were correct or something that
|
22
|
+
# evaluates to false if this wasn't the case.
|
23
|
+
#
|
24
|
+
# @since 26-09-2011
|
25
|
+
# @param [Hash] creds A hash containing the username and password of the
|
26
|
+
# currently logged in user.
|
27
|
+
# @return [Users|FalseClass]
|
28
|
+
#
|
29
|
+
def self.authenticate(creds)
|
30
|
+
username, password = creds['username'], creds['password']
|
31
|
+
|
32
|
+
if creds['username'].nil? or creds['username'].empty?
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
|
36
|
+
# Let's see if there is a user for the given username.
|
37
|
+
user = self[:username => username]
|
38
|
+
|
39
|
+
# Validate the user. Note that while it may seem that the password is
|
40
|
+
# compared as plain text this is not the case. The bcrypt class
|
41
|
+
# automatically converts the given password to a bcrypt hash. If these
|
42
|
+
# hashes are the same the specified password is correct.
|
43
|
+
if !user.nil? and user.password == password
|
44
|
+
return user
|
45
|
+
else
|
46
|
+
return false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# In order to properly use bcrypt we have to override the password=() and
|
52
|
+
# password() methods to return a correct bcrypt hash/object rather than
|
53
|
+
# whatever was stored in the database as a String instance.
|
54
|
+
#
|
55
|
+
# @since 26-09-2011
|
56
|
+
# @param [String] password The new password of a user.
|
57
|
+
#
|
58
|
+
def password=(password)
|
59
|
+
# Passing an empty password to the BCrypt class triggers errors.
|
60
|
+
if password.nil? or password.empty?
|
61
|
+
return
|
62
|
+
end
|
63
|
+
|
64
|
+
# Generates a new bcrypt password using a cost of 10. In my opinion a cost
|
65
|
+
# higher than 10 makes a web based application too slow.
|
66
|
+
password = BCrypt::Password.create(password, :cost => 10)
|
67
|
+
|
68
|
+
super(password)
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Because the password=() is overwritten with a custom one we also have to
|
73
|
+
# define a matching getter. Without this you'd get an instance of String
|
74
|
+
# containing the bcrypt hash and thus wouldn't be able to properly compare it
|
75
|
+
# to other passwords.
|
76
|
+
#
|
77
|
+
# @since 26-09-2011
|
78
|
+
# @return [BCrypt::Password|NilClass]
|
79
|
+
#
|
80
|
+
def password
|
81
|
+
password = super
|
82
|
+
|
83
|
+
if !password.nil?
|
84
|
+
return BCrypt::Password.new(password)
|
85
|
+
else
|
86
|
+
return nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
##
|
91
|
+
# Validates an instance of this model. See Post#validate() for some extra
|
92
|
+
# details on how this works.
|
93
|
+
#
|
94
|
+
# @since 26-09-2011
|
95
|
+
#
|
96
|
+
def validate
|
97
|
+
validates_presence(:username)
|
98
|
+
validates_presence(:password) if new?
|
99
|
+
end
|
100
|
+
end # User
|